def persons(self, request: Request, **kwargs) -> Response: cohort: Cohort = self.get_object() team = self.team filter = Filter(request=request, team=self.team) is_csv_request = self.request.accepted_renderer.format == "csv" if is_csv_request: filter = filter.with_data({LIMIT: CSV_EXPORT_LIMIT, OFFSET: 0}) elif not filter.limit: filter = filter.with_data({LIMIT: 100}) query, params = PersonQuery(filter, team.pk, cohort=cohort).get_query() raw_result = sync_execute(query, params) actor_ids = [row[0] for row in raw_result] actors, serialized_actors = get_people(team.pk, actor_ids) _should_paginate = should_paginate(actors, filter.limit) next_url = format_query_params_absolute_url( request, filter.offset + filter.limit) if _should_paginate else None previous_url = (format_query_params_absolute_url( request, filter.offset - filter.limit) if filter.offset - filter.limit >= 0 else None) return Response({ "results": serialized_actors, "next": next_url, "previous": previous_url })
def __init__( self, filter: Filter, team: Team, feature_flag: FeatureFlag, experiment_start_date: datetime, experiment_end_date: Optional[datetime] = None, trend_class: Type[ClickhouseTrends] = ClickhouseTrends, ): breakdown_key = f"$feature/{feature_flag.key}" variants = [variant["key"] for variant in feature_flag.variants] query_filter = filter.with_data( { "display": TRENDS_CUMULATIVE, "date_from": experiment_start_date, "date_to": experiment_end_date, "breakdown": breakdown_key, "breakdown_type": "event", "properties": [{"key": breakdown_key, "value": variants, "operator": "exact", "type": "event"}], # :TRICKY: We don't use properties set on filters, instead using experiment variant options } ) exposure_filter = filter.with_data( { "date_from": experiment_start_date, "date_to": experiment_end_date, "display": TRENDS_CUMULATIVE, ACTIONS: [], EVENTS: [ { "id": "$feature_flag_called", "name": "$feature_flag_called", "order": 0, "type": "events", "math": "dau", } ], "breakdown_type": "event", "breakdown": "$feature_flag_response", "properties": [ {"key": "$feature_flag_response", "value": variants, "operator": "exact", "type": "event"}, {"key": "$feature_flag", "value": [feature_flag.key], "operator": "exact", "type": "event"}, ], } ) self.query_filter = query_filter self.exposure_filter = exposure_filter self.team = team self.insight = trend_class()
def __init__( self, filter: Filter, team: Team, feature_flag: FeatureFlag, experiment_start_date: datetime, experiment_end_date: Optional[datetime] = None, ): breakdown_key = f"$feature/{feature_flag.key}" variants = [variant["key"] for variant in feature_flag.variants] query_filter = filter.with_data( { "date_from": experiment_start_date, "date_to": experiment_end_date, "breakdown": breakdown_key, "breakdown_type": "event", "properties": [{"key": breakdown_key, "value": variants, "operator": "exact", "type": "event"}], # :TRICKY: We don't use properties set on filters, instead using experiment variant options } ) self.team = team if query_filter.insight == INSIGHT_TRENDS: query_filter = query_filter.with_data({"display": TRENDS_CUMULATIVE}) self.query_filter = query_filter
def __init__( self, filter: Filter, team: Team, feature_flag: FeatureFlag, experiment_start_date: datetime, experiment_end_date: Optional[datetime] = None, funnel_class: Type[ClickhouseFunnel] = ClickhouseFunnel, ): breakdown_key = f"$feature/{feature_flag.key}" variants = [variant["key"] for variant in feature_flag.variants] query_filter = filter.with_data({ "date_from": experiment_start_date, "date_to": experiment_end_date, "breakdown": breakdown_key, "breakdown_type": "event", "properties": [{ "key": breakdown_key, "value": variants, "operator": "exact", "type": "event" }], # :TRICKY: We don't use properties set on filters, instead using experiment variant options }) self.funnel = funnel_class(query_filter, team)
def persons(self, request: Request, **kwargs) -> Response: cohort: Cohort = self.get_object() team = self.team filter = Filter(request=request, team=self.team) if not filter.limit: filter = filter.with_data({LIMIT: 100}) raw_result = sync_execute( GET_STATIC_COHORTPEOPLE_BY_COHORT_ID if cohort.is_static else GET_COHORTPEOPLE_BY_COHORT_ID, { "team_id": team.pk, "cohort_id": cohort.pk, "limit": filter.limit, "offset": filter.offset }, ) actor_ids = [row[0] for row in raw_result] actors, serialized_actors = get_people(team.pk, actor_ids) _should_paginate = should_paginate(actors, filter.limit) next_url = format_query_params_absolute_url( request, filter.offset + filter.limit) if _should_paginate else None previous_url = (format_query_params_absolute_url( request, filter.offset - filter.limit) if filter.offset - filter.limit >= 0 else None) return Response({ "results": serialized_actors, "next": next_url, "previous": previous_url })
def __init__(self, filter: Filter, team: Team, base_uri: str = "/") -> None: # Filtering on persons / groups properties can be pushed down to funnel_actors CTE new_correlation_filter = filter.with_data( { "properties": filter.property_groups.combine_properties( PropertyOperatorType.AND, filter.correlation_property_values or [] ).to_dict() } ) self._funnel_correlation = FunnelCorrelation(new_correlation_filter, team, base_uri=base_uri) super().__init__(team, filter)