MtasFieldsProducer.java.html 13.2 KB
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>MtasFieldsProducer.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">MTAS</a> &gt; <a href="index.source.html" class="el_package">mtas.codec</a> &gt; <span class="el_source">MtasFieldsProducer.java</span></div><h1>MtasFieldsProducer.java</h1><pre class="source lang-java linenums">package mtas.codec;

import java.io.EOFException;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.NoSuchFileException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.lucene.codecs.CodecUtil;
import org.apache.lucene.codecs.FieldsProducer;
import org.apache.lucene.codecs.PostingsFormat;
import org.apache.lucene.index.IndexFileNames;
import org.apache.lucene.index.IndexFormatTooOldException;
import org.apache.lucene.index.SegmentReadState;
import org.apache.lucene.index.Terms;
import org.apache.lucene.store.IndexInput;
import org.apache.lucene.util.Accountable;
import org.apache.lucene.util.Accountables;

/**
 * The Class MtasFieldsProducer.
 */
public class MtasFieldsProducer extends FieldsProducer {

  /** The Constant log. */
<span class="fc" id="L34">  private static final Log log = LogFactory.getLog(MtasFieldsProducer.class);</span>

  /** The delegate fields producer. */
  private FieldsProducer delegateFieldsProducer;

  /** The index input list. */
  private HashMap&lt;String, IndexInput&gt; indexInputList;

  /** The index input offset list. */
  private HashMap&lt;String, Long&gt; indexInputOffsetList;

  /** The version. */
  private int version;

  /**
   * Instantiates a new mtas fields producer.
   *
   * @param state the state
   * @param name the name
   * @throws IOException Signals that an I/O exception has occurred.
   */
  public MtasFieldsProducer(SegmentReadState state, String name)
<span class="fc" id="L56">      throws IOException {</span>
<span class="fc" id="L57">    String postingsFormatName = null;</span>
<span class="fc" id="L58">    indexInputList = new HashMap&lt;&gt;();</span>
<span class="fc" id="L59">    indexInputOffsetList = new HashMap&lt;&gt;();</span>
<span class="fc" id="L60">    version = MtasCodecPostingsFormat.VERSION_CURRENT;</span>

<span class="fc" id="L62">    postingsFormatName = addIndexInputToList(&quot;object&quot;, openMtasFile(state, name,</span>
        MtasCodecPostingsFormat.MTAS_OBJECT_EXTENSION), postingsFormatName);
<span class="fc" id="L64">    addIndexInputToList(&quot;term&quot;,</span>
<span class="fc" id="L65">        openMtasFile(state, name, MtasCodecPostingsFormat.MTAS_TERM_EXTENSION),</span>
        postingsFormatName);
<span class="fc" id="L67">    addIndexInputToList(&quot;prefix&quot;, openMtasFile(state, name,</span>
        MtasCodecPostingsFormat.MTAS_PREFIX_EXTENSION), postingsFormatName);
<span class="fc" id="L69">    addIndexInputToList(&quot;field&quot;,</span>
<span class="fc" id="L70">        openMtasFile(state, name, MtasCodecPostingsFormat.MTAS_FIELD_EXTENSION),</span>
        postingsFormatName);
<span class="fc" id="L72">    addIndexInputToList(&quot;indexDocId&quot;,</span>
<span class="fc" id="L73">        openMtasFile(state, name,</span>
            MtasCodecPostingsFormat.MTAS_INDEX_DOC_ID_EXTENSION),
        postingsFormatName);
<span class="fc" id="L76">    addIndexInputToList(&quot;indexObjectId&quot;,</span>
<span class="fc" id="L77">        openMtasFile(state, name,</span>
            MtasCodecPostingsFormat.MTAS_INDEX_OBJECT_ID_EXTENSION),
        postingsFormatName);
    try {
<span class="fc" id="L81">      addIndexInputToList(</span>
<span class="fc" id="L82">          &quot;doc&quot;, openMtasFile(state, name,</span>
<span class="fc" id="L83">              MtasCodecPostingsFormat.MTAS_DOC_EXTENSION, version, version),</span>
          postingsFormatName);
<span class="fc" id="L85">      addIndexInputToList(&quot;indexObjectPosition&quot;,</span>
<span class="fc" id="L86">          openMtasFile(state, name,</span>
              MtasCodecPostingsFormat.MTAS_INDEX_OBJECT_POSITION_EXTENSION,
<span class="fc" id="L88">              version, version),</span>
          postingsFormatName);
<span class="fc" id="L90">      addIndexInputToList(&quot;indexObjectParent&quot;,</span>
<span class="fc" id="L91">          openMtasFile(state, name,</span>
              MtasCodecPostingsFormat.MTAS_INDEX_OBJECT_PARENT_EXTENSION,
<span class="fc" id="L93">              version, version),</span>
          postingsFormatName);
<span class="nc" id="L95">    } catch (IndexFormatTooOldException e) {</span>
<span class="nc" id="L96">      log.debug(e);</span>
<span class="nc" id="L97">      throw new IOException(</span>
          &quot;This MTAS doesn't support your index version, please upgrade&quot;);
<span class="fc" id="L99">    }</span>
    // Load the delegate postingsFormatName from this file
<span class="fc" id="L101">    this.delegateFieldsProducer = PostingsFormat.forName(postingsFormatName)</span>
<span class="fc" id="L102">        .fieldsProducer(state);</span>
<span class="fc" id="L103">  }</span>

  /**
   * Adds the index input to list.
   *
   * @param name the name
   * @param in the in
   * @param postingsFormatName the postings format name
   * @return the string
   * @throws IOException Signals that an I/O exception has occurred.
   */
  private String addIndexInputToList(String name, IndexInput in,
      String postingsFormatName) throws IOException {
<span class="pc bpc" id="L116" title="1 of 2 branches missed.">    if (indexInputList.get(name) != null) {</span>
<span class="nc" id="L117">      indexInputList.get(name).close();</span>
    }
<span class="pc bpc" id="L119" title="1 of 2 branches missed.">    if (in != null) {</span>
<span class="fc" id="L120">      String localPostingsFormatName = postingsFormatName;</span>
<span class="fc bfc" id="L121" title="All 2 branches covered.">      if (localPostingsFormatName == null) {</span>
<span class="fc" id="L122">        localPostingsFormatName = in.readString();</span>
<span class="pc bpc" id="L123" title="1 of 2 branches missed.">      } else if (!in.readString().equals(localPostingsFormatName)) {</span>
<span class="nc" id="L124">        throw new IOException(&quot;delegate codec &quot; + name + &quot; doesn't equal &quot;</span>
            + localPostingsFormatName);
      }
<span class="fc" id="L127">      indexInputList.put(name, in);</span>
<span class="fc" id="L128">      indexInputOffsetList.put(name, in.getFilePointer());</span>
<span class="fc" id="L129">      return localPostingsFormatName;</span>
    } else {
<span class="nc" id="L131">      log.debug(&quot;no &quot; + name + &quot; registered&quot;);</span>
<span class="nc" id="L132">      return null;</span>
    }
  }

  /*
   * (non-Javadoc)
   * 
   * @see org.apache.lucene.index.Fields#iterator()
   */
  @Override
  public Iterator&lt;String&gt; iterator() {
<span class="nc" id="L143">    return delegateFieldsProducer.iterator();</span>
  }

  /*
   * (non-Javadoc)
   * 
   * @see org.apache.lucene.codecs.FieldsProducer#close()
   */
  @Override
  public void close() throws IOException {
<span class="fc" id="L153">    delegateFieldsProducer.close();</span>
<span class="fc bfc" id="L154" title="All 2 branches covered.">    for (Entry&lt;String, IndexInput&gt; entry : indexInputList.entrySet()) {</span>
<span class="fc" id="L155">      entry.getValue().close();</span>
<span class="fc" id="L156">    }</span>
<span class="fc" id="L157">  }</span>

  /*
   * (non-Javadoc)
   * 
   * @see org.apache.lucene.index.Fields#terms(java.lang.String)
   */
  @Override
  public Terms terms(String field) throws IOException {
<span class="fc" id="L166">    return new MtasTerms(delegateFieldsProducer.terms(field), indexInputList,</span>
        indexInputOffsetList, version);
  }

  /*
   * (non-Javadoc)
   * 
   * @see org.apache.lucene.index.Fields#size()
   */
  @Override
  public int size() {
<span class="nc" id="L177">    return delegateFieldsProducer.size();</span>
  }

  /*
   * (non-Javadoc)
   * 
   * @see org.apache.lucene.util.Accountable#ramBytesUsed()
   */
  @Override
  public long ramBytesUsed() {
    // return BASE_RAM_BYTES_USED + delegateFieldsProducer.ramBytesUsed();
<span class="nc" id="L188">    return 3 * delegateFieldsProducer.ramBytesUsed();</span>
  }

  /*
   * (non-Javadoc)
   * 
   * @see org.apache.lucene.util.Accountable#getChildResources()
   */
  @Override
  public Collection&lt;Accountable&gt; getChildResources() {
<span class="nc" id="L198">    List&lt;Accountable&gt; resources = new ArrayList&lt;&gt;();</span>
<span class="nc bnc" id="L199" title="All 2 branches missed.">    if (delegateFieldsProducer != null) {</span>
<span class="nc" id="L200">      resources.add(</span>
<span class="nc" id="L201">          Accountables.namedAccountable(&quot;delegate&quot;, delegateFieldsProducer));</span>
    }
<span class="nc" id="L203">    return Collections.unmodifiableList(resources);</span>
  }

  /*
   * (non-Javadoc)
   * 
   * @see org.apache.lucene.codecs.FieldsProducer#checkIntegrity()
   */
  @Override
  public void checkIntegrity() throws IOException {
<span class="nc" id="L213">    delegateFieldsProducer.checkIntegrity();</span>
<span class="nc" id="L214">  }</span>

  /*
   * (non-Javadoc)
   * 
   * @see java.lang.Object#toString()
   */
  @Override
  public String toString() {
<span class="nc" id="L223">    return getClass().getSimpleName() + &quot;(delegate=&quot; + delegateFieldsProducer</span>
        + &quot;)&quot;;
  }

  /**
   * Open mtas file.
   *
   * @param state the state
   * @param name the name
   * @param extension the extension
   * @param minimum the minimum
   * @param maximum the maximum
   * @return the index input
   * @throws IOException Signals that an I/O exception has occurred.
   */
  private IndexInput openMtasFile(SegmentReadState state, String name,
      String extension, Integer minimum, Integer maximum) throws IOException {
<span class="fc" id="L240">    String fileName = IndexFileNames.segmentFileName(state.segmentInfo.name,</span>
        state.segmentSuffix, extension);
    IndexInput object;
    try {
<span class="fc" id="L244">      object = state.directory.openInput(fileName, state.context);</span>
<span class="nc" id="L245">    } catch (FileNotFoundException | NoSuchFileException e) {</span>
<span class="nc" id="L246">      log.debug(e);</span>
      // throw new NoSuchFileException(e.getMessage());
<span class="nc" id="L248">      return null;</span>
<span class="fc" id="L249">    }</span>
<span class="fc bfc" id="L250" title="All 2 branches covered.">    int minVersion = (minimum == null) ? MtasCodecPostingsFormat.VERSION_START</span>
<span class="fc" id="L251">        : minimum.intValue();</span>
<span class="fc bfc" id="L252" title="All 2 branches covered.">    int maxVersion = (maximum == null) ? MtasCodecPostingsFormat.VERSION_CURRENT</span>
<span class="fc" id="L253">        : maximum.intValue();</span>
    try {
<span class="fc" id="L255">      CodecUtil.checkIndexHeader(object, name, minVersion, maxVersion,</span>
<span class="fc" id="L256">          state.segmentInfo.getId(), state.segmentSuffix);</span>
<span class="nc" id="L257">    } catch (IndexFormatTooOldException e) {</span>
<span class="nc" id="L258">      object.close();</span>
<span class="nc" id="L259">      log.debug(e);</span>
<span class="nc" id="L260">      throw new IndexFormatTooOldException(e.getMessage(), e.getVersion(),</span>
<span class="nc" id="L261">          e.getMinVersion(), e.getMaxVersion());</span>
<span class="nc" id="L262">    } catch (EOFException e) {</span>
<span class="nc" id="L263">      object.close();</span>
<span class="nc" id="L264">      log.debug(e);</span>
      // throw new EOFException(e.getMessage());
<span class="nc" id="L266">      return null;</span>
<span class="fc" id="L267">    }</span>
<span class="fc" id="L268">    return object;</span>
  }

  /**
   * Open mtas file.
   *
   * @param state the state
   * @param name the name
   * @param extension the extension
   * @return the index input
   * @throws IOException Signals that an I/O exception has occurred.
   */
  private IndexInput openMtasFile(SegmentReadState state, String name,
      String extension) throws IOException {
<span class="fc" id="L282">    return openMtasFile(state, name, extension, null, null);</span>
  }

}
</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.7.9.201702052155</span></div></body></html>