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}
/>