/** * {@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); } }
/** * 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); } }
/** * {@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); } }
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); } }
/** * {@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); } }
/** * @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); } }
/** * {@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()])); } }
/** * {@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); }
/** * @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; }