package org.compass.core.lucene.engine.indexdeletionpolicy; import java.io.IOException; import java.util.Iterator; import java.util.List; import org.apache.lucene.index.IndexCommitPoint; import org.apache.lucene.index.IndexDeletionPolicy; import org.apache.lucene.store.Directory; import org.compass.core.CompassException; import org.compass.core.config.CompassConfigurable; import org.compass.core.config.CompassSettings; import org.compass.core.lucene.LuceneEnvironment; /** * An index deletion policy that keeps all commits that have not expired. Expiration time (in seconds) * can be set using {@link org.compass.core.lucene.LuceneEnvironment.IndexDeletionPolicy.ExpirationTime} * settings. * * @author kimchy * @see org.compass.core.lucene.engine.indexdeletionpolicy.IndexDeletionPolicyFactory */ public class ExpirationTimeDeletionPolicy implements IndexDeletionPolicy, DirectoryConfigurable, CompassConfigurable { private double expirationTimeSeconds; private Directory dir; public void setDirectory(Directory directory) { this.dir = directory; } /** * Configures the expiration time of the deletion policy. Can be controlled using * {@link LuceneEnvironment.IndexDeletionPolicy.ExpirationTime#EXPIRATION_TIME_IN_SECONDS}. * * <p>Defaults to the cache invalidation time * 3. */ public void configure(CompassSettings settings) throws CompassException { double defaultValue = ((double) settings.getSettingAsLong(LuceneEnvironment.SearchEngineIndex.CACHE_INTERVAL_INVALIDATION, LuceneEnvironment.SearchEngineIndex.DEFAULT_CACHE_INTERVAL_INVALIDATION)) / 1000; this.expirationTimeSeconds = settings.getSettingAsDouble(LuceneEnvironment.IndexDeletionPolicy.ExpirationTime.EXPIRATION_TIME_IN_SECONDS, defaultValue * 3); } public void onInit(List commits) throws IOException { onCommit(commits); } public void onCommit(List commits) throws IOException { IndexCommitPoint lastCommit = (IndexCommitPoint) commits.get(commits.size() - 1); // Any commit older than expireTime should be deleted: double expireTime = dir.fileModified(lastCommit.getSegmentsFileName()) / 1000.0 - expirationTimeSeconds; Iterator it = commits.iterator(); while (it.hasNext()) { IndexCommitPoint commit = (IndexCommitPoint) it.next(); double modTime = dir.fileModified(commit.getSegmentsFileName()) / 1000.0; if (commit != lastCommit && modTime < expireTime) { commit.delete(); } } } public String toString() { return super.toString() + " expirationTimeInSeconds [" + expirationTimeSeconds + "]"; } }