예제 #1
0
 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;
 }
예제 #2
0
 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);
 }
예제 #3
0
 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);
 }