Example #1
0
    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
Example #4
0
    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)
Example #5
0
    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
        })
Example #6
0
 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)