/* * 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.lucene.benchmark.byTask.tasks; import java.nio.file.Paths; import org.apache.lucene.benchmark.byTask.PerfRunData; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.index.CodecReader; import org.apache.lucene.index.SlowCodecReaderWrapper; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; /** * Adds an input index to an existing index, using * {@link IndexWriter#addIndexes(Directory...)} or * {@link IndexWriter#addIndexes(CodecReader...)}. The location of the input * index is specified by the parameter {@link #ADDINDEXES_INPUT_DIR} and is * assumed to be a directory on the file system. * <p> * Takes optional parameter {@code useAddIndexesDir} which specifies which * addIndexes variant to use (defaults to true, to use addIndexes(Directory)). */ public class AddIndexesTask extends PerfTask { public static final String ADDINDEXES_INPUT_DIR = "addindexes.input.dir"; public AddIndexesTask(PerfRunData runData) { super(runData); } private boolean useAddIndexesDir = true; private FSDirectory inputDir; @Override public void setup() throws Exception { super.setup(); String inputDirProp = getRunData().getConfig().get(ADDINDEXES_INPUT_DIR, null); if (inputDirProp == null) { throw new IllegalArgumentException("config parameter " + ADDINDEXES_INPUT_DIR + " not specified in configuration"); } inputDir = FSDirectory.open(Paths.get(inputDirProp)); } @Override public int doLogic() throws Exception { IndexWriter writer = getRunData().getIndexWriter(); if (useAddIndexesDir) { writer.addIndexes(inputDir); } else { try (IndexReader r = DirectoryReader.open(inputDir)) { CodecReader leaves[] = new CodecReader[r.leaves().size()]; int i = 0; for (LeafReaderContext leaf : r.leaves()) { leaves[i++] = SlowCodecReaderWrapper.wrap(leaf.reader()); } writer.addIndexes(leaves); } } return 1; } /** * Set the params (useAddIndexesDir only) * * @param params * {@code useAddIndexesDir=true} for using * {@link IndexWriter#addIndexes(Directory...)} or {@code false} for * using {@link IndexWriter#addIndexes(CodecReader...)}. Defaults to * {@code true}. */ @Override public void setParams(String params) { super.setParams(params); useAddIndexesDir = Boolean.parseBoolean(params); } @Override public boolean supportsParams() { return true; } @Override public void tearDown() throws Exception { inputDir.close(); super.tearDown(); } }