multi column condition in perspectives

This commit is contained in:
Jan Prochazka 2023-02-26 16:48:32 +01:00
parent 7c03d31b84
commit a2043b237f
5 changed files with 91 additions and 4 deletions

View File

@ -80,6 +80,8 @@ export interface PerspectiveNodeConfig {
isAutoGenerated?: true | undefined;
isNodeChecked?: boolean;
multiColumnFilter?: string;
position?: {
x: number;
y: number;

View File

@ -35,7 +35,7 @@ import { PerspectiveDataLoadProps, PerspectiveDataProvider } from './Perspective
import stableStringify from 'json-stable-stringify';
import { getFilterType, parseFilter } from 'dbgate-filterparser';
import { FilterType } from 'dbgate-filterparser/lib/types';
import { Condition, Expression, Select } from 'dbgate-sqltree';
import { CompoudCondition, Condition, Expression, Select } from 'dbgate-sqltree';
// import { getPerspectiveDefaultColumns } from './getPerspectiveDefaultColumns';
import uuidv1 from 'uuid/v1';
import { PerspectiveDataPatternColumn } from './PerspectiveDataPattern';
@ -341,10 +341,66 @@ export abstract class PerspectiveTreeNode {
);
}
getMutliColumnSqlCondition(source): Condition {
if (!this.nodeConfig?.multiColumnFilter) return null;
const base = this.getBaseTableFromThis() as TableInfo | ViewInfo;
if (!base) return null;
try {
const condition = parseFilter(this.nodeConfig?.multiColumnFilter, 'string');
if (condition) {
const orCondition: CompoudCondition = {
conditionType: 'or',
conditions: [],
};
for (const column of base.columns || []) {
orCondition.conditions.push(
_cloneDeepWith(condition, (expr: Expression) => {
if (expr.exprType == 'placeholder') {
return {
exprType: 'column',
alias: source,
columnName: column.columnName,
};
}
})
);
}
if (orCondition.conditions.length > 0) {
return orCondition;
}
}
} catch (err) {
console.warn(err.message);
}
return null;
}
getMutliColumnMongoCondition(): {} {
if (!this.nodeConfig?.multiColumnFilter) return null;
const pattern = this.dataProvider?.dataPatterns?.[this.designerId];
if (!pattern) return null;
const condition = parseFilter(this.nodeConfig?.multiColumnFilter, 'mongo');
if (!condition) return null;
const res = pattern.columns.map(col => {
return _cloneDeepWith(condition, expr => {
if (expr.__placeholder__) {
return {
[col.name]: expr.__placeholder__,
};
}
});
});
return {
$or: res,
};
}
getChildrenSqlCondition(source = null): Condition {
const conditions = _compact([
...this.childNodes.map(x => x.parseFilterCondition(source)),
...this.buildParentFilterConditions(),
this.getMutliColumnSqlCondition(source),
]);
if (conditions.length == 0) {
return null;
@ -359,7 +415,10 @@ export abstract class PerspectiveTreeNode {
}
getChildrenMongoCondition(source = null): {} {
const conditions = _compact([...this.childNodes.map(x => x.parseFilterCondition(source))]);
const conditions = _compact([
...this.childNodes.map(x => x.parseFilterCondition(source)),
this.getMutliColumnMongoCondition(),
]);
if (conditions.length == 0) {
return null;
}
@ -402,7 +461,7 @@ export abstract class PerspectiveTreeNode {
}
return res;
}
getBaseTableFromThis() {
getBaseTableFromThis(): TableInfo | ViewInfo | CollectionInfo {
return null;
}

View File

@ -40,6 +40,8 @@
export let columnName = null;
export let uniqueName = null;
export let placeholder = 'Filter';
let value;
let isError;
let isOk;
@ -318,7 +320,7 @@
on:paste={handlePaste}
class:isError
class:isOk
placeholder="Filter"
{placeholder}
/>
{#if customCommandIcon && onCustomCommand}
<InlineButton on:click={onCustomCommand} title={customCommandTooltip} narrow square>

View File

@ -4,6 +4,7 @@
import { tick } from 'svelte';
import { createDatabaseObjectMenu } from '../appobj/DatabaseObjectAppObject.svelte';
import DataFilterControl from '../datagrid/DataFilterControl.svelte';
import CheckboxField from '../forms/CheckboxField.svelte';
import FontIcon from '../icons/FontIcon.svelte';
@ -300,6 +301,15 @@
</div>
{/if}
</div>
{#if settings?.getMutliColumnFilter && settings?.setMutliColumnFilter}
<DataFilterControl
filterType="string"
filter={settings?.getMutliColumnFilter(designerId)}
setFilter={value => settings?.setMutliColumnFilter(designerId, value)}
placeholder="Data filter"
/>
{/if}
<div class="columns" on:scroll={() => tick().then(onMoveReferences)} class:scroll={settings?.allowScrollColumns}>
{#each flatColumns || [] as column (column.columnName)}
<ColumnLine

View File

@ -334,6 +334,20 @@
toggleExpandedColumn: (column, value) => column.toggleExpanded(value),
getColumnDisplayName: column => column.shortName || column.columnName,
getParentColumnName: getPerspectiveParentColumnName,
getMutliColumnFilter: designerId => config.nodes.find(x => x.designerId == designerId).multiColumnFilter,
setMutliColumnFilter: (designerId, multiColumnFilter) => {
setConfig(cfg => ({
...cfg,
nodes: cfg.nodes.map(node =>
node.designerId == designerId
? {
...node,
multiColumnFilter,
}
: node
),
}));
},
}}
referenceComponent={QueryDesignerReference}
value={createDesignerModel(config, dbInfos, dataPatterns)}