Prado\Data\Common\Oracle\TOracleCommandBuilder::applyLimitOffset PHP Метод

applyLimitOffset() публичный Метод

Overrides parent implementation to use Oracle way of get paginated RecordSet instead of using LIMIT sql clause.
public applyLimitOffset ( $sql, $limit, $offset ) : string
Результат string SQL with limit and offset in Oracle way.
    public function applyLimitOffset($sql, $limit = -1, $offset = -1)
    {
        if ((int) $limit <= 0 && (int) $offset <= 0) {
            return $sql;
        }
        $pradoNUMLIN = 'pradoNUMLIN';
        $fieldsALIAS = 'xyz';
        $nfimDaSQL = strlen($sql);
        $nfimDoWhere = strpos($sql, 'ORDER') !== false ? strpos($sql, 'ORDER') : $nfimDaSQL;
        $niniDoSelect = strpos($sql, 'SELECT') + 6;
        $nfimDoSelect = strpos($sql, 'FROM') !== false ? strpos($sql, 'FROM') : $nfimDaSQL;
        $WhereInSubSelect = "";
        if (strpos($sql, 'WHERE') !== false) {
            $WhereInSubSelect = "WHERE " . substr($sql, strpos($sql, 'WHERE') + 5, $nfimDoWhere - $niniDoWhere);
        }
        $sORDERBY = '';
        if (stripos($sql, 'ORDER') !== false) {
            $p = stripos($sql, 'ORDER');
            $sORDERBY = substr($sql, $p + 8);
        }
        $fields = substr($sql, 0, $nfimDoSelect);
        $fields = trim(substr($fields, $niniDoSelect));
        $aliasedFields = ', ';
        if (trim($fields) == '*') {
            $aliasedFields = ", {$fieldsALIAS}.{$fields}";
            $fields = '';
            $arr = $this->getTableInfo()->getColumns();
            foreach ($arr as $field) {
                $fields .= strtolower($field->getColumnName()) . ', ';
            }
            $fields = str_replace('"', '', $fields);
            $fields = trim($fields);
            $fields = substr($fields, 0, strlen($fields) - 1);
        } else {
            if (strpos($fields, ',') !== false) {
                $arr = $this->getTableInfo()->getColumns();
                foreach ($arr as $field) {
                    $field = strtolower($field);
                    $existAS = str_ireplace(' as ', '-as-', $field);
                    if (strpos($existAS, '-as-') === false) {
                        $aliasedFields .= "{$fieldsALIAS}." . trim($field) . ", ";
                    } else {
                        $aliasedFields .= "{$field}, ";
                    }
                }
                $aliasedFields = trim($aliasedFields);
                $aliasedFields = substr($aliasedFields, 0, strlen($aliasedFields) - 1);
            }
        }
        if ($aliasedFields == ', ') {
            $aliasedFields = " , {$fieldsALIAS}.* ";
        }
        /* ************************
        		$newSql = " SELECT $fields FROM ".
        				  "(					".
        				  "		SELECT rownum as {$pradoNUMLIN} {$aliasedFields} FROM ".
        				  " ($sql) {$fieldsALIAS} WHERE rownum <= {$limit} ".
        				  ") WHERE {$pradoNUMLIN} >= {$offset} ";
        
        		************************* */
        $offset = (int) $offset;
        $toReg = $offset + $limit;
        $fullTableName = $this->getTableInfo()->getTableFullName();
        if (empty($sORDERBY)) {
            $sORDERBY = "ROWNUM";
        }
        $newSql = " SELECT {$fields} FROM " . "(\t\t\t\t\t" . "\t\tSELECT ROW_NUMBER() OVER ( ORDER BY {$sORDERBY} ) -1 as {$pradoNUMLIN} {$aliasedFields} " . "\t\tFROM {$fullTableName} {$fieldsALIAS} {$WhereInSubSelect}" . ") nn\t\t\t\t\t" . " WHERE nn.{$pradoNUMLIN} >= {$offset} AND nn.{$pradoNUMLIN} < {$toReg} ";
        //echo $newSql."\n<br>\n";
        return $newSql;
    }