load field values fix #1009

This commit is contained in:
SPRINX0\prochazka
2025-01-27 16:47:44 +01:00
parent 35362fbc9b
commit 51cd639671
9 changed files with 51 additions and 18 deletions

View File

@@ -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,

View File

@@ -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) {

View File

@@ -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;
},

View File

@@ -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<DatabaseInfo>;
analyseIncremental(dbhan: DatabaseHandle, structure: DatabaseInfo, serverVersion): Promise<DatabaseInfo>;
dialect: SqlDialect;

View File

@@ -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(',')),
});
}

View File

@@ -1994,6 +1994,7 @@
onFocusGrid={() => {
selectTopmostCell(col.uniqueName);
}}
dataType={col.dataType}
/>
</td>
{/each}

View File

@@ -63,6 +63,7 @@
{pureName}
columnName={column ? (column.uniquePath.length == 1 ? column.uniquePath[0] : null) : uniqueName}
foreignKey={column?.foreignKey}
dataType={column?.dataType}
/>
</div>
{/if}

View File

@@ -23,6 +23,7 @@
export let schemaName;
export let driver;
export let multiselect = false;
export let dataType;
let rows = null;
let tableInfo;

View File

@@ -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,
});
}