void testIncludeLowerTrue(CuTest* tc) { WhitespaceAnalyzer a; RAMDirectory* index = _CLNEW RAMDirectory(); IndexWriter* writer = _CLNEW IndexWriter(index, &a, true); Document doc; doc.add(*_CLNEW Field(_T("Category"), _T("a 1"), Field::STORE_YES | Field::INDEX_TOKENIZED)); writer->addDocument(&doc); doc.clear(); doc.add(*_CLNEW Field(_T("Category"), _T("a 2"), Field::STORE_YES | Field::INDEX_TOKENIZED)); writer->addDocument(&doc); doc.clear(); doc.add(*_CLNEW Field(_T("Category"), _T("a 3"), Field::STORE_YES | Field::INDEX_TOKENIZED)); writer->addDocument(&doc); doc.clear(); writer->close(); _CLLDELETE(writer); IndexSearcher* s = _CLNEW IndexSearcher(index); Filter* f = _CLNEW RangeFilter(_T("Category"), _T("3"), _T("3"), true, true); Term* t = _CLNEW Term(_T("Category"), _T("a")); Query* q1 = _CLNEW TermQuery(t); _CLLDECDELETE(t); t = _CLNEW Term(_T("Category"), _T("3")); Query* q2 = _CLNEW TermQuery(t); _CLLDECDELETE(t); Hits* h = s->search(q1); assertTrue(h->length() == 3); _CLLDELETE(h); h = s->search(q2); assertTrue(h->length() == 1); _CLLDELETE(h); h = s->search(q1, f); assertTrue(h->length() == 1); _CLLDELETE(h); s->close(); _CLLDELETE(s); _CLLDELETE(q1); _CLLDELETE(q2); _CLLDELETE(f); index->close(); _CLLDECDELETE(index); }
void TestBasics::testBoolean2() { Term * term1 = _CLNEW Term( _T( "field" ), _T( "sevento" )); Term * term2 = _CLNEW Term( _T( "field" ), _T( "sevenly" )); BooleanQuery * query = _CLNEW BooleanQuery(); query->add( _CLNEW TermQuery( term1 ), true, BooleanClause::MUST ); query->add( _CLNEW TermQuery( term2 ), true, BooleanClause::MUST ); _CLLDECDELETE( term1 ); _CLLDECDELETE( term2 ); checkHits( query, NULL, 0 ); _CLLDELETE( query ); }
void TestBasics::testBoolean() { int32_t expectedDocs[] = {77, 777, 177, 277, 377, 477, 577, 677, 770, 771, 772, 773, 774, 775, 776, 778, 779, 877, 977}; Term * term1 = _CLNEW Term( _T( "field" ), _T( "seventy" )); Term * term2 = _CLNEW Term( _T( "field" ), _T( "seven" )); BooleanQuery * query = _CLNEW BooleanQuery(); query->add( _CLNEW TermQuery( term1 ), true, BooleanClause::MUST ); query->add( _CLNEW TermQuery( term2 ), true, BooleanClause::MUST ); _CLLDECDELETE( term1 ); _CLLDECDELETE( term2 ); checkHits( query, expectedDocs, sizeof( expectedDocs ) / sizeof( expectedDocs[ 0 ] )); _CLLDELETE( query ); }
/// TestBooleanScorer.java, ported 5/9/2009 void testBooleanScorer(CuTest *tc) { const TCHAR* FIELD = _T("category"); RAMDirectory directory; TCHAR* values[] = { _T("1"), _T("2"), _T("3"), _T("4"), NULL}; try { WhitespaceAnalyzer a; IndexWriter* writer = _CLNEW IndexWriter(&directory, &a, true); for (size_t i = 0; values[i]!=NULL; i++) { Document* doc = _CLNEW Document(); doc->add(*_CLNEW Field(FIELD, values[i], Field::STORE_YES | Field::INDEX_TOKENIZED)); writer->addDocument(doc); _CLLDELETE(doc); } writer->close(); _CLLDELETE(writer); BooleanQuery* booleanQuery1 = _CLNEW BooleanQuery(); Term *t = _CLNEW Term(FIELD, _T("1")); booleanQuery1->add(_CLNEW TermQuery(t), true, BooleanClause::SHOULD); _CLDECDELETE(t); t = _CLNEW Term(FIELD, _T("2")); booleanQuery1->add(_CLNEW TermQuery(t), true, BooleanClause::SHOULD); _CLDECDELETE(t); BooleanQuery* query = _CLNEW BooleanQuery(); query->add(booleanQuery1, true, BooleanClause::MUST); t = _CLNEW Term(FIELD, _T("9")); query->add(_CLNEW TermQuery(t), true, BooleanClause::MUST_NOT); _CLDECDELETE(t); IndexSearcher *indexSearcher = _CLNEW IndexSearcher(&directory); Hits *hits = indexSearcher->search(query); CLUCENE_ASSERT(2 == hits->length()); // Number of matched documents _CLLDELETE(hits); _CLLDELETE(indexSearcher); _CLLDELETE(query); } catch (CLuceneError& e) { CuFail(tc, e.twhat()); } }
void testExtractFromTermQuery( CuTest * tc ) { Directory * pIndex = setUpIndex(); IndexReader * pReader = IndexReader::open( pIndex ); TermSet termSet; Term * t1 = _CLNEW Term( _T("data"), _T("aaaaa") ); Term * t2 = _CLNEW Term( _T("data"), _T("bbbbb") ); Query * q1 = _CLNEW TermQuery( t1 ); Query * q2 = _CLNEW TermQuery( t2 ); Query * rewrite1 = q1->rewrite( pReader ); Query * rewrite2 = q2->rewrite( pReader ); rewrite1->extractTerms( &termSet ); assertEqualsMsg( _T( "wrong number of terms" ), 1, termSet.size() ); assertEqualsMsg( _T( "wrong term" ), 0, t1->compareTo( *(termSet.begin())) ); clearTermSet( termSet ); rewrite2->extractTerms( &termSet ); assertEqualsMsg( _T( "wrong number of terms" ), 1, termSet.size() ); assertEqualsMsg( _T( "wrong term" ), 0, t2->compareTo( *(termSet.begin())) ); clearTermSet( termSet ); _CLLDECDELETE( t1 ); _CLLDECDELETE( t2 ); if( q1 != rewrite1 ) _CLDELETE( rewrite1 ); _CLDELETE( q1 ); if( q2 != rewrite2 ) _CLDELETE( rewrite2 ); _CLDELETE( q2 ); pReader->close(); _CLDELETE( pReader ); closeIndex( pIndex ); pIndex = NULL; }
void testExtractFromBooleanQuery( CuTest * tc ) { Directory * pIndex = setUpIndex(); IndexReader * pReader = IndexReader::open( pIndex ); TermSet termSet; Term * t1 = _CLNEW Term( _T("data"), _T("aaaab") ); Term * t2 = _CLNEW Term( _T("data"), _T("aaabb") ); Term * t3 = _CLNEW Term( _T("data"), _T("aaabb") ); BooleanQuery * bq = _CLNEW BooleanQuery(); bq->add( _CLNEW TermQuery( t1 ), true, BooleanClause::SHOULD ); bq->add( _CLNEW TermQuery( t2 ), true, BooleanClause::SHOULD ); bq->add( _CLNEW TermQuery( t3 ), true, BooleanClause::SHOULD ); Query * rewrite = bq->rewrite( pReader ); rewrite->extractTerms( &termSet ); assertEqualsMsg( _T( "wrong number of terms" ), 2, termSet.size() ); for( TermSet::iterator itTerms = termSet.begin(); itTerms != termSet.end(); itTerms++ ) { Term * pTerm = *itTerms; assertTrueMsg( _T( "wrong term" ), ( 0 == t1->compareTo( pTerm ) || 0 == t2->compareTo( pTerm ))); } clearTermSet( termSet ); _CLLDECDELETE( t1 ); _CLLDECDELETE( t2 ); _CLLDECDELETE( t3 ); if( rewrite != bq ) _CLDELETE( rewrite ); _CLDELETE( bq ); pReader->close(); _CLDELETE( pReader ); closeIndex( pIndex ); pIndex = NULL; }
/** * FIXME: Describe <code>rewrite</code> method here. * * @param reader an <code>IndexReader</code> value * @return a <code>Query</code> value * @exception IOException if an error occurs */ Query* RangeQuery::rewrite(IndexReader* reader){ BooleanQuery* query = _CLNEW BooleanQuery; TermEnum* enumerator = reader->terms(lowerTerm); Term* lastTerm = NULL; try { bool checkLower = false; if (!inclusive) // make adjustments to set to exclusive checkLower = true; const TCHAR* testField = getField(); do { lastTerm = enumerator->term(); if (lastTerm != NULL && lastTerm->field() == testField ) { if (!checkLower || _tcscmp(lastTerm->text(),lowerTerm->text()) > 0) { checkLower = false; if (upperTerm != NULL) { int compare = _tcscmp(upperTerm->text(),lastTerm->text()); /* if beyond the upper term, or is exclusive and * this is equal to the upper term, break out */ if ((compare < 0) || (!inclusive && compare == 0)) break; } TermQuery* tq = _CLNEW TermQuery(lastTerm); // found a match tq->setBoost(getBoost()); // set the boost query->add(tq, true, false, false); // add to query } }else { break; } _CLDECDELETE(lastTerm); } while (enumerator->next()); }catch(...){ _CLDECDELETE(lastTerm); //always need to delete this _CLDELETE(query); //in case of error, delete the query enumerator->close(); _CLDELETE(enumerator); throw; //rethrow } _CLDECDELETE(lastTerm); //always need to delete this enumerator->close(); _CLDELETE(enumerator); return query; }
Query* PrefixQuery::rewrite(IndexReader* reader){ BooleanQuery* query = _CLNEW BooleanQuery(); TermEnum* enumerator = reader->terms(prefix); Term* lastTerm = NULL; try { const TCHAR* prefixText = prefix->text(); const TCHAR* prefixField = prefix->field(); const TCHAR* tmp; size_t i; int32_t prefixLen = prefix->textLength(); do { lastTerm = enumerator->term(); if (lastTerm != NULL && lastTerm->field() == prefixField ){ //now see if term->text() starts with prefixText int32_t termLen = lastTerm->textLength(); if ( prefixLen>termLen ) break; //the prefix is longer than the term, can't be matched tmp = lastTerm->text(); //check for prefix match in reverse, since most change will be at the end for ( i=prefixLen-1;i!=-1;--i ){ if ( tmp[i] != prefixText[i] ){ tmp=NULL;//signals inequality break; } } if ( tmp == NULL ) break; TermQuery* tq = _CLNEW TermQuery(lastTerm); // found a match tq->setBoost(getBoost()); // set the boost query->add(tq,true,false, false); // add to query } else break; _CLDECDELETE(lastTerm); } while (enumerator->next()); }_CLFINALLY( enumerator->close(); _CLDELETE(enumerator); _CLDECDELETE(lastTerm); );
/// TestBooleanQuery.java, ported 5/9/2009 void testEquality(CuTest *tc) { BooleanQuery* bq1 = _CLNEW BooleanQuery(); Term* t = _CLNEW Term(_T("field"), _T("value1")); bq1->add(_CLNEW TermQuery(t), true, BooleanClause::SHOULD); _CLDECDELETE(t); t = _CLNEW Term(_T("field"), _T("value2")); bq1->add(_CLNEW TermQuery(t), true, BooleanClause::SHOULD); _CLDECDELETE(t); BooleanQuery* nested1 = _CLNEW BooleanQuery(); t = _CLNEW Term(_T("field"), _T("nestedvalue1")); nested1->add(_CLNEW TermQuery(t), true, BooleanClause::SHOULD); _CLDECDELETE(t); t = _CLNEW Term(_T("field"), _T("nestedvalue2")); nested1->add(_CLNEW TermQuery(t), true, BooleanClause::SHOULD); _CLDECDELETE(t); bq1->add(nested1, true, BooleanClause::SHOULD); BooleanQuery* bq2 = _CLNEW BooleanQuery(); t = _CLNEW Term(_T("field"), _T("value1")); bq2->add(_CLNEW TermQuery(t), true, BooleanClause::SHOULD); _CLDECDELETE(t); t = _CLNEW Term(_T("field"), _T("value2")); bq2->add(_CLNEW TermQuery(t), true, BooleanClause::SHOULD); _CLDECDELETE(t); BooleanQuery* nested2 = _CLNEW BooleanQuery(); t = _CLNEW Term(_T("field"), _T("nestedvalue1")); nested2->add(_CLNEW TermQuery(t), true, BooleanClause::SHOULD); _CLDECDELETE(t); t = _CLNEW Term(_T("field"), _T("nestedvalue2")); nested2->add(_CLNEW TermQuery(t), true, BooleanClause::SHOULD); _CLDECDELETE(t); bq2->add(nested2, true, BooleanClause::SHOULD); CLUCENE_ASSERT(bq1->equals(bq2)); _CLLDELETE(bq1); _CLLDELETE(bq2); }
void testRangeFilterId() { IndexReader* reader = IndexReader::open(index); IndexSearcher* search = new IndexSearcher(reader); int medId = ((maxId - minId) / 2); std::tstring minIPstr = pad(minId); const TCHAR* minIP = minIPstr.c_str(); std::tstring maxIPstr = pad(maxId); const TCHAR* maxIP = maxIPstr.c_str(); std::tstring medIPstr = pad(medId); const TCHAR* medIP = medIPstr.c_str(); size_t numDocs = static_cast<size_t>(reader->numDocs()); assertEqualsMsg(_T("num of docs"), numDocs, static_cast<size_t>(1+ maxId - minId)); Hits* result; Term* term = _CLNEW Term(_T("body"),_T("body")); Query* q = _CLNEW TermQuery(term); _CLDECDELETE(term); // test id, bounded on both ends Filter* f = _CLNEW RangeFilter(_T("id"),minIP,maxIP,T,T); result = search->search(q, f); assertEqualsMsg(_T("find all"), numDocs, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),minIP,maxIP,T,F); result = search->search(q,f); assertEqualsMsg(_T("all but last"), numDocs-1, result->length()); _CLLDELETE(result); _CLLDELETE(f); f =_CLNEW RangeFilter(_T("id"),minIP,maxIP,F,T); result = search->search(q,f); assertEqualsMsg(_T("all but first"), numDocs-1, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),minIP,maxIP,F,F); result = search->search(q,f); assertEqualsMsg(_T("all but ends"), numDocs-2, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),medIP,maxIP,T,T); result = search->search(q,f); assertEqualsMsg(_T("med and up"), 1+ maxId-medId, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),minIP,medIP,T,T); result = search->search(q,f); assertEqualsMsg(_T("up to med"), 1+ medId-minId, result->length()); _CLLDELETE(result); _CLLDELETE(f); // unbounded id f=_CLNEW RangeFilter(_T("id"),minIP,NULL,T,F); result = search->search(q,f); assertEqualsMsg(_T("min and up"), numDocs, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),NULL,maxIP,F,T); result = search->search(q,f); assertEqualsMsg(_T("max and down"), numDocs, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),minIP,NULL,F,F); result = search->search(q,f); assertEqualsMsg(_T("not min, but up"), numDocs-1, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),NULL,maxIP,F,F); result = search->search(q,f); assertEqualsMsg(_T("not max, but down"), numDocs-1, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),medIP,maxIP,T,F); result = search->search(q,f); assertEqualsMsg(_T("med and up, not max"), maxId-medId, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),minIP,medIP,F,T); result = search->search(q,f); assertEqualsMsg(_T("not min, up to med"), medId-minId, result->length()); _CLLDELETE(result); _CLLDELETE(f); // very small sets f=_CLNEW RangeFilter(_T("id"),minIP,minIP,F,F); result = search->search(q,f); assertEqualsMsg(_T("min,min,F,F"), 0, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),medIP,medIP,F,F); result = search->search(q,f); assertEqualsMsg(_T("med,med,F,F"), 0, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),maxIP,maxIP,F,F); result = search->search(q,f); assertEqualsMsg(_T("max,max,F,F"), 0, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),minIP,minIP,T,T); result = search->search(q,f); assertEqualsMsg(_T("min,min,T,T"), 1, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),NULL,minIP,F,T); result = search->search(q,f); assertEqualsMsg(_T("nul,min,F,T"), 1, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),maxIP,maxIP,T,T); result = search->search(q,f); assertEqualsMsg(_T("max,max,T,T"), 1, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),maxIP,NULL,T,F); result = search->search(q,f); assertEqualsMsg(_T("max,nul,T,T"), 1, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("id"),medIP,medIP,T,T); result = search->search(q,f); assertEqualsMsg(_T("med,med,T,T"), 1, result->length()); _CLLDELETE(result); _CLLDELETE(f); search->close(); _CLLDELETE(search); reader->close(); _CLLDELETE(reader); _CLLDELETE(q); }
void testRangeFilterRand() { IndexReader* reader = IndexReader::open(index); IndexSearcher* search = _CLNEW IndexSearcher(reader); std::tstring minRPstr = pad(minR); const TCHAR* minRP = minRPstr.c_str(); std::tstring maxRPstr = pad(maxR); const TCHAR* maxRP = maxRPstr.c_str(); size_t numDocs = static_cast<size_t>(reader->numDocs()); assertEqualsMsg(_T("num of docs"), numDocs, 1+ maxId - minId); Hits* result; Term* term = _CLNEW Term(_T("body"),_T("body")); Query* q = _CLNEW TermQuery(term); _CLDECDELETE(term); // test extremes, bounded on both ends Filter* f = _CLNEW RangeFilter(_T("rand"),minRP,maxRP,T,T); result = search->search(q,f); assertEqualsMsg(_T("find all"), numDocs, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("rand"),minRP,maxRP,T,F); result = search->search(q,f); assertEqualsMsg(_T("all but biggest"), numDocs-1, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("rand"),minRP,maxRP,F,T); result = search->search(q,f); assertEqualsMsg(_T("all but smallest"), numDocs-1, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("rand"),minRP,maxRP,F,F); result = search->search(q,f); assertEqualsMsg(_T("all but extremes"), numDocs-2, result->length()); _CLLDELETE(result); _CLLDELETE(f); // unbounded f=_CLNEW RangeFilter(_T("rand"),minRP,NULL,T,F); result = search->search(q,f); assertEqualsMsg(_T("smallest and up"), numDocs, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("rand"),NULL,maxRP,F,T); result = search->search(q,f); assertEqualsMsg(_T("biggest and down"), numDocs, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("rand"),minRP,NULL,F,F); result = search->search(q,f); assertEqualsMsg(_T("not smallest, but up"), numDocs-1, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("rand"),NULL,maxRP,F,F); result = search->search(q,f); assertEqualsMsg(_T("not biggest, but down"), numDocs-1, result->length()); _CLLDELETE(result); _CLLDELETE(f); // very small sets f=_CLNEW RangeFilter(_T("rand"),minRP,minRP,F,F); result = search->search(q,f); assertEqualsMsg(_T("min,min,F,F"), 0, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("rand"),maxRP,maxRP,F,F); result = search->search(q,f); assertEqualsMsg(_T("max,max,F,F"), 0, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("rand"),minRP,minRP,T,T); result = search->search(q,f); assertEqualsMsg(_T("min,min,T,T"), 1, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("rand"),NULL,minRP,F,T); result = search->search(q,f); assertEqualsMsg(_T("nul,min,F,T"), 1, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("rand"),maxRP,maxRP,T,T); result = search->search(q,f); assertEqualsMsg(_T("max,max,T,T"), 1, result->length()); _CLLDELETE(result); _CLLDELETE(f); f=_CLNEW RangeFilter(_T("rand"),maxRP,NULL,T,F); result = search->search(q,f); assertEqualsMsg(_T("max,nul,T,T"), 1, result->length()); _CLLDELETE(result); _CLLDELETE(f); search->close(); _CLLDELETE(search); reader->close(); _CLLDELETE(reader); _CLLDELETE(q); }