/** * Recursive function to process each node of the expression * * @param AbstractExpression $expression Current node to process. * * @return string The language specific expression. */ private function _processExpressionNode(AbstractExpression $expression) { if ($expression instanceof ArithmeticExpression) { $left = $this->_processExpressionNode($expression->getLeft()); $right = $this->_processExpressionNode($expression->getRight()); return $this->_expressionProvider->onArithmeticExpression($expression->getNodeType(), $left, $right); } else { if ($expression instanceof LogicalExpression) { $left = $this->_processExpressionNode($expression->getLeft()); $right = $this->_processExpressionNode($expression->getRight()); return $this->_expressionProvider->onLogicalExpression($expression->getNodeType(), $left, $right); } else { if ($expression instanceof RelationalExpression) { $left = $this->_processExpressionNode($expression->getLeft()); $right = $this->_processExpressionNode($expression->getRight()); return $this->_expressionProvider->onRelationalExpression($expression->getNodeType(), $left, $right); } else { if ($expression instanceof ConstantExpression) { return $this->_expressionProvider->onConstantExpression($expression->getType(), $expression->getValue()); } else { if ($expression instanceof PropertyAccessExpression) { return $this->_expressionProvider->onPropertyAccessExpression($expression); } else { if ($expression instanceof FunctionCallExpression) { $params = array(); foreach ($expression->getParamExpressions() as $paramExpression) { $params[] = $this->_processExpressionNode($paramExpression); } return $this->_expressionProvider->onFunctionCallExpression($expression->getFunctionDescription(), $params); } else { if ($expression instanceof UnaryExpression) { $child = $this->_processExpressionNode($expression->getChild()); return $this->_expressionProvider->onUnaryExpression($expression->getNodeType(), $child); } } } } } } } }