From 78361264e061860652816f4cf7b9910e70b8ed7f Mon Sep 17 00:00:00 2001 From: upchuk Date: Wed, 11 Jan 2023 12:07:53 +0100 Subject: [PATCH] EWPP-2838: Date status processor specific sort alter field. --- config/schema/oe_list_pages.schema.yml | 3 + .../facets/processor/DateStatusProcessor.php | 22 ++++++++ src/Plugin/facets/query_type/DateStatus.php | 14 +++-- tests/src/Kernel/DateStatusTest.php | 56 +++++++++++++++++-- 4 files changed, 85 insertions(+), 10 deletions(-) diff --git a/config/schema/oe_list_pages.schema.yml b/config/schema/oe_list_pages.schema.yml index fd0bce81..5080c11b 100644 --- a/config/schema/oe_list_pages.schema.yml +++ b/config/schema/oe_list_pages.schema.yml @@ -11,6 +11,9 @@ plugin.plugin_configuration.facets_processor.oe_list_pages_date_status_processor past_label: type: string label: 'Past label' + sort_alter_field_identifier: + type: string + label: 'Sort alter field identifier' node.type.*.third_party.oe_list_pages: type: oe_list_pages.bundle_third_party_settings diff --git a/src/Plugin/facets/processor/DateStatusProcessor.php b/src/Plugin/facets/processor/DateStatusProcessor.php index 316fdc33..ad27c708 100644 --- a/src/Plugin/facets/processor/DateStatusProcessor.php +++ b/src/Plugin/facets/processor/DateStatusProcessor.php @@ -68,6 +68,20 @@ public function build(FacetInterface $facet, array $results) { return $facet_results; } + /** + * {@inheritdoc} + */ + public function preQuery(FacetInterface $facet) { + parent::preQuery($facet); + + $sort_alter_field_identifier = $this->getConfiguration()['sort_alter_field_identifier']; + if ($sort_alter_field_identifier) { + // Store the value onto the facet so that we can use it at the query + // stage. + $facet->set('default_status_sort_alter_field_identifier', $sort_alter_field_identifier); + } + } + /** * {@inheritdoc} */ @@ -88,6 +102,13 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta '#default_value' => $this->getConfiguration()['past_label'], ]; + $build['sort_alter_field_identifier'] = [ + '#type' => 'textfield', + '#title' => $this->t('Sort alter field identifier'), + '#description' => $this->t('The field to be used for altering the sort. This is if the default sort for the query is different than the one used in this facet. Leave empty to use the one in the facet.'), + '#default_value' => $this->getConfiguration()['sort_alter_field_identifier'], + ]; + return $build; } @@ -98,6 +119,7 @@ public function defaultConfiguration() { return [ 'upcoming_label' => $this->t('Upcoming'), 'past_label' => $this->t('Past'), + 'sort_alter_field_identifier' => NULL, ] + parent::defaultConfiguration(); } diff --git a/src/Plugin/facets/query_type/DateStatus.php b/src/Plugin/facets/query_type/DateStatus.php index e1fed81f..54023a63 100644 --- a/src/Plugin/facets/query_type/DateStatus.php +++ b/src/Plugin/facets/query_type/DateStatus.php @@ -95,17 +95,23 @@ public function execute() { $filter = $query->createConditionGroup('OR', ['facet:' . $field_identifier]); foreach ($active_items as $value) { if ($value === self::PAST) { - $filter->addCondition($this->facet->getFieldIdentifier(), $now->getTimestamp(), "<="); + $filter->addCondition($field_identifier, $now->getTimestamp(), "<="); } elseif ($value === self::UPCOMING) { $condition_group = $query->createConditionGroup('OR'); - $condition_group->addCondition($this->facet->getFieldIdentifier(), $now->getTimestamp(), ">"); - $condition_group->addCondition($this->facet->getFieldIdentifier(), NULL); + $condition_group->addCondition($field_identifier, $now->getTimestamp(), ">"); + $condition_group->addCondition($field_identifier, NULL); $filter->addConditionGroup($condition_group); } } $query->addConditionGroup($filter); - $this->applySort($query, $active_items, $this->facet->getFieldIdentifier()); + // Apply the sort using the field identifier of the current facet or the + // overridden one that was configured on the corresponding processor. + $sort_field_identifier = $field_identifier; + if ($this->facet->get('default_status_sort_alter_field_identifier')) { + $sort_field_identifier = $this->facet->get('default_status_sort_alter_field_identifier'); + } + $this->applySort($query, $active_items, $sort_field_identifier); } } diff --git a/tests/src/Kernel/DateStatusTest.php b/tests/src/Kernel/DateStatusTest.php index fa98612e..0452dcb6 100644 --- a/tests/src/Kernel/DateStatusTest.php +++ b/tests/src/Kernel/DateStatusTest.php @@ -118,18 +118,31 @@ public function testQueryType(): void { $list->getIndex()->indexItems(); /** @var \Drupal\search_api\Query\QueryInterface $default_query */ - $query = $list->getQuery(); + $query = $list->getQuery(['sort' => ['created' => 'DESC']]); $query->execute(); $results = $query->getResults(); // We have no facet configuration so we get all results. $this->assertCount(4, $results->getResultItems()); + // Assert that the query has been sorted by created DESC. + $this->assertSort($results->getResultItems(), [ + 'future', + 'tomorrow', + 'old', + 'oldest', + ]); + $filter = new ListPresetFilter($this->facet->id(), [DateStatus::PAST]); - $query = $list->getQuery(['preset_filters' => [DefaultFilterConfigurationBuilder::generateFilterId($this->facet->id()) => $filter]]); + $query = $list->getQuery([ + 'preset_filters' => [DefaultFilterConfigurationBuilder::generateFilterId($this->facet->id()) => $filter], + 'sort' => ['created' => 'DESC'], + ]); $query->execute(); $results = $query->getResults(); $this->assertCount(2, $results->getResultItems()); + // The facet field identifier matches the configured query sort, to for + // past items, the sort has been kept as DESC. $this->assertSort($results->getResultItems(), [ 'old', 'oldest', @@ -137,10 +150,15 @@ public function testQueryType(): void { $this->container->get('kernel')->rebuildContainer(); $filter = new ListPresetFilter($this->facet->id(), [DateStatus::UPCOMING]); - $query = $list->getQuery(['preset_filters' => [DefaultFilterConfigurationBuilder::generateFilterId($this->facet->id()) => $filter]]); + $query = $list->getQuery([ + 'preset_filters' => [DefaultFilterConfigurationBuilder::generateFilterId($this->facet->id()) => $filter], + 'sort' => ['created' => 'DESC'], + ]); $query->execute(); $results = $query->getResults(); $this->assertCount(2, $results->getResultItems()); + // The facet field identifier matches the configured query sort, to for + // upcoming items, the sort has altered as ASC. $this->assertSort($results->getResultItems(), [ 'tomorrow', 'future', @@ -153,19 +171,45 @@ public function testQueryType(): void { ]); $query = $list->getQuery([ - 'preset_filters' => [ - DefaultFilterConfigurationBuilder::generateFilterId($this->facet->id()) => $filter, - ], + 'preset_filters' => [DefaultFilterConfigurationBuilder::generateFilterId($this->facet->id()) => $filter], + 'sort' => ['created' => 'DESC'], ]); $query->execute(); $results = $query->getResults(); $this->assertCount(4, $results->getResultItems()); + // The facet field identifier matches the configured query sort, to for + // both past and upcoming items, the sort has been kept as DESC. $this->assertSort($results->getResultItems(), [ 'future', 'tomorrow', 'old', 'oldest', ]); + + // Update the processor config to use the body field as the sort alter + // field. + $configs = $this->facet->getProcessorConfigs(); + $configs['oe_list_pages_date_status_processor']['settings']['sort_alter_field_identifier'] = 'name'; + $this->facet->set('processor_configs', $configs); + $this->facet->save(); + + $this->container->get('kernel')->rebuildContainer(); + $filter = new ListPresetFilter($this->facet->id(), [DateStatus::UPCOMING]); + $query = $list->getQuery([ + 'preset_filters' => [DefaultFilterConfigurationBuilder::generateFilterId($this->facet->id()) => $filter], + 'sort' => ['name' => 'DESC'], + ]); + $query->execute(); + $results = $query->getResults(); + $this->assertCount(2, $results->getResultItems()); + // The query sort field is now different so assert that the query gets + // filtered by the correct date field (so show only upcoming items) but the + // sort alter is applied to the configured query sort. This means that it + // will be sorted by name ASC. + $this->assertSort($results->getResultItems(), [ + 'future', + 'tomorrow', + ]); } /**