package org.apache.lucene.index; /* * 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 org.apache.lucene.codecs.DocValuesConsumer; import org.apache.lucene.search.similarities.Similarity; final class NormsConsumerPerField extends InvertedDocEndConsumerPerField implements Comparable<NormsConsumerPerField> { private final FieldInfo fieldInfo; private final DocumentsWriterPerThread.DocState docState; private final Similarity similarity; private final FieldInvertState fieldState; private NumericDocValuesWriter consumer; public NormsConsumerPerField(final DocInverterPerField docInverterPerField, final FieldInfo fieldInfo, NormsConsumer parent) { this.fieldInfo = fieldInfo; docState = docInverterPerField.docState; fieldState = docInverterPerField.fieldState; similarity = docState.similarity; } @Override public int compareTo(NormsConsumerPerField other) { return fieldInfo.name.compareTo(other.fieldInfo.name); } @Override void finish() throws IOException { if (fieldInfo.isIndexed() && !fieldInfo.omitsNorms()) { if (consumer == null) { fieldInfo.setNormValueType(FieldInfo.DocValuesType.NUMERIC); consumer = new NumericDocValuesWriter(fieldInfo, docState.docWriter.bytesUsed, false); } consumer.addValue(docState.docID, similarity.computeNorm(fieldState)); } } void flush(SegmentWriteState state, DocValuesConsumer normsWriter) throws IOException { int docCount = state.segmentInfo.getDocCount(); if (consumer == null) { return; // null type - not omitted but not written - // meaning the only docs that had // norms hit exceptions (but indexed=true is set...) } consumer.finish(docCount); consumer.flush(state, normsWriter); } boolean isEmpty() { return consumer == null; } @Override void abort() { // } }