Exemplo n.º 1
0
 /**
  *
  * @return array
  * @param Column $resultColumn
  */
 public function resolveResultColumn(Column $resultColumn, array &$resultRow, ExecutionContext $context)
 {
     $schemaSource = $resultColumn->getSchemaSource();
     switch (true) {
         case $schemaSource instanceof ValuePart:
             $columnIdentifier = $schemaSource->generateAlias();
             $columnData = $this->resolveValue($schemaSource, $context);
             $resultRow[$columnIdentifier] = $columnData;
             break;
         case $schemaSource instanceof Column:
             $columnIdentifier = (string) $schemaSource;
             $columnData = $context->getCurrentSourceRow()[$columnIdentifier];
             $resultRow[$columnIdentifier] = $columnData;
             break;
         case $resultColumn->getIsAllColumnsFromTable() && $schemaSource === '*':
             $tables = $context->getStatement()->getJoinDefinition()->getTables();
             if (count($tables) === 1) {
                 foreach ($context->getCurrentSourceRow() as $alias => $columnData) {
                     if (substr_count($alias, '.') === 0) {
                         $resultRow[$alias] = $columnData;
                     }
                 }
             } else {
                 foreach ($context->getCurrentSourceRow() as $alias => $columnData) {
                     if (substr_count($alias, '.') === 1) {
                         $resultRow[$alias] = $columnData;
                     }
                 }
             }
             break;
         case $resultColumn->getIsAllColumnsFromTable() && $schemaSource instanceof Table:
             $needleAlias = (string) $schemaSource;
             foreach ($context->getCurrentSourceRow() as $alias => $columnData) {
                 if (substr($alias, 0, strlen($needleAlias)) === $needleAlias) {
                     $columnName = substr($alias, strlen($needleAlias) + 1);
                     $resultRow[$columnName] = $columnData;
                 }
             }
             break;
         default:
             throw new \ErrorException("Invalid schema-source for result-specifier-column!");
     }
     return $resultRow;
 }
Exemplo n.º 2
0
 public function getResultSpecifier()
 {
     $resultSpecifier = new ResultSpecifier();
     $resultColumn = new ResultColumnSpecifier();
     foreach ($this->getColumns() as $alias => $column) {
         switch (true) {
             case $column instanceof Column:
                 $resultColumn->setSchemaSourceColumn($column);
                 $resultColumn->setName($column->getColumn());
                 break;
             case $column === '*':
                 $resultColumn->setSchemaSourceJoker();
                 $resultColumn->setIsAllColumnsFromTable(true);
                 break;
             case $column instanceof Table:
                 $resultColumn->setSchemaSourceTable($column);
                 $resultColumn->setIsAllColumnsFromTable(true);
                 break;
             case $column instanceof Select:
                 $Specifier = $column->getResultSpecifier();
                 if (count($Specifier->getColumns()) !== 1) {
                     throw new MalformedSqlException("Wrong column count in sub-select!");
                 }
                 $resultColumn = reset($Specifier->getColumns());
                 break;
             case $column instanceof ValuePart:
                 $resultColumn->setSchemaSourceValue($column);
                 break;
         }
         if (is_string($alias)) {
             $resultColumn->setName($alias);
         }
         $resultSpecifier->addColumn(clone $resultColumn);
     }
     return $resultSpecifier;
 }