Skip to content

Commit 573c520

Browse files
author
Brian Donovan
committed
fix(chart): word cloud secondary sort prevents Druid TopN optimization when sort_by_metric enabled
When sort_by_metric is true, buildQuery unconditionally appended a secondary ORDER BY series ASC alongside the metric sort. On Druid, any multi-column ORDER BY prevents the native TopN query optimization, forcing a full GroupBy scan that can cause dramatic slowdowns and timeouts on high-cardinality dimensions. Make the series sort mutually exclusive with sort_by_metric, and add test coverage for both sort behaviors. Fixes #39072
1 parent 5662eca commit 573c520

2 files changed

Lines changed: 47 additions & 13 deletions

File tree

superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/buildQuery.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@ export default function buildQuery(formData: WordCloudFormData) {
2828

2929
if (sort_by_metric && metric) {
3030
orderby.push([metric, false]);
31-
}
32-
if (series) {
31+
} else if (series) {
3332
orderby.push([series, true]);
3433
}
3534

superset-frontend/plugins/plugin-chart-word-cloud/test/buildQuery.test.ts

Lines changed: 46 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,52 @@ import { VizType } from '@superset-ui/core';
2121
import { WordCloudFormData } from '../src';
2222
import buildQuery from '../src/plugin/buildQuery';
2323

24-
describe('WordCloud buildQuery', () => {
25-
const formData: WordCloudFormData = {
26-
datasource: '5__table',
27-
granularity_sqla: 'ds',
28-
series: 'foo',
29-
viz_type: VizType.WordCloud,
30-
};
24+
const basicFormData: WordCloudFormData = {
25+
datasource: '5__table',
26+
granularity_sqla: 'ds',
27+
series: 'foo',
28+
viz_type: VizType.WordCloud,
29+
};
3130

32-
test('should build columns from series in form data', () => {
33-
const queryContext = buildQuery(formData);
34-
const [query] = queryContext.queries;
35-
expect(query.columns).toEqual(['foo']);
31+
describe('plugin-chart-word-cloud', () => {
32+
describe('buildQuery', () => {
33+
test('should build columns from series in form data', () => {
34+
const queryContext = buildQuery(basicFormData);
35+
const [query] = queryContext.queries;
36+
expect(query.columns).toEqual(['foo']);
37+
});
38+
39+
test('should order by series ASC when sort_by_metric is false', () => {
40+
const queryContext = buildQuery({
41+
...basicFormData,
42+
metric: 'count',
43+
sort_by_metric: false,
44+
row_limit: 100,
45+
});
46+
const [query] = queryContext.queries;
47+
expect(query.orderby).toEqual([['foo', true]]);
48+
});
49+
50+
test('should order by metric DESC only when sort_by_metric is true', () => {
51+
const queryContext = buildQuery({
52+
...basicFormData,
53+
metric: 'count',
54+
sort_by_metric: true,
55+
row_limit: 100,
56+
});
57+
const [query] = queryContext.queries;
58+
expect(query.orderby).toEqual([['count', false]]);
59+
});
60+
61+
test('should not include secondary series sort when sort_by_metric is true', () => {
62+
const queryContext = buildQuery({
63+
...basicFormData,
64+
metric: 'count',
65+
sort_by_metric: true,
66+
row_limit: 100,
67+
});
68+
const [query] = queryContext.queries;
69+
expect(query.orderby).toHaveLength(1);
70+
});
3671
});
3772
});

0 commit comments

Comments
 (0)