try with min and max filters depending on direction
This commit is contained in:
@ -46,6 +46,13 @@ class OrderAction(QueryAction):
|
|||||||
prefix = f"{self.table_prefix}_" if self.table_prefix else ""
|
prefix = f"{self.table_prefix}_" if self.table_prefix else ""
|
||||||
return f"{prefix}{self.table}" f".{self.field_alias}"
|
return f"{prefix}{self.table}" f".{self.field_alias}"
|
||||||
|
|
||||||
|
def get_min_or_max(self):
|
||||||
|
prefix = f"{self.table_prefix}_" if self.table_prefix else ""
|
||||||
|
if self.direction == '':
|
||||||
|
return text(f"min({prefix}{self.table}" f".{self.field_alias})")
|
||||||
|
else:
|
||||||
|
return text(f"max({prefix}{self.table}" f".{self.field_alias}) desc")
|
||||||
|
|
||||||
def get_text_clause(self) -> sqlalchemy.sql.expression.TextClause:
|
def get_text_clause(self) -> sqlalchemy.sql.expression.TextClause:
|
||||||
"""
|
"""
|
||||||
Escapes characters if it's required.
|
Escapes characters if it's required.
|
||||||
|
|||||||
@ -171,32 +171,31 @@ class Query:
|
|||||||
"""
|
"""
|
||||||
pk_alias = self.model_cls.get_column_alias(self.model_cls.Meta.pkname)
|
pk_alias = self.model_cls.get_column_alias(self.model_cls.Meta.pkname)
|
||||||
pk_aliased_name = f"{self.table.name}.{pk_alias}"
|
pk_aliased_name = f"{self.table.name}.{pk_alias}"
|
||||||
qry_text = sqlalchemy.text(f"{pk_aliased_name} as limit_column")
|
qry_text = sqlalchemy.text(f"{pk_aliased_name}")
|
||||||
maxes = dict()
|
maxes = OrderedDict()
|
||||||
for ind, order in enumerate(list(self.sorted_orders.keys())):
|
for order in list(self.sorted_orders.keys()):
|
||||||
if order is not None and order.get_field_name_text() != pk_aliased_name:
|
if order is not None and order.get_field_name_text() != pk_aliased_name:
|
||||||
aliased_col = order.get_field_name_text()
|
aliased_col = order.get_field_name_text()
|
||||||
maxes[aliased_col] = sqlalchemy.text(f"{aliased_col} as col{ind}")
|
maxes[aliased_col] = order.get_min_or_max()
|
||||||
|
elif order.get_field_name_text() == pk_aliased_name:
|
||||||
|
maxes[pk_aliased_name] = order.get_text_clause()
|
||||||
|
|
||||||
limit_qry = sqlalchemy.sql.select([qry_text] + list(maxes.values()))
|
limit_qry = sqlalchemy.sql.select([qry_text])
|
||||||
limit_qry = limit_qry.select_from(self.select_from)
|
limit_qry = limit_qry.select_from(self.select_from)
|
||||||
limit_qry = self._apply_expression_modifiers(limit_qry)
|
|
||||||
limit_qry = FilterQuery(filter_clauses=self.filter_clauses).apply(limit_qry)
|
limit_qry = FilterQuery(filter_clauses=self.filter_clauses).apply(limit_qry)
|
||||||
limit_qry = FilterQuery(filter_clauses=self.exclude_clauses,
|
limit_qry = FilterQuery(filter_clauses=self.exclude_clauses,
|
||||||
exclude=True).apply(
|
exclude=True).apply(
|
||||||
limit_qry
|
limit_qry
|
||||||
)
|
)
|
||||||
limit_qry = OrderQuery(sorted_orders=self.sorted_orders).apply(limit_qry)
|
limit_qry = limit_qry.group_by(qry_text)
|
||||||
limit_qry = limit_qry.alias("inner_limit_query")
|
for order_by in maxes.values():
|
||||||
outer_text = sqlalchemy.text(f"distinct limit_column")
|
limit_qry = limit_qry.order_by(order_by)
|
||||||
outer_qry = sqlalchemy.sql.select([outer_text])
|
limit_qry = LimitQuery(limit_count=self.limit_count).apply(limit_qry)
|
||||||
outer_qry = outer_qry.select_from(limit_qry)
|
limit_qry = OffsetQuery(query_offset=self.query_offset).apply(limit_qry)
|
||||||
outer_qry = LimitQuery(limit_count=self.limit_count).apply(outer_qry)
|
limit_qry = limit_qry.alias("limit_query")
|
||||||
outer_qry = OffsetQuery(query_offset=self.query_offset).apply(outer_qry)
|
|
||||||
outer_qry = outer_qry.alias("limit_query")
|
|
||||||
on_clause = sqlalchemy.text(
|
on_clause = sqlalchemy.text(
|
||||||
f"limit_query.limit_column={self.table.name}.{pk_alias}")
|
f"limit_query.{pk_alias}={self.table.name}.{pk_alias}")
|
||||||
return outer_qry, on_clause
|
return limit_qry, on_clause
|
||||||
|
|
||||||
def _apply_expression_modifiers(
|
def _apply_expression_modifiers(
|
||||||
self, expr: sqlalchemy.sql.select
|
self, expr: sqlalchemy.sql.select
|
||||||
|
|||||||
Reference in New Issue
Block a user