34 public static function decompose(
Query $query, $fairLimit =
true, $separateRelations =
true)
37 $queryClass =
$entity->getDataClass()::getQueryClass();
38 $runtimeChains =
$query->getRuntimeChains() ?? [];
39 $primaryNames =
$entity->getPrimaryArray();
40 $originalSelect =
$query->getSelect();
53 return $query->getEntity()->createCollection();
58 $query->setSelect($originalSelect);
59 $query->where(static::getPrimaryFilter($primaryNames,
$rows));
61 foreach ($runtimeChains as $chain)
63 $query->registerChain(
'runtime', $chain);
68 if ($separateRelations)
73 foreach ($originalSelect as $selectItem)
76 $selQuery =
new $queryClass(
$entity);
77 $selQuery->addSelect($selectItem);
78 $selQuery->getQuery(
true);
81 foreach ($selQuery->getChains() as $chain)
83 if ($chain->hasBackReference())
85 $dividedSelect[] = $selectItem;
90 $commonSelect[] = $selectItem;
93 if (empty($commonSelect))
95 $commonSelect =
$query->getEntity()->getPrimaryArray();
99 $query->setSelect($commonSelect);
103 $collection =
$query->fetchCollection();
108 $sortedCollection =
$query->getEntity()->createCollection();
110 foreach (
$rows as $row)
112 $sortedCollection->add($collection->getByPrimary($row));
115 $collection = $sortedCollection;
118 if (!empty($dividedSelect) && $collection->count())
124 foreach ($collection as $object)
128 $primaryValues[] = $object->primary;
131 $primaryFilter = static::getPrimaryFilter($primaryNames, $primaryValues);
134 foreach ($dividedSelect as $selectItem)
136 $relQuery = (
new $queryClass(
$entity))
137 ->addSelect($selectItem)
138 ->where($primaryFilter);
140 foreach ($runtimeChains as $chain)
142 $relQuery->registerChain(
'runtime', $chain);
165 if (
count($primaryNames) === 1)
169 foreach ($primaryValues as $row)
171 $values[] = $row[$primaryNames[0]];
174 $commonSubFilter->whereIn($primaryNames[0], $values);
178 $commonSubFilter->logic(
'or');
180 foreach ($primaryValues as $row)
184 foreach ($primaryNames as $primaryName)
186 $primarySubFilter->where($primaryName, $row[$primaryName]);
191 return $commonSubFilter;
static getPrimaryFilter($primaryNames, $primaryValues)