You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by sh...@apache.org on 2012/06/18 10:24:25 UTC
svn commit: r1351229 - in /lucene/dev/branches/branch_4x: ./ lucene/
lucene/core/ lucene/core/src/java/org/apache/lucene/index/
lucene/core/src/test/org/apache/lucene/index/
Author: shaie
Date: Mon Jun 18 08:24:25 2012
New Revision: 1351229
URL: http://svn.apache.org/viewvc?rev=1351229&view=rev
Log:
LUCENE-4132: merge from trunk
Added:
lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/LiveIndexWriterConfig.java
- copied unchanged from r1351225, lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/LiveIndexWriterConfig.java
Modified:
lucene/dev/branches/branch_4x/ (props changed)
lucene/dev/branches/branch_4x/lucene/ (props changed)
lucene/dev/branches/branch_4x/lucene/CHANGES.txt
lucene/dev/branches/branch_4x/lucene/core/ (props changed)
lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriter.java
lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterFlushControl.java
lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterPerThreadPool.java
lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/FlushPolicy.java
lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriterConfig.java
lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestFlushByRamOrCountsPolicy.java
lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterConfig.java
Modified: lucene/dev/branches/branch_4x/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/CHANGES.txt?rev=1351229&r1=1351228&r2=1351229&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/branch_4x/lucene/CHANGES.txt Mon Jun 18 08:24:25 2012
@@ -6,6 +6,17 @@ http://s.apache.org/luceneversions
For "contrib" changes prior to 4.0, please see:
http://svn.apache.org/repos/asf/lucene/dev/tags/lucene_solr_3_6_0/lucene/contrib/CHANGES.txt
+New features
+
+* LUCENE-4108: add replaceTaxonomy to DirectoryTaxonomyWriter, which replaces
+ the taxonomy in place with the given one. (Shai Erera)
+
+API Changes
+
+* LUCENE-4132: IndexWriter.getConfig() now returns a LiveIndexWriterConfig object
+ which can be used to change the IndexWriter's live settings. IndexWriterConfig
+ is used only for initializing the IndexWriter. (Shai Erera)
+
======================= Lucene 4.0.0-ALPHA =======================
More information about this release, including any errata related to the
release notes, upgrade instructions, or other changes may be found online at:
Modified: lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriter.java?rev=1351229&r1=1351228&r2=1351229&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriter.java (original)
+++ lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriter.java Mon Jun 18 08:24:25 2012
@@ -133,7 +133,7 @@ final class DocumentsWriter {
final DocumentsWriterFlushControl flushControl;
final Codec codec;
- DocumentsWriter(Codec codec, IndexWriterConfig config, Directory directory, IndexWriter writer, FieldNumbers globalFieldNumbers,
+ DocumentsWriter(Codec codec, LiveIndexWriterConfig config, Directory directory, IndexWriter writer, FieldNumbers globalFieldNumbers,
BufferedDeletesStream bufferedDeletesStream) throws IOException {
this.codec = codec;
this.directory = directory;
Modified: lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterFlushControl.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterFlushControl.java?rev=1351229&r1=1351228&r2=1351229&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterFlushControl.java (original)
+++ lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterFlushControl.java Mon Jun 18 08:24:25 2012
@@ -65,10 +65,9 @@ final class DocumentsWriterFlushControl
private final FlushPolicy flushPolicy;
private boolean closed = false;
private final DocumentsWriter documentsWriter;
- private final IndexWriterConfig config;
+ private final LiveIndexWriterConfig config;
- DocumentsWriterFlushControl(DocumentsWriter documentsWriter,
- IndexWriterConfig config) {
+ DocumentsWriterFlushControl(DocumentsWriter documentsWriter, LiveIndexWriterConfig config) {
this.stallControl = new DocumentsWriterStallControl();
this.perThreadPool = documentsWriter.perThreadPool;
this.flushPolicy = documentsWriter.flushPolicy;
Modified: lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterPerThreadPool.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterPerThreadPool.java?rev=1351229&r1=1351228&r2=1351229&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterPerThreadPool.java (original)
+++ lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterPerThreadPool.java Mon Jun 18 08:24:25 2012
@@ -135,7 +135,7 @@ abstract class DocumentsWriterPerThreadP
numThreadStatesActive = 0;
}
- void initialize(DocumentsWriter documentsWriter, FieldNumbers globalFieldMap, IndexWriterConfig config) {
+ void initialize(DocumentsWriter documentsWriter, FieldNumbers globalFieldMap, LiveIndexWriterConfig config) {
this.documentsWriter.set(documentsWriter); // thread pool is bound to DW
this.globalFieldMap.set(globalFieldMap);
for (int i = 0; i < threadStates.length; i++) {
Modified: lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/FlushPolicy.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/FlushPolicy.java?rev=1351229&r1=1351228&r2=1351229&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/FlushPolicy.java (original)
+++ lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/FlushPolicy.java Mon Jun 18 08:24:25 2012
@@ -52,7 +52,7 @@ import org.apache.lucene.util.SetOnce;
*/
abstract class FlushPolicy implements Cloneable {
protected SetOnce<DocumentsWriter> writer = new SetOnce<DocumentsWriter>();
- protected IndexWriterConfig indexWriterConfig;
+ protected LiveIndexWriterConfig indexWriterConfig;
/**
* Called for each delete term. If this is a delete triggered due to an update
Modified: lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java?rev=1351229&r1=1351228&r2=1351229&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java (original)
+++ lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java Mon Jun 18 08:24:25 2012
@@ -260,7 +260,7 @@ public class IndexWriter implements Clos
// The instance that was passed to the constructor. It is saved only in order
// to allow users to query an IndexWriter settings.
- private final IndexWriterConfig config;
+ private final LiveIndexWriterConfig config;
// The PayloadProcessorProvider to use when segments are merged
private PayloadProcessorProvider payloadProcessorProvider;
@@ -588,11 +588,7 @@ public class IndexWriter implements Clos
*/
public IndexWriter(Directory d, IndexWriterConfig conf)
throws CorruptIndexException, LockObtainFailedException, IOException {
- if (conf.inUseByIndexWriter.get()) {
- throw new IllegalStateException("the provided IndexWriterConfig was previously used by a different IndexWriter; please make a new one instead");
- }
- config = conf.clone();
- config.inUseByIndexWriter.set(true);
+ config = new LiveIndexWriterConfig(conf.clone());
directory = d;
analyzer = config.getAnalyzer();
infoStream = config.getInfoStream();
@@ -759,17 +755,10 @@ public class IndexWriter implements Clos
}
/**
- * Returns the private {@link IndexWriterConfig}, cloned
- * from the {@link IndexWriterConfig} passed to
- * {@link #IndexWriter(Directory, IndexWriterConfig)}.
- * <p>
- * <b>NOTE:</b> some settings may be changed on the
- * returned {@link IndexWriterConfig}, and will take
- * effect in the current IndexWriter instance. See the
- * javadocs for the specific setters in {@link
- * IndexWriterConfig} for details.
+ * Returns a {@link LiveIndexWriterConfig}, which can be used to query the IndexWriter
+ * current settings, as well as modify "live" ones.
*/
- public IndexWriterConfig getConfig() {
+ public LiveIndexWriterConfig getConfig() {
ensureOpen(false);
return config;
}
Modified: lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriterConfig.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriterConfig.java?rev=1351229&r1=1351228&r2=1351229&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriterConfig.java (original)
+++ lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriterConfig.java Mon Jun 18 08:24:25 2012
@@ -18,7 +18,6 @@ package org.apache.lucene.index;
*/
import java.io.PrintStream;
-import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.codecs.Codec;
@@ -28,17 +27,14 @@ import org.apache.lucene.search.IndexSea
import org.apache.lucene.search.similarities.Similarity;
import org.apache.lucene.util.InfoStream;
import org.apache.lucene.util.PrintStreamInfoStream;
-import org.apache.lucene.util.SetOnce;
import org.apache.lucene.util.Version;
/**
- * Holds all the configuration of {@link IndexWriter}. You
- * should instantiate this class, call the setters to set
- * your configuration, then pass it to {@link IndexWriter}.
- * Note that {@link IndexWriter} makes a private clone; if
- * you need to subsequently change settings use {@link
- * IndexWriter#getConfig}.
- *
+ * Holds all the configuration that is used to create an {@link IndexWriter}.
+ * Once {@link IndexWriter} has been created with this object, changes to this
+ * object will not affect the {@link IndexWriter} instance. For that, use
+ * {@link LiveIndexWriterConfig} that is returned from {@link IndexWriter#getConfig()}.
+ *
* <p>
* All setter methods return {@link IndexWriterConfig} to allow chaining
* settings conveniently, for example:
@@ -47,10 +43,12 @@ import org.apache.lucene.util.Version;
* IndexWriterConfig conf = new IndexWriterConfig(analyzer);
* conf.setter1().setter2();
* </pre>
- *
+ *
+ * @see IndexWriter#getConfig()
+ *
* @since 3.1
*/
-public final class IndexWriterConfig implements Cloneable {
+public final class IndexWriterConfig extends LiveIndexWriterConfig implements Cloneable {
/**
* Specifies the open mode for {@link IndexWriter}.
@@ -131,33 +129,6 @@ public final class IndexWriterConfig imp
return WRITE_LOCK_TIMEOUT;
}
- private final Analyzer analyzer;
- private volatile IndexDeletionPolicy delPolicy;
- private volatile IndexCommit commit;
- private volatile OpenMode openMode;
- private volatile Similarity similarity;
- private volatile int termIndexInterval; // TODO: this should be private to the codec, not settable here
- private volatile MergeScheduler mergeScheduler;
- private volatile long writeLockTimeout;
- private volatile int maxBufferedDeleteTerms;
- private volatile double ramBufferSizeMB;
- private volatile int maxBufferedDocs;
- private volatile IndexingChain indexingChain;
- private volatile IndexReaderWarmer mergedSegmentWarmer;
- private volatile Codec codec;
- private volatile InfoStream infoStream;
- private volatile MergePolicy mergePolicy;
- private volatile DocumentsWriterPerThreadPool indexerThreadPool;
- private volatile boolean readerPooling;
- private volatile int readerTermsIndexDivisor;
- private volatile FlushPolicy flushPolicy;
- private volatile int perThreadHardLimitMB;
-
- private Version matchVersion;
-
- // Used directly by IndexWriter:
- AtomicBoolean inUseByIndexWriter = new AtomicBoolean();
-
/**
* Creates a new config that with defaults that match the specified
* {@link Version} as well as the default {@link
@@ -171,63 +142,27 @@ public final class IndexWriterConfig imp
* {@link LogDocMergePolicy}.
*/
public IndexWriterConfig(Version matchVersion, Analyzer analyzer) {
- this.matchVersion = matchVersion;
- this.analyzer = analyzer;
- delPolicy = new KeepOnlyLastCommitDeletionPolicy();
- commit = null;
- openMode = OpenMode.CREATE_OR_APPEND;
- similarity = IndexSearcher.getDefaultSimilarity();
- termIndexInterval = DEFAULT_TERM_INDEX_INTERVAL; // TODO: this should be private to the codec, not settable here
- mergeScheduler = new ConcurrentMergeScheduler();
- writeLockTimeout = WRITE_LOCK_TIMEOUT;
- maxBufferedDeleteTerms = DEFAULT_MAX_BUFFERED_DELETE_TERMS;
- ramBufferSizeMB = DEFAULT_RAM_BUFFER_SIZE_MB;
- maxBufferedDocs = DEFAULT_MAX_BUFFERED_DOCS;
- indexingChain = DocumentsWriterPerThread.defaultIndexingChain;
- mergedSegmentWarmer = null;
- codec = Codec.getDefault();
- infoStream = InfoStream.getDefault();
- if (matchVersion.onOrAfter(Version.LUCENE_32)) {
- mergePolicy = new TieredMergePolicy();
- } else {
- mergePolicy = new LogByteSizeMergePolicy();
- }
- flushPolicy = new FlushByRamOrCountsPolicy();
- readerPooling = DEFAULT_READER_POOLING;
- indexerThreadPool = new ThreadAffinityDocumentsWriterThreadPool(DEFAULT_MAX_THREAD_STATES);
- readerTermsIndexDivisor = DEFAULT_READER_TERMS_INDEX_DIVISOR;
- perThreadHardLimitMB = DEFAULT_RAM_PER_THREAD_HARD_LIMIT_MB;
+ super(analyzer, matchVersion);
}
@Override
public IndexWriterConfig clone() {
- IndexWriterConfig clone;
- if (inUseByIndexWriter.get()) {
- throw new IllegalStateException("cannot clone: this IndexWriterConfig is private to IndexWriter; make a new one instead");
- }
try {
- clone = (IndexWriterConfig) super.clone();
+ IndexWriterConfig clone = (IndexWriterConfig) super.clone();
+
+ // Mostly shallow clone, but do a deepish clone of
+ // certain objects that have state that cannot be shared
+ // across IW instances:
+ clone.flushPolicy = flushPolicy.clone();
+ clone.indexerThreadPool = indexerThreadPool.clone();
+ clone.mergePolicy = mergePolicy.clone();
+
+ return clone;
} catch (CloneNotSupportedException e) {
- // should not happen
throw new RuntimeException(e);
}
-
- // Mostly shallow clone, but do a deepish clone of
- // certain objects that have state that cannot be shared
- // across IW instances:
- clone.inUseByIndexWriter = new AtomicBoolean();
- clone.flushPolicy = flushPolicy.clone();
- clone.indexerThreadPool = indexerThreadPool.clone();
- clone.mergePolicy = mergePolicy.clone();
-
- return clone;
- }
-
- /** Returns the default analyzer to use for indexing documents. */
- public Analyzer getAnalyzer() {
- return analyzer;
}
-
+
/** Specifies {@link OpenMode} of the index.
*
* <p>Only takes effect when IndexWriter is first created. */
@@ -236,7 +171,7 @@ public final class IndexWriterConfig imp
return this;
}
- /** Returns the {@link OpenMode} set by {@link #setOpenMode(OpenMode)}. */
+ @Override
public OpenMode getOpenMode() {
return openMode;
}
@@ -263,11 +198,7 @@ public final class IndexWriterConfig imp
return this;
}
- /**
- * Returns the {@link IndexDeletionPolicy} specified in
- * {@link #setIndexDeletionPolicy(IndexDeletionPolicy)} or the default
- * {@link KeepOnlyLastCommitDeletionPolicy}/
- */
+ @Override
public IndexDeletionPolicy getIndexDeletionPolicy() {
return delPolicy;
}
@@ -282,11 +213,7 @@ public final class IndexWriterConfig imp
return this;
}
- /**
- * Returns the {@link IndexCommit} as specified in
- * {@link #setIndexCommit(IndexCommit)} or the default, <code>null</code>
- * which specifies to open the latest index commit point.
- */
+ @Override
public IndexCommit getIndexCommit() {
return commit;
}
@@ -303,53 +230,12 @@ public final class IndexWriterConfig imp
return this;
}
- /**
- * Expert: returns the {@link Similarity} implementation used by this
- * IndexWriter.
- */
+ @Override
public Similarity getSimilarity() {
return similarity;
}
/**
- * Expert: set the interval between indexed terms. Large values cause less
- * memory to be used by IndexReader, but slow random-access to terms. Small
- * values cause more memory to be used by an IndexReader, and speed
- * random-access to terms.
- * <p>
- * This parameter determines the amount of computation required per query
- * term, regardless of the number of documents that contain that term. In
- * particular, it is the maximum number of other terms that must be scanned
- * before a term is located and its frequency and position information may be
- * processed. In a large index with user-entered query terms, query processing
- * time is likely to be dominated not by term lookup but rather by the
- * processing of frequency and positional data. In a small index or when many
- * uncommon query terms are generated (e.g., by wildcard queries) term lookup
- * may become a dominant cost.
- * <p>
- * In particular, <code>numUniqueTerms/interval</code> terms are read into
- * memory by an IndexReader, and, on average, <code>interval/2</code> terms
- * must be scanned for each random term access.
- *
- * @see #DEFAULT_TERM_INDEX_INTERVAL
- *
- * <p>Takes effect immediately, but only applies to newly
- * flushed/merged segments. */
- public IndexWriterConfig setTermIndexInterval(int interval) { // TODO: this should be private to the codec, not settable here
- this.termIndexInterval = interval;
- return this;
- }
-
- /**
- * Returns the interval between indexed terms.
- *
- * @see #setTermIndexInterval(int)
- */
- public int getTermIndexInterval() { // TODO: this should be private to the codec, not settable here
- return termIndexInterval;
- }
-
- /**
* Expert: sets the merge scheduler used by this writer. The default is
* {@link ConcurrentMergeScheduler}.
* <p>
@@ -362,10 +248,7 @@ public final class IndexWriterConfig imp
return this;
}
- /**
- * Returns the {@link MergeScheduler} that was set by
- * {@link #setMergeScheduler(MergeScheduler)}
- */
+ @Override
public MergeScheduler getMergeScheduler() {
return mergeScheduler;
}
@@ -381,174 +264,12 @@ public final class IndexWriterConfig imp
return this;
}
- /**
- * Returns allowed timeout when acquiring the write lock.
- *
- * @see #setWriteLockTimeout(long)
- */
+ @Override
public long getWriteLockTimeout() {
return writeLockTimeout;
}
/**
- * Determines the minimal number of delete terms required before the buffered
- * in-memory delete terms and queries are applied and flushed.
- * <p>Disabled by default (writer flushes by RAM usage).</p>
- * <p>
- * NOTE: This setting won't trigger a segment flush.
- * </p>
- *
- * @throws IllegalArgumentException if maxBufferedDeleteTerms
- * is enabled but smaller than 1
- * @see #setRAMBufferSizeMB
- * @see #setFlushPolicy(FlushPolicy)
- *
- * <p>Takes effect immediately, but only the next time a
- * document is added, updated or deleted.
- */
- public IndexWriterConfig setMaxBufferedDeleteTerms(int maxBufferedDeleteTerms) {
- if (maxBufferedDeleteTerms != DISABLE_AUTO_FLUSH
- && maxBufferedDeleteTerms < 1)
- throw new IllegalArgumentException(
- "maxBufferedDeleteTerms must at least be 1 when enabled");
- this.maxBufferedDeleteTerms = maxBufferedDeleteTerms;
- return this;
- }
-
- /**
- * Returns the number of buffered deleted terms that will trigger a flush of all
- * buffered deletes if enabled.
- *
- * @see #setMaxBufferedDeleteTerms(int)
- */
- public int getMaxBufferedDeleteTerms() {
- return maxBufferedDeleteTerms;
- }
-
- /**
- * Determines the amount of RAM that may be used for buffering added documents
- * and deletions before they are flushed to the Directory. Generally for
- * faster indexing performance it's best to flush by RAM usage instead of
- * document count and use as large a RAM buffer as you can.
- * <p>
- * When this is set, the writer will flush whenever buffered documents and
- * deletions use this much RAM. Pass in {@link #DISABLE_AUTO_FLUSH} to prevent
- * triggering a flush due to RAM usage. Note that if flushing by document
- * count is also enabled, then the flush will be triggered by whichever comes
- * first.
- * <p>
- * The maximum RAM limit is inherently determined by the JVMs available memory.
- * Yet, an {@link IndexWriter} session can consume a significantly larger amount
- * of memory than the given RAM limit since this limit is just an indicator when
- * to flush memory resident documents to the Directory. Flushes are likely happen
- * concurrently while other threads adding documents to the writer. For application
- * stability the available memory in the JVM should be significantly larger than
- * the RAM buffer used for indexing.
- * <p>
- * <b>NOTE</b>: the account of RAM usage for pending deletions is only
- * approximate. Specifically, if you delete by Query, Lucene currently has no
- * way to measure the RAM usage of individual Queries so the accounting will
- * under-estimate and you should compensate by either calling commit()
- * periodically yourself, or by using {@link #setMaxBufferedDeleteTerms(int)}
- * to flush and apply buffered deletes by count instead of RAM usage
- * (for each buffered delete Query a constant number of bytes is used to estimate
- * RAM usage). Note that enabling {@link #setMaxBufferedDeleteTerms(int)} will
- * not trigger any segment flushes.
- * <p>
- * <b>NOTE</b>: It's not guaranteed that all memory resident documents are flushed
- * once this limit is exceeded. Depending on the configured {@link FlushPolicy} only a
- * subset of the buffered documents are flushed and therefore only parts of the RAM
- * buffer is released.
- * <p>
- *
- * The default value is {@link #DEFAULT_RAM_BUFFER_SIZE_MB}.
- * @see #setFlushPolicy(FlushPolicy)
- * @see #setRAMPerThreadHardLimitMB(int)
- *
- * <p>Takes effect immediately, but only the next time a
- * document is added, updated or deleted.
- *
- * @throws IllegalArgumentException
- * if ramBufferSize is enabled but non-positive, or it disables
- * ramBufferSize when maxBufferedDocs is already disabled
- *
- */
- public IndexWriterConfig setRAMBufferSizeMB(double ramBufferSizeMB) {
- if (ramBufferSizeMB != DISABLE_AUTO_FLUSH && ramBufferSizeMB <= 0.0)
- throw new IllegalArgumentException(
- "ramBufferSize should be > 0.0 MB when enabled");
- if (ramBufferSizeMB == DISABLE_AUTO_FLUSH && maxBufferedDocs == DISABLE_AUTO_FLUSH)
- throw new IllegalArgumentException(
- "at least one of ramBufferSize and maxBufferedDocs must be enabled");
- this.ramBufferSizeMB = ramBufferSizeMB;
- return this;
- }
-
- /** Returns the value set by {@link #setRAMBufferSizeMB(double)} if enabled. */
- public double getRAMBufferSizeMB() {
- return ramBufferSizeMB;
- }
-
- /**
- * Determines the minimal number of documents required before the buffered
- * in-memory documents are flushed as a new Segment. Large values generally
- * give faster indexing.
- *
- * <p>
- * When this is set, the writer will flush every maxBufferedDocs added
- * documents. Pass in {@link #DISABLE_AUTO_FLUSH} to prevent triggering a
- * flush due to number of buffered documents. Note that if flushing by RAM
- * usage is also enabled, then the flush will be triggered by whichever comes
- * first.
- *
- * <p>
- * Disabled by default (writer flushes by RAM usage).
- *
- * <p>Takes effect immediately, but only the next time a
- * document is added, updated or deleted.
- *
- * @see #setRAMBufferSizeMB(double)
- * @see #setFlushPolicy(FlushPolicy)
- * @throws IllegalArgumentException
- * if maxBufferedDocs is enabled but smaller than 2, or it disables
- * maxBufferedDocs when ramBufferSize is already disabled
- */
- public IndexWriterConfig setMaxBufferedDocs(int maxBufferedDocs) {
- if (maxBufferedDocs != DISABLE_AUTO_FLUSH && maxBufferedDocs < 2)
- throw new IllegalArgumentException(
- "maxBufferedDocs must at least be 2 when enabled");
- if (maxBufferedDocs == DISABLE_AUTO_FLUSH
- && ramBufferSizeMB == DISABLE_AUTO_FLUSH)
- throw new IllegalArgumentException(
- "at least one of ramBufferSize and maxBufferedDocs must be enabled");
- this.maxBufferedDocs = maxBufferedDocs;
- return this;
- }
-
- /**
- * Returns the number of buffered added documents that will trigger a flush if
- * enabled.
- *
- * @see #setMaxBufferedDocs(int)
- */
- public int getMaxBufferedDocs() {
- return maxBufferedDocs;
- }
-
- /** Set the merged segment warmer. See {@link IndexReaderWarmer}.
- *
- * <p>Takes effect on the next merge. */
- public IndexWriterConfig setMergedSegmentWarmer(IndexReaderWarmer mergeSegmentWarmer) {
- this.mergedSegmentWarmer = mergeSegmentWarmer;
- return this;
- }
-
- /** Returns the current merged segment warmer. See {@link IndexReaderWarmer}. */
- public IndexReaderWarmer getMergedSegmentWarmer() {
- return mergedSegmentWarmer;
- }
-
- /**
* Expert: {@link MergePolicy} is invoked whenever there are changes to the
* segments in the index. Its role is to select which merges to do, if any,
* and return a {@link MergePolicy.MergeSpecification} describing the merges.
@@ -561,25 +282,24 @@ public final class IndexWriterConfig imp
return this;
}
- /** Set the Codec. See {@link Codec}.
- *
- * <p>Only takes effect when IndexWriter is first created. */
+ /**
+ * Set the {@link Codec}.
+ *
+ * <p>
+ * Only takes effect when IndexWriter is first created.
+ */
public IndexWriterConfig setCodec(Codec codec) {
this.codec = codec;
return this;
}
- /** Returns the current Codec. See {@link Codec}. */
+ @Override
public Codec getCodec() {
return codec;
}
- /**
- * Returns the current MergePolicy in use by this writer.
- *
- * @see #setMergePolicy(MergePolicy)
- */
+ @Override
public MergePolicy getMergePolicy() {
return mergePolicy;
}
@@ -600,17 +320,15 @@ public final class IndexWriterConfig imp
* NOTE: This only takes effect when IndexWriter is first created.</p>*/
IndexWriterConfig setIndexerThreadPool(DocumentsWriterPerThreadPool threadPool) {
if (threadPool == null) {
- throw new IllegalArgumentException("DocumentsWriterPerThreadPool must not be nul");
+ throw new IllegalArgumentException("threadPool must not be null");
}
this.indexerThreadPool = threadPool;
return this;
}
- /** Returns the configured {@link DocumentsWriterPerThreadPool} instance.
- * @see #setIndexerThreadPool(DocumentsWriterPerThreadPool)
- * @return the configured {@link DocumentsWriterPerThreadPool} instance.*/
+ @Override
DocumentsWriterPerThreadPool getIndexerThreadPool() {
- return this.indexerThreadPool;
+ return indexerThreadPool;
}
/**
@@ -625,8 +343,7 @@ public final class IndexWriterConfig imp
return this;
}
- /** Returns the max number of simultaneous threads that
- * may be indexing documents at once in IndexWriter. */
+ @Override
public int getMaxThreadStates() {
try {
return ((ThreadAffinityDocumentsWriterThreadPool) indexerThreadPool).getMaxThreadStates();
@@ -650,8 +367,7 @@ public final class IndexWriterConfig imp
return this;
}
- /** Returns true if IndexWriter should pool readers even
- * if {@link DirectoryReader#open(IndexWriter, boolean)} has not been called. */
+ @Override
public boolean getReaderPooling() {
return readerPooling;
}
@@ -664,34 +380,11 @@ public final class IndexWriterConfig imp
return this;
}
- /** Returns the indexing chain set on {@link #setIndexingChain(IndexingChain)}. */
+ @Override
IndexingChain getIndexingChain() {
return indexingChain;
}
- /** Sets the termsIndexDivisor passed to any readers that
- * IndexWriter opens, for example when applying deletes
- * or creating a near-real-time reader in {@link
- * DirectoryReader#open(IndexWriter, boolean)}. If you pass -1, the terms index
- * won't be loaded by the readers. This is only useful in
- * advanced situations when you will only .next() through
- * all terms; attempts to seek will hit an exception.
- *
- * <p>Takes effect immediately, but only applies to
- * readers opened after this call */
- public IndexWriterConfig setReaderTermsIndexDivisor(int divisor) {
- if (divisor <= 0 && divisor != -1) {
- throw new IllegalArgumentException("divisor must be >= 1, or -1 (got " + divisor + ")");
- }
- readerTermsIndexDivisor = divisor;
- return this;
- }
-
- /** @see #setReaderTermsIndexDivisor(int) */
- public int getReaderTermsIndexDivisor() {
- return readerTermsIndexDivisor;
- }
-
/**
* Expert: Controls when segments are flushed to disk during indexing.
* The {@link FlushPolicy} initialized during {@link IndexWriter} instantiation and once initialized
@@ -724,28 +417,56 @@ public final class IndexWriterConfig imp
return this;
}
- /**
- * Returns the max amount of memory each {@link DocumentsWriterPerThread} can
- * consume until forcefully flushed.
- * @see #setRAMPerThreadHardLimitMB(int)
- */
+ @Override
public int getRAMPerThreadHardLimitMB() {
return perThreadHardLimitMB;
}
- /**
- * @see #setFlushPolicy(FlushPolicy)
- */
+
+ @Override
public FlushPolicy getFlushPolicy() {
return flushPolicy;
}
- /**
- * @see #setInfoStream(InfoStream)
- */
+ @Override
public InfoStream getInfoStream() {
return infoStream;
}
+ @Override
+ public Analyzer getAnalyzer() {
+ return super.getAnalyzer();
+ }
+
+ @Override
+ public int getMaxBufferedDeleteTerms() {
+ return super.getMaxBufferedDeleteTerms();
+ }
+
+ @Override
+ public int getMaxBufferedDocs() {
+ return super.getMaxBufferedDocs();
+ }
+
+ @Override
+ public IndexReaderWarmer getMergedSegmentWarmer() {
+ return super.getMergedSegmentWarmer();
+ }
+
+ @Override
+ public double getRAMBufferSizeMB() {
+ return super.getRAMBufferSizeMB();
+ }
+
+ @Override
+ public int getReaderTermsIndexDivisor() {
+ return super.getReaderTermsIndexDivisor();
+ }
+
+ @Override
+ public int getTermIndexInterval() {
+ return super.getTermIndexInterval();
+ }
+
/** If non-null, information about merges, deletes and a
* message when maxFieldLength is reached will be printed
* to this.
@@ -759,40 +480,39 @@ public final class IndexWriterConfig imp
return this;
}
- /**
- * Convenience method that uses {@link PrintStreamInfoStream}
- */
+ /** Convenience method that uses {@link PrintStreamInfoStream} */
public IndexWriterConfig setInfoStream(PrintStream printStream) {
return setInfoStream(printStream == null ? InfoStream.NO_OUTPUT : new PrintStreamInfoStream(printStream));
}
-
+
@Override
- public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append("matchVersion=").append(matchVersion).append("\n");
- sb.append("analyzer=").append(analyzer == null ? "null" : analyzer.getClass().getName()).append("\n");
- sb.append("delPolicy=").append(delPolicy.getClass().getName()).append("\n");
- sb.append("commit=").append(commit == null ? "null" : commit).append("\n");
- sb.append("openMode=").append(openMode).append("\n");
- sb.append("similarity=").append(similarity.getClass().getName()).append("\n");
- sb.append("termIndexInterval=").append(termIndexInterval).append("\n"); // TODO: this should be private to the codec, not settable here
- sb.append("mergeScheduler=").append(mergeScheduler.getClass().getName()).append("\n");
- sb.append("default WRITE_LOCK_TIMEOUT=").append(WRITE_LOCK_TIMEOUT).append("\n");
- sb.append("writeLockTimeout=").append(writeLockTimeout).append("\n");
- sb.append("maxBufferedDeleteTerms=").append(maxBufferedDeleteTerms).append("\n");
- sb.append("ramBufferSizeMB=").append(ramBufferSizeMB).append("\n");
- sb.append("maxBufferedDocs=").append(maxBufferedDocs).append("\n");
- sb.append("mergedSegmentWarmer=").append(mergedSegmentWarmer).append("\n");
- sb.append("codec=").append(codec).append("\n");
- sb.append("infoStream=").append(infoStream.getClass().getName()).append("\n");
- sb.append("mergePolicy=").append(mergePolicy).append("\n");
- sb.append("indexerThreadPool=").append(indexerThreadPool).append("\n");
- sb.append("readerPooling=").append(readerPooling).append("\n");
- sb.append("readerTermsIndexDivisor=").append(readerTermsIndexDivisor).append("\n");
- sb.append("flushPolicy=").append(flushPolicy).append("\n");
- sb.append("perThreadHardLimitMB=").append(perThreadHardLimitMB).append("\n");
-
- return sb.toString();
+ public IndexWriterConfig setMaxBufferedDeleteTerms(int maxBufferedDeleteTerms) {
+ return (IndexWriterConfig) super.setMaxBufferedDeleteTerms(maxBufferedDeleteTerms);
+ }
+
+ @Override
+ public IndexWriterConfig setMaxBufferedDocs(int maxBufferedDocs) {
+ return (IndexWriterConfig) super.setMaxBufferedDocs(maxBufferedDocs);
+ }
+
+ @Override
+ public IndexWriterConfig setMergedSegmentWarmer(IndexReaderWarmer mergeSegmentWarmer) {
+ return (IndexWriterConfig) super.setMergedSegmentWarmer(mergeSegmentWarmer);
+ }
+
+ @Override
+ public IndexWriterConfig setRAMBufferSizeMB(double ramBufferSizeMB) {
+ return (IndexWriterConfig) super.setRAMBufferSizeMB(ramBufferSizeMB);
+ }
+
+ @Override
+ public IndexWriterConfig setReaderTermsIndexDivisor(int divisor) {
+ return (IndexWriterConfig) super.setReaderTermsIndexDivisor(divisor);
+ }
+
+ @Override
+ public IndexWriterConfig setTermIndexInterval(int interval) {
+ return (IndexWriterConfig) super.setTermIndexInterval(interval);
}
}
Modified: lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestFlushByRamOrCountsPolicy.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestFlushByRamOrCountsPolicy.java?rev=1351229&r1=1351228&r2=1351229&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestFlushByRamOrCountsPolicy.java (original)
+++ lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestFlushByRamOrCountsPolicy.java Mon Jun 18 08:24:25 2012
@@ -294,7 +294,7 @@ public class TestFlushByRamOrCountsPolic
public class IndexThread extends Thread {
IndexWriter writer;
- IndexWriterConfig iwc;
+ LiveIndexWriterConfig iwc;
LineFileDocs docs;
private AtomicInteger pendingDocs;
private final boolean doRandomCommit;
Modified: lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterConfig.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterConfig.java?rev=1351229&r1=1351228&r2=1351229&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterConfig.java (original)
+++ lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterConfig.java Mon Jun 18 08:24:25 2012
@@ -25,8 +25,6 @@ import java.util.Set;
import org.apache.lucene.analysis.MockAnalyzer;
import org.apache.lucene.codecs.Codec;
-import org.apache.lucene.document.Document;
-import org.apache.lucene.document.Field.Store;
import org.apache.lucene.index.DocumentsWriterPerThread.IndexingChain;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.search.IndexSearcher;
@@ -114,19 +112,71 @@ public class TestIndexWriterConfig exten
@Test
public void testSettersChaining() throws Exception {
- // Ensures that every setter returns IndexWriterConfig to enable easy
- // chaining.
+ // Ensures that every setter returns IndexWriterConfig to allow chaining.
+ HashSet<String> liveSetters = new HashSet<String>();
+ HashSet<String> allSetters = new HashSet<String>();
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());
+ if (m.getName().startsWith("set") && !Modifier.isStatic(m.getModifiers())) {
+ allSetters.add(m.getName());
+ // setters overridden from LiveIndexWriterConfig are returned twice, once with
+ // IndexWriterConfig return type and second with LiveIndexWriterConfig. The ones
+ // from LiveIndexWriterConfig are marked 'synthetic', so just collect them and
+ // assert in the end that we also received them from IWC.
+ if (m.isSynthetic()) {
+ liveSetters.add(m.getName());
+ } else {
+ assertEquals("method " + m.getName() + " does not return IndexWriterConfig",
+ IndexWriterConfig.class, m.getReturnType());
+ }
}
}
+ for (String setter : liveSetters) {
+ assertTrue("setter method not overridden by IndexWriterConfig: " + setter, allSetters.contains(setter));
+ }
}
@Test
+ public void testReuse() throws Exception {
+ Directory dir = newDirectory();
+ // test that if the same IWC is reused across two IWs, it is cloned by each.
+ IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, null);
+ RandomIndexWriter iw = new RandomIndexWriter(random(), dir, conf);
+ LiveIndexWriterConfig liveConf1 = iw.w.getConfig();
+ iw.close();
+
+ iw = new RandomIndexWriter(random(), dir, conf);
+ LiveIndexWriterConfig liveConf2 = iw.w.getConfig();
+ iw.close();
+
+ // LiveIndexWriterConfig's "copy" constructor doesn't clone objects.
+ assertNotSame("IndexWriterConfig should have been cloned", liveConf1.getMergePolicy(), liveConf2.getMergePolicy());
+
+ dir.close();
+ }
+
+ @Test
+ public void testOverrideGetters() throws Exception {
+ // Test that IndexWriterConfig overrides all getters, so that javadocs
+ // contain all methods for the users. Also, ensures that IndexWriterConfig
+ // doesn't declare getters that are not declared on LiveIWC.
+ HashSet<String> liveGetters = new HashSet<String>();
+ for (Method m : LiveIndexWriterConfig.class.getDeclaredMethods()) {
+ if (m.getName().startsWith("get") && !Modifier.isStatic(m.getModifiers())) {
+ liveGetters.add(m.getName());
+ }
+ }
+
+ for (Method m : IndexWriterConfig.class.getDeclaredMethods()) {
+ if (m.getName().startsWith("get") && !Modifier.isStatic(m.getModifiers())) {
+ assertEquals("method " + m.getName() + " not overrided by IndexWriterConfig",
+ IndexWriterConfig.class, m.getDeclaringClass());
+ assertTrue("method " + m.getName() + " not declared on LiveIndexWriterConfig",
+ liveGetters.contains(m.getName()));
+ }
+ }
+ }
+
+ @Test
public void testConstants() throws Exception {
// Tests that the values of the constants does not change
assertEquals(1000, IndexWriterConfig.WRITE_LOCK_TIMEOUT);
@@ -276,53 +326,4 @@ public class TestIndexWriterConfig exten
assertEquals(LogByteSizeMergePolicy.class, conf.getMergePolicy().getClass());
}
- public void testReuse() throws Exception {
- IndexWriterConfig iwc = newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random()));
- Directory dir = newDirectory();
- Document doc = new Document();
- doc.add(newTextField("foo", "bar", Store.YES));
- RandomIndexWriter riw = new RandomIndexWriter(random(), dir, iwc);
- riw.addDocument(doc);
- riw.close();
-
- // Sharing IWC should be fine:
- riw = new RandomIndexWriter(random(), dir, iwc);
- riw.addDocument(doc);
- riw.close();
-
- dir.close();
- }
-
- public void testIWCClone() throws Exception {
- IndexWriterConfig iwc = newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random()));
- Directory dir = newDirectory();
- RandomIndexWriter riw = new RandomIndexWriter(random(), dir, iwc);
-
- // Cannot clone IW's private IWC clone:
- try {
- riw.w.getConfig().clone();
- fail("did not hit expected exception");
- } catch (IllegalStateException ise) {
- // expected
- }
- riw.close();
- dir.close();
- }
-
- public void testIWCInvalidReuse() throws Exception {
- IndexWriterConfig iwc = newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random()));
- Directory dir = newDirectory();
- RandomIndexWriter riw = new RandomIndexWriter(random(), dir, iwc);
- IndexWriterConfig privateIWC = riw.w.getConfig();
- riw.close();
-
- // Cannot clone IW's private IWC clone:
- try {
- new RandomIndexWriter(random(), dir, privateIWC);
- fail("did not hit expected exception");
- } catch (IllegalStateException ise) {
- // expected
- }
- dir.close();
- }
}
Re: svn commit: r1351229 - in /lucene/dev/branches/branch_4x: ./
lucene/ lucene/core/ lucene/core/src/java/org/apache/lucene/index/ lucene/core/src/test/org/apache/lucene/index/
Posted by Shai Erera <se...@gmail.com>.
Fixed. Thanks Robert !
Shai
On Mon, Jun 18, 2012 at 3:03 PM, Robert Muir <rc...@gmail.com> wrote:
> Why are the CHANGES totally screwy in this commit? Please put them
> under the right section (also fix trunk too)
>
>
> On Mon, Jun 18, 2012 at 4:24 AM, <sh...@apache.org> wrote:
> > Author: shaie
> > Date: Mon Jun 18 08:24:25 2012
> > New Revision: 1351229
> >
> > URL: http://svn.apache.org/viewvc?rev=1351229&view=rev
> > Log:
> > LUCENE-4132: merge from trunk
> >
> > Added:
> >
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/LiveIndexWriterConfig.java
> > - copied unchanged from r1351225,
> lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/LiveIndexWriterConfig.java
> > Modified:
> > lucene/dev/branches/branch_4x/ (props changed)
> > lucene/dev/branches/branch_4x/lucene/ (props changed)
> > lucene/dev/branches/branch_4x/lucene/CHANGES.txt
> > lucene/dev/branches/branch_4x/lucene/core/ (props changed)
> >
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriter.java
> >
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterFlushControl.java
> >
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterPerThreadPool.java
> >
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/FlushPolicy.java
> >
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
> >
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriterConfig.java
> >
> lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestFlushByRamOrCountsPolicy.java
> >
> lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterConfig.java
> >
> > Modified: lucene/dev/branches/branch_4x/lucene/CHANGES.txt
> > URL:
> http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/CHANGES.txt?rev=1351229&r1=1351228&r2=1351229&view=diff
> >
> ==============================================================================
> > --- lucene/dev/branches/branch_4x/lucene/CHANGES.txt (original)
> > +++ lucene/dev/branches/branch_4x/lucene/CHANGES.txt Mon Jun 18 08:24:25
> 2012
> > @@ -6,6 +6,17 @@ http://s.apache.org/luceneversions
> > For "contrib" changes prior to 4.0, please see:
> >
> http://svn.apache.org/repos/asf/lucene/dev/tags/lucene_solr_3_6_0/lucene/contrib/CHANGES.txt
> >
> > +New features
> > +
> > +* LUCENE-4108: add replaceTaxonomy to DirectoryTaxonomyWriter, which
> replaces
> > + the taxonomy in place with the given one. (Shai Erera)
> > +
> > +API Changes
> > +
> > +* LUCENE-4132: IndexWriter.getConfig() now returns a
> LiveIndexWriterConfig object
> > + which can be used to change the IndexWriter's live settings.
> IndexWriterConfig
> > + is used only for initializing the IndexWriter. (Shai Erera)
> > +
> > ======================= Lucene 4.0.0-ALPHA =======================
> > More information about this release, including any errata related to the
> > release notes, upgrade instructions, or other changes may be found
> online at:
> >
> > Modified:
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriter.java
> > URL:
> http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriter.java?rev=1351229&r1=1351228&r2=1351229&view=diff
> >
> ==============================================================================
> > ---
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriter.java
> (original)
> > +++
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriter.java
> Mon Jun 18 08:24:25 2012
> > @@ -133,7 +133,7 @@ final class DocumentsWriter {
> > final DocumentsWriterFlushControl flushControl;
> >
> > final Codec codec;
> > - DocumentsWriter(Codec codec, IndexWriterConfig config, Directory
> directory, IndexWriter writer, FieldNumbers globalFieldNumbers,
> > + DocumentsWriter(Codec codec, LiveIndexWriterConfig config, Directory
> directory, IndexWriter writer, FieldNumbers globalFieldNumbers,
> > BufferedDeletesStream bufferedDeletesStream) throws IOException {
> > this.codec = codec;
> > this.directory = directory;
> >
> > Modified:
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterFlushControl.java
> > URL:
> http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterFlushControl.java?rev=1351229&r1=1351228&r2=1351229&view=diff
> >
> ==============================================================================
> > ---
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterFlushControl.java
> (original)
> > +++
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterFlushControl.java
> Mon Jun 18 08:24:25 2012
> > @@ -65,10 +65,9 @@ final class DocumentsWriterFlushControl
> > private final FlushPolicy flushPolicy;
> > private boolean closed = false;
> > private final DocumentsWriter documentsWriter;
> > - private final IndexWriterConfig config;
> > + private final LiveIndexWriterConfig config;
> >
> > - DocumentsWriterFlushControl(DocumentsWriter documentsWriter,
> > - IndexWriterConfig config) {
> > + DocumentsWriterFlushControl(DocumentsWriter documentsWriter,
> LiveIndexWriterConfig config) {
> > this.stallControl = new DocumentsWriterStallControl();
> > this.perThreadPool = documentsWriter.perThreadPool;
> > this.flushPolicy = documentsWriter.flushPolicy;
> >
> > Modified:
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterPerThreadPool.java
> > URL:
> http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterPerThreadPool.java?rev=1351229&r1=1351228&r2=1351229&view=diff
> >
> ==============================================================================
> > ---
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterPerThreadPool.java
> (original)
> > +++
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterPerThreadPool.java
> Mon Jun 18 08:24:25 2012
> > @@ -135,7 +135,7 @@ abstract class DocumentsWriterPerThreadP
> > numThreadStatesActive = 0;
> > }
> >
> > - void initialize(DocumentsWriter documentsWriter, FieldNumbers
> globalFieldMap, IndexWriterConfig config) {
> > + void initialize(DocumentsWriter documentsWriter, FieldNumbers
> globalFieldMap, LiveIndexWriterConfig config) {
> > this.documentsWriter.set(documentsWriter); // thread pool is bound
> to DW
> > this.globalFieldMap.set(globalFieldMap);
> > for (int i = 0; i < threadStates.length; i++) {
> >
> > Modified:
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/FlushPolicy.java
> > URL:
> http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/FlushPolicy.java?rev=1351229&r1=1351228&r2=1351229&view=diff
> >
> ==============================================================================
> > ---
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/FlushPolicy.java
> (original)
> > +++
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/FlushPolicy.java
> Mon Jun 18 08:24:25 2012
> > @@ -52,7 +52,7 @@ import org.apache.lucene.util.SetOnce;
> > */
> > abstract class FlushPolicy implements Cloneable {
> > protected SetOnce<DocumentsWriter> writer = new
> SetOnce<DocumentsWriter>();
> > - protected IndexWriterConfig indexWriterConfig;
> > + protected LiveIndexWriterConfig indexWriterConfig;
> >
> > /**
> > * Called for each delete term. If this is a delete triggered due to
> an update
> >
> > Modified:
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
> > URL:
> http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java?rev=1351229&r1=1351228&r2=1351229&view=diff
> >
> ==============================================================================
> > ---
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
> (original)
> > +++
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
> Mon Jun 18 08:24:25 2012
> > @@ -260,7 +260,7 @@ public class IndexWriter implements Clos
> >
> > // The instance that was passed to the constructor. It is saved only
> in order
> > // to allow users to query an IndexWriter settings.
> > - private final IndexWriterConfig config;
> > + private final LiveIndexWriterConfig config;
> >
> > // The PayloadProcessorProvider to use when segments are merged
> > private PayloadProcessorProvider payloadProcessorProvider;
> > @@ -588,11 +588,7 @@ public class IndexWriter implements Clos
> > */
> > public IndexWriter(Directory d, IndexWriterConfig conf)
> > throws CorruptIndexException, LockObtainFailedException,
> IOException {
> > - if (conf.inUseByIndexWriter.get()) {
> > - throw new IllegalStateException("the provided IndexWriterConfig
> was previously used by a different IndexWriter; please make a new one
> instead");
> > - }
> > - config = conf.clone();
> > - config.inUseByIndexWriter.set(true);
> > + config = new LiveIndexWriterConfig(conf.clone());
> > directory = d;
> > analyzer = config.getAnalyzer();
> > infoStream = config.getInfoStream();
> > @@ -759,17 +755,10 @@ public class IndexWriter implements Clos
> > }
> >
> > /**
> > - * Returns the private {@link IndexWriterConfig}, cloned
> > - * from the {@link IndexWriterConfig} passed to
> > - * {@link #IndexWriter(Directory, IndexWriterConfig)}.
> > - * <p>
> > - * <b>NOTE:</b> some settings may be changed on the
> > - * returned {@link IndexWriterConfig}, and will take
> > - * effect in the current IndexWriter instance. See the
> > - * javadocs for the specific setters in {@link
> > - * IndexWriterConfig} for details.
> > + * Returns a {@link LiveIndexWriterConfig}, which can be used to
> query the IndexWriter
> > + * current settings, as well as modify "live" ones.
> > */
> > - public IndexWriterConfig getConfig() {
> > + public LiveIndexWriterConfig getConfig() {
> > ensureOpen(false);
> > return config;
> > }
> >
> > Modified:
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriterConfig.java
> > URL:
> http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriterConfig.java?rev=1351229&r1=1351228&r2=1351229&view=diff
> >
> ==============================================================================
> > ---
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriterConfig.java
> (original)
> > +++
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriterConfig.java
> Mon Jun 18 08:24:25 2012
> > @@ -18,7 +18,6 @@ package org.apache.lucene.index;
> > */
> >
> > import java.io.PrintStream;
> > -import java.util.concurrent.atomic.AtomicBoolean;
> >
> > import org.apache.lucene.analysis.Analyzer;
> > import org.apache.lucene.codecs.Codec;
> > @@ -28,17 +27,14 @@ import org.apache.lucene.search.IndexSea
> > import org.apache.lucene.search.similarities.Similarity;
> > import org.apache.lucene.util.InfoStream;
> > import org.apache.lucene.util.PrintStreamInfoStream;
> > -import org.apache.lucene.util.SetOnce;
> > import org.apache.lucene.util.Version;
> >
> > /**
> > - * Holds all the configuration of {@link IndexWriter}. You
> > - * should instantiate this class, call the setters to set
> > - * your configuration, then pass it to {@link IndexWriter}.
> > - * Note that {@link IndexWriter} makes a private clone; if
> > - * you need to subsequently change settings use {@link
> > - * IndexWriter#getConfig}.
> > - *
> > + * Holds all the configuration that is used to create an {@link
> IndexWriter}.
> > + * Once {@link IndexWriter} has been created with this object, changes
> to this
> > + * object will not affect the {@link IndexWriter} instance. For that,
> use
> > + * {@link LiveIndexWriterConfig} that is returned from {@link
> IndexWriter#getConfig()}.
> > + *
> > * <p>
> > * All setter methods return {@link IndexWriterConfig} to allow chaining
> > * settings conveniently, for example:
> > @@ -47,10 +43,12 @@ import org.apache.lucene.util.Version;
> > * IndexWriterConfig conf = new IndexWriterConfig(analyzer);
> > * conf.setter1().setter2();
> > * </pre>
> > - *
> > + *
> > + * @see IndexWriter#getConfig()
> > + *
> > * @since 3.1
> > */
> > -public final class IndexWriterConfig implements Cloneable {
> > +public final class IndexWriterConfig extends LiveIndexWriterConfig
> implements Cloneable {
> >
> > /**
> > * Specifies the open mode for {@link IndexWriter}.
> > @@ -131,33 +129,6 @@ public final class IndexWriterConfig imp
> > return WRITE_LOCK_TIMEOUT;
> > }
> >
> > - private final Analyzer analyzer;
> > - private volatile IndexDeletionPolicy delPolicy;
> > - private volatile IndexCommit commit;
> > - private volatile OpenMode openMode;
> > - private volatile Similarity similarity;
> > - private volatile int termIndexInterval; // TODO: this should be
> private to the codec, not settable here
> > - private volatile MergeScheduler mergeScheduler;
> > - private volatile long writeLockTimeout;
> > - private volatile int maxBufferedDeleteTerms;
> > - private volatile double ramBufferSizeMB;
> > - private volatile int maxBufferedDocs;
> > - private volatile IndexingChain indexingChain;
> > - private volatile IndexReaderWarmer mergedSegmentWarmer;
> > - private volatile Codec codec;
> > - private volatile InfoStream infoStream;
> > - private volatile MergePolicy mergePolicy;
> > - private volatile DocumentsWriterPerThreadPool indexerThreadPool;
> > - private volatile boolean readerPooling;
> > - private volatile int readerTermsIndexDivisor;
> > - private volatile FlushPolicy flushPolicy;
> > - private volatile int perThreadHardLimitMB;
> > -
> > - private Version matchVersion;
> > -
> > - // Used directly by IndexWriter:
> > - AtomicBoolean inUseByIndexWriter = new AtomicBoolean();
> > -
> > /**
> > * Creates a new config that with defaults that match the specified
> > * {@link Version} as well as the default {@link
> > @@ -171,63 +142,27 @@ public final class IndexWriterConfig imp
> > * {@link LogDocMergePolicy}.
> > */
> > public IndexWriterConfig(Version matchVersion, Analyzer analyzer) {
> > - this.matchVersion = matchVersion;
> > - this.analyzer = analyzer;
> > - delPolicy = new KeepOnlyLastCommitDeletionPolicy();
> > - commit = null;
> > - openMode = OpenMode.CREATE_OR_APPEND;
> > - similarity = IndexSearcher.getDefaultSimilarity();
> > - termIndexInterval = DEFAULT_TERM_INDEX_INTERVAL; // TODO: this
> should be private to the codec, not settable here
> > - mergeScheduler = new ConcurrentMergeScheduler();
> > - writeLockTimeout = WRITE_LOCK_TIMEOUT;
> > - maxBufferedDeleteTerms = DEFAULT_MAX_BUFFERED_DELETE_TERMS;
> > - ramBufferSizeMB = DEFAULT_RAM_BUFFER_SIZE_MB;
> > - maxBufferedDocs = DEFAULT_MAX_BUFFERED_DOCS;
> > - indexingChain = DocumentsWriterPerThread.defaultIndexingChain;
> > - mergedSegmentWarmer = null;
> > - codec = Codec.getDefault();
> > - infoStream = InfoStream.getDefault();
> > - if (matchVersion.onOrAfter(Version.LUCENE_32)) {
> > - mergePolicy = new TieredMergePolicy();
> > - } else {
> > - mergePolicy = new LogByteSizeMergePolicy();
> > - }
> > - flushPolicy = new FlushByRamOrCountsPolicy();
> > - readerPooling = DEFAULT_READER_POOLING;
> > - indexerThreadPool = new
> ThreadAffinityDocumentsWriterThreadPool(DEFAULT_MAX_THREAD_STATES);
> > - readerTermsIndexDivisor = DEFAULT_READER_TERMS_INDEX_DIVISOR;
> > - perThreadHardLimitMB = DEFAULT_RAM_PER_THREAD_HARD_LIMIT_MB;
> > + super(analyzer, matchVersion);
> > }
> >
> > @Override
> > public IndexWriterConfig clone() {
> > - IndexWriterConfig clone;
> > - if (inUseByIndexWriter.get()) {
> > - throw new IllegalStateException("cannot clone: this
> IndexWriterConfig is private to IndexWriter; make a new one instead");
> > - }
> > try {
> > - clone = (IndexWriterConfig) super.clone();
> > + IndexWriterConfig clone = (IndexWriterConfig) super.clone();
> > +
> > + // Mostly shallow clone, but do a deepish clone of
> > + // certain objects that have state that cannot be shared
> > + // across IW instances:
> > + clone.flushPolicy = flushPolicy.clone();
> > + clone.indexerThreadPool = indexerThreadPool.clone();
> > + clone.mergePolicy = mergePolicy.clone();
> > +
> > + return clone;
> > } catch (CloneNotSupportedException e) {
> > - // should not happen
> > throw new RuntimeException(e);
> > }
> > -
> > - // Mostly shallow clone, but do a deepish clone of
> > - // certain objects that have state that cannot be shared
> > - // across IW instances:
> > - clone.inUseByIndexWriter = new AtomicBoolean();
> > - clone.flushPolicy = flushPolicy.clone();
> > - clone.indexerThreadPool = indexerThreadPool.clone();
> > - clone.mergePolicy = mergePolicy.clone();
> > -
> > - return clone;
> > - }
> > -
> > - /** Returns the default analyzer to use for indexing documents. */
> > - public Analyzer getAnalyzer() {
> > - return analyzer;
> > }
> > -
> > +
> > /** Specifies {@link OpenMode} of the index.
> > *
> > * <p>Only takes effect when IndexWriter is first created. */
> > @@ -236,7 +171,7 @@ public final class IndexWriterConfig imp
> > return this;
> > }
> >
> > - /** Returns the {@link OpenMode} set by {@link
> #setOpenMode(OpenMode)}. */
> > + @Override
> > public OpenMode getOpenMode() {
> > return openMode;
> > }
> > @@ -263,11 +198,7 @@ public final class IndexWriterConfig imp
> > return this;
> > }
> >
> > - /**
> > - * Returns the {@link IndexDeletionPolicy} specified in
> > - * {@link #setIndexDeletionPolicy(IndexDeletionPolicy)} or the default
> > - * {@link KeepOnlyLastCommitDeletionPolicy}/
> > - */
> > + @Override
> > public IndexDeletionPolicy getIndexDeletionPolicy() {
> > return delPolicy;
> > }
> > @@ -282,11 +213,7 @@ public final class IndexWriterConfig imp
> > return this;
> > }
> >
> > - /**
> > - * Returns the {@link IndexCommit} as specified in
> > - * {@link #setIndexCommit(IndexCommit)} or the default,
> <code>null</code>
> > - * which specifies to open the latest index commit point.
> > - */
> > + @Override
> > public IndexCommit getIndexCommit() {
> > return commit;
> > }
> > @@ -303,53 +230,12 @@ public final class IndexWriterConfig imp
> > return this;
> > }
> >
> > - /**
> > - * Expert: returns the {@link Similarity} implementation used by this
> > - * IndexWriter.
> > - */
> > + @Override
> > public Similarity getSimilarity() {
> > return similarity;
> > }
> >
> > /**
> > - * Expert: set the interval between indexed terms. Large values cause
> less
> > - * memory to be used by IndexReader, but slow random-access to terms.
> Small
> > - * values cause more memory to be used by an IndexReader, and speed
> > - * random-access to terms.
> > - * <p>
> > - * This parameter determines the amount of computation required per
> query
> > - * term, regardless of the number of documents that contain that
> term. In
> > - * particular, it is the maximum number of other terms that must be
> scanned
> > - * before a term is located and its frequency and position
> information may be
> > - * processed. In a large index with user-entered query terms, query
> processing
> > - * time is likely to be dominated not by term lookup but rather by the
> > - * processing of frequency and positional data. In a small index or
> when many
> > - * uncommon query terms are generated (e.g., by wildcard queries)
> term lookup
> > - * may become a dominant cost.
> > - * <p>
> > - * In particular, <code>numUniqueTerms/interval</code> terms are read
> into
> > - * memory by an IndexReader, and, on average, <code>interval/2</code>
> terms
> > - * must be scanned for each random term access.
> > - *
> > - * @see #DEFAULT_TERM_INDEX_INTERVAL
> > - *
> > - * <p>Takes effect immediately, but only applies to newly
> > - * flushed/merged segments. */
> > - public IndexWriterConfig setTermIndexInterval(int interval) { //
> TODO: this should be private to the codec, not settable here
> > - this.termIndexInterval = interval;
> > - return this;
> > - }
> > -
> > - /**
> > - * Returns the interval between indexed terms.
> > - *
> > - * @see #setTermIndexInterval(int)
> > - */
> > - public int getTermIndexInterval() { // TODO: this should be private
> to the codec, not settable here
> > - return termIndexInterval;
> > - }
> > -
> > - /**
> > * Expert: sets the merge scheduler used by this writer. The default is
> > * {@link ConcurrentMergeScheduler}.
> > * <p>
> > @@ -362,10 +248,7 @@ public final class IndexWriterConfig imp
> > return this;
> > }
> >
> > - /**
> > - * Returns the {@link MergeScheduler} that was set by
> > - * {@link #setMergeScheduler(MergeScheduler)}
> > - */
> > + @Override
> > public MergeScheduler getMergeScheduler() {
> > return mergeScheduler;
> > }
> > @@ -381,174 +264,12 @@ public final class IndexWriterConfig imp
> > return this;
> > }
> >
> > - /**
> > - * Returns allowed timeout when acquiring the write lock.
> > - *
> > - * @see #setWriteLockTimeout(long)
> > - */
> > + @Override
> > public long getWriteLockTimeout() {
> > return writeLockTimeout;
> > }
> >
> > /**
> > - * Determines the minimal number of delete terms required before the
> buffered
> > - * in-memory delete terms and queries are applied and flushed.
> > - * <p>Disabled by default (writer flushes by RAM usage).</p>
> > - * <p>
> > - * NOTE: This setting won't trigger a segment flush.
> > - * </p>
> > - *
> > - * @throws IllegalArgumentException if maxBufferedDeleteTerms
> > - * is enabled but smaller than 1
> > - * @see #setRAMBufferSizeMB
> > - * @see #setFlushPolicy(FlushPolicy)
> > - *
> > - * <p>Takes effect immediately, but only the next time a
> > - * document is added, updated or deleted.
> > - */
> > - public IndexWriterConfig setMaxBufferedDeleteTerms(int
> maxBufferedDeleteTerms) {
> > - if (maxBufferedDeleteTerms != DISABLE_AUTO_FLUSH
> > - && maxBufferedDeleteTerms < 1)
> > - throw new IllegalArgumentException(
> > - "maxBufferedDeleteTerms must at least be 1 when enabled");
> > - this.maxBufferedDeleteTerms = maxBufferedDeleteTerms;
> > - return this;
> > - }
> > -
> > - /**
> > - * Returns the number of buffered deleted terms that will trigger a
> flush of all
> > - * buffered deletes if enabled.
> > - *
> > - * @see #setMaxBufferedDeleteTerms(int)
> > - */
> > - public int getMaxBufferedDeleteTerms() {
> > - return maxBufferedDeleteTerms;
> > - }
> > -
> > - /**
> > - * Determines the amount of RAM that may be used for buffering added
> documents
> > - * and deletions before they are flushed to the Directory. Generally
> for
> > - * faster indexing performance it's best to flush by RAM usage
> instead of
> > - * document count and use as large a RAM buffer as you can.
> > - * <p>
> > - * When this is set, the writer will flush whenever buffered
> documents and
> > - * deletions use this much RAM. Pass in {@link #DISABLE_AUTO_FLUSH}
> to prevent
> > - * triggering a flush due to RAM usage. Note that if flushing by
> document
> > - * count is also enabled, then the flush will be triggered by
> whichever comes
> > - * first.
> > - * <p>
> > - * The maximum RAM limit is inherently determined by the JVMs
> available memory.
> > - * Yet, an {@link IndexWriter} session can consume a significantly
> larger amount
> > - * of memory than the given RAM limit since this limit is just an
> indicator when
> > - * to flush memory resident documents to the Directory. Flushes are
> likely happen
> > - * concurrently while other threads adding documents to the writer.
> For application
> > - * stability the available memory in the JVM should be significantly
> larger than
> > - * the RAM buffer used for indexing.
> > - * <p>
> > - * <b>NOTE</b>: the account of RAM usage for pending deletions is only
> > - * approximate. Specifically, if you delete by Query, Lucene
> currently has no
> > - * way to measure the RAM usage of individual Queries so the
> accounting will
> > - * under-estimate and you should compensate by either calling commit()
> > - * periodically yourself, or by using {@link
> #setMaxBufferedDeleteTerms(int)}
> > - * to flush and apply buffered deletes by count instead of RAM usage
> > - * (for each buffered delete Query a constant number of bytes is used
> to estimate
> > - * RAM usage). Note that enabling {@link
> #setMaxBufferedDeleteTerms(int)} will
> > - * not trigger any segment flushes.
> > - * <p>
> > - * <b>NOTE</b>: It's not guaranteed that all memory resident
> documents are flushed
> > - * once this limit is exceeded. Depending on the configured {@link
> FlushPolicy} only a
> > - * subset of the buffered documents are flushed and therefore only
> parts of the RAM
> > - * buffer is released.
> > - * <p>
> > - *
> > - * The default value is {@link #DEFAULT_RAM_BUFFER_SIZE_MB}.
> > - * @see #setFlushPolicy(FlushPolicy)
> > - * @see #setRAMPerThreadHardLimitMB(int)
> > - *
> > - * <p>Takes effect immediately, but only the next time a
> > - * document is added, updated or deleted.
> > - *
> > - * @throws IllegalArgumentException
> > - * if ramBufferSize is enabled but non-positive, or it
> disables
> > - * ramBufferSize when maxBufferedDocs is already disabled
> > - *
> > - */
> > - public IndexWriterConfig setRAMBufferSizeMB(double ramBufferSizeMB) {
> > - if (ramBufferSizeMB != DISABLE_AUTO_FLUSH && ramBufferSizeMB <= 0.0)
> > - throw new IllegalArgumentException(
> > - "ramBufferSize should be > 0.0 MB when enabled");
> > - if (ramBufferSizeMB == DISABLE_AUTO_FLUSH && maxBufferedDocs ==
> DISABLE_AUTO_FLUSH)
> > - throw new IllegalArgumentException(
> > - "at least one of ramBufferSize and maxBufferedDocs must be
> enabled");
> > - this.ramBufferSizeMB = ramBufferSizeMB;
> > - return this;
> > - }
> > -
> > - /** Returns the value set by {@link #setRAMBufferSizeMB(double)} if
> enabled. */
> > - public double getRAMBufferSizeMB() {
> > - return ramBufferSizeMB;
> > - }
> > -
> > - /**
> > - * Determines the minimal number of documents required before the
> buffered
> > - * in-memory documents are flushed as a new Segment. Large values
> generally
> > - * give faster indexing.
> > - *
> > - * <p>
> > - * When this is set, the writer will flush every maxBufferedDocs added
> > - * documents. Pass in {@link #DISABLE_AUTO_FLUSH} to prevent
> triggering a
> > - * flush due to number of buffered documents. Note that if flushing
> by RAM
> > - * usage is also enabled, then the flush will be triggered by
> whichever comes
> > - * first.
> > - *
> > - * <p>
> > - * Disabled by default (writer flushes by RAM usage).
> > - *
> > - * <p>Takes effect immediately, but only the next time a
> > - * document is added, updated or deleted.
> > - *
> > - * @see #setRAMBufferSizeMB(double)
> > - * @see #setFlushPolicy(FlushPolicy)
> > - * @throws IllegalArgumentException
> > - * if maxBufferedDocs is enabled but smaller than 2, or it
> disables
> > - * maxBufferedDocs when ramBufferSize is already disabled
> > - */
> > - public IndexWriterConfig setMaxBufferedDocs(int maxBufferedDocs) {
> > - if (maxBufferedDocs != DISABLE_AUTO_FLUSH && maxBufferedDocs < 2)
> > - throw new IllegalArgumentException(
> > - "maxBufferedDocs must at least be 2 when enabled");
> > - if (maxBufferedDocs == DISABLE_AUTO_FLUSH
> > - && ramBufferSizeMB == DISABLE_AUTO_FLUSH)
> > - throw new IllegalArgumentException(
> > - "at least one of ramBufferSize and maxBufferedDocs must be
> enabled");
> > - this.maxBufferedDocs = maxBufferedDocs;
> > - return this;
> > - }
> > -
> > - /**
> > - * Returns the number of buffered added documents that will trigger a
> flush if
> > - * enabled.
> > - *
> > - * @see #setMaxBufferedDocs(int)
> > - */
> > - public int getMaxBufferedDocs() {
> > - return maxBufferedDocs;
> > - }
> > -
> > - /** Set the merged segment warmer. See {@link IndexReaderWarmer}.
> > - *
> > - * <p>Takes effect on the next merge. */
> > - public IndexWriterConfig setMergedSegmentWarmer(IndexReaderWarmer
> mergeSegmentWarmer) {
> > - this.mergedSegmentWarmer = mergeSegmentWarmer;
> > - return this;
> > - }
> > -
> > - /** Returns the current merged segment warmer. See {@link
> IndexReaderWarmer}. */
> > - public IndexReaderWarmer getMergedSegmentWarmer() {
> > - return mergedSegmentWarmer;
> > - }
> > -
> > - /**
> > * Expert: {@link MergePolicy} is invoked whenever there are changes
> to the
> > * segments in the index. Its role is to select which merges to do, if
> any,
> > * and return a {@link MergePolicy.MergeSpecification} describing the
> merges.
> > @@ -561,25 +282,24 @@ public final class IndexWriterConfig imp
> > return this;
> > }
> >
> > - /** Set the Codec. See {@link Codec}.
> > - *
> > - * <p>Only takes effect when IndexWriter is first created. */
> > + /**
> > + * Set the {@link Codec}.
> > + *
> > + * <p>
> > + * Only takes effect when IndexWriter is first created.
> > + */
> > public IndexWriterConfig setCodec(Codec codec) {
> > this.codec = codec;
> > return this;
> > }
> >
> > - /** Returns the current Codec. See {@link Codec}. */
> > + @Override
> > public Codec getCodec() {
> > return codec;
> > }
> >
> >
> > - /**
> > - * Returns the current MergePolicy in use by this writer.
> > - *
> > - * @see #setMergePolicy(MergePolicy)
> > - */
> > + @Override
> > public MergePolicy getMergePolicy() {
> > return mergePolicy;
> > }
> > @@ -600,17 +320,15 @@ public final class IndexWriterConfig imp
> > * NOTE: This only takes effect when IndexWriter is first
> created.</p>*/
> > IndexWriterConfig setIndexerThreadPool(DocumentsWriterPerThreadPool
> threadPool) {
> > if (threadPool == null) {
> > - throw new IllegalArgumentException("DocumentsWriterPerThreadPool
> must not be nul");
> > + throw new IllegalArgumentException("threadPool must not be null");
> > }
> > this.indexerThreadPool = threadPool;
> > return this;
> > }
> >
> > - /** Returns the configured {@link DocumentsWriterPerThreadPool}
> instance.
> > - * @see #setIndexerThreadPool(DocumentsWriterPerThreadPool)
> > - * @return the configured {@link DocumentsWriterPerThreadPool}
> instance.*/
> > + @Override
> > DocumentsWriterPerThreadPool getIndexerThreadPool() {
> > - return this.indexerThreadPool;
> > + return indexerThreadPool;
> > }
> >
> > /**
> > @@ -625,8 +343,7 @@ public final class IndexWriterConfig imp
> > return this;
> > }
> >
> > - /** Returns the max number of simultaneous threads that
> > - * may be indexing documents at once in IndexWriter. */
> > + @Override
> > public int getMaxThreadStates() {
> > try {
> > return ((ThreadAffinityDocumentsWriterThreadPool)
> indexerThreadPool).getMaxThreadStates();
> > @@ -650,8 +367,7 @@ public final class IndexWriterConfig imp
> > return this;
> > }
> >
> > - /** Returns true if IndexWriter should pool readers even
> > - * if {@link DirectoryReader#open(IndexWriter, boolean)} has not
> been called. */
> > + @Override
> > public boolean getReaderPooling() {
> > return readerPooling;
> > }
> > @@ -664,34 +380,11 @@ public final class IndexWriterConfig imp
> > return this;
> > }
> >
> > - /** Returns the indexing chain set on {@link
> #setIndexingChain(IndexingChain)}. */
> > + @Override
> > IndexingChain getIndexingChain() {
> > return indexingChain;
> > }
> >
> > - /** Sets the termsIndexDivisor passed to any readers that
> > - * IndexWriter opens, for example when applying deletes
> > - * or creating a near-real-time reader in {@link
> > - * DirectoryReader#open(IndexWriter, boolean)}. If you pass -1, the
> terms index
> > - * won't be loaded by the readers. This is only useful in
> > - * advanced situations when you will only .next() through
> > - * all terms; attempts to seek will hit an exception.
> > - *
> > - * <p>Takes effect immediately, but only applies to
> > - * readers opened after this call */
> > - public IndexWriterConfig setReaderTermsIndexDivisor(int divisor) {
> > - if (divisor <= 0 && divisor != -1) {
> > - throw new IllegalArgumentException("divisor must be >= 1, or -1
> (got " + divisor + ")");
> > - }
> > - readerTermsIndexDivisor = divisor;
> > - return this;
> > - }
> > -
> > - /** @see #setReaderTermsIndexDivisor(int) */
> > - public int getReaderTermsIndexDivisor() {
> > - return readerTermsIndexDivisor;
> > - }
> > -
> > /**
> > * Expert: Controls when segments are flushed to disk during indexing.
> > * The {@link FlushPolicy} initialized during {@link IndexWriter}
> instantiation and once initialized
> > @@ -724,28 +417,56 @@ public final class IndexWriterConfig imp
> > return this;
> > }
> >
> > - /**
> > - * Returns the max amount of memory each {@link
> DocumentsWriterPerThread} can
> > - * consume until forcefully flushed.
> > - * @see #setRAMPerThreadHardLimitMB(int)
> > - */
> > + @Override
> > public int getRAMPerThreadHardLimitMB() {
> > return perThreadHardLimitMB;
> > }
> > - /**
> > - * @see #setFlushPolicy(FlushPolicy)
> > - */
> > +
> > + @Override
> > public FlushPolicy getFlushPolicy() {
> > return flushPolicy;
> > }
> >
> > - /**
> > - * @see #setInfoStream(InfoStream)
> > - */
> > + @Override
> > public InfoStream getInfoStream() {
> > return infoStream;
> > }
> >
> > + @Override
> > + public Analyzer getAnalyzer() {
> > + return super.getAnalyzer();
> > + }
> > +
> > + @Override
> > + public int getMaxBufferedDeleteTerms() {
> > + return super.getMaxBufferedDeleteTerms();
> > + }
> > +
> > + @Override
> > + public int getMaxBufferedDocs() {
> > + return super.getMaxBufferedDocs();
> > + }
> > +
> > + @Override
> > + public IndexReaderWarmer getMergedSegmentWarmer() {
> > + return super.getMergedSegmentWarmer();
> > + }
> > +
> > + @Override
> > + public double getRAMBufferSizeMB() {
> > + return super.getRAMBufferSizeMB();
> > + }
> > +
> > + @Override
> > + public int getReaderTermsIndexDivisor() {
> > + return super.getReaderTermsIndexDivisor();
> > + }
> > +
> > + @Override
> > + public int getTermIndexInterval() {
> > + return super.getTermIndexInterval();
> > + }
> > +
> > /** If non-null, information about merges, deletes and a
> > * message when maxFieldLength is reached will be printed
> > * to this.
> > @@ -759,40 +480,39 @@ public final class IndexWriterConfig imp
> > return this;
> > }
> >
> > - /**
> > - * Convenience method that uses {@link PrintStreamInfoStream}
> > - */
> > + /** Convenience method that uses {@link PrintStreamInfoStream} */
> > public IndexWriterConfig setInfoStream(PrintStream printStream) {
> > return setInfoStream(printStream == null ? InfoStream.NO_OUTPUT :
> new PrintStreamInfoStream(printStream));
> > }
> > -
> > +
> > @Override
> > - public String toString() {
> > - StringBuilder sb = new StringBuilder();
> > - sb.append("matchVersion=").append(matchVersion).append("\n");
> > - sb.append("analyzer=").append(analyzer == null ? "null" :
> analyzer.getClass().getName()).append("\n");
> > -
> sb.append("delPolicy=").append(delPolicy.getClass().getName()).append("\n");
> > - sb.append("commit=").append(commit == null ? "null" :
> commit).append("\n");
> > - sb.append("openMode=").append(openMode).append("\n");
> > -
> sb.append("similarity=").append(similarity.getClass().getName()).append("\n");
> > -
> sb.append("termIndexInterval=").append(termIndexInterval).append("\n"); //
> TODO: this should be private to the codec, not settable here
> > -
> sb.append("mergeScheduler=").append(mergeScheduler.getClass().getName()).append("\n");
> > - sb.append("default
> WRITE_LOCK_TIMEOUT=").append(WRITE_LOCK_TIMEOUT).append("\n");
> > -
> sb.append("writeLockTimeout=").append(writeLockTimeout).append("\n");
> > -
> sb.append("maxBufferedDeleteTerms=").append(maxBufferedDeleteTerms).append("\n");
> > - sb.append("ramBufferSizeMB=").append(ramBufferSizeMB).append("\n");
> > - sb.append("maxBufferedDocs=").append(maxBufferedDocs).append("\n");
> > -
> sb.append("mergedSegmentWarmer=").append(mergedSegmentWarmer).append("\n");
> > - sb.append("codec=").append(codec).append("\n");
> > -
> sb.append("infoStream=").append(infoStream.getClass().getName()).append("\n");
> > - sb.append("mergePolicy=").append(mergePolicy).append("\n");
> > -
> sb.append("indexerThreadPool=").append(indexerThreadPool).append("\n");
> > - sb.append("readerPooling=").append(readerPooling).append("\n");
> > -
> sb.append("readerTermsIndexDivisor=").append(readerTermsIndexDivisor).append("\n");
> > - sb.append("flushPolicy=").append(flushPolicy).append("\n");
> > -
> sb.append("perThreadHardLimitMB=").append(perThreadHardLimitMB).append("\n");
> > -
> > - return sb.toString();
> > + public IndexWriterConfig setMaxBufferedDeleteTerms(int
> maxBufferedDeleteTerms) {
> > + return (IndexWriterConfig)
> super.setMaxBufferedDeleteTerms(maxBufferedDeleteTerms);
> > + }
> > +
> > + @Override
> > + public IndexWriterConfig setMaxBufferedDocs(int maxBufferedDocs) {
> > + return (IndexWriterConfig)
> super.setMaxBufferedDocs(maxBufferedDocs);
> > + }
> > +
> > + @Override
> > + public IndexWriterConfig setMergedSegmentWarmer(IndexReaderWarmer
> mergeSegmentWarmer) {
> > + return (IndexWriterConfig)
> super.setMergedSegmentWarmer(mergeSegmentWarmer);
> > + }
> > +
> > + @Override
> > + public IndexWriterConfig setRAMBufferSizeMB(double ramBufferSizeMB) {
> > + return (IndexWriterConfig)
> super.setRAMBufferSizeMB(ramBufferSizeMB);
> > + }
> > +
> > + @Override
> > + public IndexWriterConfig setReaderTermsIndexDivisor(int divisor) {
> > + return (IndexWriterConfig)
> super.setReaderTermsIndexDivisor(divisor);
> > + }
> > +
> > + @Override
> > + public IndexWriterConfig setTermIndexInterval(int interval) {
> > + return (IndexWriterConfig) super.setTermIndexInterval(interval);
> > }
> >
> > }
> >
> > Modified:
> lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestFlushByRamOrCountsPolicy.java
> > URL:
> http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestFlushByRamOrCountsPolicy.java?rev=1351229&r1=1351228&r2=1351229&view=diff
> >
> ==============================================================================
> > ---
> lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestFlushByRamOrCountsPolicy.java
> (original)
> > +++
> lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestFlushByRamOrCountsPolicy.java
> Mon Jun 18 08:24:25 2012
> > @@ -294,7 +294,7 @@ public class TestFlushByRamOrCountsPolic
> >
> > public class IndexThread extends Thread {
> > IndexWriter writer;
> > - IndexWriterConfig iwc;
> > + LiveIndexWriterConfig iwc;
> > LineFileDocs docs;
> > private AtomicInteger pendingDocs;
> > private final boolean doRandomCommit;
> >
> > Modified:
> lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterConfig.java
> > URL:
> http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterConfig.java?rev=1351229&r1=1351228&r2=1351229&view=diff
> >
> ==============================================================================
> > ---
> lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterConfig.java
> (original)
> > +++
> lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterConfig.java
> Mon Jun 18 08:24:25 2012
> > @@ -25,8 +25,6 @@ import java.util.Set;
> >
> > import org.apache.lucene.analysis.MockAnalyzer;
> > import org.apache.lucene.codecs.Codec;
> > -import org.apache.lucene.document.Document;
> > -import org.apache.lucene.document.Field.Store;
> > import org.apache.lucene.index.DocumentsWriterPerThread.IndexingChain;
> > import org.apache.lucene.index.IndexWriterConfig.OpenMode;
> > import org.apache.lucene.search.IndexSearcher;
> > @@ -114,19 +112,71 @@ public class TestIndexWriterConfig exten
> >
> > @Test
> > public void testSettersChaining() throws Exception {
> > - // Ensures that every setter returns IndexWriterConfig to enable
> easy
> > - // chaining.
> > + // Ensures that every setter returns IndexWriterConfig to allow
> chaining.
> > + HashSet<String> liveSetters = new HashSet<String>();
> > + HashSet<String> allSetters = new HashSet<String>();
> > 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());
> > + if (m.getName().startsWith("set") &&
> !Modifier.isStatic(m.getModifiers())) {
> > + allSetters.add(m.getName());
> > + // setters overridden from LiveIndexWriterConfig are returned
> twice, once with
> > + // IndexWriterConfig return type and second with
> LiveIndexWriterConfig. The ones
> > + // from LiveIndexWriterConfig are marked 'synthetic', so just
> collect them and
> > + // assert in the end that we also received them from IWC.
> > + if (m.isSynthetic()) {
> > + liveSetters.add(m.getName());
> > + } else {
> > + assertEquals("method " + m.getName() + " does not return
> IndexWriterConfig",
> > + IndexWriterConfig.class, m.getReturnType());
> > + }
> > }
> > }
> > + for (String setter : liveSetters) {
> > + assertTrue("setter method not overridden by IndexWriterConfig: "
> + setter, allSetters.contains(setter));
> > + }
> > }
> >
> > @Test
> > + public void testReuse() throws Exception {
> > + Directory dir = newDirectory();
> > + // test that if the same IWC is reused across two IWs, it is cloned
> by each.
> > + IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT,
> null);
> > + RandomIndexWriter iw = new RandomIndexWriter(random(), dir, conf);
> > + LiveIndexWriterConfig liveConf1 = iw.w.getConfig();
> > + iw.close();
> > +
> > + iw = new RandomIndexWriter(random(), dir, conf);
> > + LiveIndexWriterConfig liveConf2 = iw.w.getConfig();
> > + iw.close();
> > +
> > + // LiveIndexWriterConfig's "copy" constructor doesn't clone objects.
> > + assertNotSame("IndexWriterConfig should have been cloned",
> liveConf1.getMergePolicy(), liveConf2.getMergePolicy());
> > +
> > + dir.close();
> > + }
> > +
> > + @Test
> > + public void testOverrideGetters() throws Exception {
> > + // Test that IndexWriterConfig overrides all getters, so that
> javadocs
> > + // contain all methods for the users. Also, ensures that
> IndexWriterConfig
> > + // doesn't declare getters that are not declared on LiveIWC.
> > + HashSet<String> liveGetters = new HashSet<String>();
> > + for (Method m : LiveIndexWriterConfig.class.getDeclaredMethods()) {
> > + if (m.getName().startsWith("get") &&
> !Modifier.isStatic(m.getModifiers())) {
> > + liveGetters.add(m.getName());
> > + }
> > + }
> > +
> > + for (Method m : IndexWriterConfig.class.getDeclaredMethods()) {
> > + if (m.getName().startsWith("get") &&
> !Modifier.isStatic(m.getModifiers())) {
> > + assertEquals("method " + m.getName() + " not overrided by
> IndexWriterConfig",
> > + IndexWriterConfig.class, m.getDeclaringClass());
> > + assertTrue("method " + m.getName() + " not declared on
> LiveIndexWriterConfig",
> > + liveGetters.contains(m.getName()));
> > + }
> > + }
> > + }
> > +
> > + @Test
> > public void testConstants() throws Exception {
> > // Tests that the values of the constants does not change
> > assertEquals(1000, IndexWriterConfig.WRITE_LOCK_TIMEOUT);
> > @@ -276,53 +326,4 @@ public class TestIndexWriterConfig exten
> > assertEquals(LogByteSizeMergePolicy.class,
> conf.getMergePolicy().getClass());
> > }
> >
> > - public void testReuse() throws Exception {
> > - IndexWriterConfig iwc = newIndexWriterConfig(TEST_VERSION_CURRENT,
> new MockAnalyzer(random()));
> > - Directory dir = newDirectory();
> > - Document doc = new Document();
> > - doc.add(newTextField("foo", "bar", Store.YES));
> > - RandomIndexWriter riw = new RandomIndexWriter(random(), dir, iwc);
> > - riw.addDocument(doc);
> > - riw.close();
> > -
> > - // Sharing IWC should be fine:
> > - riw = new RandomIndexWriter(random(), dir, iwc);
> > - riw.addDocument(doc);
> > - riw.close();
> > -
> > - dir.close();
> > - }
> > -
> > - public void testIWCClone() throws Exception {
> > - IndexWriterConfig iwc = newIndexWriterConfig(TEST_VERSION_CURRENT,
> new MockAnalyzer(random()));
> > - Directory dir = newDirectory();
> > - RandomIndexWriter riw = new RandomIndexWriter(random(), dir, iwc);
> > -
> > - // Cannot clone IW's private IWC clone:
> > - try {
> > - riw.w.getConfig().clone();
> > - fail("did not hit expected exception");
> > - } catch (IllegalStateException ise) {
> > - // expected
> > - }
> > - riw.close();
> > - dir.close();
> > - }
> > -
> > - public void testIWCInvalidReuse() throws Exception {
> > - IndexWriterConfig iwc = newIndexWriterConfig(TEST_VERSION_CURRENT,
> new MockAnalyzer(random()));
> > - Directory dir = newDirectory();
> > - RandomIndexWriter riw = new RandomIndexWriter(random(), dir, iwc);
> > - IndexWriterConfig privateIWC = riw.w.getConfig();
> > - riw.close();
> > -
> > - // Cannot clone IW's private IWC clone:
> > - try {
> > - new RandomIndexWriter(random(), dir, privateIWC);
> > - fail("did not hit expected exception");
> > - } catch (IllegalStateException ise) {
> > - // expected
> > - }
> > - dir.close();
> > - }
> > }
> >
> >
>
>
>
> --
> lucidimagination.com
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@lucene.apache.org
> For additional commands, e-mail: dev-help@lucene.apache.org
>
>
Re: svn commit: r1351229 - in /lucene/dev/branches/branch_4x: ./
lucene/ lucene/core/ lucene/core/src/java/org/apache/lucene/index/ lucene/core/src/test/org/apache/lucene/index/
Posted by Robert Muir <rc...@gmail.com>.
Why are the CHANGES totally screwy in this commit? Please put them
under the right section (also fix trunk too)
On Mon, Jun 18, 2012 at 4:24 AM, <sh...@apache.org> wrote:
> Author: shaie
> Date: Mon Jun 18 08:24:25 2012
> New Revision: 1351229
>
> URL: http://svn.apache.org/viewvc?rev=1351229&view=rev
> Log:
> LUCENE-4132: merge from trunk
>
> Added:
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/LiveIndexWriterConfig.java
> - copied unchanged from r1351225, lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/LiveIndexWriterConfig.java
> Modified:
> lucene/dev/branches/branch_4x/ (props changed)
> lucene/dev/branches/branch_4x/lucene/ (props changed)
> lucene/dev/branches/branch_4x/lucene/CHANGES.txt
> lucene/dev/branches/branch_4x/lucene/core/ (props changed)
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriter.java
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterFlushControl.java
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterPerThreadPool.java
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/FlushPolicy.java
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriterConfig.java
> lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestFlushByRamOrCountsPolicy.java
> lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterConfig.java
>
> Modified: lucene/dev/branches/branch_4x/lucene/CHANGES.txt
> URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/CHANGES.txt?rev=1351229&r1=1351228&r2=1351229&view=diff
> ==============================================================================
> --- lucene/dev/branches/branch_4x/lucene/CHANGES.txt (original)
> +++ lucene/dev/branches/branch_4x/lucene/CHANGES.txt Mon Jun 18 08:24:25 2012
> @@ -6,6 +6,17 @@ http://s.apache.org/luceneversions
> For "contrib" changes prior to 4.0, please see:
> http://svn.apache.org/repos/asf/lucene/dev/tags/lucene_solr_3_6_0/lucene/contrib/CHANGES.txt
>
> +New features
> +
> +* LUCENE-4108: add replaceTaxonomy to DirectoryTaxonomyWriter, which replaces
> + the taxonomy in place with the given one. (Shai Erera)
> +
> +API Changes
> +
> +* LUCENE-4132: IndexWriter.getConfig() now returns a LiveIndexWriterConfig object
> + which can be used to change the IndexWriter's live settings. IndexWriterConfig
> + is used only for initializing the IndexWriter. (Shai Erera)
> +
> ======================= Lucene 4.0.0-ALPHA =======================
> More information about this release, including any errata related to the
> release notes, upgrade instructions, or other changes may be found online at:
>
> Modified: lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriter.java
> URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriter.java?rev=1351229&r1=1351228&r2=1351229&view=diff
> ==============================================================================
> --- lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriter.java (original)
> +++ lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriter.java Mon Jun 18 08:24:25 2012
> @@ -133,7 +133,7 @@ final class DocumentsWriter {
> final DocumentsWriterFlushControl flushControl;
>
> final Codec codec;
> - DocumentsWriter(Codec codec, IndexWriterConfig config, Directory directory, IndexWriter writer, FieldNumbers globalFieldNumbers,
> + DocumentsWriter(Codec codec, LiveIndexWriterConfig config, Directory directory, IndexWriter writer, FieldNumbers globalFieldNumbers,
> BufferedDeletesStream bufferedDeletesStream) throws IOException {
> this.codec = codec;
> this.directory = directory;
>
> Modified: lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterFlushControl.java
> URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterFlushControl.java?rev=1351229&r1=1351228&r2=1351229&view=diff
> ==============================================================================
> --- lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterFlushControl.java (original)
> +++ lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterFlushControl.java Mon Jun 18 08:24:25 2012
> @@ -65,10 +65,9 @@ final class DocumentsWriterFlushControl
> private final FlushPolicy flushPolicy;
> private boolean closed = false;
> private final DocumentsWriter documentsWriter;
> - private final IndexWriterConfig config;
> + private final LiveIndexWriterConfig config;
>
> - DocumentsWriterFlushControl(DocumentsWriter documentsWriter,
> - IndexWriterConfig config) {
> + DocumentsWriterFlushControl(DocumentsWriter documentsWriter, LiveIndexWriterConfig config) {
> this.stallControl = new DocumentsWriterStallControl();
> this.perThreadPool = documentsWriter.perThreadPool;
> this.flushPolicy = documentsWriter.flushPolicy;
>
> Modified: lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterPerThreadPool.java
> URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterPerThreadPool.java?rev=1351229&r1=1351228&r2=1351229&view=diff
> ==============================================================================
> --- lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterPerThreadPool.java (original)
> +++ lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterPerThreadPool.java Mon Jun 18 08:24:25 2012
> @@ -135,7 +135,7 @@ abstract class DocumentsWriterPerThreadP
> numThreadStatesActive = 0;
> }
>
> - void initialize(DocumentsWriter documentsWriter, FieldNumbers globalFieldMap, IndexWriterConfig config) {
> + void initialize(DocumentsWriter documentsWriter, FieldNumbers globalFieldMap, LiveIndexWriterConfig config) {
> this.documentsWriter.set(documentsWriter); // thread pool is bound to DW
> this.globalFieldMap.set(globalFieldMap);
> for (int i = 0; i < threadStates.length; i++) {
>
> Modified: lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/FlushPolicy.java
> URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/FlushPolicy.java?rev=1351229&r1=1351228&r2=1351229&view=diff
> ==============================================================================
> --- lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/FlushPolicy.java (original)
> +++ lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/FlushPolicy.java Mon Jun 18 08:24:25 2012
> @@ -52,7 +52,7 @@ import org.apache.lucene.util.SetOnce;
> */
> abstract class FlushPolicy implements Cloneable {
> protected SetOnce<DocumentsWriter> writer = new SetOnce<DocumentsWriter>();
> - protected IndexWriterConfig indexWriterConfig;
> + protected LiveIndexWriterConfig indexWriterConfig;
>
> /**
> * Called for each delete term. If this is a delete triggered due to an update
>
> Modified: lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
> URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java?rev=1351229&r1=1351228&r2=1351229&view=diff
> ==============================================================================
> --- lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java (original)
> +++ lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java Mon Jun 18 08:24:25 2012
> @@ -260,7 +260,7 @@ public class IndexWriter implements Clos
>
> // The instance that was passed to the constructor. It is saved only in order
> // to allow users to query an IndexWriter settings.
> - private final IndexWriterConfig config;
> + private final LiveIndexWriterConfig config;
>
> // The PayloadProcessorProvider to use when segments are merged
> private PayloadProcessorProvider payloadProcessorProvider;
> @@ -588,11 +588,7 @@ public class IndexWriter implements Clos
> */
> public IndexWriter(Directory d, IndexWriterConfig conf)
> throws CorruptIndexException, LockObtainFailedException, IOException {
> - if (conf.inUseByIndexWriter.get()) {
> - throw new IllegalStateException("the provided IndexWriterConfig was previously used by a different IndexWriter; please make a new one instead");
> - }
> - config = conf.clone();
> - config.inUseByIndexWriter.set(true);
> + config = new LiveIndexWriterConfig(conf.clone());
> directory = d;
> analyzer = config.getAnalyzer();
> infoStream = config.getInfoStream();
> @@ -759,17 +755,10 @@ public class IndexWriter implements Clos
> }
>
> /**
> - * Returns the private {@link IndexWriterConfig}, cloned
> - * from the {@link IndexWriterConfig} passed to
> - * {@link #IndexWriter(Directory, IndexWriterConfig)}.
> - * <p>
> - * <b>NOTE:</b> some settings may be changed on the
> - * returned {@link IndexWriterConfig}, and will take
> - * effect in the current IndexWriter instance. See the
> - * javadocs for the specific setters in {@link
> - * IndexWriterConfig} for details.
> + * Returns a {@link LiveIndexWriterConfig}, which can be used to query the IndexWriter
> + * current settings, as well as modify "live" ones.
> */
> - public IndexWriterConfig getConfig() {
> + public LiveIndexWriterConfig getConfig() {
> ensureOpen(false);
> return config;
> }
>
> Modified: lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriterConfig.java
> URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriterConfig.java?rev=1351229&r1=1351228&r2=1351229&view=diff
> ==============================================================================
> --- lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriterConfig.java (original)
> +++ lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriterConfig.java Mon Jun 18 08:24:25 2012
> @@ -18,7 +18,6 @@ package org.apache.lucene.index;
> */
>
> import java.io.PrintStream;
> -import java.util.concurrent.atomic.AtomicBoolean;
>
> import org.apache.lucene.analysis.Analyzer;
> import org.apache.lucene.codecs.Codec;
> @@ -28,17 +27,14 @@ import org.apache.lucene.search.IndexSea
> import org.apache.lucene.search.similarities.Similarity;
> import org.apache.lucene.util.InfoStream;
> import org.apache.lucene.util.PrintStreamInfoStream;
> -import org.apache.lucene.util.SetOnce;
> import org.apache.lucene.util.Version;
>
> /**
> - * Holds all the configuration of {@link IndexWriter}. You
> - * should instantiate this class, call the setters to set
> - * your configuration, then pass it to {@link IndexWriter}.
> - * Note that {@link IndexWriter} makes a private clone; if
> - * you need to subsequently change settings use {@link
> - * IndexWriter#getConfig}.
> - *
> + * Holds all the configuration that is used to create an {@link IndexWriter}.
> + * Once {@link IndexWriter} has been created with this object, changes to this
> + * object will not affect the {@link IndexWriter} instance. For that, use
> + * {@link LiveIndexWriterConfig} that is returned from {@link IndexWriter#getConfig()}.
> + *
> * <p>
> * All setter methods return {@link IndexWriterConfig} to allow chaining
> * settings conveniently, for example:
> @@ -47,10 +43,12 @@ import org.apache.lucene.util.Version;
> * IndexWriterConfig conf = new IndexWriterConfig(analyzer);
> * conf.setter1().setter2();
> * </pre>
> - *
> + *
> + * @see IndexWriter#getConfig()
> + *
> * @since 3.1
> */
> -public final class IndexWriterConfig implements Cloneable {
> +public final class IndexWriterConfig extends LiveIndexWriterConfig implements Cloneable {
>
> /**
> * Specifies the open mode for {@link IndexWriter}.
> @@ -131,33 +129,6 @@ public final class IndexWriterConfig imp
> return WRITE_LOCK_TIMEOUT;
> }
>
> - private final Analyzer analyzer;
> - private volatile IndexDeletionPolicy delPolicy;
> - private volatile IndexCommit commit;
> - private volatile OpenMode openMode;
> - private volatile Similarity similarity;
> - private volatile int termIndexInterval; // TODO: this should be private to the codec, not settable here
> - private volatile MergeScheduler mergeScheduler;
> - private volatile long writeLockTimeout;
> - private volatile int maxBufferedDeleteTerms;
> - private volatile double ramBufferSizeMB;
> - private volatile int maxBufferedDocs;
> - private volatile IndexingChain indexingChain;
> - private volatile IndexReaderWarmer mergedSegmentWarmer;
> - private volatile Codec codec;
> - private volatile InfoStream infoStream;
> - private volatile MergePolicy mergePolicy;
> - private volatile DocumentsWriterPerThreadPool indexerThreadPool;
> - private volatile boolean readerPooling;
> - private volatile int readerTermsIndexDivisor;
> - private volatile FlushPolicy flushPolicy;
> - private volatile int perThreadHardLimitMB;
> -
> - private Version matchVersion;
> -
> - // Used directly by IndexWriter:
> - AtomicBoolean inUseByIndexWriter = new AtomicBoolean();
> -
> /**
> * Creates a new config that with defaults that match the specified
> * {@link Version} as well as the default {@link
> @@ -171,63 +142,27 @@ public final class IndexWriterConfig imp
> * {@link LogDocMergePolicy}.
> */
> public IndexWriterConfig(Version matchVersion, Analyzer analyzer) {
> - this.matchVersion = matchVersion;
> - this.analyzer = analyzer;
> - delPolicy = new KeepOnlyLastCommitDeletionPolicy();
> - commit = null;
> - openMode = OpenMode.CREATE_OR_APPEND;
> - similarity = IndexSearcher.getDefaultSimilarity();
> - termIndexInterval = DEFAULT_TERM_INDEX_INTERVAL; // TODO: this should be private to the codec, not settable here
> - mergeScheduler = new ConcurrentMergeScheduler();
> - writeLockTimeout = WRITE_LOCK_TIMEOUT;
> - maxBufferedDeleteTerms = DEFAULT_MAX_BUFFERED_DELETE_TERMS;
> - ramBufferSizeMB = DEFAULT_RAM_BUFFER_SIZE_MB;
> - maxBufferedDocs = DEFAULT_MAX_BUFFERED_DOCS;
> - indexingChain = DocumentsWriterPerThread.defaultIndexingChain;
> - mergedSegmentWarmer = null;
> - codec = Codec.getDefault();
> - infoStream = InfoStream.getDefault();
> - if (matchVersion.onOrAfter(Version.LUCENE_32)) {
> - mergePolicy = new TieredMergePolicy();
> - } else {
> - mergePolicy = new LogByteSizeMergePolicy();
> - }
> - flushPolicy = new FlushByRamOrCountsPolicy();
> - readerPooling = DEFAULT_READER_POOLING;
> - indexerThreadPool = new ThreadAffinityDocumentsWriterThreadPool(DEFAULT_MAX_THREAD_STATES);
> - readerTermsIndexDivisor = DEFAULT_READER_TERMS_INDEX_DIVISOR;
> - perThreadHardLimitMB = DEFAULT_RAM_PER_THREAD_HARD_LIMIT_MB;
> + super(analyzer, matchVersion);
> }
>
> @Override
> public IndexWriterConfig clone() {
> - IndexWriterConfig clone;
> - if (inUseByIndexWriter.get()) {
> - throw new IllegalStateException("cannot clone: this IndexWriterConfig is private to IndexWriter; make a new one instead");
> - }
> try {
> - clone = (IndexWriterConfig) super.clone();
> + IndexWriterConfig clone = (IndexWriterConfig) super.clone();
> +
> + // Mostly shallow clone, but do a deepish clone of
> + // certain objects that have state that cannot be shared
> + // across IW instances:
> + clone.flushPolicy = flushPolicy.clone();
> + clone.indexerThreadPool = indexerThreadPool.clone();
> + clone.mergePolicy = mergePolicy.clone();
> +
> + return clone;
> } catch (CloneNotSupportedException e) {
> - // should not happen
> throw new RuntimeException(e);
> }
> -
> - // Mostly shallow clone, but do a deepish clone of
> - // certain objects that have state that cannot be shared
> - // across IW instances:
> - clone.inUseByIndexWriter = new AtomicBoolean();
> - clone.flushPolicy = flushPolicy.clone();
> - clone.indexerThreadPool = indexerThreadPool.clone();
> - clone.mergePolicy = mergePolicy.clone();
> -
> - return clone;
> - }
> -
> - /** Returns the default analyzer to use for indexing documents. */
> - public Analyzer getAnalyzer() {
> - return analyzer;
> }
> -
> +
> /** Specifies {@link OpenMode} of the index.
> *
> * <p>Only takes effect when IndexWriter is first created. */
> @@ -236,7 +171,7 @@ public final class IndexWriterConfig imp
> return this;
> }
>
> - /** Returns the {@link OpenMode} set by {@link #setOpenMode(OpenMode)}. */
> + @Override
> public OpenMode getOpenMode() {
> return openMode;
> }
> @@ -263,11 +198,7 @@ public final class IndexWriterConfig imp
> return this;
> }
>
> - /**
> - * Returns the {@link IndexDeletionPolicy} specified in
> - * {@link #setIndexDeletionPolicy(IndexDeletionPolicy)} or the default
> - * {@link KeepOnlyLastCommitDeletionPolicy}/
> - */
> + @Override
> public IndexDeletionPolicy getIndexDeletionPolicy() {
> return delPolicy;
> }
> @@ -282,11 +213,7 @@ public final class IndexWriterConfig imp
> return this;
> }
>
> - /**
> - * Returns the {@link IndexCommit} as specified in
> - * {@link #setIndexCommit(IndexCommit)} or the default, <code>null</code>
> - * which specifies to open the latest index commit point.
> - */
> + @Override
> public IndexCommit getIndexCommit() {
> return commit;
> }
> @@ -303,53 +230,12 @@ public final class IndexWriterConfig imp
> return this;
> }
>
> - /**
> - * Expert: returns the {@link Similarity} implementation used by this
> - * IndexWriter.
> - */
> + @Override
> public Similarity getSimilarity() {
> return similarity;
> }
>
> /**
> - * Expert: set the interval between indexed terms. Large values cause less
> - * memory to be used by IndexReader, but slow random-access to terms. Small
> - * values cause more memory to be used by an IndexReader, and speed
> - * random-access to terms.
> - * <p>
> - * This parameter determines the amount of computation required per query
> - * term, regardless of the number of documents that contain that term. In
> - * particular, it is the maximum number of other terms that must be scanned
> - * before a term is located and its frequency and position information may be
> - * processed. In a large index with user-entered query terms, query processing
> - * time is likely to be dominated not by term lookup but rather by the
> - * processing of frequency and positional data. In a small index or when many
> - * uncommon query terms are generated (e.g., by wildcard queries) term lookup
> - * may become a dominant cost.
> - * <p>
> - * In particular, <code>numUniqueTerms/interval</code> terms are read into
> - * memory by an IndexReader, and, on average, <code>interval/2</code> terms
> - * must be scanned for each random term access.
> - *
> - * @see #DEFAULT_TERM_INDEX_INTERVAL
> - *
> - * <p>Takes effect immediately, but only applies to newly
> - * flushed/merged segments. */
> - public IndexWriterConfig setTermIndexInterval(int interval) { // TODO: this should be private to the codec, not settable here
> - this.termIndexInterval = interval;
> - return this;
> - }
> -
> - /**
> - * Returns the interval between indexed terms.
> - *
> - * @see #setTermIndexInterval(int)
> - */
> - public int getTermIndexInterval() { // TODO: this should be private to the codec, not settable here
> - return termIndexInterval;
> - }
> -
> - /**
> * Expert: sets the merge scheduler used by this writer. The default is
> * {@link ConcurrentMergeScheduler}.
> * <p>
> @@ -362,10 +248,7 @@ public final class IndexWriterConfig imp
> return this;
> }
>
> - /**
> - * Returns the {@link MergeScheduler} that was set by
> - * {@link #setMergeScheduler(MergeScheduler)}
> - */
> + @Override
> public MergeScheduler getMergeScheduler() {
> return mergeScheduler;
> }
> @@ -381,174 +264,12 @@ public final class IndexWriterConfig imp
> return this;
> }
>
> - /**
> - * Returns allowed timeout when acquiring the write lock.
> - *
> - * @see #setWriteLockTimeout(long)
> - */
> + @Override
> public long getWriteLockTimeout() {
> return writeLockTimeout;
> }
>
> /**
> - * Determines the minimal number of delete terms required before the buffered
> - * in-memory delete terms and queries are applied and flushed.
> - * <p>Disabled by default (writer flushes by RAM usage).</p>
> - * <p>
> - * NOTE: This setting won't trigger a segment flush.
> - * </p>
> - *
> - * @throws IllegalArgumentException if maxBufferedDeleteTerms
> - * is enabled but smaller than 1
> - * @see #setRAMBufferSizeMB
> - * @see #setFlushPolicy(FlushPolicy)
> - *
> - * <p>Takes effect immediately, but only the next time a
> - * document is added, updated or deleted.
> - */
> - public IndexWriterConfig setMaxBufferedDeleteTerms(int maxBufferedDeleteTerms) {
> - if (maxBufferedDeleteTerms != DISABLE_AUTO_FLUSH
> - && maxBufferedDeleteTerms < 1)
> - throw new IllegalArgumentException(
> - "maxBufferedDeleteTerms must at least be 1 when enabled");
> - this.maxBufferedDeleteTerms = maxBufferedDeleteTerms;
> - return this;
> - }
> -
> - /**
> - * Returns the number of buffered deleted terms that will trigger a flush of all
> - * buffered deletes if enabled.
> - *
> - * @see #setMaxBufferedDeleteTerms(int)
> - */
> - public int getMaxBufferedDeleteTerms() {
> - return maxBufferedDeleteTerms;
> - }
> -
> - /**
> - * Determines the amount of RAM that may be used for buffering added documents
> - * and deletions before they are flushed to the Directory. Generally for
> - * faster indexing performance it's best to flush by RAM usage instead of
> - * document count and use as large a RAM buffer as you can.
> - * <p>
> - * When this is set, the writer will flush whenever buffered documents and
> - * deletions use this much RAM. Pass in {@link #DISABLE_AUTO_FLUSH} to prevent
> - * triggering a flush due to RAM usage. Note that if flushing by document
> - * count is also enabled, then the flush will be triggered by whichever comes
> - * first.
> - * <p>
> - * The maximum RAM limit is inherently determined by the JVMs available memory.
> - * Yet, an {@link IndexWriter} session can consume a significantly larger amount
> - * of memory than the given RAM limit since this limit is just an indicator when
> - * to flush memory resident documents to the Directory. Flushes are likely happen
> - * concurrently while other threads adding documents to the writer. For application
> - * stability the available memory in the JVM should be significantly larger than
> - * the RAM buffer used for indexing.
> - * <p>
> - * <b>NOTE</b>: the account of RAM usage for pending deletions is only
> - * approximate. Specifically, if you delete by Query, Lucene currently has no
> - * way to measure the RAM usage of individual Queries so the accounting will
> - * under-estimate and you should compensate by either calling commit()
> - * periodically yourself, or by using {@link #setMaxBufferedDeleteTerms(int)}
> - * to flush and apply buffered deletes by count instead of RAM usage
> - * (for each buffered delete Query a constant number of bytes is used to estimate
> - * RAM usage). Note that enabling {@link #setMaxBufferedDeleteTerms(int)} will
> - * not trigger any segment flushes.
> - * <p>
> - * <b>NOTE</b>: It's not guaranteed that all memory resident documents are flushed
> - * once this limit is exceeded. Depending on the configured {@link FlushPolicy} only a
> - * subset of the buffered documents are flushed and therefore only parts of the RAM
> - * buffer is released.
> - * <p>
> - *
> - * The default value is {@link #DEFAULT_RAM_BUFFER_SIZE_MB}.
> - * @see #setFlushPolicy(FlushPolicy)
> - * @see #setRAMPerThreadHardLimitMB(int)
> - *
> - * <p>Takes effect immediately, but only the next time a
> - * document is added, updated or deleted.
> - *
> - * @throws IllegalArgumentException
> - * if ramBufferSize is enabled but non-positive, or it disables
> - * ramBufferSize when maxBufferedDocs is already disabled
> - *
> - */
> - public IndexWriterConfig setRAMBufferSizeMB(double ramBufferSizeMB) {
> - if (ramBufferSizeMB != DISABLE_AUTO_FLUSH && ramBufferSizeMB <= 0.0)
> - throw new IllegalArgumentException(
> - "ramBufferSize should be > 0.0 MB when enabled");
> - if (ramBufferSizeMB == DISABLE_AUTO_FLUSH && maxBufferedDocs == DISABLE_AUTO_FLUSH)
> - throw new IllegalArgumentException(
> - "at least one of ramBufferSize and maxBufferedDocs must be enabled");
> - this.ramBufferSizeMB = ramBufferSizeMB;
> - return this;
> - }
> -
> - /** Returns the value set by {@link #setRAMBufferSizeMB(double)} if enabled. */
> - public double getRAMBufferSizeMB() {
> - return ramBufferSizeMB;
> - }
> -
> - /**
> - * Determines the minimal number of documents required before the buffered
> - * in-memory documents are flushed as a new Segment. Large values generally
> - * give faster indexing.
> - *
> - * <p>
> - * When this is set, the writer will flush every maxBufferedDocs added
> - * documents. Pass in {@link #DISABLE_AUTO_FLUSH} to prevent triggering a
> - * flush due to number of buffered documents. Note that if flushing by RAM
> - * usage is also enabled, then the flush will be triggered by whichever comes
> - * first.
> - *
> - * <p>
> - * Disabled by default (writer flushes by RAM usage).
> - *
> - * <p>Takes effect immediately, but only the next time a
> - * document is added, updated or deleted.
> - *
> - * @see #setRAMBufferSizeMB(double)
> - * @see #setFlushPolicy(FlushPolicy)
> - * @throws IllegalArgumentException
> - * if maxBufferedDocs is enabled but smaller than 2, or it disables
> - * maxBufferedDocs when ramBufferSize is already disabled
> - */
> - public IndexWriterConfig setMaxBufferedDocs(int maxBufferedDocs) {
> - if (maxBufferedDocs != DISABLE_AUTO_FLUSH && maxBufferedDocs < 2)
> - throw new IllegalArgumentException(
> - "maxBufferedDocs must at least be 2 when enabled");
> - if (maxBufferedDocs == DISABLE_AUTO_FLUSH
> - && ramBufferSizeMB == DISABLE_AUTO_FLUSH)
> - throw new IllegalArgumentException(
> - "at least one of ramBufferSize and maxBufferedDocs must be enabled");
> - this.maxBufferedDocs = maxBufferedDocs;
> - return this;
> - }
> -
> - /**
> - * Returns the number of buffered added documents that will trigger a flush if
> - * enabled.
> - *
> - * @see #setMaxBufferedDocs(int)
> - */
> - public int getMaxBufferedDocs() {
> - return maxBufferedDocs;
> - }
> -
> - /** Set the merged segment warmer. See {@link IndexReaderWarmer}.
> - *
> - * <p>Takes effect on the next merge. */
> - public IndexWriterConfig setMergedSegmentWarmer(IndexReaderWarmer mergeSegmentWarmer) {
> - this.mergedSegmentWarmer = mergeSegmentWarmer;
> - return this;
> - }
> -
> - /** Returns the current merged segment warmer. See {@link IndexReaderWarmer}. */
> - public IndexReaderWarmer getMergedSegmentWarmer() {
> - return mergedSegmentWarmer;
> - }
> -
> - /**
> * Expert: {@link MergePolicy} is invoked whenever there are changes to the
> * segments in the index. Its role is to select which merges to do, if any,
> * and return a {@link MergePolicy.MergeSpecification} describing the merges.
> @@ -561,25 +282,24 @@ public final class IndexWriterConfig imp
> return this;
> }
>
> - /** Set the Codec. See {@link Codec}.
> - *
> - * <p>Only takes effect when IndexWriter is first created. */
> + /**
> + * Set the {@link Codec}.
> + *
> + * <p>
> + * Only takes effect when IndexWriter is first created.
> + */
> public IndexWriterConfig setCodec(Codec codec) {
> this.codec = codec;
> return this;
> }
>
> - /** Returns the current Codec. See {@link Codec}. */
> + @Override
> public Codec getCodec() {
> return codec;
> }
>
>
> - /**
> - * Returns the current MergePolicy in use by this writer.
> - *
> - * @see #setMergePolicy(MergePolicy)
> - */
> + @Override
> public MergePolicy getMergePolicy() {
> return mergePolicy;
> }
> @@ -600,17 +320,15 @@ public final class IndexWriterConfig imp
> * NOTE: This only takes effect when IndexWriter is first created.</p>*/
> IndexWriterConfig setIndexerThreadPool(DocumentsWriterPerThreadPool threadPool) {
> if (threadPool == null) {
> - throw new IllegalArgumentException("DocumentsWriterPerThreadPool must not be nul");
> + throw new IllegalArgumentException("threadPool must not be null");
> }
> this.indexerThreadPool = threadPool;
> return this;
> }
>
> - /** Returns the configured {@link DocumentsWriterPerThreadPool} instance.
> - * @see #setIndexerThreadPool(DocumentsWriterPerThreadPool)
> - * @return the configured {@link DocumentsWriterPerThreadPool} instance.*/
> + @Override
> DocumentsWriterPerThreadPool getIndexerThreadPool() {
> - return this.indexerThreadPool;
> + return indexerThreadPool;
> }
>
> /**
> @@ -625,8 +343,7 @@ public final class IndexWriterConfig imp
> return this;
> }
>
> - /** Returns the max number of simultaneous threads that
> - * may be indexing documents at once in IndexWriter. */
> + @Override
> public int getMaxThreadStates() {
> try {
> return ((ThreadAffinityDocumentsWriterThreadPool) indexerThreadPool).getMaxThreadStates();
> @@ -650,8 +367,7 @@ public final class IndexWriterConfig imp
> return this;
> }
>
> - /** Returns true if IndexWriter should pool readers even
> - * if {@link DirectoryReader#open(IndexWriter, boolean)} has not been called. */
> + @Override
> public boolean getReaderPooling() {
> return readerPooling;
> }
> @@ -664,34 +380,11 @@ public final class IndexWriterConfig imp
> return this;
> }
>
> - /** Returns the indexing chain set on {@link #setIndexingChain(IndexingChain)}. */
> + @Override
> IndexingChain getIndexingChain() {
> return indexingChain;
> }
>
> - /** Sets the termsIndexDivisor passed to any readers that
> - * IndexWriter opens, for example when applying deletes
> - * or creating a near-real-time reader in {@link
> - * DirectoryReader#open(IndexWriter, boolean)}. If you pass -1, the terms index
> - * won't be loaded by the readers. This is only useful in
> - * advanced situations when you will only .next() through
> - * all terms; attempts to seek will hit an exception.
> - *
> - * <p>Takes effect immediately, but only applies to
> - * readers opened after this call */
> - public IndexWriterConfig setReaderTermsIndexDivisor(int divisor) {
> - if (divisor <= 0 && divisor != -1) {
> - throw new IllegalArgumentException("divisor must be >= 1, or -1 (got " + divisor + ")");
> - }
> - readerTermsIndexDivisor = divisor;
> - return this;
> - }
> -
> - /** @see #setReaderTermsIndexDivisor(int) */
> - public int getReaderTermsIndexDivisor() {
> - return readerTermsIndexDivisor;
> - }
> -
> /**
> * Expert: Controls when segments are flushed to disk during indexing.
> * The {@link FlushPolicy} initialized during {@link IndexWriter} instantiation and once initialized
> @@ -724,28 +417,56 @@ public final class IndexWriterConfig imp
> return this;
> }
>
> - /**
> - * Returns the max amount of memory each {@link DocumentsWriterPerThread} can
> - * consume until forcefully flushed.
> - * @see #setRAMPerThreadHardLimitMB(int)
> - */
> + @Override
> public int getRAMPerThreadHardLimitMB() {
> return perThreadHardLimitMB;
> }
> - /**
> - * @see #setFlushPolicy(FlushPolicy)
> - */
> +
> + @Override
> public FlushPolicy getFlushPolicy() {
> return flushPolicy;
> }
>
> - /**
> - * @see #setInfoStream(InfoStream)
> - */
> + @Override
> public InfoStream getInfoStream() {
> return infoStream;
> }
>
> + @Override
> + public Analyzer getAnalyzer() {
> + return super.getAnalyzer();
> + }
> +
> + @Override
> + public int getMaxBufferedDeleteTerms() {
> + return super.getMaxBufferedDeleteTerms();
> + }
> +
> + @Override
> + public int getMaxBufferedDocs() {
> + return super.getMaxBufferedDocs();
> + }
> +
> + @Override
> + public IndexReaderWarmer getMergedSegmentWarmer() {
> + return super.getMergedSegmentWarmer();
> + }
> +
> + @Override
> + public double getRAMBufferSizeMB() {
> + return super.getRAMBufferSizeMB();
> + }
> +
> + @Override
> + public int getReaderTermsIndexDivisor() {
> + return super.getReaderTermsIndexDivisor();
> + }
> +
> + @Override
> + public int getTermIndexInterval() {
> + return super.getTermIndexInterval();
> + }
> +
> /** If non-null, information about merges, deletes and a
> * message when maxFieldLength is reached will be printed
> * to this.
> @@ -759,40 +480,39 @@ public final class IndexWriterConfig imp
> return this;
> }
>
> - /**
> - * Convenience method that uses {@link PrintStreamInfoStream}
> - */
> + /** Convenience method that uses {@link PrintStreamInfoStream} */
> public IndexWriterConfig setInfoStream(PrintStream printStream) {
> return setInfoStream(printStream == null ? InfoStream.NO_OUTPUT : new PrintStreamInfoStream(printStream));
> }
> -
> +
> @Override
> - public String toString() {
> - StringBuilder sb = new StringBuilder();
> - sb.append("matchVersion=").append(matchVersion).append("\n");
> - sb.append("analyzer=").append(analyzer == null ? "null" : analyzer.getClass().getName()).append("\n");
> - sb.append("delPolicy=").append(delPolicy.getClass().getName()).append("\n");
> - sb.append("commit=").append(commit == null ? "null" : commit).append("\n");
> - sb.append("openMode=").append(openMode).append("\n");
> - sb.append("similarity=").append(similarity.getClass().getName()).append("\n");
> - sb.append("termIndexInterval=").append(termIndexInterval).append("\n"); // TODO: this should be private to the codec, not settable here
> - sb.append("mergeScheduler=").append(mergeScheduler.getClass().getName()).append("\n");
> - sb.append("default WRITE_LOCK_TIMEOUT=").append(WRITE_LOCK_TIMEOUT).append("\n");
> - sb.append("writeLockTimeout=").append(writeLockTimeout).append("\n");
> - sb.append("maxBufferedDeleteTerms=").append(maxBufferedDeleteTerms).append("\n");
> - sb.append("ramBufferSizeMB=").append(ramBufferSizeMB).append("\n");
> - sb.append("maxBufferedDocs=").append(maxBufferedDocs).append("\n");
> - sb.append("mergedSegmentWarmer=").append(mergedSegmentWarmer).append("\n");
> - sb.append("codec=").append(codec).append("\n");
> - sb.append("infoStream=").append(infoStream.getClass().getName()).append("\n");
> - sb.append("mergePolicy=").append(mergePolicy).append("\n");
> - sb.append("indexerThreadPool=").append(indexerThreadPool).append("\n");
> - sb.append("readerPooling=").append(readerPooling).append("\n");
> - sb.append("readerTermsIndexDivisor=").append(readerTermsIndexDivisor).append("\n");
> - sb.append("flushPolicy=").append(flushPolicy).append("\n");
> - sb.append("perThreadHardLimitMB=").append(perThreadHardLimitMB).append("\n");
> -
> - return sb.toString();
> + public IndexWriterConfig setMaxBufferedDeleteTerms(int maxBufferedDeleteTerms) {
> + return (IndexWriterConfig) super.setMaxBufferedDeleteTerms(maxBufferedDeleteTerms);
> + }
> +
> + @Override
> + public IndexWriterConfig setMaxBufferedDocs(int maxBufferedDocs) {
> + return (IndexWriterConfig) super.setMaxBufferedDocs(maxBufferedDocs);
> + }
> +
> + @Override
> + public IndexWriterConfig setMergedSegmentWarmer(IndexReaderWarmer mergeSegmentWarmer) {
> + return (IndexWriterConfig) super.setMergedSegmentWarmer(mergeSegmentWarmer);
> + }
> +
> + @Override
> + public IndexWriterConfig setRAMBufferSizeMB(double ramBufferSizeMB) {
> + return (IndexWriterConfig) super.setRAMBufferSizeMB(ramBufferSizeMB);
> + }
> +
> + @Override
> + public IndexWriterConfig setReaderTermsIndexDivisor(int divisor) {
> + return (IndexWriterConfig) super.setReaderTermsIndexDivisor(divisor);
> + }
> +
> + @Override
> + public IndexWriterConfig setTermIndexInterval(int interval) {
> + return (IndexWriterConfig) super.setTermIndexInterval(interval);
> }
>
> }
>
> Modified: lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestFlushByRamOrCountsPolicy.java
> URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestFlushByRamOrCountsPolicy.java?rev=1351229&r1=1351228&r2=1351229&view=diff
> ==============================================================================
> --- lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestFlushByRamOrCountsPolicy.java (original)
> +++ lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestFlushByRamOrCountsPolicy.java Mon Jun 18 08:24:25 2012
> @@ -294,7 +294,7 @@ public class TestFlushByRamOrCountsPolic
>
> public class IndexThread extends Thread {
> IndexWriter writer;
> - IndexWriterConfig iwc;
> + LiveIndexWriterConfig iwc;
> LineFileDocs docs;
> private AtomicInteger pendingDocs;
> private final boolean doRandomCommit;
>
> Modified: lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterConfig.java
> URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterConfig.java?rev=1351229&r1=1351228&r2=1351229&view=diff
> ==============================================================================
> --- lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterConfig.java (original)
> +++ lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterConfig.java Mon Jun 18 08:24:25 2012
> @@ -25,8 +25,6 @@ import java.util.Set;
>
> import org.apache.lucene.analysis.MockAnalyzer;
> import org.apache.lucene.codecs.Codec;
> -import org.apache.lucene.document.Document;
> -import org.apache.lucene.document.Field.Store;
> import org.apache.lucene.index.DocumentsWriterPerThread.IndexingChain;
> import org.apache.lucene.index.IndexWriterConfig.OpenMode;
> import org.apache.lucene.search.IndexSearcher;
> @@ -114,19 +112,71 @@ public class TestIndexWriterConfig exten
>
> @Test
> public void testSettersChaining() throws Exception {
> - // Ensures that every setter returns IndexWriterConfig to enable easy
> - // chaining.
> + // Ensures that every setter returns IndexWriterConfig to allow chaining.
> + HashSet<String> liveSetters = new HashSet<String>();
> + HashSet<String> allSetters = new HashSet<String>();
> 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());
> + if (m.getName().startsWith("set") && !Modifier.isStatic(m.getModifiers())) {
> + allSetters.add(m.getName());
> + // setters overridden from LiveIndexWriterConfig are returned twice, once with
> + // IndexWriterConfig return type and second with LiveIndexWriterConfig. The ones
> + // from LiveIndexWriterConfig are marked 'synthetic', so just collect them and
> + // assert in the end that we also received them from IWC.
> + if (m.isSynthetic()) {
> + liveSetters.add(m.getName());
> + } else {
> + assertEquals("method " + m.getName() + " does not return IndexWriterConfig",
> + IndexWriterConfig.class, m.getReturnType());
> + }
> }
> }
> + for (String setter : liveSetters) {
> + assertTrue("setter method not overridden by IndexWriterConfig: " + setter, allSetters.contains(setter));
> + }
> }
>
> @Test
> + public void testReuse() throws Exception {
> + Directory dir = newDirectory();
> + // test that if the same IWC is reused across two IWs, it is cloned by each.
> + IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, null);
> + RandomIndexWriter iw = new RandomIndexWriter(random(), dir, conf);
> + LiveIndexWriterConfig liveConf1 = iw.w.getConfig();
> + iw.close();
> +
> + iw = new RandomIndexWriter(random(), dir, conf);
> + LiveIndexWriterConfig liveConf2 = iw.w.getConfig();
> + iw.close();
> +
> + // LiveIndexWriterConfig's "copy" constructor doesn't clone objects.
> + assertNotSame("IndexWriterConfig should have been cloned", liveConf1.getMergePolicy(), liveConf2.getMergePolicy());
> +
> + dir.close();
> + }
> +
> + @Test
> + public void testOverrideGetters() throws Exception {
> + // Test that IndexWriterConfig overrides all getters, so that javadocs
> + // contain all methods for the users. Also, ensures that IndexWriterConfig
> + // doesn't declare getters that are not declared on LiveIWC.
> + HashSet<String> liveGetters = new HashSet<String>();
> + for (Method m : LiveIndexWriterConfig.class.getDeclaredMethods()) {
> + if (m.getName().startsWith("get") && !Modifier.isStatic(m.getModifiers())) {
> + liveGetters.add(m.getName());
> + }
> + }
> +
> + for (Method m : IndexWriterConfig.class.getDeclaredMethods()) {
> + if (m.getName().startsWith("get") && !Modifier.isStatic(m.getModifiers())) {
> + assertEquals("method " + m.getName() + " not overrided by IndexWriterConfig",
> + IndexWriterConfig.class, m.getDeclaringClass());
> + assertTrue("method " + m.getName() + " not declared on LiveIndexWriterConfig",
> + liveGetters.contains(m.getName()));
> + }
> + }
> + }
> +
> + @Test
> public void testConstants() throws Exception {
> // Tests that the values of the constants does not change
> assertEquals(1000, IndexWriterConfig.WRITE_LOCK_TIMEOUT);
> @@ -276,53 +326,4 @@ public class TestIndexWriterConfig exten
> assertEquals(LogByteSizeMergePolicy.class, conf.getMergePolicy().getClass());
> }
>
> - public void testReuse() throws Exception {
> - IndexWriterConfig iwc = newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random()));
> - Directory dir = newDirectory();
> - Document doc = new Document();
> - doc.add(newTextField("foo", "bar", Store.YES));
> - RandomIndexWriter riw = new RandomIndexWriter(random(), dir, iwc);
> - riw.addDocument(doc);
> - riw.close();
> -
> - // Sharing IWC should be fine:
> - riw = new RandomIndexWriter(random(), dir, iwc);
> - riw.addDocument(doc);
> - riw.close();
> -
> - dir.close();
> - }
> -
> - public void testIWCClone() throws Exception {
> - IndexWriterConfig iwc = newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random()));
> - Directory dir = newDirectory();
> - RandomIndexWriter riw = new RandomIndexWriter(random(), dir, iwc);
> -
> - // Cannot clone IW's private IWC clone:
> - try {
> - riw.w.getConfig().clone();
> - fail("did not hit expected exception");
> - } catch (IllegalStateException ise) {
> - // expected
> - }
> - riw.close();
> - dir.close();
> - }
> -
> - public void testIWCInvalidReuse() throws Exception {
> - IndexWriterConfig iwc = newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random()));
> - Directory dir = newDirectory();
> - RandomIndexWriter riw = new RandomIndexWriter(random(), dir, iwc);
> - IndexWriterConfig privateIWC = riw.w.getConfig();
> - riw.close();
> -
> - // Cannot clone IW's private IWC clone:
> - try {
> - new RandomIndexWriter(random(), dir, privateIWC);
> - fail("did not hit expected exception");
> - } catch (IllegalStateException ise) {
> - // expected
> - }
> - dir.close();
> - }
> }
>
>
--
lucidimagination.com
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@lucene.apache.org
For additional commands, e-mail: dev-help@lucene.apache.org