From 9c463831304fd1e516a3dae875d766ede2f71126 Mon Sep 17 00:00:00 2001 From: collerek Date: Sun, 7 Mar 2021 16:53:38 +0100 Subject: [PATCH] another try --- ormar/queryset/query.py | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/ormar/queryset/query.py b/ormar/queryset/query.py index 755c5fc..8e7db64 100644 --- a/ormar/queryset/query.py +++ b/ormar/queryset/query.py @@ -172,26 +172,31 @@ class Query: pk_alias = self.model_cls.get_column_alias(self.model_cls.Meta.pkname) pk_aliased_name = f"{self.table.name}.{pk_alias}" qry_text = sqlalchemy.text(f"{pk_aliased_name} as limit_column") - # maxes = dict() - # for order in list(self.sorted_orders.keys()): - # if order is not None and order.get_field_name_text() != pk_aliased_name: - # aliased_col = order.get_field_name_text() - # maxes[aliased_col] = sqlalchemy.text(aliased_col) + maxes = dict() + for ind, order in enumerate(list(self.sorted_orders.keys())): + if order is not None and order.get_field_name_text() != pk_aliased_name: + aliased_col = order.get_field_name_text() + maxes[aliased_col] = sqlalchemy.text(f"{aliased_col} as col{ind}") - limit_qry = sqlalchemy.sql.select([qry_text]) + limit_qry = sqlalchemy.sql.select([qry_text] + list(maxes.values())) 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.exclude_clauses, - exclude=True).apply(limit_qry) - limit_qry = limit_qry.group_by(sqlalchemy.text(f"{pk_aliased_name}")) + exclude=True).apply( + limit_qry + ) limit_qry = OrderQuery(sorted_orders=self.sorted_orders).apply(limit_qry) - limit_qry = LimitQuery(limit_count=self.limit_count).apply(limit_qry) - limit_qry = OffsetQuery(query_offset=self.query_offset).apply(limit_qry) - limit_qry = limit_qry.alias("limit_query") + limit_qry = limit_qry.alias("inner_limit_query") + outer_text = sqlalchemy.text(f"distinct limit_column") + outer_qry = sqlalchemy.sql.select([outer_text]) + outer_qry = outer_qry.select_from(limit_qry) + outer_qry = LimitQuery(limit_count=self.limit_count).apply(outer_qry) + outer_qry = OffsetQuery(query_offset=self.query_offset).apply(outer_qry) + outer_qry = outer_qry.alias("limit_query") on_clause = sqlalchemy.text( f"limit_query.limit_column={self.table.name}.{pk_alias}") - return limit_qry, on_clause + return outer_qry, on_clause def _apply_expression_modifiers( self, expr: sqlalchemy.sql.select