public function providerParseExpressionWithVariables() { $variables = array(1 => 'test', 2 => 'test2', 3 => 5, 4 => 10); $field = new FieldExpression('field'); $variable = new ScalarExpression('test'); $variable2 = new ScalarExpression('test2'); $maxFieldFunction = new FunctionExpression(FunctionExpression::FUNCTION_MAX); $maxFieldFunction->addArgument($variable2); $minFieldFunction = new FunctionExpression(FunctionExpression::FUNCTION_MIN, 'mf'); $minFieldFunction->addArgument($field); $minFieldFunction->addArgument($variable); $minFieldFunction2 = new FunctionExpression(FunctionExpression::FUNCTION_MIN, 'mf'); $minFieldFunction2->addArgument($field); $minFieldFunction2->addArgument($variable); $minFieldFunction2->addArgument($maxFieldFunction); $simpleMathematic = new MathematicalExpression(); $simpleMathematic->addExpression(new ScalarExpression(5)); $simpleMathematic->addExpression(new ScalarExpression(10), '+'); $mediumMathematic = new MathematicalExpression(); $mediumMathematic->addExpression(new ScalarExpression(5)); $mediumMathematic->addExpression($simpleMathematic, '/'); $minFunction = new FunctionExpression(FunctionExpression::FUNCTION_MIN); $minFunction->addArgument(new ScalarExpression(5)); $maxFunction = new FunctionExpression(FunctionExpression::FUNCTION_MAX); $maxFunction->addArgument($simpleMathematic); $functionMathematic = new MathematicalExpression(); $functionMathematic->addExpression($minFunction); $functionMathematic->addExpression($maxFunction); return array(array(new ScalarExpression('This is a test sentence'), '"This is a %1% sentence"', $variables), array(new ScalarExpression('test'), '%1%', $variables), array($maxFieldFunction, 'MAX(%2%)', $variables), array($minFieldFunction, 'MIN({field}, %1%) AS mf', $variables), array($minFieldFunction2, 'MIN({field}, %1%, MAX(%2%)) AS mf', $variables), array($simpleMathematic, '%3% + %4%', $variables), array($mediumMathematic, '%3% / (%3% + %4%)', $variables), array($functionMathematic, 'MIN(%3%) + MAX(%3% + %4%)', $variables)); }
/** * Parses the provided function call into a database function expression * @param string $function String of the function expression * @return boolean|zibo\library\database\manipulation\expression\FunctionExpression false if the * provided function expression could not be parsed, the function expression object otherwise. */ private function parseFunction($function) { if (!preg_match(self::REGEX_FUNCTION, $function, $matches)) { return false; } $name = trim($matches[1]); if (!$name) { return false; } $arguments = $matches[3]; $alias = null; if (isset($matches[6])) { $alias = $matches[6]; } $function = new FunctionExpression($name, $alias); if (strpos($arguments, 'DISTINCT ') === 0) { $function->setDistinct(true); $arguments = substr($arguments, 9); } $argumentTokens = $this->fieldTokenizer->tokenize($arguments); foreach ($argumentTokens as $argument) { $argument = $this->parseExpression($argument); $function->addArgument($argument); } return $function; }
/** * Processes the relations and the localization of the arguments used in a function expression * @param zibo\library\database\manipulation\expression\FunctionExpression $expression Function expression to process * @param boolean $inCondition Flag to see whether this expression is used in a condition or else where * @return zibo\library\database\manipulation\expression\FunctionExpression Processed function expression */ private function processFunctionExpression(FunctionExpression $expression, $inCondition) { $function = new FunctionExpression($expression->getName(), $expression->getAlias()); $function->setDistinct($expression->isDistinct()); $arguments = $expression->getArguments(); foreach ($arguments as $argument) { $argument = $this->processExpression($argument, $inCondition); $function->addArgument($argument); } return $function; }