import { CriteriaParameter, InputCriteria } from './CriteriaParameter.js' interface OutputJSON { expression: string | undefined; parameters: Array; } /** * `CriteriaParameter`: Utilizado para validar e manipular os critérios da requisição. * */ export class Criteria { //Internal Properties //================================================================ private _expression: string | undefined = undefined; private _parameters: Array = []; //Constructor //================================================================ constructor(exp?: string, params?: Array) { this._expression = exp ? exp : undefined; this._parameters = params ? params : []; } //Getters and Setters //================================================================ /** * @ngdoc * @Setter_______________ * @name sankhyalabs.core.src:Criteria#parameters * @methodOf sankhyalabs.core.src:CriteriaProvider * @description Setter para "parameters". Trata-se de uma Array de parametros da classe Criteria. * @param {Array} [parameters] Array de parametros da classe Criteria. */ public set parameters(parameters: Array) { this._parameters = parameters; } /** * @ngdoc * @Getter_______________ * @name sankhyalabs.core.src:Criteria#parameters * @methodOf sankhyalabs.core.src:CriteriaProvider * @description Getter para parameters * @returns {Array} */ public get parameters(): Array { return this._parameters; } /** * @ngdoc * @Setter_______________ * @name sankhyalabs.core.src:Criteria#expression * @methodOf sankhyalabs.core.src:CriteriaProvider * @description Setter para "expression". Trata-se do expressão da classe Criteria. * @param {string} [expression] Expressão da classe Criteria. */ public set expression(expression: string | undefined) { this._expression = expression; } /** * @ngdoc * @Getter_______________ * @name sankhyalabs.core.src:Criteria#expression * @methodOf sankhyalabs.core.src:CriteriaProvider * @description Getter para expression * @returns {string} expression em formato string. */ public get expression(): string | undefined { return this._expression; } //Methods //================================================================ /** * @ngdoc * @name sankhyalabs.core.src:Criteria#getSize * @methodOf sankhyalabs.core.src:Criteria * @description Método que retorna o Número de caracteres da expressão da classe Criteria. * @returns {number} Número de caracteres da expressão da classe Criteria. */ public getSize = (): number => { return this._expression === undefined ? 0 : this._expression.length; }; /** * @ngdoc * @name sankhyalabs.core.src:Criteria#or * @methodOf sankhyalabs.core.src:Criteria * @description Concatena a expressão ' OR ' ao critério. * @param {Criteria | string} [exp] Expressão a ser concatenada * @param {Array} [param] Parâmetros a serem concatenados. * @returns {Criteria} Retorna a própria instância do Criterio para encadeamento. */ public or = (exp: Criteria | string, param?: Array): Criteria => { if (this.getSize() > 0) { this.append(' OR '); } this.append(exp, param); return this; }; /** * @ngdoc * @name sankhyalabs.core.src:Criteria#and * @methodOf sankhyalabs.core.src:Criteria * @description Concatena a expressão ' AND ' ao critério. * @param {Criteria | string} [exp] Expressão a ser concatenada * @param {Array} [param] Parâmetros a serem concatenados. * @returns {Criteria} Retorna a própria instância do Criterio para encadeamento. */ public and = (exp: Criteria | string, param?: Array): Criteria => { if (this.getSize() > 0) { this.append(' AND '); } this.append(exp, param); return this; } /** * @ngdoc * @name sankhyalabs.core.src:Criteria#toJSON * @methodOf sankhyalabs.core.src:Criteria * @description Retorna um JSON que representa o objeto Criteria. * @returns {Object} Retorna um JSON que representa o objeto Criteria. */ public toJSON = (): OutputJSON | undefined => { const parametersArray: Array = []; this.parameters.map(function (param) { parametersArray.push(param.buildParam()); }) let result = undefined; if (this.getSize() > 0) { result = { expression: this.expression, parameters: parametersArray, } } return result; } /** * @ngdoc * @name sankhyalabs.core.src:Criteria#append * @methodOf sankhyalabs.core.src:Criteria * @description Concatena uma expressão e parâmetros ao critério. * @param {string} [exp=undefined] Expressão a ser concatenada * @param {array} [param=undefined] Parâmetros a serem concatenados. * @returns {Criteria} Retorna a própria instância do Criterio para encadeamento. */ public append(exp: Criteria | string, param?: Array): Criteria { if (exp instanceof Criteria) { if (exp.getSize() > 0) { param = exp.parameters exp = '(' + exp.expression + ')'; } else { return this; } } if (this.expression === undefined) { this.expression = exp; } else { this.expression += exp; } if (param) { this.addParameter(param); } return this; } /** * @ngdoc * @name sankhyalabs.core.src:Criteria#addParameter * @methodOf sankhyalabs.core.src:Criteria * @description Concatena parâmetros ao critério. * - Se passado um array, o metodo iterará no array e adicionará cada um dos itens. * - É possível passar um Objeto CriteriaParameter, um número, string ou uma instancia de data, eles serão inferidos para o tipo certo. * @param {CriteriaParameter} Parâmetro a ser adicionado. */ private addParameter(param: Array): void { for (const index in param) { this.parameters.push(param[index]); } } }