blob: 3bf8d7a26b31da60f48b1c4ade24f59cc7623674 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
/*------------------------------------------------------------------------------
* 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 "MultiTermQuery.h"
CL_NS_USE(index)
CL_NS_USE(util)
CL_NS_DEF(search)
/** Constructs a query for terms matching <code>term</code>. */
MultiTermQuery::MultiTermQuery(Term* t){
//Func - Constructor
//Pre - t != NULL
//Post - The instance has been created
CND_PRECONDITION(t != NULL, "t is NULL");
term = _CL_POINTER(t);
}
MultiTermQuery::MultiTermQuery(const MultiTermQuery& clone):
Query(clone)
{
term = _CLNEW Term(clone.getTerm(false),clone.getTerm(false)->text());
}
MultiTermQuery::~MultiTermQuery(){
//Func - Destructor
//Pre - true
//Post - The instance has been destroyed
_CLDECDELETE(term);
}
Term* MultiTermQuery::getTerm(bool pointer) const{
if ( pointer )
return _CL_POINTER(term);
else
return term;
}
Query* MultiTermQuery::rewrite(IndexReader* reader) {
FilteredTermEnum* enumerator = getEnum(reader);
BooleanQuery* query = _CLNEW BooleanQuery();
try {
do {
Term* t = enumerator->term(false);
if (t != NULL) {
TermQuery* tq = _CLNEW TermQuery(t); // found a match
tq->setBoost(getBoost() * enumerator->difference()); // set the boost
query->add(tq,true, false, false); // add to q
}
} while (enumerator->next());
} _CLFINALLY ( enumerator->close(); _CLDELETE(enumerator) );
//if we only added one clause and the clause is not prohibited then
//we can just return the query
if (query->getClauseCount() == 1) { // optimize 1-clause queries
BooleanClause* c=0;
query->getClauses(&c);
if (!c->prohibited) { // just return clause
c->deleteQuery=false;
Query* ret = c->query;
_CLDELETE(query);
return ret;
}
}
return query;
}
Query* MultiTermQuery::combine(Query** queries) {
return Query::mergeBooleanQueries(queries);
}
/** Prints a user-readable version of this query. */
TCHAR* MultiTermQuery::toString(const TCHAR* field) const{
StringBuffer buffer;
if ( field==NULL || _tcscmp(term->field(),field)!=0 ) {
buffer.append(term->field());
buffer.append( _T(":"));
}
buffer.append(term->text());
if (getBoost() != 1.0f) {
buffer.appendChar ( '^' );
buffer.appendFloat( getBoost(),1);
}
return buffer.toString();
}
CL_NS_END
|