/**
  * {@inheritdoc}
  */
 public function getRouteCollectionForRequest(Request $request)
 {
     if (!$this->manager) {
         throw new ParameterNotFoundException('Manager must be set to execute query to the elasticsearch');
     }
     $routeCollection = new RouteCollection();
     $requestPath = $request->getPathInfo();
     $search = new Search();
     $search->addFilter(new MatchQuery('url', $requestPath));
     $results = $this->manager->execute(array_keys($this->routeMap), $search, Result::RESULTS_OBJECT);
     try {
         foreach ($results as $document) {
             $type = $this->collector->getDocumentType(get_class($document));
             if (isset($this->routeMap[$type])) {
                 $route = new Route($document->getUrl(), ['_controller' => $this->routeMap[$type], 'document' => $document, 'type' => $type]);
                 $routeCollection->add('ongr_route_' . $route->getDefault('type'), $route);
             } else {
                 throw new RouteNotFoundException(sprintf('Route for type %s% cannot be generated.', $type));
             }
         }
     } catch (\Exception $e) {
         throw new RouteNotFoundException('Document is not correct or route cannot be generated.');
     }
     return $routeCollection;
 }
 /**
  * {@inheritdoc}
  */
 public function handle(CriteriaPartInterface $criteriaPart, Criteria $criteria, Search $search, ShopContextInterface $context)
 {
     /**@var ReleaseDateCondition $criteriaPart */
     $date = new \DateTime();
     $intervalSpec = 'P' . $criteriaPart->getDays() . 'D';
     $interval = new \DateInterval($intervalSpec);
     $dateNow = new \DateTime();
     switch ($criteriaPart->getDirection()) {
         case ReleaseDateCondition::DIRECTION_FUTURE:
             $date->add($interval);
             $range = ['lte' => $date->format('Y-m-d'), 'gt' => $dateNow->format('Y-m-d')];
             break;
         case ReleaseDateCondition::DIRECTION_PAST:
             $date->sub($interval);
             $range = ['gte' => $date->format('Y-m-d'), 'lte' => $dateNow->format('Y-m-d')];
             break;
         default:
             return;
     }
     $filter = new RangeFilter('formattedReleaseDate', $range);
     if ($criteria->hasBaseCondition($criteriaPart->getName())) {
         $search->addFilter($filter);
     } else {
         $search->addPostFilter($filter);
     }
 }
Пример #3
0
 /**
  * Append a query.
  *
  * @param $query
  *
  * @return $this
  */
 public function append($query)
 {
     if ($this->getFilteringState()) {
         $this->query->addFilter($query, $this->getBoolState());
     } else {
         $this->query->addQuery($query, $this->getBoolState());
     }
     return $this;
 }
 /**
  * {@inheritdoc}
  */
 public function handle(CriteriaPartInterface $criteriaPart, Criteria $criteria, Search $search, ShopContextInterface $context)
 {
     /** @var VoteAverageCondition $criteriaPart */
     $range = new RangeFilter('voteAverage.average', ['gte' => $criteriaPart->getAverage()]);
     if ($criteria->hasBaseCondition($criteriaPart->getName())) {
         $search->addFilter($range);
     } else {
         $search->addPostFilter($range);
     }
 }
Пример #5
0
 /**
  * {@inheritdoc}
  */
 public function handle(CriteriaPartInterface $criteriaPart, Criteria $criteria, Search $search, ShopContextInterface $context)
 {
     /** @var SalesCondition $criteriaPart */
     $filter = new RangeFilter('sales', ['gt' => $criteriaPart->getMinSales()]);
     if ($criteria->hasBaseCondition($criteriaPart->getName())) {
         $search->addFilter($filter);
     } else {
         $search->addPostFilter($filter);
     }
 }
 /**
  * {@inheritdoc}
  */
 public function handle(CriteriaPartInterface $criteriaPart, Criteria $criteria, Search $search, ShopContextInterface $context)
 {
     /** @var CustomerGroupCondition $criteriaPart */
     $filter = new NotFilter(new TermsFilter('blockedCustomerGroupIds', $criteriaPart->getCustomerGroupIds()));
     if ($criteria->hasBaseCondition($criteriaPart->getName())) {
         $search->addFilter($filter);
     } else {
         $search->addPostFilter($filter);
     }
 }
 /**
  * {@inheritdoc}
  */
 public function handle(CriteriaPartInterface $criteriaPart, Criteria $criteria, Search $search, ShopContextInterface $context)
 {
     $filter = new TermFilter('hasAvailableVariant', 1);
     /** @var ImmediateDeliveryCondition $criteriaPart */
     if ($criteria->hasBaseCondition($criteriaPart->getName())) {
         $search->addFilter($filter);
     } else {
         $search->addPostFilter($filter);
     }
 }
 /**
  * {@inheritdoc}
  */
 public function handle(CriteriaPartInterface $criteriaPart, Criteria $criteria, Search $search, ShopContextInterface $context)
 {
     /** @var ManufacturerCondition $criteriaPart */
     $filter = new TermsFilter('manufacturer.id', $criteriaPart->getManufacturerIds());
     if ($criteria->hasBaseCondition($criteriaPart->getName())) {
         $search->addFilter($filter);
     } else {
         $search->addPostFilter($filter);
     }
 }
 /**
  * {@inheritdoc}
  */
 public function handle(CriteriaPartInterface $criteriaPart, Criteria $criteria, Search $search, ShopContextInterface $context)
 {
     /** @var PropertyCondition $criteriaPart */
     $filter = new TermsFilter('properties.id', $criteriaPart->getValueIds());
     if ($criteria->hasBaseCondition($criteriaPart->getName())) {
         $search->addFilter($filter);
     } else {
         $search->addPostFilter($filter);
     }
 }
 /**
  * {@inheritdoc}
  */
 public function handle(CriteriaPartInterface $criteriaPart, Criteria $criteria, Search $search, ShopContextInterface $context)
 {
     $filter = new TermFilter('shippingFree', 1);
     /** @var ShippingFreeCondition $criteriaPart */
     if ($criteria->hasBaseCondition($criteriaPart->getName())) {
         $search->addFilter($filter);
     } else {
         $search->addPostFilter($filter);
     }
 }
 /**
  * {@inheritdoc}
  */
 public function handle(CriteriaPartInterface $criteriaPart, Criteria $criteria, Search $search, ShopContextInterface $context)
 {
     /** @var CategoryCondition $criteriaPart */
     $filter = new TermsFilter('categoryIds', $criteriaPart->getCategoryIds());
     if ($criteria->hasBaseCondition($criteriaPart->getName())) {
         $search->addFilter($filter);
     } else {
         $search->addPostFilter($filter);
     }
 }
 /**
  * {@inheritdoc}
  */
 public function handle(CriteriaPartInterface $criteriaPart, Criteria $criteria, Search $search, ShopContextInterface $context)
 {
     /** @var HasPseudoPriceCondition $criteriaPart */
     $field = $this->getPseudoPriceField($context);
     $filter = new RangeFilter($field, ['gt' => 0]);
     if ($criteria->hasBaseCondition($criteriaPart->getName())) {
         $search->addFilter($filter);
     } else {
         $search->addPostFilter($filter);
     }
 }
 /**
  * {@inheritdoc}
  */
 public function handle(CriteriaPartInterface $criteriaPart, Criteria $criteria, Search $search, ShopContextInterface $context)
 {
     /**@var CreateDateCondition $criteriaPart */
     $date = new \DateTime();
     $intervalSpec = 'P' . $criteriaPart->getDays() . 'D';
     $interval = new \DateInterval($intervalSpec);
     $date->sub($interval);
     $filter = new RangeFilter('formattedCreatedAt', ['gte' => $date->format('Y-m-d')]);
     if ($criteria->hasBaseCondition($criteriaPart->getName())) {
         $search->addFilter($filter);
     } else {
         $search->addPostFilter($filter);
     }
 }
Пример #14
0
 public function handle(CriteriaPartInterface $criteriaPart, Criteria $criteria, Search $search, ShopContextInterface $context)
 {
     $range = [];
     /** @var SalesCondition $criteriaPart */
     if ($criteriaPart->getMin() > 0) {
         $range['gte'] = (int) $criteriaPart->getMin();
     }
     if ($criteriaPart->getMax() > 0) {
         $range['lte'] = (int) $criteriaPart->getMax();
     }
     $filter = new RangeFilter('sales', $range);
     if ($criteria->hasBaseCondition($criteriaPart->getName())) {
         $search->addFilter($filter);
     } else {
         $search->addPostFilter($filter);
     }
 }
Пример #15
0
 /**
  * {@inheritdoc}
  */
 public function handle(CriteriaPartInterface $criteriaPart, Criteria $criteria, Search $search, ShopContextInterface $context)
 {
     $field = $this->fieldMapping->getPriceField($context);
     $range = [];
     /** @var PriceCondition $criteriaPart */
     if ($criteriaPart->getMinPrice()) {
         $range['gte'] = $criteriaPart->getMinPrice();
     }
     if ($criteriaPart->getMaxPrice()) {
         $range['lte'] = $criteriaPart->getMaxPrice();
     }
     $filter = new RangeFilter($field, $range);
     if ($criteria->hasBaseCondition($criteriaPart->getName())) {
         $search->addFilter($filter);
     } else {
         $search->addPostFilter($filter);
     }
 }
Пример #16
0
 /**
  * @param string $path
  *
  * @return array
  */
 protected function getCategoriesByPath($path)
 {
     $nodeIds = array_filter(explode('/', $path));
     if (count($nodeIds) === 0) {
         return [];
     }
     $search = new Search();
     $search->addFilter(new IdsQuery(array_values($nodeIds)));
     $results = $this->manager->execute(['AppBundle:Category'], $search);
     $nodes = [];
     foreach ($results as $document) {
         $nodes[$document->getId()] = $document;
     }
     $sortedNodes = [];
     foreach ($nodeIds as $nodeId) {
         if (isset($nodes[$nodeId])) {
             $sortedNodes[] = $nodes[$nodeId];
         }
     }
     return $sortedNodes;
 }
 /**
  * {@inheritdoc}
  */
 public function handle(CriteriaPartInterface $criteriaPart, Criteria $criteria, Search $search, ShopContextInterface $context)
 {
     /** @var ProductAttributeCondition $criteriaPart */
     $field = 'attributes.core.' . $criteriaPart->getField();
     switch ($criteriaPart->getOperator()) {
         case ProductAttributeCondition::OPERATOR_EQ:
             $filter = new TermFilter($field, $criteriaPart->getValue());
             break;
         case ProductAttributeCondition::OPERATOR_NEQ:
             $filter = new NotFilter(new TermFilter($field, $criteriaPart->getValue()));
             break;
         case ProductAttributeCondition::OPERATOR_LT:
             $filter = new RangeFilter($field, ['lt' => $criteriaPart->getValue()]);
             break;
         case ProductAttributeCondition::OPERATOR_LTE:
             $filter = new RangeFilter($field, ['lte' => $criteriaPart->getValue()]);
             break;
         case ProductAttributeCondition::OPERATOR_BETWEEN:
             $value = $criteriaPart->getValue();
             $filter = new RangeFilter($field, ['gte' => $value['min'], 'lte' => $value['max']]);
             break;
         case ProductAttributeCondition::OPERATOR_GT:
             $filter = new RangeFilter($field, ['gt' => $criteriaPart->getValue()]);
             break;
         case ProductAttributeCondition::OPERATOR_GTE:
             $filter = new RangeFilter($field, ['gte' => $criteriaPart->getValue()]);
             break;
         case ProductAttributeCondition::OPERATOR_IN:
             $filter = new TermsFilter($field, $criteriaPart->getValue());
             break;
         case ProductAttributeCondition::OPERATOR_STARTS_WITH:
         case ProductAttributeCondition::OPERATOR_ENDS_WITH:
         case ProductAttributeCondition::OPERATOR_CONTAINS:
             $filter = new QueryFilter(new TermFilter($field, $criteriaPart->getValue()));
             break;
         default:
             return;
     }
     if ($criteria->hasBaseCondition($criteriaPart->getName())) {
         $search->addFilter($filter);
     } else {
         $search->addPostFilter($filter);
     }
 }
Пример #18
0
 /**
  * {@inheritdoc}
  */
 public function modifySearch(Search $search, FilterState $state = null, SearchRequest $request = null)
 {
     if ($state && $state->isActive()) {
         $search->addFilter(new TermsQuery('category.id', [$state->getValue()->getId()]));
     }
 }
Пример #19
0
 /**
  * {@inheritdoc}
  */
 public function hydrate(array $elasticResult, ProductNumberSearchResult $result, Criteria $criteria, ShopContextInterface $context)
 {
     if (!isset($elasticResult['aggregations'])) {
         return;
     }
     if (!isset($elasticResult['aggregations']['agg_properties'])) {
         return;
     }
     $data = $elasticResult['aggregations']['agg_properties']['buckets'];
     $ids = array_column($data, 'key');
     if (empty($ids)) {
         return;
     }
     $groupIds = $this->getGroupIds($ids);
     $search = new Search();
     $search->addFilter(new IdsFilter($groupIds));
     $search->addFilter(new TermFilter('filterable', 1));
     $search->addSort(new FieldSort('name'));
     $index = $this->indexFactory->createShopIndex($context->getShop());
     $data = $this->client->search(['index' => $index->getName(), 'type' => PropertyMapping::TYPE, 'body' => $search->toArray()]);
     $data = $data['hits']['hits'];
     $properties = $this->hydrateProperties($data, $ids);
     $actives = $this->getFilteredValues($criteria);
     $criteriaPart = $this->createCollectionResult($properties, $actives);
     $result->addFacet($criteriaPart);
 }
Пример #20
0
 /**
  * @param Struct\ListProduct $product
  * @param Struct\ShopContextInterface $context
  * @param $limit
  * @return Search
  */
 protected function getSearch($product, Struct\ShopContextInterface $context, $limit)
 {
     $search = new Search();
     $search->setSize($limit);
     $search->addQuery($this->getSimilarQuery($product));
     $search->addFilter($this->getProductNumberFilter($product));
     $search->addFilter($this->getCategoryFilter($context->getShop()->getCategory()));
     $search->addFilter($this->getCustomerGroupFilter($context->getCurrentCustomerGroup()));
     return $search;
 }