diff --git a/packages/api/src/controllers/jsldata.js b/packages/api/src/controllers/jsldata.js index 609a673c3..0ab2f2ecf 100644 --- a/packages/api/src/controllers/jsldata.js +++ b/packages/api/src/controllers/jsldata.js @@ -1,3 +1,4 @@ +const { filterName } = require('dbgate-tools'); const fs = require('fs'); const lineReader = require('line-reader'); const _ = require('lodash'); @@ -148,6 +149,19 @@ module.exports = { return {}; }, + loadFieldValues_meta: true, + async loadFieldValues({ jslid, field, search }) { + const datastore = await this.ensureDatastore(jslid); + const res = new Set(); + await datastore.enumRows(row => { + if (!filterName(search, row[field])) return true; + res.add(row[field]); + return res.size < 100; + }); + // @ts-ignore + return [...res].map(value => ({ value })); + }, + async notifyChangedStats(stats) { // console.log('SENDING STATS', JSON.stringify(stats)); const datastore = this.datastores[stats.jslid]; diff --git a/packages/api/src/utility/JsonLinesDatastore.js b/packages/api/src/utility/JsonLinesDatastore.js index 0f22a12f7..68fec9455 100644 --- a/packages/api/src/utility/JsonLinesDatastore.js +++ b/packages/api/src/utility/JsonLinesDatastore.js @@ -159,6 +159,18 @@ class JsonLinesDatastore { } } + async enumRows(eachRow) { + await lock.acquire('reader', async () => { + await this._ensureReader(0, null); + for (;;) { + const line = await this._readLine(true); + if (line == null) break; + const shouldContinue = eachRow(line); + if (!shouldContinue) break; + } + }); + } + async getRows(offset, limit, filter) { const res = []; await lock.acquire('reader', async () => { diff --git a/packages/web/src/datagrid/DataFilterControl.svelte b/packages/web/src/datagrid/DataFilterControl.svelte index 881227cff..b32ef4016 100644 --- a/packages/web/src/datagrid/DataFilterControl.svelte +++ b/packages/web/src/datagrid/DataFilterControl.svelte @@ -29,6 +29,7 @@ export let conid = null; export let database = null; export let driver = null; + export let jslid = null; export let pureName = null; export let schemaName = null; @@ -177,9 +178,8 @@ { onClick: () => openFilterWindow('>='), text: 'Greater Than Or Equal To...' }, { onClick: () => openFilterWindow('<'), text: 'Less Than...' }, { onClick: () => openFilterWindow('<='), text: 'Less Than Or Equal To...' }, - - { divider: true }, + { divider: true }, { onClick: () => openFilterWindow('+'), text: 'Contains...' }, { onClick: () => openFilterWindow('~'), text: 'Does Not Contain...' }, @@ -248,6 +248,7 @@ conid, database, driver, + jslid, multiselect: true, schemaName, pureName, @@ -304,6 +305,10 @@ {/if} + {:else if jslid} + + + {/if} {#if showResizeSplitter} diff --git a/packages/web/src/datagrid/DataGridCore.svelte b/packages/web/src/datagrid/DataGridCore.svelte index 99b60a8b3..831245bdd 100644 --- a/packages/web/src/datagrid/DataGridCore.svelte +++ b/packages/web/src/datagrid/DataGridCore.svelte @@ -336,6 +336,7 @@ export let tabControlHiddenTab = false; export let onCustomGridRefresh; export let useEvalFilters = false; + export let jslid; // export let generalAllowSave = false; export const activator = createActivator('DataGridCore', false); @@ -1548,6 +1549,7 @@ schemaName={col.schemaName} {conid} {database} + {jslid} driver={display?.driver} filterType={useEvalFilters ? 'eval' : col.filterType || getFilterType(col.dataType)} filter={display.getFilter(col.uniqueName)} diff --git a/packages/web/src/modals/ValueLookupModal.svelte b/packages/web/src/modals/ValueLookupModal.svelte index 8abb3435b..b235486e4 100644 --- a/packages/web/src/modals/ValueLookupModal.svelte +++ b/packages/web/src/modals/ValueLookupModal.svelte @@ -24,6 +24,7 @@ export let field; export let driver; export let multiselect = false; + export let jslid; // console.log('ValueLookupModal', conid, database, pureName, schemaName, columnName, driver); @@ -36,14 +37,22 @@ async function reload() { isLoading = true; - rows = await apiCall('database-connections/load-field-values', { - conid, - database, - search, - schemaName, - pureName, - field, - }); + if (jslid) { + rows = await apiCall('jsldata/load-field-values', { + jslid, + search, + field, + }); + } else { + rows = await apiCall('database-connections/load-field-values', { + conid, + database, + search, + schemaName, + pureName, + field, + }); + } isLoading = false; }