mirror of
https://github.com/apache/superset.git
synced 2026-05-28 11:15:24 +00:00
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
This commit is contained in:
@@ -28,8 +28,7 @@ export default function buildQuery(formData: WordCloudFormData) {
|
||||
|
||||
if (sort_by_metric && metric) {
|
||||
orderby.push([metric, false]);
|
||||
}
|
||||
if (series) {
|
||||
} else if (series) {
|
||||
orderby.push([series, true]);
|
||||
}
|
||||
|
||||
|
||||
@@ -21,17 +21,52 @@ import { VizType } from '@superset-ui/core';
|
||||
import { WordCloudFormData } from '../src';
|
||||
import buildQuery from '../src/plugin/buildQuery';
|
||||
|
||||
describe('WordCloud buildQuery', () => {
|
||||
const formData: WordCloudFormData = {
|
||||
datasource: '5__table',
|
||||
granularity_sqla: 'ds',
|
||||
series: 'foo',
|
||||
viz_type: VizType.WordCloud,
|
||||
};
|
||||
const basicFormData: WordCloudFormData = {
|
||||
datasource: '5__table',
|
||||
granularity_sqla: 'ds',
|
||||
series: 'foo',
|
||||
viz_type: VizType.WordCloud,
|
||||
};
|
||||
|
||||
test('should build columns from series in form data', () => {
|
||||
const queryContext = buildQuery(formData);
|
||||
const [query] = queryContext.queries;
|
||||
expect(query.columns).toEqual(['foo']);
|
||||
describe('plugin-chart-word-cloud', () => {
|
||||
describe('buildQuery', () => {
|
||||
test('should build columns from series in form data', () => {
|
||||
const queryContext = buildQuery(basicFormData);
|
||||
const [query] = queryContext.queries;
|
||||
expect(query.columns).toEqual(['foo']);
|
||||
});
|
||||
|
||||
test('should order by series ASC when sort_by_metric is false', () => {
|
||||
const queryContext = buildQuery({
|
||||
...basicFormData,
|
||||
metric: 'count',
|
||||
sort_by_metric: false,
|
||||
row_limit: 100,
|
||||
});
|
||||
const [query] = queryContext.queries;
|
||||
expect(query.orderby).toEqual([['foo', true]]);
|
||||
});
|
||||
|
||||
test('should order by metric DESC only when sort_by_metric is true', () => {
|
||||
const queryContext = buildQuery({
|
||||
...basicFormData,
|
||||
metric: 'count',
|
||||
sort_by_metric: true,
|
||||
row_limit: 100,
|
||||
});
|
||||
const [query] = queryContext.queries;
|
||||
expect(query.orderby).toEqual([['count', false]]);
|
||||
});
|
||||
|
||||
test('should not include secondary series sort when sort_by_metric is true', () => {
|
||||
const queryContext = buildQuery({
|
||||
...basicFormData,
|
||||
metric: 'count',
|
||||
sort_by_metric: true,
|
||||
row_limit: 100,
|
||||
});
|
||||
const [query] = queryContext.queries;
|
||||
expect(query.orderby).toHaveLength(1);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user