Skip to content

Commit

Permalink
EWPP-2838: Date status processor specific sort alter field.
Browse files Browse the repository at this point in the history
  • Loading branch information
upchuk committed Feb 6, 2023
1 parent 300e5ca commit 7836126
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 10 deletions.
3 changes: 3 additions & 0 deletions config/schema/oe_list_pages.schema.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
22 changes: 22 additions & 0 deletions src/Plugin/facets/processor/DateStatusProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -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}
*/
Expand All @@ -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;
}

Expand All @@ -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();
}

Expand Down
14 changes: 10 additions & 4 deletions src/Plugin/facets/query_type/DateStatus.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}

Expand Down
56 changes: 50 additions & 6 deletions tests/src/Kernel/DateStatusTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -118,29 +118,47 @@ 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',
]);

$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',
Expand All @@ -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',
]);
}

/**
Expand Down

0 comments on commit 7836126

Please sign in to comment.