def __init__(self, group_strategy, timeseries_unit = 'day', date_filter_attributes=None): self.filterable_attributes = [DATE, CUSTOM_ATTRIBUTE, TRANSFER_ACCOUNT, USER] self.timeseries_unit = timeseries_unit self.date_filter_attributes = date_filter_attributes self.metrics = [] # Special case query-- this is just used to calculate grouped per_user if group_strategy: total_users_grouped_timeseries_query = db.session.query(func.count(User.id).label('volume'), func.date_trunc(self.timeseries_unit, self.date_filter_attributes[User]).label('date'), group_strategy.group_by_column).group_by(func.date_trunc(self.timeseries_unit, self.date_filter_attributes[User])) self.total_users_grouped_timeseries = metric.Metric( metric_name='total_population_grouped', query=group_strategy.build_query_group_by_with_join(total_users_grouped_timeseries_query, User), object_model=User, stock_filters=[], timeseries_caching_combinatory_strategy=metrics_cache.SUM_OBJECTS, caching_combinatory_strategy=metrics_cache.QUERY_ALL, filterable_by=self.filterable_attributes, query_actions=[ADD_MISSING_DAYS_TO_TODAY, ACCUMULATE_TIMESERIES]) # Special case query-- this is just used to calculate ungrouped per_user total_users_timeseries_query = db.session.query(func.count(User.id).label('volume'), func.date_trunc(self.timeseries_unit, self.date_filter_attributes[User]).label('date')).group_by(func.date_trunc(self.timeseries_unit, self.date_filter_attributes[User])) self.total_users_timeseries = metric.Metric( metric_name='total_population', query=total_users_timeseries_query, object_model=User, stock_filters=[], timeseries_caching_combinatory_strategy=metrics_cache.SUM_OBJECTS, caching_combinatory_strategy=metrics_cache.QUERY_ALL, filterable_by=self.filterable_attributes, query_actions=[ADD_MISSING_DAYS_TO_TODAY, ACCUMULATE_TIMESERIES])
def __init__(self, group_strategy, timeseries_unit = 'day', token=None, date_filter_attributes=None): self.filterable_attributes = [DATE, CUSTOM_ATTRIBUTE, TRANSFER_ACCOUNT, CREDIT_TRANSFER, USER] self.timeseries_unit = timeseries_unit self.date_filter_attributes = date_filter_attributes self.metrics = [] total_amount_query = db.session.query(func.sum(CreditTransfer.transfer_amount).label('total')) self.metrics.append(metric.Metric( metric_name='total_distributed', query=total_amount_query, object_model=CreditTransfer, stock_filters=[filters.disbursement_filters], caching_combinatory_strategy=metrics_cache.SUM, filterable_by=self.filterable_attributes, bypass_user_filters=True, )) self.metrics.append(metric.Metric( metric_name='total_reclaimed', query=total_amount_query, object_model=CreditTransfer, stock_filters=[filters.reclamation_filters], caching_combinatory_strategy=metrics_cache.SUM, filterable_by=self.filterable_attributes, bypass_user_filters=True, )) self.metrics.append(metric.Metric( metric_name='total_withdrawn', query=total_amount_query, object_model=CreditTransfer, stock_filters=[filters.withdrawal_filters], caching_combinatory_strategy=metrics_cache.SUM, filterable_by=self.filterable_attributes, bypass_user_filters=True, )) # Timeseries Metrics if group_strategy: transaction_volume_timeseries_query = group_strategy.build_query_group_by_with_join(db.session.query(func.sum(CreditTransfer.transfer_amount).label('volume'), func.date_trunc(self.timeseries_unit, self.date_filter_attributes[CreditTransfer]).label('date'), group_strategy.group_by_column).group_by(func.date_trunc(self.timeseries_unit, self.date_filter_attributes[CreditTransfer])), CreditTransfer) aggregated_transaction_volume_query = group_strategy.build_query_group_by_with_join(db.session.query(func.sum(CreditTransfer.transfer_amount).label('volume'), group_strategy.group_by_column), CreditTransfer) else: transaction_volume_timeseries_query = db.session.query(func.sum(CreditTransfer.transfer_amount).label('volume'), func.date_trunc(self.timeseries_unit, self.date_filter_attributes[CreditTransfer]).label('date')).group_by(func.date_trunc(self.timeseries_unit, self.date_filter_attributes[CreditTransfer])) aggregated_transaction_volume_query = None total_transaction_volume_query = db.session.query(func.sum(CreditTransfer.transfer_amount).label('volume')) self.metrics.append(metric.Metric( metric_name='all_payments_volume', is_timeseries=True, query=transaction_volume_timeseries_query, aggregated_query=aggregated_transaction_volume_query, total_query=total_transaction_volume_query, object_model=CreditTransfer, timeseries_caching_combinatory_strategy=metrics_cache.SUM_OBJECTS, caching_combinatory_strategy=metrics_cache.QUERY_ALL, filterable_by=self.filterable_attributes, query_actions=[FORMAT_TIMESERIES], aggregated_query_actions=[FORMAT_AGGREGATE_METRICS], total_query_actions=[GET_FIRST], value_type=CURRENCY, token=token )) self.metrics.append(metric.Metric( metric_name='transfer_amount_per_user', is_timeseries=True, query=transaction_volume_timeseries_query, aggregated_query=aggregated_transaction_volume_query, total_query=total_transaction_volume_query, object_model=CreditTransfer, stock_filters=[filters.standard_payment_filters], timeseries_caching_combinatory_strategy=metrics_cache.SUM_OBJECTS, caching_combinatory_strategy=metrics_cache.QUERY_ALL, filterable_by=self.filterable_attributes, query_actions=[CALCULATE_TIMESERIES_PER_USER, FORMAT_TIMESERIES], # Add per user aggregated_query_actions=[CALCULATE_AGGREGATE_PER_USER, FORMAT_AGGREGATE_METRICS], total_query_actions=[GET_FIRST, CALCULATE_TOTAL_PER_USER], value_type=CURRENCY, token=token )) if group_strategy: transaction_count_timeseries_query = group_strategy.build_query_group_by_with_join(db.session.query(func.count(CreditTransfer.id).label('volume'), func.date_trunc(self.timeseries_unit, self.date_filter_attributes[CreditTransfer]).label('date'), group_strategy.group_by_column).group_by(func.date_trunc(self.timeseries_unit, self.date_filter_attributes[CreditTransfer])), CreditTransfer) aggregated_transaction_count_query = group_strategy.build_query_group_by_with_join(db.session.query(func.count(CreditTransfer.id).label('volume'), group_strategy.group_by_column), CreditTransfer) else: transaction_count_timeseries_query = db.session.query(func.count(CreditTransfer.id).label('volume'), func.date_trunc(self.timeseries_unit, self.date_filter_attributes[CreditTransfer]).label('date')).group_by(func.date_trunc(self.timeseries_unit, self.date_filter_attributes[CreditTransfer])) aggregated_transaction_count_query = None total_transaction_count_query = db.session.query(func.count(CreditTransfer.id).label('volume')) self.metrics.append(metric.Metric( metric_name='daily_transaction_count', is_timeseries=True, query=transaction_count_timeseries_query, aggregated_query=aggregated_transaction_count_query, total_query=total_transaction_count_query, object_model=CreditTransfer, stock_filters=[filters.standard_payment_filters], timeseries_caching_combinatory_strategy=metrics_cache.SUM_OBJECTS, caching_combinatory_strategy=metrics_cache.QUERY_ALL, filterable_by=self.filterable_attributes, query_actions=[FORMAT_TIMESERIES], aggregated_query_actions=[FORMAT_AGGREGATE_METRICS], total_query_actions=[GET_FIRST], value_type=COUNT )) self.metrics.append(metric.Metric( metric_name='trades_per_user', is_timeseries=True, query=transaction_count_timeseries_query, aggregated_query=aggregated_transaction_count_query, total_query=total_transaction_count_query, object_model=CreditTransfer, stock_filters=[filters.standard_payment_filters], timeseries_caching_combinatory_strategy=metrics_cache.SUM_OBJECTS, caching_combinatory_strategy=metrics_cache.QUERY_ALL, filterable_by=self.filterable_attributes, query_actions=[CALCULATE_TIMESERIES_PER_USER, FORMAT_TIMESERIES], # Add per user aggregated_query_actions=[CALCULATE_AGGREGATE_PER_USER, FORMAT_AGGREGATE_METRICS], total_query_actions=[GET_FIRST, CALCULATE_TOTAL_PER_USER], value_type=COUNT_AVERAGE, )) if group_strategy: active_users_timeseries_query = group_strategy.build_query_group_by_with_join(db.session.query(func.count(func.distinct(CreditTransfer.sender_user_id)).label('volume'), func.date_trunc(self.timeseries_unit, self.date_filter_attributes[CreditTransfer]).label('date'), group_strategy.group_by_column).group_by(func.date_trunc(self.timeseries_unit, self.date_filter_attributes[CreditTransfer])), CreditTransfer) aggregated_active_users_query = group_strategy.build_query_group_by_with_join(db.session.query(func.count(func.distinct(CreditTransfer.sender_user_id)).label('volume'), group_strategy.group_by_column), CreditTransfer) else: active_users_timeseries_query = db.session.query(func.count(func.distinct(CreditTransfer.sender_user_id)).label('volume'), func.date_trunc(self.timeseries_unit, self.date_filter_attributes[CreditTransfer]).label('date')).group_by(func.date_trunc(self.timeseries_unit, self.date_filter_attributes[CreditTransfer])) aggregated_active_users_query = None total_transaction_volume_query = db.session.query(func.count(func.distinct(CreditTransfer.sender_user_id)).label('volume')) self.metrics.append(metric.Metric( metric_name='users_who_made_purchase', is_timeseries=True, query=active_users_timeseries_query, aggregated_query=aggregated_active_users_query, total_query=total_transaction_volume_query, object_model=CreditTransfer, #stock_filters=[filters.beneficiary_filters], # NOTE: Do we want this filter? stock_filters=[], timeseries_caching_combinatory_strategy=metrics_cache.SUM_OBJECTS, caching_combinatory_strategy=metrics_cache.QUERY_ALL, filterable_by=self.filterable_attributes, query_actions=[FORMAT_TIMESERIES], aggregated_query_actions=[FORMAT_AGGREGATE_METRICS], total_query_actions=[GET_FIRST], value_type=COUNT, ))
def __init__(self, group_strategy, timeseries_unit = 'day'): self.filterable_attributes = [DATE, CUSTOM_ATTRIBUTE, TRANSFER_ACCOUNT, USER] self.timeseries_unit = timeseries_unit self.metrics = [] total_beneficiaries_query = db.session.query(User) self.metrics.append(metric.Metric( metric_name='total_beneficiaries', query=total_beneficiaries_query, object_model=User, stock_filters=[filters.beneficiary_filters], caching_combinatory_strategy=metrics_cache.COUNT, filterable_by=self.filterable_attributes)) total_vendors_query = db.session.query(User) self.metrics.append(metric.Metric( metric_name='total_vendors', query=total_vendors_query, object_model=User, stock_filters=[filters.vendor_filters], caching_combinatory_strategy=metrics_cache.COUNT, filterable_by=self.filterable_attributes)) # Timeseries Metrics if group_strategy: users_created_timeseries_query = group_strategy.build_query_group_by_with_join(db.session.query(func.count(User.id).label('volume'), func.date_trunc(self.timeseries_unit, User.created).label('date'), group_strategy.group_by_column).group_by(func.date_trunc(self.timeseries_unit, User.created)), User) aggregated_users_created_query = group_strategy.build_query_group_by_with_join(db.session.query(func.count(User.id).label('volume'), group_strategy.group_by_column), User) else: users_created_timeseries_query = db.session.query(func.count(User.id).label('volume'), func.date_trunc(self.timeseries_unit, User.created).label('date')).group_by(func.date_trunc(self.timeseries_unit, User.created)) aggregated_users_created_query = None total_users_created_query = db.session.query(func.count(User.id).label('volume')) self.metrics.append(metric.Metric( metric_name='users_created', is_timeseries=True, query=users_created_timeseries_query, aggregated_query=aggregated_users_created_query, total_query=total_users_created_query, object_model=User, #stock_filters=[filters.beneficiary_filters], # NOTE: Do we still want this filter? stock_filters=[], caching_combinatory_strategy=metrics_cache.QUERY_ALL, filterable_by=self.filterable_attributes, query_actions=[FORMAT_TIMESERIES], aggregated_query_actions=[FORMAT_AGGREGATE_METRICS], total_query_actions=[GET_FIRST], )) if group_strategy: active_users_timeseries_query = group_strategy.build_query_group_by_with_join(db.session.query(func.count(func.distinct(CreditTransfer.sender_user_id)).label('volume'), func.date_trunc(self.timeseries_unit, CreditTransfer.created).label('date'), group_strategy.group_by_column).group_by(func.date_trunc(self.timeseries_unit, CreditTransfer.created)), CreditTransfer) aggregated_active_users_query = group_strategy.build_query_group_by_with_join(db.session.query(func.count(func.distinct(CreditTransfer.sender_user_id)).label('volume'), group_strategy.group_by_column), CreditTransfer) else: active_users_timeseries_query = db.session.query(func.count(func.distinct(CreditTransfer.sender_user_id)).label('volume'), func.date_trunc(self.timeseries_unit, CreditTransfer.created).label('date')).group_by(func.date_trunc(self.timeseries_unit, CreditTransfer.created)) aggregated_active_users_query = None total_active_users_query = db.session.query(func.count(func.distinct(CreditTransfer.sender_user_id)).label('volume')) self.metrics.append(metric.Metric( metric_name='active_users', is_timeseries=True, query=active_users_timeseries_query, aggregated_query=aggregated_active_users_query, total_query=total_active_users_query, object_model=CreditTransfer, #stock_filters=[filters.beneficiary_filters], # NOTE: Do we still want this filter? stock_filters=[], caching_combinatory_strategy=metrics_cache.QUERY_ALL, filterable_by=self.filterable_attributes, query_actions=[FORMAT_TIMESERIES], aggregated_query_actions=[FORMAT_AGGREGATE_METRICS], total_query_actions=[GET_FIRST], ))
def __init__(self, group_strategy, timeseries_unit='day', date_filter_attributes=None): self.filterable_attributes = [ DATE, CUSTOM_ATTRIBUTE, TRANSFER_ACCOUNT, USER ] self.timeseries_unit = timeseries_unit self.date_filter_attributes = date_filter_attributes self.metrics = [] # Timeseries Metrics if group_strategy: users_created_timeseries_query = group_strategy.build_query_group_by_with_join(db.session.query(func.count(User.id).label('volume'), func.date_trunc(self.timeseries_unit, self.date_filter_attributes[User]).label('date'), group_strategy.group_by_column)\ .group_by(func.date_trunc(self.timeseries_unit, self.date_filter_attributes[User])), User) aggregated_users_created_query = group_strategy\ .build_query_group_by_with_join(db.session.query(func.count(User.id).label('volume'), group_strategy.group_by_column), User) else: users_created_timeseries_query = db.session.query(func.count(User.id).label('volume'), func.date_trunc(self.timeseries_unit, self.date_filter_attributes[User]).label('date'))\ .group_by(func.date_trunc(self.timeseries_unit, self.date_filter_attributes[User])) aggregated_users_created_query = None total_users_created_query = db.session.query( func.count(User.id).label('volume')) self.metrics.append( metric.Metric( metric_name='users_created', is_timeseries=True, query=users_created_timeseries_query, aggregated_query=aggregated_users_created_query, total_query=total_users_created_query, object_model=User, #stock_filters=[filters.beneficiary_filters], # NOTE: Do we still want this filter? stock_filters=[], query_caching_combinatory_strategy=metrics_cache.SUM_OBJECTS, aggregated_query_caching_combinatory_strategy=metrics_cache. SUM_OBJECTS, total_query_caching_combinatory_strategy=metrics_cache.TALLY, filterable_by=self.filterable_attributes, query_actions=[FORMAT_TIMESERIES], aggregated_query_actions=[FORMAT_AGGREGATE_METRICS], total_query_actions=[GET_FIRST], )) if group_strategy: active_users_timeseries_query = group_strategy.build_query_group_by_with_join(db.session.query(func.count(func.distinct(CreditTransfer.sender_user_id)).label('volume'), func.date_trunc(self.timeseries_unit, self.date_filter_attributes[CreditTransfer]).label('date'), group_strategy.group_by_column)\ .group_by(func.date_trunc(self.timeseries_unit, self.date_filter_attributes[CreditTransfer])), CreditTransfer) aggregated_active_users_query = group_strategy.build_query_group_by_with_join( db.session.query( func.count(func.distinct( CreditTransfer.sender_user_id)).label('volume'), group_strategy.group_by_column), CreditTransfer) else: active_users_timeseries_query = db.session.query(func.count(func.distinct(CreditTransfer.sender_user_id)).label('volume'), func.date_trunc(self.timeseries_unit, self.date_filter_attributes[CreditTransfer]).label('date'))\ .group_by(func.date_trunc(self.timeseries_unit, self.date_filter_attributes[CreditTransfer])) aggregated_active_users_query = None total_active_users_query = db.session.query( func.count(func.distinct( CreditTransfer.sender_user_id)).label('volume')) self.metrics.append( metric.Metric( metric_name='active_users', is_timeseries=True, query=active_users_timeseries_query, aggregated_query=aggregated_active_users_query, total_query=total_active_users_query, object_model=CreditTransfer, #stock_filters=[filters.beneficiary_filters], # NOTE: Do we still want this filter? stock_filters=[], query_caching_combinatory_strategy=metrics_cache.SUM_OBJECTS, aggregated_query_caching_combinatory_strategy=metrics_cache. QUERY_ALL, total_query_caching_combinatory_strategy=metrics_cache. QUERY_ALL, filterable_by=self.filterable_attributes, query_actions=[FORMAT_TIMESERIES], aggregated_query_actions=[FORMAT_AGGREGATE_METRICS], total_query_actions=[GET_FIRST], )) if group_strategy: total_users_timeseries_query = group_strategy.build_query_group_by_with_join(db.session.query(func.count(User.id).label('volume'), func.date_trunc(self.timeseries_unit, self.date_filter_attributes[User]).label('date'), group_strategy.group_by_column)\ .group_by(func.date_trunc(self.timeseries_unit, self.date_filter_attributes[User])), User) else: total_users_timeseries_query = db.session.query(func.count(User.id).label('volume'), func.date_trunc(self.timeseries_unit, self.date_filter_attributes[User]).label('date'))\ .group_by(func.date_trunc(self.timeseries_unit, self.date_filter_attributes[User])) self.metrics.append( metric.Metric( metric_name='total_population_cumulative', is_timeseries=True, query=total_users_timeseries_query, total_query=total_users_created_query, aggregated_query=aggregated_active_users_query, object_model=User, stock_filters=[], query_caching_combinatory_strategy=metrics_cache.SUM_OBJECTS, aggregated_query_caching_combinatory_strategy=metrics_cache. SUM_OBJECTS, total_query_caching_combinatory_strategy=metrics_cache.TALLY, filterable_by=self.filterable_attributes, aggregated_query_actions=[FORMAT_AGGREGATE_METRICS], total_query_actions=[GET_FIRST], query_actions=[ ADD_MISSING_DAYS_TO_TODAY, ACCUMULATE_TIMESERIES, FORMAT_TIMESERIES ]))