You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2011/06/29 00:33:44 UTC

svn commit: r1140874 - in /lucene/dev/branches/branch_3x: ./ lucene/ lucene/backwards/ lucene/backwards/src/test-framework/ lucene/backwards/src/test/ lucene/contrib/ lucene/contrib/join/ lucene/contrib/join/src/java/org/apache/lucene/search/join/ luce...

Author: mikemccand
Date: Tue Jun 28 22:33:43 2011
New Revision: 1140874

URL: http://svn.apache.org/viewvc?rev=1140874&view=rev
Log:
LUCENE-3171: add lucene/contrib/join to enable joining parent + child documents when indexed as a doc block

Added:
    lucene/dev/branches/branch_3x/lucene/contrib/join/
      - copied from r1140852, lucene/dev/trunk/modules/join/
Modified:
    lucene/dev/branches/branch_3x/   (props changed)
    lucene/dev/branches/branch_3x/lucene/   (props changed)
    lucene/dev/branches/branch_3x/lucene/backwards/   (props changed)
    lucene/dev/branches/branch_3x/lucene/backwards/src/test/   (props changed)
    lucene/dev/branches/branch_3x/lucene/backwards/src/test-framework/   (props changed)
    lucene/dev/branches/branch_3x/lucene/build.xml
    lucene/dev/branches/branch_3x/lucene/contrib/CHANGES.txt
    lucene/dev/branches/branch_3x/lucene/contrib/join/build.xml
    lucene/dev/branches/branch_3x/lucene/contrib/join/src/java/org/apache/lucene/search/join/BlockJoinCollector.java
    lucene/dev/branches/branch_3x/lucene/contrib/join/src/java/org/apache/lucene/search/join/BlockJoinQuery.java
    lucene/dev/branches/branch_3x/lucene/contrib/join/src/test/org/apache/lucene/search/TestBlockJoin.java
    lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldComparator.java
    lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldValueHitQueue.java
    lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/Query.java
    lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/TopFieldCollector.java
    lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/util/ArrayUtil.java
    lucene/dev/branches/branch_3x/lucene/src/site/build/site/contributions.html
    lucene/dev/branches/branch_3x/lucene/src/site/build/site/demo.html
    lucene/dev/branches/branch_3x/lucene/src/site/build/site/demo2.html
    lucene/dev/branches/branch_3x/lucene/src/site/build/site/fileformats.html
    lucene/dev/branches/branch_3x/lucene/src/site/build/site/gettingstarted.html
    lucene/dev/branches/branch_3x/lucene/src/site/build/site/index.html
    lucene/dev/branches/branch_3x/lucene/src/site/build/site/linkmap.html
    lucene/dev/branches/branch_3x/lucene/src/site/build/site/lucene-contrib/index.html
    lucene/dev/branches/branch_3x/lucene/src/site/build/site/queryparsersyntax.html
    lucene/dev/branches/branch_3x/lucene/src/site/build/site/scoring.html
    lucene/dev/branches/branch_3x/lucene/src/site/build/site/systemrequirements.html
    lucene/dev/branches/branch_3x/lucene/src/site/src/documentation/content/xdocs/lucene-contrib/index.xml
    lucene/dev/branches/branch_3x/lucene/src/site/src/documentation/content/xdocs/site.xml
    lucene/dev/branches/branch_3x/lucene/src/test-framework/org/apache/lucene/util/_TestUtil.java
    lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/index/TestNRTThreads.java
    lucene/dev/branches/branch_3x/solr/   (props changed)

Modified: lucene/dev/branches/branch_3x/lucene/build.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/build.xml?rev=1140874&r1=1140873&r2=1140874&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/build.xml (original)
+++ lucene/dev/branches/branch_3x/lucene/build.xml Tue Jun 28 22:33:43 2011
@@ -238,6 +238,7 @@
           <packageset dir="contrib/icu/src/java"/>
           <packageset dir="contrib/highlighter/src/java"/>
           <packageset dir="contrib/instantiated/src/java"/>
+          <packageset dir="contrib/join/src/java"/>
           <packageset dir="contrib/memory/src/java"/>
           <packageset dir="contrib/misc/src/java"/>
           <packageset dir="contrib/queries/src/java"/>
@@ -262,6 +263,7 @@
           <group title="contrib: Grouping" packages="org.apache.lucene.search.grouping*"/>
           <group title="contrib: Highlighter" packages="org.apache.lucene.search.highlight*:org.apache.lucene.search.vectorhighlight*"/>
           <group title="contrib: Instantiated" packages="org.apache.lucene.store.instantiated*"/>
+          <group title="contrib: Join" packages="org.apache.lucene.search.join*"/>
           <group title="contrib: Memory" packages="org.apache.lucene.index.memory*"/>
           <group title="contrib: Misc " packages="org.apache.lucene.misc*"/>
           <group title="contrib: Queries" packages="org.apache.lucene.search.similar*:org.apache.lucene.search.regex*:org.apache.regexp*"/>

Modified: lucene/dev/branches/branch_3x/lucene/contrib/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/contrib/CHANGES.txt?rev=1140874&r1=1140873&r2=1140874&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/contrib/CHANGES.txt (original)
+++ lucene/dev/branches/branch_3x/lucene/contrib/CHANGES.txt Tue Jun 28 22:33:43 2011
@@ -11,6 +11,12 @@ New Features
    highlighting speed up. Use FastVectorHighlighter.setPhraseLimit() to set limit
    (e.g. 5000). (Mike Sokolov via Koji Sekiguchi)
   
+ * LUCENE-3171: Added BlockJoinQuery and BlockJoinCollector, under the
+   new contrib/join module, to enable searches that require joining
+   between parent and child documents.  Joined (children + parent)
+   documents must be indexed as a document block, using
+   IndexWriter.add/UpdateDocuments (Mark Harwood, Mike McCandless)
+
 API Changes
    
 Bug Fixes

Modified: lucene/dev/branches/branch_3x/lucene/contrib/join/build.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/contrib/join/build.xml?rev=1140874&r1=1140852&r2=1140874&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/contrib/join/build.xml (original)
+++ lucene/dev/branches/branch_3x/lucene/contrib/join/build.xml Tue Jun 28 22:33:43 2011
@@ -5,13 +5,12 @@
   </description>
 
   <property name="build.dir" location="build/" />
-  <import file="../../lucene/contrib/contrib-build.xml"/>
+  <import file="../contrib-build.xml"/>
 
   <property name="build.dir" location="build/" />
   <property name="dist.dir" location="dist/" />
 
-  <module-uptodate name="grouping" jarfile="${common.dir}/../modules/grouping/build/lucene-grouping-${version}.jar"
-		   property="grouping.uptodate" classpath.property="grouping.jar"/>
+  <contrib-uptodate name="grouping" property="grouping.uptodate" classpath.property="grouping.jar"/>
 
   <path id="classpath">
     <pathelement path="${grouping.jar}"/>
@@ -29,7 +28,7 @@
 
   <target name="compile-grouping" unless="grouping.uptodate">
     <subant target="default">
-      <fileset dir="${common.dir}/../modules/grouping" includes="build.xml"/>
+      <fileset dir="../grouping" includes="build.xml"/>
     </subant>
   </target>
 

Modified: lucene/dev/branches/branch_3x/lucene/contrib/join/src/java/org/apache/lucene/search/join/BlockJoinCollector.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/contrib/join/src/java/org/apache/lucene/search/join/BlockJoinCollector.java?rev=1140874&r1=1140852&r2=1140874&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/contrib/join/src/java/org/apache/lucene/search/join/BlockJoinCollector.java (original)
+++ lucene/dev/branches/branch_3x/lucene/contrib/join/src/java/org/apache/lucene/search/join/BlockJoinCollector.java Tue Jun 28 22:33:43 2011
@@ -22,7 +22,6 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.lucene.index.IndexReader.AtomicReaderContext;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.IndexWriter;       // javadocs
 import org.apache.lucene.search.Collector;
@@ -104,7 +103,7 @@ public class BlockJoinCollector extends 
 
   private int docBase;
   private BlockJoinQuery.BlockJoinScorer[] joinScorers = new BlockJoinQuery.BlockJoinScorer[0];
-  private IndexReader.AtomicReaderContext currentReaderContext;
+  private IndexReader currentReader;
   private Scorer scorer;
   private boolean queueFull;
 
@@ -142,7 +141,8 @@ public class BlockJoinCollector extends 
       }
       counts = new int[numJoins];
     }
-    AtomicReaderContext readerContext;
+    IndexReader reader;
+    int docBase;
     int[][] docs;
     float[][] scores;
     int[] counts;
@@ -197,7 +197,8 @@ public class BlockJoinCollector extends 
         score = scorer.score();
       }
       bottom.doc = docBase + parentDoc;
-      bottom.readerContext = currentReaderContext;
+      bottom.reader = currentReader;
+      bottom.docBase = docBase;
       bottom.score = score;
       copyGroups(bottom);
       bottom = queue.updateTop();
@@ -215,7 +216,8 @@ public class BlockJoinCollector extends 
       }
       //System.out.println("  startup: new OG doc=" + (docBase+parentDoc));
       final OneGroup og = new OneGroup(comparatorSlot, docBase+parentDoc, score, joinScorers.length, trackScores);
-      og.readerContext = currentReaderContext;
+      og.reader = currentReader;
+      og.docBase = docBase;
       copyGroups(og);
       bottom = queue.add(og);
       queueFull = totalHitCount == numParentHits;
@@ -268,11 +270,11 @@ public class BlockJoinCollector extends 
   }
 
   @Override
-  public void setNextReader(AtomicReaderContext context) throws IOException {
-    currentReaderContext = context;
-    docBase = context.docBase;
+  public void setNextReader(IndexReader reader, int docBase) throws IOException {
+    currentReader = reader;
+    this.docBase = docBase;
     for (int compIDX = 0; compIDX < comparators.length; compIDX++) {
-      queue.setComparator(compIDX, comparators[compIDX].setNextReader(context));
+      comparators[compIDX].setNextReader(reader, docBase);
     }
   }
 
@@ -432,7 +434,7 @@ public class BlockJoinCollector extends 
       }
 
       collector.setScorer(fakeScorer);
-      collector.setNextReader(og.readerContext);
+      collector.setNextReader(og.reader, og.docBase);
       final int numChildDocs = og.counts[slot];
       for(int docIDX=0;docIDX<numChildDocs;docIDX++) {
         final int doc = og.docs[slot][docIDX];

Modified: lucene/dev/branches/branch_3x/lucene/contrib/join/src/java/org/apache/lucene/search/join/BlockJoinQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/contrib/join/src/java/org/apache/lucene/search/join/BlockJoinQuery.java?rev=1140874&r1=1140852&r2=1140874&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/contrib/join/src/java/org/apache/lucene/search/join/BlockJoinQuery.java (original)
+++ lucene/dev/branches/branch_3x/lucene/contrib/join/src/java/org/apache/lucene/search/join/BlockJoinQuery.java Tue Jun 28 22:33:43 2011
@@ -20,7 +20,6 @@ package org.apache.lucene.search.join;
 import java.io.IOException;
 import java.util.Set;
 
-import org.apache.lucene.index.IndexReader.AtomicReaderContext;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.IndexWriter;       // javadocs
 import org.apache.lucene.index.Term;
@@ -29,9 +28,9 @@ import org.apache.lucene.search.DocIdSet
 import org.apache.lucene.search.DocIdSetIterator;
 import org.apache.lucene.search.Explanation;
 import org.apache.lucene.search.Filter;
-import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.Scorer;
+import org.apache.lucene.search.Searcher;
 import org.apache.lucene.search.Weight;
 import org.apache.lucene.search.grouping.TopGroups;
 import org.apache.lucene.util.ArrayUtil;
@@ -108,7 +107,8 @@ public class BlockJoinQuery extends Quer
     this.scoreMode = scoreMode;
   }
 
-  public Weight createWeight(IndexSearcher searcher) throws IOException {
+  @Override
+  public Weight createWeight(Searcher searcher) throws IOException {
     return new BlockJoinWeight(this, childQuery.createWeight(searcher), parentsFilter, scoreMode);
   }
 
@@ -147,9 +147,9 @@ public class BlockJoinQuery extends Quer
     }
 
     @Override
-    public Scorer scorer(AtomicReaderContext readerContext, ScorerContext context) throws IOException {
+    public Scorer scorer(IndexReader reader, boolean scoreDocsInOrder, boolean topScorer) throws IOException {
       // Pass scoreDocsInOrder true, topScorer false to our sub:
-      final Scorer childScorer = childWeight.scorer(readerContext, ScorerContext.def().scoreDocsInOrder(true).topScorer(false));
+      final Scorer childScorer = childWeight.scorer(reader, true, false);
 
       if (childScorer == null) {
         // No matches
@@ -162,7 +162,7 @@ public class BlockJoinQuery extends Quer
         return null;
       }
 
-      final DocIdSet parents = parentsFilter.getDocIdSet(readerContext);
+      final DocIdSet parents = parentsFilter.getDocIdSet(reader);
       // TODO: once we do random-access filters we can
       // generalize this:
       if (parents == null) {
@@ -177,7 +177,7 @@ public class BlockJoinQuery extends Quer
     }
 
     @Override
-    public Explanation explain(AtomicReaderContext reader, int doc) throws IOException {
+    public Explanation explain(IndexReader reader, int doc) throws IOException {
       // TODO
       throw new UnsupportedOperationException(getClass().getName() +
                                               " cannot explain match on parent document");

Modified: lucene/dev/branches/branch_3x/lucene/contrib/join/src/test/org/apache/lucene/search/TestBlockJoin.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/contrib/join/src/test/org/apache/lucene/search/TestBlockJoin.java?rev=1140874&r1=1140852&r2=1140874&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/contrib/join/src/test/org/apache/lucene/search/TestBlockJoin.java (original)
+++ lucene/dev/branches/branch_3x/lucene/contrib/join/src/test/org/apache/lucene/search/TestBlockJoin.java Tue Jun 28 22:33:43 2011
@@ -157,13 +157,13 @@ public class TestBlockJoin extends Lucen
     // not comparable across the two indices
     // sortFields.add(SortField.FIELD_SCORE);
     if (random.nextBoolean()) {
-      sortFields.add(new SortField(prefix + random.nextInt(numFields), SortField.Type.STRING, random.nextBoolean()));
+      sortFields.add(new SortField(prefix + random.nextInt(numFields), SortField.STRING, random.nextBoolean()));
     } else if (random.nextBoolean()) {
-      sortFields.add(new SortField(prefix + random.nextInt(numFields), SortField.Type.STRING, random.nextBoolean()));
-      sortFields.add(new SortField(prefix + random.nextInt(numFields), SortField.Type.STRING, random.nextBoolean()));
+      sortFields.add(new SortField(prefix + random.nextInt(numFields), SortField.STRING, random.nextBoolean()));
+      sortFields.add(new SortField(prefix + random.nextInt(numFields), SortField.STRING, random.nextBoolean()));
     }
     // Break ties:
-    sortFields.add(new SortField(prefix + "ID", SortField.Type.INT));
+    sortFields.add(new SortField(prefix + "ID", SortField.INT));
     return new Sort(sortFields.toArray(new SortField[sortFields.size()]));
   }
 

Modified: lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldComparator.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldComparator.java?rev=1140874&r1=1140873&r2=1140874&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldComparator.java (original)
+++ lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldComparator.java Tue Jun 28 22:33:43 2011
@@ -569,8 +569,13 @@ public abstract class FieldComparator<T>
     @Override
     public void setScorer(Scorer scorer) {
       // wrap with a ScoreCachingWrappingScorer so that successive calls to
-      // score() will not incur score computation over and over again.
-      this.scorer = new ScoreCachingWrappingScorer(scorer);
+      // score() will not incur score computation over and
+      // over again.
+      if (!(scorer instanceof ScoreCachingWrappingScorer)) {
+        this.scorer = new ScoreCachingWrappingScorer(scorer);
+      } else {
+        this.scorer = scorer;
+      }
     }
     
     @Override

Modified: lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldValueHitQueue.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldValueHitQueue.java?rev=1140874&r1=1140873&r2=1140874&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldValueHitQueue.java (original)
+++ lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/FieldValueHitQueue.java Tue Jun 28 22:33:43 2011
@@ -31,12 +31,12 @@ import org.apache.lucene.util.PriorityQu
  * @see Searcher#search(Query,Filter,int,Sort)
  * @see FieldCache
  */
-public abstract class FieldValueHitQueue extends PriorityQueue<FieldValueHitQueue.Entry> {
+public abstract class FieldValueHitQueue<T extends FieldValueHitQueue.Entry> extends PriorityQueue<T> {
 
-  final static class Entry extends ScoreDoc {
-    int slot;
+  public static class Entry extends ScoreDoc {
+    public int slot;
 
-    Entry(int slot, int doc, float score) {
+    public Entry(int slot, int doc, float score) {
       super(doc, score);
       this.slot = slot;
     }
@@ -51,7 +51,7 @@ public abstract class FieldValueHitQueue
    * An implementation of {@link FieldValueHitQueue} which is optimized in case
    * there is just one comparator.
    */
-  private static final class OneComparatorFieldValueHitQueue extends FieldValueHitQueue {
+  private static final class OneComparatorFieldValueHitQueue<T extends FieldValueHitQueue.Entry> extends FieldValueHitQueue<T> {
 
     private final FieldComparator comparator;
     private final int oneReverseMul;
@@ -97,7 +97,7 @@ public abstract class FieldValueHitQueue
    * An implementation of {@link FieldValueHitQueue} which is optimized in case
    * there is more than one comparator.
    */
-  private static final class MultiComparatorsFieldValueHitQueue extends FieldValueHitQueue {
+  private static final class MultiComparatorsFieldValueHitQueue<T extends FieldValueHitQueue.Entry> extends FieldValueHitQueue<T> {
 
     public MultiComparatorsFieldValueHitQueue(SortField[] fields, int size)
         throws IOException {
@@ -162,22 +162,26 @@ public abstract class FieldValueHitQueue
    *          The number of hits to retain. Must be greater than zero.
    * @throws IOException
    */
-  public static FieldValueHitQueue create(SortField[] fields, int size) throws IOException {
+  public static <T extends FieldValueHitQueue.Entry> FieldValueHitQueue<T> create(SortField[] fields, int size) throws IOException {
 
     if (fields.length == 0) {
       throw new IllegalArgumentException("Sort must contain at least one field");
     }
 
     if (fields.length == 1) {
-      return new OneComparatorFieldValueHitQueue(fields, size);
+      return new OneComparatorFieldValueHitQueue<T>(fields, size);
     } else {
-      return new MultiComparatorsFieldValueHitQueue(fields, size);
+      return new MultiComparatorsFieldValueHitQueue<T>(fields, size);
     }
   }
   
-  FieldComparator[] getComparators() { return comparators; }
+  public FieldComparator[] getComparators() {
+    return comparators;
+  }
 
-  int[] getReverseMul() { return reverseMul; }
+  public int[] getReverseMul() {
+    return reverseMul;
+  }
 
   /** Stores the sort criteria being used. */
   protected final SortField[] fields;

Modified: lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/Query.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/Query.java?rev=1140874&r1=1140873&r2=1140874&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/Query.java (original)
+++ lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/Query.java Tue Jun 28 22:33:43 2011
@@ -90,7 +90,7 @@ public abstract class Query implements j
    * Only implemented by primitive queries, which re-write to themselves.
    */
   public Weight createWeight(Searcher searcher) throws IOException {
-    throw new UnsupportedOperationException();
+    throw new UnsupportedOperationException("Query " + this + " does not implement createWeight");
   }
 
   /**

Modified: lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/TopFieldCollector.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/TopFieldCollector.java?rev=1140874&r1=1140873&r2=1140874&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/TopFieldCollector.java (original)
+++ lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/TopFieldCollector.java Tue Jun 28 22:33:43 2011
@@ -49,7 +49,7 @@ public abstract class TopFieldCollector 
     final FieldComparator comparator;
     final int reverseMul;
     
-    public OneComparatorNonScoringCollector(FieldValueHitQueue queue,
+    public OneComparatorNonScoringCollector(FieldValueHitQueue<Entry> queue,
         int numHits, boolean fillFields) throws IOException {
       super(queue, numHits, fillFields);
       comparator = queue.getComparators()[0];
@@ -110,7 +110,7 @@ public abstract class TopFieldCollector 
   private static class OutOfOrderOneComparatorNonScoringCollector extends
       OneComparatorNonScoringCollector {
 
-    public OutOfOrderOneComparatorNonScoringCollector(FieldValueHitQueue queue,
+    public OutOfOrderOneComparatorNonScoringCollector(FieldValueHitQueue<Entry> queue,
         int numHits, boolean fillFields) throws IOException {
       super(queue, numHits, fillFields);
     }
@@ -157,7 +157,7 @@ public abstract class TopFieldCollector 
 
     Scorer scorer;
 
-    public OneComparatorScoringNoMaxScoreCollector(FieldValueHitQueue queue,
+    public OneComparatorScoringNoMaxScoreCollector(FieldValueHitQueue<Entry> queue,
         int numHits, boolean fillFields) throws IOException {
       super(queue, numHits, fillFields);
     }
@@ -218,7 +218,7 @@ public abstract class TopFieldCollector 
       OneComparatorScoringNoMaxScoreCollector {
 
     public OutOfOrderOneComparatorScoringNoMaxScoreCollector(
-        FieldValueHitQueue queue, int numHits, boolean fillFields)
+        FieldValueHitQueue<Entry> queue, int numHits, boolean fillFields)
         throws IOException {
       super(queue, numHits, fillFields);
     }
@@ -271,7 +271,7 @@ public abstract class TopFieldCollector 
 
     Scorer scorer;
     
-    public OneComparatorScoringMaxScoreCollector(FieldValueHitQueue queue,
+    public OneComparatorScoringMaxScoreCollector(FieldValueHitQueue<Entry> queue,
         int numHits, boolean fillFields) throws IOException {
       super(queue, numHits, fillFields);
       // Must set maxScore to NEG_INF, or otherwise Math.max always returns NaN.
@@ -331,7 +331,7 @@ public abstract class TopFieldCollector 
   private static class OutOfOrderOneComparatorScoringMaxScoreCollector extends
       OneComparatorScoringMaxScoreCollector {
 
-    public OutOfOrderOneComparatorScoringMaxScoreCollector(FieldValueHitQueue queue,
+    public OutOfOrderOneComparatorScoringMaxScoreCollector(FieldValueHitQueue<Entry> queue,
         int numHits, boolean fillFields) throws IOException {
       super(queue, numHits, fillFields);
     }
@@ -381,8 +381,8 @@ public abstract class TopFieldCollector 
     
     final FieldComparator[] comparators;
     final int[] reverseMul;
-    
-    public MultiComparatorNonScoringCollector(FieldValueHitQueue queue,
+
+    public MultiComparatorNonScoringCollector(FieldValueHitQueue<Entry> queue,
         int numHits, boolean fillFields) throws IOException {
       super(queue, numHits, fillFields);
       comparators = queue.getComparators();
@@ -467,7 +467,7 @@ public abstract class TopFieldCollector 
   private static class OutOfOrderMultiComparatorNonScoringCollector extends
       MultiComparatorNonScoringCollector {
     
-    public OutOfOrderMultiComparatorNonScoringCollector(FieldValueHitQueue queue,
+    public OutOfOrderMultiComparatorNonScoringCollector(FieldValueHitQueue<Entry> queue,
         int numHits, boolean fillFields) throws IOException {
       super(queue, numHits, fillFields);
     }
@@ -536,7 +536,7 @@ public abstract class TopFieldCollector 
     
     Scorer scorer;
     
-    public MultiComparatorScoringMaxScoreCollector(FieldValueHitQueue queue,
+    public MultiComparatorScoringMaxScoreCollector(FieldValueHitQueue<Entry> queue,
         int numHits, boolean fillFields) throws IOException {
       super(queue, numHits, fillFields);
       // Must set maxScore to NEG_INF, or otherwise Math.max always returns NaN.
@@ -615,7 +615,7 @@ public abstract class TopFieldCollector 
   private final static class OutOfOrderMultiComparatorScoringMaxScoreCollector
       extends MultiComparatorScoringMaxScoreCollector {
     
-    public OutOfOrderMultiComparatorScoringMaxScoreCollector(FieldValueHitQueue queue,
+    public OutOfOrderMultiComparatorScoringMaxScoreCollector(FieldValueHitQueue<Entry> queue,
         int numHits, boolean fillFields) throws IOException {
       super(queue, numHits, fillFields);
     }
@@ -688,7 +688,7 @@ public abstract class TopFieldCollector 
     
     Scorer scorer;
     
-    public MultiComparatorScoringNoMaxScoreCollector(FieldValueHitQueue queue,
+    public MultiComparatorScoringNoMaxScoreCollector(FieldValueHitQueue<Entry> queue,
         int numHits, boolean fillFields) throws IOException {
       super(queue, numHits, fillFields);
     }
@@ -767,7 +767,7 @@ public abstract class TopFieldCollector 
       extends MultiComparatorScoringNoMaxScoreCollector {
     
     public OutOfOrderMultiComparatorScoringNoMaxScoreCollector(
-        FieldValueHitQueue queue, int numHits, boolean fillFields)
+        FieldValueHitQueue<Entry> queue, int numHits, boolean fillFields)
         throws IOException {
       super(queue, numHits, fillFields);
     }
@@ -913,7 +913,7 @@ public abstract class TopFieldCollector 
       throw new IllegalArgumentException("numHits must be > 0; please use TotalHitCountCollector if you just need the total hit count");
     }
 
-    FieldValueHitQueue queue = FieldValueHitQueue.create(sort.fields, numHits);
+    FieldValueHitQueue<Entry> queue = FieldValueHitQueue.create(sort.fields, numHits);
     if (queue.getComparators().length == 1) {
       if (docsScoredInOrder) {
         if (trackMaxScore) {
@@ -968,7 +968,7 @@ public abstract class TopFieldCollector 
   protected void populateResults(ScoreDoc[] results, int howMany) {
     if (fillFields) {
       // avoid casting if unnecessary.
-      FieldValueHitQueue queue = (FieldValueHitQueue) pq;
+      FieldValueHitQueue<Entry> queue = (FieldValueHitQueue<Entry>) pq;
       for (int i = howMany - 1; i >= 0; i--) {
         results[i] = queue.fillFields(queue.pop());
       }
@@ -989,12 +989,11 @@ public abstract class TopFieldCollector 
     }
 
     // If this is a maxScoring tracking collector and there were no results, 
-    return new TopFieldDocs(totalHits, results, ((FieldValueHitQueue) pq).getFields(), maxScore);
+    return new TopFieldDocs(totalHits, results, ((FieldValueHitQueue<Entry>) pq).getFields(), maxScore);
   }
   
   @Override
   public boolean acceptsDocsOutOfOrder() {
     return false;
   }
-
 }

Modified: lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/util/ArrayUtil.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/util/ArrayUtil.java?rev=1140874&r1=1140873&r2=1140874&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/util/ArrayUtil.java (original)
+++ lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/util/ArrayUtil.java Tue Jun 28 22:33:43 2011
@@ -386,6 +386,56 @@ public final class ArrayUtil {
       return array;
   }
 
+  public static int[][] grow(int[][] array, int minSize) {
+    if (array.length < minSize) {
+      int[][] newArray = new int[oversize(minSize, RamUsageEstimator.NUM_BYTES_OBJECT_REF)][];
+      System.arraycopy(array, 0, newArray, 0, array.length);
+      return newArray;
+    } else {
+      return array;
+    }
+  }
+
+  public static int[][] grow(int[][] array) {
+    return grow(array, 1 + array.length);
+  }
+
+  public static int[][] shrink(int[][] array, int targetSize) {
+    final int newSize = getShrinkSize(array.length, targetSize, RamUsageEstimator.NUM_BYTES_OBJECT_REF);
+    if (newSize != array.length) {
+      int[][] newArray = new int[newSize][];
+      System.arraycopy(array, 0, newArray, 0, newSize);
+      return newArray;
+    } else {
+      return array;
+    }
+  }
+
+  public static float[][] grow(float[][] array, int minSize) {
+    if (array.length < minSize) {
+      float[][] newArray = new float[oversize(minSize, RamUsageEstimator.NUM_BYTES_OBJECT_REF)][];
+      System.arraycopy(array, 0, newArray, 0, array.length);
+      return newArray;
+    } else {
+      return array;
+    }
+  }
+
+  public static float[][] grow(float[][] array) {
+    return grow(array, 1 + array.length);
+  }
+
+  public static float[][] shrink(float[][] array, int targetSize) {
+    final int newSize = getShrinkSize(array.length, targetSize, RamUsageEstimator.NUM_BYTES_OBJECT_REF);
+    if (newSize != array.length) {
+      float[][] newArray = new float[newSize][];
+      System.arraycopy(array, 0, newArray, 0, newSize);
+      return newArray;
+    } else {
+      return array;
+    }
+  }
+
   /**
    * Returns hash of chars in range start (inclusive) to
    * end (inclusive)
@@ -583,6 +633,7 @@ public final class ArrayUtil {
    */
   public static <T> void mergeSort(T[] a, int fromIndex, int toIndex, Comparator<? super T> comp) {
     if (toIndex-fromIndex <= 1) return;
+    //System.out.println("SORT: " + (toIndex-fromIndex));
     getSorter(a, comp).mergeSort(fromIndex, toIndex-1);
   }
   

Modified: lucene/dev/branches/branch_3x/lucene/src/site/build/site/contributions.html
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/site/build/site/contributions.html?rev=1140874&r1=1140873&r2=1140874&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/site/build/site/contributions.html (original)
+++ lucene/dev/branches/branch_3x/lucene/src/site/build/site/contributions.html Tue Jun 28 22:33:43 2011
@@ -3,7 +3,7 @@
 <head>
 <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta content="Apache Forrest" name="Generator">
-<meta name="Forrest-version" content="0.9">
+<meta name="Forrest-version" content="0.8">
 <meta name="Forrest-skin-name" content="lucene">
 <title>
 	Apache Lucene - Contributions
@@ -162,6 +162,9 @@ document.write("Last Published: " + docu
 <a href="api/contrib-instantiated/index.html">Instantiated</a>
 </div>
 <div class="menuitem">
+<a href="api/contrib-join/index.html">Join</a>
+</div>
+<div class="menuitem">
 <a href="api/contrib-memory/index.html">Memory</a>
 </div>
 <div class="menuitem">
@@ -271,7 +274,7 @@ document.write("Last Published: " + docu
 <a href="#PDFTextStream -- PDF text and metadata extraction">PDFTextStream -- PDF text and metadata extraction</a>
 </li>
 <li>
-<a href="#PJ Classic &amp; PJ Professional - PDF Document Conversion">PJ Classic &amp; PJ Professional - PDF Document Conversion</a>
+<a href="#PJ Classic & PJ Professional - PDF Document Conversion">PJ Classic &amp; PJ Professional - PDF Document Conversion</a>
 </li>
 </ul>
 </li>
@@ -399,7 +402,7 @@ document.write("Last Published: " + docu
                             URL
                         </th>
                         <td>
-                            <a href="http://marc.theaimsgroup.com/?l=lucene-dev&amp;m=100723333506246&amp;w=2">
+                            <a href="http://marc.theaimsgroup.com/?l=lucene-dev&m=100723333506246&w=2">
                                 http://marc.theaimsgroup.com/?l=lucene-dev&amp;m=100723333506246&amp;w=2
                             </a>
                         </td>
@@ -534,7 +537,7 @@ document.write("Last Published: " + docu
 </tr>
                 
 </table>
-<a name="N10124"></a><a name="PJ Classic &amp; PJ Professional - PDF Document Conversion"></a>
+<a name="N10124"></a><a name="PJ Classic & PJ Professional - PDF Document Conversion"></a>
 <h3 class="boxed">PJ Classic &amp; PJ Professional - PDF Document Conversion</h3>
 <table class="ForrestTable" cellspacing="1" cellpadding="4">
                     

Modified: lucene/dev/branches/branch_3x/lucene/src/site/build/site/demo.html
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/site/build/site/demo.html?rev=1140874&r1=1140873&r2=1140874&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/site/build/site/demo.html (original)
+++ lucene/dev/branches/branch_3x/lucene/src/site/build/site/demo.html Tue Jun 28 22:33:43 2011
@@ -3,7 +3,7 @@
 <head>
 <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta content="Apache Forrest" name="Generator">
-<meta name="Forrest-version" content="0.9">
+<meta name="Forrest-version" content="0.8">
 <meta name="Forrest-skin-name" content="lucene">
 <title>
 	Apache Lucene - Building and Installing the Basic Demo
@@ -162,6 +162,9 @@ document.write("Last Published: " + docu
 <a href="api/contrib-instantiated/index.html">Instantiated</a>
 </div>
 <div class="menuitem">
+<a href="api/contrib-join/index.html">Join</a>
+</div>
+<div class="menuitem">
 <a href="api/contrib-memory/index.html">Memory</a>
 </div>
 <div class="menuitem">

Modified: lucene/dev/branches/branch_3x/lucene/src/site/build/site/demo2.html
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/site/build/site/demo2.html?rev=1140874&r1=1140873&r2=1140874&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/site/build/site/demo2.html (original)
+++ lucene/dev/branches/branch_3x/lucene/src/site/build/site/demo2.html Tue Jun 28 22:33:43 2011
@@ -3,7 +3,7 @@
 <head>
 <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta content="Apache Forrest" name="Generator">
-<meta name="Forrest-version" content="0.9">
+<meta name="Forrest-version" content="0.8">
 <meta name="Forrest-skin-name" content="lucene">
 <title>
 	Apache Lucene - Basic Demo Sources Walk-through
@@ -162,6 +162,9 @@ document.write("Last Published: " + docu
 <a href="api/contrib-instantiated/index.html">Instantiated</a>
 </div>
 <div class="menuitem">
+<a href="api/contrib-join/index.html">Join</a>
+</div>
+<div class="menuitem">
 <a href="api/contrib-memory/index.html">Memory</a>
 </div>
 <div class="menuitem">

Modified: lucene/dev/branches/branch_3x/lucene/src/site/build/site/fileformats.html
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/site/build/site/fileformats.html?rev=1140874&r1=1140873&r2=1140874&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/site/build/site/fileformats.html (original)
+++ lucene/dev/branches/branch_3x/lucene/src/site/build/site/fileformats.html Tue Jun 28 22:33:43 2011
@@ -3,7 +3,7 @@
 <head>
 <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta content="Apache Forrest" name="Generator">
-<meta name="Forrest-version" content="0.9">
+<meta name="Forrest-version" content="0.8">
 <meta name="Forrest-skin-name" content="lucene">
 <title>
             Apache Lucene - Index File Formats
@@ -162,6 +162,9 @@ document.write("Last Published: " + docu
 <a href="api/contrib-instantiated/index.html">Instantiated</a>
 </div>
 <div class="menuitem">
+<a href="api/contrib-join/index.html">Join</a>
+</div>
+<div class="menuitem">
 <a href="api/contrib-memory/index.html">Memory</a>
 </div>
 <div class="menuitem">

Modified: lucene/dev/branches/branch_3x/lucene/src/site/build/site/gettingstarted.html
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/site/build/site/gettingstarted.html?rev=1140874&r1=1140873&r2=1140874&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/site/build/site/gettingstarted.html (original)
+++ lucene/dev/branches/branch_3x/lucene/src/site/build/site/gettingstarted.html Tue Jun 28 22:33:43 2011
@@ -3,7 +3,7 @@
 <head>
 <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta content="Apache Forrest" name="Generator">
-<meta name="Forrest-version" content="0.9">
+<meta name="Forrest-version" content="0.8">
 <meta name="Forrest-skin-name" content="lucene">
 <title>
 	Apache Lucene - Getting Started Guide
@@ -162,6 +162,9 @@ document.write("Last Published: " + docu
 <a href="api/contrib-instantiated/index.html">Instantiated</a>
 </div>
 <div class="menuitem">
+<a href="api/contrib-join/index.html">Join</a>
+</div>
+<div class="menuitem">
 <a href="api/contrib-memory/index.html">Memory</a>
 </div>
 <div class="menuitem">

Modified: lucene/dev/branches/branch_3x/lucene/src/site/build/site/index.html
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/site/build/site/index.html?rev=1140874&r1=1140873&r2=1140874&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/site/build/site/index.html (original)
+++ lucene/dev/branches/branch_3x/lucene/src/site/build/site/index.html Tue Jun 28 22:33:43 2011
@@ -3,7 +3,7 @@
 <head>
 <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta content="Apache Forrest" name="Generator">
-<meta name="Forrest-version" content="0.9">
+<meta name="Forrest-version" content="0.8">
 <meta name="Forrest-skin-name" content="lucene">
 <title>Lucene Java Documentation</title>
 <link type="text/css" href="skin/basic.css" rel="stylesheet">
@@ -160,6 +160,9 @@ document.write("Last Published: " + docu
 <a href="api/contrib-instantiated/index.html">Instantiated</a>
 </div>
 <div class="menuitem">
+<a href="api/contrib-join/index.html">Join</a>
+</div>
+<div class="menuitem">
 <a href="api/contrib-memory/index.html">Memory</a>
 </div>
 <div class="menuitem">

Modified: lucene/dev/branches/branch_3x/lucene/src/site/build/site/linkmap.html
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/site/build/site/linkmap.html?rev=1140874&r1=1140873&r2=1140874&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/site/build/site/linkmap.html (original)
+++ lucene/dev/branches/branch_3x/lucene/src/site/build/site/linkmap.html Tue Jun 28 22:33:43 2011
@@ -3,7 +3,7 @@
 <head>
 <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta content="Apache Forrest" name="Generator">
-<meta name="Forrest-version" content="0.9">
+<meta name="Forrest-version" content="0.8">
 <meta name="Forrest-skin-name" content="lucene">
 <title>Site Linkmap Table of Contents</title>
 <link type="text/css" href="skin/basic.css" rel="stylesheet">
@@ -160,6 +160,9 @@ document.write("Last Published: " + docu
 <a href="api/contrib-instantiated/index.html">Instantiated</a>
 </div>
 <div class="menuitem">
+<a href="api/contrib-join/index.html">Join</a>
+</div>
+<div class="menuitem">
 <a href="api/contrib-memory/index.html">Memory</a>
 </div>
 <div class="menuitem">
@@ -330,13 +333,13 @@ document.write("Last Published: " + docu
 <a href="api/contrib-benchmark/index.html">Benchmark</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>javadoc-contrib-benchmark</em>
 </li>
 </ul>
-        
+		    
 <ul>
 <li>
 <a href="api/contrib-demo/index.html">Demo</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>javadoc-contrib-demo</em>
 </li>
 </ul>
-            
+	            
 <ul>
 <li>
 <a href="api/contrib-grouping/index.html">Grouping</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>javadoc-contrib-grouping</em>
@@ -363,6 +366,12 @@ document.write("Last Published: " + docu
 		    
 <ul>
 <li>
+<a href="api/contrib-join/index.html">Join</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>javadoc-contrib-join</em>
+</li>
+</ul>
+		    
+<ul>
+<li>
 <a href="api/contrib-memory/index.html">Memory</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>javadoc-contrib-memory</em>
 </li>
 </ul>

Modified: lucene/dev/branches/branch_3x/lucene/src/site/build/site/lucene-contrib/index.html
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/site/build/site/lucene-contrib/index.html?rev=1140874&r1=1140873&r2=1140874&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/site/build/site/lucene-contrib/index.html (original)
+++ lucene/dev/branches/branch_3x/lucene/src/site/build/site/lucene-contrib/index.html Tue Jun 28 22:33:43 2011
@@ -3,7 +3,7 @@
 <head>
 <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta content="Apache Forrest" name="Generator">
-<meta name="Forrest-version" content="0.9">
+<meta name="Forrest-version" content="0.8">
 <meta name="Forrest-skin-name" content="lucene">
 <title>
 	        Apache Lucene - Lucene Contrib
@@ -162,6 +162,9 @@ document.write("Last Published: " + docu
 <a href="../api/contrib-instantiated/index.html">Instantiated</a>
 </div>
 <div class="menuitem">
+<a href="../api/contrib-join/index.html">Join</a>
+</div>
+<div class="menuitem">
 <a href="../api/contrib-memory/index.html">Memory</a>
 </div>
 <div class="menuitem">
@@ -266,6 +269,9 @@ document.write("Last Published: " + docu
 <a href="#instantiated">instantiated</a>
 </li>
 <li>
+<a href="#join">join</a>
+</li>
+<li>
 <a href="#memory">memory</a>
 </li>
 <li>
@@ -380,47 +386,52 @@ document.write("Last Published: " + docu
 <p>RAM-based index that enables much faster searching than RAMDirectory in certain situations.</p>
 <p>See <a href="../api/contrib-instantiated/index.html">instantiated javadoc</a>
 </p>
-<a name="N100A2"></a><a name="memory"></a>
+<a name="N100A2"></a><a name="join"></a>
+<h3 class="boxed">join</h3>
+<p>Enables joining of parent and child documents when indexed as a doc block</p>
+<p>See <a href="../api/contrib-join/index.html">join javadoc</a>
+</p>
+<a name="N100B1"></a><a name="memory"></a>
 <h3 class="boxed">memory</h3>
 <p>High-performance single-document main memory index.</p>
 <p>See <a href="../api/contrib-memory/index.html">memory javadoc</a>
 </p>
-<a name="N100B1"></a><a name="misc"></a>
+<a name="N100C0"></a><a name="misc"></a>
 <h3 class="boxed">misc</h3>
 <p>A variety of miscellaneous files, including QueryParsers, and other alternate Lucene class implementations and tools.</p>
 <p>See <a href="../api/contrib-misc/index.html">misc javadoc</a>
 </p>
-<a name="N100C0"></a><a name="queryparser"></a>
+<a name="N100CF"></a><a name="queryparser"></a>
 <h3 class="boxed">queryparser</h3>
 <p>A new Lucene query parser implementation, which matches the syntax of the core QueryParser but offers a more modular architecture to enable customization.</p>
 <p>See <a href="../api/contrib-queryparser/index.html">queryparser javadoc</a>
 </p>
-<a name="N100CF"></a><a name="queries"></a>
+<a name="N100DE"></a><a name="queries"></a>
 <h3 class="boxed">queries</h3>
 <p>Additional queries for Lucene.</p>
 <p>See <a href="../api/contrib-queries/index.html">queries javadoc</a>
 </p>
-<a name="N100DE"></a><a name="remote"></a>
+<a name="N100ED"></a><a name="remote"></a>
 <h3 class="boxed">remote</h3>
 <p>Classes to help use Lucene with RMI.</p>
 <p>See <a href="../api/contrib-remote/index.html">remote javadoc</a>
 </p>
-<a name="N100ED"></a><a name="spatial"></a>
+<a name="N100FC"></a><a name="spatial"></a>
 <h3 class="boxed">spatial</h3>
 <p>Classes to help with efficient distance based sorting.</p>
 <p>See <a href="../api/contrib-spatial/index.html">spatial javadoc</a>
 </p>
-<a name="N100FC"></a><a name="spellchecker"></a>
+<a name="N1010B"></a><a name="spellchecker"></a>
 <h3 class="boxed">spellchecker</h3>
 <p>Provides tools for spellchecking and suggestions with Lucene.</p>
 <p>See <a href="../api/contrib-spellchecker/index.html">spellchecker javadoc</a>
 </p>
-<a name="N1010B"></a><a name="wordnet"></a>
+<a name="N1011A"></a><a name="wordnet"></a>
 <h3 class="boxed">wordnet</h3>
 <p>Tools to help utilize wordnet synonyms with Lucene</p>
 <p>See <a href="../api/contrib-wordnet/index.html">wordnet javadoc</a>
 </p>
-<a name="N1011A"></a><a name="xml-query-parser"></a>
+<a name="N10129"></a><a name="xml-query-parser"></a>
 <h3 class="boxed">xml-query-parser</h3>
 <p>A QueryParser that can read queries written in an XML format.</p>
 <p>See <a href="../api/contrib-wordnet/index.html">xml-query-parser javadoc</a>

Modified: lucene/dev/branches/branch_3x/lucene/src/site/build/site/queryparsersyntax.html
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/site/build/site/queryparsersyntax.html?rev=1140874&r1=1140873&r2=1140874&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/site/build/site/queryparsersyntax.html (original)
+++ lucene/dev/branches/branch_3x/lucene/src/site/build/site/queryparsersyntax.html Tue Jun 28 22:33:43 2011
@@ -3,7 +3,7 @@
 <head>
 <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta content="Apache Forrest" name="Generator">
-<meta name="Forrest-version" content="0.9">
+<meta name="Forrest-version" content="0.8">
 <meta name="Forrest-skin-name" content="lucene">
 <title>
 	Apache Lucene - Query Parser Syntax
@@ -162,6 +162,9 @@ document.write("Last Published: " + docu
 <a href="api/contrib-instantiated/index.html">Instantiated</a>
 </div>
 <div class="menuitem">
+<a href="api/contrib-join/index.html">Join</a>
+</div>
+<div class="menuitem">
 <a href="api/contrib-memory/index.html">Memory</a>
 </div>
 <div class="menuitem">

Modified: lucene/dev/branches/branch_3x/lucene/src/site/build/site/scoring.html
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/site/build/site/scoring.html?rev=1140874&r1=1140873&r2=1140874&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/site/build/site/scoring.html (original)
+++ lucene/dev/branches/branch_3x/lucene/src/site/build/site/scoring.html Tue Jun 28 22:33:43 2011
@@ -3,7 +3,7 @@
 <head>
 <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta content="Apache Forrest" name="Generator">
-<meta name="Forrest-version" content="0.9">
+<meta name="Forrest-version" content="0.8">
 <meta name="Forrest-skin-name" content="lucene">
 <title>
 	Apache Lucene - Scoring
@@ -162,6 +162,9 @@ document.write("Last Published: " + docu
 <a href="api/contrib-instantiated/index.html">Instantiated</a>
 </div>
 <div class="menuitem">
+<a href="api/contrib-join/index.html">Join</a>
+</div>
+<div class="menuitem">
 <a href="api/contrib-memory/index.html">Memory</a>
 </div>
 <div class="menuitem">

Modified: lucene/dev/branches/branch_3x/lucene/src/site/build/site/systemrequirements.html
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/site/build/site/systemrequirements.html?rev=1140874&r1=1140873&r2=1140874&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/site/build/site/systemrequirements.html (original)
+++ lucene/dev/branches/branch_3x/lucene/src/site/build/site/systemrequirements.html Tue Jun 28 22:33:43 2011
@@ -3,7 +3,7 @@
 <head>
 <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta content="Apache Forrest" name="Generator">
-<meta name="Forrest-version" content="0.9">
+<meta name="Forrest-version" content="0.8">
 <meta name="Forrest-skin-name" content="lucene">
 <title>Apache Lucene - System Requirements</title>
 <link type="text/css" href="skin/basic.css" rel="stylesheet">
@@ -160,6 +160,9 @@ document.write("Last Published: " + docu
 <a href="api/contrib-instantiated/index.html">Instantiated</a>
 </div>
 <div class="menuitem">
+<a href="api/contrib-join/index.html">Join</a>
+</div>
+<div class="menuitem">
 <a href="api/contrib-memory/index.html">Memory</a>
 </div>
 <div class="menuitem">

Modified: lucene/dev/branches/branch_3x/lucene/src/site/src/documentation/content/xdocs/lucene-contrib/index.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/site/src/documentation/content/xdocs/lucene-contrib/index.xml?rev=1140874&r1=1140873&r2=1140874&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/site/src/documentation/content/xdocs/lucene-contrib/index.xml (original)
+++ lucene/dev/branches/branch_3x/lucene/src/site/src/documentation/content/xdocs/lucene-contrib/index.xml Tue Jun 28 22:33:43 2011
@@ -87,6 +87,11 @@
                 <p>See <a href="../api/contrib-instantiated/index.html">instantiated javadoc</a></p>
             </section>
             
+            <section id="join"><title>join</title>
+                <p>Enables joining of parent and child documents when indexed as a doc block</p>
+                <p>See <a href="../api/contrib-join/index.html">join javadoc</a></p>
+            </section>
+
             <section id="memory"><title>memory</title>
                 <p>High-performance single-document main memory index.</p>
                 <p>See <a href="../api/contrib-memory/index.html">memory javadoc</a></p>

Modified: lucene/dev/branches/branch_3x/lucene/src/site/src/documentation/content/xdocs/site.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/site/src/documentation/content/xdocs/site.xml?rev=1140874&r1=1140873&r2=1140874&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/site/src/documentation/content/xdocs/site.xml (original)
+++ lucene/dev/branches/branch_3x/lucene/src/site/src/documentation/content/xdocs/site.xml Tue Jun 28 22:33:43 2011
@@ -56,11 +56,12 @@ See http://forrest.apache.org/docs/linki
 		    <javadoc-contrib-smartcn label="Smart Chinese Analyzer" href="ext:javadocs-contrib-smartcn"/>
 		    <javadoc-contrib-stempel label="Stempel Polish Analyzer" href="ext:javadocs-contrib-stempel"/>
 		    <javadoc-contrib-benchmark label="Benchmark" href="ext:javadocs-contrib-benchmark"/>
-        <javadoc-contrib-demo label="Demo" href="ext:javadocs-contrib-demo"/>
-            <javadoc-contrib-grouping label="Grouping" href="ext:javadocs-contrib-grouping"/>
+		    <javadoc-contrib-demo label="Demo" href="ext:javadocs-contrib-demo"/>
+	            <javadoc-contrib-grouping label="Grouping" href="ext:javadocs-contrib-grouping"/>
 		    <javadoc-contrib-highlighter label="Highlighter" href="ext:javadocs-contrib-highlighter"/>
 		    <javadoc-contrib-icu label="ICU" href="ext:javadocs-contrib-icu"/>
 		    <javadoc-contrib-instantiated label="Instantiated" href="ext:javadocs-contrib-instantiated"/>
+		    <javadoc-contrib-join label="Join" href="ext:javadocs-contrib-join"/>
 		    <javadoc-contrib-memory label="Memory" href="ext:javadocs-contrib-memory"/>
 		    <javadoc-contrib-misc label="Miscellaneous" href="ext:javadocs-contrib-misc"/>
 		    <javadoc-contrib-queries label="Queries" href="ext:javadocs-contrib-queries"/>
@@ -104,11 +105,12 @@ See http://forrest.apache.org/docs/linki
 	<javadocs-contrib-smartcn href="api/contrib-smartcn/index.html"/>
 	<javadocs-contrib-stempel href="api/contrib-stempel/index.html"/>
 	<javadocs-contrib-benchmark href="api/contrib-benchmark/index.html"/>
-  <javadocs-contrib-demo href="api/contrib-demo/index.html"/>
-    <javadocs-contrib-grouping href="api/contrib-grouping/index.html"/>
+	<javadocs-contrib-demo href="api/contrib-demo/index.html"/>
+	<javadocs-contrib-grouping href="api/contrib-grouping/index.html"/>
 	<javadocs-contrib-highlighter href="api/contrib-highlighter/index.html"/>
-    <javadocs-contrib-icu href="api/contrib-icu/index.html"/>
+	<javadocs-contrib-icu href="api/contrib-icu/index.html"/>
 	<javadocs-contrib-instantiated href="api/contrib-instantiated/index.html"/>
+	<javadocs-contrib-join href="api/contrib-join/index.html"/>
 	<javadocs-contrib-memory href="api/contrib-memory/index.html"/>
 	<javadocs-contrib-misc href="api/contrib-misc/index.html"/>
 	<javadocs-contrib-queries href="api/contrib-queries/index.html"/>

Modified: lucene/dev/branches/branch_3x/lucene/src/test-framework/org/apache/lucene/util/_TestUtil.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/test-framework/org/apache/lucene/util/_TestUtil.java?rev=1140874&r1=1140873&r2=1140874&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/test-framework/org/apache/lucene/util/_TestUtil.java (original)
+++ lucene/dev/branches/branch_3x/lucene/src/test-framework/org/apache/lucene/util/_TestUtil.java Tue Jun 28 22:33:43 2011
@@ -35,6 +35,9 @@ import java.util.zip.ZipFile;
 
 import org.junit.Assert;
 
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+import org.apache.lucene.document.Fieldable;
 import org.apache.lucene.index.CheckIndex;
 import org.apache.lucene.index.ConcurrentMergeScheduler;
 import org.apache.lucene.index.IndexWriter;
@@ -440,4 +443,25 @@ public class _TestUtil {
       }
     }
   }
+
+  // NOTE: this is likely buggy, and cannot clone fields
+  // with tokenStreamValues, etc.  Use at your own risk!!
+
+  // TODO: is there a pre-existing way to do this!!!
+  public static Document cloneDocument(Document doc1) {
+    final Document doc2 = new Document();
+    for(Fieldable f : doc1.getFields()) {
+      Field field1 = (Field) f;
+      
+      Field field2 = new Field(field1.name(),
+                               field1.stringValue(),
+                               field1.isStored() ? Field.Store.YES : Field.Store.NO,
+                               field1.isIndexed() ? (field1.isTokenized() ? Field.Index.ANALYZED : Field.Index.NOT_ANALYZED) : Field.Index.NO);
+      field2.setOmitNorms(field1.getOmitNorms());
+      field2.setOmitTermFreqAndPositions(field1.getOmitTermFreqAndPositions());
+      doc2.add(field2);
+    }
+
+    return doc2;
+  }
 }

Modified: lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/index/TestNRTThreads.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/index/TestNRTThreads.java?rev=1140874&r1=1140873&r2=1140874&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/index/TestNRTThreads.java (original)
+++ lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/index/TestNRTThreads.java Tue Jun 28 22:33:43 2011
@@ -33,7 +33,6 @@ import java.util.concurrent.atomic.Atomi
 import org.apache.lucene.analysis.MockAnalyzer;
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.Field;
-import org.apache.lucene.document.Fieldable;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.PhraseQuery;
 import org.apache.lucene.search.Query;
@@ -65,28 +64,6 @@ public class TestNRTThreads extends Luce
     }
   }
 
-  // TODO: is there a pre-existing way to do this!!!
-  private Document cloneDoc(Document doc1) {
-    final Document doc2 = new Document();
-    for(Fieldable f : doc1.getFields()) {
-      Field field1 = (Field) f;
-      
-      Field field2 = new Field(field1.name(),
-                               field1.stringValue(),
-                               field1.isStored() ? Field.Store.YES : Field.Store.NO,
-                               field1.isIndexed() ? (field1.isTokenized() ? Field.Index.ANALYZED : Field.Index.NOT_ANALYZED) : Field.Index.NO);
-      if (field1.getOmitNorms()) {
-        field2.setOmitNorms(true);
-      }
-      if (field1.getOmitTermFreqAndPositions()) {
-        field2.setOmitTermFreqAndPositions(true);
-      }
-      doc2.add(field2);
-    }
-
-    return doc2;
-  }
-
   @Test
   public void testNRTThreads() throws Exception {
 
@@ -192,7 +169,7 @@ public class TestNRTThreads extends Luce
 
                     allSubDocs.add(subDocs);
                     doc.add(packIDField);
-                    docsList.add(cloneDoc(doc));
+                    docsList.add(_TestUtil.cloneDocument(doc));
                     docIDs.add(doc.get("docid"));
 
                     final int maxDocCount = _TestUtil.nextInt(random, 1, 10);
@@ -201,7 +178,7 @@ public class TestNRTThreads extends Luce
                       if (doc == null) {
                         break;
                       }
-                      docsList.add(cloneDoc(doc));
+                      docsList.add(_TestUtil.cloneDocument(doc));
                       docIDs.add(doc.get("docid"));
                     }
                     addCount.addAndGet(docsList.size());