【Java开源代码栏目提醒】:网学会员为广大网友收集整理了,WhereParser.java,希望对大家有所帮助!
//$Id: WhereParser.java 7825 2005-08-10 20:23:55Z oneovthafew $
package org.hibernate.hql.classic;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import org.hibernate.MappingException;
import org.hibernate.QueryException;
import org.hibernate.engine.JoinSequence;
import org.hibernate.hql.QueryTranslator;
import org.hibernate.persister.collection.CollectionPropertyNames;
import org.hibernate.persister.entity.Queryable;
import org.hibernate.
sql.InFragment;
import org.hibernate.type.EntityType;
import org.hibernate.type.LiteralType;
import org.hibernate.type.Type;
import org.hibernate.type.TypeFactory;
import org.hibernate.util.ReflectHelper;
import org.hibernate.util.StringHelper;
/**
* Parses the where clause of a hibernate query and translates it to an
* SQL where clause.
*/
// We should reengineer this class so that, rather than the current ad -
// hoc linear approach to processing a stream of tokens, we instead
// build up a tree of expressions.
// We would probably refactor to have LogicParser (builds a tree of simple
// expressions connected by and, or, not), ExpressionParser (translates
// from OO terms like foo, foo.Bar, foo.Bar.Baz to SQL terms like
// FOOS.ID, FOOS.BAR_ID, etc) and PathExpressionParser (which does much
// the same thing it does now)
public class WhereParser implements Parser {
private final PathExpressionParser pathExpressionParser;
{
pathExpressionParser = new PathExpressionParser();
pathExpressionParser.setUseThetaStyleJoin( true ); //Need this, since join condition can appear inside parens!
}
private static final Set EXPRESSION_TERMINATORS = new HashSet(); //tokens that close a sub expression
private static final Set EXPRESSION_OPENERS = new HashSet(); //tokens that open a sub expression
private static final Set BOOLEAN_OPERATORS = new HashSet(); //tokens that would indicate a sub expression is a boolean expression
private static final Map NEGATIONS = new HashMap();
static {
EXPRESSION_TERMINATORS.add( "and" );
EXPRESSION_TERMINATORS.add( "or" );
EXPRESSION_TERMINATORS.add( ")" );
//expressionTerminators.add(","); // deliberately excluded
EXPRESSION_OPENERS.add( "and" );
EXPRESSION_OPENERS.add( "or" );
EXPRESSION_OPENERS.add( "(" );
//expressionOpeners.add(","); // deliberately excluded
BOOLEAN_OPERATORS.add( "<" );
BOOLEAN_OPERATORS.add( "=" );
BOOLEAN_OPERATORS.add( ">" );
BOOLEAN_OPERATORS.add( "#" );
BOOLEAN_OPERATORS.add( "~" );
BOOLEAN_OPERATORS.add( "like" );
BOOLEAN_OPERATORS.add( "ilike" );
BOOLEAN_OPERATORS.add( "regexp" );
BOOLEAN_OPERATORS.add( "rlike" );
BOOLEAN_OPERATORS.add( "is" );
BOOLEAN_OPERATORS.add( "in" );
BOOLEAN_OPERATORS.add( "any" );
BOOLEAN_OPERATORS.add( "some" );
BOOLEAN_OPERATORS.add( "all" );
BOOLEAN_OPERATORS.add( "exists" );
BOOLEAN_OPERATORS.add( "between" );
BOOLEAN_OPERATORS.add( "<=" );
BOOLEAN_OPERATORS.add( ">=" );
BOOLEAN_OPERATORS.add( "=>" );
BOOLEAN_OPERATORS.add( "=<" );
BOOLEAN_OPERATORS.add( "!=" );
BOOLEAN_OPERATORS.add( "<>" );
BOOLEAN_OPERATORS.add( "!#" );
BOOLEAN_OPERATORS.add( "!~" );
BOOLEAN_OPERATORS.add( "!<" );
BOOLEAN_OPERATORS.add( "!>" );
BOOLEAN_OPERATORS.add( "is not" );
BOOLEAN_OPERATORS.add( "not like" );
BOOLEAN_OPERATORS.add( "not ilike" );
BOOLEAN_OPERATORS.add( "not regexp" );
BOOLEAN_OPERATORS.add( "not rlike" );
BOOLEAN_OPERATORS.add( "not in" );
BOOLEAN_OPERATORS.add( "not between" );
BOOLEAN_OPERATORS.add( "not exists" );
NEGATIONS.put( "and", "or" );
NEGATIONS.put( "or", "and" );
NEGATIONS.put( "<", ">=" );
NEGATIONS.put( "=", "<>" );
NEGATIONS.put( ">", "<=" );
NEGATIONS.put( "#", "!#" );
NEGATIONS.put( "~", "!~" );
NEGATIONS.put( "like", "not like" );
NEGATIONS.put( "ilike", "not ilike" );
NEGATIONS.put( "regexp", "not regexp" );
NEGATIONS.put( "rlike", "not rlike" );
NEGATIONS.put( "is", "is not" );
NEGATIONS.put( "in", "not in" );
NEGATIONS.put( "exists", "not exists" );
NEGATIONS.put( "between", "not between" );
NEGATIONS.put( "<=", ">" );
NEGATIONS.put( ">=", "<" );
NEGATIONS.put( "=>", "<" );
NEGATIONS.put( "=<", ">" );
NEGATIONS.put( "!=", "=" );
NEGATIONS.put( "<>", "=" );
NEGATIONS.put( "!#", "#" );
NEGATIONS.put( "!~