Merge "Adds the ability to sort images with multiple keys"

This commit is contained in:
Jenkins
2014-12-23 13:48:06 +00:00
committed by Gerrit Code Review
12 changed files with 268 additions and 58 deletions

View File

@@ -15,6 +15,7 @@
# under the License.
import copy
import datetime
import functools
import uuid
@@ -339,13 +340,29 @@ def _do_pagination(context, images, marker, limit, show_deleted,
def _sort_images(images, sort_key, sort_dir):
reverse = False
if images and not (sort_key in images[0]):
raise exception.InvalidSortKey()
keyfn = lambda x: (x[sort_key] if x[sort_key] is not None else '',
x['created_at'], x['id'])
reverse = sort_dir == 'desc'
images.sort(key=keyfn, reverse=reverse)
for key in ['created_at', 'id']:
if key not in sort_key:
sort_key.append(key)
for key in sort_key:
if images and not (key in images[0]):
raise exception.InvalidSortKey()
def sort_func(element):
keys = []
for key in sort_key:
if element[key] is not None:
keys.append(element[key])
else:
if key in ['created_at', 'updated_at', 'deleted_at']:
keys.append(datetime.datetime.min)
else:
keys.append('')
return tuple(keys)
images.sort(key=sort_func, reverse=reverse)
return images
@@ -377,7 +394,7 @@ def image_get(context, image_id, session=None, force_show_deleted=False):
@log_call
def image_get_all(context, filters=None, marker=None, limit=None,
sort_key='created_at', sort_dir='desc',
sort_key=['created_at'], sort_dir='desc',
member_status='accepted', is_public=None,
admin_as_user=False, return_tag=False):
filters = filters or {}
@@ -977,7 +994,6 @@ def _sort_tasks(tasks, sort_key, sort_dir):
x['created_at'], x['id'])
reverse = sort_dir == 'desc'
tasks.sort(key=keyfn, reverse=reverse)
return tasks