<?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 <maurodigirolamo@.web.de>. |
============================================================================================================================================|
Xyndravandria Dyverath
----------------------
Alpha 0.0.0
Xyndravandria is the name of a collection of projects designed and developed by Mauro Di Girolamo (maurodigirolamo@web.de); 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;
}
}
?>
|