diff --git a/src/Plugin/facets/query_type/SearchApiDate.php b/src/Plugin/facets/query_type/SearchApiDate.php index a89a45d..b4cf325 100644 --- a/src/Plugin/facets/query_type/SearchApiDate.php +++ b/src/Plugin/facets/query_type/SearchApiDate.php @@ -24,13 +24,33 @@ use Drupal\facets\QueryType\QueryTypeRangeBase; class SearchApiDate extends QueryTypeRangeBase { /** - * Granularity constants for grouping results. + * Constant for grouping on year. */ const FACETAPI_DATE_YEAR = 6; + + /** + * Constant for grouping on month. + */ const FACETAPI_DATE_MONTH = 5; + + /** + * Constant for grouping on day. + */ const FACETAPI_DATE_DAY = 4; + + /** + * Constant for grouping on hour. + */ const FACETAPI_DATE_HOUR = 3; + + /** + * Constant for grouping on minute. + */ const FACETAPI_DATE_MINUTE = 2; + + /** + * Constant for grouping on second. + */ const FACETAPI_DATE_SECOND = 1; /** @@ -45,33 +65,55 @@ class SearchApiDate extends QueryTypeRangeBase { } } + /** + * Returns a start and end date based on a unix timestamp. + * + * This method returns a start and end date with an absolute interval, based + * on the granularity set in the widget. + * + * @param int $value + * Unix timestamp. + * + * @return array + * An array with a start and end date as unix timestamps. + * + * @throws \Exception + * Thrown when creating a date fails. + */ protected function calculateRangeAbsolute($value) { $dateTime = new DrupalDateTime(); + switch ($this->getGranularity()) { case static::FACETAPI_DATE_YEAR: $startDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value . '1-1T00:00:00'); $stopDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value . '12-3123:59:59'); break; + case static::FACETAPI_DATE_MONTH: $startDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value . '-1T00:00:00'); $stopDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value . '-31T23:59:59'); break; + case static::FACETAPI_DATE_DAY: $startDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value . 'T00:00:00'); $stopDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value . 'T23:59:59'); break; + case static::FACETAPI_DATE_HOUR: $startDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value . '00:00'); $stopDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value . '59:59'); break; + case static::FACETAPI_DATE_MINUTE: $startDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value . ':00'); $stopDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value . ':59'); break; + case static::FACETAPI_DATE_SECOND: $startDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value); $stopDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value); break; + } return [ @@ -80,8 +122,24 @@ class SearchApiDate extends QueryTypeRangeBase { ]; } + /** + * Returns a start and end date based on a unix timestamp. + * + * This method returns a start and end date with an relative interval, based + * on the granularity set in the widget. + * + * @param int $value + * Unix timestamp. + * + * @return array + * An array with a start and end date as unix timestamps. + * + * @throws \Exception + * Thrown when creating a date fails. + */ protected function calculateRangeRelative($value) { $dateTime = new DrupalDateTime(); + switch ($this->getGranularity()) { case static::FACETAPI_DATE_YEAR: $startDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value . '-1T00:00:00'); @@ -89,34 +147,40 @@ class SearchApiDate extends QueryTypeRangeBase { $stopDate->add(new \DateInterval('P1Y')); $stopDate->sub(new \DateInterval('PT1S')); break; + case static::FACETAPI_DATE_MONTH: $startDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value . 'T00:00:00'); $stopDate = clone $startDate; $stopDate->add(new \DateInterval('P1M')); $stopDate->sub(new \DateInterval('PT1S')); break; + case static::FACETAPI_DATE_DAY: $startDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value . ':00:00'); $stopDate = clone $startDate; $stopDate->add(new \DateInterval('P1D')); $stopDate->sub(new \DateInterval('PT1S')); break; + case static::FACETAPI_DATE_HOUR: $startDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value . ':00'); $stopDate = clone $startDate; $stopDate->add(new \DateInterval('PT1H')); $stopDate->sub(new \DateInterval('PT1S')); break; + case static::FACETAPI_DATE_MINUTE: $startDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value); $stopDate = clone $startDate; $stopDate->add(new \DateInterval('PT1M')); $stopDate->sub(new \DateInterval('PT1S')); break; + case static::FACETAPI_DATE_SECOND: $startDate = $dateTime::createFromFormat('Y-m-d\TH:i:s', $value); $stopDate = clone $startDate; break; + } return [ @@ -125,7 +189,15 @@ class SearchApiDate extends QueryTypeRangeBase { ]; } - + /** + * Calculates the result of the filter. + * + * @param int $value + * A unix timestamp. + * + * @return array + * An array with a start and end date as unix timestamps. + */ public function calculateResultFilter($value) { if ($this->getDisplayRelative()) { return $this->calculateResultFilterRelative($value); @@ -142,31 +214,38 @@ class SearchApiDate extends QueryTypeRangeBase { $date = new DrupalDateTime(); $date->setTimestamp($value); $date_display = $this->getDateFormat(); + switch ($this->getGranularity()) { case static::FACETAPI_DATE_YEAR: $format = 'Y'; $raw = $date->format('Y'); break; + case static::FACETAPI_DATE_MONTH: $format = 'F Y'; $raw = $date->format('Y-m'); break; + case static::FACETAPI_DATE_DAY: $format = 'd F Y'; $raw = $date->format('Y-m-d'); break; + case static::FACETAPI_DATE_HOUR: $format = 'd/m/Y H\h'; $raw = $date->format('Y-m-d\TH'); break; + case static::FACETAPI_DATE_MINUTE: $format = 'd/m/Y H:i'; $raw = $date->format('Y-m-d\TH:i'); break; + case static::FACETAPI_DATE_SECOND: $format = 'd/m/Y H:i:s'; $raw = $date->format('Y-m-d\TH:i:s'); break; + } $format = $date_display ? $date_display : $format; return [ @@ -200,6 +279,7 @@ class SearchApiDate extends QueryTypeRangeBase { } $raw = $now->format('Y-m'); break; + case static::FACETAPI_DATE_MONTH: $rounded = new \DateInterval('P' . $interval->y . 'Y' . $interval->m . 'M'); $display = $interval->y ? $this->formatPlural($interval->y, '1 year', '@count years') . ' ' : ''; @@ -218,6 +298,7 @@ class SearchApiDate extends QueryTypeRangeBase { } $raw = $now->format('Y-m-d'); break; + case static::FACETAPI_DATE_DAY: $rounded = new \DateInterval('P' . $interval->y . 'Y' . $interval->m . 'M' . $interval->d . 'D'); $display = $interval->y ? $this->formatPlural($interval->y, '1 year', '@count years') . ' ' : ''; @@ -237,6 +318,7 @@ class SearchApiDate extends QueryTypeRangeBase { } $raw = $now->format('Y-m-d\TH'); break; + case static::FACETAPI_DATE_HOUR: $rounded = new \DateInterval('P' . $interval->y . 'Y' . $interval->m . 'M' . $interval->d . 'DT' . $interval->h . 'H'); $display = $interval->y ? $this->formatPlural($interval->y, '1 year', '@count years') . ' ' : ''; @@ -257,6 +339,7 @@ class SearchApiDate extends QueryTypeRangeBase { } $raw = $now->format('Y-m-d\TH:i'); break; + case static::FACETAPI_DATE_MINUTE: $rounded = new \DateInterval('P' . $interval->y . 'Y' . $interval->m . 'M' . $interval->d . 'DT' . $interval->h . 'H' . $interval->i); $display = $interval->y ? $this->formatPlural($interval->y, '1 year', '@count years') . ' ' : ''; @@ -278,6 +361,7 @@ class SearchApiDate extends QueryTypeRangeBase { } $raw = $date->format('Y-m-d\TH:i:s'); break; + case static::FACETAPI_DATE_SECOND: $rounded = new \DateInterval('P' . $interval->y . 'Y' . $interval->m . 'M' . $interval->d . 'DT' . $interval->h . 'H' . $interval->i . $interval->s . 'S'); $display = $interval->y ? $this->formatPlural($interval->y, '1 year', '@count years') . ' ' : ''; @@ -300,7 +384,9 @@ class SearchApiDate extends QueryTypeRangeBase { } $raw = $date->format('Y-m-d\TH:i:s'); break; + } + return [ 'display' => $display, 'raw' => $raw, diff --git a/src/Plugin/facets/widget/DateBasicWidget.php b/src/Plugin/facets/widget/DateBasicWidget.php index a984ba1..32c1b20 100644 --- a/src/Plugin/facets/widget/DateBasicWidget.php +++ b/src/Plugin/facets/widget/DateBasicWidget.php @@ -8,7 +8,6 @@ use Drupal\facets\Result\Result; use Drupal\facets\Widget\WidgetPluginBase; use Drupal\facets\Plugin\facets\query_type\SearchApiDate; - /** * Basic date widget. * @@ -24,6 +23,7 @@ class DateBasicWidget extends WidgetPluginBase { * Human readable array of granularity options. * * @return array + * An array of granularity options. */ private function granularityOptions() { return array( @@ -36,7 +36,6 @@ class DateBasicWidget extends WidgetPluginBase { ); } - /** * {@inheritdoc} */ @@ -120,4 +119,5 @@ class DateBasicWidget extends WidgetPluginBase { ], ]; } + } diff --git a/src/Plugin/facets/widget/NumericGranularWidget.php b/src/Plugin/facets/widget/NumericGranularWidget.php index f5439fc..6158437 100644 --- a/src/Plugin/facets/widget/NumericGranularWidget.php +++ b/src/Plugin/facets/widget/NumericGranularWidget.php @@ -4,10 +4,6 @@ namespace Drupal\facets\Plugin\facets\widget; use Drupal\Core\Form\FormStateInterface; use Drupal\facets\FacetInterface; -use Drupal\facets\Result\Result; -use Drupal\facets\Widget\WidgetPluginBase; -use Drupal\facets\Plugin\facets\query_type\SearchApiDate; - /** * Basic granular widget. diff --git a/tests/src/Unit/Plugin/query_type/SearchApiDateTest.php b/tests/src/Unit/Plugin/query_type/SearchApiDateTest.php index 126f364..bf79636 100644 --- a/tests/src/Unit/Plugin/query_type/SearchApiDateTest.php +++ b/tests/src/Unit/Plugin/query_type/SearchApiDateTest.php @@ -14,6 +14,9 @@ use Drupal\search_api\Plugin\views\query\SearchApiQuery; */ class SearchApiDateTest extends KernelTestBase { + /** + * {@inheritdoc} + */ public function setUp() { parent::setUp(); @@ -30,7 +33,7 @@ class SearchApiDateTest extends KernelTestBase { */ public function testQueryTypeAnd($granularity, $original_results, $grouped_results) { $query = new SearchApiQuery([], 'search_api_query', []); - $facetReflection = new \ReflectionClass ('Drupal\facets\Entity\Facet'); + $facetReflection = new \ReflectionClass('Drupal\facets\Entity\Facet'); $facet = new Facet( ['query_operator' => 'AND'], 'facets_facet' diff --git a/tests/src/Unit/Plugin/query_type/SearchApiGranularTest.php b/tests/src/Unit/Plugin/query_type/SearchApiGranularTest.php index 4157247..7a5f916 100644 --- a/tests/src/Unit/Plugin/query_type/SearchApiGranularTest.php +++ b/tests/src/Unit/Plugin/query_type/SearchApiGranularTest.php @@ -19,7 +19,7 @@ class SearchApiGranularTest extends UnitTestCase { */ public function testQueryTypeAnd() { $query = new SearchApiQuery([], 'search_api_query', []); - $facetReflection = new \ReflectionClass ('Drupal\facets\Entity\Facet'); + $facetReflection = new \ReflectionClass('Drupal\facets\Entity\Facet'); $facet = new Facet( ['query_operator' => 'AND'], 'facets_facet'