| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- /**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
- import { QueryMode, TimeGranularity, VizType } from '@superset-ui/core';
- import buildQuery from '../src/buildQuery';
- import { TableChartFormData } from '../src/types';
- const basicFormData: TableChartFormData = {
- viz_type: VizType.Table,
- datasource: '11__table',
- };
- const extraQueryFormData: TableChartFormData = {
- ...basicFormData,
- time_grain_sqla: TimeGranularity.MONTH,
- groupby: ['col1'],
- query_mode: QueryMode.Aggregate,
- show_totals: true,
- metrics: ['aaa', 'aaa'],
- adhoc_filters: [
- {
- expressionType: 'SQL',
- sqlExpression: "status IN ('In Process')",
- clause: 'WHERE',
- subject: null,
- operator: null,
- comparator: null,
- isExtra: false,
- isNew: false,
- datasourceWarning: false,
- filterOptionName: 'filter_v8m9t9oq5re_ndzk6g5am7',
- } as any,
- ],
- };
- describe('plugin-chart-table', () => {
- describe('buildQuery', () => {
- it('should add post-processing and ignore duplicate metrics', () => {
- const query = buildQuery({
- ...basicFormData,
- query_mode: QueryMode.Aggregate,
- metrics: ['aaa', 'aaa'],
- percent_metrics: ['bbb', 'bbb'],
- }).queries[0];
- expect(query.metrics).toEqual(['aaa', 'bbb']);
- expect(query.post_processing).toEqual([
- {
- operation: 'contribution',
- options: {
- columns: ['bbb'],
- rename_columns: ['%bbb'],
- },
- },
- ]);
- });
- it('should not add metrics in raw records mode', () => {
- const query = buildQuery({
- ...basicFormData,
- query_mode: QueryMode.Raw,
- columns: ['a'],
- metrics: ['aaa', 'aaa'],
- percent_metrics: ['bbb', 'bbb'],
- }).queries[0];
- expect(query.metrics).toBeUndefined();
- expect(query.post_processing).toEqual([]);
- });
- it('should not add post-processing when there is no percent metric', () => {
- const query = buildQuery({
- ...basicFormData,
- query_mode: QueryMode.Aggregate,
- metrics: ['aaa'],
- percent_metrics: [],
- }).queries[0];
- expect(query.metrics).toEqual(['aaa']);
- expect(query.post_processing).toEqual([]);
- });
- it('should not add post-processing in raw records mode', () => {
- const query = buildQuery({
- ...basicFormData,
- query_mode: QueryMode.Raw,
- metrics: ['aaa'],
- columns: ['rawcol'],
- percent_metrics: ['ccc'],
- }).queries[0];
- expect(query.metrics).toBeUndefined();
- expect(query.columns).toEqual(['rawcol']);
- expect(query.post_processing).toEqual([]);
- });
- it('should prefer extra_form_data.time_grain_sqla over formData.time_grain_sqla', () => {
- const query = buildQuery({
- ...basicFormData,
- groupby: ['col1'],
- query_mode: QueryMode.Aggregate,
- time_grain_sqla: TimeGranularity.MONTH,
- extra_form_data: { time_grain_sqla: TimeGranularity.QUARTER },
- temporal_columns_lookup: { col1: true },
- }).queries[0];
- expect(query.columns?.[0]).toEqual({
- timeGrain: TimeGranularity.QUARTER,
- columnType: 'BASE_AXIS',
- sqlExpression: 'col1',
- label: 'col1',
- expressionType: 'SQL',
- });
- });
- it('should fallback to formData.time_grain_sqla if extra_form_data.time_grain_sqla is not set', () => {
- const query = buildQuery({
- ...basicFormData,
- time_grain_sqla: TimeGranularity.MONTH,
- groupby: ['col1'],
- query_mode: QueryMode.Aggregate,
- temporal_columns_lookup: { col1: true },
- }).queries[0];
- expect(query.columns?.[0]).toEqual({
- timeGrain: TimeGranularity.MONTH,
- columnType: 'BASE_AXIS',
- sqlExpression: 'col1',
- label: 'col1',
- expressionType: 'SQL',
- });
- });
- it('should include time_grain_sqla in extras if temporal colum is used and keep the rest', () => {
- const { queries } = buildQuery({
- ...extraQueryFormData,
- temporal_columns_lookup: { col1: true },
- });
- // Extras in regular query
- expect(queries[0].extras?.time_grain_sqla).toEqual(TimeGranularity.MONTH);
- expect(queries[0].extras?.where).toEqual("(status IN ('In Process'))");
- // Extras in summary query
- expect(queries[1].extras?.time_grain_sqla).toEqual(TimeGranularity.MONTH);
- expect(queries[1].extras?.where).toEqual("(status IN ('In Process'))");
- });
- describe('Percent Metric Calculation Modes', () => {
- const baseFormDataWithPercents: TableChartFormData = {
- ...basicFormData,
- query_mode: QueryMode.Aggregate,
- metrics: ['count'],
- percent_metrics: ['sum_sales'],
- groupby: ['category'],
- };
- it('should default to row_limit mode with single query', () => {
- const { queries } = buildQuery(baseFormDataWithPercents);
- expect(queries).toHaveLength(1);
- expect(queries[0].metrics).toEqual(['count', 'sum_sales']);
- expect(queries[0].post_processing).toEqual([
- {
- operation: 'contribution',
- options: {
- columns: ['sum_sales'],
- rename_columns: ['%sum_sales'],
- },
- },
- ]);
- });
- it('should create extra query in all_records mode', () => {
- const formData = {
- ...baseFormDataWithPercents,
- percent_metric_calculation: 'all_records',
- };
- const { queries } = buildQuery(formData);
- expect(queries).toHaveLength(2);
- expect(queries[0].post_processing).toEqual([
- {
- operation: 'contribution',
- options: {
- columns: ['sum_sales'],
- rename_columns: ['%sum_sales'],
- },
- },
- ]);
- expect(queries[1]).toMatchObject({
- columns: [],
- metrics: ['sum_sales'],
- post_processing: [],
- row_limit: 0,
- row_offset: 0,
- orderby: [],
- is_timeseries: false,
- });
- });
- it('should work with show_totals in all_records mode', () => {
- const formData = {
- ...baseFormDataWithPercents,
- percent_metric_calculation: 'all_records',
- show_totals: true,
- };
- const { queries } = buildQuery(formData);
- expect(queries).toHaveLength(3);
- expect(queries[1].metrics).toEqual(['sum_sales']);
- expect(queries[2].metrics).toEqual(['count', 'sum_sales']);
- });
- it('should handle empty percent_metrics in all_records mode', () => {
- const formData = {
- ...basicFormData,
- query_mode: QueryMode.Aggregate,
- metrics: ['count'],
- percent_metrics: [],
- percent_metric_calculation: 'all_records',
- groupby: ['category'],
- };
- const { queries } = buildQuery(formData);
- expect(queries).toHaveLength(1);
- expect(queries[0].post_processing).toEqual([]);
- });
- });
- });
- });
|