Search in sources :

Example 1 with SqlFragment

use of org.hibernate.hql.internal.ast.tree.SqlFragment in project hibernate-orm by hibernate.

the class SyntheticAndFactory method addDiscriminatorWhereFragment.

public void addDiscriminatorWhereFragment(RestrictableStatement statement, Queryable persister, Map enabledFilters, String alias) {
    String whereFragment = persister.filterFragment(alias, enabledFilters).trim();
    if ("".equals(whereFragment)) {
        return;
    }
    if (whereFragment.startsWith("and")) {
        whereFragment = whereFragment.substring(4);
    }
    // Need to parse off the column qualifiers; this is assuming (which is true as of now)
    // that this is only used from update and delete HQL statement parsing
    whereFragment = StringHelper.replace(whereFragment, persister.generateFilterConditionAlias(alias) + ".", "");
    // Note: this simply constructs a "raw" SQL_TOKEN representing the
    // where fragment and injects this into the tree.  This "works";
    // however it is probably not the best long-term solution.
    //
    // At some point we probably want to apply an additional grammar to
    // properly tokenize this where fragment into constituent parts
    // focused on the operators embedded within the fragment.
    SqlFragment discrimNode = (SqlFragment) create(SQL_TOKEN, whereFragment);
    JoinProcessor.processDynamicFilterParameters(whereFragment, discrimNode, hqlSqlWalker);
    if (statement.getWhereClause().getNumberOfChildren() == 0) {
        statement.getWhereClause().setFirstChild(discrimNode);
    } else {
        AST and = create(AND, "{and}");
        AST currentFirstChild = statement.getWhereClause().getFirstChild();
        and.setFirstChild(discrimNode);
        and.addChild(currentFirstChild);
        statement.getWhereClause().setFirstChild(and);
    }
}
Also used : SqlFragment(org.hibernate.hql.internal.ast.tree.SqlFragment) AST(antlr.collections.AST)

Example 2 with SqlFragment

use of org.hibernate.hql.internal.ast.tree.SqlFragment in project hibernate-orm by hibernate.

the class SyntheticAndFactory method addWhereFragment.

public void addWhereFragment(JoinFragment joinFragment, String whereFragment, QueryNode query, FromElement fromElement, HqlSqlWalker hqlSqlWalker) {
    if (whereFragment == null) {
        return;
    }
    if (!fromElement.useWhereFragment() && !joinFragment.hasThetaJoins()) {
        return;
    }
    whereFragment = whereFragment.trim();
    if (StringHelper.isEmpty(whereFragment)) {
        return;
    }
    // handle adding them
    if (whereFragment.startsWith("and")) {
        whereFragment = whereFragment.substring(4);
    }
    LOG.debugf("Using unprocessed WHERE-fragment [%s]", whereFragment);
    SqlFragment fragment = (SqlFragment) create(SQL_TOKEN, whereFragment);
    fragment.setJoinFragment(joinFragment);
    fragment.setFromElement(fromElement);
    if (fromElement.getIndexCollectionSelectorParamSpec() != null) {
        fragment.addEmbeddedParameter(fromElement.getIndexCollectionSelectorParamSpec());
        fromElement.setIndexCollectionSelectorParamSpec(null);
    }
    if (hqlSqlWalker.isFilter()) {
        if (whereFragment.indexOf('?') >= 0) {
            Type collectionFilterKeyType = hqlSqlWalker.getSessionFactoryHelper().requireQueryableCollection(hqlSqlWalker.getCollectionFilterRole()).getKeyType();
            CollectionFilterKeyParameterSpecification paramSpec = new CollectionFilterKeyParameterSpecification(hqlSqlWalker.getCollectionFilterRole(), collectionFilterKeyType, 0);
            fragment.addEmbeddedParameter(paramSpec);
        }
    }
    JoinProcessor.processDynamicFilterParameters(whereFragment, fragment, hqlSqlWalker);
    if (LOG.isDebugEnabled()) {
        LOG.debugf("Using processed WHERE-fragment [%s]", fragment.getText());
    }
    // then it binds all the HQL query parameters, see org.hibernate.loader.Loader.processFilterParameters().
    if (fragment.getFromElement().isFilter() || fragment.hasFilterCondition()) {
        if (filters == null) {
            // Find or create the WHERE clause
            AST where = query.getWhereClause();
            // Create a new FILTERS node as a parent of all filters
            filters = create(FILTERS, "{filter conditions}");
            // Put the FILTERS node beforeQuery the HQL condition and theta joins
            ASTUtil.insertChild(where, filters);
        }
        // add the current fragment to the FILTERS node
        filters.addChild(fragment);
    } else {
        if (thetaJoins == null) {
            // Find or create the WHERE clause
            AST where = query.getWhereClause();
            // Create a new THETA_JOINS node as a parent of all filters
            thetaJoins = create(THETA_JOINS, "{theta joins}");
            // Put the THETA_JOINS node beforeQuery the HQL condition, afterQuery the filters.
            if (filters == null) {
                ASTUtil.insertChild(where, thetaJoins);
            } else {
                ASTUtil.insertSibling(thetaJoins, filters);
            }
        }
        // add the current fragment to the THETA_JOINS node
        thetaJoins.addChild(fragment);
    }
}
Also used : SqlFragment(org.hibernate.hql.internal.ast.tree.SqlFragment) Type(org.hibernate.type.Type) AST(antlr.collections.AST) CollectionFilterKeyParameterSpecification(org.hibernate.param.CollectionFilterKeyParameterSpecification)

Aggregations

AST (antlr.collections.AST)2 SqlFragment (org.hibernate.hql.internal.ast.tree.SqlFragment)2 CollectionFilterKeyParameterSpecification (org.hibernate.param.CollectionFilterKeyParameterSpecification)1 Type (org.hibernate.type.Type)1