Issue Details (XML | Word | Printable)

Key: LUCENE-344
Type: Improvement Improvement
Status: Open Open
Priority: Minor Minor
Assignee: Lucene Developers
Reporter: Matthew Denner
Votes: 3
Watchers: 2
Operations

If you were logged in you would be able to see more operations.
Lucene - Java

[PATCH] Introduction of QueryFactory interface for Query construction

Created: 09/Feb/05 03:58 AM   Updated: 19/Nov/07 10:19 PM
Return to search
Component/s: QueryParser
Affects Version/s: unspecified
Fix Version/s: None

Time Tracking:
Not Specified

File Attachments:
  Size
Text File Lucene-QueryParser.patch 2005-02-09 04:46 AM Matthew Denner 99 kB
Environment:
Operating System: Linux
Platform: Other
Issue Links:
Duplicate
 

Bugzilla Id: 33449


 Description  « Hide
To override the default behaviour of the QueryParser you must currently extend
it and override the appropriate methods. This seemed to be a little awkward.

To enable a (hopefully) more flexible means of creating Query instances it
would seem better to introduce a QueryFactory interface and pass an instance of
an implementation of this interface to the QueryParser, having the QueryParser
callback to it to construct the query as it parses it. With this design you
could write something like:

QueryParser parser = new QueryParser("defaultField", new StandardAnalyzer(),
new QueryFactoryImpl());

Where 'QueryFactoryImpl' is an implementation of the QueryFactory interface.
If you wanted to add the ability to lower case all of your queries you could
then write:

QueryParser parser = new QueryParser("defaultField", new StandardAnalyzer(),
new LowerCaseQueryFactory(new QueryFactoryImpl()));

Where 'LowerCaseQueryFactory' is a decorator around another QueryFactory
instance and it simply lowercases all the terms passed to it before delegating
the actual query construction. This is a simple example, but more powerful
functionality could be added not by changing the QueryParser, but by creating a
new QueryFactory implementation.

I have a patch for this which will be forthcoming in a moment.



 All   Comments   Work Log   Change History   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
Matthew Denner added a comment - 09/Feb/05 04:46 AM
Created an attachment (id=14212)
Adds a QueryFactory interface and refactors code to use it

This patch adds a org.apache.lucene.search.QueryFactory interface and refactors
the Lucene code to use it. It has 3 implementations included:

  • org.apache.lucene.search.queryfactory.QueryFactoryImpl is an implementation
    created by extracting the QueryParser code for Query construction
  • org.apache.lucene.search.queryfactory.LowerCaseQueryFactory is a decorator
    implementation that will convert all terms to lowercase
  • org.apache.lucene.search.queryfactory.MultiFieldQueryFactory is an
    implementation created by extracting the MultiFieldQueryParser code for Query
    construction

Note that for some reason that I can't quite fathom at the moment this patch
seems to be rejected for the SearchTestForDuplicates code. To fix this you'll
need to manually edit this file and change the construction of the QueryParser
implementations to take a QueryFactoryImpl instance, i.e.

new QueryParser(PRIORITY_FIELD, analyzer, new QueryFactoryImpl())

I have added unit-tests for the QueryFactory implementations as best I could
and changed one or two tests in the TestQueryParser unit-test because of the
introduction of the LowerCaseQueryFactory. Because I have added these
unit-tests they rely on the MockObjects (http://www.mockobjects.com/) JAR file
(specifically I have used mockobjects-core-0.09.jar) which I have not included
in the patch but will attach here for download if so required.

Please also note that some of the API in QueryParser has moved into the
QueryFactoryImpl class as it seemed to be needed there more than in the
QueryParser itself, although that is not what I'm necessarily suggesting as a
change. So you might find your code breaks which I apologise for!

Hopefully that's everything!