This is an automated email from the ASF dual-hosted git repository.
michaelsmolina pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/master by this push:
new 005e4e3ea8 chore: Implement additional SQL Lab core APIs (#36331)
005e4e3ea8 is described below
commit 005e4e3ea8a1838ce91fdc9cba2f8ed0247db6a7
Author: Michael S. Molina <[email protected]>
AuthorDate: Tue Dec 2 09:04:59 2025 -0500
chore: Implement additional SQL Lab core APIs (#36331)
---
superset-frontend/src/core/sqlLab/index.ts | 129 +++++++++++++++++++++++------
1 file changed, 102 insertions(+), 27 deletions(-)
diff --git a/superset-frontend/src/core/sqlLab/index.ts
b/superset-frontend/src/core/sqlLab/index.ts
index a3dc47fcb9..8fba694359 100644
--- a/superset-frontend/src/core/sqlLab/index.ts
+++ b/superset-frontend/src/core/sqlLab/index.ts
@@ -21,6 +21,11 @@ import {
QUERY_FAILED,
QUERY_SUCCESS,
QUERY_EDITOR_SETDB,
+ QUERY_EDITOR_SET_SCHEMA,
+ QUERY_EDITOR_SET_TITLE,
+ REMOVE_QUERY_EDITOR,
+ SET_ACTIVE_QUERY_EDITOR,
+ SET_ACTIVE_SOUTHPANE_TAB,
querySuccess,
startQuery,
START_QUERY,
@@ -31,7 +36,7 @@ import {
import { RootState, store } from 'src/views/store';
import { AnyListenerPredicate } from '@reduxjs/toolkit';
import type { SqlLabRootState } from 'src/SqlLab/types';
-import { Disposable } from '../models';
+import { Database, Disposable } from '../models';
import { createActionListener } from '../utils';
import {
Panel,
@@ -73,6 +78,23 @@ const createTab = (
return new Tab(id, name, editor, panels);
};
+const getTab = (id: string): Tab | undefined => {
+ const queryEditor = findQueryEditor(id);
+ if (queryEditor && queryEditor.dbId !== undefined) {
+ const { name, sql, dbId, catalog, schema } = queryEditor;
+ return createTab(
+ id,
+ name,
+ sql,
+ dbId,
+ catalog ?? undefined,
+ schema ?? undefined,
+ undefined,
+ );
+ }
+ return undefined;
+};
+
const notImplemented = (): never => {
throw new Error('Not implemented yet');
};
@@ -173,21 +195,21 @@ function createQueryErrorContext(
});
}
-const getCurrentTab: typeof sqlLabType.getCurrentTab = () => {
- const queryEditor = findQueryEditor(activeEditorId());
- if (queryEditor) {
- const { id, name, sql, dbId, catalog, schema } = queryEditor;
- return createTab(
- id,
- name,
- sql,
- dbId!,
- catalog ?? undefined,
- schema ?? undefined,
- undefined,
- );
- }
- return undefined;
+const getCurrentTab: typeof sqlLabType.getCurrentTab = () =>
+ getTab(activeEditorId());
+
+const getTabs: typeof sqlLabType.getTabs = () => {
+ const { queryEditors } = getSqlLabState();
+ return queryEditors
+ .map(qe => getTab(qe.id))
+ .filter((tab): tab is Tab => tab !== undefined);
+};
+
+const getDatabases: typeof sqlLabType.getDatabases = () => {
+ const { databases } = getSqlLabState();
+ return Object.values(databases).map(
+ db => new Database(db.id, db.database_name, [], []),
+ );
};
const getActiveEditorImmutableId = () => {
@@ -225,6 +247,12 @@ const predicate = (actionType: string):
AnyListenerPredicate<RootState> => {
};
};
+// Simple predicate for global events not tied to a specific tab
+const globalPredicate =
+ (actionType: string): AnyListenerPredicate<RootState> =>
+ action =>
+ action.type === actionType;
+
const onDidQueryRun: typeof sqlLabType.onDidQueryRun = (
listener: (queryContext: sqlLabType.QueryContext) => void,
thisArgs?: any,
@@ -285,24 +313,71 @@ const onDidChangeEditorDatabase: typeof
sqlLabType.onDidChangeEditorDatabase = (
thisArgs,
);
+const onDidCloseTab: typeof sqlLabType.onDidCloseTab = (
+ listener: (tab: sqlLabType.Tab) => void,
+ thisArgs?: any,
+): Disposable =>
+ createActionListener(
+ predicate(REMOVE_QUERY_EDITOR),
+ listener,
+ (action: { type: string; queryEditor: { id: string } }) =>
+ getTab(action.queryEditor.id)!,
+ thisArgs,
+ );
+
+const onDidChangeActiveTab: typeof sqlLabType.onDidChangeActiveTab = (
+ listener: (tab: sqlLabType.Tab) => void,
+ thisArgs?: any,
+): Disposable =>
+ createActionListener(
+ predicate(SET_ACTIVE_QUERY_EDITOR),
+ listener,
+ (action: { type: string; queryEditor: { id: string } }) =>
+ getTab(action.queryEditor.id)!,
+ thisArgs,
+ );
+
+const onDidChangeEditorSchema: typeof sqlLabType.onDidChangeEditorSchema = (
+ listener: (schema: string) => void,
+ thisArgs?: any,
+): Disposable =>
+ createActionListener(
+ predicate(QUERY_EDITOR_SET_SCHEMA),
+ listener,
+ (action: { type: string; schema: string }) => action.schema,
+ thisArgs,
+ );
+
+const onDidChangeActivePanel: typeof sqlLabType.onDidChangeActivePanel = (
+ listener: (panel: sqlLabType.Panel) => void,
+ thisArgs?: any,
+): Disposable =>
+ createActionListener(
+ globalPredicate(SET_ACTIVE_SOUTHPANE_TAB),
+ listener,
+ (action: { type: string; tabId: string }) => new Panel(action.tabId),
+ thisArgs,
+ );
+
+const onDidChangeTabTitle: typeof sqlLabType.onDidChangeTabTitle = (
+ listener: (title: string) => void,
+ thisArgs?: any,
+): Disposable =>
+ createActionListener(
+ predicate(QUERY_EDITOR_SET_TITLE),
+ listener,
+ (action: { type: string; name: string }) => action.name,
+ thisArgs,
+ );
+
+// Not implemented yet
const onDidChangeEditorContent: typeof sqlLabType.onDidChangeEditorContent =
notImplemented;
const onDidChangeEditorCatalog: typeof sqlLabType.onDidChangeEditorCatalog =
notImplemented;
-const onDidChangeEditorSchema: typeof sqlLabType.onDidChangeEditorSchema =
- notImplemented;
const onDidChangeEditorTable: typeof sqlLabType.onDidChangeEditorTable =
notImplemented;
const onDidClosePanel: typeof sqlLabType.onDidClosePanel = notImplemented;
-const onDidChangeActivePanel: typeof sqlLabType.onDidChangeActivePanel =
- notImplemented;
-const onDidChangeTabTitle: typeof sqlLabType.onDidChangeTabTitle =
- notImplemented;
-const getDatabases: typeof sqlLabType.getDatabases = notImplemented;
-const getTabs: typeof sqlLabType.getTabs = notImplemented;
-const onDidCloseTab: typeof sqlLabType.onDidCloseTab = notImplemented;
-const onDidChangeActiveTab: typeof sqlLabType.onDidChangeActiveTab =
- notImplemented;
const onDidRefreshDatabases: typeof sqlLabType.onDidRefreshDatabases =
notImplemented;
const onDidRefreshCatalogs: typeof sqlLabType.onDidRefreshCatalogs =