/*------------------------------------------------------------------------------
* 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.
------------------------------------------------------------------------------*/
#ifndef _lucene_search_spans_SpanNearQuery_
#define _lucene_search_spans_SpanNearQuery_
CL_CLASS_DEF(index, IndexReader);
#include "SpanQuery.h"
CL_NS_DEF2( search, spans )
/** Matches spans which are near one another. One can specify slop, the
* maximum number of intervening unmatched positions, as well as whether
* matches are required to be in-order. */
class CLUCENE_EXPORT SpanNearQuery : public SpanQuery
{
private:
SpanQuery ** clauses;
size_t clausesCount;
bool bDeleteClauses;
int32_t slop;
bool inOrder;
TCHAR * field;
protected:
SpanNearQuery( const SpanNearQuery& clone );
public:
/** Construct a SpanNearQuery. Matches spans matching a span from each
* clause, with up to slop total unmatched positions between
* them. * When inOrder is true, the spans from each clause
* must be * ordered as in clauses. */
template
SpanNearQuery( ClauseIterator first, ClauseIterator last, int32_t slop, bool inOrder, bool bDeleteClauses )
{
// CLucene specific: at least one clause must be here
if( first == last )
_CLTHROWA( CL_ERR_IllegalArgument, "Missing query clauses." );
this->bDeleteClauses = bDeleteClauses;
this->clausesCount = last - first;
this->clauses = _CL_NEWARRAY( SpanQuery *, clausesCount );
this->field = NULL;
// copy clauses array into an array and check fields
for( size_t i = 0; first != last; first++, i++ )
{
SpanQuery * clause = *first;
if( i == 0 )
{
setField( clause->getField() );
}
else if( 0 != _tcscmp( clause->getField(), field ))
{
_CLTHROWA( CL_ERR_IllegalArgument, "Clauses must have same field." );
}
this->clauses[ i ] = clause;
}
this->slop = slop;
this->inOrder = inOrder;
}
virtual ~SpanNearQuery();
CL_NS(search)::Query * clone() const;
static const char * getClassName();
const char * getObjectName() const;
/** Return the clauses whose spans are matched.
* CLucene: pointer to the internal array
*/
SpanQuery ** getClauses() const;
size_t getClausesCount() const;
/** Return the maximum number of intervening unmatched positions permitted.*/
int32_t getSlop() const;
/** Return true if matches are required to be in-order.*/
bool isInOrder() const;
const TCHAR * getField() const;
/** Returns a collection of all terms matched by this query.
* @deprecated use extractTerms instead
* @see #extractTerms(Set)
*/
// public Collection getTerms()
void extractTerms( CL_NS(search)::TermSet * terms ) const;
CL_NS(search)::Query * rewrite( CL_NS(index)::IndexReader * reader );
using Query::toString;
TCHAR* toString( const TCHAR* field ) const;
bool equals( Query* other ) const;
size_t hashCode() const;
Spans * getSpans( CL_NS(index)::IndexReader * reader );
protected:
void setField( const TCHAR * field );
};
CL_NS_END2
#endif // _lucene_search_spans_SpanNearQuery_