Search in sources :

Example 1 with Criterion

use of com.manydesigns.elements.fields.search.Criterion in project Portofino by ManyDesigns.

the class QueryUtils method getQueryStringWithParametersForCriteria.

/**
 * Tranforms a {@link TableCriteria} to a query string with an associated array of parameters.
 * @param criteria the criteria.
 * @param alias the alias to use for the main entity.
 * @return the same criteria encoded as a HQL query with parameters.
 */
public static QueryStringWithParameters getQueryStringWithParametersForCriteria(@Nullable TableCriteria criteria, @Nullable String alias, int initialParameterIndex) {
    if (criteria == null) {
        return new QueryStringWithParameters("", new Object[0]);
    }
    Table table = criteria.getTable();
    ArrayList<Object> parametersList = new ArrayList<Object>();
    StringBuilder whereBuilder = new StringBuilder();
    for (Criterion criterion : criteria) {
        PropertyAccessor accessor = criterion.getPropertyAccessor();
        String hqlFormat;
        if (criterion instanceof TableCriteria.EqCriterion) {
            TableCriteria.EqCriterion eqCriterion = (TableCriteria.EqCriterion) criterion;
            Object value = eqCriterion.getValue();
            hqlFormat = "{0} = :p" + (parametersList.size() + initialParameterIndex);
            parametersList.add(value);
        } else if (criterion instanceof TableCriteria.InCriterion) {
            TableCriteria.InCriterion inCriterion = (TableCriteria.InCriterion) criterion;
            Object[] values = inCriterion.getValues();
            StringBuilder params = new StringBuilder();
            if (values != null) {
                boolean first = true;
                for (Object value : values) {
                    if (!first) {
                        params.append(", :p").append(parametersList.size() + initialParameterIndex);
                    } else {
                        params.append(":p").append(parametersList.size() + initialParameterIndex);
                        first = false;
                    }
                    parametersList.add(value);
                }
                hqlFormat = "{0} in (" + params + ")";
            } else {
                hqlFormat = null;
            }
        } else if (criterion instanceof TableCriteria.NeCriterion) {
            TableCriteria.NeCriterion neCriterion = (TableCriteria.NeCriterion) criterion;
            Object value = neCriterion.getValue();
            hqlFormat = "{0} <> :p" + (parametersList.size() + initialParameterIndex);
            parametersList.add(value);
        } else if (criterion instanceof TableCriteria.BetweenCriterion) {
            TableCriteria.BetweenCriterion betweenCriterion = (TableCriteria.BetweenCriterion) criterion;
            Object min = betweenCriterion.getMin();
            Object max = betweenCriterion.getMax();
            hqlFormat = "{0} >= :p" + (parametersList.size() + initialParameterIndex) + " AND {0} <= :p" + (parametersList.size() + initialParameterIndex + 1);
            parametersList.add(min);
            parametersList.add(max);
        } else if (criterion instanceof TableCriteria.GtCriterion) {
            TableCriteria.GtCriterion gtCriterion = (TableCriteria.GtCriterion) criterion;
            Object value = gtCriterion.getValue();
            hqlFormat = "{0} > :p" + (parametersList.size() + initialParameterIndex);
            parametersList.add(value);
        } else if (criterion instanceof TableCriteria.GeCriterion) {
            TableCriteria.GeCriterion gtCriterion = (TableCriteria.GeCriterion) criterion;
            Object value = gtCriterion.getValue();
            hqlFormat = "{0} >= :p" + (parametersList.size() + initialParameterIndex);
            parametersList.add(value);
        } else if (criterion instanceof TableCriteria.LtCriterion) {
            TableCriteria.LtCriterion ltCriterion = (TableCriteria.LtCriterion) criterion;
            Object value = ltCriterion.getValue();
            hqlFormat = "{0} < :p" + (parametersList.size() + initialParameterIndex);
            parametersList.add(value);
        } else if (criterion instanceof TableCriteria.LeCriterion) {
            TableCriteria.LeCriterion leCriterion = (TableCriteria.LeCriterion) criterion;
            Object value = leCriterion.getValue();
            hqlFormat = "{0} <= :p" + (parametersList.size() + initialParameterIndex);
            parametersList.add(value);
        } else if (criterion instanceof TableCriteria.LikeCriterion) {
            TableCriteria.LikeCriterion likeCriterion = (TableCriteria.LikeCriterion) criterion;
            String value = (String) likeCriterion.getValue();
            if (likeCriterion.getTextMatchMode() == TextMatchMode.EQUALS) {
                hqlFormat = "{0} = :p" + (parametersList.size() + initialParameterIndex);
                parametersList.add(value);
            } else {
                String pattern = processTextMatchMode(likeCriterion.getTextMatchMode(), value);
                hqlFormat = "{0} like :p" + (parametersList.size() + initialParameterIndex);
                parametersList.add(pattern);
            }
        } else if (criterion instanceof TableCriteria.IlikeCriterion) {
            TableCriteria.IlikeCriterion ilikeCriterion = (TableCriteria.IlikeCriterion) criterion;
            String value = (String) ilikeCriterion.getValue();
            if (ilikeCriterion.getTextMatchMode() == TextMatchMode.EQUALS) {
                hqlFormat = "lower({0}) = lower(:p" + (parametersList.size() + initialParameterIndex + ")");
                parametersList.add(value);
            } else {
                String pattern = processTextMatchMode(ilikeCriterion.getTextMatchMode(), value);
                hqlFormat = "lower({0}) like lower(:p" + (parametersList.size() + initialParameterIndex) + ")";
                parametersList.add(pattern);
            }
        } else if (criterion instanceof TableCriteria.IsNullCriterion) {
            hqlFormat = "{0} is null";
        } else if (criterion instanceof TableCriteria.IsNotNullCriterion) {
            hqlFormat = "{0} is not null";
        } else {
            logger.error("Unrecognized criterion: {}", criterion);
            throw new InternalError("Unrecognied criterion");
        }
        if (hqlFormat == null) {
            continue;
        }
        String accessorName = accessor.getName();
        if (alias != null) {
            accessorName = alias + "." + accessorName;
        }
        String hql = MessageFormat.format(hqlFormat, accessorName);
        if (whereBuilder.length() > 0) {
            whereBuilder.append(" AND ");
        }
        whereBuilder.append(hql);
    }
    String whereClause = whereBuilder.toString();
    String queryString;
    String actualEntityName = table.getActualEntityName();
    if (alias != null) {
        actualEntityName += " " + alias;
    }
    if (whereClause.length() > 0) {
        queryString = MessageFormat.format("FROM {0}" + WHERE_STRING + "{1}", actualEntityName, whereClause);
    } else {
        queryString = MessageFormat.format("FROM {0}", actualEntityName);
    }
    Object[] parameters = new Object[parametersList.size()];
    parametersList.toArray(parameters);
    return new QueryStringWithParameters(queryString, parameters);
}
Also used : QueryStringWithParameters(com.manydesigns.elements.text.QueryStringWithParameters) Criterion(com.manydesigns.elements.fields.search.Criterion) PropertyAccessor(com.manydesigns.elements.reflection.PropertyAccessor)

Aggregations

Criterion (com.manydesigns.elements.fields.search.Criterion)1 PropertyAccessor (com.manydesigns.elements.reflection.PropertyAccessor)1 QueryStringWithParameters (com.manydesigns.elements.text.QueryStringWithParameters)1