another try - join with distinct from subquery

This commit is contained in:
collerek
2021-03-07 16:07:22 +01:00
parent b4350d11f1
commit c1eebf5096

View File

@ -171,12 +171,12 @@ 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(pk_aliased_name) qry_text = sqlalchemy.text(f"{pk_aliased_name} as limit_column")
maxes = dict() maxes = dict()
for order in 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:
maxes[order.get_field_name_text()] = sqlalchemy.text( aliased_col = order.get_field_name_text()
f"max({order.get_field_name_text()})") maxes[aliased_col] = sqlalchemy.text(aliased_col)
limit_qry = sqlalchemy.sql.select([qry_text]+list(maxes.values())) limit_qry = sqlalchemy.sql.select([qry_text]+list(maxes.values()))
limit_qry = limit_qry.select_from(self.select_from) limit_qry = limit_qry.select_from(self.select_from)
@ -186,14 +186,18 @@ class Query:
exclude=True).apply( exclude=True).apply(
limit_qry limit_qry
) )
limit_qry = limit_qry.group_by(qry_text) limit_qry = limit_qry.group_by(sqlalchemy.text(f"{pk_aliased_name}"))
limit_qry = OrderQuery(sorted_orders=self.sorted_orders).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 = limit_qry.alias("inner_limit_query")
limit_qry = OffsetQuery(query_offset=self.query_offset).apply(limit_qry) outer_text = sqlalchemy.text(f"distinct limit_column")
limit_qry = limit_qry.alias("limit_query") 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( on_clause = sqlalchemy.text(
f"limit_query.{pk_alias}={self.table.name}.{pk_alias}") f"limit_query.limit_column={self.table.name}.{pk_alias}")
return limit_qry, on_clause return outer_qry, on_clause
def _apply_expression_modifiers( def _apply_expression_modifiers(
self, expr: sqlalchemy.sql.select self, expr: sqlalchemy.sql.select