All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.javabeanstack.data.DataExpression Maven / Gradle / Ivy

The newest version!
/*
* JavaBeanStack FrameWork
*
* Copyright (C) 2017 Jorge Enciso
* Email: [email protected]
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301  USA
*/

package org.javabeanstack.data;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.javabeanstack.util.Fn.nvl;
import static org.javabeanstack.util.Strings.isNullorEmpty;
import static org.javabeanstack.util.Strings.textMerge;
import static org.javabeanstack.util.Fn.inList;


/**
 * Contiene metodos necesarios para generar expresiones utilizadas principalmente en los selects nativos. 
 * Es utilizado principalmente por DataNativeQuery().
 * 
 * @author Jorge Enciso
 */
public class DataExpression implements IDataExpression{

    private List exprList = new ArrayList<>();
    private boolean openparenthesis = false;
    private Map sentenceParams = new HashMap();

    
    public final List getExpressionList() {
        return exprList;
    }

    /**
     * Lee los parámetros de la sentencia
     *
     * @return parámetros de la sentencia
     */
    @Override
    public Map getSentenceParams() {
        return sentenceParams;
    }

    /**
     * Asignar los parametros de la sentencia
     *
     * @param sentenceParams
     */
    @Override
    public void setSentenceParams(Map sentenceParams) {
        this.sentenceParams = sentenceParams;
    }

    /**
     * Agrega un parámetro
     *
     * @param key clave del parámetro
     * @param value valor del parámetro
     */
    @Override
    public void addSentenceParam(String key, Object value) {
        this.sentenceParams.put(key, value);
    }


    public final class ElementExpr {

        String operador = "and";
        String expresion;
        String grupo = "";
        Map params;

        public ElementExpr(String expr, Map params) {
            this.expresion = expr;
            this.params = params;
        }

        public ElementExpr(String expr, Map params, String operator) {
            this.expresion = expr;
            this.params = params;
            if (!isNullorEmpty(operator)) {
                this.operador = operator;
            }
        }

        public ElementExpr(String expr, Map params, String operator, String group) {
            this.expresion = expr;
            this.params = params;
            this.grupo = group;
            if (!isNullorEmpty(operator)) {
                this.operador = operator;
            }
        }
    }

    /**
     * Limpia las expresiones
     */
    @Override
    public void clearExpressions() {
        exprList.clear();
    }

    /**
     * Inserta un parentesis a la expresión
     */
    @Override
    public void openParenthesis() {
        ElementExpr element = new ElementExpr("", null, "(");
        exprList.add(element);
        openparenthesis = true;
    }

    /**
     * Inserta un cierre de parentesis en la expresión
     */
    @Override
    public void closeParenthesis() {
        ElementExpr element = new ElementExpr("", null, ")");
        exprList.add(element);
        openparenthesis = false;
    }

    /**
     * Agrega un operador a la expresión
     *
     * @param operator operador (and, or, in)
     */
    @Override
    public void addOperator(String operator) {
        ElementExpr element = new ElementExpr("", null, operator);
        exprList.add(element);
    }

    /**
     * Agrega un operador a la expresión
     *
     * @param operator operador (and, or, in)
     * @param group
     */
    @Override
    public void addOperator(String operator, String group) {
        ElementExpr element = new ElementExpr("", null, operator, group);
        exprList.add(element);
    }

    /**
     * Agrega una expresión
     *
     * @param expr expresión
     * @param keyParams lista de parametros con sus valores.
     */
    @Override
    public void addExpression(String expr, Map keyParams) {
        addExpression(expr, keyParams, null);
    }

    /**
     * Agrega una expresión
     *
     * @param expr expresión
     * @param keyParams lista de parametros con sus valores.
     * @param operator operador (and, or, in)
     *
     */
    @Override
    public void addExpression(String expr, Map keyParams, String operator) {
        ElementExpr element = new ElementExpr(expr, keyParams, operator);
        if (openparenthesis && inList(element.operador.toLowerCase(), "and", "or")) {
            element.operador = "";
        }
        exprList.add(element);
        openparenthesis = false;
    }

    /**
     * Agrega una expresión
     *
     * @param expr expresión
     * @param keyParams lista de parametros con sus valores.
     * @param operator operador (and, or, in)
     * @param group
     *
     */
    @Override
    public void addExpression(String expr, Map keyParams, String operator, String group) {
        ElementExpr element = new ElementExpr(expr, keyParams, operator, group);
        if (openparenthesis && inList(element.operador.toLowerCase(), "and", "or")) {
            element.operador = "";
        }
        exprList.add(element);
        openparenthesis = false;
    }

    /**
     * Agrega una expresión
     *
     * @param expr expresión
     * @param keyParamList lista de parametros
     *
     */
    @Override
    public void addExpression(String expr, Object... keyParamList) {
        Map params = new HashMap<>();
        int i = 0;
        String expr1, expr2;
        if (keyParamList != null && keyParamList.length >= 1) {
            while (true) {
                expr1 = keyParamList[i].toString();
                if (i + 1 < keyParamList.length) {
                    expr2 = keyParamList[i + 1].toString();
                } else {
                    expr2 = null;
                }
                params.put(expr1, expr2);
                i = i + 2;
                if (i >= keyParamList.length) {
                    break;
                }
            }
        }
        addExpression(expr, params);
    }

    /**
     * Agrega una expresión
     *
     * @param dataExpression expresión
     */
    @Override
    public void addExpressions(IDataExpression dataExpression) {
        ((DataExpression) dataExpression).getExpressionList().forEach( expr -> {
            exprList.add(expr);
        });
        dataExpression.getSentenceParams().entrySet().forEach( element -> {
            this.getSentenceParams().put(element.getKey(), element.getValue());
        });
    }

    /**
     * Genera la sentencia y lo devuelve
     *
     * @return la expresión resultante
     */
    @Override
    public String getSentence() {
        return getSentence("");
    }

    /**
     * Genera la sentencia y lo devuelve
     *
     * @param group
     * @return la expresión resultante
     */
    @Override
    public String getSentence(String group) {
        String devolver = "";
        String expr;
        String linefeed = "";
        for (int i = 0; i < exprList.size(); i++) {
            ElementExpr e = exprList.get(i);
            // Si se pasa un grupo solo procesar ese grupo
            if (!group.isEmpty() && !nvl(e.grupo, "").equals(group)) {
                continue;
            }
            if (i == 0 && inList(e.operador.toLowerCase(), "and", "or")) {
                e.operador = "";
            }
            expr = e.expresion;
            if (e.params != null) {
                expr = textMerge(expr, e.params);
            }
            if (!isNullorEmpty(e.expresion)) {
                expr = " (" + expr + ") ";
            }
            devolver += linefeed + e.operador + expr;
            linefeed = "\n";
        }
        return devolver;
    }
    
    /**
     * Remueve una expresión 
     * @param elementNumber nro de elemento en la lista que va a ser eliminada.
     * @return IDataExpression resultante.
     */
    @Override
    public IDataExpression removeExpression(int elementNumber) {
        IDataExpression dataExpr = new DataExpression();
        ElementExpr element;
        for (int i=0; i < exprList.size();i++){
            if (i != elementNumber){
                element = exprList.get(i);                            
                dataExpr.addExpression(element.expresion, 
                                        element.params,
                                        element.operador,
                                        element.grupo);
            }
        }
        return dataExpr;
    }

    /**
     * Remueve un grupo de expresiones de la lista.
     * @param group grupo.
     * @return IDataExpression resultante.
     */
    @Override
    public IDataExpression removeExpression(String group) {
        IDataExpression dataExpr = new DataExpression();
        for (ElementExpr element: exprList){
            if (!element.grupo.equalsIgnoreCase(group)){
                dataExpr.addExpression(element.expresion, 
                                        element.params,
                                        element.operador,
                                        element.grupo);
            }
        }
        return dataExpr;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy