From 1e79a5fff6623b9e10b404bec6394650b6e87ff4 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Fri, 22 Sep 2023 10:17:18 +0200 Subject: [PATCH] hopefully improve propagation of 'path eq hash' hint into 'in' statements Signed-off-by: Robin Appelman --- .../Files/Search/QueryOptimizer/FlattenNestedBool.php | 1 - lib/private/Files/Search/QueryOptimizer/OrEqualsToIn.php | 8 +++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/private/Files/Search/QueryOptimizer/FlattenNestedBool.php b/lib/private/Files/Search/QueryOptimizer/FlattenNestedBool.php index 7f75731fe94ba..c573e3af3c055 100644 --- a/lib/private/Files/Search/QueryOptimizer/FlattenNestedBool.php +++ b/lib/private/Files/Search/QueryOptimizer/FlattenNestedBool.php @@ -26,5 +26,4 @@ public function processOperator(ISearchOperator &$operator) { } parent::processOperator($operator); } - } diff --git a/lib/private/Files/Search/QueryOptimizer/OrEqualsToIn.php b/lib/private/Files/Search/QueryOptimizer/OrEqualsToIn.php index 4961e64d393ec..b4eca0630ff4e 100644 --- a/lib/private/Files/Search/QueryOptimizer/OrEqualsToIn.php +++ b/lib/private/Files/Search/QueryOptimizer/OrEqualsToIn.php @@ -29,7 +29,10 @@ public function processOperator(ISearchOperator &$operator): bool { return $value; }, $group); $in = new SearchComparison(ISearchComparison::COMPARE_IN, $field, $values); - $in->setQueryHint(ISearchComparison::HINT_PATH_EQ_HASH, $group[0]->getQueryHint(ISearchComparison::HINT_PATH_EQ_HASH, true)); + $pathEqHash = array_reduce($group, function ($pathEqHash, ISearchComparison $comparison) { + return $comparison->getQueryHint(ISearchComparison::HINT_PATH_EQ_HASH, true) && $pathEqHash; + }, true); + $in->setQueryHint(ISearchComparison::HINT_PATH_EQ_HASH, $pathEqHash); return $in; } else { return $group[0]; @@ -57,8 +60,7 @@ private function groupEqualsComparisonsByField(array $operators): array { $result = []; foreach ($operators as $operator) { if ($operator instanceof ISearchComparison && $operator->getType() === ISearchComparison::COMPARE_EQUAL) { - $key = $operator->getField() . $operator->getQueryHint(ISearchComparison::HINT_PATH_EQ_HASH, true); - $result[$key][] = $operator; + $result[$operator->getField()][] = $operator; } else { $result[] = [$operator]; }