Skip to content

Commit

Permalink
[Grid] [Filter] Add Fulltext Search Filter (#543)
Browse files Browse the repository at this point in the history
* Add Fulltext search filter.

* Update docs

* Apply php-cs-fixer changes

* Add test.

* Apply php-cs-fixer changes

---------

Co-authored-by: martineiber <[email protected]>
  • Loading branch information
martineiber and martineiber authored Nov 7, 2024
1 parent 3aa25d5 commit 2e8578e
Show file tree
Hide file tree
Showing 9 changed files with 147 additions and 0 deletions.
3 changes: 3 additions & 0 deletions config/data_index_filters.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ services:
Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\IntegerFilter:
tags: [ 'pimcore.studio_backend.open_search.filter' ]

Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\FullTextFilter:
tags: [ 'pimcore.studio_backend.open_search.filter' ]

# DataObject
Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\DataObject\ClassNameFilter:
tags: [ 'pimcore.studio_backend.open_search.data_object.filter' ]
Expand Down
1 change: 1 addition & 0 deletions doc/03_Grid.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ Available filters are:
| system.pql | string | PQL Query | false |
| system.id | integer | | false |
| system.integer | integer | | true |
| system.fulltext | string | | false |



Expand Down
50 changes: 50 additions & 0 deletions src/DataIndex/Filter/FullTextFilter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<?php
declare(strict_types=1);

/**
* Pimcore
*
* This source file is available under two different licenses:
* - GNU General Public License version 3 (GPLv3)
* - Pimcore Commercial License (PCL)
* Full copyright and license information is available in
* LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
* @license http://www.pimcore.org/license GPLv3 and PCL
*/

namespace Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter;

use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\QueryInterface;
use Pimcore\Bundle\StudioBackendBundle\Exception\Api\InvalidArgumentException;
use Pimcore\Bundle\StudioBackendBundle\Grid\Column\ColumnType;
use Pimcore\Bundle\StudioBackendBundle\MappedParameter\Filter\SimpleColumnFiltersParameterInterface;
use function is_string;

/**
* @internal
*/
final class FullTextFilter implements FilterInterface
{
public function apply(mixed $parameters, QueryInterface $query): QueryInterface
{
if (!$parameters instanceof SimpleColumnFiltersParameterInterface) {
return $query;
}

$filter = $parameters->getSimpleColumnFilterByType(ColumnType::SYSTEM_FULLTEXT->value);

if (!$filter) {
return $query;
}

if (!is_string($filter->getFilterValue())) {
throw new InvalidArgumentException('Filter value for the fulltext filter must be a string');
}

$query->filterFullText($filter->getFilterValue());

return $query;
}
}
8 changes: 8 additions & 0 deletions src/DataIndex/Query/AssetQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Tree\PathFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Tree\TagFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\FullTextSearch\ElementKeySearch;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\FullTextSearch\FullTextSearch;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\FullTextSearch\WildcardSearch;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\QueryLanguage\PqlFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Sort\OrderByField;
Expand Down Expand Up @@ -182,4 +183,11 @@ public function filterInteger(string $field, int $value): QueryInterface

return $this;
}

public function filterFullText(string $value): QueryInterface
{
$this->search->addModifier(new FullTextSearch($value));

return $this;
}
}
8 changes: 8 additions & 0 deletions src/DataIndex/Query/DataObjectQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Tree\PathFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Tree\TagFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\FullTextSearch\ElementKeySearch;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\FullTextSearch\FullTextSearch;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\QueryLanguage\PqlFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Sort\Tree\OrderByFullPath;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Sort\Tree\OrderByIndexField;
Expand Down Expand Up @@ -161,4 +162,11 @@ public function filterInteger(string $field, int $value): QueryInterface

return $this;
}

public function filterFullText(string $value): QueryInterface
{
$this->search->addModifier(new FullTextSearch($value));

return $this;
}
}
8 changes: 8 additions & 0 deletions src/DataIndex/Query/DocumentQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Tree\PathFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Tree\TagFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\FullTextSearch\ElementKeySearch;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\FullTextSearch\FullTextSearch;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\FullTextSearch\WildcardSearch;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\QueryLanguage\PqlFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Sort\OrderByField;
Expand Down Expand Up @@ -161,4 +162,11 @@ public function filterInteger(string $field, int $value): QueryInterface

return $this;
}

public function filterFullText(string $value): QueryInterface
{
$this->search->addModifier(new FullTextSearch($value));

return $this;
}
}
2 changes: 2 additions & 0 deletions src/DataIndex/Query/QueryInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,6 @@ public function filterByPql(string $pqlQuery): self;
public function setUser(UserInterface $user): self;

public function filterInteger(string $field, int $value): self;

public function filterFullText(string $value): self;
}
1 change: 1 addition & 0 deletions src/Grid/Column/ColumnType.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ enum ColumnType: string
case SYSTEM_DATETIME = 'system.datetime';
case SYSTEM_TAG = 'system.tag';
case SYSTEM_PQL_QUERY = 'system.pql';
case SYSTEM_FULLTEXT = 'system.fulltext';
case METADATA_SELECT = 'metadata.select';
case METADATA_INPUT = 'metadata.input';
case METADATA_DATE = 'metadata.date';
Expand Down
66 changes: 66 additions & 0 deletions tests/Unit/DataIndex/Filter/FullTextFilterTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
<?php
declare(strict_types=1);

/**
* Pimcore
*
* This source file is available under two different licenses:
* - GNU General Public License version 3 (GPLv3)
* - Pimcore Commercial License (PCL)
* Full copyright and license information is available in
* LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
* @license http://www.pimcore.org/license GPLv3 and PCL
*/

namespace Pimcore\Bundle\StudioBackendBundle\Tests\Unit\DataIndex\Filter;

use Codeception\Stub\Expected;
use Codeception\Test\Unit;
use Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\FullTextFilter;
use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\QueryInterface;
use Pimcore\Bundle\StudioBackendBundle\Exception\Api\InvalidArgumentException;
use Pimcore\Bundle\StudioBackendBundle\MappedParameter\Filter\SimpleColumnFilter;
use Pimcore\Bundle\StudioBackendBundle\MappedParameter\Filter\SimpleColumnFiltersParameterInterface;

/**
* @internal
*/
final class FullTextFilterTest extends Unit
{
public function testIsExceptionThrownWhenFilterIsNotAString(): void
{
$columnFilter = new SimpleColumnFilter('system.fulltext', 1);
$parameter = $this->makeEmpty(SimpleColumnFiltersParameterInterface::class, [
'getSimpleColumnFilterByType' => $columnFilter,
]);

$query = $this->makeEmpty(QueryInterface::class);

$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('Filter value for the fulltext filter must be a string');

$filter = new FullTextFilter();
$filter->apply($parameter, $query);
}

public function testIfFilterFullTextIsCalled(): void
{
$columnFilter = new SimpleColumnFilter('system.fulltext', 'term');
$parameter = $this->makeEmpty(SimpleColumnFiltersParameterInterface::class, [
'getSimpleColumnFilterByType' => $columnFilter,
]);

$query = $this->makeEmpty(QueryInterface::class, [
'filterFullText' => Expected::once(function ($term) {
$this->assertSame('term', $term);

return $this->makeEmpty(QueryInterface::class);
}),
]);

$filter = new FullTextFilter();
$filter->apply($parameter, $query);
}
}

0 comments on commit 2e8578e

Please sign in to comment.