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