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

capistrant 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 e499a52e51e minor: Show running Dart queries first. (#19237)
e499a52e51e is described below

commit e499a52e51e19c49397a137f85aa68dcef4c6662
Author: Gian Merlino <[email protected]>
AuthorDate: Thu Apr 2 06:54:59 2026 -0700

    minor: Show running Dart queries first. (#19237)
    
    This patch adjusts the ordering of current-dart-panel in the web console
    to match the current tasks panel: RUNNING is first, ACCEPTED is next,
    then all the completed states follow. Within each category, queries
    are sorted by timestamp, newest first: RUNNING and ACCEPTED by start
    time, and completed queries by finish time.
    
    This patch also renames the interface method "getRunningQueries" to
    "getQueries", because it can return completed queries too.
---
 .../msq/dart/controller/sql/DartSqlClient.java     |  4 ++--
 .../msq/dart/controller/sql/DartSqlClientImpl.java |  2 +-
 .../msq/dart/controller/sql/DartSqlEngine.java     |  5 ++---
 .../dart/controller/http/DartSqlResourceTest.java  |  8 +++----
 .../dart/controller/sql/DartSqlClientImplTest.java |  6 ++---
 .../apache/druid/sql/calcite/run/SqlEngine.java    |  2 +-
 .../druid/sql/calcite/schema/SystemSchema.java     |  2 +-
 .../org/apache/druid/sql/http/SqlResource.java     |  2 +-
 .../druid/sql/calcite/schema/SystemSchemaTest.java |  2 +-
 .../src/druid-models/dart/dart-query-entry.ts      | 26 ++++++++++++++++++++++
 .../current-dart-panel/current-dart-panel.tsx      |  9 ++++----
 11 files changed, 47 insertions(+), 21 deletions(-)

diff --git 
a/multi-stage-query/src/main/java/org/apache/druid/msq/dart/controller/sql/DartSqlClient.java
 
b/multi-stage-query/src/main/java/org/apache/druid/msq/dart/controller/sql/DartSqlClient.java
index e64fffa2b3a..a05dc95bb8a 100644
--- 
a/multi-stage-query/src/main/java/org/apache/druid/msq/dart/controller/sql/DartSqlClient.java
+++ 
b/multi-stage-query/src/main/java/org/apache/druid/msq/dart/controller/sql/DartSqlClient.java
@@ -32,7 +32,7 @@ import javax.servlet.http.HttpServletRequest;
 public interface DartSqlClient
 {
   /**
-   * Get information about all currently-running queries on this server.
+   * Get information about all currently-running, and possibly also 
recently-completed, queries on this server.
    *
    * @param selfOnly        true if only queries from this server should be 
returned; false if queries from all servers
    *                        should be returned
@@ -40,7 +40,7 @@ public interface DartSqlClient
    *
    * @see SqlResource#doGetRunningQueries(String, String, HttpServletRequest) 
the server side
    */
-  ListenableFuture<GetQueriesResponse> getRunningQueries(boolean selfOnly, 
boolean includeComplete);
+  ListenableFuture<GetQueriesResponse> getQueries(boolean selfOnly, boolean 
includeComplete);
 
   /**
    * Get query report for a particular SQL query ID on this server.
diff --git 
a/multi-stage-query/src/main/java/org/apache/druid/msq/dart/controller/sql/DartSqlClientImpl.java
 
b/multi-stage-query/src/main/java/org/apache/druid/msq/dart/controller/sql/DartSqlClientImpl.java
index b22fcef1312..438c00f832b 100644
--- 
a/multi-stage-query/src/main/java/org/apache/druid/msq/dart/controller/sql/DartSqlClientImpl.java
+++ 
b/multi-stage-query/src/main/java/org/apache/druid/msq/dart/controller/sql/DartSqlClientImpl.java
@@ -49,7 +49,7 @@ public class DartSqlClientImpl implements DartSqlClient
   }
 
   @Override
-  public ListenableFuture<GetQueriesResponse> getRunningQueries(final boolean 
selfOnly, final boolean includeComplete)
+  public ListenableFuture<GetQueriesResponse> getQueries(final boolean 
selfOnly, final boolean includeComplete)
   {
     try {
       URIBuilder builder = new URIBuilder("/queries");
diff --git 
a/multi-stage-query/src/main/java/org/apache/druid/msq/dart/controller/sql/DartSqlEngine.java
 
b/multi-stage-query/src/main/java/org/apache/druid/msq/dart/controller/sql/DartSqlEngine.java
index e3f44ae59f2..667a34a29f4 100644
--- 
a/multi-stage-query/src/main/java/org/apache/druid/msq/dart/controller/sql/DartSqlEngine.java
+++ 
b/multi-stage-query/src/main/java/org/apache/druid/msq/dart/controller/sql/DartSqlEngine.java
@@ -82,7 +82,6 @@ public class DartSqlEngine implements SqlEngine
 {
   public static final String NAME = "msq-dart";
   private static final Logger log = new Logger(DartSqlEngine.class);
-
   private final DartControllerContextFactory controllerContextFactory;
   private final DartControllerRegistry controllerRegistry;
   private final DartControllerConfig controllerConfig;
@@ -256,7 +255,7 @@ public class DartSqlEngine implements SqlEngine
   }
 
   @Override
-  public GetQueriesResponse getRunningQueries(
+  public GetQueriesResponse getQueries(
       boolean selfOnly,
       boolean includeComplete,
       AuthenticationResult authenticationResult,
@@ -276,7 +275,7 @@ public class DartSqlEngine implements SqlEngine
           Futures.successfulAsList(
               Iterables.transform(
                   sqlClients.getAllClients(),
-                  client -> client.getRunningQueries(true, includeComplete)
+                  client -> client.getQueries(true, includeComplete)
               )
           ),
           true
diff --git 
a/multi-stage-query/src/test/java/org/apache/druid/msq/dart/controller/http/DartSqlResourceTest.java
 
b/multi-stage-query/src/test/java/org/apache/druid/msq/dart/controller/http/DartSqlResourceTest.java
index 03ebec54087..97014d91714 100644
--- 
a/multi-stage-query/src/test/java/org/apache/druid/msq/dart/controller/http/DartSqlResourceTest.java
+++ 
b/multi-stage-query/src/test/java/org/apache/druid/msq/dart/controller/http/DartSqlResourceTest.java
@@ -384,7 +384,7 @@ public class DartSqlResourceTest extends MSQTestBase
         StandardQueryState.RUNNING,
         null
     );
-    Mockito.when(dartSqlClient.getRunningQueries(true, false))
+    Mockito.when(dartSqlClient.getQueries(true, false))
            .thenReturn(Futures.immediateFuture(new 
GetQueriesResponse(Collections.singletonList(remoteQueryInfo))));
 
     // With selfOnly = null, the endpoint returns both queries.
@@ -415,7 +415,7 @@ public class DartSqlResourceTest extends MSQTestBase
     final ControllerHolder localHolder = 
setUpMockRunningQuery(REGULAR_USER_NAME);
 
     // Remote call fails.
-    Mockito.when(dartSqlClient.getRunningQueries(true, false))
+    Mockito.when(dartSqlClient.getQueries(true, false))
            .thenReturn(Futures.immediateFailedFuture(new 
IOException("something went wrong")));
 
     // We only see local queries, because the remote call failed. (The entire 
call doesn't fail; we see what we
@@ -453,7 +453,7 @@ public class DartSqlResourceTest extends MSQTestBase
         StandardQueryState.RUNNING,
         null
     );
-    Mockito.when(dartSqlClient.getRunningQueries(true, false))
+    Mockito.when(dartSqlClient.getQueries(true, false))
            .thenReturn(Futures.immediateFuture(new 
GetQueriesResponse(Collections.singletonList(remoteQueryInfo))));
 
     // The endpoint returns only the query issued by REGULAR_USER_NAME.
@@ -491,7 +491,7 @@ public class DartSqlResourceTest extends MSQTestBase
         StandardQueryState.RUNNING,
         null
     );
-    Mockito.when(dartSqlClient.getRunningQueries(true, false))
+    Mockito.when(dartSqlClient.getQueries(true, false))
            .thenReturn(Futures.immediateFuture(new 
GetQueriesResponse(Collections.singletonList(remoteQueryInfo))));
 
     // The endpoint returns only the query issued by 
DIFFERENT_REGULAR_USER_NAME.
diff --git 
a/multi-stage-query/src/test/java/org/apache/druid/msq/dart/controller/sql/DartSqlClientImplTest.java
 
b/multi-stage-query/src/test/java/org/apache/druid/msq/dart/controller/sql/DartSqlClientImplTest.java
index 258dd370c6a..5fbda3623c4 100644
--- 
a/multi-stage-query/src/test/java/org/apache/druid/msq/dart/controller/sql/DartSqlClientImplTest.java
+++ 
b/multi-stage-query/src/test/java/org/apache/druid/msq/dart/controller/sql/DartSqlClientImplTest.java
@@ -87,7 +87,7 @@ public class DartSqlClientImplTest
         jsonMapper.writeValueAsBytes(getQueriesResponse)
     );
 
-    final ListenableFuture<GetQueriesResponse> result = 
dartSqlClient.getRunningQueries(false, false);
+    final ListenableFuture<GetQueriesResponse> result = 
dartSqlClient.getQueries(false, false);
     Assertions.assertEquals(getQueriesResponse, result.get());
   }
 
@@ -117,7 +117,7 @@ public class DartSqlClientImplTest
         jsonMapper.writeValueAsBytes(getQueriesResponse)
     );
 
-    final ListenableFuture<GetQueriesResponse> result = 
dartSqlClient.getRunningQueries(true, false);
+    final ListenableFuture<GetQueriesResponse> result = 
dartSqlClient.getQueries(true, false);
     Assertions.assertEquals(getQueriesResponse, result.get());
   }
 
@@ -147,7 +147,7 @@ public class DartSqlClientImplTest
         jsonMapper.writeValueAsBytes(getQueriesResponse)
     );
 
-    final ListenableFuture<GetQueriesResponse> result = 
dartSqlClient.getRunningQueries(false, true);
+    final ListenableFuture<GetQueriesResponse> result = 
dartSqlClient.getQueries(false, true);
     Assertions.assertEquals(getQueriesResponse, result.get());
   }
 }
diff --git a/sql/src/main/java/org/apache/druid/sql/calcite/run/SqlEngine.java 
b/sql/src/main/java/org/apache/druid/sql/calcite/run/SqlEngine.java
index f47328a21aa..b562536a522 100644
--- a/sql/src/main/java/org/apache/druid/sql/calcite/run/SqlEngine.java
+++ b/sql/src/main/java/org/apache/druid/sql/calcite/run/SqlEngine.java
@@ -144,7 +144,7 @@ public interface SqlEngine
    * @param stateReadAuthorization authorization for the STATE READ resource. 
If this is authorized, implementations
    *                               should allow all queries to be visible
    */
-  default GetQueriesResponse getRunningQueries(
+  default GetQueriesResponse getQueries(
       boolean selfOnly,
       boolean includeComplete,
       AuthenticationResult authenticationResult,
diff --git 
a/sql/src/main/java/org/apache/druid/sql/calcite/schema/SystemSchema.java 
b/sql/src/main/java/org/apache/druid/sql/calcite/schema/SystemSchema.java
index 15a54d16ff9..3d3d2a65791 100644
--- a/sql/src/main/java/org/apache/druid/sql/calcite/schema/SystemSchema.java
+++ b/sql/src/main/java/org/apache/druid/sql/calcite/schema/SystemSchema.java
@@ -1282,7 +1282,7 @@ public class SystemSchema extends AbstractSchema
       // Get queries from all engines
       final List<QueryInfo> allQueries = new ArrayList<>();
       for (final SqlEngine sqlEngine : 
sqlEngineRegistryProvider.get().getAllEngines()) {
-        final GetQueriesResponse response = sqlEngine.getRunningQueries(
+        final GetQueriesResponse response = sqlEngine.getQueries(
             false, // selfOnly false to get queries from all servers
             true, // includeComplete true to include all queries
             authenticationResult,
diff --git a/sql/src/main/java/org/apache/druid/sql/http/SqlResource.java 
b/sql/src/main/java/org/apache/druid/sql/http/SqlResource.java
index bac387f3d18..4ca78c2774a 100644
--- a/sql/src/main/java/org/apache/druid/sql/http/SqlResource.java
+++ b/sql/src/main/java/org/apache/druid/sql/http/SqlResource.java
@@ -168,7 +168,7 @@ public class SqlResource
     // Get running queries from all engines that support it.
     for (SqlEngine sqlEngine : engines) {
       queries.addAll(
-          sqlEngine.getRunningQueries(
+          sqlEngine.getQueries(
               selfOnly != null,
               includeComplete != null,
               authenticationResult,
diff --git 
a/sql/src/test/java/org/apache/druid/sql/calcite/schema/SystemSchemaTest.java 
b/sql/src/test/java/org/apache/druid/sql/calcite/schema/SystemSchemaTest.java
index 005191c8b8c..bb381b18718 100644
--- 
a/sql/src/test/java/org/apache/druid/sql/calcite/schema/SystemSchemaTest.java
+++ 
b/sql/src/test/java/org/apache/druid/sql/calcite/schema/SystemSchemaTest.java
@@ -1665,7 +1665,7 @@ public class SystemSchemaTest extends CalciteTestBase
     // Create mock SqlEngine that returns test queries
     final SqlEngine mockEngine = EasyMock.createMock(SqlEngine.class);
     EasyMock.expect(mockEngine.name()).andReturn("native").anyTimes();
-    EasyMock.expect(mockEngine.getRunningQueries(
+    EasyMock.expect(mockEngine.getQueries(
         EasyMock.eq(false),
         EasyMock.eq(true),
         EasyMock.anyObject(),
diff --git a/web-console/src/druid-models/dart/dart-query-entry.ts 
b/web-console/src/druid-models/dart/dart-query-entry.ts
index 0fe2ab0174b..491c74e1928 100644
--- a/web-console/src/druid-models/dart/dart-query-entry.ts
+++ b/web-console/src/druid-models/dart/dart-query-entry.ts
@@ -25,4 +25,30 @@ export interface DartQueryEntry {
   identity: string;
   startTime: string;
   state: 'ACCEPTED' | 'RUNNING' | 'CANCELED' | 'SUCCESS' | 'FAILED';
+  durationMs?: number;
+}
+
+const STATE_RANK: Record<string, number> = {
+  RUNNING: 2,
+  ACCEPTED: 1,
+};
+
+export function compareForDisplay(a: DartQueryEntry, b: DartQueryEntry): 
number {
+  const stateA = STATE_RANK[a.state] ?? 0;
+  const stateB = STATE_RANK[b.state] ?? 0;
+
+  // Primary: RUNNING > ACCEPTED > others
+  if (stateA !== stateB) {
+    return stateB - stateA;
+  }
+
+  if (stateA > 0) {
+    // RUNNING or ACCEPTED: descending startTime (newest first)
+    return b.startTime.localeCompare(a.startTime);
+  } else {
+    // Finished: descending finish time (startTime + durationMs)
+    const finishA = new Date(a.startTime).valueOf() + (a.durationMs ?? 0);
+    const finishB = new Date(b.startTime).valueOf() + (b.durationMs ?? 0);
+    return finishB - finishA;
+  }
 }
diff --git 
a/web-console/src/views/workbench-view/current-dart-panel/current-dart-panel.tsx
 
b/web-console/src/views/workbench-view/current-dart-panel/current-dart-panel.tsx
index b76ed7107bf..26b08ef0942 100644
--- 
a/web-console/src/views/workbench-view/current-dart-panel/current-dart-panel.tsx
+++ 
b/web-console/src/views/workbench-view/current-dart-panel/current-dart-panel.tsx
@@ -24,7 +24,7 @@ import React, { useState } from 'react';
 import { useStore } from 'zustand';
 
 import { Loader } from '../../../components';
-import type { DartQueryEntry } from '../../../druid-models';
+import { compareForDisplay, type DartQueryEntry } from '../../../druid-models';
 import { useClock, useInterval, useQueryManager } from '../../../hooks';
 import { Api, AppToaster } from '../../../singletons';
 import { formatDuration, prettyFormatIsoDate } from '../../../utils';
@@ -65,9 +65,10 @@ export const CurrentDartPanel = React.memo(function 
CurrentViberPanel(
   const [dartQueryEntriesState, queryManager] = useQueryManager<number, 
DartQueryEntry[]>({
     query: useStore(WORK_STATE_STORE, getMsqDartVersion),
     processQuery: async (_, signal) => {
-      return (
-        await Api.instance.get('/druid/v2/sql/queries?includeComplete', { 
signal })
-      ).data.queries.reverse() as DartQueryEntry[];
+      const queries = (await 
Api.instance.get('/druid/v2/sql/queries?includeComplete', { signal }))
+        .data.queries as DartQueryEntry[];
+      queries.sort(compareForDisplay);
+      return queries;
     },
   });
 


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

Reply via email to