QueryParser can throw NullPointerException during parsing of some queries in 
case if default field passed to constructor is null
--------------------------------------------------------------------------------------------------------------------------------

                 Key: LUCENE-1418
                 URL: https://issues.apache.org/jira/browse/LUCENE-1418
             Project: Lucene - Java
          Issue Type: Bug
          Components: QueryParser
    Affects Versions: 2.4
         Environment: CentOS 5.2 (probably any applies)
            Reporter: Alexei Dets
            Priority: Minor


In case if QueryParser was constructed using "QueryParser(String f,  Analyzer 
a)" constructor and f equals null then QueryParser can fail with 
NullPointerException during parsing of some queries that _does_ contain field 
name but have unbalanced parenthesis.

Example 1:
Query:  field:(expr1) expr2)
Result:
java.lang.NullPointerException
        at org.apache.lucene.index.Term.<init>(Term.java:50)
        at org.apache.lucene.index.Term.<init>(Term.java:36)
        at 
org.apache.lucene.queryParser.QueryParser.getFieldQuery(QueryParser.java:543)
        at org.apache.lucene.queryParser.QueryParser.Term(QueryParser.java:1324)
        at 
org.apache.lucene.queryParser.QueryParser.Clause(QueryParser.java:1211)
        at 
org.apache.lucene.queryParser.QueryParser.Query(QueryParser.java:1168)
        at 
org.apache.lucene.queryParser.QueryParser.TopLevelQuery(QueryParser.java:1128)
        at org.apache.lucene.queryParser.QueryParser.parse(QueryParser.java:170)

Example2:
Query:  field:(expr1) "expr2")
Result:
java.lang.NullPointerException
        at org.apache.lucene.index.Term.<init>(Term.java:50)
        at org.apache.lucene.index.Term.<init>(Term.java:36)
        at 
org.apache.lucene.queryParser.QueryParser.getFieldQuery(QueryParser.java:543)
        at 
org.apache.lucene.queryParser.QueryParser.getFieldQuery(QueryParser.java:612)
        at org.apache.lucene.queryParser.QueryParser.Term(QueryParser.java:1459)
        at 
org.apache.lucene.queryParser.QueryParser.Clause(QueryParser.java:1211)
        at 
org.apache.lucene.queryParser.QueryParser.Query(QueryParser.java:1168)
        at 
org.apache.lucene.queryParser.QueryParser.TopLevelQuery(QueryParser.java:1128)
        at org.apache.lucene.queryParser.QueryParser.parse(QueryParser.java:170)

Workaround: pass in constructor empty string as a default field name - in this 
case QueryParser.parse method will throw ParseException (expected result 
because query string is wrong) instead of NullPointerException.

It is not obvious to me how to fix this so I'll describe my usecase, may be I'm 
doing something completely wrong.
Basically I have a set of per-field queries entered by user and need to 
programmatically construct (after some preprocessing) one real Lucene query 
combined from these user-entered per-field subqueries.
To achieve this I basically do the following (simplified a bit):

QueryParser parser = new QueryParser(null, analyzer); // I'll always provide a 
field name in a query string as it is different each time and I don't have any 
default
BooleanQuery query = new BooleanQuery();
Query subQuery1 = parser.parse(field1 + ":(" + queryString1 + ')');
query.add(subQuery1, operator1); // operator = BooleanClause.Occur.MUST, 
BooleanClause.Occur.MUST_NOT or BooleanClause.Occur.SHOULD
Query subQuery2 = parser.parse(field2 + ":(" + queryString2 + ')');
query.add(subQuery2, operator2); 
Query subQuery3 = parser.parse(field3 + ":(" + queryString3 + ')');
query.add(subQuery3, operator3); 
...

IMHO either QueryParser constructor should be changed to throw 
NullPointerException/InvalidArgumentException in case of null field passed (and 
API documentation updated) or QueryParser.parse behavior should be fixed to 
correctly throw ParseException instead of NullPointerException. Also IMHO of a 
great help can be _public_ setField/getField methods of QueryParser (that 
set/get field), this can help in use cases like my:

QueryParser parser = new QueryParser(null, analyzer); // or add constructor 
with analyzer _only_ for such cases
BooleanQuery query = new BooleanQuery();
parser.setField(field1);
Query subQuery1 = parser.parse(queryString1);
query.add(subQuery1, operator1);
parser.setField(field2);
Query subQuery2 = parser.parse(queryString2);
query.add(subQuery2, operator2); 
...

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to