[Memcached_DataObject] Check if it is possible to sort efficiently

This commit is contained in:
Alexei Sorokin 2020-06-27 11:22:19 +03:00 committed by Diogo Peralta Cordeiro
parent 25f67a1ce9
commit ad6955e7ff

View File

@ -87,7 +87,7 @@ class Memcached_DataObject extends Safe_DataObject
} }
if ($skipNulls) { if ($skipNulls) {
foreach ($keyVals as $key=>$val) { foreach ($keyVals as $key => $val) {
if (is_null($val)) { if (is_null($val)) {
unset($keyVals[$key]); unset($keyVals[$key]);
} }
@ -97,11 +97,32 @@ class Memcached_DataObject extends Safe_DataObject
$obj->whereAddIn($keyCol, $keyVals, $colType); $obj->whereAddIn($keyCol, $keyVals, $colType);
// Since we're inputting straight to a query: format and escape // Since we're inputting straight to a query: format and escape
foreach ($keyVals as $key=>$val) { foreach ($keyVals as $key => $val) {
settype($val, $colType); settype($val, $colType);
$keyVals[$key] = $obj->escape($val); $keyVals[$key] = $obj->escape($val);
} }
// Check if values are ordered, makes sorting in SQL easier
$prev_val = reset($keyVals);
$order_asc = $order_desc = true;
foreach ($keyVals as $val) {
if ($val < $prev_val) {
$order_asc = false;
}
if ($val > $prev_val) {
$order_desc = false;
}
if ($order_asc === false && $order_desc === false) {
break;
}
$prev_val = $val;
}
if ($order_asc) {
$obj->orderBy($keyCol);
} elseif ($order_desc) {
$obj->orderBy("{$keyCol} DESC");
} else {
switch (common_config('db', 'type')) { switch (common_config('db', 'type')) {
case 'pgsql': case 'pgsql':
// "position" will make sure we keep the desired order // "position" will make sure we keep the desired order
@ -122,6 +143,7 @@ class Memcached_DataObject extends Safe_DataObject
default: default:
throw new ServerException('Unknown DB type selected.'); throw new ServerException('Unknown DB type selected.');
} }
}
$obj->find(); $obj->find();