filter behaviour WIP

This commit is contained in:
Jan Prochazka
2024-08-19 12:49:26 +02:00
parent 2a48e0c4a0
commit c3609e8c7b
24 changed files with 105 additions and 76 deletions

View File

@@ -2,6 +2,7 @@ import _ from 'lodash';
import { GridDisplay, ChangeCacheFunc, ChangeConfigFunc, DisplayColumn } from './GridDisplay';
import type { EngineDriver, ViewInfo, ColumnInfo, CollectionInfo } from 'dbgate-types';
import { GridConfig, GridCache } from './GridConfig';
import { mongoFilterBehaviour, standardFilterBehaviours } from 'dbgate-tools';
function getObjectKeys(obj) {
if (_.isArray(obj)) {
@@ -52,7 +53,7 @@ function getColumnsForObject(basePath, obj, res: any[], display) {
}
}
function getDisplayColumn(basePath, columnName, display) {
function getDisplayColumn(basePath, columnName, display: CollectionGridDisplay) {
const uniquePath = [...basePath, columnName];
const uniqueName = uniquePath.join('.');
return {
@@ -62,7 +63,7 @@ function getDisplayColumn(basePath, columnName, display) {
uniquePath,
isStructured: true,
parentHeaderText: createHeaderText(basePath),
filterType: 'mongo',
filterBehaviour: display?.driver?.getFilterBehaviour(null, standardFilterBehaviours) ?? mongoFilterBehaviour,
pureName: display.collection?.pureName,
schemaName: display.collection?.schemaName,
};
@@ -95,7 +96,7 @@ export class CollectionGridDisplay extends GridDisplay {
cache: GridCache,
setCache: ChangeCacheFunc,
loadedRows,
changeSet,
changeSet,
readOnly = false
) {
super(config, setConfig, cache, setCache, driver);

View File

@@ -10,12 +10,13 @@ import type {
CollectionInfo,
SqlDialect,
ViewInfo,
FilterBehaviour,
} from 'dbgate-types';
import { parseFilter, getFilterType } from 'dbgate-filterparser';
import { parseFilter } from 'dbgate-filterparser';
import { filterName } from 'dbgate-tools';
import { ChangeSetFieldDefinition, ChangeSetRowDefinition } from './ChangeSet';
import { Expression, Select, treeToSql, dumpSqlSelect, Condition, CompoudCondition } from 'dbgate-sqltree';
import { isTypeLogical } from 'dbgate-tools';
import { isTypeLogical, standardFilterBehaviours, detectSqlFilterBehaviour, stringFilterBehaviour } from 'dbgate-tools';
export interface DisplayColumn {
schemaName: string;
@@ -33,7 +34,7 @@ export interface DisplayColumn {
isChecked?: boolean;
hintColumnNames?: string[];
dataType?: string;
filterType?: boolean;
filterBehaviour?: FilterBehaviour;
isStructured?: boolean;
}
@@ -92,7 +93,7 @@ export abstract class GridDisplay {
isLoadedCorrectly = true;
supportsReload = false;
isDynamicStructure = false;
filterTypeOverride = null;
filterBehaviourOverride = null;
setColumnVisibility(uniquePath: string[], isVisible: boolean) {
const uniqueName = uniquePath.join('.');
@@ -192,7 +193,11 @@ export abstract class GridDisplay {
const column = displayedColumnInfo[uniqueName];
if (!column) continue;
try {
const condition = parseFilter(filter, getFilterType(column.dataType));
const condition = parseFilter(
filter,
this.driver?.getFilterBehaviour(column.dataType, standardFilterBehaviours) ??
detectSqlFilterBehaviour(column.dataType)
);
if (condition) {
conditions.push(
_.cloneDeepWith(condition, (expr: Expression) => {
@@ -220,7 +225,7 @@ export abstract class GridDisplay {
};
for (const column of this.baseTableOrView.columns) {
try {
const condition = parseFilter(this.config.multiColumnFilter, getFilterType(column.dataType));
const condition = parseFilter(this.config.multiColumnFilter, detectSqlFilterBehaviour(column.dataType));
if (condition) {
orCondition.conditions.push(
_.cloneDeepWith(condition, (expr: Expression) => {
@@ -748,10 +753,12 @@ export abstract class GridDisplay {
for (const name in filters) {
const column = this.isDynamicStructure ? null : this.columns.find(x => x.columnName == name);
if (!this.isDynamicStructure && !column) continue;
const filterType =
this.filterTypeOverride ?? (this.isDynamicStructure ? 'mongo' : getFilterType(column.dataType));
const filterBehaviour =
this.filterBehaviourOverride ??
this.driver?.getFilterBehaviour(column.dataType, standardFilterBehaviours) ??
detectSqlFilterBehaviour(column.dataType);
try {
const condition = parseFilter(filters[name], filterType);
const condition = parseFilter(filters[name], filterBehaviour);
const replaced = _.cloneDeepWith(condition, (expr: Expression) => {
if (expr.exprType == 'placeholder')
return {
@@ -766,7 +773,7 @@ export abstract class GridDisplay {
}
if (this.config.multiColumnFilter) {
const placeholderCondition = parseFilter(this.config.multiColumnFilter, 'string');
const placeholderCondition = parseFilter(this.config.multiColumnFilter, stringFilterBehaviour);
if (placeholderCondition) {
conditions.push({
conditionType: 'anyColumnPass',

View File

@@ -2,6 +2,7 @@ import _ from 'lodash';
import { GridDisplay, ChangeCacheFunc, ChangeConfigFunc } from './GridDisplay';
import { GridConfig, GridCache } from './GridConfig';
import { analyseCollectionDisplayColumns } from './CollectionGridDisplay';
import { evalFilterBehaviour } from 'dbgate-tools';
export class JslGridDisplay extends GridDisplay {
constructor(
@@ -22,7 +23,7 @@ export class JslGridDisplay extends GridDisplay {
this.sortable = true;
this.supportsReload = supportsReload;
this.isDynamicStructure = isDynamicStructure;
this.filterTypeOverride = 'eval';
this.filterBehaviourOverride = evalFilterBehaviour;
this.editable = editable;
this.editableStructure = editable ? structure : null;