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]