+package org.apache.lucene.index;
+
+/**
+ * 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.
+ */
+
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.lucene.analysis.MockAnalyzer;
+import org.apache.lucene.analysis.WhitespaceAnalyzer;
+import org.apache.lucene.index.DocumentsWriter.IndexingChain;
+import org.apache.lucene.index.IndexWriter.IndexReaderWarmer;
+import org.apache.lucene.index.IndexWriterConfig.OpenMode;
+import org.apache.lucene.search.DefaultSimilarity;
+import org.apache.lucene.search.Similarity;
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.util.LuceneTestCase;
+import org.junit.Test;
+
+public class TestIndexWriterConfig extends LuceneTestCase {
+
+ private static final class MySimilarity extends DefaultSimilarity {
+ // Does not implement anything - used only for type checking on IndexWriterConfig.
+ }
+
+ private static final class MyIndexingChain extends IndexingChain {
+ // Does not implement anything - used only for type checking on IndexWriterConfig.
+
+ @Override
+ DocConsumer getChain(DocumentsWriter documentsWriter) {
+ return null;
+ }
+
+ }
+
+ private static final class MyWarmer extends IndexReaderWarmer {
+ // Does not implement anything - used only for type checking on IndexWriterConfig.
+
+ @Override
+ public void warm(IndexReader reader) throws IOException {
+ }
+
+ }
+
+ @Test
+ public void testDefaults() throws Exception {
+ IndexWriterConfig conf = new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random));
+ assertEquals(MockAnalyzer.class, conf.getAnalyzer().getClass());
+ assertNull(conf.getIndexCommit());
+ assertEquals(KeepOnlyLastCommitDeletionPolicy.class, conf.getIndexDeletionPolicy().getClass());
+ assertEquals(ConcurrentMergeScheduler.class, conf.getMergeScheduler().getClass());
+ assertEquals(OpenMode.CREATE_OR_APPEND, conf.getOpenMode());
+ assertTrue(Similarity.getDefault() == conf.getSimilarity());
+ assertEquals(IndexWriterConfig.DEFAULT_TERM_INDEX_INTERVAL, conf.getTermIndexInterval());
+ assertEquals(IndexWriterConfig.getDefaultWriteLockTimeout(), conf.getWriteLockTimeout());
+ assertEquals(IndexWriterConfig.WRITE_LOCK_TIMEOUT, IndexWriterConfig.getDefaultWriteLockTimeout());
+ assertEquals(IndexWriterConfig.DEFAULT_MAX_BUFFERED_DELETE_TERMS, conf.getMaxBufferedDeleteTerms());
+ assertEquals(IndexWriterConfig.DEFAULT_RAM_BUFFER_SIZE_MB, conf.getRAMBufferSizeMB(), 0.0);
+ assertEquals(IndexWriterConfig.DEFAULT_MAX_BUFFERED_DOCS, conf.getMaxBufferedDocs());
+ assertEquals(IndexWriterConfig.DEFAULT_READER_POOLING, conf.getReaderPooling());
+ assertTrue(DocumentsWriter.defaultIndexingChain == conf.getIndexingChain());
+ assertNull(conf.getMergedSegmentWarmer());
+ assertEquals(IndexWriterConfig.DEFAULT_MAX_THREAD_STATES, conf.getMaxThreadStates());
+ assertEquals(IndexWriterConfig.DEFAULT_READER_TERMS_INDEX_DIVISOR, conf.getReaderTermsIndexDivisor());
+ assertEquals(TieredMergePolicy.class, conf.getMergePolicy().getClass());
+
+ // Sanity check - validate that all getters are covered.
+ Set<String> getters = new HashSet<String>();
+ getters.add("getAnalyzer");
+ getters.add("getIndexCommit");
+ getters.add("getIndexDeletionPolicy");
+ getters.add("getMergeScheduler");
+ getters.add("getOpenMode");
+ getters.add("getSimilarity");
+ getters.add("getTermIndexInterval");
+ getters.add("getWriteLockTimeout");
+ getters.add("getDefaultWriteLockTimeout");
+ getters.add("getMaxBufferedDeleteTerms");
+ getters.add("getRAMBufferSizeMB");
+ getters.add("getMaxBufferedDocs");
+ getters.add("getIndexingChain");
+ getters.add("getMergedSegmentWarmer");
+ getters.add("getMergePolicy");
+ getters.add("getMaxThreadStates");
+ getters.add("getReaderPooling");
+ getters.add("getReaderTermsIndexDivisor");
+ for (Method m : IndexWriterConfig.class.getDeclaredMethods()) {
+ if (m.getDeclaringClass() == IndexWriterConfig.class && m.getName().startsWith("get")) {
+ assertTrue("method " + m.getName() + " is not tested for defaults", getters.contains(m.getName()));
+ }
+ }
+ }
+
+ @Test
+ public void testSettersChaining() throws Exception {
+ // Ensures that every setter returns IndexWriterConfig to enable easy
+ // chaining.
+ for (Method m : IndexWriterConfig.class.getDeclaredMethods()) {
+ if (m.getDeclaringClass() == IndexWriterConfig.class
+ && m.getName().startsWith("set")
+ && !Modifier.isStatic(m.getModifiers())) {
+ assertEquals("method " + m.getName() + " does not return IndexWriterConfig",
+ IndexWriterConfig.class, m.getReturnType());
+ }
+ }
+ }
+
+ @Test
+ public void testConstants() throws Exception {
+ // Tests that the values of the constants does not change
+ assertEquals(1000, IndexWriterConfig.WRITE_LOCK_TIMEOUT);
+ assertEquals(128, IndexWriterConfig.DEFAULT_TERM_INDEX_INTERVAL);
+ assertEquals(-1, IndexWriterConfig.DISABLE_AUTO_FLUSH);
+ assertEquals(IndexWriterConfig.DISABLE_AUTO_FLUSH, IndexWriterConfig.DEFAULT_MAX_BUFFERED_DELETE_TERMS);
+ assertEquals(IndexWriterConfig.DISABLE_AUTO_FLUSH, IndexWriterConfig.DEFAULT_MAX_BUFFERED_DOCS);
+ assertEquals(16.0, IndexWriterConfig.DEFAULT_RAM_BUFFER_SIZE_MB, 0.0);
+ assertEquals(false, IndexWriterConfig.DEFAULT_READER_POOLING);
+ assertEquals(8, IndexWriterConfig.DEFAULT_MAX_THREAD_STATES);
+ assertEquals(IndexReader.DEFAULT_TERMS_INDEX_DIVISOR, IndexWriterConfig.DEFAULT_READER_TERMS_INDEX_DIVISOR);
+ }
+
+ @Test
+ public void testToString() throws Exception {
+ String str = new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random)).toString();
+ for (Field f : IndexWriterConfig.class.getDeclaredFields()) {
+ int modifiers = f.getModifiers();
+ if (Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers)) {
+ // Skip static final fields, they are only constants
+ continue;
+ } else if ("indexingChain".equals(f.getName())) {
+ // indexingChain is a package-private setting and thus is not output by
+ // toString.
+ continue;
+ }
+ assertTrue(f.getName() + " not found in toString", str.indexOf(f.getName()) != -1);
+ }
+ }
+
+ @Test
+ public void testClone() throws Exception {
+ IndexWriterConfig conf = new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random));
+ IndexWriterConfig clone = (IndexWriterConfig) conf.clone();
+
+ // Clone is shallow since not all parameters are cloneable.
+ assertTrue(conf.getIndexDeletionPolicy() == clone.getIndexDeletionPolicy());
+
+ conf.setMergeScheduler(new SerialMergeScheduler());
+ assertEquals(ConcurrentMergeScheduler.class, clone.getMergeScheduler().getClass());
+ }
+
+ @Test
+ public void testInvalidValues() throws Exception {
+ IndexWriterConfig conf = new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random));
+
+ // Test IndexDeletionPolicy
+ assertEquals(KeepOnlyLastCommitDeletionPolicy.class, conf.getIndexDeletionPolicy().getClass());
+ conf.setIndexDeletionPolicy(new SnapshotDeletionPolicy(null));
+ assertEquals(SnapshotDeletionPolicy.class, conf.getIndexDeletionPolicy().getClass());
+ conf.setIndexDeletionPolicy(null);
+ assertEquals(KeepOnlyLastCommitDeletionPolicy.class, conf.getIndexDeletionPolicy().getClass());
+
+ // Test MergeScheduler
+ assertEquals(ConcurrentMergeScheduler.class, conf.getMergeScheduler().getClass());
+ conf.setMergeScheduler(new SerialMergeScheduler());
+ assertEquals(SerialMergeScheduler.class, conf.getMergeScheduler().getClass());
+ conf.setMergeScheduler(null);
+ assertEquals(ConcurrentMergeScheduler.class, conf.getMergeScheduler().getClass());
+
+ // Test Similarity
+ assertTrue(Similarity.getDefault() == conf.getSimilarity());
+ conf.setSimilarity(new MySimilarity());
+ assertEquals(MySimilarity.class, conf.getSimilarity().getClass());
+ conf.setSimilarity(null);
+ assertTrue(Similarity.getDefault() == conf.getSimilarity());
+
+ // Test IndexingChain
+ assertTrue(DocumentsWriter.defaultIndexingChain == conf.getIndexingChain());
+ conf.setIndexingChain(new MyIndexingChain());
+ assertEquals(MyIndexingChain.class, conf.getIndexingChain().getClass());
+ conf.setIndexingChain(null);
+ assertTrue(DocumentsWriter.defaultIndexingChain == conf.getIndexingChain());
+
+ try {
+ conf.setMaxBufferedDeleteTerms(0);
+ fail("should not have succeeded to set maxBufferedDeleteTerms to 0");
+ } catch (IllegalArgumentException e) {
+ // this is expected
+ }
+
+ try {
+ conf.setMaxBufferedDocs(1);
+ fail("should not have succeeded to set maxBufferedDocs to 1");
+ } catch (IllegalArgumentException e) {
+ // this is expected
+ }
+
+ try {
+ // Disable both MAX_BUF_DOCS and RAM_SIZE_MB
+ conf.setMaxBufferedDocs(4);
+ conf.setRAMBufferSizeMB(IndexWriterConfig.DISABLE_AUTO_FLUSH);
+ conf.setMaxBufferedDocs(IndexWriterConfig.DISABLE_AUTO_FLUSH);
+ fail("should not have succeeded to disable maxBufferedDocs when ramBufferSizeMB is disabled as well");
+ } catch (IllegalArgumentException e) {
+ // this is expected
+ }
+
+ conf.setRAMBufferSizeMB(IndexWriterConfig.DEFAULT_RAM_BUFFER_SIZE_MB);
+ conf.setMaxBufferedDocs(IndexWriterConfig.DEFAULT_MAX_BUFFERED_DOCS);
+ try {
+ conf.setRAMBufferSizeMB(IndexWriterConfig.DISABLE_AUTO_FLUSH);
+ fail("should not have succeeded to disable ramBufferSizeMB when maxBufferedDocs is disabled as well");
+ } catch (IllegalArgumentException e) {
+ // this is expected
+ }
+
+ // Test setReaderTermsIndexDivisor
+ try {
+ conf.setReaderTermsIndexDivisor(0);
+ fail("should not have succeeded to set termsIndexDivisor to 0");
+ } catch (IllegalArgumentException e) {
+ // this is expected
+ }
+
+ // Setting to -1 is ok
+ conf.setReaderTermsIndexDivisor(-1);
+ try {
+ conf.setReaderTermsIndexDivisor(-2);
+ fail("should not have succeeded to set termsIndexDivisor to < -1");
+ } catch (IllegalArgumentException e) {
+ // this is expected
+ }
+
+ assertEquals(IndexWriterConfig.DEFAULT_MAX_THREAD_STATES, conf.getMaxThreadStates());
+ conf.setMaxThreadStates(5);
+ assertEquals(5, conf.getMaxThreadStates());
+ conf.setMaxThreadStates(0);
+ assertEquals(IndexWriterConfig.DEFAULT_MAX_THREAD_STATES, conf.getMaxThreadStates());
+
+ // Test MergePolicy
+ assertEquals(TieredMergePolicy.class, conf.getMergePolicy().getClass());
+ conf.setMergePolicy(new LogDocMergePolicy());
+ assertEquals(LogDocMergePolicy.class, conf.getMergePolicy().getClass());
+ conf.setMergePolicy(null);
+ assertEquals(LogByteSizeMergePolicy.class, conf.getMergePolicy().getClass());
+ }
+
+ /**
+ * @deprecated should be removed once all the deprecated setters are removed
+ * from IndexWriter.
+ */
+ @Test @Deprecated
+ public void testIndexWriterSetters() throws Exception {
+ // This test intentionally tests deprecated methods. The purpose is to pass
+ // whatever the user set on IW to IWC, so that if the user calls
+ // iw.getConfig().getXYZ(), he'll get the same value he passed to
+ // iw.setXYZ().
+ IndexWriterConfig conf = new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT));
+ Directory dir = newDirectory();
+ IndexWriter writer = new IndexWriter(dir, conf);
+
+ writer.setSimilarity(new MySimilarity());
+ assertEquals(MySimilarity.class, writer.getConfig().getSimilarity().getClass());
+
+ writer.setMaxBufferedDeleteTerms(4);
+ assertEquals(4, writer.getConfig().getMaxBufferedDeleteTerms());
+
+ writer.setMaxBufferedDocs(10);
+ assertEquals(10, writer.getConfig().getMaxBufferedDocs());
+
+ writer.setMergeScheduler(new SerialMergeScheduler());
+ assertEquals(SerialMergeScheduler.class, writer.getConfig().getMergeScheduler().getClass());
+
+ writer.setRAMBufferSizeMB(1.5);
+ assertEquals(1.5, writer.getConfig().getRAMBufferSizeMB(), 0.0);
+
+ writer.setTermIndexInterval(40);
+ assertEquals(40, writer.getConfig().getTermIndexInterval());
+
+ writer.setWriteLockTimeout(100);
+ assertEquals(100, writer.getConfig().getWriteLockTimeout());
+
+ writer.setMergedSegmentWarmer(new MyWarmer());
+ assertEquals(MyWarmer.class, writer.getConfig().getMergedSegmentWarmer().getClass());
+
+ writer.setMergePolicy(new LogDocMergePolicy());
+ assertEquals(LogDocMergePolicy.class, writer.getConfig().getMergePolicy().getClass());
+ writer.close();
+ dir.close();
+ }
+
+}