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 {