protected function applySearch(QueryBuilder $query) { if (!$this->search) { return; } $query->addOr($query->expr()->field($this->map('title'))->equals($this->matchAny($this->search)))->addOr($query->expr()->field($this->map('body'))->equals($this->matchAny($this->search)))->addOr($query->expr()->field($this->map('teaser'))->equals($this->matchAny($this->search)))->addOr($query->expr()->field($this->map('category'))->equals($this->matchAny($this->search))); }
/** * {@inheritdoc} */ public function addFieldFilter($field, $operator, $value) { $field = sprintf('%s.%s', ProductQueryUtility::NORMALIZED_FIELD, $field); switch ($operator) { case 'BETWEEN': $this->qb->field($field)->gte($this->getTimestamp($value[0])); $this->qb->field($field)->lte($this->getTimestamp($value[1], true)); break; case '>': $this->qb->field($field)->gt($this->getTimestamp($value, true)); break; case '<': $this->qb->field($field)->lt($this->getTimestamp($value)); break; case '=': $this->qb->field($field)->gte($this->getTimestamp($value)); $this->qb->field($field)->lte($this->getTimestamp($value, true)); break; case 'EMPTY': $this->qb->field($field)->exists(false); break; default: $this->qb->addAnd($this->qb->expr()->addOr($this->qb->expr()->field($field)->lte($this->getTimestamp($value['from'])))->addOr($this->qb->expr()->field($field)->gte($this->getTimestamp($value['to'], true)))); } return $this; }
/** * @param array $params * @param QueryBuilder $queryBuilder * @return mixed */ public function createQuery($params, $queryBuilder) { if (isset($params['search']) && !empty($params['search'])) { $search = strtolower($params['search']); $expr = $queryBuilder->expr()->operator('$text', ['$search' => $search]); $queryBuilder->field(null)->equals($expr->getQuery()); } if (isset($params['location']) && isset($params['location']->coordinates)) { $coordinates = $params['location']->coordinates->getCoordinates(); $queryBuilder->field('preferredJob.desiredLocations.coordinates')->geoWithinCenter($coordinates[0], $coordinates[1], (double) $params['d'] / 100); } $queryBuilder->addOr($queryBuilder->expr()->field('permissions.view')->equals($this->user->getId()))->addOr($queryBuilder->expr()->field('status.name')->equals(Status::PUBLIC_TO_ALL)); //$q = $queryBuilder->getQuery()->debug(); return $queryBuilder; }
/** * @param Builder $queryBuilder * @param ConditionNodeInterface $node * @return Expr */ protected function computeExpression(Builder $queryBuilder, ConditionNodeInterface $node) { if (count($node->getFields()) == 0 && count($node->getChildren()) == 0) { return null; } $method = $node->getOperator() == ConditionNodeInterface::EXPR_AND ? 'addAnd' : 'addOr'; $expression = $queryBuilder->expr(); // create a new expression object $expressionsCount = 0; foreach ($node->getFields() as $condition) { if (null !== $condition) { /** @var ConditionInterface $condition */ $expression->{$method}($condition->getExpression()); $expressionsCount++; } } foreach ($node->getChildren() as $child) { $subExpr = $this->computeExpression($queryBuilder, $child); if (null !== $subExpr) { $expression->{$method}($subExpr); $expressionsCount++; } } return $expressionsCount > 0 ? $expression : null; }
/** * @param Parameters $params * @param Builder $queryBuilder * * @return Builder */ public function createQuery($params, $queryBuilder) { $this->value = $params->toArray(); /* * search jobs by keywords */ if (isset($this->value['params']['search']) && !empty($this->value['params']['search'])) { $search = strtolower($this->value['params']['search']); $expression = $queryBuilder->expr()->operator('$text', ['$search' => $search]); $queryBuilder->field(null)->equals($expression->getQuery()); } if (isset($this->value['params']['status']) && !empty($this->value['params']['status'])) { if ($this->value['params']['status'] != 'all') { $queryBuilder->field('status.name')->equals($this->value['params']['status']); } } else { $queryBuilder->field('status.name')->equals(Status::CREATED); } if (isset($this->value['params']['companyId']) && !empty($this->value['params']['companyId'])) { $queryBuilder->field('organization')->equals(new \MongoId($this->value['params']['companyId'])); } if (isset($this->value['sort'])) { foreach (explode(",", $this->value['sort']) as $sort) { $queryBuilder->sort($this->filterSort($sort)); } } return $queryBuilder; }
/** * Converts a composite expression into the target query language output. * * @see ExpressionVisitor::walkCompositeExpression() * @param CompositeExpression $expr * @return \Doctrine\ODM\MongoDB\Query\Expr */ public function walkCompositeExpression(CompositeExpression $compositeExpr) { if (!isset(self::$compositeMethods[$compositeExpr->getType()])) { throw new \RuntimeException('Unknown composite ' . $compositeExpr->getType()); } $method = self::$compositeMethods[$compositeExpr->getType()]; $expr = $this->builder->expr(); foreach ($compositeExpr->getExpressionList() as $child) { $expr->{$method}($this->dispatch($child)); } return $expr; }
/** * add query (like and or or) to the querybuilder * * @param string|boolean $addMethod name of method we will be calling or false if no method is needed * @param AbstractLogicOperatorNode $node AST representation of query operator * @param bool $expr should i wrap this in expr() * * @return Builder|Expr */ protected function visitLogic($addMethod, AbstractLogicOperatorNode $node, $expr = false) { $builder = $this->builder; if ($expr) { $builder = $this->builder->expr(); } foreach ($node->getQueries() as $query) { $expr = $this->recurse($query, $addMethod !== false); if ($addMethod !== false) { $builder->{$addMethod}($expr); } } return $builder; }
function it_adds_a_filter_with_codes_to_the_query($attrValidatorHelper, $idResolver, Builder $qb, AttributeInterface $attribute, Expr $expr) { $attrValidatorHelper->validateLocale($attribute, Argument::any())->shouldBeCalled(); $attrValidatorHelper->validateScope($attribute, Argument::any())->shouldBeCalled(); $attribute->getId()->willReturn(42); $attribute->isLocalizable()->willReturn(false); $attribute->isScopable()->willReturn(false); $attribute->getBackendType()->willReturn('reference_data_option'); $attribute->getCode()->willReturn('color'); $attribute->getReferenceDataName()->willReturn('ref_data_color'); $idResolver->resolve('ref_data_color', ['red', 'blue'])->willReturn([118, 270]); $qb->expr()->willReturn($expr); $expr->field('normalizedData.color.id')->shouldBeCalled()->willReturn($expr); $expr->in([118, 270])->shouldBeCalled()->willReturn($expr); $qb->addAnd($expr)->shouldBeCalled(); $this->addAttributeFilter($attribute, 'IN', ['red', 'blue'], null, null, ['field' => 'color.code']); }
/** * Add conditions according to given filters. * * @param Builder $builder * @param array $locales * @param array $filters */ protected function addTranslationFilter(Builder $builder, array $locales = null, array $filters = null) { if (null != $locales) { $qb = $this->createQueryBuilder()->hydrate(false)->distinct('id')->field('translations.locale')->in($locales); foreach ($locales as $locale) { if (!empty($filters[$locale])) { $builder->addAnd($builder->expr()->field('translations.content')->equals(new \MongoRegex(sprintf('/%s/i', $filters[$locale])))->field('translations.locale')->equals($locale)); } } $ids = $qb->getQuery()->execute(); if (count($ids) > 0) { $builder->field('id')->in($ids); } } }
/** * @return Expr */ private function expr() { return $this->queryBuilder->expr(); }
/** * Get QueryBuilder expr. * * @return \Doctrine\ODM\MongoDB\Query\Expr */ public function getExpr() { return $this->queryBuilder->expr(); }