示例#1
0
    def test_reference_filter_for_an_unselected_metric(self):
        reference_filter = ReferenceFilter(self.dataset.fields.unused_metric, ComparisonOperator.gt, 5)
        reference = DayOverDay(self.dataset.fields.timestamp, filters=[reference_filter])

        result_df = apply_reference_filters(self.df, reference)

        pd.testing.assert_frame_equal(result_df, self.df)
示例#2
0
    def test_reference_filter_with_not_equal_to(self):
        reference_filter = ReferenceFilter(self.dataset.fields.metric0, ComparisonOperator.ne, 5)
        reference = DayOverDay(self.dataset.fields.timestamp, filters=[reference_filter])

        result_df = apply_reference_filters(self.df, reference)

        pd.testing.assert_frame_equal(
            result_df.reset_index(drop=True),
            pd.DataFrame.from_dict({"$metric0": [1, 3, 4], "$metric0_dod": [1, 9, 12]}),
        )
示例#3
0
    def test_reference_filter_with_2_filters_combined(self):
        reference_filter_gt = ReferenceFilter(self.dataset.fields.metric0, ComparisonOperator.gt, 3)
        reference_filter_lt = ReferenceFilter(self.dataset.fields.metric0, ComparisonOperator.lt, 10)
        reference = DayOverDay(
            self.dataset.fields.timestamp,
            filters=[reference_filter_gt, reference_filter_lt],
        )

        result_df = apply_reference_filters(self.df, reference)

        pd.testing.assert_frame_equal(
            result_df.reset_index(drop=True),
            pd.DataFrame.from_dict({"$metric0": [2, 3], "$metric0_dod": [5, 9]}),
        )
示例#4
0
    def fetch(self, hint=None) -> Union[Iterable[Dict], Dict]:
        """
        Fetch the data for this query and transform it into the widgets.

        :param hint:
            A query hint label used with database vendors which support it. Adds a label comment to the query.
        :return:
            A list of dict (JSON) objects containing the widget configurations.
        """
        queries = add_hints(self.sql, hint)

        operations = find_operations_for_widgets(self._widgets)
        dimensions = self.dimensions

        share_dimensions = find_share_dimensions(dimensions, operations)

        annotation_frame = None
        if dimensions and self.dataset.annotation:
            alignment_dimension_alias = self.dataset.annotation.dataset_alignment_field_alias
            first_dimension = find_field_in_modified_field(dimensions[0])

            if first_dimension.alias == alignment_dimension_alias:
                annotation_frame = self.fetch_annotation()

        max_rows_returned, data_frame = fetch_data(
            self.dataset.database,
            queries,
            dimensions,
            share_dimensions,
            self.reference_groups,
        )

        # Apply reference filters
        for reference in self._references:
            data_frame = apply_reference_filters(data_frame, reference)

        # Apply operations
        for operation in operations:
            for reference in [None] + self._references:
                df_key = alias_selector(reference_alias(operation, reference))
                data_frame[df_key] = operation.apply(data_frame, reference)

        data_frame = scrub_totals_from_share_results(data_frame, dimensions)
        data_frame = special_cases.apply_operations_to_data_frame(operations, data_frame)

        data_frame = paginate(
            data_frame,
            self._widgets,
            orders=self.orders,
            limit=self._client_limit,
            offset=self._client_offset,
        )

        # Apply transformations
        widget_data = [
            widget.transform(
                data_frame,
                dimensions,
                self._references,
                annotation_frame,
            )
            for widget in self._widgets
        ]

        return self._transform_for_return(widget_data, max_rows_returned=max_rows_returned)