/** * @param Builder $queryBuilder * @param ConditionNodeInterface $node * @param Expr $expr * @return null */ protected function computeExpression(Builder $queryBuilder, ConditionNodeInterface $node, Expr $expr = null) { if (count($node->getFields()) == 0 && count($node->getChildren()) == 0) { return null; } $method = $node->getOperator() === ConditionNodeInterface::EXPR_AND ? 'addAnd' : 'addOr'; $expression = null === $expr ? $queryBuilder : $expr; $count = 0; foreach ($node->getFields() as $condition) { if (null !== $condition) { /** @var ConditionInterface $condition */ $expression->{$method}($condition->getExpression()); $count++; } } foreach ($node->getChildren() as $child) { $subExpr = $queryBuilder->expr(); $subCount = $this->computeExpression($queryBuilder, $child, $subExpr); if ($subCount > 0) { $expression->{$method}($subExpr); $count++; } } return $count; }
/** * @param DoctrineQueryBuilderAdapter $queryBuilder * @param ConditionNodeInterface $node * @return Composite|CompositeExpression|null */ protected function computeExpression(DoctrineQueryBuilderAdapter $queryBuilder, ConditionNodeInterface $node) { if (count($node->getFields()) == 0 && count($node->getChildren()) == 0) { return null; } $method = $node->getOperator() == ConditionNodeInterface::EXPR_AND ? 'andX' : 'orX'; $expression = $queryBuilder->{$method}(); foreach ($node->getFields() as $condition) { if (null !== $condition) { /** @var ConditionInterface $condition */ $expression->add($condition->getExpression()); $this->parameters = array_merge($this->parameters, $condition->getParameters()); } } foreach ($node->getChildren() as $child) { $subExpr = $this->computeExpression($queryBuilder, $child); if (null !== $subExpr && $subExpr->count()) { $expression->add($subExpr); } } return $expression->count() ? $expression : null; }
/** * Create a default node hierarchy by using AND operator. * * @param Form $form * @param ConditionNodeInterface $root * @param string $parentName */ protected function buildDefaultConditionNode(Form $form, ConditionNodeInterface $root, $parentName = '') { foreach ($form->all() as $child) { $name = '' !== $parentName ? $parentName . '.' . $child->getName() : $child->getName(); if ($child->getConfig()->hasAttribute('add_shared')) { $isCollection = $child->getConfig()->getType()->getInnerType() instanceof CollectionAdapterFilterType; $this->buildDefaultConditionNode($isCollection ? $child->get(0) : $child, $root->andX(), $name); } else { $root->field($name); } } }