public Lucene40BlockTreeTermsReader()

in lucene/backward-codecs/src/java/org/apache/lucene/backward_codecs/lucene40/blocktree/Lucene40BlockTreeTermsReader.java [125:302]


  public Lucene40BlockTreeTermsReader(PostingsReaderBase postingsReader, SegmentReadState state)
      throws IOException {
    boolean success = false;

    this.postingsReader = postingsReader;
    this.segment = state.segmentInfo.name;

    try {
      String termsName =
          IndexFileNames.segmentFileName(segment, state.segmentSuffix, TERMS_EXTENSION);
      termsIn = EndiannessReverserUtil.openInput(state.directory, termsName, state.context);
      version =
          CodecUtil.checkIndexHeader(
              termsIn,
              TERMS_CODEC_NAME,
              VERSION_START,
              VERSION_CURRENT,
              state.segmentInfo.getId(),
              state.segmentSuffix);

      String indexName =
          IndexFileNames.segmentFileName(segment, state.segmentSuffix, TERMS_INDEX_EXTENSION);
      indexIn = EndiannessReverserUtil.openInput(state.directory, indexName, state.context);
      CodecUtil.checkIndexHeader(
          indexIn,
          TERMS_INDEX_CODEC_NAME,
          version,
          version,
          state.segmentInfo.getId(),
          state.segmentSuffix);

      if (version < VERSION_META_FILE) {
        // Have PostingsReader init itself
        postingsReader.init(termsIn, state);

        // Verifying the checksum against all bytes would be too costly, but for now we at least
        // verify proper structure of the checksum footer. This is cheap and can detect some forms
        // of corruption such as file truncation.
        CodecUtil.retrieveChecksum(indexIn);
        CodecUtil.retrieveChecksum(termsIn);
      }

      // Read per-field details
      String metaName =
          IndexFileNames.segmentFileName(segment, state.segmentSuffix, TERMS_META_EXTENSION);
      Map<String, FieldReader> fieldMap = null;
      Throwable priorE = null;
      long indexLength = -1, termsLength = -1;
      try (ChecksumIndexInput metaIn =
          version >= VERSION_META_FILE
              ? EndiannessReverserUtil.openChecksumInput(state.directory, metaName, state.context)
              : null) {
        try {
          final IndexInput indexMetaIn, termsMetaIn;
          if (version >= VERSION_META_FILE) {
            CodecUtil.checkIndexHeader(
                metaIn,
                TERMS_META_CODEC_NAME,
                version,
                version,
                state.segmentInfo.getId(),
                state.segmentSuffix);
            indexMetaIn = termsMetaIn = metaIn;
            postingsReader.init(metaIn, state);
          } else {
            seekDir(termsIn);
            seekDir(termsIn);
            seekDir(indexIn);
            indexMetaIn = indexIn;
            termsMetaIn = termsIn;
          }

          final int numFields = termsMetaIn.readVInt();
          if (numFields < 0) {
            throw new CorruptIndexException("invalid numFields: " + numFields, termsMetaIn);
          }
          fieldMap = CollectionUtil.newHashMap(numFields);
          for (int i = 0; i < numFields; ++i) {
            final int field = termsMetaIn.readVInt();
            final long numTerms = termsMetaIn.readVLong();
            if (numTerms <= 0) {
              throw new CorruptIndexException(
                  "Illegal numTerms for field number: " + field, termsMetaIn);
            }
            final BytesRef rootCode = readBytesRef(termsMetaIn);
            final FieldInfo fieldInfo = state.fieldInfos.fieldInfo(field);
            if (fieldInfo == null) {
              throw new CorruptIndexException("invalid field number: " + field, termsMetaIn);
            }
            final long sumTotalTermFreq = termsMetaIn.readVLong();
            // when frequencies are omitted, sumDocFreq=sumTotalTermFreq and only one value is
            // written.
            final long sumDocFreq =
                fieldInfo.getIndexOptions() == IndexOptions.DOCS
                    ? sumTotalTermFreq
                    : termsMetaIn.readVLong();
            final int docCount = termsMetaIn.readVInt();
            if (version < VERSION_META_LONGS_REMOVED) {
              final int longsSize = termsMetaIn.readVInt();
              if (longsSize < 0) {
                throw new CorruptIndexException(
                    "invalid longsSize for field: " + fieldInfo.name + ", longsSize=" + longsSize,
                    termsMetaIn);
              }
            }
            BytesRef minTerm = readBytesRef(termsMetaIn);
            BytesRef maxTerm = readBytesRef(termsMetaIn);
            if (docCount < 0
                || docCount > state.segmentInfo.maxDoc()) { // #docs with field must be <= #docs
              throw new CorruptIndexException(
                  "invalid docCount: " + docCount + " maxDoc: " + state.segmentInfo.maxDoc(),
                  termsMetaIn);
            }
            if (sumDocFreq < docCount) { // #postings must be >= #docs with field
              throw new CorruptIndexException(
                  "invalid sumDocFreq: " + sumDocFreq + " docCount: " + docCount, termsMetaIn);
            }
            if (sumTotalTermFreq < sumDocFreq) { // #positions must be >= #postings
              throw new CorruptIndexException(
                  "invalid sumTotalTermFreq: " + sumTotalTermFreq + " sumDocFreq: " + sumDocFreq,
                  termsMetaIn);
            }
            final long indexStartFP = indexMetaIn.readVLong();
            FieldReader previous =
                fieldMap.put(
                    fieldInfo.name,
                    new FieldReader(
                        this,
                        fieldInfo,
                        numTerms,
                        rootCode,
                        sumTotalTermFreq,
                        sumDocFreq,
                        docCount,
                        indexStartFP,
                        indexMetaIn,
                        indexIn,
                        minTerm,
                        maxTerm));
            if (previous != null) {
              throw new CorruptIndexException("duplicate field: " + fieldInfo.name, termsMetaIn);
            }
          }
          if (version >= VERSION_META_FILE) {
            indexLength = metaIn.readLong();
            termsLength = metaIn.readLong();
          }
        } catch (Throwable exception) {
          priorE = exception;
        } finally {
          if (metaIn != null) {
            CodecUtil.checkFooter(metaIn, priorE);
          } else if (priorE != null) {
            IOUtils.rethrowAlways(priorE);
          }
        }
      }
      if (version >= VERSION_META_FILE) {
        // At this point the checksum of the meta file has been verified so the lengths are likely
        // correct
        CodecUtil.retrieveChecksum(indexIn, indexLength);
        CodecUtil.retrieveChecksum(termsIn, termsLength);
      } else {
        assert indexLength == -1 : indexLength;
        assert termsLength == -1 : termsLength;
      }
      List<String> fieldList = new ArrayList<>(fieldMap.keySet());
      fieldList.sort(null);
      this.fieldMap = fieldMap;
      this.fieldList = Collections.unmodifiableList(fieldList);
      success = true;
    } finally {
      if (!success) {
        // this.close() will close in:
        IOUtils.closeWhileHandlingException(this);
      }
    }
  }