-
Notifications
You must be signed in to change notification settings - Fork 85
Commit
* Merge ElasticSearch and Solr custom criterion, sort clause and aggregation. Criteria, sort clauses and aggregations don't depend on the search engine, only their visitors and other handlers do. (cherry picked from commit c765208) --------- Co-authored-by: adriendupuis <[email protected]> Co-authored-by: Marek Nocoń <[email protected]>
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
services: | ||
app.search.solr.query.aggregation_visitor.priority_range_aggregation: | ||
class: Ibexa\Solr\Query\Common\AggregationVisitor\RangeAggregationVisitor | ||
factory: [ '@Ibexa\Solr\Query\Common\AggregationVisitor\Factory\SearchFieldAggregationVisitorFactory', 'createRangeAggregationVisitor' ] | ||
arguments: | ||
$aggregationClass: 'App\Query\Aggregation\Solr\PriorityRangeAggregation' | ||
$searchIndexFieldName: 'priority_i' | ||
tags: | ||
- { name: ibexa.search.solr.query.location.aggregation.visitor } | ||
|
||
app.search.elasticsearch.query.aggregation_visitor.priority_range_aggregation: | ||
class: Ibexa\Elasticsearch\Query\AggregationVisitor\RangeAggregationVisitor | ||
factory: [ '@Ibexa\Elasticsearch\Query\AggregationVisitor\Factory\SearchFieldAggregationVisitorFactory', 'createRangeAggregationVisitor' ] | ||
arguments: | ||
$aggregationClass: 'App\Query\Aggregation\Elasticsearch\PriorityRangeAggregation' | ||
$searchIndexFieldName: 'priority_i' | ||
tags: | ||
- { name: ibexa.search.elasticsearch.query.location.aggregation.visitor } | ||
|
||
app.search.solr.query.aggregation_result_extractor.priority_range_aggregation: | ||
class: Ibexa\Solr\ResultExtractor\AggregationResultExtractor\RangeAggregationResultExtractor | ||
arguments: | ||
$aggregationClass: 'App\Query\Aggregation\Solr\PriorityRangeAggregation' | ||
$keyMapper: 'Ibexa\Solr\ResultExtractor\AggregationResultExtractor\RangeAggregationKeyMapper\IntRangeAggregationKeyMapper' | ||
tags: | ||
- { name: ibexa.search.solr.query.location.aggregation.result.extractor } | ||
|
||
app.search.elasticsearch.query.aggregation_result_extractor.priority_range_aggregation: | ||
class: Ibexa\Elasticsearch\Query\ResultExtractor\AggregationResultExtractor\RangeAggregationResultExtractor | ||
arguments: | ||
$aggregationClass: 'App\Query\Aggregation\Elasticsearch\PriorityRangeAggregation' | ||
tags: | ||
- { name: ibexa.search.elasticsearch.query.location.aggregation.result.extractor } | ||
|
||
App\Query\Aggregation\Solr\PriorityRangeAggregationVisitor: | ||
tags: | ||
- { name: ibexa.search.solr.query.location.aggregation.visitor } | ||
|
||
App\Query\Aggregation\Solr\PriorityRangeAggregationResultExtractor: | ||
tags: | ||
- { name: ibexa.search.solr.query.location.aggregation.result.extractor } | ||
|
||
App\Query\Aggregation\Elasticsearch\PriorityRangeAggregationVisitor: | ||
tags: | ||
- { name: ibexa.search.elasticsearch.query.location.aggregation.visitor } | ||
|
||
App\Query\Aggregation\Elasticsearch\PriorityRangeAggregationResultExtractor: | ||
tags: | ||
- { name: ibexa.search.elasticsearch.query.location.aggregation.result.extractor } |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace App\EventSubscriber; | ||
|
||
use Ibexa\Contracts\Core\Search\Field; | ||
use Ibexa\Contracts\Core\Search\FieldType\StringField; | ||
use Ibexa\Contracts\Elasticsearch\Mapping\Event\ContentIndexCreateEvent; | ||
use Ibexa\Contracts\Elasticsearch\Mapping\Event\LocationIndexCreateEvent; | ||
use Symfony\Component\EventDispatcher\EventSubscriberInterface; | ||
|
||
final class CustomIndexDataSubscriber implements EventSubscriberInterface | ||
{ | ||
public function onContentDocumentCreate(ContentIndexCreateEvent $event): void | ||
{ | ||
$document = $event->getDocument(); | ||
$document->fields[] = new Field( | ||
'custom_field', | ||
'Custom field value', | ||
new StringField() | ||
); | ||
} | ||
|
||
public function onLocationDocumentCreate(LocationIndexCreateEvent $event): void | ||
{ | ||
$document = $event->getDocument(); | ||
$document->fields[] = new Field( | ||
'custom_field', | ||
'Custom field value', | ||
new StringField() | ||
); | ||
} | ||
|
||
public static function getSubscribedEvents(): array | ||
{ | ||
return [ | ||
ContentIndexCreateEvent::class => 'onContentDocumentCreate', | ||
LocationIndexCreateEvent::class => 'onLocationDocumentCreate', | ||
]; | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace App\EventSubscriber; | ||
|
||
use Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\LogicalAnd; | ||
use Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\ObjectStateIdentifier; | ||
use Ibexa\Contracts\ElasticSearch\Query\Event\QueryFilterEvent; | ||
use Symfony\Component\EventDispatcher\EventSubscriberInterface; | ||
|
||
final class CustomQueryFilterSubscriber implements EventSubscriberInterface | ||
{ | ||
public function onQueryFilter(QueryFilterEvent $event): void | ||
Check failure on line 14 in code_samples/search/custom/src/EventSubscriber/CustomQueryFilterSubscriber.php
|
||
{ | ||
$query = $event->getQuery(); | ||
Check failure on line 16 in code_samples/search/custom/src/EventSubscriber/CustomQueryFilterSubscriber.php
|
||
|
||
$additionalCriteria = new ObjectStateIdentifier('locked'); | ||
|
||
if ($query->filter !== null) { | ||
$query->filter = $additionalCriteria; | ||
} else { | ||
// Append Criterion to existing filter | ||
$query->filter = new LogicalAnd([ | ||
Check failure on line 24 in code_samples/search/custom/src/EventSubscriber/CustomQueryFilterSubscriber.php
|
||
$query->filter, | ||
$additionalCriteria, | ||
]); | ||
} | ||
} | ||
|
||
public static function getSubscribedEvents(): array | ||
{ | ||
return [ | ||
QueryFilterEvent::class => 'onQueryFilter', | ||
Check failure on line 34 in code_samples/search/custom/src/EventSubscriber/CustomQueryFilterSubscriber.php
|
||
]; | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,6 +4,7 @@ | |
|
||
namespace App\Query\Criterion\Elasticsearch; | ||
|
||
use App\Query\Criterion\CameraManufacturerCriterion; | ||
use Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion; | ||
use Ibexa\Contracts\Elasticsearch\Query\CriterionVisitor; | ||
use Ibexa\Contracts\Elasticsearch\Query\LanguageFilter; | ||
|
@@ -15,6 +16,9 @@ public function supports(Criterion $criterion, LanguageFilter $languageFilter): | |
return $criterion instanceof CameraManufacturerCriterion; | ||
} | ||
|
||
/** | ||
* @param \App\Query\Criterion\Elasticsearch\CameraManufacturerCriterion $criterion | ||
*/ | ||
public function visit(CriterionVisitor $dispatcher, Criterion $criterion, LanguageFilter $languageFilter): array | ||
Check failure on line 22 in code_samples/search/custom/src/Query/Criterion/Elasticsearch/CameraManufacturerVisitor.php
|
||
{ | ||
return [ | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,6 +4,7 @@ | |
|
||
namespace App\Query\Criterion\Solr; | ||
|
||
use App\Query\Criterion\CameraManufacturerCriterion; | ||
use Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion; | ||
use Ibexa\Contracts\Solr\Query\CriterionVisitor; | ||
|
||
|
@@ -14,6 +15,9 @@ public function canVisit(Criterion $criterion) | |
return $criterion instanceof CameraManufacturerCriterion; | ||
} | ||
|
||
/** | ||
* @param \App\Query\Criterion\Solr\CameraManufacturerCriterion $criterion | ||
*/ | ||
public function visit(Criterion $criterion, CriterionVisitor $subVisitor = null) | ||
Check failure on line 21 in code_samples/search/custom/src/Query/Criterion/Solr/CameraManufacturerVisitor.php
|
||
{ | ||
$expressions = array_map( | ||
|
This file was deleted.
This file was deleted.
This file was deleted.