You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by si...@apache.org on 2011/01/12 22:38:55 UTC

svn commit: r1058328 [2/2] - in /lucene/dev/trunk: lucene/ lucene/contrib/instantiated/src/java/org/apache/lucene/store/instantiated/ lucene/contrib/memory/src/java/org/apache/lucene/index/memory/ lucene/src/java/org/apache/lucene/index/ lucene/src/jav...

Added: lucene/dev/trunk/lucene/src/java/org/apache/lucene/util/PerReaderTermState.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/util/PerReaderTermState.java?rev=1058328&view=auto
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/util/PerReaderTermState.java (added)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/util/PerReaderTermState.java Wed Jan 12 21:38:51 2011
@@ -0,0 +1,148 @@
+package org.apache.lucene.util;
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.IOException;
+import java.util.Arrays;
+
+import org.apache.lucene.index.Fields;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.index.TermState;
+import org.apache.lucene.index.Terms;
+import org.apache.lucene.index.TermsEnum;
+import org.apache.lucene.index.IndexReader.AtomicReaderContext;
+import org.apache.lucene.index.IndexReader.ReaderContext;
+import org.apache.lucene.index.TermsEnum.SeekStatus;
+
+/**
+ * Maintains a {@link IndexReader} {@link TermState} view over
+ * {@link IndexReader} instances containing a single term. The
+ * {@link PerReaderTermState} doesn't track if the given {@link TermState}
+ * objects are valid, neither if the {@link TermState} instances refer to the
+ * same terms in the associated readers.
+ * 
+ * @lucene.experimental
+ */
+public final class PerReaderTermState {
+  public final ReaderContext topReaderContext; // for asserting!
+  private final TermState[] states;
+  private int docFreq;
+
+  /**
+   * Creates an empty {@link PerReaderTermState} from a {@link ReaderContext}
+   */
+  public PerReaderTermState(ReaderContext context) {
+    assert context != null && context.isTopLevel;
+    topReaderContext = context;
+    docFreq = 0;
+    final int len;
+    if (context.leaves() == null) {
+      len = 1;
+    } else {
+      len = context.leaves().length;
+    }
+    states = new TermState[len];
+  }
+  
+  /**
+   * Creates a {@link PerReaderTermState} with an initial {@link TermState},
+   * {@link IndexReader} pair.
+   */
+  public PerReaderTermState(ReaderContext context, TermState state, int ord, int docFreq) {
+    this(context);
+    register(state, ord, docFreq);
+  }
+
+  /**
+   * Creates a {@link PerReaderTermState} from a top-level {@link ReaderContext} and the
+   * given {@link Term}. This method will lookup the given term in all context's leaf readers 
+   * and register each of the readers containing the term in the returned {@link PerReaderTermState}
+   * using the leaf reader's ordinal.
+   * <p>
+   * Note: the given context must be a top-level context.
+   */
+  public static PerReaderTermState build(ReaderContext context, Term term, boolean cache)
+      throws IOException {
+    assert context != null && context.isTopLevel;
+    final String field = term.field();
+    final BytesRef bytes = term.bytes();
+    final PerReaderTermState perReaderTermState = new PerReaderTermState(context);
+    final AtomicReaderContext[] leaves = ReaderUtil.leaves(context);
+    for (int i = 0; i < leaves.length; i++) {
+      final Fields fields = leaves[i].reader.fields();
+      if (fields != null) {
+        final Terms terms = fields.terms(field);
+        if (terms != null) {
+          final TermsEnum termsEnum = terms.getThreadTermsEnum(); // thread-private don't share!
+          if (SeekStatus.FOUND == termsEnum.seek(bytes, cache)) { 
+            final TermState termState = termsEnum.termState();
+            perReaderTermState.register(termState, leaves[i].ord, termsEnum.docFreq());
+          }
+        }
+      }
+    }
+    return perReaderTermState;
+  }
+
+  /**
+   * Clears the {@link PerReaderTermState} internal state and removes all
+   * registered {@link TermState}s
+   */
+  public void clear() {
+    docFreq = 0;
+    Arrays.fill(states, null);
+  }
+
+  /**
+   * Registers and associates a {@link TermState} with an leaf ordinal. The leaf ordinal
+   * should be derived from a {@link ReaderContext}'s leaf ord.
+   */
+  public void register(TermState state, final int ord, final int docFreq) {
+    assert state != null : "state must not be null";
+    assert ord >= 0 && ord < states.length;
+    assert states[ord] == null : "state for ord: " + ord
+        + " already registered";
+    this.docFreq += docFreq;
+    states[ord] = state;
+  }
+
+  /**
+   * Returns the {@link TermState} for an leaf ordinal or <code>null</code> if no
+   * {@link TermState} for the ordinal was registered.
+   * 
+   * @param ord
+   *          the readers leaf ordinal to get the {@link TermState} for.
+   * @return the {@link TermState} for the given readers ord or <code>null</code> if no
+   *         {@link TermState} for the reader was registered
+   */
+  public TermState get(int ord) {
+    assert ord >= 0 && ord < states.length;
+    return states[ord];
+  }
+
+  /**
+   *  Returns the accumulated document frequency of all {@link TermState}
+   *         instances passed to {@link #register(TermState, int)}.
+   * @return the accumulated document frequency of all {@link TermState}
+   *         instances passed to {@link #register(TermState, int)}.
+   */
+  public int docFreq() {
+    return docFreq;
+  }
+}
\ No newline at end of file

Modified: lucene/dev/trunk/lucene/src/test/org/apache/lucene/TestExternalCodecs.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/test/org/apache/lucene/TestExternalCodecs.java?rev=1058328&r1=1058327&r2=1058328&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/test/org/apache/lucene/TestExternalCodecs.java (original)
+++ lucene/dev/trunk/lucene/src/test/org/apache/lucene/TestExternalCodecs.java Wed Jan 12 21:38:51 2011
@@ -18,6 +18,7 @@ package org.apache.lucene;
  */
 
 import org.apache.lucene.util.*;
+import org.apache.lucene.util.Bits;
 import org.apache.lucene.index.*;
 import org.apache.lucene.document.*;
 import org.apache.lucene.search.*;
@@ -330,10 +331,6 @@ public class TestExternalCodecs extends 
       }
 
       @Override
-      public void cacheCurrentTerm() {
-      }
-
-      @Override
       public DocsEnum docs(Bits skipDocs, DocsEnum reuse) {
         return new RAMDocsEnum(ramField.termToDocs.get(current), skipDocs);
       }

Modified: lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/QueryUtils.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/QueryUtils.java?rev=1058328&r1=1058327&r2=1058328&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/QueryUtils.java (original)
+++ lucene/dev/trunk/lucene/src/test/org/apache/lucene/search/QueryUtils.java Wed Jan 12 21:38:51 2011
@@ -212,8 +212,6 @@ public class QueryUtils {
       throw e2;
     }
   }
-  
-
 
   /** alternate scorer skipTo(),skipTo(),next(),next(),skipTo(),skipTo(), etc
    * and ensure a hitcollector receives same docs and scores

Modified: lucene/dev/trunk/lucene/src/test/org/apache/lucene/util/automaton/fst/TestFSTs.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/test/org/apache/lucene/util/automaton/fst/TestFSTs.java?rev=1058328&r1=1058327&r2=1058328&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/test/org/apache/lucene/util/automaton/fst/TestFSTs.java (original)
+++ lucene/dev/trunk/lucene/src/test/org/apache/lucene/util/automaton/fst/TestFSTs.java Wed Jan 12 21:38:51 2011
@@ -40,6 +40,7 @@ import org.apache.lucene.index.IndexRead
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.IndexWriterConfig;
 import org.apache.lucene.index.MultiFields;
+import org.apache.lucene.index.OrdTermState;
 import org.apache.lucene.index.Terms;
 import org.apache.lucene.index.TermsEnum;
 import org.apache.lucene.index.codecs.CodecProvider;

Modified: lucene/dev/trunk/solr/src/java/org/apache/solr/request/UnInvertedField.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/java/org/apache/solr/request/UnInvertedField.java?rev=1058328&r1=1058327&r2=1058328&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/java/org/apache/solr/request/UnInvertedField.java (original)
+++ lucene/dev/trunk/solr/src/java/org/apache/solr/request/UnInvertedField.java Wed Jan 12 21:38:51 2011
@@ -1000,10 +1000,6 @@ class NumberedTermsEnum extends TermsEnu
     return tenum.docFreq();
   }
 
-  @Override
-  public void cacheCurrentTerm() {
-    throw new UnsupportedOperationException();
-  }
 
   public BytesRef skipTo(BytesRef target) throws IOException {