mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-25 00:36:00 +00:00
filter behaviour WIP
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user