/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.hadoop.contrib.index.lucene;

import java.io.IOException;
import java.util.List;

import org.apache.lucene.index.IndexCommitPoint;
import org.apache.lucene.index.IndexDeletionPolicy;

/**
 * For mixed directory. Use KeepAllDeletionPolicy for the read-only directory
 * (keep all from init) and use KeepOnlyLastCommitDeletionPolicy for the
 * writable directory (initially empty, keep latest after init).
 */
class MixedDeletionPolicy implements IndexDeletionPolicy {

  private int keepAllFromInit = 0;

  public void onInit(List commits) throws IOException {
    keepAllFromInit = commits.size();
  }

  public void onCommit(List commits) throws IOException {
    int size = commits.size();
    assert (size > keepAllFromInit);
    // keep all from init and the latest, delete the rest
    for (int i = keepAllFromInit; i < size - 1; i++) {
      ((IndexCommitPoint) commits.get(i)).delete();
    }
  }

}
