Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions config/data_index_filters.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,9 @@ services:
Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\DatetimeFilter:
tags: [ 'pimcore.studio_backend.search_index.filter' ]

Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\NumberFilter:
tags: [ 'pimcore.studio_backend.search_index.filter' ]

# DataObject
Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\DataObject\ClassNameFilter:
tags: [ 'pimcore.studio_backend.search_index.data_object.filter' ]
Expand Down
17 changes: 17 additions & 0 deletions doc/03_Grid.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ Available filters are:
| system.integer | integer | | true |
| system.fulltext | string | | false |
| system.boolean | boolean or null | | true |
| system.number | object | `from`, `to`, `is`, `setting` | true |
| classificationstore.string | string | | true |
| classificationstore.rbga | array of integer | `r`,`g`,`b`,`a` | true |
| classificationstore.date | object of ISO 8601 | `from`, `to`, or `on` | true |
Expand Down Expand Up @@ -102,6 +103,22 @@ Filter by Tags:
...
```

Filter by Number:
```json
...
"columnFilters" [
{
"type": "system.number",
"key": "id",
"filterValue": {
"setting": "less",
"to": 100
}
}
]
...
```

Classification Store Basic Filter Value:
The filter value of a Classification Store looks a bit difrent. All Filter need to have a groupId and keyId
```json
Expand Down
67 changes: 67 additions & 0 deletions src/DataIndex/Filter/NumberFilter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<?php
declare(strict_types=1);

/**
* This source file is available under the terms of the
* Pimcore Open Core License (POCL)
* Full copyright and license information is available in
* LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (c) Pimcore GmbH (https://www.pimcore.com)
* @license Pimcore Open Core License (POCL)
*/

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\ColumnFilter;
use Pimcore\Bundle\StudioBackendBundle\MappedParameter\Filter\ColumnFiltersParameterInterface;

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

foreach ($parameters->getColumnFilterByType(ColumnType::SYSTEM_NUMBER->value) as $column) {
$query = $this->applyNumberFilter($column, $query);
}

return $query;
}

private function applyNumberFilter(ColumnFilter $column, QueryInterface $query): QueryInterface
{
$fiterValue = $column->getFilterValue();

if (!isset($fiterValue['setting'])) {
throw new InvalidArgumentException('This filter requires a setting value');
}
$setting = $fiterValue['setting'];

if (isset($fiterValue['is']) && $setting == 'is') {
return $query->filterNumber($column->getKey(), $fiterValue['is']);
}

if (isset($fiterValue['to']) && $setting == 'less') {
return $query->filterNumberRange($column->getKey(), null, $fiterValue['to']);
}

if (isset($fiterValue['from']) && $setting == 'more') {
return $query->filterNumberRange($column->getKey(), $fiterValue['from'], null);
}

if ($setting == 'between') {
return $query->filterNumberRange($column->getKey(), $fiterValue['from'], $fiterValue['to']);
}

throw new InvalidArgumentException('Unable to apply number filter no correct setting given');
}
}
23 changes: 23 additions & 0 deletions src/DataIndex/Query/AssetQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Basic\IdFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Basic\IdsFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Basic\IntegerFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Basic\NumberFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\DateFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\NumberRangeFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Tree\ParentIdFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Tree\PathFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Tree\TagFilter;
Expand Down Expand Up @@ -196,4 +198,25 @@ public function filterFullText(string $value): QueryInterface

return $this;
}

public function filterNumber(
string $fieldName,
int|float $searchTerm,
bool $enablePqlFieldNameResolution = true
): self {
$this->search->addModifier(new NumberFilter($fieldName, $searchTerm, $enablePqlFieldNameResolution));

return $this;
}

public function filterNumberRange(
string $fieldName,
int|float|null $min = null,
int|float|null $max = null,
bool $enablePqlFieldNameResolution = true
): self {
$this->search->addModifier(new NumberRangeFilter($fieldName, $min, $max, $enablePqlFieldNameResolution));

return $this;
}
}
22 changes: 22 additions & 0 deletions src/DataIndex/Query/DataObjectQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Basic\IdFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Basic\IdsFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Basic\IntegerFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Basic\NumberFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\ClassificationStoreFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\DateFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\MultiSelectFilter;
Expand Down Expand Up @@ -270,4 +271,25 @@ public function classificationStoreFilter(

return $this;
}

public function filterNumber(
string $fieldName,
int|float $searchTerm,
bool $enablePqlFieldNameResolution = true
): self {
$this->search->addModifier(new NumberFilter($fieldName, $searchTerm, $enablePqlFieldNameResolution));

return $this;
}

public function filterNumberRange(
string $fieldName,
int|float|null $min = null,
int|float|null $max = null,
bool $enablePqlFieldNameResolution = true
): self {
$this->search->addModifier(new NumberRangeFilter($fieldName, $min, $max, $enablePqlFieldNameResolution));

return $this;
}
}
23 changes: 23 additions & 0 deletions src/DataIndex/Query/DocumentQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Basic\IdFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Basic\IdsFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Basic\IntegerFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Basic\NumberFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\DateFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\NumberRangeFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Tree\ParentIdFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Tree\PathFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Tree\TagFilter;
Expand Down Expand Up @@ -204,4 +206,25 @@ public function filterDatetime(

return $this;
}

public function filterNumber(
string $fieldName,
int|float $searchTerm,
bool $enablePqlFieldNameResolution = true
): self {
$this->search->addModifier(new NumberFilter($fieldName, $searchTerm, $enablePqlFieldNameResolution));

return $this;
}

public function filterNumberRange(
string $fieldName,
int|float|null $min = null,
int|float|null $max = null,
bool $enablePqlFieldNameResolution = true
): self {
$this->search->addModifier(new NumberRangeFilter($fieldName, $min, $max, $enablePqlFieldNameResolution));

return $this;
}
}
13 changes: 13 additions & 0 deletions src/DataIndex/Query/QueryInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -69,4 +69,17 @@ public function filterDatetime(
bool $roundToDay = true,
bool $enablePqlFieldNameResolution = true
): self;

public function filterNumber(
string $fieldName,
int|float $searchTerm,
bool $enablePqlFieldNameResolution = true
): self;

public function filterNumberRange(
string $fieldName,
int|float|null $min = null,
int|float|null $max = null,
bool $enablePqlFieldNameResolution = true
): self;
}
1 change: 1 addition & 0 deletions src/Grid/Column/ColumnType.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ enum ColumnType: string
case SYSTEM_BOOLEAN = 'system.boolean';
case SYSTEM_TAG = 'system.tag';
case SYSTEM_PQL_QUERY = 'system.pql';
case SYSTEM_NUMBER = 'system.number';
case SYSTEM_FULLTEXT = 'system.fulltext';
case METADATA_SELECT = 'metadata.select';
case METADATA_INPUT = 'metadata.input';
Expand Down
Loading