Author: gsingers
Date: Thu Jun 26 14:14:06 2008
New Revision: 672031

URL: http://svn.apache.org/viewvc?rev=672031&view=rev
Log:
SOLR-603: Add partial optimize capabilities and deprecate DirectUpdateHandler

Added:
    
lucene/solr/trunk/src/test/org/apache/solr/update/DirectUpdateHandlerOptimizeTest.java
   (with props)
    lucene/solr/trunk/src/test/test-files/solr/conf/solrconfig-duh-optimize.xml
      - copied, changed from r670009, 
lucene/solr/trunk/src/test/test-files/solr/conf/solrconfig.xml
Modified:
    lucene/solr/trunk/CHANGES.txt
    
lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/SolrServer.java
    
lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/request/UpdateRequest.java
    lucene/solr/trunk/src/java/org/apache/solr/common/params/UpdateParams.java
    lucene/solr/trunk/src/java/org/apache/solr/handler/RequestHandlerUtils.java
    
lucene/solr/trunk/src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java
    lucene/solr/trunk/src/java/org/apache/solr/update/CommitUpdateCommand.java
    lucene/solr/trunk/src/java/org/apache/solr/update/DirectUpdateHandler.java
    lucene/solr/trunk/src/java/org/apache/solr/update/DirectUpdateHandler2.java

Modified: lucene/solr/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/lucene/solr/trunk/CHANGES.txt?rev=672031&r1=672030&r2=672031&view=diff
==============================================================================
--- lucene/solr/trunk/CHANGES.txt (original)
+++ lucene/solr/trunk/CHANGES.txt Thu Jun 26 14:14:06 2008
@@ -298,6 +298,8 @@
               (Shalin Shekhar Mangar, Bojan Smid, gsingers)
 
 54. SOLR-423: Added Request Handler close hook notification so that 
RequestHandlers can be notified when a core is closing.  (gsingers, ryan)
+
+55. SOLR-603: Added ability to partially optimize. (gsingers)
     
 Changes in runtime behavior
  1. SOLR-559: use Lucene updateDocument, deleteDocuments methods.  This

Modified: 
lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/SolrServer.java
URL: 
http://svn.apache.org/viewvc/lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/SolrServer.java?rev=672031&r1=672030&r2=672031&view=diff
==============================================================================
--- 
lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/SolrServer.java
 (original)
+++ 
lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/SolrServer.java
 Thu Jun 26 14:14:06 2008
@@ -95,7 +95,7 @@
    * @throws IOException 
    */
   public UpdateResponse optimize( ) throws SolrServerException, IOException {
-    return optimize(true, true);
+    return optimize(true, true, 1);
   }
   
   public UpdateResponse commit( boolean waitFlush, boolean waitSearcher ) 
throws SolrServerException, IOException {
@@ -103,7 +103,11 @@
   }
 
   public UpdateResponse optimize( boolean waitFlush, boolean waitSearcher ) 
throws SolrServerException, IOException {
-    return new UpdateRequest().setAction( UpdateRequest.ACTION.OPTIMIZE, 
waitFlush, waitSearcher ).process( this );
+    return optimize(waitFlush, waitSearcher, 1);
+  }
+
+  public UpdateResponse optimize(boolean waitFlush, boolean waitSearcher, int 
maxSegments ) throws SolrServerException, IOException {
+    return new UpdateRequest().setAction( UpdateRequest.ACTION.OPTIMIZE, 
waitFlush, waitSearcher, maxSegments ).process( this );
   }
 
   public UpdateResponse deleteById(String id) throws SolrServerException, 
IOException {

Modified: 
lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/request/UpdateRequest.java
URL: 
http://svn.apache.org/viewvc/lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/request/UpdateRequest.java?rev=672031&r1=672030&r2=672031&view=diff
==============================================================================
--- 
lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/request/UpdateRequest.java
 (original)
+++ 
lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/request/UpdateRequest.java
 Thu Jun 26 14:14:06 2008
@@ -127,11 +127,16 @@
 
   /** Sets appropriate parameters for the given ACTION */
   public UpdateRequest setAction(ACTION action, boolean waitFlush, boolean 
waitSearcher ) {
+    return setAction(action, waitFlush, waitSearcher, 1);
+  }
+
+  public UpdateRequest setAction(ACTION action, boolean waitFlush, boolean 
waitSearcher, int maxSegments ) {
     if (params == null)
       params = new ModifiableSolrParams();
 
     if( action == ACTION.OPTIMIZE ) {
       params.set( UpdateParams.OPTIMIZE, "true" );
+      params.set(UpdateParams.MAX_OPTIMIZE_SEGMENTS, maxSegments);
     }
     else if( action == ACTION.COMMIT ) {
       params.set( UpdateParams.COMMIT, "true" );
@@ -140,6 +145,7 @@
     params.set( UpdateParams.WAIT_SEARCHER, waitSearcher+"" );
     return this;
   }
+  
 
   public void setParam(String param, String value) {
     if (params == null)

Modified: 
lucene/solr/trunk/src/java/org/apache/solr/common/params/UpdateParams.java
URL: 
http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/common/params/UpdateParams.java?rev=672031&r1=672030&r2=672031&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/common/params/UpdateParams.java 
(original)
+++ lucene/solr/trunk/src/java/org/apache/solr/common/params/UpdateParams.java 
Thu Jun 26 14:14:06 2008
@@ -42,4 +42,8 @@
 
   /** Select the update processor to use.  A RequestHandler may or may not 
respect this parameter */
   public static final String UPDATE_PROCESSOR = "update.processor";
+  /**
+   * If optimizing, set the maximum number of segments left in the index after 
optimization.  1 is the default (and is equivalent to calling 
IndexWriter.optimize() in Lucene).
+   */
+  public static final String MAX_OPTIMIZE_SEGMENTS = "maxSegments";
 }

Modified: 
lucene/solr/trunk/src/java/org/apache/solr/handler/RequestHandlerUtils.java
URL: 
http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/handler/RequestHandlerUtils.java?rev=672031&r1=672030&r2=672031&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/handler/RequestHandlerUtils.java 
(original)
+++ lucene/solr/trunk/src/java/org/apache/solr/handler/RequestHandlerUtils.java 
Thu Jun 26 14:14:06 2008
@@ -67,6 +67,7 @@
       CommitUpdateCommand cmd = new CommitUpdateCommand( optimize );
       cmd.waitFlush    = params.getBool( UpdateParams.WAIT_FLUSH,    
cmd.waitFlush    );
       cmd.waitSearcher = params.getBool( UpdateParams.WAIT_SEARCHER, 
cmd.waitSearcher );
+      cmd.maxOptimizeSegments = 
params.getInt(UpdateParams.MAX_OPTIMIZE_SEGMENTS, cmd.maxOptimizeSegments);
       req.getCore().getUpdateHandler().commit( cmd );
       
       // Lets wait till after solr1.2 to define consistent output format
@@ -99,6 +100,7 @@
       CommitUpdateCommand cmd = new CommitUpdateCommand( optimize );
       cmd.waitFlush    = params.getBool( UpdateParams.WAIT_FLUSH,    
cmd.waitFlush    );
       cmd.waitSearcher = params.getBool( UpdateParams.WAIT_SEARCHER, 
cmd.waitSearcher );
+      cmd.maxOptimizeSegments = 
params.getInt(UpdateParams.MAX_OPTIMIZE_SEGMENTS, cmd.maxOptimizeSegments);
       processor.processCommit( cmd );
       return true;
     }

Modified: 
lucene/solr/trunk/src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java
URL: 
http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java?rev=672031&r1=672030&r2=672031&view=diff
==============================================================================
--- 
lucene/solr/trunk/src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java 
(original)
+++ 
lucene/solr/trunk/src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java 
Thu Jun 26 14:14:06 2008
@@ -20,6 +20,7 @@
 import java.io.IOException;
 import java.io.Reader;
 import java.io.Writer;
+import java.io.File;
 import java.util.HashMap;
 import java.util.logging.Logger;
 
@@ -75,7 +76,8 @@
   public static final String ALLOW_DUPS = "allowDups"; 
 
   XMLInputFactory inputFactory;
-  
+
+
   @Override
   public void init(NamedList args)
   {
@@ -210,7 +212,10 @@
               } else if (WAIT_SEARCHER.equals(attrName)) {
                 cmd.waitSearcher = StrUtils.parseBoolean(attrVal);
                 sawWaitSearcher = true;
-              } else {
+              } else if (UpdateParams.MAX_OPTIMIZE_SEGMENTS.equals(attrName)){
+                cmd.maxOptimizeSegments = Integer.parseInt(attrVal);
+              }
+                else {
                 log.warning("unexpected attribute commit/@" + attrName);
               }
             }

Modified: 
lucene/solr/trunk/src/java/org/apache/solr/update/CommitUpdateCommand.java
URL: 
http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/update/CommitUpdateCommand.java?rev=672031&r1=672030&r2=672031&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/update/CommitUpdateCommand.java 
(original)
+++ lucene/solr/trunk/src/java/org/apache/solr/update/CommitUpdateCommand.java 
Thu Jun 26 14:14:06 2008
@@ -24,6 +24,13 @@
   public boolean waitFlush;
   public boolean waitSearcher=true;
 
+  /**
+   * During optimize, optimize down to <= this many segments.  Must be >= 1
+   *
+   * @see [EMAIL PROTECTED] org.apache.lucene.index.IndexWriter#optimize(int)}
+   */
+  public int maxOptimizeSegments = 1;
+
   public CommitUpdateCommand(boolean optimize) {
     super("commit");
     this.optimize=optimize;

Modified: 
lucene/solr/trunk/src/java/org/apache/solr/update/DirectUpdateHandler.java
URL: 
http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/update/DirectUpdateHandler.java?rev=672031&r1=672030&r2=672031&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/update/DirectUpdateHandler.java 
(original)
+++ lucene/solr/trunk/src/java/org/apache/solr/update/DirectUpdateHandler.java 
Thu Jun 26 14:14:06 2008
@@ -49,6 +49,8 @@
  *
  * @version $Id$
  * @since solr 0.9
+ *
+ * @deprecated Use [EMAIL PROTECTED] DirectUpdateHandler2} instead.  This is 
only kept around for back-compatibility (way back).
  */
 
 public class DirectUpdateHandler extends UpdateHandler {
@@ -236,7 +238,7 @@
       closeSearcher();  // flush any deletes
       if (cmd.optimize) {
         openWriter();  // writer needs to be open to optimize
-        writer.optimize();
+        writer.optimize(cmd.maxOptimizeSegments);
       }
       closeWriter();
 

Modified: 
lucene/solr/trunk/src/java/org/apache/solr/update/DirectUpdateHandler2.java
URL: 
http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/update/DirectUpdateHandler2.java?rev=672031&r1=672030&r2=672031&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/update/DirectUpdateHandler2.java 
(original)
+++ lucene/solr/trunk/src/java/org/apache/solr/update/DirectUpdateHandler2.java 
Thu Jun 26 14:14:06 2008
@@ -360,8 +360,8 @@
 
       if (cmd.optimize) {
         closeSearcher();
-        openWriter(); 
-        writer.optimize();
+        openWriter();
+        writer.optimize(cmd.maxOptimizeSegments);
       }
 
       closeSearcher();
@@ -402,8 +402,6 @@
         SolrException.log(log,e);
       }
     }
-
-    return;
   }
 
 
@@ -521,7 +519,8 @@
       try {
         CommitUpdateCommand command = new CommitUpdateCommand( false );
         command.waitFlush = true;
-        command.waitSearcher = true; 
+        command.waitSearcher = true;
+        //no need for command.maxOptimizeSegments = 1;  since it is not 
optimizing
         commit( command );
         autoCommitCount++;
       } 

Added: 
lucene/solr/trunk/src/test/org/apache/solr/update/DirectUpdateHandlerOptimizeTest.java
URL: 
http://svn.apache.org/viewvc/lucene/solr/trunk/src/test/org/apache/solr/update/DirectUpdateHandlerOptimizeTest.java?rev=672031&view=auto
==============================================================================
--- 
lucene/solr/trunk/src/test/org/apache/solr/update/DirectUpdateHandlerOptimizeTest.java
 (added)
+++ 
lucene/solr/trunk/src/test/org/apache/solr/update/DirectUpdateHandlerOptimizeTest.java
 Thu Jun 26 14:14:06 2008
@@ -0,0 +1,94 @@
+package org.apache.solr.update;
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+import org.apache.solr.core.SolrCore;
+import org.apache.solr.util.AbstractSolrTestCase;
+
+import java.io.File;
+import java.io.FileFilter;
+
+
+/**
+ *
+ *
+ **/
+public class DirectUpdateHandlerOptimizeTest extends AbstractSolrTestCase {
+
+  public String getSchemaFile() {
+    return "schema.xml";
+  }
+
+  public String getSolrConfigFile() {
+    return "solrconfig-duh-optimize.xml";
+  }
+
+
+  public void testOptimize() throws Exception {
+    SolrCore core = h.getCore();
+
+    UpdateHandler updater = core.getUpdateHandler();
+    AddUpdateCommand cmd = new AddUpdateCommand();
+    cmd.overwriteCommitted = true;
+    cmd.overwritePending = true;
+    cmd.allowDups = false;
+    //add just under the merge factor, so no segments are merged
+    //the merge factor is 1000 and the maxBufferedDocs is 2, so there should 
be 500 segments (498 segs each w/ 2 docs, and 1 segment with 1 doc)
+    for (int i = 0; i < 999; i++) {
+      // Add a valid document
+      cmd.doc = new Document();
+      cmd.doc.add(new Field("id", "id_" + i, Field.Store.YES, 
Field.Index.UN_TOKENIZED));
+      cmd.doc.add(new Field("subject", "subject_" + i, Field.Store.NO, 
Field.Index.TOKENIZED));
+      updater.addDoc(cmd);
+    }
+
+    CommitUpdateCommand cmtCmd = new CommitUpdateCommand(false);
+    updater.commit(cmtCmd);
+
+    String indexDir = core.getIndexDir();
+    assertNumSegments(indexDir, 500);
+
+    //now do an optimize
+    cmtCmd = new CommitUpdateCommand(true);
+    cmtCmd.maxOptimizeSegments = 250;
+    updater.commit(cmtCmd);
+    assertNumSegments(indexDir, 250);
+
+    cmtCmd.maxOptimizeSegments = -1;
+    try {
+      updater.commit(cmtCmd);
+      assertTrue(false);
+    } catch (IllegalArgumentException e) {
+    }
+    cmtCmd.maxOptimizeSegments = 1;
+    updater.commit(cmtCmd);
+    assertNumSegments(indexDir, 1);
+  }
+
+  private void assertNumSegments(String indexDir, int numSegs) {
+    File file = new File(indexDir);
+    File[] segs = file.listFiles(new FileFilter() {
+      public boolean accept(File file) {
+        return file.getName().endsWith("tii");
+      }
+    });
+    assertTrue("Wrong number of segments: " + segs.length + " does not equal: 
" + numSegs, segs.length == numSegs);
+  }
+
+}

Propchange: 
lucene/solr/trunk/src/test/org/apache/solr/update/DirectUpdateHandlerOptimizeTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Copied: 
lucene/solr/trunk/src/test/test-files/solr/conf/solrconfig-duh-optimize.xml 
(from r670009, lucene/solr/trunk/src/test/test-files/solr/conf/solrconfig.xml)
URL: 
http://svn.apache.org/viewvc/lucene/solr/trunk/src/test/test-files/solr/conf/solrconfig-duh-optimize.xml?p2=lucene/solr/trunk/src/test/test-files/solr/conf/solrconfig-duh-optimize.xml&p1=lucene/solr/trunk/src/test/test-files/solr/conf/solrconfig.xml&r1=670009&r2=672031&rev=672031&view=diff
==============================================================================
--- lucene/solr/trunk/src/test/test-files/solr/conf/solrconfig.xml (original)
+++ lucene/solr/trunk/src/test/test-files/solr/conf/solrconfig-duh-optimize.xml 
Thu Jun 26 14:14:06 2008
@@ -34,7 +34,9 @@
    unless overridden. -->
     <!-- Values here affect all index writers and act as a default unless 
overridden. -->
     <useCompoundFile>false</useCompoundFile>
-    <mergeFactor>10</mergeFactor>
+    <!-- Set a high merge factor, so we get lots of segments -->
+    <mergeFactor>1000</mergeFactor>
+    <maxBufferedDocs>2</maxBufferedDocs>
     <!-- If both ramBufferSizeMB and maxBufferedDocs is set, then Lucene will 
flush based on whichever limit is hit first.
      -->
     <!--<maxBufferedDocs>1000</maxBufferedDocs>-->
@@ -44,7 +46,7 @@
     If both ramBufferSizeMB and maxBufferedDocs is set, then Lucene will flush 
based on whichever limit is hit first.
 
     -->
-    <ramBufferSizeMB>32</ramBufferSizeMB>
+
     <maxMergeDocs>2147483647</maxMergeDocs>
     <maxFieldLength>10000</maxFieldLength>
     <writeLockTimeout>1000</writeLockTimeout>
@@ -86,8 +88,8 @@
   <mainIndex>
     <!-- lucene options specific to the main on-disk lucene index -->
     <useCompoundFile>false</useCompoundFile>
-    <mergeFactor>10</mergeFactor>
-    <ramBufferSizeMB>32</ramBufferSizeMB>
+    <mergeFactor>1000</mergeFactor>
+    <maxBufferedDocs>2</maxBufferedDocs>
     <maxMergeDocs>2147483647</maxMergeDocs>
     <maxFieldLength>10000</maxFieldLength>
 


Reply via email to