You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by us...@apache.org on 2014/06/13 10:54:21 UTC
svn commit: r1602344 - in /lucene/dev/trunk/lucene: ./
expressions/src/java/org/apache/lucene/expressions/js/
expressions/src/test/org/apache/lucene/expressions/
Author: uschindler
Date: Fri Jun 13 08:54:20 2014
New Revision: 1602344
URL: http://svn.apache.org/r1602344
Log:
LUCENE-5754: Allow "$" as part of variable and function names in expressions module
Modified:
lucene/dev/trunk/lucene/CHANGES.txt
lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/Javascript.g
lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptLexer.java
lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptParser.java
lucene/dev/trunk/lucene/expressions/src/test/org/apache/lucene/expressions/TestDemoExpressions.java
Modified: lucene/dev/trunk/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/CHANGES.txt?rev=1602344&r1=1602343&r2=1602344&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/CHANGES.txt (original)
+++ lucene/dev/trunk/lucene/CHANGES.txt Fri Jun 13 08:54:20 2014
@@ -135,6 +135,9 @@ New Features
* LUCENE-5748: Add SORTED_NUMERIC docvalues type, which is efficient
for processing numeric fields with multiple values. (Robert Muir)
+* LUCENE-5754: Allow "$" as part of variable and function names in
+ expressions module. (Uwe Schindler)
+
Changes in Backwards Compatibility Policy
* LUCENE-5634: Add reuse argument to IndexableField.tokenStream. This
Modified: lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/Javascript.g
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/Javascript.g?rev=1602344&r1=1602343&r2=1602344&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/Javascript.g (original)
+++ lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/Javascript.g Fri Jun 13 08:54:20 2014
@@ -336,7 +336,7 @@ NAMESPACE_ID
fragment
ID
- : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
+ : ('a'..'z'|'A'..'Z'|'_'|'$') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'$')*
;
WS
Modified: lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptLexer.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptLexer.java?rev=1602344&r1=1602343&r2=1602344&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptLexer.java (original)
+++ lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptLexer.java Fri Jun 13 08:54:20 2014
@@ -679,10 +679,10 @@ class JavascriptLexer extends Lexer {
// $ANTLR start "ID"
public final void mID() throws RecognitionException {
try {
- // src/java/org/apache/lucene/expressions/js/Javascript.g:340:5: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )* )
- // src/java/org/apache/lucene/expressions/js/Javascript.g:340:7: ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )*
+ // src/java/org/apache/lucene/expressions/js/Javascript.g:340:5: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '$' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' | '$' )* )
+ // src/java/org/apache/lucene/expressions/js/Javascript.g:340:7: ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '$' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' | '$' )*
{
- if ( (input.LA(1) >= 'A' && input.LA(1) <= 'Z')||input.LA(1)=='_'||(input.LA(1) >= 'a' && input.LA(1) <= 'z') ) {
+ if ( input.LA(1)=='$'||(input.LA(1) >= 'A' && input.LA(1) <= 'Z')||input.LA(1)=='_'||(input.LA(1) >= 'a' && input.LA(1) <= 'z') ) {
input.consume();
}
else {
@@ -690,12 +690,12 @@ class JavascriptLexer extends Lexer {
recover(mse);
throw mse;
}
- // src/java/org/apache/lucene/expressions/js/Javascript.g:340:31: ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )*
+ // src/java/org/apache/lucene/expressions/js/Javascript.g:340:35: ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' | '$' )*
loop2:
while (true) {
int alt2=2;
int LA2_0 = input.LA(1);
- if ( ((LA2_0 >= '0' && LA2_0 <= '9')||(LA2_0 >= 'A' && LA2_0 <= 'Z')||LA2_0=='_'||(LA2_0 >= 'a' && LA2_0 <= 'z')) ) {
+ if ( (LA2_0=='$'||(LA2_0 >= '0' && LA2_0 <= '9')||(LA2_0 >= 'A' && LA2_0 <= 'Z')||LA2_0=='_'||(LA2_0 >= 'a' && LA2_0 <= 'z')) ) {
alt2=1;
}
@@ -703,7 +703,7 @@ class JavascriptLexer extends Lexer {
case 1 :
// src/java/org/apache/lucene/expressions/js/Javascript.g:
{
- if ( (input.LA(1) >= '0' && input.LA(1) <= '9')||(input.LA(1) >= 'A' && input.LA(1) <= 'Z')||input.LA(1)=='_'||(input.LA(1) >= 'a' && input.LA(1) <= 'z') ) {
+ if ( input.LA(1)=='$'||(input.LA(1) >= '0' && input.LA(1) <= '9')||(input.LA(1) >= 'A' && input.LA(1) <= 'Z')||input.LA(1)=='_'||(input.LA(1) >= 'a' && input.LA(1) <= 'z') ) {
input.consume();
}
else {
@@ -1476,6 +1476,7 @@ class JavascriptLexer extends Lexer {
alt17=27;
}
break;
+ case '$':
case 'A':
case 'B':
case 'C':
Modified: lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptParser.java?rev=1602344&r1=1602343&r2=1602344&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptParser.java (original)
+++ lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptParser.java Fri Jun 13 08:54:20 2014
@@ -1571,7 +1571,7 @@ class JavascriptParser extends Parser {
stream_arguments.add(arguments48.getTree());
// AST REWRITE
- // elements: NAMESPACE_ID, arguments
+ // elements: arguments, NAMESPACE_ID
// token labels:
// rule labels: retval
// token list labels:
Modified: lucene/dev/trunk/lucene/expressions/src/test/org/apache/lucene/expressions/TestDemoExpressions.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/expressions/src/test/org/apache/lucene/expressions/TestDemoExpressions.java?rev=1602344&r1=1602343&r2=1602344&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/expressions/src/test/org/apache/lucene/expressions/TestDemoExpressions.java (original)
+++ lucene/dev/trunk/lucene/expressions/src/test/org/apache/lucene/expressions/TestDemoExpressions.java Fri Jun 13 08:54:20 2014
@@ -136,6 +136,25 @@ public class TestDemoExpressions extend
}
}
+ /** Uses variables with $ */
+ public void testDollarVariable() throws Exception {
+ Expression expr = JavascriptCompiler.compile("$0+$score");
+
+ SimpleBindings bindings = new SimpleBindings();
+ bindings.add(new SortField("$0", SortField.Type.SCORE));
+ bindings.add(new SortField("$score", SortField.Type.SCORE));
+
+ Sort sort = new Sort(expr.getSortField(bindings, true));
+ Query query = new TermQuery(new Term("body", "contents"));
+ TopFieldDocs td = searcher.search(query, null, 3, sort, true, true);
+ for (int i = 0; i < 3; i++) {
+ FieldDoc d = (FieldDoc) td.scoreDocs[i];
+ float expected = 2*d.score;
+ float actual = ((Double)d.fields[0]).floatValue();
+ assertEquals(expected, actual, CheckHits.explainToleranceDelta(expected, actual));
+ }
+ }
+
/** tests expression referring to another expression */
public void testExpressionRefersToExpression() throws Exception {
Expression expr1 = JavascriptCompiler.compile("_score");