pylucene 3.5.0-3
[pylucene.git] / lucene-java-3.5.0 / lucene / src / java / org / apache / lucene / index / NormsWriterPerField.java
1 package org.apache.lucene.index;
2
3 /**
4  * Licensed to the Apache Software Foundation (ASF) under one or more
5  * contributor license agreements.  See the NOTICE file distributed with
6  * this work for additional information regarding copyright ownership.
7  * The ASF licenses this file to You under the Apache License, Version 2.0
8  * (the "License"); you may not use this file except in compliance with
9  * the License.  You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19
20 import org.apache.lucene.util.ArrayUtil;
21 import org.apache.lucene.search.Similarity;
22
23 /** Taps into DocInverter, as an InvertedDocEndConsumer,
24  *  which is called at the end of inverting each field.  We
25  *  just look at the length for the field (docState.length)
26  *  and record the norm. */
27
28 final class NormsWriterPerField extends InvertedDocEndConsumerPerField implements Comparable<NormsWriterPerField> {
29
30   final NormsWriterPerThread perThread;
31   final FieldInfo fieldInfo;
32   final DocumentsWriter.DocState docState;
33
34   // Holds all docID/norm pairs we've seen
35   int[] docIDs = new int[1];
36   byte[] norms = new byte[1];
37   int upto;
38
39   final FieldInvertState fieldState;
40
41   public void reset() {
42     // Shrink back if we are overallocated now:
43     docIDs = ArrayUtil.shrink(docIDs, upto);
44     norms = ArrayUtil.shrink(norms, upto);
45     upto = 0;
46   }
47
48   public NormsWriterPerField(final DocInverterPerField docInverterPerField, final NormsWriterPerThread perThread, final FieldInfo fieldInfo) {
49     this.perThread = perThread;
50     this.fieldInfo = fieldInfo;
51     docState = perThread.docState;
52     fieldState = docInverterPerField.fieldState;
53   }
54
55   @Override
56   void abort() {
57     upto = 0;
58   }
59
60   public int compareTo(NormsWriterPerField other) {
61     return fieldInfo.name.compareTo(other.fieldInfo.name);
62   }
63   
64   @Override
65   void finish() {
66     if (fieldInfo.isIndexed && !fieldInfo.omitNorms) {
67       if (docIDs.length <= upto) {
68         assert docIDs.length == upto;
69         docIDs = ArrayUtil.grow(docIDs, 1+upto);
70       }
71       if (norms.length <= upto) {
72         assert norms.length == upto;
73         norms = ArrayUtil.grow(norms, 1+upto);
74       }
75       final float norm = docState.similarity.computeNorm(fieldInfo.name, fieldState);
76       norms[upto] = docState.similarity.encodeNormValue(norm);
77       docIDs[upto] = docState.docID;
78       upto++;
79     }
80   }
81 }