Java tutorial
/* * 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"; } } }