ips1ap101.lib.core.db.util.InterpreteSqlAbstracto.java Source code

Java tutorial

Introduction

Here is the source code for ips1ap101.lib.core.db.util.InterpreteSqlAbstracto.java

Source

/*
 * Este programa es software libre; usted puede redistribuirlo y/o modificarlo bajo los trminos
 * de la licencia "GNU General Public License" publicada por la Fundacin "Free Software Foundation".
 * Este programa se distribuye con la esperanza de que pueda ser til, pero SIN NINGUNA GARANTIA;
 * vea la licencia "GNU General Public License" para obtener cursor informacion.
 */
package ips1ap101.lib.core.db.util;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
import ips1ap101.lib.base.entity.enumeration.OperadorComEnumeration;
import ips1ap101.lib.base.entity.enumeration.TipoAgregacionEnumeration;
import ips1ap101.lib.base.util.StrUtils;
import ips1ap101.lib.core.app.CriterioBusqueda;
import ips1ap101.lib.core.app.CriterioOrden;
import ips1ap101.lib.core.enumeration.EnumCriterioOrden;
import org.apache.commons.lang.StringUtils;
import org.joda.time.DateTime;

/**
 * @author Jorge Campins
 */
public abstract class InterpreteSqlAbstracto implements InterpreteSql {

    private static final String NULL = " NULL ";

    private static final String IS_NULL = " IS NULL ";

    private static final String IS_NOT_NULL = " IS NOT NULL ";

    private static final String IS_TRUE = " IS TRUE ";

    private static final String IS_NOT_TRUE = " IS NOT TRUE ";

    private static final String IS_FALSE = " IS FALSE ";

    private static final String IS_NOT_FALSE = " IS NOT FALSE ";

    private static final String EQ = " = ";

    private static final String NEQ = " <> ";

    private static final String GT = " > ";

    private static final String LTEQ = " <= ";

    private static final String GTEQ = " >= ";

    private static final String LT = " < ";

    private static final String LIKE = " LIKE ";

    private static final String NOT_LIKE = " NOT LIKE ";

    private static final String LIKE_SINGLE = "_";

    private static final String LIKE_STRING = "%";

    private static final String IN = " IN ";

    private static final String NOT_IN = " NOT IN ";

    private static final String IS_NULL_OR = " IS NULL OR ";

    private static final String EXISTS = " EXISTS ";

    private static final String NOT_EXISTS = " NOT EXISTS ";

    private static final String ASCENDING = "ASC";

    private static final String DESCENDING = "DESC";

    @Override
    public String getNull() {
        return NULL;
    }

    protected String getIsNull() {
        return IS_NULL;
    }

    protected String getIsNotNull() {
        return IS_NOT_NULL;
    }

    protected String getIsTrue() {
        return IS_TRUE;
    }

    protected String getIsNotTrue() {
        return IS_NOT_TRUE;
    }

    protected String getIsFalse() {
        return IS_FALSE;
    }

    protected String getIsNotFalse() {
        return IS_NOT_FALSE;
    }

    protected String getEQ() {
        return EQ;
    }

    protected String getNEQ() {
        return NEQ;
    }

    protected String getGT() {
        return GT;
    }

    protected String getLTEQ() {
        return LTEQ;
    }

    protected String getGTEQ() {
        return GTEQ;
    }

    protected String getLT() {
        return LT;
    }

    protected String getLike() {
        return LIKE;
    }

    protected String getNotLike() {
        return NOT_LIKE;
    }

    @Override
    public String getLikeSingle() {
        return LIKE_SINGLE;
    }

    @Override
    public String getLikeString() {
        return LIKE_STRING;
    }

    protected String getIn() {
        return IN;
    }

    protected String getNotIn() {
        return NOT_IN;
    }

    protected String getIsNullOr() {
        return IS_NULL_OR;
    }

    protected String getExists() {
        return EXISTS;
    }

    protected String getNotExists() {
        return NOT_EXISTS;
    }

    protected String getAscending() {
        return ASCENDING;
    }

    protected String getDescending() {
        return DESCENDING;
    }

    @Override
    public String getString(Object obj) {
        if (obj == null) {
            return null;
        } else if (obj instanceof String) {
            return obj.toString();
        } else if (obj instanceof Integer) {
            return obj.toString();
        } else if (obj instanceof Long) {
            return obj.toString();
        } else if (obj instanceof BigInteger) {
            return obj.toString();
        } else if (obj instanceof BigDecimal) {
            return obj.toString();
        } else if (obj instanceof Boolean) {
            return obj.toString();
        } else if (obj instanceof Date) {
            return new DateTime(obj).toString("yyyy-MM-dd");
        } else if (obj instanceof Time) {
            return new DateTime(obj).toString("HH:mm:ss");
        } else if (obj instanceof Timestamp || obj instanceof java.util.Date) {
            return new DateTime(obj).toString("yyyy-MM-dd HH:mm:ss");
        } else {
            return StrUtils.getStringSql(obj);
        }
    }

    @Override
    public String getStringDelimitado(Object obj) {
        String string = getString(obj);
        if (string == null) {
            return null;
        } else if (obj instanceof String) {
            return "'" + string + "'";
        } else if (obj instanceof Date) {
            return "'" + string + "'";
        } else if (obj instanceof Time) {
            return "'" + string + "'";
        } else if (obj instanceof Timestamp || obj instanceof java.util.Date) {
            return "'" + string + "'";
        } else {
            return StrUtils.getStringSqlDelimitado(obj);
        }
    }

    @Override
    public String getStringCriterioBusqueda(CriterioBusqueda criterio) {
        OperadorComEnumeration comparacion = criterio.getComparacion();
        if (comparacion == null) {
            return null;
        }
        String string = null;
        //      String columna = StringUtils.trimToNull(criterio.getColumna(dominio));
        String columna = StringUtils.trimToNull(criterio.getColumna());
        Object valor = criterio.getValor();
        if (columna == null) {
            if (valor != null && valor instanceof String) {
                String expresion = (String) valor;
                switch (comparacion) {
                case EXISTE:
                    string = getExists() + "(" + expresion + ")";
                    break;
                case NO_EXISTE:
                    string = getNotExists() + "(" + expresion + ")";
                    break;
                }
            }
            return string == null ? null : "(" + string.trim() + ")";
        }
        if (valor == null) {
            switch (comparacion) {
            case ES_NULO:
                string = columna + getIsNull();
                break;
            case NO_ES_NULO:
                string = columna + getIsNotNull();
                break;
            case ES_VERDADERO:
                string = columna + getIsTrue();
                break;
            case NO_ES_VERDADERO:
                string = columna + getIsNotTrue();
                break;
            case ES_FALSO:
                string = columna + getIsFalse();
                break;
            case NO_ES_FALSO:
                string = columna + getIsNotFalse();
                break;
            }
            return string == null ? null : "(" + string.trim() + ")";
        }
        switch (comparacion) {
        case ES_NULO:
            string = columna + getIsNull();
            break;
        case NO_ES_NULO:
            string = columna + getIsNotNull();
            break;
        case ES_VERDADERO:
            string = columna + getIsTrue();
            break;
        case NO_ES_VERDADERO:
            string = columna + getIsNotTrue();
            break;
        case ES_FALSO:
            string = columna + getIsFalse();
            break;
        case NO_ES_FALSO:
            string = columna + getIsNotFalse();
            break;
        case ES_IGUAL:
            string = columna + getEQ() + getStringDelimitado(valor);
            break;
        case NO_ES_IGUAL:
            string = columna + getNEQ() + getStringDelimitado(valor);
            break;
        case ES_MAYOR:
            string = columna + getGT() + getStringDelimitado(valor);
            break;
        case ES_MENOR_O_IGUAL:
            string = columna + getLTEQ() + getStringDelimitado(valor);
            break;
        case ES_MAYOR_O_IGUAL:
            string = columna + getGTEQ() + getStringDelimitado(valor);
            break;
        case ES_MENOR:
            string = columna + getLT() + getStringDelimitado(valor);
            break;
        case COMIENZA_POR:
            string = columna + getLike() + getStringDelimitado(getString(valor) + getLikeString());
            break;
        case NO_COMIENZA_POR:
            string = columna + getNotLike() + getStringDelimitado(getString(valor) + getLikeString());
            break;
        case CONTIENE:
            string = columna + getLike()
                    + getStringDelimitado(getLikeString() + getString(valor) + getLikeString());
            break;
        case NO_CONTIENE:
            string = columna + getNotLike()
                    + getStringDelimitado(getLikeString() + getString(valor) + getLikeString());
            break;
        case TERMINA_EN:
            string = columna + getLike() + getStringDelimitado(getLikeString() + getString(valor));
            break;
        case NO_TERMINA_EN:
            string = columna + getNotLike() + getStringDelimitado(getLikeString() + getString(valor));
            break;
        case ESTA_ENTRE:
            string = columna + getIn() + "(" + getString(valor) + ")";
            break;
        case NO_ESTA_ENTRE:
            string = columna + getNotIn() + "(" + getString(valor) + ")";
            break;
        case ES_NULO_O_ES_IGUAL:
            string = columna + getIsNullOr() + columna + getEQ() + getStringDelimitado(valor);
            break;
        case ES_NULO_O_NO_ES_IGUAL:
            string = columna + getIsNullOr() + columna + getNEQ() + getStringDelimitado(valor);
            break;
        case ES_NULO_O_ES_MAYOR:
            string = columna + getIsNullOr() + columna + getGT() + getStringDelimitado(valor);
            break;
        case ES_NULO_O_ES_MENOR_O_IGUAL:
            string = columna + getIsNullOr() + columna + getLTEQ() + getStringDelimitado(valor);
            break;
        case ES_NULO_O_ES_MAYOR_O_IGUAL:
            string = columna + getIsNullOr() + columna + getGTEQ() + getStringDelimitado(valor);
            break;
        case ES_NULO_O_ES_MENOR:
            string = columna + getIsNullOr() + columna + getLT() + getStringDelimitado(valor);
            break;
        case ES_NULO_O_COMIENZA_POR:
            string = columna + getIsNullOr() + columna + getLike()
                    + getStringDelimitado(getString(valor) + getLikeString());
            break;
        case ES_NULO_O_NO_COMIENZA_POR:
            string = columna + getIsNullOr() + columna + getNotLike()
                    + getStringDelimitado(getString(valor) + getLikeString());
            break;
        case ES_NULO_O_CONTIENE:
            string = columna + getIsNullOr() + columna + getLike()
                    + getStringDelimitado(getLikeString() + getString(valor) + getLikeString());
            break;
        case ES_NULO_O_NO_CONTIENE:
            string = columna + getIsNullOr() + columna + getNotLike()
                    + getStringDelimitado(getLikeString() + getString(valor) + getLikeString());
            break;
        case ES_NULO_O_TERMINA_EN:
            string = columna + getIsNullOr() + columna + getLike()
                    + getStringDelimitado(getLikeString() + getString(valor));
            break;
        case ES_NULO_O_NO_TERMINA_EN:
            string = columna + getIsNullOr() + columna + getNotLike()
                    + getStringDelimitado(getLikeString() + getString(valor));
            break;
        case ES_NULO_O_ESTA_ENTRE:
            string = columna + getIsNullOr() + columna + getIn() + "(" + getString(valor) + ")";
            break;
        case ES_NULO_O_NO_ESTA_ENTRE:
            string = columna + getIsNullOr() + columna + getNotIn() + "(" + getString(valor) + ")";
            break;
        }
        return StringUtils.isBlank(string) ? null : "(" + string.trim() + ")";
    }

    @Override
    public String getStringCriterioOrden(CriterioOrden criterio) {
        String columna = StringUtils.trimToNull(criterio.getColumna());
        if (columna == null) {
            return null;
        }
        if (EnumCriterioOrden.ORDEN_DESCENDENTE.equals(criterio.getOrden())) {
            return columna + " " + getDescending();
        } else {
            //          return columna + " " + getAscending();
            return columna;
        }
    }

    @Override
    public String getComandoSelect1(String comando) {
        if (StringUtils.isBlank(comando)) {
            return null;
        }
        int i = StringUtils.indexOfIgnoreCase(comando, " FROM ");
        if (i < 8) {
            return null;
        }
        int j = StringUtils.indexOfIgnoreCase(comando, " GROUP BY ");
        if (j < 0) {
            j = StringUtils.indexOfIgnoreCase(comando, " ORDER BY ");
        }
        if (j < 0) {
            j = comando.length();
        }
        String substring1 = comando.substring(i, j);
        return "SELECT 1" + substring1;
    }

    @Override
    public String getComandoSelect(String comando) {
        return getComandoSelect(comando, 0);
    }

    @Override
    public String getComandoSelect(String comando, int limite) {
        return checkClausulaCriterios(StringUtils.removeEnd(comando, ";"));
    }

    @Override
    public String checkClausulaCriterios(String string) {
        if (StringUtils.isBlank(string)) {
            return null;
        }
        String equ = getEQ().trim();
        String neq = getNEQ().trim();
        String nul = getNull().trim();
        String pdq;
        String chk = string.trim().replaceAll(" +", " ");
        String[] tokens = StringUtils.splitByCharacterTypeCamelCase(chk);
        for (int i = 0; i < tokens.length; i++) {
            pdq = tokens[i].equalsIgnoreCase(equ) ? getIsNull()
                    : tokens[i].equalsIgnoreCase(neq) ? getIsNotNull() : null;
            if (pdq == null) {
                continue;
            }
            for (int j = i + 1; j < tokens.length; j++) {
                if (StringUtils.isBlank(tokens[j])) {
                    continue;
                }
                if (tokens[j].equalsIgnoreCase(nul)) {
                    tokens[i] = pdq;
                    tokens[j] = "";
                }
                break;
            }
        }
        chk = StringUtils.join(tokens);
        chk = chk.replaceAll(" +", " ");
        chk = chk.replaceAll(" +[)]", ")");
        chk = chk.replaceAll("[(] +", "(");
        return chk;
    }

    @Override
    public String getNombreTabla(String tabla) {
        return StringUtils.stripToNull(tabla);
    }

    @Override
    public String getNombreFuncionAgregacion(TipoAgregacionEnumeration tipo) {
        if (tipo == null) {
            return null;
        }
        switch (tipo) {
        case CUENTA:
            return "COUNT";
        case MINIMO:
            return "MIN";
        case MAXIMO:
            return "MAX";
        case SUMA:
            return "SUM";
        case PROMEDIO:
            return "AVG";
        case DESVIACION:
            return "STDDEV";
        default:
            return "COUNT";
        }
    }

}