QueryCombination.class.php

Go to the documentation of this file.
00001 <?php
00002 /****************************************************************************
00003  *   Copyright (C) 2004-2008 by Konstantin V. Arkhipov, Anton E. Lebedevich *
00004  *                                                                          *
00005  *   This program is free software; you can redistribute it and/or modify   *
00006  *   it under the terms of the GNU Lesser General Public License as         *
00007  *   published by the Free Software Foundation; either version 3 of the     *
00008  *   License, or (at your option) any later version.                        *
00009  *                                                                          *
00010  ****************************************************************************/
00011 
00015     final class QueryCombination
00016         extends QueryIdentification
00017         implements DialectString
00018     {
00019         private $left   = null;
00020         private $right  = null;
00021         private $logic  = null;
00022         
00023         private $limit  = null;
00024         private $offset = null;
00025         
00026         private $order  = null;
00027         
00028         public function __construct(
00029             Query $left,
00030             Query $right,
00031             $logic
00032         )
00033         {
00034             $this->left     = $left;
00035             $this->right    = $right;
00036             $this->logic    = $logic;
00037             $this->order    = new OrderChain();
00038         }
00039         
00040         public function __clone()
00041         {
00042             $this->left = clone $this->left;
00043             $this->right = clone $this->right;
00044             $this->order = clone $this->order;
00045         }
00046         
00047         public function getLimit()
00048         {
00049             return $this->limit;
00050         }
00051         
00052         public function getOffset()
00053         {
00054             return $this->offset;
00055         }
00056         
00061         public function limit($limit = null, $offset = null)
00062         {
00063             if ($limit !== null)
00064                 Assert::isPositiveInteger($limit, 'invalid limit specified');
00065             
00066             if ($offset !== null)
00067                 Assert::isInteger($offset, 'invalid offset specified');
00068             
00069             $this->limit = $limit;
00070             $this->offset = $offset;
00071             
00072             return $this;
00073         }
00074         
00078         public function dropOrder()
00079         {
00080             $this->order = new OrderChain();
00081             
00082             return $this;
00083         }
00084         
00088         public function setOrderChain(OrderChain $chain)
00089         {
00090             $this->order = $chain;
00091             
00092             return $this;
00093         }
00094         
00098         public function orderBy($field)
00099         {
00100             $this->order->add($field);
00101             
00102             return $this;
00103         }
00104         
00105         public function toDialectString(Dialect $dialect)
00106         {
00107             $query =
00108                 $this->left->toDialectString($dialect)
00109                 ." {$this->logic} "
00110                 .$this->right->toDialectString($dialect);
00111             
00112             if ($this->order->getCount()) {
00113                 $query .= ' ORDER BY '.$this->order->toDialectString($dialect);
00114             }
00115             
00116             if ($this->limit)
00117                 $query .= ' LIMIT '.$this->limit;
00118             
00119             if ($this->offset)
00120                 $query .= ' OFFSET '.$this->offset;
00121             
00122             return $query;
00123         }
00124     }
00125 ?>