예제 #1
0
 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)));
 }
예제 #2
0
 /**
  * {@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;
 }
예제 #3
0
 /**
  * @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;
 }
예제 #5
0
 /**
  * @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);
         }
     }
 }
예제 #10
0
 /**
  * @return Expr
  */
 private function expr()
 {
     return $this->queryBuilder->expr();
 }
예제 #11
0
 /**
  * Get QueryBuilder expr.
  *
  * @return \Doctrine\ODM\MongoDB\Query\Expr
  */
 public function getExpr()
 {
     return $this->queryBuilder->expr();
 }