import itertools
from fireant.queries import (
DataSetQueryBuilder,
DimensionChoicesQueryBuilder,
DimensionLatestQueryBuilder,
)
class _Container(object):
"""
This is a list of slicer elements, metrics or dimensions, used for accessing an element by key with a dot syntax.
Example:
.. code-block:: python
slicer = Slicer(
dimensions=[
Dimension(key='my_dimension1')
]
)
slicer.dimensions.my_dimension1
"""
def __init__(self, items):
self._items = items
for item in items:
setattr(self, item.alias, item)
def __iter__(self):
return iter(self._items)
def __getitem__(self, item):
return getattr(self, item)
def __contains__(self, item):
return hasattr(self, item)
def __eq__(self, other):
"""
Checks if the other object is an instance of _Container and has the same number of items with matching keys.
"""
return isinstance(other, _Container) and \
all([a is not None
and b is not None
and a.alias == b.alias
for a, b in itertools.zip_longest(self._items, getattr(other, '_items', ()))])
[docs]class DataSet(object):
"""
WRITEME
"""
[docs] class Fields(_Container):
pass
def __init__(self, table, database, joins=(), fields=(), always_query_all_metrics=False):
"""
Constructor for a slicer. Contains all the fields to initialize the slicer.
:param table: (Required)
A pypika Table reference. The primary table that this slicer will retrieve data from.
:param database: (Required)
A Database reference. Holds the connection details used by this slicer to execute queries.
:param fields: (Required: At least one)
A list of fields mapping definitions of data in the data set. Fields are similar to a column in a database
query result set. They are the values
:param joins: (Optional)
A list of join descriptions for joining additional tables. Joined tables are only used when querying a
metric or dimension which requires it.
:param always_query_all_metrics: (Default: False)
When true, all metrics will be included in database queries in order to increase cache hits.
"""
self.table = table
self.database = database
self.joins = joins
self.fields = DataSet.Fields(fields)
# add query builder entry points
self.query = DataSetQueryBuilder(self)
self.latest = DimensionLatestQueryBuilder(self)
self.always_query_all_metrics = always_query_all_metrics
for field in fields:
if not field.definition.is_aggregate:
field.choices = DimensionChoicesQueryBuilder(self, field)
def __eq__(self, other):
return isinstance(other, DataSet) \
and self.fields == other.fields
def __repr__(self):
return 'Slicer(fields=[{}])' \
.format(','.join([repr(f)
for f in self.fields]))