#include "CLucene/StdHeader.h"
#include "BooleanQuery.h"
#include "CLucene/index/IndexReader.h"
#include "CLucene/util/StringBuffer.h"
#include "SearchHeader.h"
#include "BooleanClause.h"
#include "BooleanScorer.h"
#include "Scorer.h"
using
namespace
lucene::index;
namespace
lucene{
namespace
search {
BooleanQuery::BooleanQuery() {
clauses.setDoDelete(DELETE_TYPE_DELETE);
}
BooleanQuery::~BooleanQuery(){
}
const
char_t* BooleanQuery::getQueryName()
const
{
return
_T(
"BooleanQuery"
);
}
void
BooleanQuery::add(Query& query,
const
bool
deleteQuery,
const
bool
required,
const
bool
prohibited) {
clauses.push_back(
new
BooleanClause(query,deleteQuery,required, prohibited));
}
void
BooleanQuery::add(BooleanClause& clause) {
clauses.push_back(&clause);
}
void
BooleanQuery::prepare(IndexReader& reader) {
for
(uint_t i = 0 ; i < clauses.size(); i++) {
BooleanClause* c = clauses.at(i);
c->query.prepare(reader);
}
}
BooleanClause** BooleanQuery::getClauses()
{
BooleanClause** ret =
new
BooleanClause*[clauses.size()];
for
( uint_t i=0;i<clauses.size();i++ )
ret[i] = clauses.at(i);
return
ret;
}
int_t BooleanQuery::getClauseCount() {
return
(int_t) clauses.size();
}
float_t BooleanQuery::sumOfSquaredWeights(Searcher& searcher){
float_t sum = 0.0f;
for
(uint_t i = 0 ; i < clauses.size(); i++) {
BooleanClause* c = clauses.at(i);
if
(!c->prohibited)
sum += c->query.sumOfSquaredWeights(searcher);
}
return
sum;
}
void
BooleanQuery::normalize(
const
float_t norm) {
for
(uint_t i = 0 ; i < clauses.size(); i++) {
BooleanClause* c = clauses.at(i);
if
(!c->prohibited)
c->query.normalize(norm);
}
}
Scorer* BooleanQuery::scorer(IndexReader& reader){
if
(clauses.size() == 1) {
BooleanClause* c = clauses.at(0);
if
(!c->prohibited)
return
c->query.scorer(reader);
}
BooleanScorer* result =
new
BooleanScorer;
for
(uint_t i = 0 ; i < clauses.size(); i++) {
BooleanClause* c = clauses.at(i);
Scorer* subScorer = c->query.scorer(reader);
if
(subScorer != NULL)
result->add(*subScorer, c->required, c->prohibited);
else
if
(c->required)
return
NULL;
}
return
result;
}
const
char_t* BooleanQuery::toString(
const
char_t* field) {
lucene::util::StringBuffer buffer;
for
(uint_t i = 0 ; i < clauses.size(); i++) {
BooleanClause* c = clauses.at(i);
if
(c->prohibited)
buffer.append(_T(
"-"
));
else
if
(c->required)
buffer.append(_T(
"+"
));
Query& subQuery = c->query;
if
( subQuery.instanceOf(_T(
"BooleanQuery"
)) ) {
buffer.append(_T(
"("
));
const
char_t* buf = c->query.toString(field);
buffer.append(buf);
delete
[] buf;
buffer.append(_T(
")"
));
}
else
{
const
char_t* buf = c->query.toString(field);
buffer.append(buf);
delete
[] buf;
}
if
(i != clauses.size()-1)
buffer.append(_T(
" "
));
}
return
buffer.ToString();
}
}}