/**
  * {@inheritdoc}
  */
 public function sortResults(Result $a, Result $b)
 {
     if ($a->isActive() == $b->isActive()) {
         return 0;
     }
     return $a->isActive() ? -1 : 1;
 }
 /**
  * {@inheritdoc}
  */
 public function sortResults(Result $a, Result $b)
 {
     if ($a->getCount() == $b->getCount()) {
         return 0;
     }
     return $a->getCount() < $b->getCount() ? -1 : 1;
 }
 /**
  * {@inheritdoc}
  */
 public function build()
 {
     $parent_facet_results = [];
     /** @var \Drupal\facets\Utility\FacetsDateHandler $date_handler */
     $date_handler = \Drupal::getContainer()->get('facets.utility.date_handler');
     // Gets base facet query, adds facet field and filters.
     /* @var \Drupal\core_search_facets\Plugin\CoreSearchFacetSourceInterface $facet_source */
     $facet_source = $this->facet->getFacetSource();
     $query_info = $facet_source->getQueryInfo($this->facet);
     /** @var \Drupal\core_search_facets\FacetsQuery $facet_query */
     $facet_query = $facet_source->getFacetQueryExtender();
     $facet_query->addFacetField($query_info);
     foreach ($query_info['joins'] as $table_alias => $join_info) {
         $facet_query->addFacetJoin($query_info, $table_alias);
     }
     if ($facet_query->getSearchExpression()) {
         // Executes query, iterates over results.
         $result = $facet_query->execute();
         foreach ($result as $record) {
             $raw_values[$record->value] = $record->count;
         }
         ksort($raw_values);
         // Gets active facets, starts building hierarchy.
         $parent = NULL;
         $gap = NULL;
         $last_parent = NULL;
         foreach ($this->facet->getActiveItems() as $value => $item) {
             if ($active_item = $date_handler->extractActiveItems($item)) {
                 $date_gap = $date_handler->getDateGap($active_item['start']['iso'], $active_item['end']['iso']);
                 $gap = $date_handler->getNextDateGap($date_gap, $date_handler::FACETS_DATE_MINUTE);
                 $last_parent = '[' . $active_item['start']['iso'] . ' TO ' . $active_item['end']['iso'] . ']';
                 $result = new Result($last_parent, $date_handler->formatTimestamp($active_item['start']['timestamp'], $date_gap), NULL);
                 $result->setActiveState(TRUE);
                 // Sets the children for the current parent..
                 if ($parent) {
                     $parent->setChildren($result);
                 } else {
                     $parent = $parent_facet_results[] = $result;
                 }
             }
         }
         // Mind the gap! Calculates gap from min and max timestamps.
         $timestamps = array_keys($raw_values);
         if (is_null($parent)) {
             if (count($raw_values) > 1) {
                 $gap = $date_handler->getTimestampGap(min($timestamps), max($timestamps));
             } else {
                 $gap = $date_handler::FACETS_DATE_HOUR;
             }
         }
         // Converts all timestamps to dates in ISO 8601 format.
         $dates = [];
         foreach ($timestamps as $timestamp) {
             $dates[$timestamp] = $date_handler->isoDate($timestamp, $gap);
         }
         // Treat each date as the range start and next date as the range end.
         $range_end = [];
         $previous = NULL;
         foreach (array_unique($dates) as $date) {
             if (!is_null($previous)) {
                 $range_end[$previous] = $date_handler->getNextDateIncrement($previous, $gap);
             }
             $previous = $date;
         }
         $range_end[$previous] = $date_handler->getNextDateIncrement($previous, $gap);
         $facet_results = [];
         foreach ($raw_values as $value => $count) {
             $new_value = '[' . $dates[$value] . ' TO ' . $range_end[$dates[$value]] . ']';
             // Avoid to repeat the last value.
             if ($new_value === $last_parent) {
                 $this->facet->setResults($parent_facet_results);
                 return $this->facet;
             }
             // Groups dates by the range they belong to.
             /** @var \Drupal\facets\Result\Result $last_element */
             $last_value = end($facet_results);
             if ($last_value) {
                 if ($new_value != $last_value->getRawValue()) {
                     $facet_results[] = new Result($new_value, $date_handler->formatTimestamp($value, $gap), $count);
                 } else {
                     $last_value->setCount($last_value->getCount() + 1);
                 }
             } else {
                 $facet_results[] = new Result($new_value, $date_handler->formatTimestamp($value, $gap), $count);
             }
         }
         // Populate the parent with children.
         $parent = end($parent_facet_results);
         if ($parent instanceof ResultInterface) {
             foreach ($facet_results as $result) {
                 $parent->setChildren($result);
                 $this->facet->setResults($parent_facet_results);
             }
         } else {
             // Set results directly when missing parents.
             $this->facet->setResults($facet_results);
         }
     }
     return $this->facet;
 }
 /**
  * {@inheritdoc}
  */
 public function sortResults(Result $a, Result $b)
 {
     return strnatcasecmp($a->getRawValue(), $b->getRawValue());
 }