This is an automated email from the ASF dual-hosted git repository.

asdf2014 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git


The following commit(s) were added to refs/heads/master by this push:
     new 45ad47cc666 allow segment table to sort on start and end when grouped 
(#15720)
45ad47cc666 is described below

commit 45ad47cc6669af5a00259bd0c32119e3bd3f6829
Author: Vadim Ogievetsky <[email protected]>
AuthorDate: Fri Jan 26 02:59:23 2024 -0800

    allow segment table to sort on start and end when grouped (#15720)
---
 web-console/src/react-table/react-table-extra.scss |  4 ++
 .../__snapshots__/segments-view.spec.tsx.snap      |  1 +
 .../src/views/segments-view/segments-view.tsx      | 84 +++++++++++-----------
 3 files changed, 49 insertions(+), 40 deletions(-)

diff --git a/web-console/src/react-table/react-table-extra.scss 
b/web-console/src/react-table/react-table-extra.scss
index bdeecf5e964..e1c65d5143f 100644
--- a/web-console/src/react-table/react-table-extra.scss
+++ b/web-console/src/react-table/react-table-extra.scss
@@ -26,6 +26,10 @@
     .rt-td.padded,
     .rt-expandable {
       padding: $table-cell-v-padding $table-cell-h-padding;
+
+      .default-aggregated {
+        padding: 0;
+      }
     }
   }
 
diff --git 
a/web-console/src/views/segments-view/__snapshots__/segments-view.spec.tsx.snap 
b/web-console/src/views/segments-view/__snapshots__/segments-view.spec.tsx.snap
index aa62a576f54..66884a5d651 100755
--- 
a/web-console/src/views/segments-view/__snapshots__/segments-view.spec.tsx.snap
+++ 
b/web-console/src/views/segments-view/__snapshots__/segments-view.spec.tsx.snap
@@ -218,6 +218,7 @@ exports[`SegmentsView matches snapshot 1`] = `
             "width": 100,
           },
           Object {
+            "Aggregated": [Function],
             "Cell": [Function],
             "Header": "Shard spec",
             "accessor": "shard_spec",
diff --git a/web-console/src/views/segments-view/segments-view.tsx 
b/web-console/src/views/segments-view/segments-view.tsx
index 36dd94e4263..ae40a8d641e 100644
--- a/web-console/src/views/segments-view/segments-view.tsx
+++ b/web-console/src/views/segments-view/segments-view.tsx
@@ -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`,
-              `ORDER BY 1 DESC`,
+              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',


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to