/*------------------------------------------------------------------------------ * 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_index_IndexDeletionPolicy_ #define _lucene_index_IndexDeletionPolicy_ #include #include "CLucene/util/Equators.h" CL_NS_DEF(index) class CLUCENE_EXPORT IndexCommitPoint { public: virtual ~IndexCommitPoint(); /** * Get the segments file (segments_N) associated * with this commit point. */ virtual std::string getSegmentsFileName() = 0; /** * Returns all index files referenced by this commit point. */ virtual const std::vector& getFileNames() = 0; /** * Delete this commit point. *

* Upon calling this, the writer is notified that this commit * point should be deleted. *

* Decision that a commit-point should be deleted is taken by the {@link IndexDeletionPolicy} in effect * and therefore this should only be called by its {@link IndexDeletionPolicy#onInit onInit()} or * {@link IndexDeletionPolicy#onCommit onCommit()} methods. */ virtual void deleteCommitPoint() = 0; }; /** *

Expert: policy for deletion of stale {@link IndexCommitPoint index commits}. * *

Implement this interface, and pass it to one * of the {@link IndexWriter} or {@link IndexReader} * constructors, to customize when older * {@link IndexCommitPoint point-in-time commits} * are deleted from the index directory. The default deletion policy * is {@link KeepOnlyLastCommitDeletionPolicy}, which always * removes old commits as soon as a new commit is done (this * matches the behavior before 2.2).

* *

One expected use case for this (and the reason why it * was first created) is to work around problems with an * index directory accessed via filesystems like NFS because * NFS does not provide the "delete on last close" semantics * that Lucene's "point in time" search normally relies on. * By implementing a custom deletion policy, such as "a * commit is only removed once it has been stale for more * than X minutes", you can give your readers time to * refresh to the new commit before {@link IndexWriter} * removes the old commits. Note that doing so will * increase the storage requirements of the index. See LUCENE-710 * for details.

*/ class CLUCENE_EXPORT IndexDeletionPolicy: public CL_NS(util)::NamedObject{ public: virtual ~IndexDeletionPolicy(); /** *

This is called once when a writer is first * instantiated to give the policy a chance to remove old * commit points.

* *

The writer locates all index commits present in the * index directory and calls this method. The policy may * choose to delete some of the commit points, doing so by * calling method {@link IndexCommitPoint#delete delete()} * of {@link IndexCommitPoint}.

* *

Note: the last CommitPoint is the most recent one, * i.e. the "front index state". Be careful not to delete it, * unless you know for sure what you are doing, and unless * you can afford to lose the index content while doing that. * * @param commits List of current * {@link IndexCommitPoint point-in-time commits}, * sorted by age (the 0th one is the oldest commit). */ virtual void onInit(std::vector& commits) = 0; /** *

This is called each time the writer completed a commit. * This gives the policy a chance to remove old commit points * with each commit.

* *

The policy may now choose to delete old commit points * by calling method {@link IndexCommitPoint#delete delete()} * of {@link IndexCommitPoint}.

* *

If writer has autoCommit = true then * this method will in general be called many times during * one instance of {@link IndexWriter}. If * autoCommit = false then this method is * only called once when {@link IndexWriter#close} is * called, or not at all if the {@link IndexWriter#abort} * is called. * *

Note: the last CommitPoint is the most recent one, * i.e. the "front index state". Be careful not to delete it, * unless you know for sure what you are doing, and unless * you can afford to lose the index content while doing that. * * @param commits List of {@link IndexCommitPoint}, * sorted by age (the 0th one is the oldest commit). */ virtual void onCommit(std::vector& commits) = 0; }; /** * This {@link IndexDeletionPolicy} implementation that * keeps only the most recent commit and immediately removes * all prior commits after a new commit is done. This is * the default deletion policy. */ class CLUCENE_EXPORT KeepOnlyLastCommitDeletionPolicy: public IndexDeletionPolicy { public: virtual ~KeepOnlyLastCommitDeletionPolicy(); /** * Deletes all commits except the most recent one. */ void onInit(std::vector& commits); /** * Deletes all commits except the most recent one. */ void onCommit(std::vector& commits); static const char* getClassName(); const char* getObjectName() const; }; CL_NS_END #endif