.. versionadded:: 1.1
+ .. versionchanged:: 1.2.13 - the ORDER BY argument may be multiple terms
+
.. seealso::
:class:`.array_agg`
__visit_name__ = 'aggregate_order_by'
- def __init__(self, target, order_by):
+ def __init__(self, target, *order_by):
self.target = elements._literal_as_binds(target)
- self.order_by = elements._literal_as_binds(order_by)
+
+ _lob = len(order_by)
+ if _lob == 0:
+ raise TypeError("at least one ORDER BY element is required")
+ elif _lob == 1:
+ self.order_by = elements._literal_as_binds(order_by[0])
+ else:
+ self.order_by = elements.ClauseList(
+ *order_by,
+ _literal_as_text=elements._literal_as_binds)
def self_group(self, against=None):
return self
"AS string_agg_1 FROM table1"
)
+ def test_aggregate_order_by_multi_col(self):
+ m = MetaData()
+ table = Table('table1', m, Column('a', Integer), Column('b', Integer))
+ expr = func.string_agg(
+ table.c.a,
+ aggregate_order_by(
+ literal_column("','"),
+ table.c.a, table.c.b.desc())
+ )
+ stmt = select([expr])
+
+ self.assert_compile(
+ stmt,
+ "SELECT string_agg(table1.a, "
+ "',' ORDER BY table1.a, table1.b DESC) "
+ "AS string_agg_1 FROM table1"
+ )
+
+ def test_aggregate_orcer_by_no_arg(self):
+ assert_raises_message(
+ TypeError,
+ "at least one ORDER BY element is required",
+ aggregate_order_by, literal_column("','")
+ )
+
def test_pg_array_agg_implicit_pg_array(self):
expr = pg_array_agg(column('data', Integer))