diff --git a/packages/api/src/controllers/databaseConnections.js b/packages/api/src/controllers/databaseConnections.js index 2b6867021..0de25bb06 100644 --- a/packages/api/src/controllers/databaseConnections.js +++ b/packages/api/src/controllers/databaseConnections.js @@ -253,9 +253,9 @@ module.exports = { }, loadFieldValues_meta: true, - async loadFieldValues({ conid, database, schemaName, pureName, field, search }, req) { + async loadFieldValues({ conid, database, schemaName, pureName, field, search, dataType }, req) { testConnectionPermission(conid, req); - return this.loadDataCore('loadFieldValues', { conid, database, schemaName, pureName, field, search }); + return this.loadDataCore('loadFieldValues', { conid, database, schemaName, pureName, field, search, dataType }); }, callMethod_meta: true, diff --git a/packages/api/src/proc/databaseConnectionProcess.js b/packages/api/src/proc/databaseConnectionProcess.js index 840510695..448b9286d 100644 --- a/packages/api/src/proc/databaseConnectionProcess.js +++ b/packages/api/src/proc/databaseConnectionProcess.js @@ -291,10 +291,14 @@ async function handleLoadKeyTableRange({ msgid, key, cursor, count }) { }); } -async function handleLoadFieldValues({ msgid, schemaName, pureName, field, search }) { - return handleDriverDataCore(msgid, driver => driver.loadFieldValues(dbhan, { schemaName, pureName }, field, search), { - logName: 'loadFieldValues', - }); +async function handleLoadFieldValues({ msgid, schemaName, pureName, field, search, dataType }) { + return handleDriverDataCore( + msgid, + driver => driver.loadFieldValues(dbhan, { schemaName, pureName }, field, search, dataType), + { + logName: 'loadFieldValues', + } + ); } function ensureExecuteCustomScript(driver) { diff --git a/packages/tools/src/driverBase.ts b/packages/tools/src/driverBase.ts index 06820f7d5..577cf29f2 100644 --- a/packages/tools/src/driverBase.ts +++ b/packages/tools/src/driverBase.ts @@ -2,7 +2,7 @@ import _compact from 'lodash/compact'; import _isString from 'lodash/isString'; import { SqlDumper } from './SqlDumper'; import { splitQuery } from 'dbgate-query-splitter'; -import { dumpSqlSelect } from 'dbgate-sqltree'; +import { dumpSqlSelect, Select } from 'dbgate-sqltree'; import { EngineDriver, QueryResult, RunScriptOptions } from 'dbgate-types'; import { detectSqlFilterBehaviour } from './detectSqlFilterBehaviour'; import { getLogger } from './getLogger'; @@ -128,31 +128,44 @@ export const driverBase = { } return []; }, - async loadFieldValues(pool, name, columnName, search) { + async loadFieldValues(pool, name, columnName, search, dataType) { const dmp = this.createDumper(); - const select = { + + let expr; + if (this.dialect.createColumnViewExpression) { + expr = this.dialect.createColumnViewExpression(columnName, dataType, { name }, 'value'); + } + if (!expr) { + expr = { + exprType: 'column', + columnName, + alias: 'value', + }; + } + + const select: Select = { commandType: 'select', distinct: true, - topRecords: 100, from: { name, }, - columns: [ - { - exprType: 'column', - columnName, - alias: 'value', - }, - ], + columns: [expr], orderBy: [ { exprType: 'column', columnName, + direction: 'ASC', }, ], }; + if (this.dialect.topRecords) { + select.topRecords = 100; + } else { + select.range = { offset: 0, limit: 100 }; + } + if (search) { const tokens = _compact(search.split(' ').map(x => x.trim())); if (tokens.length > 0) { @@ -177,6 +190,8 @@ export const driverBase = { // @ts-ignore dumpSqlSelect(dmp, select); + console.log('******************** QUERY:', dmp.s); + const resp = await this.query(pool, dmp.s); return resp.rows; }, diff --git a/packages/types/engines.d.ts b/packages/types/engines.d.ts index 389a5f13c..1f973393d 100644 --- a/packages/types/engines.d.ts +++ b/packages/types/engines.d.ts @@ -208,7 +208,13 @@ export interface EngineDriver extends FilterBehaviourProvider { exportKeys(dbhan: DatabaseHandle, options: {}): Promise; loadKeyInfo(dbhan: DatabaseHandle, key): Promise; loadKeyTableRange(dbhan: DatabaseHandle, key, cursor, count): Promise; - loadFieldValues(dbhan: DatabaseHandle, name: NamedObjectInfo, field: string, search: string): Promise; + loadFieldValues( + dbhan: DatabaseHandle, + name: NamedObjectInfo, + field: string, + search: string, + dataType: string + ): Promise; analyseFull(dbhan: DatabaseHandle, serverVersion): Promise; analyseIncremental(dbhan: DatabaseHandle, structure: DatabaseInfo, serverVersion): Promise; dialect: SqlDialect; diff --git a/packages/web/src/datagrid/DataFilterControl.svelte b/packages/web/src/datagrid/DataFilterControl.svelte index 9a01a05b3..3acf95f44 100644 --- a/packages/web/src/datagrid/DataFilterControl.svelte +++ b/packages/web/src/datagrid/DataFilterControl.svelte @@ -39,6 +39,7 @@ export let schemaName = null; export let columnName = null; export let uniqueName = null; + export let dataType = null; export let placeholder = 'Filter'; @@ -228,6 +229,7 @@ pureName: foreignKey.refTableName, schemaName: foreignKey.refSchemaName, multiselect: true, + dataType, onConfirm: keys => setFilter(keys.join(',')), }); } @@ -243,6 +245,7 @@ pureName, field: columnName || uniqueName, formatterFunction, + dataType, onConfirm: keys => setFilter(keys.map(x => getFilterValueExpression(x)).join(',')), }); } diff --git a/packages/web/src/datagrid/DataGridCore.svelte b/packages/web/src/datagrid/DataGridCore.svelte index 2892e81d4..a44bd39e9 100644 --- a/packages/web/src/datagrid/DataGridCore.svelte +++ b/packages/web/src/datagrid/DataGridCore.svelte @@ -1994,6 +1994,7 @@ onFocusGrid={() => { selectTopmostCell(col.uniqueName); }} + dataType={col.dataType} /> {/each} diff --git a/packages/web/src/formview/FormViewFilterColumn.svelte b/packages/web/src/formview/FormViewFilterColumn.svelte index 99464443b..69836e4fc 100644 --- a/packages/web/src/formview/FormViewFilterColumn.svelte +++ b/packages/web/src/formview/FormViewFilterColumn.svelte @@ -63,6 +63,7 @@ {pureName} columnName={column ? (column.uniquePath.length == 1 ? column.uniquePath[0] : null) : uniqueName} foreignKey={column?.foreignKey} + dataType={column?.dataType} /> {/if} diff --git a/packages/web/src/modals/DictionaryLookupModal.svelte b/packages/web/src/modals/DictionaryLookupModal.svelte index dda6b24c3..e3dda4066 100644 --- a/packages/web/src/modals/DictionaryLookupModal.svelte +++ b/packages/web/src/modals/DictionaryLookupModal.svelte @@ -23,6 +23,7 @@ export let schemaName; export let driver; export let multiselect = false; + export let dataType; let rows = null; let tableInfo; diff --git a/packages/web/src/modals/ValueLookupModal.svelte b/packages/web/src/modals/ValueLookupModal.svelte index 07d62aa89..56c2e9653 100644 --- a/packages/web/src/modals/ValueLookupModal.svelte +++ b/packages/web/src/modals/ValueLookupModal.svelte @@ -26,6 +26,7 @@ export let multiselect = false; export let jslid; export let formatterFunction; + export let dataType; // console.log('ValueLookupModal', conid, database, pureName, schemaName, columnName, driver); @@ -53,6 +54,7 @@ schemaName, pureName, field, + dataType, }); }