[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
parent 1db6943702
commit edc7159ef6

View File

@ -102,6 +102,27 @@ class Memcached_DataObject extends Safe_DataObject
$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();