/*------------------------------------------------------------------------------ | |
* Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team | |
* | |
* Distributable under the terms of either the Apache License (Version 2.0) or | |
* the GNU Lesser General Public License, as specified in the COPYING file. | |
------------------------------------------------------------------------------*/ | |
#include "CLucene/StdHeader.h" | |
#include "WildcardQuery.h" | |
#include "CLucene/util/BitSet.h" | |
CL_NS_USE(index) | |
CL_NS_USE(util) | |
CL_NS_DEF(search) | |
WildcardQuery::WildcardQuery(Term* term): | |
MultiTermQuery( term ){ | |
//Func - Constructor | |
//Pre - term != NULL | |
//Post - Instance has been created | |
} | |
WildcardQuery::~WildcardQuery(){ | |
//Func - Destructor | |
//Pre - true | |
//Post - true | |
} | |
const TCHAR* WildcardQuery::getQueryName() const{ | |
//Func - Returns the string "WildcardQuery" | |
//Pre - true | |
//Post - The string "WildcardQuery" has been returned | |
return getClassName(); | |
} | |
const TCHAR* WildcardQuery::getClassName(){ | |
return _T("WildcardQuery"); | |
} | |
FilteredTermEnum* WildcardQuery::getEnum(IndexReader* reader) { | |
return _CLNEW WildcardTermEnum(reader, getTerm(false)); | |
} | |
WildcardQuery::WildcardQuery(const WildcardQuery& clone): | |
MultiTermQuery(clone) | |
{ | |
} | |
Query* WildcardQuery::clone() const{ | |
return _CLNEW WildcardQuery(*this); | |
} | |
size_t WildcardQuery::hashCode() const{ | |
//todo: we should give the query a seeding value... but | |
//need to do it for all hascode functions | |
return Similarity::floatToByte(getBoost()) ^ getTerm()->hashCode(); | |
} | |
bool WildcardQuery::equals(Query* other) const{ | |
if (!(other->instanceOf(WildcardQuery::getClassName()))) | |
return false; | |
WildcardQuery* tq = (WildcardQuery*)other; | |
return (this->getBoost() == tq->getBoost()) | |
&& getTerm()->equals(tq->getTerm()); | |
} | |
WildcardFilter::WildcardFilter( Term* term ) | |
{ | |
this->term = _CL_POINTER(term); | |
} | |
WildcardFilter::~WildcardFilter() | |
{ | |
_CLDECDELETE(term); | |
} | |
WildcardFilter::WildcardFilter( const WildcardFilter& copy ) : | |
term( _CL_POINTER(copy.term) ) | |
{ | |
} | |
Filter* WildcardFilter::clone() const { | |
return _CLNEW WildcardFilter(*this ); | |
} | |
TCHAR* WildcardFilter::toString() | |
{ | |
//Instantiate a stringbuffer buffer to store the readable version temporarily | |
CL_NS(util)::StringBuffer buffer; | |
//check if field equal to the field of prefix | |
if( term->field() != NULL ) { | |
//Append the field of prefix to the buffer | |
buffer.append(term->field()); | |
//Append a colon | |
buffer.append(_T(":") ); | |
} | |
//Append the text of the prefix | |
buffer.append(term->text()); | |
//Convert StringBuffer buffer to TCHAR block and return it | |
return buffer.toString(); | |
} | |
/** Returns a BitSet with true for documents which should be permitted in | |
search results, and false for those that should not. */ | |
BitSet* WildcardFilter::bits( IndexReader* reader ) | |
{ | |
BitSet* bts = _CLNEW BitSet( reader->maxDoc() ); | |
WildcardTermEnum termEnum (reader, term); | |
if (termEnum.term(false) == NULL) | |
return bts; | |
TermDocs* termDocs = reader->termDocs(); | |
try{ | |
do{ | |
termDocs->seek(&termEnum); | |
while (termDocs->next()) { | |
bts->set(termDocs->doc()); | |
} | |
}while(termEnum.next()); | |
} _CLFINALLY( | |
termDocs->close(); | |
_CLDELETE(termDocs); | |
termEnum.close(); | |
) | |
return bts; | |
} | |
CL_NS_END |