private function buildUnionStrategySql(array $ids, $table, $viaColumn, Filtering $filtering = null)
{
$isAlias = $this->isAlias($viaColumn);
if ($isAlias) {
$viaColumn = $this->trimAlias($viaColumn);
}
foreach ($ids as $id) {
$statement = $this->createTableSelection($table, [$id]);
if ($isAlias) {
$statement->where('%n = ?', $viaColumn, $id);
} else {
$statement->where('%n.%n = ?', $table, $viaColumn, $id);
}
if ($filtering !== null) {
$this->applyFiltering($statement, $filtering);
}
if (isset($mainStatement)) {
$mainStatement->union($statement);
} else {
$mainStatement = $statement;
}
}
$sql = (string) $mainStatement;
$driver = $this->connection->getDriver();
// now we have to fix wrongly generated SQL by dibi...
if ($driver instanceof DibiSqlite3Driver) {
$sql = preg_replace('#(?<=UNION )\\((SELECT.*?)\\)(?= UNION|$)#', '$1', $sql);
// (...) UNION (...) to ... UNION ...
} else {
$sql = preg_replace('#^(SELECT.*?)(?= UNION)#', '($1)', $sql);
// ... UNION (...) to (...) UNION (...)
}
return $sql;
}