Source for file Where.php

Documentation is available at Where.php

  1. <?php
  2. /*
  3.  *  $Id: Where.php 2224 2007-08-13 21:23:56Z zYne $
  4.  *
  5.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  6.  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  7.  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  8.  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  9.  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  10.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  11.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  12.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  13.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  14.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  15.  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  16.  *
  17.  * This software consists of voluntary contributions made by many individuals
  18.  * and is licensed under the LGPL. For more information, see
  19.  * <http://www.phpdoctrine.com>.
  20.  */
  21. Doctrine::autoload('Doctrine_Query_Condition');
  22. /**
  23.  * Doctrine_Query_Where
  24.  *
  25.  * @package     Doctrine
  26.  * @license     http://www.opensource.org/licenses/lgpl-license.php LGPL
  27.  * @category    Object Relational Mapping
  28.  * @link        www.phpdoctrine.com
  29.  * @since       1.0
  30.  * @version     $Revision: 2224 $
  31.  * @author      Konsta Vesterinen <kvesteri@cc.hut.fi>
  32.  */
  33. {
  34.     public function load($where
  35.     {
  36.         $where Doctrine_Tokenizer::bracketTrim(trim($where));
  37.         $conn  $this->query->getConnection();
  38.         $terms Doctrine_Tokenizer::sqlExplode($where);  
  39.  
  40.         if (count($terms1{
  41.             if (substr($where06== 'EXISTS'{
  42.                 return $this->parseExists($wheretrue);
  43.             elseif (substr($where010== 'NOT EXISTS'{
  44.                 return $this->parseExists($wherefalse);
  45.             }
  46.         }
  47.  
  48.         if (count($terms3{
  49.             $terms Doctrine_Tokenizer::sqlExplode($wherearray('=''<''<>''>''!='));
  50.         }
  51.  
  52.         if (count($terms1{
  53.             $first array_shift($terms);
  54.             $value array_pop($terms);
  55.             $operator trim(substr($wherestrlen($first)-strlen($value)));
  56.             $table null;
  57.             $field null;
  58.  
  59.             if (strpos($first"'"=== false && strpos($first'('=== false{
  60.                 // normal field reference found
  61.                 $a explode('.'$first);
  62.         
  63.                 $field array_pop($a);
  64.                 $reference implode('.'$a);
  65.                 
  66.                 if (empty($reference)) {
  67.                     $map $this->query->getRootDeclaration();  
  68.                     
  69.                     $alias $this->query->getTableAlias($this->query->getRootAlias());
  70.                     $table $map['table'];                         
  71.                 else {
  72.                     $map $this->query->load($referencefalse);
  73.     
  74.                     $alias $this->query->getTableAlias($reference);
  75.                     $table $map['table'];
  76.                 }
  77.                 if ($this->query->getType(=== Doctrine_Query::SELECT{
  78.                     $first $conn->quoteIdentifier($alias)
  79.                            . '.'
  80.                            . $conn->quoteIdentifier($table->getColumnName($field));
  81.                 else {
  82.                     $first $conn->quoteIdentifier($table->getColumnName($field));
  83.                 }
  84.             else {
  85.                 $first $this->query->parseClause($first);
  86.             }
  87.             $sql $first ' ' $operator ' ' $this->parseValue($value$table$field);
  88.         
  89.             return $sql;  
  90.         else {
  91.  
  92.         }
  93.     }
  94.  
  95.     public function parseValue($valueDoctrine_Table $table null$field null)
  96.     {
  97.         if (substr($value01== '('{
  98.             // trim brackets
  99.             $trimmed   Doctrine_Tokenizer::bracketTrim($value);
  100.  
  101.             if (substr($trimmed04== 'FROM' ||
  102.                 substr($trimmed06== 'SELECT'{
  103.  
  104.                 // subquery found
  105.                 $q     new Doctrine_Query();
  106.                 $value '(' $q->isSubquery(true)->parseQuery($trimmed)->getQuery(')';
  107.  
  108.             elseif (substr($trimmed04== 'SQL:'{
  109.                 $value '(' substr($trimmed4')';
  110.             else {
  111.                 // simple in expression found
  112.                 $e Doctrine_Tokenizer::sqlExplode($trimmed',');
  113.  
  114.                 $value array();
  115.  
  116.                 $index false;
  117.  
  118.                 foreach ($e as $part{
  119.                     if (isset($table&& isset($field)) {
  120.                         $index $table->enumIndex($fieldtrim($part"'"));
  121.                     }
  122.  
  123.                     if ($index !== false{
  124.                         $value[$index;
  125.                     else {
  126.                         $value[$this->parseLiteralValue($part);
  127.                     }
  128.                 }
  129.                 $value '(' implode(', '$value')';
  130.             }
  131.         elseif(substr($value01== ':' || $value === '?'{
  132.             // placeholder found
  133.             if (isset($table&& isset($field&& $table->getTypeOf($field== 'enum'{
  134.                 $this->query->addEnumParam($value$table$field);
  135.             else {
  136.                 $this->query->addEnumParam($valuenullnull);
  137.             }
  138.         else {
  139.             $enumIndex false;
  140.             if (isset($table&& isset($field)) {
  141.                 // check if value is enumerated value
  142.                 $enumIndex $table->enumIndex($fieldtrim($value"'"));
  143.             }
  144.  
  145.             if ($enumIndex !== false{
  146.                 $value $enumIndex;
  147.             else {
  148.                 $value $this->parseLiteralValue($value);
  149.             }
  150.         }
  151.         return $value;
  152.     }
  153.     /**
  154.      * parses an EXISTS expression
  155.      *
  156.      * @param string $where         query where part to be parsed
  157.      * @param boolean $negation     whether or not to use the NOT keyword
  158.      * @return string 
  159.      */
  160.     public function parseExists($where$negation)
  161.     {
  162.         $operator ($negation'EXISTS' 'NOT EXISTS';
  163.  
  164.         $pos strpos($where'(');
  165.  
  166.         if ($pos == false{
  167.             throw new Doctrine_Query_Exception('Unknown expression, expected a subquery with () -marks');
  168.         }
  169.  
  170.         $sub Doctrine_Tokenizer::bracketTrim(substr($where$pos));
  171.  
  172.         return $operator ' (' $this->query->createSubquery()->parseQuery($subfalse)->getQuery(')';
  173.     }
  174. }