private function fetchCounts(QueryBuilder $builder, array $values)
{
$targetStoragePrimaryKey = $this->targetMapper->getStorageReflection()->getStoragePrimaryKey()[0];
$sourceTable = $builder->getFromAlias();
$builder = clone $builder;
$builder->addSelect('%column', "{$sourceTable}.{$this->joinStorageKey}");
$builder->orderBy(null);
if ($builder->hasLimitOffsetClause()) {
$sqls = [];
$args = [];
foreach ($values as $value) {
$build = clone $builder;
$build->andWhere('%column = %any', "{$sourceTable}.{$this->joinStorageKey}", $value);
$sqls[] = "SELECT %any AS %column, COUNT(*) AS [count] FROM (" . $build->getQuerySql() . ') [temp]';
$args[] = $value;
$args[] = $this->joinStorageKey;
$args = array_merge($args, $build->getQueryParameters());
}
$sql = '(' . implode(') UNION ALL (', $sqls) . ')';
$result = $this->connection->queryArgs($sql, $args);
} else {
$builder->addSelect('COUNT(%column) AS [count]', "{$sourceTable}.{$targetStoragePrimaryKey}");
$builder->andWhere('%column IN %any', "{$sourceTable}.{$this->joinStorageKey}", $values);
$builder->groupBy('%column', "{$sourceTable}.{$this->joinStorageKey}");
$result = $this->connection->queryArgs($builder->getQuerySql(), $builder->getQueryParameters());
}
$counts = [];
foreach ($result as $row) {
$counts[$row->{$this->joinStorageKey}] = $row->count;
}
return $counts;
}