Search in sources :

Example 1 with QueryStringWithParameters

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

the class CrudAction method calculateTotalSearchRecords.

protected long calculateTotalSearchRecords() {
    TableCriteria criteria = new TableCriteria(baseTable);
    if (searchForm != null) {
        searchForm.configureCriteria(criteria);
    }
    QueryStringWithParameters query = QueryUtils.mergeQuery(getBaseQuery(), criteria, this);
    String queryString = query.getQueryString();
    String totalRecordsQueryString;
    try {
        totalRecordsQueryString = generateCountQuery(queryString);
    } catch (JSQLParserException e) {
        throw new Error(e);
    }
    // TODO gestire count non disponibile (totalRecordsQueryString == null)
    List<Object> result = QueryUtils.runHqlQuery(session, totalRecordsQueryString, query.getParameters());
    return totalSearchRecords = ((Number) result.get(0)).longValue();
}
Also used : QueryStringWithParameters(com.manydesigns.elements.text.QueryStringWithParameters) TableCriteria(com.manydesigns.portofino.persistence.TableCriteria) JSQLParserException(net.sf.jsqlparser.JSQLParserException)

Example 2 with QueryStringWithParameters

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

the class ModelSelectionProviderSupport method createHQLOptionProvider.

protected OptionProvider createHQLOptionProvider(DatabaseSelectionProvider selectionProvider, String name, String databaseName, String hql) {
    Database database = DatabaseLogic.findDatabaseByName(persistence.getModel(), databaseName);
    Table table = QueryUtils.getTableFromQueryString(database, hql);
    if (table == null) {
        logger.error("Selection provider {} has a HQL query that " + "refers to an entity that does not exist ({})", name, hql);
        return null;
    }
    return new MemoizingOptionProvider(() -> {
        String entityName = table.getActualEntityName();
        Session session = persistence.getSession(databaseName);
        QueryStringWithParameters queryWithParameters = QueryUtils.mergeQuery(hql, null, this);
        Collection<Object> objects = getFromQueryCache(selectionProvider, queryWithParameters);
        if (objects == null) {
            String queryString = queryWithParameters.getQueryString();
            Object[] parameters = queryWithParameters.getParameters();
            logger.debug("Query not in cache: {}", queryString);
            try {
                objects = QueryUtils.runHqlQuery(session, queryString, parameters);
            } catch (Exception e) {
                logger.error("Exception in populating selection provider " + name, e);
                return null;
            }
            putInQueryCache(selectionProvider, queryWithParameters, objects);
        }
        TableAccessor tableAccessor = persistence.getTableAccessor(databaseName, entityName);
        ShortName shortNameAnnotation = tableAccessor.getAnnotation(ShortName.class);
        TextFormat[] textFormats = null;
        // L'ordinamento e' usato solo in caso di chiave singola
        if (shortNameAnnotation != null && tableAccessor.getKeyProperties().length == 1) {
            textFormats = new TextFormat[] { OgnlTextFormat.create(shortNameAnnotation.value()) };
        }
        final TextFormat[] actualTextFormats = textFormats;
        Stream<OptionProvider.Option> optionStream = objects.stream().map(o -> SelectionProviderLogic.getOption(name, tableAccessor.getKeyProperties(), actualTextFormats, o));
        if (selectionProvider instanceof ForeignKey) {
            optionStream = optionStream.sorted(DefaultSelectionProvider.OPTION_COMPARATOR_BY_LABEL);
        }
        return optionStream.collect(Collectors.toList());
    });
}
Also used : ShortName(com.manydesigns.elements.annotations.ShortName) QueryStringWithParameters(com.manydesigns.elements.text.QueryStringWithParameters) TableAccessor(com.manydesigns.portofino.reflection.TableAccessor) TextFormat(com.manydesigns.elements.text.TextFormat) OgnlTextFormat(com.manydesigns.elements.text.OgnlTextFormat) Session(org.hibernate.Session)

Example 3 with QueryStringWithParameters

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

the class QueryUtils method mergeQuery.

/**
 * Merges a HQL query string with a {@link TableCriteria} object representing a search. The query string
 * is processed with an {@link OgnlSqlFormat}, so it can access values from the OGNL context, as well as
 * from an (optional) rootFactory object.
 * @param queryString the base query
 * @param criteria the criteria to merge with the query
 * @param rootObject the OGNL rootFactory object (can be null)
 * @return the merged query
 */
public static QueryStringWithParameters mergeQuery(String queryString, @Nullable TableCriteria criteria, Object rootObject) {
    OgnlHqlFormat hqlFormat = OgnlHqlFormat.create(queryString);
    String formatString = hqlFormat.getFormatString();
    Object[] parameters = hqlFormat.evaluateOgnlExpressions(rootObject);
    CCJSqlParserManager parserManager = new CCJSqlParserManager();
    PlainSelect parsedQueryString;
    PlainSelect parsedCriteriaQuery;
    try {
        parsedQueryString = parseQuery(parserManager, formatString);
    } catch (JSQLParserException e) {
        throw new RuntimeException("Couldn't merge query", e);
    }
    Alias mainEntityAlias = null;
    if (criteria != null) {
        mainEntityAlias = getEntityAlias(criteria.getTable().getActualEntityName(), parsedQueryString);
    }
    QueryStringWithParameters criteriaQuery = getQueryStringWithParametersForCriteria(criteria, mainEntityAlias != null ? mainEntityAlias.getName() : null, parameters.length + 1);
    String criteriaQueryString = criteriaQuery.getQueryString();
    Object[] criteriaParameters = criteriaQuery.getParameters();
    try {
        if (StringUtils.isEmpty(criteriaQueryString)) {
            parsedCriteriaQuery = new PlainSelect();
        } else {
            parsedCriteriaQuery = parseQuery(parserManager, criteriaQueryString);
        }
    } catch (JSQLParserException e) {
        throw new RuntimeException("Couldn't merge query", e);
    }
    Expression whereExpression;
    if (parsedQueryString.getWhere() != null) {
        if (parsedCriteriaQuery.getWhere() != null) {
            whereExpression = parsedQueryString.getWhere();
            if (!(whereExpression instanceof Parenthesis)) {
                whereExpression = new Parenthesis(whereExpression);
            }
            whereExpression = new AndExpression(whereExpression, parsedCriteriaQuery.getWhere());
        } else {
            whereExpression = parsedQueryString.getWhere();
        }
    } else {
        whereExpression = parsedCriteriaQuery.getWhere();
    }
    parsedQueryString.setWhere(whereExpression);
    if (criteria != null && criteria.getOrderBy() != null) {
        List orderByElements = new ArrayList();
        OrderByElement orderByElement = new OrderByElement();
        orderByElement.setAsc(criteria.getOrderBy().isAsc());
        String propertyName = criteria.getOrderBy().getPropertyAccessor().getName();
        if (mainEntityAlias != null) {
            propertyName = mainEntityAlias.getName() + "." + propertyName;
        }
        orderByElement.setExpression(new net.sf.jsqlparser.schema.Column(new net.sf.jsqlparser.schema.Table(), propertyName));
        orderByElements.add(orderByElement);
        if (parsedQueryString.getOrderByElements() != null) {
            for (Object el : parsedQueryString.getOrderByElements()) {
                OrderByElement toAdd = (OrderByElement) el;
                if (toAdd.getExpression() instanceof net.sf.jsqlparser.schema.Column) {
                    net.sf.jsqlparser.schema.Column column = (net.sf.jsqlparser.schema.Column) toAdd.getExpression();
                    if (StringUtils.isEmpty(column.getTable().getName()) && propertyName.equals(column.getColumnName())) {
                        // do not add
                        continue;
                    }
                }
                orderByElements.add(toAdd);
            }
        }
        parsedQueryString.setOrderByElements(orderByElements);
    }
    String fullQueryString = parsedQueryString.toString();
    if (fullQueryString.toLowerCase().startsWith(FAKE_SELECT_PREFIX)) {
        fullQueryString = fullQueryString.substring(FAKE_SELECT_PREFIX.length());
    }
    // merge the parameters
    ArrayList<Object> mergedParametersList = new ArrayList<Object>();
    mergedParametersList.addAll(Arrays.asList(parameters));
    mergedParametersList.addAll(Arrays.asList(criteriaParameters));
    Object[] mergedParameters = new Object[mergedParametersList.size()];
    mergedParametersList.toArray(mergedParameters);
    return new QueryStringWithParameters(fullQueryString, mergedParameters);
}
Also used : JSQLParserException(net.sf.jsqlparser.JSQLParserException) Parenthesis(net.sf.jsqlparser.expression.Parenthesis) AndExpression(net.sf.jsqlparser.expression.operators.conditional.AndExpression) QueryStringWithParameters(com.manydesigns.elements.text.QueryStringWithParameters) AndExpression(net.sf.jsqlparser.expression.operators.conditional.AndExpression) Expression(net.sf.jsqlparser.expression.Expression) OgnlHqlFormat(com.manydesigns.elements.text.OgnlHqlFormat) Alias(net.sf.jsqlparser.expression.Alias) CCJSqlParserManager(net.sf.jsqlparser.parser.CCJSqlParserManager)

Example 4 with QueryStringWithParameters

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

the class QueryUtilsTest method testMergeQueryWithAlias.

public void testMergeQueryWithAlias() throws NoSuchFieldException {
    Model model = new Model();
    Database database = new Database();
    database.setDatabaseName("db");
    model.getDatabases().add(database);
    Schema schema = new Schema(database);
    schema.setSchemaName("schema");
    database.getSchemas().add(schema);
    Table table = new Table(schema);
    table.setTableName("test_table");
    schema.getTables().add(table);
    Column column = new Column(table);
    column.setColumnName("column1");
    column.setColumnType("varchar");
    column.setLength(10);
    column.setScale(0);
    table.getColumns().add(column);
    PrimaryKey primaryKey = new PrimaryKey(table);
    PrimaryKeyColumn pkColumn = new PrimaryKeyColumn(primaryKey);
    primaryKey.getPrimaryKeyColumns().add(pkColumn);
    pkColumn.setColumnName("column1");
    table.setPrimaryKey(primaryKey);
    model.init(new PropertiesConfiguration());
    TableAccessor tableAccessor = new TableAccessor(table);
    TableCriteria criteria = new TableCriteria(table);
    criteria.eq(tableAccessor.getProperty("column1"), "123");
    // W/o select
    QueryStringWithParameters queryStringWithParameters = QueryUtils.mergeQuery("from test_table t", criteria, null);
    assertEquals("FROM test_table t WHERE t.column1 = :p1", queryStringWithParameters.getQueryString());
    queryStringWithParameters = QueryUtils.mergeQuery("from test_table t where t.foo = 1", criteria, null);
    assertEquals("FROM test_table t WHERE (t.foo = 1) AND t.column1 = :p1", queryStringWithParameters.getQueryString());
    queryStringWithParameters = QueryUtils.mergeQuery("from test_table t, other where t.foo = other.bar", criteria, null);
    assertEquals("FROM test_table t, other WHERE (t.foo = other.bar) AND t.column1 = :p1", queryStringWithParameters.getQueryString());
    queryStringWithParameters = QueryUtils.mergeQuery("from test_table t, other x where t.foo = x.bar", criteria, null);
    assertEquals("FROM test_table t, other x WHERE (t.foo = x.bar) AND t.column1 = :p1", queryStringWithParameters.getQueryString());
    // W/select
    queryStringWithParameters = QueryUtils.mergeQuery("select t from test_table t", criteria, null);
    assertEquals("SELECT t FROM test_table t WHERE t.column1 = :p1", queryStringWithParameters.getQueryString());
    queryStringWithParameters = QueryUtils.mergeQuery("select t from test_table t where t.foo = 1", criteria, null);
    assertEquals("SELECT t FROM test_table t WHERE (t.foo = 1) AND t.column1 = :p1", queryStringWithParameters.getQueryString());
    queryStringWithParameters = QueryUtils.mergeQuery("select t from test_table t, other where t.foo = other.bar", criteria, null);
    assertEquals("SELECT t FROM test_table t, other WHERE (t.foo = other.bar) AND t.column1 = :p1", queryStringWithParameters.getQueryString());
    queryStringWithParameters = QueryUtils.mergeQuery("select t from test_table t, other x where t.foo = x.bar", criteria, null);
    assertEquals("SELECT t FROM test_table t, other x WHERE (t.foo = x.bar) AND t.column1 = :p1", queryStringWithParameters.getQueryString());
    // W/multiple select
    queryStringWithParameters = QueryUtils.mergeQuery("select t, u from test_table t", criteria, null);
    assertEquals("SELECT t, u FROM test_table t WHERE t.column1 = :p1", queryStringWithParameters.getQueryString());
    queryStringWithParameters = QueryUtils.mergeQuery("select t, u from test_table t where t.foo = 1", criteria, null);
    assertEquals("SELECT t, u FROM test_table t WHERE (t.foo = 1) AND t.column1 = :p1", queryStringWithParameters.getQueryString());
    queryStringWithParameters = QueryUtils.mergeQuery("select t, u from test_table t, other where t.foo = other.bar", criteria, null);
    assertEquals("SELECT t, u FROM test_table t, other WHERE (t.foo = other.bar) AND t.column1 = :p1", queryStringWithParameters.getQueryString());
    queryStringWithParameters = QueryUtils.mergeQuery("select t, u from test_table t, other x where t.foo = x.bar", criteria, null);
    assertEquals("SELECT t, u FROM test_table t, other x WHERE (t.foo = x.bar) AND t.column1 = :p1", queryStringWithParameters.getQueryString());
}
Also used : TableAccessor(com.manydesigns.portofino.reflection.TableAccessor) QueryStringWithParameters(com.manydesigns.elements.text.QueryStringWithParameters) TableCriteria(com.manydesigns.portofino.persistence.TableCriteria) Model(com.manydesigns.portofino.model.Model) PropertiesConfiguration(org.apache.commons.configuration2.PropertiesConfiguration)

Example 5 with QueryStringWithParameters

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

the class ModelSelectionProviderSupport method createSQLOptionProvider.

@NotNull
protected OptionProvider createSQLOptionProvider(DatabaseSelectionProvider selectionProvider, Class[] fieldTypes, String name, String databaseName, String sql) {
    return new MemoizingOptionProvider(() -> {
        Session session = persistence.getSession(databaseName);
        OgnlSqlFormat sqlFormat = OgnlSqlFormat.create(sql);
        String formatString = sqlFormat.getFormatString();
        Object[] parameters = sqlFormat.evaluateOgnlExpressions(this);
        QueryStringWithParameters cacheKey = new QueryStringWithParameters(formatString, parameters);
        Collection<Object[]> objects = getFromQueryCache(selectionProvider, cacheKey);
        if (objects == null) {
            logger.debug("Query not in cache: {}", formatString);
            try {
                objects = QueryUtils.runSql(session, formatString, parameters);
            } catch (Exception e) {
                logger.error("Exception in populating selection provider " + name, e);
                return null;
            }
            putInQueryCache(selectionProvider, cacheKey, objects);
        }
        return objects.stream().map(o -> SelectionProviderLogic.getOption(fieldTypes, o)).collect(Collectors.toList());
    });
}
Also used : Persistence(com.manydesigns.portofino.persistence.Persistence) StringUtils(org.apache.commons.lang.StringUtils) java.util(java.util) QueryStringWithParameters(com.manydesigns.elements.text.QueryStringWithParameters) LoggerFactory(org.slf4j.LoggerFactory) Session(org.hibernate.Session) Multimap(com.google.common.collect.Multimap) ShortName(com.manydesigns.elements.annotations.ShortName) HashMultimap(com.google.common.collect.HashMultimap) ElementsThreadLocals(com.manydesigns.elements.ElementsThreadLocals) TableAccessor(com.manydesigns.portofino.reflection.TableAccessor) TextFormat(com.manydesigns.elements.text.TextFormat) OgnlTextFormat(com.manydesigns.elements.text.OgnlTextFormat) OgnlSqlFormat(com.manydesigns.elements.text.OgnlSqlFormat) SelectionProviderReference(com.manydesigns.portofino.resourceactions.crud.configuration.database.SelectionProviderReference) QueryUtils(com.manydesigns.portofino.persistence.QueryUtils) Logger(org.slf4j.Logger) com.manydesigns.elements.options(com.manydesigns.elements.options) com.manydesigns.portofino.model.database(com.manydesigns.portofino.model.database) CrudProperty(com.manydesigns.portofino.resourceactions.crud.configuration.CrudProperty) Collectors(java.util.stream.Collectors) Nullable(org.jetbrains.annotations.Nullable) Stream(java.util.stream.Stream) SelectionProviderLogic(com.manydesigns.portofino.logic.SelectionProviderLogic) NotNull(org.jetbrains.annotations.NotNull) QueryStringWithParameters(com.manydesigns.elements.text.QueryStringWithParameters) OgnlSqlFormat(com.manydesigns.elements.text.OgnlSqlFormat) Session(org.hibernate.Session) NotNull(org.jetbrains.annotations.NotNull)

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