This commit is contained in:
Jan Prochazka 2020-12-29 17:55:07 +01:00
parent ed11b9e5a1
commit 290acdb68a
3 changed files with 43 additions and 1 deletions

View File

@ -9,7 +9,9 @@ import {
referenceIsConnecting, referenceIsConnecting,
mergeSelectsFromDesigner, mergeSelectsFromDesigner,
findQuerySource, findQuerySource,
findDesignerFilterType,
} from './designerTools'; } from './designerTools';
import { parseFilter } from 'dbgate-filterparser';
export class DesignerQueryDumper { export class DesignerQueryDumper {
constructor(public designer: DesignerInfo, public components: DesignerComponent[]) {} constructor(public designer: DesignerInfo, public components: DesignerComponent[]) {}
@ -61,11 +63,35 @@ export class DesignerQueryDumper {
}); });
} }
} }
this.addConditions(select, component.tables);
} }
return select; return select;
} }
addConditions(select: Select, tables: DesignerTableInfo[]) {
for (const column of this.designer.columns) {
if (!column.filter) continue;
const table = this.designer.tables.find((x) => x.designerId == column.designerId);
if (!tables.find((x) => x.designerId == table.designerId)) continue;
const condition = parseFilter(column.filter, findDesignerFilterType(column, this.designer));
if (condition) {
select.where = mergeConditions(
select.where,
_.cloneDeepWith(condition, (expr) => {
if (expr.exprType == 'placeholder')
return {
exprType: 'column',
columnName: column.columnName,
source: findQuerySource(this.designer, column.designerId),
};
})
);
}
}
}
run() { run() {
let res: Select = null; let res: Select = null;
for (const component of this.components) { for (const component of this.components) {
@ -148,6 +174,8 @@ export class DesignerQueryDumper {
})); }));
} }
this.addConditions(res, topLevelTables);
return res; return res;
} }
} }

View File

@ -2,6 +2,7 @@ import React from 'react';
import DataFilterControl from '../datagrid/DataFilterControl'; import DataFilterControl from '../datagrid/DataFilterControl';
import { CheckboxField, SelectField, TextField } from '../utility/inputs'; import { CheckboxField, SelectField, TextField } from '../utility/inputs';
import TableControl, { TableColumn } from '../utility/TableControl'; import TableControl, { TableColumn } from '../utility/TableControl';
import { findDesignerFilterType } from './designerTools';
function getTableDisplayName(column, tables) { function getTableDisplayName(column, tables) {
const table = tables.find((x) => x.designerId == column.designerId); const table = tables.find((x) => x.designerId == column.designerId);
@ -115,7 +116,7 @@ export default function QueryDesignColumns({ value, onChange }) {
header="Filter" header="Filter"
formatter={(row) => ( formatter={(row) => (
<DataFilterControl <DataFilterControl
filterType="string" filterType={findDesignerFilterType(row, value)}
filter={row.filter} filter={row.filter}
setFilter={(filter) => { setFilter={(filter) => {
changeColumn({ ...row, filter }); changeColumn({ ...row, filter });

View File

@ -4,6 +4,7 @@ import { EngineDriver } from 'dbgate-types';
import { DesignerInfo, DesignerTableInfo, DesignerReferenceInfo, DesignerJoinType } from './types'; import { DesignerInfo, DesignerTableInfo, DesignerReferenceInfo, DesignerJoinType } from './types';
import { DesignerComponentCreator } from './DesignerComponentCreator'; import { DesignerComponentCreator } from './DesignerComponentCreator';
import { DesignerQueryDumper } from './DesignerQueryDumper'; import { DesignerQueryDumper } from './DesignerQueryDumper';
import { getFilterType } from 'dbgate-filterparser';
export function referenceIsConnecting( export function referenceIsConnecting(
reference: DesignerReferenceInfo, reference: DesignerReferenceInfo,
@ -129,3 +130,15 @@ export function isConnectedByReference(
const array2 = arrays.find((a) => a.find((x) => x.designerId == table2.designerId)); const array2 = arrays.find((a) => a.find((x) => x.designerId == table2.designerId));
return array1 == array2; return array1 == array2;
} }
export function findDesignerFilterType({ designerId, columnName }, designer) {
const table = (designer.tables || []).find((x) => x.designerId == designerId);
if (table) {
const column = (table.columns || []).find((x) => x.columnName == columnName);
if (column) {
const { dataType } = column;
return getFilterType(dataType);
}
}
return 'string';
}