52 lines
1.7 KiB
Python
52 lines
1.7 KiB
Python
|
#!/usr/bin/env python
|
||
|
|
||
|
import six
|
||
|
|
||
|
from agate.exceptions import UnsupportedAggregationError
|
||
|
|
||
|
|
||
|
@six.python_2_unicode_compatible
|
||
|
class Aggregation(object): # pragma: no cover
|
||
|
"""
|
||
|
Aggregations create a new value by summarizing a :class:`.Column`.
|
||
|
|
||
|
Aggregations are applied with :meth:`.Table.aggregate` and
|
||
|
:meth:`.TableSet.aggregate`.
|
||
|
|
||
|
When creating a custom aggregation, ensure that the values returned by
|
||
|
:meth:`.Aggregation.run` are of the type specified by
|
||
|
:meth:`.Aggregation.get_aggregate_data_type`. This can be ensured by using
|
||
|
the :meth:`.DataType.cast` method. See :class:`.Summary` for an example.
|
||
|
"""
|
||
|
def __str__(self):
|
||
|
"""
|
||
|
String representation of this column. May be used as a column name in
|
||
|
generated tables.
|
||
|
"""
|
||
|
return self.__class__.__name__
|
||
|
|
||
|
def get_aggregate_data_type(self, table):
|
||
|
"""
|
||
|
Get the data type that should be used when using this aggregation with
|
||
|
a :class:`.TableSet` to produce a new column.
|
||
|
|
||
|
Should raise :class:`.UnsupportedAggregationError` if this column does
|
||
|
not support aggregation into a :class:`.TableSet`. (For example, if it
|
||
|
does not return a single value.)
|
||
|
"""
|
||
|
raise UnsupportedAggregationError()
|
||
|
|
||
|
def validate(self, table):
|
||
|
"""
|
||
|
Perform any checks necessary to verify this aggregation can run on the
|
||
|
provided table without errors. This is called by
|
||
|
:meth:`.Table.aggregate` before :meth:`run`.
|
||
|
"""
|
||
|
pass
|
||
|
|
||
|
def run(self, table):
|
||
|
"""
|
||
|
Execute this aggregation on a given column and return the result.
|
||
|
"""
|
||
|
raise NotImplementedError()
|