diff --git a/packages/datalib/src/GridDisplay.ts b/packages/datalib/src/GridDisplay.ts index 1bd4f1685..00b971861 100644 --- a/packages/datalib/src/GridDisplay.ts +++ b/packages/datalib/src/GridDisplay.ts @@ -381,13 +381,13 @@ export abstract class GridDisplay { }; } - createSelect(): Select { + createSelect(options = {}): Select { return null; } - processReferences(select: Select, displayedColumnInfo: DisplayedColumnInfo) {} + processReferences(select: Select, displayedColumnInfo: DisplayedColumnInfo, options) {} - createSelectBase(name: NamedObjectInfo, columns: ColumnInfo[]) { + createSelectBase(name: NamedObjectInfo, columns: ColumnInfo[], options) { if (!columns) return null; const orderColumnName = columns[0].columnName; const select: Select = { @@ -411,7 +411,7 @@ export abstract class GridDisplay { this.columns.map((col) => ({ ...col, sourceAlias: 'basetbl' })), 'uniqueName' ); - this.processReferences(select, displayedColumnInfo); + this.processReferences(select, displayedColumnInfo, options); this.applyFilterOnSelect(select, displayedColumnInfo); this.applyGroupOnSelect(select, displayedColumnInfo); this.applySortOnSelect(select, displayedColumnInfo); @@ -427,6 +427,13 @@ export abstract class GridDisplay { return sql; } + getExportQuery() { + const select = this.createSelect({ isExport: true }); + if (!select) return null; + const sql = treeToSql(this.driver, select, dumpSqlSelect); + return sql; + } + resizeColumn(uniqueName: string, computedSize: number, diff: number) { this.setConfig((cfg) => { const columnWidths = { diff --git a/packages/datalib/src/TableGridDisplay.ts b/packages/datalib/src/TableGridDisplay.ts index 15b600c81..85dfc7a27 100644 --- a/packages/datalib/src/TableGridDisplay.ts +++ b/packages/datalib/src/TableGridDisplay.ts @@ -162,14 +162,16 @@ export class TableGridDisplay extends GridDisplay { return this.findTable({ schemaName, pureName }); } - processReferences(select: Select, displayedColumnInfo: DisplayedColumnInfo) { + processReferences(select: Select, displayedColumnInfo: DisplayedColumnInfo, options) { this.addJoinsFromExpandedColumns(select, this.columns, 'basetbl', displayedColumnInfo); - this.addHintsToSelect(select); + if (!options.isExport) { + this.addHintsToSelect(select); + } } - createSelect() { + createSelect(options = {}) { if (!this.table) return null; - const select = this.createSelectBase(this.table, this.table.columns); + const select = this.createSelectBase(this.table, this.table.columns, options); return select; } diff --git a/packages/datalib/src/ViewGridDisplay.ts b/packages/datalib/src/ViewGridDisplay.ts index 36cd72462..29b5cc807 100644 --- a/packages/datalib/src/ViewGridDisplay.ts +++ b/packages/datalib/src/ViewGridDisplay.ts @@ -43,8 +43,8 @@ export class ViewGridDisplay extends GridDisplay { }; } - createSelect() { - const select = this.createSelectBase(this.view, this.view.columns); + createSelect(options = {}) { + const select = this.createSelectBase(this.view, this.view.columns, options); return select; } } diff --git a/packages/web/src/datagrid/DataGridCore.js b/packages/web/src/datagrid/DataGridCore.js index 8944e541a..e97e71f15 100644 --- a/packages/web/src/datagrid/DataGridCore.js +++ b/packages/web/src/datagrid/DataGridCore.js @@ -618,11 +618,17 @@ export default function DataGridCore(props) { diff --git a/packages/web/src/impexp/ImportExportConfigurator.js b/packages/web/src/impexp/ImportExportConfigurator.js index 3d1e1f12d..427e0f00f 100644 --- a/packages/web/src/impexp/ImportExportConfigurator.js +++ b/packages/web/src/impexp/ImportExportConfigurator.js @@ -10,7 +10,7 @@ import { FormTablesSelect, FormSchemaSelect, } from '../utility/forms'; -import { useDatabaseInfo } from '../utility/metadataLoaders'; +import { useConnectionInfo, useDatabaseInfo } from '../utility/metadataLoaders'; import TableControl, { TableColumn } from '../utility/TableControl'; import { TextField, SelectField } from '../utility/inputs'; import { getActionOptions, getTargetName, isFileStorage } from './createImpExpScript'; @@ -19,6 +19,7 @@ import ErrorInfo from '../widgets/ErrorInfo'; import getAsArray from '../utility/getAsArray'; import axios from '../utility/axios'; import LoadingInfo from '../widgets/LoadingInfo'; +import SqlEditor from '../sqleditor/SqlEditor'; const Container = styled.div` max-height: 50vh; @@ -53,6 +54,12 @@ const TrashWrapper = styled.div` color: blue; `; +const SqlWrapper = styled.div` + position: relative; + height: 100px; + width: 20vw; +`; + function getFileFilters(storageType) { const res = []; if (storageType == 'csv') res.push({ name: 'CSV files', extensions: ['csv'] }); @@ -142,6 +149,7 @@ function SourceTargetConfig({ databaseNameField, schemaNameField, tablesField = undefined, + engine = undefined, }) { const { values, setFieldValue } = useFormikContext(); const types = @@ -152,6 +160,7 @@ function SourceTargetConfig({ { value: 'csv', label: 'CSV file(s)', directions: ['source', 'target'] }, { value: 'jsonl', label: 'JSON lines file(s)', directions: ['source', 'target'] }, { value: 'excel', label: 'MS Excel file(s)', directions: ['source'] }, + { value: 'query', label: 'SQL Query', directions: ['source'] }, ]; const storageType = values[storageTypeField]; const dbinfo = useDatabaseInfo({ conid: values[connectionIdField], database: values[databaseNameField] }); @@ -160,12 +169,16 @@ function SourceTargetConfig({ {direction == 'source' && } {direction == 'target' && } x.directions.includes(direction))} name={storageTypeField} /> - {storageType == 'database' && ( + {(storageType == 'database' || storageType == 'query') && ( <> + + )} + {storageType == 'database' && ( + <> {tablesField && ( @@ -204,6 +217,20 @@ function SourceTargetConfig({ )} )} + {storageType == 'query' && ( + <> + + + setFieldValue('sourceSql', value)} + engine={engine} + focusOnCreate + /> + + + )} + {isFileStorage(storageType) && direction == 'source' && } ); @@ -231,6 +258,8 @@ function SourceName({ name }) { export default function ImportExportConfigurator() { const { values, setFieldValue } = useFormikContext(); const targetDbinfo = useDatabaseInfo({ conid: values.targetConnectionId, database: values.targetDatabaseName }); + const sourceConnectionInfo = useConnectionInfo({ conid: values.sourceConnectionId }); + const { engine: sourceEngine } = sourceConnectionInfo || {}; const { sourceList } = values; return ( @@ -243,6 +272,7 @@ export default function ImportExportConfigurator() { databaseNameField="sourceDatabaseName" schemaNameField="sourceSchemaName" tablesField="sourceList" + engine={sourceEngine} />