Skip to content

Commit 2fd5203

Browse files
committed
Optimization to the sort implementation
The sort enum value is now a subclass of str that cat store the sort operator and be treated as string when creating the ast graph
1 parent b192e78 commit 2fd5203

File tree

3 files changed

+22
-13
lines changed

3 files changed

+22
-13
lines changed

examples/flask_sqlalchemy/schema.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ class Meta:
3434

3535
class Query(graphene.ObjectType):
3636
node = relay.Node.Field()
37-
all_employees = SQLAlchemyConnectionField(
38-
Employee, sort=graphene.Argument(SortEnumEmployee, default_value=['id', 'asc']))
37+
all_employees = SQLAlchemyConnectionField(Employee, sort=graphene.Argument(SortEnumEmployee,
38+
default_value=utils.EnumValue('id_asc', EmployeeModel.id.asc())))
3939
all_roles = SQLAlchemyConnectionField(Role, sort=utils.sort_argument_for_model(RoleModel))
4040
all_departments = SQLAlchemyConnectionField(Department)
4141

graphene_sqlalchemy/fields.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,10 @@ def model(self):
1919
def get_query(cls, model, info, sort=None, **args):
2020
query = get_query(model, info.context)
2121
if sort is not None:
22-
if isinstance(sort[0], str):
23-
sort = [sort]
24-
order = []
25-
for column_name, direction in sort:
26-
column = getattr(model, column_name)
27-
order.append(getattr(column, direction)())
28-
query = query.order_by(*order)
22+
if isinstance(sort, str):
23+
query = query.order_by(sort.order)
24+
else:
25+
query = query.order_by(*(value.order for value in sort))
2926
return query
3027

3128
@property

graphene_sqlalchemy/utils.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,28 @@ def _symbol_name(column_name, is_asc):
4242
return column_name + ('_asc' if is_asc else '_desc')
4343

4444

45+
class EnumValue(str):
46+
'''Subclass of str that stores a string value and the sort order of the column'''
47+
def __new__(cls, str_value, order):
48+
return super(EnumValue, cls).__new__(cls, str_value)
49+
50+
def __init__(self, str_value, order):
51+
super(EnumValue, self).__init__()
52+
self.order = order
53+
54+
4555
def _sort_enum_for_model(cls, name=None, symbol_name=_symbol_name):
4656
name = name or cls.__name__ + 'SortEnum'
4757
items = []
4858
default = []
4959
for column in inspect(cls).columns.values():
50-
asc = symbol_name(column.name, True), [column.name, 'asc']
51-
desc = symbol_name(column.name, False), [column.name, 'desc']
60+
asc_name = symbol_name(column.name, True)
61+
asc_value = EnumValue(asc_name, column.asc())
62+
desc_name = symbol_name(column.name, False)
63+
desc_value = EnumValue(desc_name, column.desc())
5264
if column.primary_key:
53-
default.append(asc[1])
54-
items.extend((asc, desc))
65+
default.append(asc_value)
66+
items.extend(((asc_name, asc_value), (desc_name, desc_value)))
5567
return Enum(name, items), default
5668

5769

0 commit comments

Comments
 (0)