blob: 4348e8c7aac9e259ceb55e4bed9f28df06952dd0 [file]
/*------------------------------------------------------------------------------
* Copyright (C) 2003-2006 Jiri Splichal 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 "test.h"
/////////////////////////////////////////////////////////////////////////////
Directory * setUpIndex()
{
TCHAR tbuffer[16];
const TCHAR* data[] =
{
_T( "aaaaa aaaab aaabb aabbb abbbb bbbbb" ),
_T( "aaaaa aaaac aaacc aaccc acccc ccccc" )
};
RAMDirectory * pDirectory = _CLNEW RAMDirectory();
WhitespaceAnalyzer<TCHAR> analyzer;
IndexWriter writer( pDirectory, &analyzer, true );
for( int i = 0; i < sizeof( data ) / sizeof( data[0] ); i++ )
{
_itot( i, tbuffer, 10 );
Document doc;
doc.add( * _CLNEW Field( _T( "id" ), tbuffer, Field::STORE_YES | Field::INDEX_UNTOKENIZED ));
doc.add( * _CLNEW Field( _T( "data" ), data[ i ], Field::STORE_YES | Field::INDEX_TOKENIZED ));
writer.addDocument( &doc );
}
writer.optimize();
writer.close();
return pDirectory;
}
/////////////////////////////////////////////////////////////////////////////
void closeIndex( Directory * pDirectory )
{
if( pDirectory )
{
pDirectory->close();
_CLLDECDELETE( pDirectory );
}
}
/////////////////////////////////////////////////////////////////////////////
void clearTermSet( TermSet& termSet )
{
for( TermSet::iterator itTerms = termSet.begin(); itTerms != termSet.end(); itTerms++ )
{
Term * pTerm = *itTerms;
_CLLDECDELETE( pTerm );
}
termSet.clear();
}
/////////////////////////////////////////////////////////////////////////////
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 testExtractFromPhraseQuery( 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("ccccc") );
Term * t3 = _CLNEW Term( _T("data"), _T("aaaab") );
PhraseQuery * phrase = _CLNEW PhraseQuery();
phrase->add( t1 );
phrase->add( t2 );
phrase->add( t3 );
Query * rewrite = phrase->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 != phrase )
_CLDELETE( rewrite );
_CLDELETE( phrase );
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;
}
/////////////////////////////////////////////////////////////////////////////
void testExtractFromWildcardQuery( CuTest * tc )
{
Directory * pIndex = setUpIndex();
IndexReader * pReader = IndexReader::open( pIndex );
TermSet termSet;
WildcardQuery * wildcard;
Term * t1;
Query * rewrite;
t1 = _CLNEW Term( _T("data"), _T("aaaa?") );
wildcard = _CLNEW WildcardQuery( t1 );
rewrite = wildcard->rewrite( pReader );
rewrite->extractTerms( &termSet );
_CLLDECDELETE( t1 );
assertEqualsMsg( _T( "wrong number of terms" ), 3, termSet.size() );
for( TermSet::iterator itTerms = termSet.begin(); itTerms != termSet.end(); itTerms++ )
{
Term * pTerm = *itTerms;
if( 0 != _tcscmp( _T( "aaaaa" ), pTerm->text())
&& 0 != _tcscmp( _T( "aaaab" ), pTerm->text())
&& 0 != _tcscmp( _T( "aaaac" ), pTerm->text()))
{
assertTrueMsg( _T( "wrong term" ), false );
}
}
clearTermSet( termSet );
if( rewrite != wildcard )
_CLDELETE( rewrite );
_CLDELETE( wildcard );
t1 = _CLNEW Term( _T("data"), _T("aaa*") );
wildcard = _CLNEW WildcardQuery( t1 );
rewrite = wildcard->rewrite( pReader );
rewrite->extractTerms( &termSet );
_CLLDECDELETE( t1 );
assertEqualsMsg( _T( "wrong number of terms" ), 5, termSet.size() );
for( TermSet::iterator itTerms = termSet.begin(); itTerms != termSet.end(); itTerms++ )
{
Term * pTerm = *itTerms;
assertTrueMsg( _T( "wrong term" ), ( 0 == _tcsncmp( _T( "aaa" ), pTerm->text(), 3 )));
}
clearTermSet( termSet );
if( rewrite != wildcard )
_CLDELETE( rewrite );
_CLDELETE( wildcard );
pReader->close();
_CLDELETE( pReader );
closeIndex( pIndex );
pIndex = NULL;
}
/////////////////////////////////////////////////////////////////////////////
void testExtractFromFuzzyQuery( CuTest * tc )
{
Directory * pIndex = setUpIndex();
IndexReader * pReader = IndexReader::open( pIndex );
TermSet termSet;
FuzzyQuery * fuzzy;
Term * t1;
Query * rewrite;
t1 = _CLNEW Term( _T("data"), _T("aaaab") );
fuzzy = _CLNEW FuzzyQuery( t1, 0.7f );
rewrite = fuzzy->rewrite( pReader );
rewrite->extractTerms( &termSet );
_CLLDECDELETE( t1 );
assertEqualsMsg( _T( "wrong number of terms" ), 4, termSet.size() );
for( TermSet::iterator itTerms = termSet.begin(); itTerms != termSet.end(); itTerms++ )
{
Term * pTerm = *itTerms;
if( 0 != _tcscmp( _T( "aaaaa" ), pTerm->text())
&& 0 != _tcscmp( _T( "aaaab" ), pTerm->text())
&& 0 != _tcscmp( _T( "aaabb" ), pTerm->text())
&& 0 != _tcscmp( _T( "aaaac" ), pTerm->text()))
{
assertTrueMsg( _T( "wrong term" ), false );
}
}
clearTermSet( termSet );
if( rewrite != fuzzy )
_CLDELETE( rewrite );
_CLDELETE( fuzzy );
pReader->close();
_CLDELETE( pReader );
closeIndex( pIndex );
pIndex = NULL;
}
/////////////////////////////////////////////////////////////////////////////
// Custom CLucene tests
CuSuite *testExtractTerms(void)
{
CuSuite *suite = CuSuiteNew( _T( "CLucene ExtractTerms Test" ));
SUITE_ADD_TEST( suite, testExtractFromTermQuery );
SUITE_ADD_TEST( suite, testExtractFromPhraseQuery );
SUITE_ADD_TEST( suite, testExtractFromBooleanQuery );
SUITE_ADD_TEST( suite, testExtractFromWildcardQuery );
SUITE_ADD_TEST( suite, testExtractFromFuzzyQuery );
return suite;
}
// EOF