package com.megatim.fdxcommons.tools.database.queries.jpql; 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 com.megatim.fdxcommons.tools.database.exceptions.BadQueryCriteriaException; import com.megatim.fdxcommons.tools.database.queries.metadata.jpql.JpqlQueryCriterion; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; /** * * @author lenovo */ public class JpqlWhereQueryString { private final JpqlQueryCriterion queryCriterion; private final String classAlias; private final AtomicInteger rang = new AtomicInteger(1); public JpqlWhereQueryString(JpqlQueryCriterion queryCriterion, String classAlias) { this.queryCriterion = queryCriterion; this.classAlias = classAlias; } public String query() throws BadQueryCriteriaException { StringBuilder query = new StringBuilder(""); if (queryCriterion != null) { query .append(" WHERE ") .append(buildQuery(queryCriterion)); } return query.toString(); } private String buildQuery(JpqlQueryCriterion criterion) throws BadQueryCriteriaException { 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(); if (criteriaLogicConnector == null) { throw new BadQueryCriteriaException("Critère non valide : Connecteur logique absent"); } int size = criterion.getSubCriteria().size(); int index = 0; for (JpqlQueryCriterion 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(JpqlQueryCriterion criterion) { StringBuilder query = new StringBuilder(""); query .append(classAlias) .append(".") .append(criterion.getNomColonne()) .append(" ") .append(criterion.getOperateur().getValue()); return query.toString(); } private String buildQueryWithSingleParameter(JpqlQueryCriterion criterion) { StringBuilder query = new StringBuilder(""); if (criterion.getOperateur().equals(Operateur.LIKE)) { query .append("LOWER(") .append(classAlias) .append(".") .append(criterion.getNomColonne()) .append(") LIKE LOWER(?") .append(rang.getAndIncrement()) .append(")"); } else { query .append(classAlias) .append(".") .append(criterion.getNomColonne()) .append(" ") .append(criterion.getOperateur().getValue()) .append(" ?") .append(rang.getAndIncrement()) .append(" "); } return query.toString(); } private String buildBetweenQuery(JpqlQueryCriterion criterion) { StringBuilder query = new StringBuilder(""); query .append(classAlias) .append(".") .append(criterion.getNomColonne()) .append(" ") .append(criterion.getOperateur().getValue()) .append(" ?") .append(rang.getAndIncrement()) .append(" AND ") .append(" ?") .append(rang.getAndIncrement()) .append(" "); return query.toString(); } private String buildQueryWithMultipleParameters(JpqlQueryCriterion criterion) { StringBuilder query = new StringBuilder(""); query .append(classAlias) .append(".") .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("?").append(rang.getAndIncrement()).append(", "); } else { query.append("?").append(rang.getAndIncrement()); } } query.append(")"); return query.toString(); } }