feat: services quick search.

This commit is contained in:
a.bouhuolia
2021-08-07 20:37:11 +02:00
parent fad9052da8
commit 1b90610cec
39 changed files with 380 additions and 204 deletions

View File

@@ -1,5 +1,3 @@
import { IModel, IFilterRole } from 'interfaces';
import { FIELD_TYPE } from './constants';
export default class DynamicFilterAbstructor {
/**
@@ -25,6 +23,11 @@ export default class DynamicFilterAbstructor {
});
};
/**
* Builds join queries of fields.
* @param builder -
* @param {string[]} fieldsRelations -
*/
private buildFieldsJoinQueries = (builder, fieldsRelations: string[]) => {
fieldsRelations.forEach((fieldRelation) => {
const relation = this.model.relationMappings[fieldRelation];
@@ -38,7 +41,10 @@ export default class DynamicFilterAbstructor {
});
};
getModel() {
/**
* Retrieve the dynamic filter mode.
*/
protected getModel() {
return this.model;
}
}

View File

@@ -0,0 +1,27 @@
import { IFilterRole } from 'interfaces';
import DynamicFilterFilterRoles from './DynamicFilterFilterRoles';
export default class DynamicFilterAdvancedFilter extends DynamicFilterFilterRoles {
private filterRoles: IFilterRole[];
/**
* Constructor method.
* @param {Array} filterRoles -
* @param {Array} resourceFields -
*/
constructor(filterRoles: IFilterRole[]) {
super();
this.filterRoles = filterRoles;
this.setResponseMeta();
}
/**
* Sets response meta.
*/
private setResponseMeta() {
this.responseMeta = {
filterRoles: this.filterRoles,
};
}
}

View File

@@ -5,19 +5,10 @@ export default class FilterRoles extends DynamicFilterRoleAbstructor {
private filterRoles: IFilterRole[];
/**
* Constructor method.
* @param {Array} filterRoles -
* @param {Array} resourceFields -
* On initialize filter roles.
*/
constructor(filterRoles: IFilterRole[]) {
super();
this.filterRoles = filterRoles;
this.setResponseMeta();
}
public onInitialize() {
super.onInitialize();
this.setFilterRolesRelations();
}
@@ -27,7 +18,7 @@ export default class FilterRoles extends DynamicFilterRoleAbstructor {
*/
private buildLogicExpression(): string {
let expression = '';
this.filterRoles.forEach((role, index) => {
expression +=
index === 0 ? `${role.index} ` : `${role.condition} ${role.index} `;
@@ -50,15 +41,6 @@ export default class FilterRoles extends DynamicFilterRoleAbstructor {
};
}
/**
* Sets response meta.
*/
private setResponseMeta() {
this.responseMeta = {
filterRoles: this.filterRoles,
};
}
/**
* Sets filter roles relations if field was relation type.
*/

View File

@@ -1,4 +1,5 @@
import moment from 'moment';
import * as R from 'ramda';
import { IFilterRole, IDynamicFilter, IModel } from 'interfaces';
import { Lexer } from 'lib/LogicEvaluation/Lexer';
import Parser from 'lib/LogicEvaluation/Parser';
@@ -63,6 +64,18 @@ export default abstract class DynamicFilterAbstructor
return queryParser.parse();
};
/**
* Parses the logic expression to base expression.
* @param {string} logicExpression -
* @return {string}
*/
private parseLogicExpression(logicExpression: string): string {
return R.compose(
R.replace(/or|OR/g, '||'),
R.replace(/and|AND/g, '&&'),
)(logicExpression);
}
/**
* Builds filter query for query builder.
* @param {String} tableName - Table name.
@@ -74,8 +87,10 @@ export default abstract class DynamicFilterAbstructor
roles: IFilterRole[],
logicExpression: string
) => {
const basicExpression = this.parseLogicExpression(logicExpression);
return (builder) => {
this.buildFilterRolesQuery(model, roles, logicExpression)(builder);
this.buildFilterRolesQuery(model, roles, basicExpression)(builder);
};
};
@@ -347,11 +362,15 @@ export default abstract class DynamicFilterAbstructor
}
};
/**
* Retrieve the model.
*/
getModel() {
return this.model;
}
onInitialize() {
}
/**
* On initialize the registered dynamic filter.
*/
onInitialize() {}
}

View File

@@ -0,0 +1,48 @@
import { IFilterRole } from 'interfaces';
import DynamicFilterFilterRoles from './DynamicFilterFilterRoles';
export default class DynamicFilterSearch extends DynamicFilterFilterRoles {
private searchKeyword: string;
private filterRoles: IFilterRole[];
/**
* Constructor method.
* @param {string} searchKeyword - Search keyword.
*/
constructor(searchKeyword: string) {
super();
this.searchKeyword = searchKeyword;
}
/**
* On initialize the dynamic filter.
*/
public onInitialize() {
super.onInitialize();
this.filterRoles = this.getModelSearchFilterRoles(this.searchKeyword);
}
/**
* Retrieve the filter roles from model search roles.
* @param {string} searchKeyword
* @returns {IFilterRole[]}
*/
private getModelSearchFilterRoles(searchKeyword: string): IFilterRole[] {
const model = this.getModel();
return model.searchRoles.map((searchRole, index) => ({
...searchRole,
value: searchKeyword,
index: index + 1,
}));
}
/**
*
*/
setResponseMeta() {
this.responseMeta = {
searchKeyword: this.searchKeyword,
};
}
}