Files
bongo/import/clucene/test/search/TestForDuplicates.cpp
T
2007-01-22 23:37:12 +00:00

167 lines
4.4 KiB
C++

/*------------------------------------------------------------------------------
* 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 "test.h"
static void print_tHits( CuTest *tc, Hits* hits ) {
CuMessageA(tc,"%d total results\n\n", hits->length());
for (int32_t i = 0 ; i < hits->length(); i++) {
if ( i < 10 || (i > 94 && i < 105) ) {
const Document& d = hits->doc(i);
CuMessage(tc, _T("%d %s\n"), i, d.get(_T("id")) );
}
}
}
void testSearchTestForDuplicatesRaw(CuTest *tc){
const int MAX_DOCS=1500;
char *strBody[10] = {"test", "value", "why not", "computer", "clucene",
"sun", "program", "main", "database", "code"};
RAMDirectory ram;
//---
WhitespaceAnalyzer an;
IndexWriter* writer = _CLNEW IndexWriter(&ram, &an, true);
Document *doc = 0;
//---
TCHAR strDb[1024];
//printf("Indexing, please wait...\n");
for (int32_t i = 0; i < MAX_DOCS; i++) {
//****
//printf("%d/%d=%s\n", i, MAX_DOCS,strBody[i%10]);
doc = _CLNEW Document();
//---
_sntprintf(strDb, 1024, _T("%d"), i);
doc->add( *Field::Keyword(_T("id"), strDb ) );
STRCPY_AtoT(strDb, strBody[i%10], 1022);
doc->add(*Field::UnStored(_T("body"), strDb ) );
//---
writer->addDocument(doc);
_CLDELETE(doc);
//****
}
//printf("\nDone.\n");
//---
writer->optimize();
writer->close();
_CLDELETE(writer);
IndexSearcher searcher(&ram);
//---
int32_t dupl = 0;
Query* query = QueryParser::parse(_T("test"), _T("body"), &an);
Hits* result = searcher.search(query);
CLUCENE_ASSERT(result->length()==((int)MAX_DOCS/10));
//printf("Building result map...\n");
CLSet<int32_t, int32_t,Compare::Int32,Deletor::DummyInt32,Deletor::DummyInt32> resMap;
int32_t id;
for (int32_t j = 0; j < result->length(); j++) {
doc = &result->doc(j);
TCHAR* end;
id = (int32_t)_tcstoi64(doc->get(_T("id")), &end, 10);
if ( !resMap.exists(id) ) {
resMap.put(id, 1);
//printf("Inserted $d\n",id);
} else {
TCHAR tmp[2048];
_sntprintf(tmp,2048,_T("Duplicated result found - Id: %d\n"), id);
CuAssert(tc,tmp,false);
dupl++;
}
}
//printf("Total duplicated found: %d\n", dupl);
//---
_CLDELETE(result);
_CLDELETE(query);
searcher.close();
ram.close();
}
void testSearchTestForDuplicates(CuTest *tc) {
RAMDirectory directory;
SimpleAnalyzer analyzer;
IndexWriter* writer = _CLNEW IndexWriter(&directory, &analyzer, true);
const int32_t MAX_DOCS = 255;
for (int32_t j = 0; j < MAX_DOCS; j++) {
Document* d = _CLNEW Document();
d->add(*Field::Text(_T("priority"), _T("high")));
TCHAR buf[80];
_i64tot(j,buf,10);
d->add(*Field::Text(_T("id"), buf));
writer->addDocument(d);
_CLDELETE(d);
}
writer->close();
_CLDELETE(writer);
// try a search without OR
Searcher* searcher = _CLNEW IndexSearcher( &directory );
QueryParser* parser = _CLNEW QueryParser(_T("priority"), &analyzer);
Hits* hits = NULL;
Query* query = parser->parse(_T("high"));
TCHAR* tmp = query->toString(_T("priority"));
CuMessage(tc, _T("Query: %s\n"), tmp );
_CLDELETE_CARRAY(tmp);
hits = searcher->search(query);
print_tHits(tc, hits);
_CLDELETE(hits);
_CLDELETE(query);
_CLDELETE(parser);
searcher->close();
_CLDELETE(searcher);
// try a new search with OR
searcher = _CLNEW IndexSearcher( &directory );
parser = _CLNEW QueryParser(_T("priority"), &analyzer);
hits = NULL;
query = parser->parse(_T("high OR medium"));
tmp = query->toString(_T("priority"));
CuMessage(tc, _T("Query: %s\n"), tmp );
_CLDELETE_CARRAY(tmp);
hits = searcher->search(query);
print_tHits(tc, hits);
_CLDELETE(hits);
_CLDELETE(query);
_CLDELETE(parser);
searcher->close();
_CLDELETE(searcher);
directory.close();
}
CuSuite *testduplicates(void)
{
CuSuite *suite = CuSuiteNew(_T("CLucene Duplicates Test"));
SUITE_ADD_TEST(suite, testSearchTestForDuplicates);
SUITE_ADD_TEST(suite, testSearchTestForDuplicatesRaw);
return suite;
}
// EOF