You can attach {@link ExpressionVisitor} instances to the traverse which will be invoked for every node of the expression tree.
Since: 1.0
Author: Bernhard Schussek (bschussek@gmail.com)
Esempio n. 1
0
 /**
  * @param Expression[] $expressions
  * @param string       $class
  *
  * @return \Doctrine\ORM\QueryBuilder
  *
  * @throws \Exception
  */
 public function toQueryBuilder(array $expressions, $class)
 {
     $expr = $this->buildExpression($expressions);
     $qb = $this->em->getRepository($class)->createQueryBuilder('a');
     $traverser = new ExpressionTraverser();
     $traverser->addVisitor(new QueryBuilderVisitor($qb));
     $traverser->traverse($expr);
     return $qb;
 }
 /**
  * Builds a {@link BindingDescriptor} expression for a given
  * {@link AssetMapping} expression.
  *
  * @param Expression|null $expr The {@link AssetMapping} expression.
  *
  * @return Expression The built expression.
  */
 public function buildExpression(Expression $expr = null)
 {
     if (!$this->defaultExpression) {
         $this->defaultExpression = Expr::method('isEnabled', Expr::same(true))->andMethod('getTypeName', Expr::same(DiscoveryUrlGenerator::BINDING_TYPE))->andMethod('getBinding', Expr::method('getQuery', Expr::endsWith('{,/**/*}')));
     }
     if (!$expr) {
         return $this->defaultExpression;
     }
     $traverser = new ExpressionTraverser();
     $traverser->addVisitor($this);
     return $this->defaultExpression->andX($traverser->traverse($expr));
 }
 /**
  * Builds a {@link BindingDescriptor} expression for a given
  * {@link AssetMapping} expression.
  *
  * @param Expression $expr The {@link AssetMapping} expression.
  *
  * @return Expression The built expression.
  */
 public function buildExpression(Expression $expr = null)
 {
     if (!$this->defaultExpression) {
         $this->defaultExpression = Expr::same(BindingState::ENABLED, BindingDescriptor::STATE)->andSame(DiscoveryUrlGenerator::BINDING_TYPE, BindingDescriptor::TYPE_NAME)->andEndsWith('{,/**/*}', BindingDescriptor::QUERY);
     }
     if (!$expr) {
         return $this->defaultExpression;
     }
     $traverser = new ExpressionTraverser();
     $traverser->addVisitor($this);
     return $this->defaultExpression->andX($traverser->traverse($expr));
 }
 public function testRemoveAllDisjuncts()
 {
     $expr1 = new OrX(array($gt1 = new GreaterThan(10), $same = new Same('5')));
     $visitor = $this->getMock('Webmozart\\Expression\\Traversal\\ExpressionVisitor');
     $visitor->expects($this->at(0))->method('enterExpression')->with($this->identicalTo($expr1))->willReturn($expr1);
     $visitor->expects($this->at(1))->method('enterExpression')->with($this->identicalTo($gt1))->willReturn($gt1);
     $visitor->expects($this->at(2))->method('leaveExpression')->with($this->identicalTo($gt1))->willReturn(null);
     $visitor->expects($this->at(3))->method('enterExpression')->with($this->identicalTo($same))->willReturn($same);
     $visitor->expects($this->at(4))->method('leaveExpression')->with($this->identicalTo($same))->willReturn(null);
     $this->traverser->addVisitor($visitor);
     $this->assertNull($this->traverser->traverse($expr1));
 }