uniqe binding values

This commit is contained in:
Jan Prochazka
2022-07-24 15:34:26 +02:00
parent 5395d1343b
commit 088ca231f3
3 changed files with 17 additions and 8 deletions

View File

@@ -4,6 +4,7 @@ import _pick from 'lodash/pick';
import _zip from 'lodash/zip'; import _zip from 'lodash/zip';
import _difference from 'lodash/difference'; import _difference from 'lodash/difference';
import debug from 'debug'; import debug from 'debug';
import stableStringify from 'json-stable-stringify';
const dbg = debug('dbgate:PerspectiveCache'); const dbg = debug('dbgate:PerspectiveCache');
@@ -49,14 +50,14 @@ export class PerspectiveCacheTable {
} }
getBindingGroup(groupValues: any[]) { getBindingGroup(groupValues: any[]) {
const key = this.cache.stableStringify(groupValues); const key = stableStringify(groupValues);
return this.bindingGroups[key]; return this.bindingGroups[key];
} }
getUncachedBindingGroups(props: PerspectiveDataLoadProps): any[][] { getUncachedBindingGroups(props: PerspectiveDataLoadProps): any[][] {
const uncached = []; const uncached = [];
for (const group of props.bindingValues) { for (const group of props.bindingValues) {
const key = this.cache.stableStringify(group); const key = stableStringify(group);
const item = this.bindingGroups[key]; const item = this.bindingGroups[key];
if (!item) { if (!item) {
uncached.push(group); uncached.push(group);
@@ -68,7 +69,7 @@ export class PerspectiveCacheTable {
storeGroupSize(props: PerspectiveDataLoadProps, bindingValues: any[], count: number) { storeGroupSize(props: PerspectiveDataLoadProps, bindingValues: any[], count: number) {
const originalBindingValue = props.bindingValues.find(v => _zip(v, bindingValues).every(([x, y]) => x == y)); const originalBindingValue = props.bindingValues.find(v => _zip(v, bindingValues).every(([x, y]) => x == y));
if (originalBindingValue) { if (originalBindingValue) {
const key = this.cache.stableStringify(originalBindingValue); const key = stableStringify(originalBindingValue);
// console.log('SET SIZE', originalBindingValue, bindingValues, key, count); // console.log('SET SIZE', originalBindingValue, bindingValues, key, count);
const group = new PerspectiveBindingGroup(this); const group = new PerspectiveBindingGroup(this);
group.bindingValues = bindingValues; group.bindingValues = bindingValues;
@@ -81,12 +82,12 @@ export class PerspectiveCacheTable {
} }
export class PerspectiveCache { export class PerspectiveCache {
constructor(public stableStringify) {} constructor() {}
tables: { [tableKey: string]: PerspectiveCacheTable } = {}; tables: { [tableKey: string]: PerspectiveCacheTable } = {};
getTableCache(props: PerspectiveDataLoadProps) { getTableCache(props: PerspectiveDataLoadProps) {
const tableKey = this.stableStringify( const tableKey = stableStringify(
_pick(props, ['schemaName', 'pureName', 'bindingColumns', 'databaseConfig', 'orderBy']) _pick(props, ['schemaName', 'pureName', 'bindingColumns', 'databaseConfig', 'orderBy'])
); );
let res = this.tables[tableKey]; let res = this.tables[tableKey];

View File

@@ -6,11 +6,13 @@ import _cloneDeep from 'lodash/cloneDeep';
import _compact from 'lodash/compact'; import _compact from 'lodash/compact';
import _uniq from 'lodash/uniq'; import _uniq from 'lodash/uniq';
import _flatten from 'lodash/flatten'; import _flatten from 'lodash/flatten';
import _uniqBy from 'lodash/uniqBy';
import { import {
PerspectiveDatabaseConfig, PerspectiveDatabaseConfig,
PerspectiveDataLoadProps, PerspectiveDataLoadProps,
PerspectiveDataProvider, PerspectiveDataProvider,
} from './PerspectiveDataProvider'; } from './PerspectiveDataProvider';
import stableStringify from 'json-stable-stringify';
export interface PerspectiveDataLoadPropsWithNode { export interface PerspectiveDataLoadPropsWithNode {
props: PerspectiveDataLoadProps; props: PerspectiveDataLoadProps;
@@ -171,7 +173,10 @@ export class PerspectiveTableColumnNode extends PerspectiveTreeNode {
schemaName: this.foreignKey.refSchemaName, schemaName: this.foreignKey.refSchemaName,
pureName: this.foreignKey.refTableName, pureName: this.foreignKey.refTableName,
bindingColumns: [this.foreignKey.columns[0].refColumnName], bindingColumns: [this.foreignKey.columns[0].refColumnName],
bindingValues: parentRows.map(row => [row[this.foreignKey.columns[0].columnName]]), bindingValues: _uniqBy(
parentRows.map(row => [row[this.foreignKey.columns[0].columnName]]),
stableStringify
),
dataColumns: this.getDataLoadColumns(), dataColumns: this.getDataLoadColumns(),
databaseConfig: this.databaseConfig, databaseConfig: this.databaseConfig,
orderBy: this.table.primaryKey?.columns.map(x => x.columnName) || [this.table.columns[0].columnName], orderBy: this.table.primaryKey?.columns.map(x => x.columnName) || [this.table.columns[0].columnName],
@@ -304,7 +309,10 @@ export class PerspectiveTableReferenceNode extends PerspectiveTableNode {
schemaName: this.table.schemaName, schemaName: this.table.schemaName,
pureName: this.table.pureName, pureName: this.table.pureName,
bindingColumns: [this.foreignKey.columns[0].columnName], bindingColumns: [this.foreignKey.columns[0].columnName],
bindingValues: parentRows.map(row => [row[this.foreignKey.columns[0].refColumnName]]), bindingValues: _uniqBy(
parentRows.map(row => [row[this.foreignKey.columns[0].refColumnName]]),
stableStringify
),
dataColumns: this.getDataLoadColumns(), dataColumns: this.getDataLoadColumns(),
databaseConfig: this.databaseConfig, databaseConfig: this.databaseConfig,
orderBy: this.table.primaryKey?.columns.map(x => x.columnName) || [this.table.columns[0].columnName], orderBy: this.table.primaryKey?.columns.map(x => x.columnName) || [this.table.columns[0].columnName],

View File

@@ -13,7 +13,7 @@
export let pureName; export let pureName;
const config = usePerspectiveConfig(tabid); const config = usePerspectiveConfig(tabid);
const cache = new PerspectiveCache(stableStringify); const cache = new PerspectiveCache();
const loadedCounts = writable({}); const loadedCounts = writable({});
</script> </script>