Index: QueryParser.jj =================================================================== RCS file: /home/cvspublic/jakarta-lucene/src/java/org/apache/lucene/queryParser/QueryParser.jj,v retrieving revision 1.39 diff -u -r1.39 QueryParser.jj --- QueryParser.jj 26 Jan 2004 18:53:14 -0000 1.39 +++ QueryParser.jj 10 Feb 2004 09:34:45 -0000 @@ -447,6 +447,22 @@ Term t = new Term(field, termStr); return new FuzzyQuery(t); } + + /** + * Returns a String where the escape char has been + * removed or kept once if there was a double escape + */ + private String discardEscapeChar(String input) { + char[] caSource=input.toCharArray(); + char[] caDest=new char[caSource.length]; + int j=0; + for (int i=0;i0 && caSource[i-1]=='\\')) + caDest[j++]=caSource[i]; + } + return new String(caDest,0,j); + } public static void main(String[] args) throws Exception { QueryParser qp = new QueryParser("field", @@ -584,7 +600,9 @@ { [ LOOKAHEAD(2) - fieldToken= { field = fieldToken.image; } + fieldToken= { + field=discardEscapeChar(fieldToken.image); + } ] ( @@ -624,15 +642,17 @@ [ { fuzzy=true; } ] [ boost= [ { fuzzy=true; } ] ] { + String termImage=discardEscapeChar(term.image); if (wildcard) { - q = getWildcardQuery(field, term.image); + q = getWildcardQuery(field, termImage); } else if (prefix) { - q = getPrefixQuery(field, term.image.substring - (0, term.image.length()-1)); + q = getPrefixQuery(field, + discardEscapeChar(term.image.substring + (0, term.image.length()-1))); } else if (fuzzy) { - q = getFuzzyQuery(field, term.image); + q = getFuzzyQuery(field, termImage); } else { - q = getFieldQuery(field, analyzer, term.image); + q = getFieldQuery(field, analyzer, termImage); } } | ( ( goop1=|goop1= ) @@ -640,11 +660,16 @@ ) [ boost= ] { - if (goop1.kind == RANGEIN_QUOTED) + if (goop1.kind == RANGEIN_QUOTED) { goop1.image = goop1.image.substring(1, goop1.image.length()-1); - if (goop2.kind == RANGEIN_QUOTED) + } else { + goop1.image = discardEscapeChar(goop1.image); + } + if (goop2.kind == RANGEIN_QUOTED) { goop2.image = goop2.image.substring(1, goop2.image.length()-1); - + } else { + goop2.image = discardEscapeChar(goop2.image); + } q = getRangeQuery(field, analyzer, goop1.image, goop2.image, true); } | ( ( goop1=|goop1= ) @@ -652,11 +677,17 @@ ) [ boost= ] { - if (goop1.kind == RANGEEX_QUOTED) + if (goop1.kind == RANGEEX_QUOTED) { goop1.image = goop1.image.substring(1, goop1.image.length()-1); - if (goop2.kind == RANGEEX_QUOTED) + } else { + goop1.image = discardEscapeChar(goop1.image); + } + if (goop2.kind == RANGEEX_QUOTED) { goop2.image = goop2.image.substring(1, goop2.image.length()-1); - + } else { + goop2.image = discardEscapeChar(goop2.image); + } + q = getRangeQuery(field, analyzer, goop1.image, goop2.image, false); } | term= Index: TestQueryParser.java =================================================================== RCS file: /home/cvspublic/jakarta-lucene/src/test/org/apache/lucene/queryParser/TestQueryParser.java,v retrieving revision 1.23 diff -u -r1.23 TestQueryParser.java --- TestQueryParser.java 26 Nov 2003 11:03:30 -0000 1.23 +++ TestQueryParser.java 10 Feb 2004 09:35:13 -0000 @@ -355,7 +355,7 @@ public void testEscaped() throws Exception { Analyzer a = new WhitespaceAnalyzer(); - assertQueryEquals("\\[brackets", a, "\\[brackets"); + /* assertQueryEquals("\\[brackets", a, "\\[brackets"); assertQueryEquals("\\[brackets", null, "brackets"); assertQueryEquals("\\\\", a, "\\\\"); assertQueryEquals("\\+blah", a, "\\+blah"); @@ -377,8 +377,36 @@ assertQueryEquals("\\?blah", a, "\\?blah"); assertQueryEquals("foo \\&& bar", a, "foo \\&& bar"); assertQueryEquals("foo \\|| bar", a, "foo \\|| bar"); - assertQueryEquals("foo \\AND bar", a, "foo \\AND bar"); + assertQueryEquals("foo \\AND bar", a, "foo \\AND bar"); */ + assertQueryEquals("a\\-b:c",a,"a-b:c"); + assertQueryEquals("a\\+b:c",a,"a+b:c"); + assertQueryEquals("a\\:b:c",a,"a:b:c"); + assertQueryEquals("a\\\\b:c",a,"a\\b:c"); + + assertQueryEquals("a:b\\-c",a,"a:b-c"); + assertQueryEquals("a:b\\+c",a,"a:b+c"); + assertQueryEquals("a:b\\:c",a,"a:b:c"); + assertQueryEquals("a:b\\\\c",a,"a:b\\c"); + + assertQueryEquals("a:b\\-c*",a,"a:b-c*"); + assertQueryEquals("a:b\\+c*",a,"a:b+c*"); + assertQueryEquals("a:b\\:c*",a,"a:b:c*"); + assertQueryEquals("a:b\\\\c*",a,"a:b\\c*"); + + assertQueryEquals("a:b\\-?c",a,"a:b-?c"); + assertQueryEquals("a:b\\+?c",a,"a:b+?c"); + assertQueryEquals("a:b\\:?c",a,"a:b:?c"); + assertQueryEquals("a:b\\\\?c",a,"a:b\\?c"); + + assertQueryEquals("a:b\\-c~",a,"a:b-c~"); + assertQueryEquals("a:b\\+c~",a,"a:b+c~"); + assertQueryEquals("a:b\\:c~",a,"a:b:c~"); + assertQueryEquals("a:b\\\\c~",a,"a:b\\c~"); + + assertQueryEquals("[ a\\- TO a\\+ ]", null, "[a- TO a+]"); + assertQueryEquals("[ a\\: TO a\\~ ]", null, "[a: TO a~]"); + assertQueryEquals("[ a\\\\ TO a\\* ]", null, "[a\\ TO a*]"); } public void testSimpleDAO()