private function readParameterizedAggregator($functionName) { if (!self::scanFunction($this->request, $name, $arguments)) { return false; } if (!isset($arguments) || count($arguments) !== 1) { throw CompilerException::badGetArgument($this->request); } // at this point they definitely intend to use a parameterized aggregator $this->request = reset($arguments); if (!isset($this->request) || count($this->request) === 0) { throw CompilerException::badGetArgument($this->request); } $this->request = $this->followJoins($this->request); if (!isset($this->request) || count($this->request) === 0) { throw CompilerException::badGetArgument($this->request); } $this->request = reset($this->request); if (!$this->scanProperty($this->request, $table, $name, $type, $hasZero)) { throw CompilerException::badGetArgument($this->request); } // get the aggregator's argument's corresponding column $tableId = $this->context; $tableAliasIdentifier = Select::getIdentifier($tableId); $columnExpression = Select::getAbsoluteExpression($tableAliasIdentifier, $name); $column = new Column($columnExpression); $expressionToAggregate = $column; // handle subqueries if (isset($this->subquery)) { // select true in the subquery $expressionId = $this->subquery->addExpression($column); $columnToSelect = Select::getAbsoluteExpression(Select::getIdentifier($this->context), Select::getIdentifier($expressionId)); $expressionToAggregate = new Column($columnToSelect); } switch ($functionName) { case 'average': $aggregator = new Average($expressionToAggregate); $type = Output::TYPE_FLOAT; break; case 'sum': $aggregator = new Sum($expressionToAggregate); break; case 'min': $aggregator = new Min($expressionToAggregate); break; case 'max': $aggregator = new Max($expressionToAggregate); break; default: throw CompilerException::unknownRequestType($functionName); } $columnId = $this->mysql->addExpression($aggregator); $this->phpOutput = Output::getValue($columnId, true, $type); return true; }
protected static function getTopLevelFunction($request) { if (isset($request) && count($request) >= 1) { $firstToken = reset($request); if (count($firstToken) >= 3) { list($tokenType, $functionName, ) = $firstToken; if ($tokenType === Parser::TYPE_FUNCTION) { return $functionName; } } } throw CompilerException::unknownRequestType($request); }
private static function getQueryType($request, &$topLevelFunction) { if (isset($request) && count($request) >= 1) { $firstToken = reset($request); if (count($firstToken) >= 3) { list($tokenType, $functionName, ) = $firstToken; if ($tokenType === Parser::TYPE_FUNCTION) { $topLevelFunction = $functionName; switch ($functionName) { case 'get': case 'count': case 'average': case 'sum': case 'min': case 'max': return self::$TYPE_GET; case 'delete': return self::$TYPE_DELETE; case 'set': return self::$TYPE_SET; case 'insert': return self::$TYPE_INSERT; } } } } $topLevelFunction = null; throw CompilerException::unknownRequestType($request); }