/*------------------------------------------------------------------------------ * 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 "DateFilter.h" CL_NS_USE(index) CL_NS_USE(util) CL_NS_USE(document) CL_NS_DEF(search) DateFilter::~DateFilter(){ _CLDELETE_CARRAY( start ); _CLDELETE_CARRAY( field ); _CLDELETE_CARRAY( end ); } DateFilter::DateFilter(const DateFilter& copy): start ( STRDUP_TtoT(copy.start) ), end ( STRDUP_TtoT(copy.end) ) { field = STRDUP_TtoT(copy.field); } /** Constructs a filter for field f matching times between from and to. */ DateFilter::DateFilter(const TCHAR* f, int64_t from, int64_t to): start ( DateField::timeToString(from) ), end ( DateField::timeToString(to) ) { field = STRDUP_TtoT(f); } /** Constructs a filter for field f matching times before time. */ DateFilter* DateFilter::Before(const TCHAR* field, int64_t time) { return _CLNEW DateFilter(field, 0,time); } /** Constructs a filter for field f matching times after time. */ DateFilter* DateFilter::After(const TCHAR* field, int64_t time) { return _CLNEW DateFilter(field,time, DATEFIELD_DATE_MAX ); } /** Returns a BitSet with true for documents which should be permitted in search results, and false for those that should not. */ BitSet* DateFilter::bits(IndexReader* reader) { BitSet* bts = _CLNEW BitSet(reader->maxDoc()); Term* t = _CLNEW Term(field, start,false); //todo: was false TermEnum* enumerator = reader->terms(t); _CLDECDELETE(t); if (enumerator->term(false) == NULL){ _CLDELETE(enumerator); return bts; } TermDocs* termDocs = reader->termDocs(); try { Term* stop = _CLNEW Term(field, end, false); while (enumerator->term(false)->compareTo(stop) <= 0) { termDocs->seek(enumerator->term(false)); while (termDocs->next()) { bts->set(termDocs->doc()); } if (!enumerator->next()) { break; } } _CLDECDELETE(stop); } _CLFINALLY ( termDocs->close(); _CLVDELETE(termDocs); //todo: should be _delete enumerator->close(); _CLDELETE(enumerator); ); return bts; } Filter* DateFilter::clone() const{ return _CLNEW DateFilter(*this); } TCHAR* DateFilter::toString(){ size_t len = _tcslen(field) + _tcslen(start) + _tcslen(end) + 8; TCHAR* ret = _CL_NEWARRAY(TCHAR,len); ret[0]=0; _sntprintf(ret,len,_T("%s: [%s-%s]"),field,start,end); return ret; } CL_NS_END