1 package org.apache.lucene.index;
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
20 import org.apache.lucene.util.ArrayUtil;
21 import org.apache.lucene.search.Similarity;
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. */
28 final class NormsWriterPerField extends InvertedDocEndConsumerPerField implements Comparable<NormsWriterPerField> {
30 final NormsWriterPerThread perThread;
31 final FieldInfo fieldInfo;
32 final DocumentsWriter.DocState docState;
34 // Holds all docID/norm pairs we've seen
35 int[] docIDs = new int[1];
36 byte[] norms = new byte[1];
39 final FieldInvertState fieldState;
42 // Shrink back if we are overallocated now:
43 docIDs = ArrayUtil.shrink(docIDs, upto);
44 norms = ArrayUtil.shrink(norms, upto);
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;
60 public int compareTo(NormsWriterPerField other) {
61 return fieldInfo.name.compareTo(other.fieldInfo.name);
66 if (fieldInfo.isIndexed && !fieldInfo.omitNorms) {
67 if (docIDs.length <= upto) {
68 assert docIDs.length == upto;
69 docIDs = ArrayUtil.grow(docIDs, 1+upto);
71 if (norms.length <= upto) {
72 assert norms.length == upto;
73 norms = ArrayUtil.grow(norms, 1+upto);
75 final float norm = docState.similarity.computeNorm(fieldInfo.name, fieldState);
76 norms[upto] = docState.similarity.encodeNormValue(norm);
77 docIDs[upto] = docState.docID;