Changeset 2428

Show
Ignore:
Timestamp:
04/17/2008 05:50:24 PM (8 months ago)
Author:
xue
Message:

patching

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/framework/Data/Common/Oracle/TOracleCommandBuilder.php

    r2206 r2428  
    11<?php 
     2 
    23/** 
    34 * TOracleCommandBuilder class file. 
     
    1112 */ 
    1213 
    13 Prado::using('System.Data.Common.TDbCommandBuilder'); 
     14Prado :: using('System.Data.Common.TDbCommandBuilder'); 
    1415 
    1516/** 
     
    2223 * @since 3.1 
    2324 */ 
    24 class TOracleCommandBuilder extends TDbCommandBuilder 
    25 { 
     25class TOracleCommandBuilder extends TDbCommandBuilder { 
    2626 
    2727        /** 
     
    3232         * @return string SQL search condition matching on a set of columns. 
    3333         */ 
    34         public function getSearchExpression($fields, $keywords) 
    35         { 
    36                 $columns = array(); 
    37                 foreach($fields as $field) 
    38                 { 
    39                         if($this->isSearchableColumn($this->getTableInfo()->getColumn($field))) 
     34        public function getSearchExpression($fields, $keywords) { 
     35                $columns = array (); 
     36                foreach ($fields as $field) { 
     37                        if ($this->isSearchableColumn($this->getTableInfo()->getColumn($field))) 
    4038                                $columns[] = $field; 
    4139                } 
    42                 return parent::getSearchExpression($columns, $keywords); 
     40                return parent :: getSearchExpression($columns, $keywords); 
    4341        } 
    4442        /** 
     
    4644         * @return boolean true if column can be used for LIKE searching. 
    4745         */ 
    48         protected function isSearchableColumn($column) 
    49         { 
     46        protected function isSearchableColumn($column) { 
    5047                $type = strtolower($column->getDbType()); 
    51                 return $type === 'character varying' || $type === 'varchar2' || 
    52                                 $type === 'character' || $type === 'char' || $type === 'text'; 
     48                return $type === 'character varying' || $type === 'varchar2' || $type === 'character' || $type === 'char' || $type === 'text'; 
    5349        } 
    5450 
     
    5955         * @return string search condition for all words in one column. 
    6056         */ 
    61          /* 
    62          * 
    63          *      how Oracle don't implements ILIKE, this method won't be overrided 
    64          * 
     57        /* 
     58        * 
     59        *       how Oracle don't implements ILIKE, this method won't be overrided 
     60        * 
    6561        protected function getSearchCondition($column, $words) 
    6662        { 
     
    7268        */ 
    7369 
    74  
    7570        /** 
    7671         * Overrides parent implementation to use Oracle way of get paginated RecordSet instead of using LIMIT sql clause. 
     
    8075         * @return string SQL with limit and offset in Oracle way. 
    8176         */ 
    82         public function applyLimitOffset($sql, $limit=-1, $offset=-1) 
    83         { 
    84                 if( (int)$limit <= 0 && (int)$offset <= 0 ) 
     77        public function applyLimitOffset($sql, $limit = -1, $offset = -1) { 
     78                if ((int) $limit <= 0 && (int) $offset <= 0) 
    8579                        return $sql; 
    86          
     80 
    8781                $pradoNUMLIN = 'pradoNUMLIN'; 
    8882                $fieldsALIAS = 'xyz'; 
    8983 
    90                 $nfimDaSQL      = strlen($sql); 
    91                 $nfimDoWhere = ( strpos($sql,'ORDER') !== false ? strpos($sql,'ORDER') : $nfimDaSQL ); 
    92                 $niniDoSelect= strpos($sql,'SELECT')+6; 
    93                 $nfimDoSelect= ( strpos($sql,'FROM') !== false ? strpos($sql,'FROM') : $nfimDaSQL ); 
     84                $nfimDaSQL = strlen($sql); 
     85                $nfimDoWhere = (strpos($sql, 'ORDER') !== false ? strpos($sql, 'ORDER') : $nfimDaSQL); 
     86                $niniDoSelect = strpos($sql, 'SELECT') + 6; 
     87                $nfimDoSelect = (strpos($sql, 'FROM') !== false ? strpos($sql, 'FROM') : $nfimDaSQL); 
    9488 
    95                 $sORDERBY        = ''; 
    96                 if( stripos($sql,'ORDER') !== false ) { 
    97                         $p = stripos($sql,'ORDER'); 
    98                         $sORDERBY = substr( $sql, $p+8, 10000 ); 
     89                $niniDoWhere = strpos($sql, 'WHERE') + 5; 
     90 
     91                $WhereConstraint = substr($sql, $niniDoWhere, $nfimDoWhere - $niniDoWhere); 
     92 
     93                $WhereInSubSelect = ""; 
     94                if (trim($WhereConstraint) !== "") { 
     95                        $WhereInSubSelect = "WHERE " . $WhereConstraint; 
    9996                } 
    10097 
    101                 $fields                 = substr( $sql, 0, $nfimDoSelect ); 
    102                 $fields                 = trim( substr( $fields, $niniDoSelect ) ); 
    103                 $aliasedFields  = ', '; 
     98                $sORDERBY = ''; 
     99                if (stripos($sql, 'ORDER') !== false) { 
     100                        $p = stripos($sql, 'ORDER'); 
     101                        $sORDERBY = substr($sql, $p +8, 10000); 
    104102 
    105                 if( trim($fields) == '*' ) { 
    106                         $aliasedFields  = ", {$fieldsALIAS}.{$fields}"; 
    107                         $fields                 = ''; 
    108                         $arr                    = $this->getTableInfo()->getColumns(); 
    109                         foreach( $arr as $field ) 
    110                         { 
    111                                 $fields .= strtolower( $field->getColumnName() ).', '; 
     103                } 
     104 
     105                $fields = substr($sql, 0, $nfimDoSelect); 
     106                $fields = trim(substr($fields, $niniDoSelect)); 
     107                $aliasedFields = ', '; 
     108 
     109                if (trim($fields) == '*') { 
     110                        $aliasedFields = ", {$fieldsALIAS}.{$fields}"; 
     111                        $fields = ''; 
     112                        $arr = $this->getTableInfo()->getColumns(); 
     113                        foreach ($arr as $field) { 
     114                                $fields .= strtolower($field->getColumnName()) . ', '; 
    112115                        } 
    113                         $fields = str_replace( '"', '', $fields ); 
     116                        $fields = str_replace('"', '', $fields); 
    114117                        $fields = trim($fields); 
    115                         $fields = substr( $fields, 0, strlen($fields)-1 ); 
     118                        $fields = substr($fields, 0, strlen($fields) - 1); 
    116119                } else { 
    117                         if( strpos( $fields, ',' ) !== false ) 
    118                         { 
    119                                 foreach( $arr as $field ) 
    120                                 { 
    121                                         $field = strtolower( $field ); 
    122                                         $existAS = str_ireplace( ' as ', '-as-', $field ); 
    123                                         if( strpos( $existAS, '-as-' ) === false ) 
    124                                                 $aliasedFields .= "{$fieldsALIAS}.".trim($field).", "; 
     120                        if (strpos($fields, ',') !== false) { 
     121                                $arr = $this->getTableInfo()->getColumns(); 
     122                                foreach ($arr as $field) { 
     123                                        $field = strtolower($field); 
     124                                        $existAS = str_ireplace(' as ', '-as-', $field); 
     125                                        if (strpos($existAS, '-as-') === false) 
     126                                                $aliasedFields .= "{$fieldsALIAS}." . trim($field) . ", "; 
    125127                                        else 
    126128                                                $aliasedFields .= "{$field}, "; 
    127129                                } 
    128130                                $aliasedFields = trim($aliasedFields); 
    129                                 $aliasedFields = substr( $aliasedFields, 0, strlen($aliasedFields)-1 ); 
     131                                $aliasedFields = substr($aliasedFields, 0, strlen($aliasedFields) - 1); 
    130132                        } 
    131133                } 
     134                if ($aliasedFields == ', ') 
     135                        $aliasedFields = " , $fieldsALIAS.* "; 
    132136 
    133137                /* ************************ 
     
    137141                                  " ($sql) {$fieldsALIAS} WHERE rownum <= {$limit} ". 
    138142                                  ") WHERE {$pradoNUMLIN} >= {$offset} "; 
    139  
     143                 
    140144                ************************* */ 
    141                 $toReg = $offset + $limit; 
     145                $toReg = $offset + $limit -1; 
    142146                $fullTableName = $this->getTableInfo()->getTableFullName(); 
    143                 if( empty($sORDERBY) ) 
    144                 { 
     147                if (empty ($sORDERBY)) { 
    145148                        $newSql = " SELECT $fields FROM " . 
    146                                           "(                                    " . 
    147                                           "             SELECT ROW_NUMBER() OVER ( ORDER BY ROWNUM ) as {$pradoNUMLIN} {$aliasedFields} " . 
    148                                           "             FROM {$fullTableName} {$fieldsALIAS}" . 
    149                                           ") nn                                 " . 
    150                                           " WHERE nn.{$pradoNUMLIN} >= {$offset} AND nn.{$pradoNUMLIN} <= {$toReg} " ; 
     149                        "(                                      " . 
     150                        "               SELECT ROW_NUMBER() OVER ( ORDER BY ROWNUM ) as {$pradoNUMLIN} {$aliasedFields} " . 
     151                        "               FROM {$fullTableName} {$fieldsALIAS}" . 
     152                        ") nn                                   " . 
     153                        " WHERE nn.{$pradoNUMLIN} >= {$offset} AND nn.{$pradoNUMLIN} <= {$toReg} "; 
    151154                } else { 
    152155                        $newSql = " SELECT $fields FROM " . 
    153                                           "(                                    " . 
    154                                           "             SELECT ROW_NUMBER() OVER ( ORDER BY {$sORDERBY} ) as {$pradoNUMLIN} {$aliasedFields} " . 
    155                                           "             FROM {$fullTableName} {$fieldsALIAS}" . 
    156                                           ") nn                                 " . 
    157                                           " WHERE nn.{$pradoNUMLIN} >= {$offset} AND nn.{$pradoNUMLIN} <= {$toReg} " ; 
     156                        "(                                      " . 
     157                        "               SELECT ROW_NUMBER() OVER ( ORDER BY {$sORDERBY} ) as {$pradoNUMLIN} {$aliasedFields} " . 
     158                        "               FROM {$fullTableName} {$fieldsALIAS} $WhereInSubSelect" . 
     159                        ") nn                                   " . 
     160                        " WHERE nn.{$pradoNUMLIN} >= {$offset} AND nn.{$pradoNUMLIN} <= {$toReg} "; 
    158161                } 
     162                //echo $newSql."\n<br>\n"; 
    159163                return $newSql; 
    160164        } 
    161165 
    162  
    163166} 
    164  
    165167?>