execute designed query

This commit is contained in:
Jan Prochazka
2020-12-29 18:44:28 +01:00
parent 290acdb68a
commit 4962d81661
6 changed files with 59 additions and 26 deletions

View File

@@ -55,7 +55,7 @@ export class DesignerQueryDumper {
}); });
// cross join conditions in subcomponents // cross join conditions in subcomponents
for (const ref of this.designer.references) { for (const ref of this.designer.references || []) {
if (referenceIsCrossJoin(ref) && referenceIsConnecting(ref, component.tables, component.myAndParentTables)) { if (referenceIsCrossJoin(ref) && referenceIsConnecting(ref, component.tables, component.myAndParentTables)) {
select.where = mergeConditions(select.where, { select.where = mergeConditions(select.where, {
conditionType: 'and', conditionType: 'and',
@@ -70,9 +70,9 @@ export class DesignerQueryDumper {
} }
addConditions(select: Select, tables: DesignerTableInfo[]) { addConditions(select: Select, tables: DesignerTableInfo[]) {
for (const column of this.designer.columns) { for (const column of this.designer.columns || []) {
if (!column.filter) continue; if (!column.filter) continue;
const table = this.designer.tables.find((x) => x.designerId == column.designerId); const table = (this.designer.tables || []).find((x) => x.designerId == column.designerId);
if (!tables.find((x) => x.designerId == table.designerId)) continue; if (!tables.find((x) => x.designerId == table.designerId)) continue;
const condition = parseFilter(column.filter, findDesignerFilterType(column, this.designer)); const condition = parseFilter(column.filter, findDesignerFilterType(column, this.designer));
@@ -102,7 +102,7 @@ export class DesignerQueryDumper {
// top level cross join conditions // top level cross join conditions
const topLevelTables = this.topLevelTables; const topLevelTables = this.topLevelTables;
for (const ref of this.designer.references) { for (const ref of this.designer.references || []) {
if (referenceIsCrossJoin(ref) && referenceIsConnecting(ref, topLevelTables, topLevelTables)) { if (referenceIsCrossJoin(ref) && referenceIsConnecting(ref, topLevelTables, topLevelTables)) {
res.where = mergeConditions(res.where, { res.where = mergeConditions(res.where, {
conditionType: 'and', conditionType: 'and',
@@ -111,7 +111,7 @@ export class DesignerQueryDumper {
} }
} }
const topLevelColumns = this.designer.columns.filter((col) => const topLevelColumns = (this.designer.columns || []).filter((col) =>
topLevelTables.find((tbl) => tbl.designerId == col.designerId) topLevelTables.find((tbl) => tbl.designerId == col.designerId)
); );
const selectIsGrouped = !!topLevelColumns.find((x) => x.isGrouped || (x.aggregate && x.aggregate != '---')); const selectIsGrouped = !!topLevelColumns.find((x) => x.isGrouped || (x.aggregate && x.aggregate != '---'));

View File

@@ -0,0 +1,19 @@
import React from 'react';
import useHasPermission from '../utility/useHasPermission';
import ToolbarButton from '../widgets/ToolbarButton';
export default function QueryDesignToolbar({ execute, isDatabaseDefined, busy, save }) {
const hasPermission = useHasPermission();
return (
<>
<ToolbarButton disabled={!isDatabaseDefined || busy} onClick={execute} icon="icon run">
Execute
</ToolbarButton>
{hasPermission('files/query/write') && (
<ToolbarButton onClick={save} icon="icon save">
Save
</ToolbarButton>
)}
</>
);
}

View File

@@ -2,6 +2,6 @@ import React from 'react';
import styled from 'styled-components'; import styled from 'styled-components';
import Designer from './Designer'; import Designer from './Designer';
export default function QueryDesigner({ value, conid, database, engine, onChange, onKeyDown }) { export default function QueryDesigner({ value, conid, database, engine, onChange }) {
return <Designer value={value} onChange={onChange}></Designer>; return <Designer value={value} onChange={onChange}></Designer>;
} }

View File

@@ -27,7 +27,7 @@ export default function ResultTabs({ children, sessionId, executeNumber }) {
}, [sessionId, socket]); }, [sessionId, socket]);
return ( return (
<TabControl activePageIndex={resultInfos.length > 0 ? 1 : 0}> <TabControl activePageLabel={resultInfos.length > 0 ? 'Result 1' : null}>
{children} {children}
{_.sortBy(resultInfos, 'resultIndex').map((info) => ( {_.sortBy(resultInfos, 'resultIndex').map((info) => (
<TabPage label={`Result ${info.resultIndex + 1}`} key={info.jslid}> <TabPage label={`Result ${info.resultIndex + 1}`} key={info.jslid}>

View File

@@ -6,7 +6,7 @@ import axios from '../utility/axios';
import { useConnectionInfo } from '../utility/metadataLoaders'; import { useConnectionInfo } from '../utility/metadataLoaders';
import SqlEditor from '../sqleditor/SqlEditor'; import SqlEditor from '../sqleditor/SqlEditor';
import { useUpdateDatabaseForTab, useSetOpenedTabs } from '../utility/globalState'; import { useUpdateDatabaseForTab, useSetOpenedTabs } from '../utility/globalState';
import QueryToolbar from '../query/QueryToolbar'; import QueryDesignToolbar from '../designer/QueryDesignToolbar';
import SocketMessagesView from '../query/SocketMessagesView'; import SocketMessagesView from '../query/SocketMessagesView';
import { TabPage } from '../widgets/TabControl'; import { TabPage } from '../widgets/TabControl';
import ResultTabs from '../sqleditor/ResultTabs'; import ResultTabs from '../sqleditor/ResultTabs';
@@ -62,7 +62,7 @@ export default function QueryDesignTab({
const generatePreview = (value, engine) => { const generatePreview = (value, engine) => {
if (!engine || !value) return; if (!engine || !value) return;
const sql = generateDesignedQuery(value, engine); const sql = generateDesignedQuery(value, engine);
setSqlPreview(sql); setSqlPreview(sqlFormatter.format(sql));
}; };
React.useEffect(() => { React.useEffect(() => {
@@ -84,10 +84,9 @@ export default function QueryDesignTab({
useUpdateDatabaseForTab(tabVisible, conid, database); useUpdateDatabaseForTab(tabVisible, conid, database);
const handleExecute = async () => { const handleExecute = React.useCallback(async () => {
if (busy) return; if (busy) return;
setExecuteNumber((num) => num + 1); setExecuteNumber((num) => num + 1);
const selectedText = editorRef.current.editor.getSelectedText();
let sesid = sessionId; let sesid = sessionId;
if (!sesid) { if (!sesid) {
@@ -101,9 +100,9 @@ export default function QueryDesignTab({
setBusy(true); setBusy(true);
await axios.post('sessions/execute-query', { await axios.post('sessions/execute-query', {
sesid, sesid,
sql: selectedText || editorData, sql: sqlPreview,
}); });
}; }, [busy]);
const handleCancel = () => { const handleCancel = () => {
axios.post('sessions/cancel', { axios.post('sessions/cancel', {
@@ -119,12 +118,21 @@ export default function QueryDesignTab({
setBusy(false); setBusy(false);
}; };
const handleKeyDown = (data, hash, keyString, keyCode, event) => { const handleKeyDown = React.useCallback((e) => {
if (keyCode == keycodes.f5) { if (e.keyCode == keycodes.f5) {
event.preventDefault(); e.preventDefault();
handleExecute(); handleExecute();
} }
}, []);
React.useEffect(() => {
if (tabVisible) {
document.addEventListener('keydown', handleKeyDown, false);
return () => {
document.removeEventListener('keydown', handleKeyDown);
}; };
}
}, [tabVisible, handleKeyDown]);
if (isLoading) { if (isLoading) {
return ( return (
@@ -143,7 +151,6 @@ export default function QueryDesignTab({
database={database} database={database}
engine={connection && connection.engine} engine={connection && connection.engine}
onChange={setEditorData} onChange={setEditorData}
onKeyDown={handleKeyDown}
></QueryDesigner> ></QueryDesigner>
<ResultTabs sessionId={sessionId} executeNumber={executeNumber}> <ResultTabs sessionId={sessionId} executeNumber={executeNumber}>
<TabPage label="Columns" key="columns"> <TabPage label="Columns" key="columns">
@@ -162,22 +169,22 @@ export default function QueryDesignTab({
)} )}
</ResultTabs> </ResultTabs>
</VerticalSplitter> </VerticalSplitter>
{/* {toolbarPortalRef && {toolbarPortalRef &&
toolbarPortalRef.current && toolbarPortalRef.current &&
tabVisible && tabVisible &&
ReactDOM.createPortal( ReactDOM.createPortal(
<QueryToolbar <QueryDesignToolbar
isDatabaseDefined={conid && database} isDatabaseDefined={conid && database}
execute={handleExecute} execute={handleExecute}
busy={busy} busy={busy}
cancel={handleCancel} // cancel={handleCancel}
format={handleFormatCode} // format={handleFormatCode}
save={saveFileModalState.open} save={saveFileModalState.open}
isConnected={!!sessionId} // isConnected={!!sessionId}
kill={handleKill} // kill={handleKill}
/>, />,
toolbarPortalRef.current toolbarPortalRef.current
)} */} )}
<SaveTabModal <SaveTabModal
modalState={saveFileModalState} modalState={saveFileModalState}
tabVisible={tabVisible} tabVisible={tabVisible}

View File

@@ -62,7 +62,7 @@ export function TabPage({ key, label, children }) {
return children; return children;
} }
export function TabControl({ children, activePageIndex = undefined }) { export function TabControl({ children, activePageIndex = undefined, activePageLabel = undefined }) {
const [value, setValue] = React.useState(0); const [value, setValue] = React.useState(0);
// const [mountedTabs, setMountedTabs] = React.useState({}); // const [mountedTabs, setMountedTabs] = React.useState({});
@@ -73,6 +73,13 @@ export function TabControl({ children, activePageIndex = undefined }) {
if (activePageIndex != null) setValue(activePageIndex); if (activePageIndex != null) setValue(activePageIndex);
}, [activePageIndex]); }, [activePageIndex]);
React.useEffect(() => {
if (activePageLabel != null) {
const pageIndex = _.findIndex(childrenArray, (x) => x.props.label == activePageLabel);
if (pageIndex >= 0) setValue(pageIndex);
}
}, [activePageLabel]);
const theme = useTheme(); const theme = useTheme();
// // cleanup closed tabs // // cleanup closed tabs