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)
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]}), )
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]}), )
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)