1
/*------------------------------------------------------------------------------
2
* Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team
4
* Distributable under the terms of either the Apache License (Version 2.0) or
5
* the GNU Lesser General Public License, as specified in the COPYING file.
6
------------------------------------------------------------------------------*/
7
#include "../CheckHits.h"
9
#include "CLucene/search/spans/Spans.h"
10
#include "CLucene/search/spans/SpanNearQuery.h"
11
#include "CLucene/search/spans/SpanOrQuery.h"
13
const TCHAR * TestSpans::field = _T( "field" );
14
const TCHAR * TestSpans::docFields[] =
16
_T( "w1 w2 w3 w4 w5" ),
18
_T( "w1 xx w2 yy w3" ),
19
_T( "w1 w3 xx w2 yy w3" ),
23
_T( "u2 xx u2 yy u1" ),
27
_T( "t1 t2 t1 t3 t2 t3" )
30
TestSpans::TestSpans( CuTest* tc )
33
this->searcher = NULL;
34
this->directory = NULL;
37
TestSpans::~TestSpans()
42
_CLDELETE( searcher );
48
_CLDELETE( directory );
52
void TestSpans::setUp()
54
directory = _CLNEW RAMDirectory();
55
Analyzer * analyzer = _CLNEW WhitespaceAnalyzer();
56
IndexWriter * writer = _CLNEW IndexWriter( directory, analyzer, true );
58
for( size_t i = 0; i < sizeof( docFields ) / sizeof( docFields[0] ); i++ )
61
doc.add( * _CLNEW Field( field, docFields[ i ], Field::STORE_YES | Field::INDEX_TOKENIZED ));
62
writer->addDocument( &doc );
67
_CLDELETE( analyzer );
69
searcher = _CLNEW IndexSearcher( directory );
72
SpanTermQuery * TestSpans::makeSpanTermQuery( const TCHAR * text )
74
Term * term = _CLNEW Term( field, text );
75
SpanTermQuery * query = _CLNEW SpanTermQuery( term );
80
void TestSpans::checkHits( Query * query, int32_t * results, size_t resultsCount )
82
CheckHits::checkHits( tc, query, field, searcher, results, resultsCount );
85
void TestSpans::orderedSlopTest3SQ( SpanQuery * q1, SpanQuery * q2, SpanQuery * q3, int32_t slop, int32_t * expectedDocs, size_t expectedDocsCount )
88
SpanQuery ** clauses = _CL_NEWARRAY( SpanQuery *, 3 );
93
SpanNearQuery * snq = _CLNEW SpanNearQuery( clauses, clauses+3, slop, ordered, true );
94
checkHits( snq, expectedDocs, expectedDocsCount );
97
_CLDELETE_LARRAY( clauses );
100
void TestSpans::orderedSlopTest3( int32_t slop, int32_t * expectedDocs, size_t expectedDocsCount )
103
makeSpanTermQuery( _T( "w1" )),
104
makeSpanTermQuery( _T( "w2" )),
105
makeSpanTermQuery( _T( "w3" )),
111
void TestSpans::orderedSlopTest3Equal( int32_t slop, int32_t * expectedDocs, size_t expectedDocsCount )
114
makeSpanTermQuery( _T( "w1" )),
115
makeSpanTermQuery( _T( "w3" )),
116
makeSpanTermQuery( _T( "w3" )),
122
void TestSpans::orderedSlopTest1Equal( int32_t slop, int32_t * expectedDocs, size_t expectedDocsCount )
125
makeSpanTermQuery( _T( "u2" )),
126
makeSpanTermQuery( _T( "u2" )),
127
makeSpanTermQuery( _T( "u1" )),
133
void TestSpans::testSpanNearOrdered()
135
int32_t expectedDocs[] = { 0, 1, 2, 3 };
137
orderedSlopTest3( 0, expectedDocs, 1 );
138
orderedSlopTest3( 1, expectedDocs, 2 );
139
orderedSlopTest3( 2, expectedDocs, 3 );
140
orderedSlopTest3( 3, expectedDocs, 4 );
141
orderedSlopTest3( 4, expectedDocs, 4 );
144
void TestSpans::testSpanNearOrderedEqual()
146
int32_t expectedDocs[] = { 1, 3 };
148
orderedSlopTest3Equal( 0, expectedDocs, 0 );
149
orderedSlopTest3Equal( 1, expectedDocs, 1 );
150
orderedSlopTest3Equal( 2, expectedDocs, 1 );
151
orderedSlopTest3Equal( 3, expectedDocs, 2 );
154
void TestSpans::testSpanNearOrderedEqual1()
156
int32_t expectedDocs[] = { 4, 5, 6, 7 };
158
orderedSlopTest1Equal( 0, expectedDocs, 1 );
159
orderedSlopTest1Equal( 0, expectedDocs, 1 );
160
orderedSlopTest1Equal( 1, expectedDocs, 3 );
161
orderedSlopTest1Equal( 2, expectedDocs, 4 );
162
orderedSlopTest1Equal( 3, expectedDocs, 4 );
165
void TestSpans::testSpanNearOrderedOverlap()
170
SpanQuery ** clauses = _CL_NEWARRAY( SpanQuery *, 3 );
171
clauses[ 0 ] = makeSpanTermQuery( _T( "t1" ));
172
clauses[ 1 ] = makeSpanTermQuery( _T( "t2" ));
173
clauses[ 2 ] = makeSpanTermQuery( _T( "t3" ));
175
SpanNearQuery * snq = _CLNEW SpanNearQuery( clauses, clauses+3, slop, ordered, true );
176
Spans * spans = snq->getSpans( searcher->getReader() );
178
assertTrueMsg( _T( "first range" ), spans->next() );
179
assertEqualsMsg( _T( "first doc" ), 11, spans->doc());
180
assertEqualsMsg( _T( "first start" ), 0, spans->start());
181
assertEqualsMsg( _T( "first end" ), 4, spans->end());
183
assertTrueMsg( _T( "second range" ), spans->next());
184
assertEqualsMsg( _T( "second doc" ), 11, spans->doc());
185
assertEqualsMsg( _T( "second start" ), 2, spans->start());
186
assertEqualsMsg( _T( "second end" ), 6, spans->end());
188
assertTrueMsg( _T( "third range" ), ! spans->next());
192
_CLDELETE_LARRAY( clauses );
195
void TestSpans::orSpans( const TCHAR ** terms, size_t termsCount, Spans *& spans, Query *& query )
197
SpanQuery ** clauses = _CL_NEWARRAY( SpanQuery *, termsCount );
199
for( size_t i = 0; i < termsCount; i++ )
200
clauses[ i ] = makeSpanTermQuery( terms[ i ]);
202
SpanOrQuery * soq = _CLNEW SpanOrQuery( clauses, clauses + termsCount, true );
203
_CLDELETE_LARRAY( clauses );
205
spans = soq->getSpans( searcher->getReader() );
209
void TestSpans::tstNextSpans( Spans * spans, int32_t doc, int32_t start, int32_t end )
211
assertTrueMsg( _T( "next" ), spans->next());
212
assertEqualsMsg( _T( "doc" ), doc, spans->doc());
213
assertEqualsMsg( _T( "start" ), start, spans->start());
214
assertEqualsMsg( _T( "end" ), end, spans->end());
217
void TestSpans::testSpanOrEmpty()
221
orSpans( NULL, 0, spans, query );
222
assertTrueMsg( _T( "empty next" ), ! spans->next());
227
void TestSpans::testSpanOrSingle()
231
const TCHAR* terms[] = { _T( "w5" ) };
232
orSpans( terms, 1, spans, query );
233
tstNextSpans( spans, 0, 4, 5 );
234
assertTrueMsg( _T( "final next" ), ! spans->next());
239
void TestSpans::testSpanOrDouble()
243
const TCHAR* terms[] = { _T( "w5" ), _T( "yy" ) };
244
orSpans( terms, 2, spans, query );
245
tstNextSpans( spans, 0, 4, 5 );
246
tstNextSpans( spans, 2, 3, 4 );
247
tstNextSpans( spans, 3, 4, 5 );
248
tstNextSpans( spans, 7, 3, 4 );
249
assertTrueMsg( _T( "final next" ), ! spans->next());
254
void TestSpans::testSpanOrDoubleSkip()
258
const TCHAR* terms[] = { _T( "w5" ), _T( "yy" ) };
259
orSpans( terms, 2, spans, query );
260
assertTrueMsg( _T( "initial skipTo" ), spans->skipTo( 3 ));
261
assertEqualsMsg( _T( "doc" ), 3, spans->doc() );
262
assertEqualsMsg( _T( "start" ), 4, spans->start() );
263
assertEqualsMsg( _T( "end" ), 5, spans->end() );
264
tstNextSpans( spans, 7, 3, 4 );
265
assertTrueMsg( _T( "final next" ), ! spans->next() );
270
void TestSpans::testSpanOrUnused()
274
const TCHAR* terms[] = { _T( "w5" ), _T( "unusedTerm" ), _T( "yy" ) };
275
orSpans( terms, 3, spans, query );
276
tstNextSpans( spans, 0, 4, 5 );
277
tstNextSpans( spans, 2, 3, 4 );
278
tstNextSpans( spans, 3, 4, 5 );
279
tstNextSpans( spans, 7, 3, 4 );
280
assertTrueMsg( _T( "final next" ), ! spans->next());
285
void TestSpans::testSpanOrTripleSameDoc()
289
const TCHAR* terms[] = { _T( "t1" ), _T( "t2" ), _T( "t3" ) };
290
orSpans( terms, 3, spans, query );
291
tstNextSpans( spans, 11, 0, 1 );
292
tstNextSpans( spans, 11, 1, 2 );
293
tstNextSpans( spans, 11, 2, 3 );
294
tstNextSpans( spans, 11, 3, 4 );
295
tstNextSpans( spans, 11, 4, 5 );
296
tstNextSpans( spans, 11, 5, 6 );
297
assertTrueMsg( _T( "final next" ), ! spans->next());