Refactor aggregates
This commit is contained in:
@@ -404,7 +404,7 @@ class AggregatedAttribute(declared_attr):
|
|||||||
return desc.column
|
return desc.column
|
||||||
|
|
||||||
|
|
||||||
def get_aggregate_query(agg_expr, relationships):
|
def aggregate_select(agg_expr, relationships):
|
||||||
"""
|
"""
|
||||||
Return a subquery for fetching an aggregate value of given aggregate
|
Return a subquery for fetching an aggregate value of given aggregate
|
||||||
expression and given sequence of relationships.
|
expression and given sequence of relationships.
|
||||||
@@ -474,14 +474,7 @@ def local_condition(prop, objects):
|
|||||||
return column.in_(values)
|
return column.in_(values)
|
||||||
|
|
||||||
|
|
||||||
class AggregatedValue(object):
|
def aggregate_expression(expr, class_):
|
||||||
def __init__(self, class_, attr, relationships, expr):
|
|
||||||
self.class_ = class_
|
|
||||||
self.attr = attr
|
|
||||||
self.relationships = relationships
|
|
||||||
self.expr = self.aggregate_expression(expr, class_)
|
|
||||||
|
|
||||||
def aggregate_expression(self, expr, class_):
|
|
||||||
if isinstance(expr, sa.sql.visitors.Visitable):
|
if isinstance(expr, sa.sql.visitors.Visitable):
|
||||||
return expr
|
return expr
|
||||||
elif isinstance(expr, _FunctionGenerator):
|
elif isinstance(expr, _FunctionGenerator):
|
||||||
@@ -489,9 +482,17 @@ class AggregatedValue(object):
|
|||||||
else:
|
else:
|
||||||
return expr(class_)
|
return expr(class_)
|
||||||
|
|
||||||
|
|
||||||
|
class AggregatedValue(object):
|
||||||
|
def __init__(self, class_, attr, relationships, expr):
|
||||||
|
self.class_ = class_
|
||||||
|
self.attr = attr
|
||||||
|
self.relationships = relationships
|
||||||
|
self.expr = aggregate_expression(expr, class_)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def aggregate_query(self):
|
def aggregate_query(self):
|
||||||
query = get_aggregate_query(self.expr, self.relationships)
|
query = aggregate_select(self.expr, self.relationships)
|
||||||
|
|
||||||
return query.correlate(self.class_).as_scalar()
|
return query.correlate(self.class_).as_scalar()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user