blob: d34b95a0c660cdc751cdb063a5d0af7577ae49a6 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.ode.daohib.bpel.ql;
import org.apache.commons.lang.StringUtils;
import org.apache.ode.bpel.common.ProcessState;
import org.apache.ode.daohib.bpel.hobj.HProcessInstance;
import org.apache.ode.ql.Compiler;
import org.apache.ode.ql.eval.skel.AbstractConjunction;
import org.apache.ode.ql.eval.skel.AbstractDisjunction;
import org.apache.ode.ql.eval.skel.AbstractEqualityEvaluator;
import org.apache.ode.ql.eval.skel.CommandEvaluator;
import org.apache.ode.ql.eval.skel.ConjunctionEvaluator;
import org.apache.ode.ql.eval.skel.DisjunctionEvaluator;
import org.apache.ode.ql.eval.skel.EqualityEvaluator;
import org.apache.ode.ql.eval.skel.GEEvaluator;
import org.apache.ode.ql.eval.skel.GreaterEvaluator;
import org.apache.ode.ql.eval.skel.INEvaluator;
import org.apache.ode.ql.eval.skel.LEEvaluator;
import org.apache.ode.ql.eval.skel.LessEvaluator;
import org.apache.ode.ql.eval.skel.LikeEvaluator;
import org.apache.ode.ql.eval.skel.OrderByEvaluator;
import org.apache.ode.ql.tree.Builder;
import org.apache.ode.ql.tree.BuilderFactory;
import org.apache.ode.ql.tree.nodes.*;
import org.apache.ode.utils.ISO8601DateParser;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Conjunction;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Disjunction;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class HibernateInstancesQueryCompiler extends Compiler<List, Session> {
private static class DBFieldValueEq extends FieldValueEquality {
protected final Object fieldValue;
/**
* @param identifier
*/
public DBFieldValueEq(String identifier, Object fieldValue) {
super(identifier);
this.fieldValue = fieldValue;
}
/**
* @see org.apache.ode.ql.eval.skel.CommandEvaluator#evaluate(java.lang.Object)
*/
public Criterion evaluate(Object paramValue) {
return Restrictions.eq(identifier, fieldValue);
}
}
private abstract static class FieldValueEquality extends AbstractEqualityEvaluator<String, Criterion, Object> {
/**
* @param identifier
*/
public FieldValueEquality(String identifier) {
super(identifier);
}
}
//
private final static String INSTANCE_ID_FIELD = "iid";
private final static String PROCESS_ID_FIELD = "pid";
private final static String PROCESS_NAME_FIELD = "name";
private final static String PROCESS_NAMESPACE_FIELD = "namespace";
private final static String INSTANCE_STATUS_FIELD = "status";
private final static String INSTANCE_STARTED_FIELD = "started";
private final static String INSTANCE_LAST_ACTIVE_FIELD = "last-active";
/*
* private final static String CORRELATION_NAME_FIELD = "name"; private final static String
* CORRELATION_NAMESPACE_FIELD = "namespace"; private final static String CORRELATION_NAMESPACE_FIELD = "namespace";
*/
// DB fields
private final static String INSTANCE_ID_DB_FIELD = "id";
private final static String PROCESS_ID_DB_FIELD = "process.processId";
private final static String PROCESS_NAME_DB_FIELD = "process.typeName";
private final static String PROCESS_NAMESPACE_DB_FIELD = "process.typeNamespace";
private final static String INSTANCE_STATUS_DB_FIELD = "state";
private final static String PROPERTY_NS_DB_FIELD = "process.typeNamespace";
private final static String PROPERTY_NAME_DB_FIELD = "property.name";
private final static String PROPERTY_VALUE_DB_FIELD = "property.value";
private final static String INSTANCE_STARTED_DB_FIELD = "created";
private final static String INSTANCE_LAST_ACTIVE_DB_FIELD = "lastActiveTime";
// status fields
private final static String STATUS_ACTIVE = "active";
private final static String STATUS_SUSPENDED = "suspended";
private final static String STATUS_ERROR = "error";
private final static String STATUS_COMPLETED = "completed";
private final static String STATUS_TERMINATED = "terminated";
private final static String STATUS_FAULTED = "failed";
private final static Map<String, String> nodeIdentifierToDBField = new HashMap<String, String>(20);
//Whether property is used in query
private boolean propertyInQuery;
//Whether ordering by status used
private boolean orderByStatus;
private boolean orderByStatusDesc;
static {
nodeIdentifierToDBField.put(INSTANCE_ID_FIELD, INSTANCE_ID_DB_FIELD);
nodeIdentifierToDBField.put(INSTANCE_ID_FIELD, INSTANCE_ID_DB_FIELD);
nodeIdentifierToDBField.put(PROCESS_ID_FIELD, PROCESS_ID_DB_FIELD);
nodeIdentifierToDBField.put(PROCESS_NAME_FIELD, PROCESS_NAME_DB_FIELD);
nodeIdentifierToDBField.put(PROCESS_NAMESPACE_FIELD, PROCESS_NAMESPACE_DB_FIELD);
nodeIdentifierToDBField.put(INSTANCE_STARTED_FIELD, INSTANCE_STARTED_DB_FIELD);
nodeIdentifierToDBField.put(INSTANCE_LAST_ACTIVE_FIELD, INSTANCE_LAST_ACTIVE_DB_FIELD);
nodeIdentifierToDBField.put(INSTANCE_STATUS_FIELD, INSTANCE_STATUS_DB_FIELD);
}
private static String getDBField(String name) {
String dbField = nodeIdentifierToDBField.get(name);
if (dbField == null) {
throw new IllegalArgumentException("Unsupported field " + name);
}
return dbField;
}
private void init() {
propertyInQuery = false;
orderByStatus = false;
orderByStatusDesc = false;
}
@Override
public CommandEvaluator<List, Session> compile(final Query node) {
init();
final OrderByEvaluator<Collection<Order>, Object> orderEvaluator = (node.getOrder() != null) ? compileOrderBy(node
.getOrder()) : null;
final CommandEvaluator<Criterion, Object> selectionEvaluator = node.getChilds().size() == 0 ? null
: compileEvaluator(node.getChilds().iterator().next());
final boolean joinCorrelationSet = propertyInQuery;
final boolean sortByStatus = orderByStatus;
final boolean sortByStatusDesc = orderByStatusDesc;
final Limit limit = node.getLimit();
return new CommandEvaluator<List, Session>() {
public List evaluate(Session session) {
Criteria criteria = session.createCriteria(HProcessInstance.class).createAlias("process", "process");
if(joinCorrelationSet) {
criteria = criteria.createAlias("correlationSets", "property");
}
if(selectionEvaluator!=null) {
criteria.add(selectionEvaluator.evaluate(null));
}
if (orderEvaluator != null) {
Collection<Order> orders = orderEvaluator.evaluate(null);
for (Order order : orders) {
criteria.addOrder(order);
}
}
// setting limit
if (limit != null) {
criteria.setMaxResults(limit.getNumber());
}
List result = criteria.list();
//check whether ordering by status
if(sortByStatus) {
Collections.sort(result, sortByStatusDesc?StateComparator.DESC:StateComparator.ASC);
}
return result;
};
};
}
protected ConjunctionEvaluator<Criterion, Object> compileConjunction(Collection<CommandEvaluator> childs) {
return new AbstractConjunction<Criterion, Object>(childs) {
public Criterion evaluate(Object arg) {
Conjunction conj = Restrictions.conjunction();
for (CommandEvaluator eval : childs) {
conj.add((Criterion) eval.evaluate(null));
}
return conj;
}
};
}
protected DisjunctionEvaluator<Criterion, Object> compileDisjunction(Collection<CommandEvaluator> childs) {
return new AbstractDisjunction<Criterion, Object>(childs) {
public Criterion evaluate(Object arg) {
Disjunction conj = Restrictions.disjunction();
for (CommandEvaluator eval : childs) {
conj.add((Criterion) eval.evaluate(null));
}
return conj;
};
};
}
protected EqualityEvaluator<String, Criterion, Object> compileEqual(final Equality eq) {
if (eq.getIdentifier() instanceof Property) {
propertyInQuery = true;
final Property property = (Property) eq.getIdentifier();
return new EqualityEvaluator<String, Criterion, Object>() {
public Criterion evaluate(Object paramValue) {
Conjunction conj = Restrictions.conjunction();
if (!StringUtils.isEmpty(property.getNamespace())) {
conj.add(Restrictions.eq(PROPERTY_NS_DB_FIELD, property.getNamespace()));
}
conj.add(Restrictions.eq(PROPERTY_NAME_DB_FIELD, property.getName()));
conj.add(Restrictions.eq(PROPERTY_VALUE_DB_FIELD, eq.getValue().getValue()));
return conj;
};
public String getIdentifier() {
return property.toString();
};
};
} else {
final String fieldName = eq.getIdentifier().getName();
final Object value = eq.getValue().getValue();
final String dbField = getDBField(fieldName);
if (INSTANCE_STATUS_FIELD.equals(fieldName)) {
return new FieldValueEquality(INSTANCE_STATUS_FIELD) {
/**
* @see org.apache.ode.ql.eval.skel.CommandEvaluator#evaluate(java.lang.Object)
*/
public Criterion evaluate(Object paramValue) {
short noState = 200; // TODO move to constants
Disjunction disj = Restrictions.disjunction();
if (STATUS_ACTIVE.equals(paramValue)) {
disj.add(Restrictions.eq(dbField, ProcessState.STATE_NEW));
disj.add(Restrictions.eq(dbField, ProcessState.STATE_ACTIVE));
disj.add(Restrictions.eq(dbField, ProcessState.STATE_READY));
} else if (STATUS_SUSPENDED.equals(paramValue)) {
disj.add(Restrictions.eq(dbField, ProcessState.STATE_SUSPENDED));
} else if (STATUS_ERROR.equals(value)) {
disj.add(Restrictions.eq(dbField, noState)); // Error instance state doesn't exist yet
} else if (STATUS_COMPLETED.equals(paramValue)) {
disj.add(Restrictions.eq(dbField, ProcessState.STATE_COMPLETED_OK));
} else if (STATUS_TERMINATED.equals(paramValue)) {
disj.add(Restrictions.eq(dbField, ProcessState.STATE_TERMINATED));
} else if (STATUS_FAULTED.equals(paramValue)) {
disj.add(Restrictions.eq(dbField, ProcessState.STATE_COMPLETED_WITH_FAULT));
} else {
disj.add(Restrictions.eq(dbField, noState)); // Non existent state
}
return disj;
}
};
}
return new DBFieldValueEq(dbField, value);
}
}
public CommandEvaluator compileEvaluator(Object node) {
/*
*
*/
if (node instanceof In) {
return compileIn((In) node);
} else if (node instanceof org.apache.ode.ql.tree.nodes.Conjunction) {
return compileConjunction(evaluate((LogicExprNode) node));
} else if (node instanceof org.apache.ode.ql.tree.nodes.Disjunction) {
return compileDisjunction(evaluate((LogicExprNode) node));
} else if (node instanceof IdentifierToValueCMP) {
return compileIdentifierToValueCMP((IdentifierToValueCMP) node);
}
throw new IllegalArgumentException("Unsupported node " + node.getClass());
}
protected CommandEvaluator<Criterion, Object> compileIdentifierToValueCMP(IdentifierToValueCMP node) {
Identifier id = node.getIdentifier();
if (id instanceof Field) {
String name = id.getName();
Value value = node.getValue();
if (INSTANCE_ID_FIELD.equals(name)) {
value.setValue(Long.valueOf((String) value.getValue()));
} else if (INSTANCE_STARTED_FIELD.equals(name) || INSTANCE_LAST_ACTIVE_FIELD.equals(name)) {
try {
value.setValue(ISO8601DateParser.parse((String) value.getValue()));
} catch (ParseException ex) {
// TODO
throw new RuntimeException(ex);
}
}
}
if (node instanceof Equality) {
return compileEqual((Equality) node);
} else if (node instanceof Less) {
return compileLess((Less) node);
} else if (node instanceof Greater) {
return compileGreater((Greater) node);
} else if (node instanceof GE) {
return compileGE((GE) node);
} else if (node instanceof LE) {
return compileLE((LE) node);
} else if (node instanceof Like) {
return compileLike((Like) node);
} else {
throw new IllegalArgumentException("Unsupported node " + node.getClass());
}
}
protected GEEvaluator<String, Criterion, Object> compileGE(final GE ge) {
if (ge.getIdentifier() instanceof Property) {
propertyInQuery = true;
final Property property = (Property) ge.getIdentifier();
return new GEEvaluator<String, Criterion, Object>() {
public Criterion evaluate(Object paramValue) {
Conjunction conj = Restrictions.conjunction();
if (!StringUtils.isEmpty(property.getNamespace())) {
conj.add(Restrictions.ge(PROPERTY_NS_DB_FIELD, property.getNamespace()));
}
conj.add(Restrictions.ge(PROPERTY_NAME_DB_FIELD, property.getName()));
conj.add(Restrictions.ge(PROPERTY_VALUE_DB_FIELD, ge.getValue().getValue()));
return conj;
};
public String getIdentifier() {
return property.toString();
};
};
} else {
final String fieldName = ge.getIdentifier().getName();
final Object objValue = ge.getValue().getValue();
if (INSTANCE_STATUS_FIELD.equals(fieldName)) {
throw new IllegalArgumentException("Field " + INSTANCE_STATUS_FIELD + " is not supported.");
}
final String dbField = getDBField(fieldName);
return new GEEvaluator<String, Criterion, Object>() {
public Criterion evaluate(Object paramValue) {
return Restrictions.ge(dbField, objValue);
}
public String getIdentifier() {
return fieldName;
}
};
}
}
protected GreaterEvaluator<String, Criterion, Object> compileGreater(final Greater gt) {
if (gt.getIdentifier() instanceof Property) {
propertyInQuery = true;
final Property property = (Property) gt.getIdentifier();
return new GreaterEvaluator<String, Criterion, Object>() {
public Criterion evaluate(Object paramValue) {
Conjunction conj = Restrictions.conjunction();
if (!StringUtils.isEmpty(property.getNamespace())) {
conj.add(Restrictions.gt(PROPERTY_NS_DB_FIELD, property.getNamespace()));
}
conj.add(Restrictions.gt(PROPERTY_NAME_DB_FIELD, property.getName()));
conj.add(Restrictions.gt(PROPERTY_VALUE_DB_FIELD, gt.getValue().getValue()));
return conj;
};
public String getIdentifier() {
return property.toString();
};
};
} else {
final String fieldName = gt.getIdentifier().getName();
final Object value = gt.getValue().getValue();
if (INSTANCE_STATUS_FIELD.equals(fieldName)) {
throw new IllegalArgumentException("Field " + INSTANCE_STATUS_FIELD + " is not supported.");
}
final String dbField = getDBField(fieldName);
return new GreaterEvaluator<String, Criterion, Object>() {
public Criterion evaluate(Object paramValue) {
return Restrictions.gt(dbField, value);
}
public String getIdentifier() {
return fieldName;
}
};
}
}
protected INEvaluator<String, Criterion, Object> compileIn(final In in) {
if (in.getIdentifier() instanceof Property) {
propertyInQuery = true;
final Property property = (Property) in.getIdentifier();
return new INEvaluator<String, Criterion, Object>() {
public Criterion evaluate(Object paramValue) {
Disjunction disj = Restrictions.disjunction();
String propertyNS = property.getNamespace();
String propertyName = property.getName();
for (Value value : in.getValues()) {
Conjunction conj = Restrictions.conjunction();
if (!StringUtils.isEmpty(property.getNamespace())) {
conj.add(Restrictions.gt(PROPERTY_NS_DB_FIELD, propertyNS));
}
conj.add(Restrictions.gt(PROPERTY_NAME_DB_FIELD, propertyName));
conj.add(Restrictions.gt(PROPERTY_VALUE_DB_FIELD, value.getValue()));
disj.add(conj);
}
return disj;
};
public String getIdentifier() {
return property.toString();
};
};
} else {
final String fieldName = in.getIdentifier().getName();
if (INSTANCE_STATUS_FIELD.equals(fieldName)) {
short noState = 200; // TODO move to constants
final Disjunction disj = Restrictions.disjunction();
final Collection values = ValuesHelper.extract((Collection<Value>) in.getValues());
if (values.contains(STATUS_ACTIVE)) {
disj.add(Restrictions.eq(INSTANCE_STATUS_DB_FIELD, ProcessState.STATE_NEW));
disj.add(Restrictions.eq(INSTANCE_STATUS_DB_FIELD, ProcessState.STATE_ACTIVE));
disj.add(Restrictions.eq(INSTANCE_STATUS_DB_FIELD, ProcessState.STATE_READY));
}
if (values.contains(STATUS_SUSPENDED)) {
disj.add(Restrictions.eq(INSTANCE_STATUS_DB_FIELD, ProcessState.STATE_SUSPENDED));
}
if (values.contains(STATUS_ERROR)) {
disj.add(Restrictions.eq(INSTANCE_STATUS_DB_FIELD, noState)); // Error instance state doesn't exist yet
}
if (values.contains(STATUS_COMPLETED)) {
disj.add(Restrictions.eq(INSTANCE_STATUS_DB_FIELD, ProcessState.STATE_COMPLETED_OK));
}
if (values.contains(STATUS_TERMINATED)) {
disj.add(Restrictions.eq(INSTANCE_STATUS_DB_FIELD, ProcessState.STATE_TERMINATED));
}
if (values.contains(STATUS_FAULTED)) {
disj.add(Restrictions.eq(INSTANCE_STATUS_DB_FIELD, ProcessState.STATE_COMPLETED_WITH_FAULT));
}
return new INEvaluator<String, Criterion, Object>() {
public Criterion evaluate(Object paramValue) {
return disj;
};
public String getIdentifier() {
return INSTANCE_STATUS_DB_FIELD;
};
};
} else {
final Collection objValues;
final Collection<Value> values = in.getValues();
if (INSTANCE_ID_FIELD.equals(fieldName)) {
objValues = new ArrayList<Long>(values.size());
for (Value value : values) {
objValues.add(Long.valueOf((String) value.getValue()));
}
} else if (INSTANCE_STARTED_FIELD.equals(fieldName) || INSTANCE_LAST_ACTIVE_FIELD.equals(fieldName)) {
objValues = new ArrayList<Date>(values.size());
try {
for (Value value : values) {
objValues.add(ISO8601DateParser.parse((String) value.getValue()));
}
} catch (ParseException ex) {
// TODO
throw new RuntimeException(ex);
}
} else {
objValues = ValuesHelper.extract((Collection<Value>) values);
}
final String dbField = getDBField(fieldName);
return new INEvaluator<String, Criterion, Object>() {
/**
* @see org.apache.ode.ql.eval.skel.CommandEvaluator#evaluate(java.lang.Object)
*/
public Criterion evaluate(Object paramValue) {
return Restrictions.in(dbField, objValues);
}
/**
* @see org.apache.ode.ql.eval.skel.Identified#getIdentifier()
*/
public String getIdentifier() {
return dbField;
}
};
}
}
}
protected LEEvaluator<String, Criterion, Object> compileLE(final LE le) {
if (le.getIdentifier() instanceof Property) {
final Property property = (Property) le.getIdentifier();
return new LEEvaluator<String, Criterion, Object>() {
public Criterion evaluate(Object paramValue) {
Conjunction conj = Restrictions.conjunction();
if (!StringUtils.isEmpty(property.getNamespace())) {
conj.add(Restrictions.le(PROPERTY_NS_DB_FIELD, property.getNamespace()));
}
conj.add(Restrictions.le(PROPERTY_NAME_DB_FIELD, property.getName()));
conj.add(Restrictions.le(PROPERTY_VALUE_DB_FIELD, le.getValue().getValue()));
return conj;
};
public String getIdentifier() {
return property.toString();
};
};
} else {
final String fieldName = le.getIdentifier().getName();
final Object value = le.getValue().getValue();
if (INSTANCE_STATUS_FIELD.equals(fieldName)) {
throw new IllegalArgumentException("Field " + INSTANCE_STATUS_FIELD + " is not supported.");
}
final String dbField = getDBField(fieldName);
return new LEEvaluator<String, Criterion, Object>() {
public Criterion evaluate(Object paramValue) {
return Restrictions.le(dbField, value);
}
public String getIdentifier() {
return fieldName;
}
};
}
}
protected LessEvaluator<String, Criterion, Object> compileLess(final Less less) {
if (less.getIdentifier() instanceof Property) {
propertyInQuery = true;
final Property property = (Property) less.getIdentifier();
return new LessEvaluator<String, Criterion, Object>() {
public Criterion evaluate(Object paramValue) {
Conjunction conj = Restrictions.conjunction();
if (!StringUtils.isEmpty(property.getNamespace())) {
conj.add(Restrictions.lt(PROPERTY_NS_DB_FIELD, property.getNamespace()));
}
conj.add(Restrictions.lt(PROPERTY_NAME_DB_FIELD, property.getName()));
conj.add(Restrictions.lt(PROPERTY_VALUE_DB_FIELD, less.getValue().getValue()));
return conj;
};
public String getIdentifier() {
return property.toString();
};
};
} else {
final String fieldName = less.getIdentifier().getName();
final Object value = less.getValue().getValue();
if (INSTANCE_STATUS_FIELD.equals(fieldName)) {
throw new IllegalArgumentException("Field " + INSTANCE_STATUS_FIELD + " is not supported.");
}
final String dbField = getDBField(fieldName);
return new LessEvaluator<String, Criterion, Object>() {
public Criterion evaluate(Object paramValue) {
return Restrictions.lt(dbField, value);
}
public String getIdentifier() {
return fieldName;
}
};
}
}
protected LikeEvaluator<String, Criterion, Object> compileLike(final Like like) {
if (like.getIdentifier() instanceof Property) {
propertyInQuery = true;
final Property property = (Property) like.getIdentifier();
return new LikeEvaluator<String, Criterion, Object>() {
public Criterion evaluate(Object paramValue) {
Conjunction conj = Restrictions.conjunction();
if (!StringUtils.isEmpty(property.getNamespace())) {
conj.add(Restrictions.like(PROPERTY_NS_DB_FIELD, property.getNamespace()));
}
conj.add(Restrictions.like(PROPERTY_NAME_DB_FIELD, property.getName()));
conj.add(Restrictions.like(PROPERTY_VALUE_DB_FIELD, like.getValue().getValue()));
return conj;
};
public String getIdentifier() {
return property.toString();
};
};
} else {
final String fieldName = like.getIdentifier().getName();
if (INSTANCE_STATUS_FIELD.equals(fieldName)) {
throw new IllegalArgumentException("Field " + INSTANCE_STATUS_FIELD + " is not supported by like operation.");
}
if (INSTANCE_ID_FIELD.equals(fieldName)) {
throw new IllegalArgumentException("Field " + INSTANCE_ID_FIELD + " is not supported by like operation.");
}
final Object value = like.getValue().getValue();
final String dbField = getDBField(fieldName);
return new LikeEvaluator<String, Criterion, Object>() {
public Criterion evaluate(Object paramValue) {
return Restrictions.like(dbField, value);
};
public String getIdentifier() {
return dbField;
}
};
}
}
protected OrderByEvaluator<Collection<Order>, Object> compileOrderBy(OrderBy orderBy) {
final LinkedHashMap<String, Boolean> orders = new LinkedHashMap<String, Boolean>();
for (OrderByElement idOrder : orderBy.getOrders()) {
if (!(idOrder.getIdentifier() instanceof Field)) {
throw new IllegalArgumentException("Only field identifier supported by order by operator.");
}
String idName = idOrder.getIdentifier().getName();
if(INSTANCE_STATUS_FIELD.equals(idName)) {
if(orderBy.getOrders().size()>1) {
//TODO throw appropriate exception
throw new RuntimeException("Status field should be used alone in <order by> construction.");
}
orderByStatus = true;
orderByStatusDesc = idOrder.getType()==OrderByType.DESC;
return null;
}
String dbField = getDBField(idName);
orders.put(dbField, idOrder.getType() == null || idOrder.getType() == OrderByType.ASC);
}
return new OrderByEvaluator<Collection<Order>, Object>() {
public Collection<Order> evaluate(Object paramValue) {
Collection<Order> hibernateOrders = new ArrayList<Order>(orders.size());
for (Map.Entry<String, Boolean> order : orders.entrySet()) {
hibernateOrders.add(order.getValue() ? Order.asc(order.getKey()) : Order.desc(order.getKey()));
}
return hibernateOrders;
}
};
}
protected List<CommandEvaluator> evaluate(LogicExprNode exprNode) {
ArrayList<CommandEvaluator> commandsEv = new ArrayList<CommandEvaluator>(exprNode.getChilds().size());
for (LogicNode node : exprNode.getChilds()) {
commandsEv.add(compileEvaluator(node));
}
return commandsEv;
}
public static void main(String[] args) {
String queryString = "order by last-active desc limit 1000";
Builder<String> builder = BuilderFactory.getInstance().createBuilder();
Node queryNode = builder.build(queryString);
HibernateInstancesQueryCompiler compiler = new HibernateInstancesQueryCompiler();
compiler.compile((Query) queryNode);
}
}