Search in sources :

Example 6 with QueryStringWithParameters

use of com.manydesigns.elements.text.QueryStringWithParameters in project Portofino by ManyDesigns.

the class ManyToManyAction method loadAssociations.

protected void loadAssociations() throws NoSuchFieldException {
    Table table = m2mConfiguration.getActualRelationTable();
    TableCriteria criteria = new TableCriteria(table);
    // TODO chiave multipla
    String onePropertyName = m2mConfiguration.getActualOnePropertyName();
    PropertyAccessor onePropertyAccessor = relationTableAccessor.getProperty(onePropertyName);
    // TODO chiave multipla
    SelectionProviderReference manySelectionProvider = m2mConfiguration.getManySelectionProvider();
    String manyPropertyName = manySelectionProvider.getActualSelectionProvider().getReferences().get(0).getActualFromColumn().getActualPropertyName();
    PropertyAccessor manyPropertyAccessor = relationTableAccessor.getProperty(manyPropertyName);
    criteria = criteria.eq(onePropertyAccessor, onePk);
    QueryStringWithParameters queryString;
    try {
        queryString = QueryUtils.mergeQuery(m2mConfiguration.getQuery(), criteria, this);
    } catch (RuntimeException e) {
        RequestMessages.addErrorMessage("Invalid query");
        throw e;
    }
    existingAssociations = QueryUtils.runHqlQuery(session, queryString.getQueryString(), queryString.getParameters());
    availableAssociations = new ArrayList<Object>();
    String databaseName = ((DatabaseSelectionProvider) manySelectionProvider.getActualSelectionProvider()).getToDatabase();
    String hql = ((DatabaseSelectionProvider) manySelectionProvider.getActualSelectionProvider()).getHql();
    if (!StringUtils.isEmpty(hql)) {
        Session selectionProviderSession = persistence.getSession(databaseName);
        QueryStringWithParameters manyQuery = QueryUtils.mergeQuery(hql, null, this);
        potentiallyAvailableAssociations = QueryUtils.runHqlQuery(selectionProviderSession, manyQuery.getQueryString(), manyQuery.getParameters());
    } else {
        throw new RuntimeException("Couldn't determine many query");
    }
    PropertyAccessor[] manyKeyProperties = manyTableAccessor.getKeyProperties();
    // TODO handle manyKeyProperties.length > 1
    PropertyAccessor manyPkAccessor = manyTableAccessor.getProperty(manyKeyProperties[0].getName());
    for (Object o : potentiallyAvailableAssociations) {
        Object oPk = manyPkAccessor.get(o);
        boolean existing = isExistingAssociation(manyPropertyAccessor, oPk);
        if (!existing) {
            availableAssociations.add(o);
        }
    }
}
Also used : PropertyAccessor(com.manydesigns.elements.reflection.PropertyAccessor) TableCriteria(com.manydesigns.portofino.persistence.TableCriteria) SelectionProviderReference(com.manydesigns.portofino.resourceactions.m2m.configuration.SelectionProviderReference) QueryStringWithParameters(com.manydesigns.elements.text.QueryStringWithParameters) JSONObject(org.json.JSONObject) Session(org.hibernate.Session)

Example 7 with QueryStringWithParameters

use of com.manydesigns.elements.text.QueryStringWithParameters 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

QueryStringWithParameters (com.manydesigns.elements.text.QueryStringWithParameters)7 TableCriteria (com.manydesigns.portofino.persistence.TableCriteria)3 TableAccessor (com.manydesigns.portofino.reflection.TableAccessor)3 Session (org.hibernate.Session)3 ShortName (com.manydesigns.elements.annotations.ShortName)2 PropertyAccessor (com.manydesigns.elements.reflection.PropertyAccessor)2 OgnlTextFormat (com.manydesigns.elements.text.OgnlTextFormat)2 TextFormat (com.manydesigns.elements.text.TextFormat)2 JSQLParserException (net.sf.jsqlparser.JSQLParserException)2 HashMultimap (com.google.common.collect.HashMultimap)1 Multimap (com.google.common.collect.Multimap)1 ElementsThreadLocals (com.manydesigns.elements.ElementsThreadLocals)1 Criterion (com.manydesigns.elements.fields.search.Criterion)1 com.manydesigns.elements.options (com.manydesigns.elements.options)1 OgnlHqlFormat (com.manydesigns.elements.text.OgnlHqlFormat)1 OgnlSqlFormat (com.manydesigns.elements.text.OgnlSqlFormat)1 SelectionProviderLogic (com.manydesigns.portofino.logic.SelectionProviderLogic)1 Model (com.manydesigns.portofino.model.Model)1 com.manydesigns.portofino.model.database (com.manydesigns.portofino.model.database)1 Persistence (com.manydesigns.portofino.persistence.Persistence)1