You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by si...@apache.org on 2013/02/05 15:14:59 UTC
svn commit: r1442596 - in /lucene/dev/trunk/lucene/queryparser/src:
java/org/apache/lucene/queryparser/classic/
test/org/apache/lucene/queryparser/classic/
Author: simonw
Date: Tue Feb 5 14:14:58 2013
New Revision: 1442596
URL: http://svn.apache.org/viewvc?rev=1442596&view=rev
Log:
LUCENE-4745: Allow FuzzySlop customization in classic QueryParser
Modified:
lucene/dev/trunk/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParser.jj
lucene/dev/trunk/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParserBase.java
lucene/dev/trunk/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParserTokenManager.java
lucene/dev/trunk/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestQueryParser.java
Modified: lucene/dev/trunk/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParser.jj
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParser.jj?rev=1442596&r1=1442595&r2=1442596&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParser.jj (original)
+++ lucene/dev/trunk/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParser.jj Tue Feb 5 14:14:58 2013
@@ -162,7 +162,7 @@ PARSER_END(QueryParser)
| <CARAT: "^" > : Boost
| <QUOTED: "\"" (<_QUOTED_CHAR>)* "\"">
| <TERM: <_TERM_START_CHAR> (<_TERM_CHAR>)* >
-| <FUZZY_SLOP: "~" ( (<_NUM_CHAR>)+ ( "." (<_NUM_CHAR>)+ )? )? >
+| <FUZZY_SLOP: "~" ((<_NUM_CHAR>)+ (( "." (<_NUM_CHAR>)+ )? (<_TERM_CHAR>)*) | (<_TERM_CHAR>)*) >
| <PREFIXTERM: ("*") | ( <_TERM_START_CHAR> (<_TERM_CHAR>)* "*" ) >
| <WILDTERM: (<_TERM_START_CHAR> | [ "*", "?" ]) (<_TERM_CHAR> | ( [ "*", "?" ] ))* >
| <REGEXPTERM: "/" (~[ "/" ] | "\\/" )* "/" >
Modified: lucene/dev/trunk/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParserBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParserBase.java?rev=1442596&r1=1442595&r2=1442596&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParserBase.java (original)
+++ lucene/dev/trunk/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParserBase.java Tue Feb 5 14:14:58 2013
@@ -1070,22 +1070,29 @@ public abstract class QueryParserBase im
} else if (regexp) {
q = getRegexpQuery(qfield, term.image.substring(1, term.image.length()-1));
} else if (fuzzy) {
- float fms = fuzzyMinSim;
- try {
- fms = Float.valueOf(fuzzySlop.image.substring(1)).floatValue();
- } catch (Exception ignored) { }
- if(fms < 0.0f){
- throw new ParseException("Minimum similarity for a FuzzyQuery has to be between 0.0f and 1.0f !");
- } else if (fms >= 1.0f && fms != (int) fms) {
- throw new ParseException("Fractional edit distances are not allowed!");
- }
- q = getFuzzyQuery(qfield, termImage, fms);
+ q = handleBareFuzzy(qfield, fuzzySlop, termImage);
} else {
q = getFieldQuery(qfield, termImage, false);
}
return q;
}
+ Query handleBareFuzzy(String qfield, Token fuzzySlop, String termImage)
+ throws ParseException {
+ Query q;
+ float fms = fuzzyMinSim;
+ try {
+ fms = Float.valueOf(fuzzySlop.image.substring(1)).floatValue();
+ } catch (Exception ignored) { }
+ if(fms < 0.0f){
+ throw new ParseException("Minimum similarity for a FuzzyQuery has to be between 0.0f and 1.0f !");
+ } else if (fms >= 1.0f && fms != (int) fms) {
+ throw new ParseException("Fractional edit distances are not allowed!");
+ }
+ q = getFuzzyQuery(qfield, termImage, fms);
+ return q;
+ }
+
// extracted from the .jj grammar
Query handleQuotedTerm(String qfield, Token term, Token fuzzySlop) throws ParseException {
int s = phraseSlop; // default
Modified: lucene/dev/trunk/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParserTokenManager.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParserTokenManager.java?rev=1442596&r1=1442595&r2=1442596&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParserTokenManager.java (original)
+++ lucene/dev/trunk/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParserTokenManager.java Tue Feb 5 14:14:58 2013
@@ -47,7 +47,7 @@ private int jjMoveStringLiteralDfa0_2()
case 41:
return jjStopAtPos(0, 15);
case 42:
- return jjStartNfaWithStates_2(0, 17, 43);
+ return jjStartNfaWithStates_2(0, 17, 49);
case 43:
return jjStartNfaWithStates_2(0, 11, 15);
case 45:
@@ -87,7 +87,7 @@ static final long[] jjbitVec4 = {
private int jjMoveNfa_2(int startState, int curPos)
{
int startsAt = 0;
- jjnewStateCnt = 43;
+ jjnewStateCnt = 49;
int i = 1;
jjstateSet[0] = startState;
int kind = 0x7fffffff;
@@ -102,12 +102,20 @@ private int jjMoveNfa_2(int startState,
{
switch(jjstateSet[--i])
{
+ case 49:
+ case 33:
+ if ((0xfbff7cf8ffffd9ffL & l) == 0L)
+ break;
+ if (kind > 23)
+ kind = 23;
+ jjCheckNAddTwoStates(33, 34);
+ break;
case 0:
if ((0xfbff54f8ffffd9ffL & l) != 0L)
{
if (kind > 23)
kind = 23;
- jjCheckNAddTwoStates(27, 28);
+ jjCheckNAddTwoStates(33, 34);
}
else if ((0x100002600L & l) != 0L)
{
@@ -139,14 +147,6 @@ private int jjMoveNfa_2(int startState,
if (curChar == 38)
jjstateSet[jjnewStateCnt++] = 4;
break;
- case 43:
- case 27:
- if ((0xfbff7cf8ffffd9ffL & l) == 0L)
- break;
- if (kind > 23)
- kind = 23;
- jjCheckNAddTwoStates(27, 28);
- break;
case 4:
if (curChar == 38 && kind > 8)
kind = 8;
@@ -187,7 +187,7 @@ private int jjMoveNfa_2(int startState,
break;
if (kind > 21)
kind = 21;
- jjAddStates(11, 12);
+ jjCheckNAddStates(11, 14);
break;
case 23:
if (curChar == 46)
@@ -198,62 +198,86 @@ private int jjMoveNfa_2(int startState,
break;
if (kind > 21)
kind = 21;
- jjCheckNAdd(24);
+ jjCheckNAddStates(15, 17);
break;
case 25:
+ if ((0x7bff78f8ffffd9ffL & l) == 0L)
+ break;
+ if (kind > 21)
+ kind = 21;
+ jjCheckNAddTwoStates(25, 26);
+ break;
+ case 27:
+ if (kind > 21)
+ kind = 21;
+ jjCheckNAddTwoStates(25, 26);
+ break;
+ case 28:
+ if ((0x7bff78f8ffffd9ffL & l) == 0L)
+ break;
+ if (kind > 21)
+ kind = 21;
+ jjCheckNAddTwoStates(28, 29);
+ break;
+ case 30:
+ if (kind > 21)
+ kind = 21;
+ jjCheckNAddTwoStates(28, 29);
+ break;
+ case 31:
if (curChar == 42 && kind > 22)
kind = 22;
break;
- case 26:
+ case 32:
if ((0xfbff54f8ffffd9ffL & l) == 0L)
break;
if (kind > 23)
kind = 23;
- jjCheckNAddTwoStates(27, 28);
+ jjCheckNAddTwoStates(33, 34);
break;
- case 29:
+ case 35:
if (kind > 23)
kind = 23;
- jjCheckNAddTwoStates(27, 28);
+ jjCheckNAddTwoStates(33, 34);
break;
- case 30:
- case 32:
+ case 36:
+ case 38:
if (curChar == 47)
jjCheckNAddStates(0, 2);
break;
- case 31:
+ case 37:
if ((0xffff7fffffffffffL & l) != 0L)
jjCheckNAddStates(0, 2);
break;
- case 34:
+ case 40:
if (curChar == 47 && kind > 24)
kind = 24;
break;
- case 35:
+ case 41:
if ((0x7bff50f8ffffd9ffL & l) == 0L)
break;
if (kind > 20)
kind = 20;
jjCheckNAddStates(6, 10);
break;
- case 36:
+ case 42:
if ((0x7bff78f8ffffd9ffL & l) == 0L)
break;
if (kind > 20)
kind = 20;
- jjCheckNAddTwoStates(36, 37);
+ jjCheckNAddTwoStates(42, 43);
break;
- case 38:
+ case 44:
if (kind > 20)
kind = 20;
- jjCheckNAddTwoStates(36, 37);
+ jjCheckNAddTwoStates(42, 43);
break;
- case 39:
+ case 45:
if ((0x7bff78f8ffffd9ffL & l) != 0L)
- jjCheckNAddStates(13, 15);
+ jjCheckNAddStates(18, 20);
break;
- case 41:
- jjCheckNAddStates(13, 15);
+ case 47:
+ jjCheckNAddStates(18, 20);
break;
default : break;
}
@@ -266,6 +290,16 @@ private int jjMoveNfa_2(int startState,
{
switch(jjstateSet[--i])
{
+ case 49:
+ if ((0x97ffffff87ffffffL & l) != 0L)
+ {
+ if (kind > 23)
+ kind = 23;
+ jjCheckNAddTwoStates(33, 34);
+ }
+ else if (curChar == 92)
+ jjCheckNAddTwoStates(35, 35);
+ break;
case 0:
if ((0x97ffffff87ffffffL & l) != 0L)
{
@@ -274,18 +308,18 @@ private int jjMoveNfa_2(int startState,
jjCheckNAddStates(6, 10);
}
else if (curChar == 92)
- jjCheckNAddStates(16, 18);
+ jjCheckNAddStates(21, 23);
else if (curChar == 126)
{
if (kind > 21)
kind = 21;
- jjstateSet[jjnewStateCnt++] = 22;
+ jjCheckNAddStates(24, 26);
}
if ((0x97ffffff87ffffffL & l) != 0L)
{
if (kind > 23)
kind = 23;
- jjCheckNAddTwoStates(27, 28);
+ jjCheckNAddTwoStates(33, 34);
}
if (curChar == 78)
jjstateSet[jjnewStateCnt++] = 11;
@@ -296,16 +330,6 @@ private int jjMoveNfa_2(int startState,
else if (curChar == 65)
jjstateSet[jjnewStateCnt++] = 2;
break;
- case 43:
- if ((0x97ffffff87ffffffL & l) != 0L)
- {
- if (kind > 23)
- kind = 23;
- jjCheckNAddTwoStates(27, 28);
- }
- else if (curChar == 92)
- jjCheckNAddTwoStates(29, 29);
- break;
case 1:
if (curChar == 68 && kind > 8)
kind = 8;
@@ -362,75 +386,107 @@ private int jjMoveNfa_2(int startState,
break;
if (kind > 21)
kind = 21;
- jjstateSet[jjnewStateCnt++] = 22;
+ jjCheckNAddStates(24, 26);
+ break;
+ case 25:
+ if ((0x97ffffff87ffffffL & l) == 0L)
+ break;
+ if (kind > 21)
+ kind = 21;
+ jjCheckNAddTwoStates(25, 26);
break;
case 26:
+ if (curChar == 92)
+ jjAddStates(27, 28);
+ break;
+ case 27:
+ if (kind > 21)
+ kind = 21;
+ jjCheckNAddTwoStates(25, 26);
+ break;
+ case 28:
+ if ((0x97ffffff87ffffffL & l) == 0L)
+ break;
+ if (kind > 21)
+ kind = 21;
+ jjCheckNAddTwoStates(28, 29);
+ break;
+ case 29:
+ if (curChar == 92)
+ jjAddStates(29, 30);
+ break;
+ case 30:
+ if (kind > 21)
+ kind = 21;
+ jjCheckNAddTwoStates(28, 29);
+ break;
+ case 32:
if ((0x97ffffff87ffffffL & l) == 0L)
break;
if (kind > 23)
kind = 23;
- jjCheckNAddTwoStates(27, 28);
+ jjCheckNAddTwoStates(33, 34);
break;
- case 27:
+ case 33:
if ((0x97ffffff87ffffffL & l) == 0L)
break;
if (kind > 23)
kind = 23;
- jjCheckNAddTwoStates(27, 28);
+ jjCheckNAddTwoStates(33, 34);
break;
- case 28:
+ case 34:
if (curChar == 92)
- jjCheckNAddTwoStates(29, 29);
+ jjCheckNAddTwoStates(35, 35);
break;
- case 29:
+ case 35:
if (kind > 23)
kind = 23;
- jjCheckNAddTwoStates(27, 28);
+ jjCheckNAddTwoStates(33, 34);
break;
- case 31:
+ case 37:
jjAddStates(0, 2);
break;
- case 33:
+ case 39:
if (curChar == 92)
- jjstateSet[jjnewStateCnt++] = 32;
+ jjstateSet[jjnewStateCnt++] = 38;
break;
- case 35:
+ case 41:
if ((0x97ffffff87ffffffL & l) == 0L)
break;
if (kind > 20)
kind = 20;
jjCheckNAddStates(6, 10);
break;
- case 36:
+ case 42:
if ((0x97ffffff87ffffffL & l) == 0L)
break;
if (kind > 20)
kind = 20;
- jjCheckNAddTwoStates(36, 37);
+ jjCheckNAddTwoStates(42, 43);
break;
- case 37:
+ case 43:
if (curChar == 92)
- jjCheckNAddTwoStates(38, 38);
+ jjCheckNAddTwoStates(44, 44);
break;
- case 38:
+ case 44:
if (kind > 20)
kind = 20;
- jjCheckNAddTwoStates(36, 37);
+ jjCheckNAddTwoStates(42, 43);
break;
- case 39:
+ case 45:
if ((0x97ffffff87ffffffL & l) != 0L)
- jjCheckNAddStates(13, 15);
+ jjCheckNAddStates(18, 20);
break;
- case 40:
+ case 46:
if (curChar == 92)
- jjCheckNAddTwoStates(41, 41);
+ jjCheckNAddTwoStates(47, 47);
break;
- case 41:
- jjCheckNAddStates(13, 15);
+ case 47:
+ jjCheckNAddStates(18, 20);
break;
- case 42:
+ case 48:
if (curChar == 92)
- jjCheckNAddStates(16, 18);
+ jjCheckNAddStates(21, 23);
break;
default : break;
}
@@ -447,6 +503,14 @@ private int jjMoveNfa_2(int startState,
{
switch(jjstateSet[--i])
{
+ case 49:
+ case 33:
+ if (!jjCanMove_2(hiByte, i1, i2, l1, l2))
+ break;
+ if (kind > 23)
+ kind = 23;
+ jjCheckNAddTwoStates(33, 34);
+ break;
case 0:
if (jjCanMove_0(hiByte, i1, i2, l1, l2))
{
@@ -457,7 +521,7 @@ private int jjMoveNfa_2(int startState,
{
if (kind > 23)
kind = 23;
- jjCheckNAddTwoStates(27, 28);
+ jjCheckNAddTwoStates(33, 34);
}
if (jjCanMove_2(hiByte, i1, i2, l1, l2))
{
@@ -466,14 +530,6 @@ private int jjMoveNfa_2(int startState,
jjCheckNAddStates(6, 10);
}
break;
- case 43:
- case 27:
- if (!jjCanMove_2(hiByte, i1, i2, l1, l2))
- break;
- if (kind > 23)
- kind = 23;
- jjCheckNAddTwoStates(27, 28);
- break;
case 15:
if (jjCanMove_0(hiByte, i1, i2, l1, l2) && kind > 13)
kind = 13;
@@ -483,52 +539,80 @@ private int jjMoveNfa_2(int startState,
if (jjCanMove_1(hiByte, i1, i2, l1, l2))
jjCheckNAddStates(3, 5);
break;
- case 26:
+ case 25:
+ if (!jjCanMove_2(hiByte, i1, i2, l1, l2))
+ break;
+ if (kind > 21)
+ kind = 21;
+ jjCheckNAddTwoStates(25, 26);
+ break;
+ case 27:
+ if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
+ break;
+ if (kind > 21)
+ kind = 21;
+ jjCheckNAddTwoStates(25, 26);
+ break;
+ case 28:
+ if (!jjCanMove_2(hiByte, i1, i2, l1, l2))
+ break;
+ if (kind > 21)
+ kind = 21;
+ jjCheckNAddTwoStates(28, 29);
+ break;
+ case 30:
+ if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
+ break;
+ if (kind > 21)
+ kind = 21;
+ jjCheckNAddTwoStates(28, 29);
+ break;
+ case 32:
if (!jjCanMove_2(hiByte, i1, i2, l1, l2))
break;
if (kind > 23)
kind = 23;
- jjCheckNAddTwoStates(27, 28);
+ jjCheckNAddTwoStates(33, 34);
break;
- case 29:
+ case 35:
if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
break;
if (kind > 23)
kind = 23;
- jjCheckNAddTwoStates(27, 28);
+ jjCheckNAddTwoStates(33, 34);
break;
- case 31:
+ case 37:
if (jjCanMove_1(hiByte, i1, i2, l1, l2))
jjAddStates(0, 2);
break;
- case 35:
+ case 41:
if (!jjCanMove_2(hiByte, i1, i2, l1, l2))
break;
if (kind > 20)
kind = 20;
jjCheckNAddStates(6, 10);
break;
- case 36:
+ case 42:
if (!jjCanMove_2(hiByte, i1, i2, l1, l2))
break;
if (kind > 20)
kind = 20;
- jjCheckNAddTwoStates(36, 37);
+ jjCheckNAddTwoStates(42, 43);
break;
- case 38:
+ case 44:
if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
break;
if (kind > 20)
kind = 20;
- jjCheckNAddTwoStates(36, 37);
+ jjCheckNAddTwoStates(42, 43);
break;
- case 39:
+ case 45:
if (jjCanMove_2(hiByte, i1, i2, l1, l2))
- jjCheckNAddStates(13, 15);
+ jjCheckNAddStates(18, 20);
break;
- case 41:
+ case 47:
if (jjCanMove_1(hiByte, i1, i2, l1, l2))
- jjCheckNAddStates(13, 15);
+ jjCheckNAddStates(18, 20);
break;
default : break;
}
@@ -541,7 +625,7 @@ private int jjMoveNfa_2(int startState,
kind = 0x7fffffff;
}
++curPos;
- if ((i = jjnewStateCnt) == (startsAt = 43 - (jjnewStateCnt = startsAt)))
+ if ((i = jjnewStateCnt) == (startsAt = 49 - (jjnewStateCnt = startsAt)))
return curPos;
try { curChar = input_stream.readChar(); }
catch(java.io.IOException e) { return curPos; }
@@ -574,7 +658,7 @@ private int jjMoveNfa_0(int startState,
break;
if (kind > 27)
kind = 27;
- jjAddStates(19, 20);
+ jjAddStates(31, 32);
break;
case 1:
if (curChar == 46)
@@ -728,11 +812,11 @@ private int jjMoveNfa_1(int startState,
break;
case 2:
if ((0xfffffffbffffffffL & l) != 0L)
- jjCheckNAddStates(21, 23);
+ jjCheckNAddStates(33, 35);
break;
case 3:
if (curChar == 34)
- jjCheckNAddStates(21, 23);
+ jjCheckNAddStates(33, 35);
break;
case 5:
if (curChar == 34 && kind > 31)
@@ -765,7 +849,7 @@ private int jjMoveNfa_1(int startState,
jjCheckNAdd(6);
break;
case 2:
- jjAddStates(21, 23);
+ jjAddStates(33, 35);
break;
case 4:
if (curChar == 92)
@@ -801,7 +885,7 @@ private int jjMoveNfa_1(int startState,
break;
case 2:
if (jjCanMove_1(hiByte, i1, i2, l1, l2))
- jjAddStates(21, 23);
+ jjAddStates(33, 35);
break;
case 6:
if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
@@ -828,8 +912,9 @@ private int jjMoveNfa_1(int startState,
}
}
static final int[] jjnextStates = {
- 31, 33, 34, 17, 18, 20, 36, 39, 25, 40, 37, 22, 23, 39, 25, 40,
- 38, 41, 29, 0, 1, 2, 4, 5,
+ 37, 39, 40, 17, 18, 20, 42, 45, 31, 46, 43, 22, 23, 25, 26, 24,
+ 25, 26, 45, 31, 46, 44, 47, 35, 22, 28, 29, 27, 27, 30, 30, 0,
+ 1, 2, 4, 5,
};
private static final boolean jjCanMove_0(int hiByte, int i1, int i2, long l1, long l2)
{
@@ -893,8 +978,8 @@ static final long[] jjtoSkip = {
0x80L,
};
protected CharStream input_stream;
-private final int[] jjrounds = new int[43];
-private final int[] jjstateSet = new int[86];
+private final int[] jjrounds = new int[49];
+private final int[] jjstateSet = new int[98];
protected char curChar;
/** Constructor. */
public QueryParserTokenManager(CharStream stream){
@@ -919,7 +1004,7 @@ private void ReInitRounds()
{
int i;
jjround = 0x80000001;
- for (i = 43; i-- > 0;)
+ for (i = 49; i-- > 0;)
jjrounds[i] = 0x80000000;
}
Modified: lucene/dev/trunk/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestQueryParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestQueryParser.java?rev=1442596&r1=1442595&r2=1442596&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestQueryParser.java (original)
+++ lucene/dev/trunk/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestQueryParser.java Tue Feb 5 14:14:58 2013
@@ -160,6 +160,28 @@ public class TestQueryParser extends Que
}
}
+ public void testFuzzySlopeExtendability() throws ParseException {
+ QueryParser qp = new QueryParser(TEST_VERSION_CURRENT, "a", new MockAnalyzer(random(), MockTokenizer.WHITESPACE, false)) {
+
+ @Override
+ Query handleBareFuzzy(String qfield, Token fuzzySlop, String termImage)
+ throws ParseException {
+
+ if(fuzzySlop.image.endsWith("â¬")) {
+ float fms = fuzzyMinSim;
+ try {
+ fms = Float.valueOf(fuzzySlop.image.substring(1, fuzzySlop.image.length()-1)).floatValue();
+ } catch (Exception ignored) { }
+ float value = Float.parseFloat(termImage);
+ return getRangeQuery(qfield, Float.toString(value-fms/2.f), Float.toString(value+fms/2.f), true, true);
+ }
+ return super.handleBareFuzzy(qfield, fuzzySlop, termImage);
+ }
+
+ };
+ assertEquals(qp.parse("a:[11.95 TO 12.95]"), qp.parse("12.45~1â¬"));
+ }
+
@Override
public void testStarParsing() throws Exception {
final int[] type = new int[1];