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();
|
}
|
}
|