Arnaud, If we are going to include the JMS Selector code in the client as well as the broker would it not make sense to move it to common?
On 06/08/07, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote: > Author: arnaudsimon > Date: Sun Aug 5 23:36:27 2007 > New Revision: 563043 > > URL: http://svn.apache.org/viewvc?view=rev&rev=563043 > Log: > JMS message selector grammar > > Added: > incubator/qpid/trunk/qpid/java/client/src/main/grammar/ > incubator/qpid/trunk/qpid/java/client/src/main/grammar/SelectorParser.jj > > Added: > incubator/qpid/trunk/qpid/java/client/src/main/grammar/SelectorParser.jj > URL: > http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/grammar/SelectorParser.jj?view=auto&rev=563043 > ============================================================================== > --- incubator/qpid/trunk/qpid/java/client/src/main/grammar/SelectorParser.jj > (added) > +++ incubator/qpid/trunk/qpid/java/client/src/main/grammar/SelectorParser.jj > Sun Aug 5 23:36:27 2007 > @@ -0,0 +1,592 @@ > +/* > + * > + * 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. > + * > + */ > + > + // > + // Original File from r450141 of the Apache ActiveMQ project > <http://www.activemq.org/site/home.html> > + // > + > +// > ---------------------------------------------------------------------------- > +// OPTIONS > +// > ---------------------------------------------------------------------------- > +options { > + STATIC = false; > + UNICODE_INPUT = true; > + > + // some performance optimizations > + OPTIMIZE_TOKEN_MANAGER = true; > + ERROR_REPORTING = false; > +} > + > +// > ---------------------------------------------------------------------------- > +// PARSER > +// > ---------------------------------------------------------------------------- > + > +PARSER_BEGIN(SelectorParser) > +/* > + * > + * 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.qpid.nclient.jms.filter.selector; > + > +import java.io.StringReader; > +import java.util.ArrayList; > + > +import org.apache.qpidity.QpidException; > +import org.apache.qpid.nclient.jms.filter.ArithmeticExpression; > +import org.apache.qpid.nclient.jms.filter.BooleanExpression; > +import org.apache.qpid.nclient.jms.filter.ComparisonExpression; > +import org.apache.qpid.nclient.jms.filter.ConstantExpression; > +import org.apache.qpid.nclient.jms.filter.Expression; > +import org.apache.qpid.nclient.jms.filter.LogicExpression; > +import org.apache.qpid.nclient.jms.filter.PropertyExpression; > +import org.apache.qpid.nclient.jms.filter.UnaryExpression; > + > +/** > + * JMS Selector Parser generated by JavaCC > + * > + * Do not edit this .java file directly - it is autogenerated from > SelectorParser.jj > + */ > +public class SelectorParser { > + > + public SelectorParser() { > + this(new StringReader("")); > + } > + > + public BooleanExpression parse(String sql) throws QpidException { > + this.ReInit(new StringReader(sql)); > + > + try { > + return this.JmsSelector(); > + } > + catch (Throwable e) { > + throw new QpidException(sql,"filter error",e); > + } > + > + } > + > + private BooleanExpression asBooleanExpression(Expression value) throws > ParseException { > + if (value instanceof BooleanExpression) { > + return (BooleanExpression) value; > + } > + if (value instanceof PropertyExpression) { > + return UnaryExpression.createBooleanCast( value ); > + } > + throw new ParseException("Expression will not result in a boolean > value: " + value); > + } > + > + > +} > + > +PARSER_END(SelectorParser) > + > +// > ---------------------------------------------------------------------------- > +// Tokens > +// > ---------------------------------------------------------------------------- > + > +/* White Space */ > +SPECIAL_TOKEN : > +{ > + " " | "\t" | "\n" | "\r" | "\f" > +} > + > +/* Comments */ > +SKIP: > +{ > + <LINE_COMMENT: "--" (~["\n","\r"])* ("\n"|"\r"|"\r\n") > > +} > + > +SKIP: > +{ > + <BLOCK_COMMENT: "/*" (~["*"])* "*" ("*" | (~["*","/"] (~["*"])* "*"))* "/"> > +} > + > +/* Reserved Words */ > +TOKEN [IGNORE_CASE] : > +{ > + < NOT : "NOT"> > + | < AND : "AND"> > + | < OR : "OR"> > + | < BETWEEN : "BETWEEN"> > + | < LIKE : "LIKE"> > + | < ESCAPE : "ESCAPE"> > + | < IN : "IN"> > + | < IS : "IS"> > + | < TRUE : "TRUE" > > + | < FALSE : "FALSE" > > + | < NULL : "NULL" > > +} > + > +/* Literals */ > +TOKEN [IGNORE_CASE] : > +{ > + > + < DECIMAL_LITERAL: ["1"-"9"] (["0"-"9"])* (["l","L"])? > > + | < HEX_LITERAL: "0" ["x","X"] (["0"-"9","a"-"f","A"-"F"])+ > > + | < OCTAL_LITERAL: "0" (["0"-"7"])* > > + | < FLOATING_POINT_LITERAL: > + (["0"-"9"])+ "." (["0"-"9"])* (<EXPONENT>)? // matches: 5.5 or 5. > or 5.5E10 or 5.E10 > + | "." (["0"-"9"])+ (<EXPONENT>)? // matches: .5 or .5E10 > + | (["0"-"9"])+ <EXPONENT> // matches: 5E10 > + > > + | < #EXPONENT: "E" (["+","-"])? (["0"-"9"])+ > > + | < STRING_LITERAL: "'" ( ("''") | ~["'"] )* "'" > > +} > + > +TOKEN [IGNORE_CASE] : > +{ > + < ID : ["a"-"z", "_", "$"] (["a"-"z","0"-"9","_", "$"])* > > +} > + > +// > ---------------------------------------------------------------------------- > +// Grammer > +// > ---------------------------------------------------------------------------- > +BooleanExpression JmsSelector() : > +{ > + Expression left=null; > +} > +{ > + ( > + left = orExpression() > + ) > + { > + return asBooleanExpression(left); > + } > + > +} > + > +Expression orExpression() : > +{ > + Expression left; > + Expression right; > +} > +{ > + ( > + left = andExpression() > + ( > + <OR> right = andExpression() > + { > + left = LogicExpression.createOR(asBooleanExpression(left), > asBooleanExpression(right)); > + } > + )* > + ) > + { > + return left; > + } > + > +} > + > + > +Expression andExpression() : > +{ > + Expression left; > + Expression right; > +} > +{ > + ( > + left = equalityExpression() > + ( > + <AND> right = equalityExpression() > + { > + left = LogicExpression.createAND(asBooleanExpression(left), > asBooleanExpression(right)); > + } > + )* > + ) > + { > + return left; > + } > +} > + > +Expression equalityExpression() : > +{ > + Expression left; > + Expression right; > +} > +{ > + ( > + left = comparisonExpression() > + ( > + > + "=" right = comparisonExpression() > + { > + left = ComparisonExpression.createEqual(left, right); > + } > + | > + "<>" right = comparisonExpression() > + { > + left = ComparisonExpression.createNotEqual(left, right); > + } > + | > + LOOKAHEAD(2) > + <IS> <NULL> > + { > + left = ComparisonExpression.createIsNull(left); > + } > + | > + <IS> <NOT> <NULL> > + { > + left = ComparisonExpression.createIsNotNull(left); > + } > + )* > + ) > + { > + return left; > + } > +} > + > +Expression comparisonExpression() : > +{ > + Expression left; > + Expression right; > + Expression low; > + Expression high; > + String t, u; > + boolean not; > + ArrayList list; > +} > +{ > + ( > + left = addExpression() > + ( > + > + ">" right = addExpression() > + { > + left = ComparisonExpression.createGreaterThan(left, > right); > + } > + | > + ">=" right = addExpression() > + { > + left = ComparisonExpression.createGreaterThanEqual(left, > right); > + } > + | > + "<" right = addExpression() > + { > + left = ComparisonExpression.createLessThan(left, right); > + } > + | > + "<=" right = addExpression() > + { > + left = ComparisonExpression.createLessThanEqual(left, > right); > + } > + | > + { > + u=null; > + } > + <LIKE> t = stringLitteral() > + [ <ESCAPE> u = stringLitteral() ] > + { > + left = ComparisonExpression.createLike(left, t, u); > + } > + | > + LOOKAHEAD(2) > + { > + u=null; > + } > + <NOT> <LIKE> t = stringLitteral() [ <ESCAPE> u = > stringLitteral() ] > + { > + left = ComparisonExpression.createNotLike(left, t, u); > + } > + | > + <BETWEEN> low = addExpression() <AND> high = > addExpression() > + { > + left = > ComparisonExpression.createBetween(left, low, high); > + } > + | > + LOOKAHEAD(2) > + <NOT> <BETWEEN> low = addExpression() <AND> high = > addExpression() > + { > + left = > ComparisonExpression.createNotBetween(left, low, high); > + } > + | > + <IN> > + "(" > + t = stringLitteral() > + { > + list = new ArrayList(); > + list.add( t ); > + } > + ( > + "," > + t = stringLitteral() > + { > + list.add( t ); > + } > + > + )* > + ")" > + { > + left = ComparisonExpression.createInFilter(left, > list); > + } > + | > + LOOKAHEAD(2) > + <NOT> <IN> > + "(" > + t = stringLitteral() > + { > + list = new ArrayList(); > + list.add( t ); > + } > + ( > + "," > + t = stringLitteral() > + { > + list.add( t ); > + } > + > + )* > + ")" > + { > + left = > ComparisonExpression.createNotInFilter(left, list); > + } > + > + )* > + ) > + { > + return left; > + } > +} > + > +Expression addExpression() : > +{ > + Expression left; > + Expression right; > +} > +{ > + left = multExpr() > + ( > + LOOKAHEAD( ("+"|"-") multExpr()) > + ( > + "+" right = multExpr() > + { > + left = ArithmeticExpression.createPlus(left, right); > + } > + | > + "-" right = multExpr() > + { > + left = ArithmeticExpression.createMinus(left, right); > + } > + ) > + > + )* > + { > + return left; > + } > +} > + > +Expression multExpr() : > +{ > + Expression left; > + Expression right; > +} > +{ > + left = unaryExpr() > + ( > + "*" right = unaryExpr() > + { > + left = ArithmeticExpression.createMultiply(left, right); > + } > + | > + "/" right = unaryExpr() > + { > + left = ArithmeticExpression.createDivide(left, right); > + } > + | > + "%" right = unaryExpr() > + { > + left = ArithmeticExpression.createMod(left, right); > + } > + > + )* > + { > + return left; > + } > +} > + > + > +Expression unaryExpr() : > +{ > + String s=null; > + Expression left=null; > +} > +{ > + ( > + LOOKAHEAD( "+" unaryExpr() ) > + "+" left=unaryExpr() > + | > + "-" left=unaryExpr() > + { > + left = UnaryExpression.createNegate(left); > + } > + | > + <NOT> left=unaryExpr() > + { > + left = UnaryExpression.createNOT( > asBooleanExpression(left) ); > + } > + | > + left = primaryExpr() > + ) > + { > + return left; > + } > + > +} > + > +Expression primaryExpr() : > +{ > + Expression left=null; > +} > +{ > + ( > + left = literal() > + | > + left = variable() > + | > + "(" left = orExpression() ")" > + ) > + { > + return left; > + } > +} > + > + > + > +ConstantExpression literal() : > +{ > + Token t; > + String s; > + ConstantExpression left=null; > +} > +{ > + ( > + ( > + s = stringLitteral() > + { > + left = new ConstantExpression(s); > + } > + ) > + | > + ( > + t = <DECIMAL_LITERAL> > + { > + left = ConstantExpression.createFromDecimal(t.image); > + } > + ) > + | > + ( > + t = <HEX_LITERAL> > + { > + left = ConstantExpression.createFromHex(t.image); > + } > + ) > + | > + ( > + t = <OCTAL_LITERAL> > + { > + left = ConstantExpression.createFromOctal(t.image); > + } > + ) > + | > + ( > + t = <FLOATING_POINT_LITERAL> > + { > + left = ConstantExpression.createFloat(t.image); > + } > + ) > + | > + ( > + <TRUE> > + { > + left = ConstantExpression.TRUE; > + } > + ) > + | > + ( > + <FALSE> > + { > + left = ConstantExpression.FALSE; > + } > + ) > + | > + ( > + <NULL> > + { > + left = ConstantExpression.NULL; > + } > + ) > + ) > + { > + return left; > + } > +} > + > +String stringLitteral() : > +{ > + Token t; > + StringBuffer rc = new StringBuffer(); > + boolean first=true; > +} > +{ > + t = <STRING_LITERAL> > + { > + // Decode the sting value. > + String image = t.image; > + for( int i=1; i < image.length()-1; i++ ) { > + char c = image.charAt(i); > + if( c == '\'' ) > + i++; > + rc.append(c); > + } > + return rc.toString(); > + } > +} > + > +PropertyExpression variable() : > +{ > + Token t; > + PropertyExpression left=null; > +} > +{ > + ( > + t = <ID> > + { > + left = new PropertyExpression(t.image); > + } > + ) > + { > + return left; > + } > +} > > > -- Martin Ritchie
