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 "CLucene/_ApiHeader.h"
8
#include "CachingSpanFilter.h"
9
#include "CLucene/index/IndexReader.h"
15
* Result wrapper for the cache
17
class ResultHolder : LUCENE_BASE
21
SpanFilterResult * result;
23
ResultHolder(SpanFilterResult * result, bool deleteResult )
25
this->result = result;
26
this->deleteResult = deleteResult;
35
struct CachingSpanFilter::Internal
37
typedef CL_NS(util)::CLHashMap<
38
CL_NS(index)::IndexReader *,
40
CL_NS(util)::Compare::Void<CL_NS(index)::IndexReader>,
41
CL_NS(util)::Equals::Void<CL_NS(index)::IndexReader>,
42
CL_NS(util)::Deletor::Object<CL_NS(index)::IndexReader>,
43
CL_NS(util)::Deletor::Object<ResultHolder>
46
ResultCacheType cache;
47
DEFINE_MUTEX(cache_LOCK)
49
Internal() : cache(false,true)
53
CachingSpanFilter::CachingSpanFilter( SpanFilter * filter, bool deleteFilter )
55
_internal = _CLNEW Internal();
56
this->filter = filter;
57
this->deleteFilter = deleteFilter;
60
CachingSpanFilter::CachingSpanFilter( const CachingSpanFilter& copy )
62
_internal = _CLNEW Internal();
63
this->filter = (SpanFilter*)copy.filter->clone();
64
this->deleteFilter = true;
67
CachingSpanFilter::~CachingSpanFilter()
69
_CLDELETE( _internal );
78
Filter* CachingSpanFilter::clone() const
80
return _CLNEW CachingSpanFilter( *this );
83
CL_NS(util)::BitSet* CachingSpanFilter::bits( CL_NS(index)::IndexReader * reader )
85
SpanFilterResult * result = getCachedResult( reader );
86
return result != NULL ? result->getBits() : NULL;
89
SpanFilterResult * CachingSpanFilter::getCachedResult( CL_NS(index)::IndexReader * reader )
91
SCOPED_LOCK_MUTEX( _internal->cache_LOCK )
93
ResultHolder * resultHolder = _internal->cache.get( reader );
96
SpanFilterResult * result = filter->bitSpans( reader );
97
resultHolder = _CLNEW ResultHolder( result, true );
98
_internal->cache.put( reader, resultHolder );
101
return resultHolder->result;
104
SpanFilterResult * CachingSpanFilter::bitSpans( CL_NS(index)::IndexReader * reader )
106
return getCachedResult( reader );
109
TCHAR* CachingSpanFilter::toString()
111
TCHAR* ft = filter->toString();
112
size_t len = _tcslen( ft ) + 20;
113
TCHAR* ret = _CL_NEWARRAY( TCHAR, len );
115
_sntprintf( ret, len, _T( "CachingSpanFilter(%s)" ), ft );
116
_CLDELETE_CARRAY( ft );
b'\\ No newline at end of file'