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;
}