package com.megatim.fdxcommons.tools.database.queries; import com.megatim.fdxcommons.tools.database.queries.metadata.QueryCriterion; import com.megatim.fdxcommons.model.enumeration.CriteriaLogicConnector; import com.megatim.fdxcommons.model.enumeration.Operateur; import static com.megatim.fdxcommons.model.enumeration.Operateur.BETWEEN; import static com.megatim.fdxcommons.model.enumeration.Operateur.EQUALS; import static com.megatim.fdxcommons.model.enumeration.Operateur.GREATER_OR_EQUALS_THAN; import static com.megatim.fdxcommons.model.enumeration.Operateur.GREATER_THAN; import static com.megatim.fdxcommons.model.enumeration.Operateur.IN; import static com.megatim.fdxcommons.model.enumeration.Operateur.IS_NOT_NULL; import static com.megatim.fdxcommons.model.enumeration.Operateur.IS_NULL; import static com.megatim.fdxcommons.model.enumeration.Operateur.LIKE; import static com.megatim.fdxcommons.model.enumeration.Operateur.LOWER_OR_EQUALS_THAN; import static com.megatim.fdxcommons.model.enumeration.Operateur.LOWER_THAN; import static com.megatim.fdxcommons.model.enumeration.Operateur.NOT_BETWEEN; import static com.megatim.fdxcommons.model.enumeration.Operateur.NOT_EQUALS; import static com.megatim.fdxcommons.model.enumeration.Operateur.NOT_IN; import java.util.List; /** * * @author Gabuntu */ public class WhereQueryString { private final QueryCriterion queryCriterion; public WhereQueryString(QueryCriterion queryCriterion) { this.queryCriterion = queryCriterion; } public String query() { StringBuilder query = new StringBuilder(""); if (queryCriterion != null) { query .append(" WHERE ") .append(buildQuery(queryCriterion)); } return query.toString(); } private String buildQuery(QueryCriterion criterion) { StringBuilder query = new StringBuilder(); if (criterion.getSubCriteria().isEmpty()) { switch (criterion.getOperateur()) { case EQUALS: case NOT_EQUALS: case LIKE: case GREATER_OR_EQUALS_THAN: case GREATER_THAN: case LOWER_OR_EQUALS_THAN: case LOWER_THAN: query.append(buildQueryWithSingleParameter(criterion)); break; case BETWEEN: case NOT_BETWEEN: query.append(buildBetweenQuery(criterion)); break; case IS_NOT_NULL: case IS_NULL: query.append(buildQueryWithoutParameter(criterion)); break; case NOT_IN: case IN: query.append(buildQueryWithMultipleParameters(criterion)); break; } } else { CriteriaLogicConnector criteriaLogicConnector = criterion.getCriteriaLogicConnector(); int size = criterion.getSubCriteria().size(); int index = 0; for (QueryCriterion c : criterion.getSubCriteria()) { query .append("(") .append(buildQuery(c)) .append(")"); if ((++index) < size) { query.append(criteriaLogicConnector.equals(CriteriaLogicConnector.AND) ? " AND " : " OR "); } } } return query.toString(); } private String buildQueryWithoutParameter(QueryCriterion criterion) { StringBuilder query = new StringBuilder(""); query .append(criterion.getNomColonne()) .append(" ") .append(criterion.getOperateur().getValue()); return query.toString(); } private String buildQueryWithSingleParameter(QueryCriterion criterion) { StringBuilder query = new StringBuilder(""); if (criterion.getOperateur().equals(Operateur.LIKE)) { query .append("LOWER(") .append(criterion.getNomColonne()) .append(") LIKE LOWER(?)"); } else { query .append(criterion.getNomColonne()) .append(" ") .append(criterion.getOperateur().getValue()) .append(" ?"); } return query.toString(); } private String buildBetweenQuery(QueryCriterion criterion) { StringBuilder query = new StringBuilder(""); query .append(criterion.getNomColonne()) .append(" ") .append(criterion.getOperateur().getValue()) .append(" ? ") .append(" AND ") .append(" ? "); return query.toString(); } private String buildQueryWithMultipleParameters(QueryCriterion criterion) { StringBuilder query = new StringBuilder(""); query .append(criterion.getNomColonne()) .append(" ") .append(criterion.getOperateur().getValue()) .append("("); List values = (List) criterion.getCriteriaValue(); int size = values.size(); for (int i = 0; i < size; i++) { if ((i + 1) < size) { query.append("?,"); } else { query.append("?"); } } query.append(")"); return query.toString(); } }