/*------------------------------------------------------------------------------
* 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_CachingWrapperFilter_
#define _lucene_search_CachingWrapperFilter_

#include "CLucene/util/BitSet.h"
#include "CLucene/index/IndexReader.h"
#include "Filter.h"

CL_NS_DEF(search)
/**
 * Wraps another filter's result and caches it.  The purpose is to allow
 * filters to implement this and allow itself to be cached. Alternatively,
 * use the CachingWrapperFilter to cache the filter.
 */
class AbstractCachingFilter: public Filter 
{
	class BitSetHolder: LUCENE_BASE{
		bool deleteBs;
	public:
		BitSetHolder(CL_NS(util)::BitSet* bits, bool deleteBs);
		~BitSetHolder();
		CL_NS(util)::BitSet* bits;
	};
	void closeCallback(CL_NS(index)::IndexReader* reader, void* param);
	typedef CL_NS(util)::CLHashMap<CL_NS(index)::IndexReader*, 
	  BitSetHolder*, 
	  CL_NS(util)::Compare::Void<CL_NS(index)::IndexReader>,
	  CL_NS(util)::Equals::Void<CL_NS(index)::IndexReader>,
	  CL_NS(util)::Deletor::Object<CL_NS(index)::IndexReader>, 
	  CL_NS(util)::Deletor::Object<BitSetHolder> > CacheType; 

	CacheType cache;

protected:
	AbstractCachingFilter( const AbstractCachingFilter& copy );
	virtual CL_NS(util)::BitSet* doBits( CL_NS(index)::IndexReader* reader ) = 0;
	virtual bool doShouldDeleteBitSet( CL_NS(util)::BitSet* bits ){ return false; }
	AbstractCachingFilter();
public:
	virtual ~AbstractCachingFilter();

	/** Returns a BitSet with true for documents which should be permitted in
	search results, and false for those that should not. */
	CL_NS(util)::BitSet* bits( CL_NS(index)::IndexReader* reader );
	
	virtual Filter *clone() const = 0;
	virtual TCHAR *toString() = 0;
	
	bool shouldDeleteBitSet( const CL_NS(util)::BitSet* bits ) const{ return false; }
};

/**
 * Wraps another filter's result and caches it.  The purpose is to allow
 * filters to simply filter, and then wrap with this class to add
 * caching, keeping the two concerns decoupled yet composable.
 */
class CachingWrapperFilter: public AbstractCachingFilter 
{
private:
	Filter* filter;
	bool deleteFilter;
protected:
	CachingWrapperFilter( const CachingWrapperFilter& copy );
	CL_NS(util)::BitSet* doBits( CL_NS(index)::IndexReader* reader );
	bool doShouldDeleteBitSet( CL_NS(util)::BitSet* bits );
public:
	CachingWrapperFilter( Filter* filter, bool deleteFilter=true );
	~CachingWrapperFilter();

	Filter *clone() const;
	TCHAR *toString();
};

CL_NS_END
#endif
