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