<?php 
/* 
============================================================================================================================================= 
|   This file is part of a project released under the terms of the Xyndravandria PHP License (XyndravandriaPHPLicense.txt).                 | 
|                                                                                                                                           | 
|   You should be given a copy of the Xyndravandria PHP License (XyndravandriaPHPLicense.txt) within the same directory as the README.md;   | 
|   if not, you can get a copy at http://Xyndravandria.ohost.de/XyndravandriaPHPLicense.txt .                                               | 
|                                                                                                                                           | 
|   The copyright (c) of this project is owned by Mauro Di Girolamo <[email protected]>.                                              | 
============================================================================================================================================| 
 
 
 
Xyndravandria Dyverath 
---------------------- 
Alpha 0.0.0 
 
Xyndravandria is the name of a collection of projects designed and developed by Mauro Di Girolamo ([email protected]); he is therefore the copyright (c) owner of Xyndravandria itself and all of its projects. 
 
Xyndravandria Dyverath is released under the terms of the Xyndravandria PHP License (XyndravandriaPHPLicense.txt). You should be given a copy of the Xyndravandria PHP License (XyndravandriaPHPLicense.txt) within the same directory as the README.md; if not, you can get a copy at http://Xyndravandria.ohost.de/XyndravandriaPHPLicense.txt . There might be a release under a freer license for a later, more stable version. 
 
The documentation is either included in ./admin_media/Documentation/ or can be read at http://Xyndravandria.ohost.de/Dyverath/Documentation/. 
 
All projects: 
 
   Xyndravandria Averazain 
   http://github.com/MauroDiGirolamo/Xyndravandria_Averazain 
   PHP 
   Averazain is an Ajax framework supporting also JavaScript disabled clients perfectly - including search engines like Google. 
    
   Xyndravandria Dyverath 
   http://github.com/MauroDiGirolamo/Xyndravandria_Dyverath 
   PHP 
   Dyverath is a database access wrapper. 
    
   Xyndravandria Erozaver 
   http://github.com/MauroDiGirolamo/Xyndravandria_Erozaver 
   PHP 
   Erozaver is a class extending the type hinting given by the PHP engine (additional support for basic type hinting and size constraints). 
    
   Xyndravandria Mondraviel 
   http://github.com/MauroDiGirolamo/Xyndravandria_Mondraviel 
   PHP 
   Mondraviel is a class used to separate HTML from PHP code by firstly register models - files containing place holders embedded in HTML code - and then later fill them dynamically with content by passing values for the place holders. 
*/ 
 
namespace Xyndravandria\Dyverath\Query\Component\Type; 
 
use Xyndravandria\Dyverath\Table; 
use Xyndravandria\Dyverath\XyndravandriaDyverathException; 
use Xyndravandria\Dyverath\Query\Component\Statement\StatementType; 
 
// TODO: Stricter validations? 
// TODO: Aliases are conflicting the work of Data and Dataset, since the real column names are lost. 
// TODO: Aliases in other queries than Select are invalid. 
// - Check whether column exists in table 
// - Check ColumnArray structure 
/// @brief A class representing one or more columns used in a Query. @n 
/// @details A class representing one or more columns used in a Query. @n 
/// There are four different usages of the 
/// Column class: 
/// <table> 
/// <tr> 
///    <th>Usage</th> 
///    <th>Example</th> 
///    <th>Output</th> 
/// </tr> 
/// <tr> 
///    <td>One or more normal columns</td> 
///    <td>@verbatim new Column( 'Name' ) 
///new Column( array( 'Name', 'Age' ) ) @endverbatim</td> 
///    <td> @verbatim `Table`.`Name` 
///`Table`.`Name` , `Table`.`Age` @endverbatim</td> 
/// </tr> 
/// <tr> 
///    <td>All columns of a table</td> 
///    <td>@verbatim new Column( Column::AllColumns ) @endverbatim</td> 
///    <td>@verbatim * @endverbatim</td> 
/// </tr> 
/// <tr> 
///    <td>Aliases for one or more columns</td> 
///    <td>@verbatim new Column( array( 'Name' => 'TheName' ) ) 
///new Column( array( 'Name', 'Age' => 'TheAge' ) ) @endverbatim</td> 
///    <td>@verbatim `Table`.`Name` AS `TheName`  
///`Table`.`Name` , `Table`.`Age` AS `TheAge` @endverbatim</td> 
/// </tr> 
/// <tr> 
///    <td>With ORDER BY clause</td> 
///    <td>@verbatim new Column( array( 'Name' => Column::Ascending ) ) 
///new Column( array( 'Name', 'Age' => Column::Descending ) ) @endverbatim</td> 
///    <td>@verbatim ORDER BY `Name` ASC 
///ORDER BY `Name` , `Age` DESC @endverbatim</td> 
/// </tr> 
/// </table> 
/// @abstract 
class Column extends Type implements StatementType { 
    
   /// The column(s) represented as an array. 
   /// <dl class = "type"><dt><b>%Type:</b></dt> 
   /// <dd>array of mixed</dd></dl> 
   /// @private  
   private $ColumnArray = null; 
    
   /// The columns' table. 
   /// <dl class = "type"><dt><b>%Type:</b></dt> 
   /// <dd>Table</dd></dl> 
   /// @private  
   private $Table; 
    
   /// Optimises a Column. 
   /// @public  
   /// @param Table $Table: Description 
   public function Optimise( Table $Table ) { 
      $this->Table = $Table; 
      $this->CreateString( ); 
      return; 
   } 
    
   /// Used to tell that all columns of a Table are 
   /// affected. 
   const AllColumns = 1; 
    
   /// Used to tell that the values of one column should 
   /// be sorted in ascending order. 
   const Ascending = 2; 
    
   /// Used to tell that the values of one column should 
   /// be sorted in descending order. 
   const Descending = 3; 
    
   /// Returns Column::$ColumnArray. 
   /// @public  
   /// @returns array of string 
   public function BlankColumn( ) { 
      return $this->ColumnArray; 
   } 
    
   // TODO: Select SQL Functions. 
   /// @public  
   /// Creates a new Column. 
   /// @param $ColumnArray: The column(s) represented as 
   /// an array. 
   public function __construct( $ColumnArray ) { // TODO: Type check $ColumnArray? 
      \is_array( $ColumnArray ) || $ColumnArray = array( $ColumnArray ); 
      $this->ColumnArray = $ColumnArray; 
      $this->CreateString( ); 
      return; 
   } 
    
   /// The Column as a string to be used as a component 
   /// of a Query. 
   /// <dl class = "type"><dt><b>%Type:</b></dt> 
   /// <dd>string</dd></dl> 
   /// @private  
   private $String; 
    
   /// Turns the Column into a string and saves it into 
   /// Column::$String. 
   /// @public 
   public function CreateString( ) { 
      $this->String = ''; 
      if( isset( $this->ColumnArray[ 0 ] ) && $this->ColumnArray[ 0 ] == self::AllColumns ) 
         $this->String = '*'; 
      else 
         foreach( $this->ColumnArray as $Index => $Column ) 
            if( \is_numeric( $Index ) ) // Normal column 
               $this->String .= ( $this->String == '' ? '' : ', ' ) . ( \is_null( $this->Table ) ? '' : '`' . $this->Table->Name( ) . '`.' ) . '`' . $Column . '`'; 
            elseif( $Column == self::Ascending || $Column == self::Descending ) // With ASC or DESC 
               $this->String .= ( $this->String == '' ? '' : ', ' ) . ( \is_null( $this->Table ) ? '' : '`' . $this->Table->Name( ) . '`.' ) . '`' . $Index . '` ' . ( $Column == self::Ascending ? 'ASC' : 'DESC' ); 
            elseif( !\is_numeric( $Index ) && !\is_numeric( $Column ) ) // With alias 
               $this->String .= ( $this->String == '' ? '' : ', ' ) . ( \is_null( $this->Table ) ? '' : '`' . $this->Table->Name( ) . '`.' ) . '`' . $Index . '` AS `' . $Column . '`'; 
            else 
               throw new XyndravandriaDyverathException( 'Wrong parameters passed to Column::__construct( ). Maybe associative array?'  ); 
      return; 
   } 
 
   /// Returns Column::$String. 
   /// @public  
   /// @returns string 
   /// @note Required by the Component class. 
   public function __ToString( ) { 
      return $this->String; 
   } 
    
} 
?> 
 
 |