diff options
author | Roeland Jago Douma <rullzer@users.noreply.github.com> | 2018-01-16 19:53:01 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-01-16 19:53:01 +0100 |
commit | 2b70c708abc667c3e3c4fd9a97626012bf1ded25 (patch) | |
tree | 57df2fc83daefe1c9a0dbd31f51f615322e99854 | |
parent | a159d7c28c483a2b77e2f533795f6d6d1ec720fd (diff) | |
parent | 326d55db816ffa699f5374fc4b0a75b88f6edbd1 (diff) | |
download | nextcloud-server-2b70c708abc667c3e3c4fd9a97626012bf1ded25.tar.gz nextcloud-server-2b70c708abc667c3e3c4fd9a97626012bf1ded25.zip |
Merge pull request #7882 from nextcloud/search-and
Support arbitrary number of arguments for d:or and d:and in search queries
-rw-r--r-- | lib/private/Files/Cache/QuerySearchHelper.php | 14 | ||||
-rw-r--r-- | tests/lib/Files/Cache/QuerySearchHelperTest.php | 7 |
2 files changed, 18 insertions, 3 deletions
diff --git a/lib/private/Files/Cache/QuerySearchHelper.php b/lib/private/Files/Cache/QuerySearchHelper.php index 51ecb12a06a..ac64ba5c592 100644 --- a/lib/private/Files/Cache/QuerySearchHelper.php +++ b/lib/private/Files/Cache/QuerySearchHelper.php @@ -83,6 +83,16 @@ class QuerySearchHelper { return false; } + /** + * @param IQueryBuilder $builder + * @param ISearchOperator $operator + */ + public function searchOperatorArrayToDBExprArray(IQueryBuilder $builder, array $operators) { + return array_map(function ($operator) use ($builder) { + return $this->searchOperatorToDBExpr($builder, $operator); + }, $operators); + } + public function searchOperatorToDBExpr(IQueryBuilder $builder, ISearchOperator $operator) { $expr = $builder->expr(); if ($operator instanceof ISearchBinaryOperator) { @@ -95,9 +105,9 @@ class QuerySearchHelper { throw new \InvalidArgumentException('Binary operators inside "not" is not supported'); } case ISearchBinaryOperator::OPERATOR_AND: - return $expr->andX($this->searchOperatorToDBExpr($builder, $operator->getArguments()[0]), $this->searchOperatorToDBExpr($builder, $operator->getArguments()[1])); + return call_user_func_array([$expr, 'andX'], $this->searchOperatorArrayToDBExprArray($builder, $operator->getArguments())); case ISearchBinaryOperator::OPERATOR_OR: - return $expr->orX($this->searchOperatorToDBExpr($builder, $operator->getArguments()[0]), $this->searchOperatorToDBExpr($builder, $operator->getArguments()[1])); + return call_user_func_array([$expr, 'orX'], $this->searchOperatorArrayToDBExprArray($builder, $operator->getArguments())); default: throw new \InvalidArgumentException('Invalid operator type: ' . $operator->getType()); } diff --git a/tests/lib/Files/Cache/QuerySearchHelperTest.php b/tests/lib/Files/Cache/QuerySearchHelperTest.php index 850cee066a1..addeac71350 100644 --- a/tests/lib/Files/Cache/QuerySearchHelperTest.php +++ b/tests/lib/Files/Cache/QuerySearchHelperTest.php @@ -151,8 +151,13 @@ class QuerySearchHelperTest extends TestCase { [new SearchComparison(ISearchComparison::COMPARE_LIKE, 'mimetype', 'image/%'), [0, 1]], [new SearchBinaryOperator(ISearchBinaryOperator::OPERATOR_AND, [ new SearchComparison(ISearchComparison::COMPARE_EQUAL, 'size', 50), - new SearchComparison(ISearchComparison::COMPARE_LESS_THAN, 'mtime', 125), [0] + new SearchComparison(ISearchComparison::COMPARE_LESS_THAN, 'mtime', 125) ]), [0]], + [new SearchBinaryOperator(ISearchBinaryOperator::OPERATOR_AND, [ + new SearchComparison(ISearchComparison::COMPARE_EQUAL, 'size', 50), + new SearchComparison(ISearchComparison::COMPARE_LESS_THAN, 'mtime', 125), + new SearchComparison(ISearchComparison::COMPARE_LIKE, 'mimetype', 'text/%') + ]), []], [new SearchBinaryOperator(ISearchBinaryOperator::OPERATOR_OR, [ new SearchComparison(ISearchComparison::COMPARE_EQUAL, 'mtime', 100), new SearchComparison(ISearchComparison::COMPARE_EQUAL, 'mtime', 150), |