You are here

public function DateRecurFilter::query in Recurring Dates Field 3.x

Same name and namespace in other branches
  1. 8.2 src/Plugin/views/filter/DateRecurFilter.php \Drupal\date_recur\Plugin\views\filter\DateRecurFilter::query()
  2. 3.0.x src/Plugin/views/filter/DateRecurFilter.php \Drupal\date_recur\Plugin\views\filter\DateRecurFilter::query()
  3. 3.1.x src/Plugin/views/filter/DateRecurFilter.php \Drupal\date_recur\Plugin\views\filter\DateRecurFilter::query()

Add this filter to the query.

Due to the nature of fapi, the value and the operator have an unintended level of indirection. You will find them in $this->operator and $this->value respectively.

Overrides FilterPluginBase::query

File

src/Plugin/views/filter/DateRecurFilter.php, line 132

Class

DateRecurFilter
Date range/occurrence filter.

Namespace

Drupal\date_recur\Plugin\views\filter

Code

public function query() : void {
  $this
    ->ensureMyTable();
  $dateRecurFieldName = $this->configuration['date recur field name'];
  $entityIdFieldName = $this->configuration['field base entity_id'];
  $fieldDefinitions = $this->entityFieldManager
    ->getFieldStorageDefinitions($this->configuration['entity_type']);
  $occurrenceTableName = DateRecurOccurrences::getOccurrenceCacheStorageTableName($fieldDefinitions[$dateRecurFieldName]);
  $storageTimezone = new \DateTimeZone(DateTimeItemInterface::STORAGE_TIMEZONE);
  $storageFormat = DateTimeItemInterface::DATETIME_STORAGE_FORMAT;
  $subQuery = $this->database
    ->select($occurrenceTableName, 'occurrences');
  $subQuery
    ->addField('occurrences', 'entity_id');
  $largestDate = $this->largestDate;
  $largestDate
    ->setTimezone($storageTimezone);
  $startFieldName = $dateRecurFieldName . '_value';
  $subQuery
    ->condition($startFieldName, $largestDate
    ->format($storageFormat), '<=');
  $smallestDate = $this->smallestDate;
  $smallestDate
    ->setTimezone($storageTimezone);
  $endFieldName = $dateRecurFieldName . '_end_value';
  $subQuery
    ->condition($endFieldName, $smallestDate
    ->format($storageFormat), '>=');
  $subQuery
    ->groupBy('entity_id');
  $this->query
    ->addWhere(0, $this->tableAlias . '.' . $entityIdFieldName, $subQuery, 'IN');
}