1
package org.apache.lucene.index;
4
* Licensed to the Apache Software Foundation (ASF) under one or more
5
* contributor license agreements. See the NOTICE file distributed with
6
* this work for additional information regarding copyright ownership.
7
* The ASF licenses this file to You under the Apache License, Version 2.0
8
* (the "License"); you may not use this file except in compliance with
9
* the License. You may obtain a copy of the License at
11
* http://www.apache.org/licenses/LICENSE-2.0
13
* Unless required by applicable law or agreed to in writing, software
14
* distributed under the License is distributed on an "AS IS" BASIS,
15
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
* See the License for the specific language governing permissions and
17
* limitations under the License.
20
import java.io.IOException;
21
import java.lang.reflect.Field;
22
import java.lang.reflect.Method;
23
import java.lang.reflect.Modifier;
24
import java.util.HashSet;
27
import org.apache.lucene.analysis.MockAnalyzer;
28
import org.apache.lucene.analysis.WhitespaceAnalyzer;
29
import org.apache.lucene.index.DocumentsWriter.IndexingChain;
30
import org.apache.lucene.index.IndexWriter.IndexReaderWarmer;
31
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
32
import org.apache.lucene.search.DefaultSimilarity;
33
import org.apache.lucene.search.Similarity;
34
import org.apache.lucene.store.Directory;
35
import org.apache.lucene.util.LuceneTestCase;
36
import org.junit.Test;
38
public class TestIndexWriterConfig extends LuceneTestCase {
40
private static final class MySimilarity extends DefaultSimilarity {
41
// Does not implement anything - used only for type checking on IndexWriterConfig.
44
private static final class MyIndexingChain extends IndexingChain {
45
// Does not implement anything - used only for type checking on IndexWriterConfig.
48
DocConsumer getChain(DocumentsWriter documentsWriter) {
54
private static final class MyWarmer extends IndexReaderWarmer {
55
// Does not implement anything - used only for type checking on IndexWriterConfig.
58
public void warm(IndexReader reader) throws IOException {
64
public void testDefaults() throws Exception {
65
IndexWriterConfig conf = new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random));
66
assertEquals(MockAnalyzer.class, conf.getAnalyzer().getClass());
67
assertNull(conf.getIndexCommit());
68
assertEquals(KeepOnlyLastCommitDeletionPolicy.class, conf.getIndexDeletionPolicy().getClass());
69
assertEquals(ConcurrentMergeScheduler.class, conf.getMergeScheduler().getClass());
70
assertEquals(OpenMode.CREATE_OR_APPEND, conf.getOpenMode());
71
assertTrue(Similarity.getDefault() == conf.getSimilarity());
72
assertEquals(IndexWriterConfig.DEFAULT_TERM_INDEX_INTERVAL, conf.getTermIndexInterval());
73
assertEquals(IndexWriterConfig.getDefaultWriteLockTimeout(), conf.getWriteLockTimeout());
74
assertEquals(IndexWriterConfig.WRITE_LOCK_TIMEOUT, IndexWriterConfig.getDefaultWriteLockTimeout());
75
assertEquals(IndexWriterConfig.DEFAULT_MAX_BUFFERED_DELETE_TERMS, conf.getMaxBufferedDeleteTerms());
76
assertEquals(IndexWriterConfig.DEFAULT_RAM_BUFFER_SIZE_MB, conf.getRAMBufferSizeMB(), 0.0);
77
assertEquals(IndexWriterConfig.DEFAULT_MAX_BUFFERED_DOCS, conf.getMaxBufferedDocs());
78
assertEquals(IndexWriterConfig.DEFAULT_READER_POOLING, conf.getReaderPooling());
79
assertTrue(DocumentsWriter.defaultIndexingChain == conf.getIndexingChain());
80
assertNull(conf.getMergedSegmentWarmer());
81
assertEquals(IndexWriterConfig.DEFAULT_MAX_THREAD_STATES, conf.getMaxThreadStates());
82
assertEquals(IndexWriterConfig.DEFAULT_READER_TERMS_INDEX_DIVISOR, conf.getReaderTermsIndexDivisor());
83
assertEquals(TieredMergePolicy.class, conf.getMergePolicy().getClass());
85
// Sanity check - validate that all getters are covered.
86
Set<String> getters = new HashSet<String>();
87
getters.add("getAnalyzer");
88
getters.add("getIndexCommit");
89
getters.add("getIndexDeletionPolicy");
90
getters.add("getMergeScheduler");
91
getters.add("getOpenMode");
92
getters.add("getSimilarity");
93
getters.add("getTermIndexInterval");
94
getters.add("getWriteLockTimeout");
95
getters.add("getDefaultWriteLockTimeout");
96
getters.add("getMaxBufferedDeleteTerms");
97
getters.add("getRAMBufferSizeMB");
98
getters.add("getMaxBufferedDocs");
99
getters.add("getIndexingChain");
100
getters.add("getMergedSegmentWarmer");
101
getters.add("getMergePolicy");
102
getters.add("getMaxThreadStates");
103
getters.add("getReaderPooling");
104
getters.add("getReaderTermsIndexDivisor");
105
for (Method m : IndexWriterConfig.class.getDeclaredMethods()) {
106
if (m.getDeclaringClass() == IndexWriterConfig.class && m.getName().startsWith("get")) {
107
assertTrue("method " + m.getName() + " is not tested for defaults", getters.contains(m.getName()));
113
public void testSettersChaining() throws Exception {
114
// Ensures that every setter returns IndexWriterConfig to enable easy
116
for (Method m : IndexWriterConfig.class.getDeclaredMethods()) {
117
if (m.getDeclaringClass() == IndexWriterConfig.class
118
&& m.getName().startsWith("set")
119
&& !Modifier.isStatic(m.getModifiers())) {
120
assertEquals("method " + m.getName() + " does not return IndexWriterConfig",
121
IndexWriterConfig.class, m.getReturnType());
127
public void testConstants() throws Exception {
128
// Tests that the values of the constants does not change
129
assertEquals(1000, IndexWriterConfig.WRITE_LOCK_TIMEOUT);
130
assertEquals(128, IndexWriterConfig.DEFAULT_TERM_INDEX_INTERVAL);
131
assertEquals(-1, IndexWriterConfig.DISABLE_AUTO_FLUSH);
132
assertEquals(IndexWriterConfig.DISABLE_AUTO_FLUSH, IndexWriterConfig.DEFAULT_MAX_BUFFERED_DELETE_TERMS);
133
assertEquals(IndexWriterConfig.DISABLE_AUTO_FLUSH, IndexWriterConfig.DEFAULT_MAX_BUFFERED_DOCS);
134
assertEquals(16.0, IndexWriterConfig.DEFAULT_RAM_BUFFER_SIZE_MB, 0.0);
135
assertEquals(false, IndexWriterConfig.DEFAULT_READER_POOLING);
136
assertEquals(8, IndexWriterConfig.DEFAULT_MAX_THREAD_STATES);
137
assertEquals(IndexReader.DEFAULT_TERMS_INDEX_DIVISOR, IndexWriterConfig.DEFAULT_READER_TERMS_INDEX_DIVISOR);
141
public void testToString() throws Exception {
142
String str = new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random)).toString();
143
for (Field f : IndexWriterConfig.class.getDeclaredFields()) {
144
int modifiers = f.getModifiers();
145
if (Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers)) {
146
// Skip static final fields, they are only constants
148
} else if ("indexingChain".equals(f.getName())) {
149
// indexingChain is a package-private setting and thus is not output by
153
assertTrue(f.getName() + " not found in toString", str.indexOf(f.getName()) != -1);
158
public void testClone() throws Exception {
159
IndexWriterConfig conf = new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random));
160
IndexWriterConfig clone = (IndexWriterConfig) conf.clone();
162
// Clone is shallow since not all parameters are cloneable.
163
assertTrue(conf.getIndexDeletionPolicy() == clone.getIndexDeletionPolicy());
165
conf.setMergeScheduler(new SerialMergeScheduler());
166
assertEquals(ConcurrentMergeScheduler.class, clone.getMergeScheduler().getClass());
170
public void testInvalidValues() throws Exception {
171
IndexWriterConfig conf = new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random));
173
// Test IndexDeletionPolicy
174
assertEquals(KeepOnlyLastCommitDeletionPolicy.class, conf.getIndexDeletionPolicy().getClass());
175
conf.setIndexDeletionPolicy(new SnapshotDeletionPolicy(null));
176
assertEquals(SnapshotDeletionPolicy.class, conf.getIndexDeletionPolicy().getClass());
177
conf.setIndexDeletionPolicy(null);
178
assertEquals(KeepOnlyLastCommitDeletionPolicy.class, conf.getIndexDeletionPolicy().getClass());
180
// Test MergeScheduler
181
assertEquals(ConcurrentMergeScheduler.class, conf.getMergeScheduler().getClass());
182
conf.setMergeScheduler(new SerialMergeScheduler());
183
assertEquals(SerialMergeScheduler.class, conf.getMergeScheduler().getClass());
184
conf.setMergeScheduler(null);
185
assertEquals(ConcurrentMergeScheduler.class, conf.getMergeScheduler().getClass());
188
assertTrue(Similarity.getDefault() == conf.getSimilarity());
189
conf.setSimilarity(new MySimilarity());
190
assertEquals(MySimilarity.class, conf.getSimilarity().getClass());
191
conf.setSimilarity(null);
192
assertTrue(Similarity.getDefault() == conf.getSimilarity());
194
// Test IndexingChain
195
assertTrue(DocumentsWriter.defaultIndexingChain == conf.getIndexingChain());
196
conf.setIndexingChain(new MyIndexingChain());
197
assertEquals(MyIndexingChain.class, conf.getIndexingChain().getClass());
198
conf.setIndexingChain(null);
199
assertTrue(DocumentsWriter.defaultIndexingChain == conf.getIndexingChain());
202
conf.setMaxBufferedDeleteTerms(0);
203
fail("should not have succeeded to set maxBufferedDeleteTerms to 0");
204
} catch (IllegalArgumentException e) {
209
conf.setMaxBufferedDocs(1);
210
fail("should not have succeeded to set maxBufferedDocs to 1");
211
} catch (IllegalArgumentException e) {
216
// Disable both MAX_BUF_DOCS and RAM_SIZE_MB
217
conf.setMaxBufferedDocs(4);
218
conf.setRAMBufferSizeMB(IndexWriterConfig.DISABLE_AUTO_FLUSH);
219
conf.setMaxBufferedDocs(IndexWriterConfig.DISABLE_AUTO_FLUSH);
220
fail("should not have succeeded to disable maxBufferedDocs when ramBufferSizeMB is disabled as well");
221
} catch (IllegalArgumentException e) {
225
conf.setRAMBufferSizeMB(IndexWriterConfig.DEFAULT_RAM_BUFFER_SIZE_MB);
226
conf.setMaxBufferedDocs(IndexWriterConfig.DEFAULT_MAX_BUFFERED_DOCS);
228
conf.setRAMBufferSizeMB(IndexWriterConfig.DISABLE_AUTO_FLUSH);
229
fail("should not have succeeded to disable ramBufferSizeMB when maxBufferedDocs is disabled as well");
230
} catch (IllegalArgumentException e) {
234
// Test setReaderTermsIndexDivisor
236
conf.setReaderTermsIndexDivisor(0);
237
fail("should not have succeeded to set termsIndexDivisor to 0");
238
} catch (IllegalArgumentException e) {
242
// Setting to -1 is ok
243
conf.setReaderTermsIndexDivisor(-1);
245
conf.setReaderTermsIndexDivisor(-2);
246
fail("should not have succeeded to set termsIndexDivisor to < -1");
247
} catch (IllegalArgumentException e) {
251
assertEquals(IndexWriterConfig.DEFAULT_MAX_THREAD_STATES, conf.getMaxThreadStates());
252
conf.setMaxThreadStates(5);
253
assertEquals(5, conf.getMaxThreadStates());
254
conf.setMaxThreadStates(0);
255
assertEquals(IndexWriterConfig.DEFAULT_MAX_THREAD_STATES, conf.getMaxThreadStates());
258
assertEquals(TieredMergePolicy.class, conf.getMergePolicy().getClass());
259
conf.setMergePolicy(new LogDocMergePolicy());
260
assertEquals(LogDocMergePolicy.class, conf.getMergePolicy().getClass());
261
conf.setMergePolicy(null);
262
assertEquals(LogByteSizeMergePolicy.class, conf.getMergePolicy().getClass());
266
* @deprecated should be removed once all the deprecated setters are removed
270
public void testIndexWriterSetters() throws Exception {
271
// This test intentionally tests deprecated methods. The purpose is to pass
272
// whatever the user set on IW to IWC, so that if the user calls
273
// iw.getConfig().getXYZ(), he'll get the same value he passed to
275
IndexWriterConfig conf = new IndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT));
276
Directory dir = newDirectory();
277
IndexWriter writer = new IndexWriter(dir, conf);
279
writer.setSimilarity(new MySimilarity());
280
assertEquals(MySimilarity.class, writer.getConfig().getSimilarity().getClass());
282
writer.setMaxBufferedDeleteTerms(4);
283
assertEquals(4, writer.getConfig().getMaxBufferedDeleteTerms());
285
writer.setMaxBufferedDocs(10);
286
assertEquals(10, writer.getConfig().getMaxBufferedDocs());
288
writer.setMergeScheduler(new SerialMergeScheduler());
289
assertEquals(SerialMergeScheduler.class, writer.getConfig().getMergeScheduler().getClass());
291
writer.setRAMBufferSizeMB(1.5);
292
assertEquals(1.5, writer.getConfig().getRAMBufferSizeMB(), 0.0);
294
writer.setTermIndexInterval(40);
295
assertEquals(40, writer.getConfig().getTermIndexInterval());
297
writer.setWriteLockTimeout(100);
298
assertEquals(100, writer.getConfig().getWriteLockTimeout());
300
writer.setMergedSegmentWarmer(new MyWarmer());
301
assertEquals(MyWarmer.class, writer.getConfig().getMergedSegmentWarmer().getClass());
303
writer.setMergePolicy(new LogDocMergePolicy());
304
assertEquals(LogDocMergePolicy.class, writer.getConfig().getMergePolicy().getClass());