blob: eb4e27e55f7a5d9fbfc5bfe5438cdd982f297d1b [file] [log] [blame]
Index: lucene/expressions/src/java/org/apache/lucene/expressions/js/Javascript.g
===================================================================
--- lucene/expressions/src/java/org/apache/lucene/expressions/js/Javascript.g (revision 1602068)
+++ lucene/expressions/src/java/org/apache/lucene/expressions/js/Javascript.g (working copy)
@@ -336,7 +336,7 @@
fragment
ID
- : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
+ : ('a'..'z'|'A'..'Z'|'_'|'$') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'$')*
;
WS
Index: lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptLexer.java
===================================================================
--- lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptLexer.java (revision 1602068)
+++ lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptLexer.java (working copy)
@@ -679,10 +679,10 @@
// $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 @@
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 @@
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 @@
alt17=27;
}
break;
+ case '$':
case 'A':
case 'B':
case 'C':
Index: lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptParser.java
===================================================================
--- lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptParser.java (revision 1602068)
+++ lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptParser.java (working copy)
@@ -1571,7 +1571,7 @@
stream_arguments.add(arguments48.getTree());
// AST REWRITE
- // elements: NAMESPACE_ID, arguments
+ // elements: arguments, NAMESPACE_ID
// token labels:
// rule labels: retval
// token list labels:
Index: lucene/expressions/src/test/org/apache/lucene/expressions/TestDemoExpressions.java
===================================================================
--- lucene/expressions/src/test/org/apache/lucene/expressions/TestDemoExpressions.java (revision 1602068)
+++ lucene/expressions/src/test/org/apache/lucene/expressions/TestDemoExpressions.java (working copy)
@@ -136,6 +136,25 @@
}
}
+ /** 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");