diff --git a/src/Checker/Rule/Elasticsearch/AttributeRule.php b/src/Checker/Rule/Elasticsearch/AttributeRule.php index 6e7c98e..c48dd55 100644 --- a/src/Checker/Rule/Elasticsearch/AttributeRule.php +++ b/src/Checker/Rule/Elasticsearch/AttributeRule.php @@ -11,9 +11,13 @@ namespace BitBag\SyliusCatalogPlugin\Checker\Rule\Elasticsearch; use BitBag\SyliusElasticsearchPlugin\Formatter\StringFormatterInterface; +use BitBag\SyliusElasticsearchPlugin\PropertyBuilder\AttributeBuilder; use BitBag\SyliusElasticsearchPlugin\PropertyNameResolver\ConcatedNameResolverInterface; use Elastica\Query\AbstractQuery; +use Elastica\Query\BoolQuery; use Elastica\Query\Term; +use Sylius\Component\Attribute\AttributeType\DateAttributeType; +use Sylius\Component\Attribute\AttributeType\DatetimeAttributeType; use Sylius\Component\Attribute\Model\AttributeInterface; use Sylius\Component\Locale\Context\LocaleContextInterface; @@ -40,12 +44,21 @@ public function createSubquery(array $configuration): AbstractQuery /** @var AttributeInterface $attribute */ $attribute = $configuration['attribute']; + if (!$attribute instanceof AttributeInterface) { + return new BoolQuery(); + } + $paramName = \sprintf( '%s_%s.keyword', $this->attributeNameResolver->resolvePropertyName($attribute->getCode()), $this->localeContext->getLocaleCode() ); - $value = $this->stringFormatter->formatToLowercaseWithoutSpaces($configuration['value']); + + if (in_array($attribute->getStorageType(), [DateAttributeType::TYPE, DatetimeAttributeType::TYPE])) { + $value = $this->getDateAttributeValue($configuration); + } else { + $value = $this->stringFormatter->formatToLowercaseWithoutSpaces($configuration['value']); + } $term = new Term(); $term->setTerm($paramName, $value); @@ -53,4 +66,18 @@ public function createSubquery(array $configuration): AbstractQuery /* @phpstan-ignore-next-line Elastica\Query\Term Class extended by Elastica\Query\AbstractQuery*/ return $term; } + + private function getDateAttributeValue(array $configuration): string + { + $storageType = $configuration['attribute']->getStorageType(); + $format = $configuration['attribute']->getConfiguration()['format'] ?? + ( + DateAttributeType::TYPE === $storageType ? + AttributeBuilder::DEFAULT_DATE_FORMAT : + AttributeBuilder::DEFAULT_DATE_TIME_FORMAT + ) + ; + + return (new \DateTime($configuration['value'] ?? 'now'))->format($format); + } }