Skip to content

Commit f468ba0

Browse files
committed
IBX-8019: Replaced multiple JOIN statements with SELECT ... IN query in ObjectStateId Criterion
1 parent b5fe9ad commit f468ba0

File tree

2 files changed

+14
-51
lines changed

2 files changed

+14
-51
lines changed

eZ/Publish/Core/Limitation/ObjectStateLimitationType.php

+1-40
Original file line numberDiff line numberDiff line change
@@ -218,46 +218,7 @@ public function getCriterion(APILimitationValue $value, APIUserReference $curren
218218
return new Criterion\ObjectStateId($value->limitationValues[0]);
219219
}
220220

221-
$groupedLimitationValues = $this->groupLimitationValues($value->limitationValues);
222-
223-
if (count($groupedLimitationValues) === 1) {
224-
// one group, several limitation values: IN operation
225-
return new Criterion\ObjectStateId($groupedLimitationValues[0]);
226-
}
227-
228-
// limitations from different groups require logical AND between them
229-
$criterions = [];
230-
foreach ($groupedLimitationValues as $limitationGroup) {
231-
$criterions[] = new Criterion\ObjectStateId($limitationGroup);
232-
}
233-
234-
return new Criterion\LogicalAnd($criterions);
235-
}
236-
237-
/**
238-
* Groups limitation values by the State Group.
239-
*
240-
* @param string[] $limitationValues
241-
*
242-
* @return int[][]
243-
*/
244-
private function groupLimitationValues(array $limitationValues)
245-
{
246-
$objectStateHandler = $this->persistence->objectStateHandler();
247-
$stateGroups = $objectStateHandler->loadAllGroups();
248-
$groupedLimitationValues = [];
249-
foreach ($stateGroups as $stateGroup) {
250-
$states = $objectStateHandler->loadObjectStates($stateGroup->id);
251-
$stateIds = array_map(static function ($state) {
252-
return $state->id;
253-
}, $states);
254-
$limitationValuesGroup = array_intersect($stateIds, $limitationValues);
255-
if (!empty($limitationValuesGroup)) {
256-
$groupedLimitationValues[] = array_values($limitationValuesGroup);
257-
}
258-
}
259-
260-
return $groupedLimitationValues;
221+
return new Criterion\ObjectStateId($value->limitationValues);
261222
}
262223

263224
/**

eZ/Publish/Core/Persistence/Legacy/Filter/CriterionQueryBuilder/Content/ObjectStateIdQueryBuilder.php

+13-11
Original file line numberDiff line numberDiff line change
@@ -29,22 +29,24 @@ public function buildQueryConstraint(
2929
FilteringQueryBuilder $queryBuilder,
3030
FilteringCriterion $criterion
3131
): ?string {
32-
$tableAlias = uniqid('osl_');
32+
$value = (array)$criterion->value;
3333

34-
/** @var \eZ\Publish\API\Repository\Values\Content\Query\Criterion\ObjectStateId $criterion */
35-
$queryBuilder
36-
->join(
37-
'content',
34+
$subSelect = $queryBuilder->getConnection()->createQueryBuilder()
35+
->select(
36+
'osl.contentobject_id'
37+
)->from(
3838
Gateway::OBJECT_STATE_LINK_TABLE,
39-
$tableAlias,
40-
'content.id = ' . $tableAlias . '.contentobject_id',
39+
'osl'
40+
)->andWhere(
41+
$queryBuilder->expr()->in(
42+
'osl.contentobject_state_id',
43+
$queryBuilder->createNamedParameter($value, Connection::PARAM_INT_ARRAY)
44+
)
4145
);
4246

43-
$value = (array)$criterion->value;
44-
4547
return $queryBuilder->expr()->in(
46-
$tableAlias . '.contentobject_state_id',
47-
$queryBuilder->createNamedParameter($value, Connection::PARAM_INT_ARRAY)
48+
'content.id',
49+
$subSelect->getSQL()
4850
);
4951
}
5052
}

0 commit comments

Comments
 (0)