allow segment table to sort on start and end when grouped (#15720)

This commit is contained in:
Vadim Ogievetsky 2024-01-26 02:59:23 -08:00 committed by GitHub
parent 4e50a14d50
commit 45ad47cc66
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 49 additions and 40 deletions

View File

@ -26,6 +26,10 @@
.rt-td.padded,
.rt-expandable {
padding: $table-cell-v-padding $table-cell-h-padding;
.default-aggregated {
padding: 0;
}
}
}

View File

@ -218,6 +218,7 @@ exports[`SegmentsView matches snapshot 1`] = `
"width": 100,
},
Object {
"Aggregated": [Function],
"Cell": [Function],
"Header": "Shard spec",
"accessor": "shard_spec",

View File

@ -56,6 +56,7 @@ import { Api } from '../../singletons';
import type { NumberLike } from '../../utils';
import {
compact,
countBy,
deepGet,
filterMap,
formatBytes,
@ -64,6 +65,7 @@ import {
isNumberLikeNaN,
LocalStorageBackedVisibility,
LocalStorageKeys,
oneOf,
queryDruidSql,
QueryManager,
QueryState,
@ -137,6 +139,11 @@ interface Sorted {
desc: boolean;
}
function sortedToOrderByClause(sorted: Sorted[]): string | undefined {
if (!sorted.length) return;
return 'ORDER BY ' + sorted.map(sort => `${C(sort.id)} ${sort.desc ? 'DESC' : 'ASC'}`).join(', ');
}
interface TableState {
page: number;
pageSize: number;
@ -315,9 +322,9 @@ END AS "time_span"`,
let queryParts: string[];
let whereClause = '';
let filterClause = '';
if (whereParts.length) {
whereClause = SqlExpression.and(...whereParts).toString();
filterClause = SqlExpression.and(...whereParts).toString();
}
let effectiveSorted = sorted;
@ -331,61 +338,45 @@ END AS "time_span"`,
]);
}
const base = SegmentsView.baseQuery(visibleColumns);
const orderByClause = sortedToOrderByClause(effectiveSorted);
if (groupByInterval) {
const innerQuery = compact([
`SELECT "start" || '/' || "end" AS "interval"`,
`SELECT "start", "end"`,
`FROM sys.segments`,
whereClause ? `WHERE ${whereClause}` : undefined,
`GROUP BY 1`,
filterClause ? `WHERE ${filterClause}` : undefined,
`GROUP BY 1, 2`,
sortedToOrderByClause(sorted.filter(sort => oneOf(sort.id, 'start', 'end'))) ||
`ORDER BY 1 DESC`,
`LIMIT ${pageSize}`,
page ? `OFFSET ${page * pageSize}` : undefined,
]).join('\n');
const intervals: string = (await queryDruidSql({ query: innerQuery }))
.map(row => `'${row.interval}'`)
.map(({ start, end }) => `'${start}/${end}'`)
.join(', ');
queryParts = compact([
SegmentsView.baseQuery(visibleColumns),
base,
`SELECT "start" || '/' || "end" AS "interval", *`,
`FROM s`,
`WHERE`,
intervals ? ` ("start" || '/' || "end") IN (${intervals})` : 'FALSE',
whereClause ? ` AND ${whereClause}` : '',
filterClause ? ` AND ${filterClause}` : '',
orderByClause,
`LIMIT ${pageSize * 1000}`,
]);
if (effectiveSorted.length) {
queryParts.push(
'ORDER BY ' +
effectiveSorted
.map(sort => `${C(sort.id)} ${sort.desc ? 'DESC' : 'ASC'}`)
.join(', '),
);
}
queryParts.push(`LIMIT ${pageSize * 1000}`);
} else {
queryParts = [SegmentsView.baseQuery(visibleColumns), `SELECT *`, `FROM s`];
if (whereClause) {
queryParts.push(`WHERE ${whereClause}`);
}
if (effectiveSorted.length) {
queryParts.push(
'ORDER BY ' +
effectiveSorted
.map(sort => `${C(sort.id)} ${sort.desc ? 'DESC' : 'ASC'}`)
.join(', '),
);
}
queryParts.push(`LIMIT ${pageSize}`);
if (page) {
queryParts.push(`OFFSET ${page * pageSize}`);
}
queryParts = compact([
base,
`SELECT *`,
`FROM s`,
filterClause ? `WHERE ${filterClause}` : undefined,
orderByClause,
`LIMIT ${pageSize}`,
page ? `OFFSET ${page * pageSize}` : undefined,
]);
}
const sqlQuery = queryParts.join('\n');
setIntermediateQuery(sqlQuery);
@ -762,6 +753,19 @@ END AS "time_span"`,
);
}
},
Aggregated: opt => {
const { subRows } = opt;
const previewValues = filterMap(subRows, row => row['shard_spec'].type);
const previewCount = countBy(previewValues);
return (
<div className="default-aggregated">
{Object.keys(previewCount)
.sort()
.map(v => `${v} (${previewCount[v]})`)
.join(', ')}
</div>
);
},
},
{
Header: 'Partition',