|
From: <ust...@us...> - 2009-09-27 08:59:52
|
Revision: 3023
http://clucene.svn.sourceforge.net/clucene/?rev=3023&view=rev
Author: ustramooner
Date: 2009-09-27 08:59:45 +0000 (Sun, 27 Sep 2009)
Log Message:
-----------
fixed a bug in MultiSearcher refactoring, refactored to use ArrayBase<Query*> instead of Query**
Modified Paths:
--------------
branches/lucene2_3_2/src/core/CLucene/search/MultiSearcher.cpp
branches/lucene2_3_2/src/core/CLucene/search/MultiTermQuery.cpp
branches/lucene2_3_2/src/core/CLucene/search/MultiTermQuery.h
branches/lucene2_3_2/src/core/CLucene/search/PrefixQuery.cpp
branches/lucene2_3_2/src/core/CLucene/search/PrefixQuery.h
branches/lucene2_3_2/src/core/CLucene/search/Query.h
branches/lucene2_3_2/src/core/CLucene/search/RangeQuery.cpp
branches/lucene2_3_2/src/core/CLucene/search/RangeQuery.h
branches/lucene2_3_2/src/core/CLucene/search/SearchHeader.cpp
Modified: branches/lucene2_3_2/src/core/CLucene/search/MultiSearcher.cpp
===================================================================
--- branches/lucene2_3_2/src/core/CLucene/search/MultiSearcher.cpp 2009-09-27 08:58:40 UTC (rev 3022)
+++ branches/lucene2_3_2/src/core/CLucene/search/MultiSearcher.cpp 2009-09-27 08:59:45 UTC (rev 3023)
@@ -214,12 +214,12 @@
return _CLNEW TopFieldDocs (totalHits, fieldDocs, hqlen, hqFields);
}
- Query* MultiSearcher::rewrite(Query* original) {
- Query** queries = _CL_NEWARRAY(Query*,searchablesLen+1);
- for (int32_t i = 0; i < searchablesLen; ++i)
- queries[i] = searchables[i]->rewrite(original);
- queries[searchablesLen]=NULL;
- return original->combine(queries);
+ Query* MultiSearcher::rewrite(Query* query) {
+ // this is a bit of a hack. We know that a query which
+ // creates a Weight based on this Dummy-Searcher is
+ // always already rewritten (see preparedWeight()).
+ // Therefore we just return the unmodified query here
+ return query;
}
void MultiSearcher::explain(Query* query, int32_t doc, Explanation* ret) {
Modified: branches/lucene2_3_2/src/core/CLucene/search/MultiTermQuery.cpp
===================================================================
--- branches/lucene2_3_2/src/core/CLucene/search/MultiTermQuery.cpp 2009-09-27 08:58:40 UTC (rev 3022)
+++ branches/lucene2_3_2/src/core/CLucene/search/MultiTermQuery.cpp 2009-09-27 08:59:45 UTC (rev 3023)
@@ -80,9 +80,9 @@
return query;
}
- Query* MultiTermQuery::combine(Query** queries) {
+ Query* MultiTermQuery::combine(CL_NS(util)::ArrayBase<Query*>* queries) {
return Query::mergeBooleanQueries(queries);
- }
+ }
/** Prints a user-readable version of this query. */
TCHAR* MultiTermQuery::toString(const TCHAR* field) const{
Modified: branches/lucene2_3_2/src/core/CLucene/search/MultiTermQuery.h
===================================================================
--- branches/lucene2_3_2/src/core/CLucene/search/MultiTermQuery.h 2009-09-27 08:58:40 UTC (rev 3022)
+++ branches/lucene2_3_2/src/core/CLucene/search/MultiTermQuery.h 2009-09-27 08:59:45 UTC (rev 3023)
@@ -43,20 +43,20 @@
/** Construct the enumeration to be used, expanding the pattern term. */
virtual FilteredTermEnum* getEnum(CL_NS(index)::IndexReader* reader) = 0;
public:
- /** Constructs a query for terms matching <code>term</code>. */
- MultiTermQuery(CL_NS(index)::Term* t);
+ /** Constructs a query for terms matching <code>term</code>. */
+ MultiTermQuery(CL_NS(index)::Term* t);
- virtual ~MultiTermQuery();
+ virtual ~MultiTermQuery();
- /** Returns the pattern term. */
- CL_NS(index)::Term* getTerm(bool pointer=true) const;
+ /** Returns the pattern term. */
+ CL_NS(index)::Term* getTerm(bool pointer=true) const;
- Query* combine(Query** queries);
+ Query* combine(CL_NS(util)::ArrayBase<Query*>* queries);
- /** Prints a user-readable version of this query. */
- TCHAR* toString(const TCHAR* field) const;
+ /** Prints a user-readable version of this query. */
+ TCHAR* toString(const TCHAR* field) const;
- virtual Query* rewrite(CL_NS(index)::IndexReader* reader);
+ virtual Query* rewrite(CL_NS(index)::IndexReader* reader);
};
CL_NS_END
#endif
Modified: branches/lucene2_3_2/src/core/CLucene/search/PrefixQuery.cpp
===================================================================
--- branches/lucene2_3_2/src/core/CLucene/search/PrefixQuery.cpp 2009-09-27 08:58:40 UTC (rev 3022)
+++ branches/lucene2_3_2/src/core/CLucene/search/PrefixQuery.cpp 2009-09-27 08:59:45 UTC (rev 3023)
@@ -151,7 +151,7 @@
return query;
}
- Query* PrefixQuery::combine(Query** queries) {
+ Query* PrefixQuery::combine(CL_NS(util)::ArrayBase<Query*>* queries) {
return Query::mergeBooleanQueries(queries);
}
Modified: branches/lucene2_3_2/src/core/CLucene/search/PrefixQuery.h
===================================================================
--- branches/lucene2_3_2/src/core/CLucene/search/PrefixQuery.h 2009-09-27 08:58:40 UTC (rev 3022)
+++ branches/lucene2_3_2/src/core/CLucene/search/PrefixQuery.h 2009-09-27 08:59:45 UTC (rev 3023)
@@ -40,7 +40,7 @@
/** Returns the prefix of this query. */
CL_NS(index)::Term* getPrefix(bool pointer=true);
- Query* combine(Query** queries);
+ Query* combine(CL_NS(util)::ArrayBase<Query*>* queries);
Query* rewrite(CL_NS(index)::IndexReader* reader);
Query* clone() const;
bool equals(Query * other) const;
Modified: branches/lucene2_3_2/src/core/CLucene/search/Query.h
===================================================================
--- branches/lucene2_3_2/src/core/CLucene/search/Query.h 2009-09-27 08:58:40 UTC (rev 3022)
+++ branches/lucene2_3_2/src/core/CLucene/search/Query.h 2009-09-27 08:59:45 UTC (rev 3023)
@@ -8,7 +8,7 @@
#define _lucene_search_Query_h
-//#include "CLucene/index/IndexReader.h"
+#include "CLucene/util/Array.h"
CL_CLASS_DEF(index,IndexReader)
//#include "Filter.h"
//#include "Sort.h"
@@ -67,20 +67,26 @@
/** Expert: called to re-write queries into primitive queries. */
virtual Query* rewrite(CL_NS(index)::IndexReader* reader);
-
+
/** Expert: called when re-writing queries under MultiSearcher.
*
- * <p>Only implemented by derived queries, with no
- * {@link #_createWeight(Searcher)} implementatation.
- */
- virtual Query* combine(Query** queries);
+ * Create a single query suitable for use by all subsearchers (in 1-1
+ * correspondence with queries). This is an optimization of the OR of
+ * all queries. We handle the common optimization cases of equal
+ * queries and overlapping clauses of boolean OR queries (as generated
+ * by MultiTermQuery.rewrite() and RangeQuery.rewrite()).
+ * Be careful overriding this method as queries[0] determines which
+ * method will be called and is not necessarily of the same type as
+ * the other queries.
+ */
+ virtual Query* combine(CL_NS(util)::ArrayBase<Query*>* queries);
/** Expert: merges the clauses of a set of BooleanQuery's into a single
* BooleanQuery.
*
*<p>A utility for use by {@link #combine(Query[])} implementations.
*/
- static Query* mergeBooleanQueries(Query** queries);
+ static Query* mergeBooleanQueries(CL_NS(util)::ArrayBase<Query*>* queries);
/** Expert: Returns the Similarity implementation to be used for this query.
* Subclasses may override this method to specify their own Similarity
Modified: branches/lucene2_3_2/src/core/CLucene/search/RangeQuery.cpp
===================================================================
--- branches/lucene2_3_2/src/core/CLucene/search/RangeQuery.cpp 2009-09-27 08:58:40 UTC (rev 3022)
+++ branches/lucene2_3_2/src/core/CLucene/search/RangeQuery.cpp 2009-09-27 08:59:45 UTC (rev 3023)
@@ -82,7 +82,7 @@
return "RangeQuery";
}
- Query* RangeQuery::combine(Query** queries) {
+ Query* RangeQuery::combine(CL_NS(util)::ArrayBase<Query*>* queries) {
return Query::mergeBooleanQueries(queries);
}
Modified: branches/lucene2_3_2/src/core/CLucene/search/RangeQuery.h
===================================================================
--- branches/lucene2_3_2/src/core/CLucene/search/RangeQuery.h 2009-09-27 08:58:40 UTC (rev 3022)
+++ branches/lucene2_3_2/src/core/CLucene/search/RangeQuery.h 2009-09-27 08:59:45 UTC (rev 3023)
@@ -61,7 +61,7 @@
Query* rewrite(CL_NS(index)::IndexReader* reader);
- Query* combine(Query** queries);
+ Query* combine(CL_NS(util)::ArrayBase<Query*>* queries);
// Prints a user-readable version of this query.
TCHAR* toString(const TCHAR* field) const;
Modified: branches/lucene2_3_2/src/core/CLucene/search/SearchHeader.cpp
===================================================================
--- branches/lucene2_3_2/src/core/CLucene/search/SearchHeader.cpp 2009-09-27 08:58:40 UTC (rev 3022)
+++ branches/lucene2_3_2/src/core/CLucene/search/SearchHeader.cpp 2009-09-27 08:59:45 UTC (rev 3023)
@@ -12,6 +12,7 @@
#include "Searchable.h"
#include "Hits.h"
#include "_FieldDocSortedHitQueue.h"
+#include <assert.h>
CL_NS_USE(index)
CL_NS_DEF(search)
@@ -24,35 +25,28 @@
}
//static
-Query* Query::mergeBooleanQueries(Query** queries) {
- CL_NS(util)::CLVector<BooleanClause*> allClauses;
- int32_t i = 0;
- int32_t queriesLength = 0;
-
- while ( queries[i] != NULL ){
- BooleanQuery* bq = (BooleanQuery*)queries[i];
-
- int32_t size = bq->getClauseCount();
- BooleanClause** clauses = _CL_NEWARRAY(BooleanClause*, size);
- bq->getClauses(clauses);
-
- for (int32_t j = 0;j<size;++j ){
- allClauses.push_back(clauses[j]);
- j++;
- }
- _CLDELETE_LARRAY(clauses);
- i++;
- queriesLength++;
+Query* Query::mergeBooleanQueries(CL_NS(util)::ArrayBase<Query*>* queries) {
+ std::vector<BooleanClause*> allClauses;
+
+ CL_NS(util)::ValueArray<BooleanClause*> clauses;
+ for (size_t i = 0; i < queries->length; i++) {
+ assert(BooleanQuery::getClassName() == queries->values[i]->getObjectName());
+ BooleanQuery* booleanQuery = (BooleanQuery*)queries->values[i];
+ clauses.resize((booleanQuery->getClauseCount()));
+ booleanQuery->getClauses(clauses.values);
+ for (size_t j = 0; j < clauses.length; j++) {
+ allClauses.push_back(clauses.values[j]->clone());
}
+ }
- bool coordDisabled = ( queriesLength == 0 ) ? false : ((BooleanQuery*)queries[0])->isCoordDisabled();
- BooleanQuery* result = _CLNEW BooleanQuery(coordDisabled);
-
- CL_NS(util)::CLVector<BooleanClause*>::iterator itr = allClauses.begin();
- while (itr != allClauses.end() ) {
- result->add(*itr);
- }
- return result;
+ bool coordDisabled = ( queries->length == 0 ) ? false : ((BooleanQuery*)queries->values[0])->isCoordDisabled();
+ BooleanQuery* result = _CLNEW BooleanQuery(coordDisabled);
+ std::vector<BooleanClause*>::iterator i = allClauses.begin();
+ while ( i != allClauses.end() ){
+ result->add(*i);
+ i++;
+ }
+ return result;
}
Query::Query(const Query& clone):boost(clone.boost){
@@ -73,8 +67,42 @@
return this;
}
-Query* Query::combine(Query** queries){
- _CLTHROWA(CL_ERR_UnsupportedOperation,"UnsupportedOperationException: Query::combine");
+Query* Query::combine(CL_NS(util)::ArrayBase<Query*>* queries){
+ std::vector<Query*> uniques;
+ for (int i = 0; i < queries->length; i++) {
+ Query* query = queries->values[i];
+ CL_NS(util)::ValueArray<BooleanClause*> clauses;
+ // check if we can split the query into clauses
+ bool splittable = query->instanceOf(BooleanQuery::getClassName());
+ if(splittable){
+ BooleanQuery* bq = (BooleanQuery*) query;
+ splittable = bq->isCoordDisabled();
+ clauses.resize(bq->getClauseCount());
+ bq->getClauses(clauses.values);
+ for (int32_t j = 0; splittable && j < clauses.length; j++) {
+ splittable = (clauses[j]->getOccur() == BooleanClause::SHOULD);
+ }
+ }
+ if(splittable){
+ for (int j = 0; j < clauses.length; j++) {
+ uniques.push_back(clauses[j]->getQuery());
+ }
+ } else {
+ uniques.push_back(query);
+ }
+ }
+ // optimization: if we have just one query, just return it
+ if(uniques.size() == 1){
+ return *uniques.begin();
+ }
+ std::vector<Query*>::iterator it = uniques.begin();
+ BooleanQuery* result = _CLNEW BooleanQuery(true);
+ while (it != uniques.end() ){
+ result->add(*it, BooleanClause::SHOULD);
+
+ it++;
+ }
+ return result;
}
Similarity* Query::getSimilarity(Searcher* searcher) {
return searcher->getSimilarity();
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|