org.hibernate.search.util.impl.InternalAnalyzerUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.hibernate.search.util.impl.InternalAnalyzerUtils.java

Source

/*
 * Hibernate Search, full-text search for your domain model
 *
 * License: GNU Lesser General Public License (LGPL), version 2.1 or later
 * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
 */
package org.hibernate.search.util.impl;

import java.io.IOException;
import java.io.StringReader;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.hibernate.search.exception.SearchException;
import org.hibernate.search.util.AnalyzerUtils;
import org.hibernate.search.util.logging.impl.Log;
import org.hibernate.search.util.logging.impl.LoggerFactory;

/**
 * Analysis helpers that have no reason to be exposed publicly as {@link AnalyzerUtils} is.
 *
 * @author Yoann Rodiere
 */
public final class InternalAnalyzerUtils {

    private static final Log log = LoggerFactory.make();

    private InternalAnalyzerUtils() {
        // Not used
    }

    /**
     * Returns the first token resulting from the analysis, logging a warning if there are more than one token.
     *
     * @param analyzer the Lucene analyzer to use
     * @param fieldName the name of the field: might affect the analyzer behavior
     * @param text the value to analyze
     * @return the first token resulting from the analysis
     *
     * @throws SearchException if a problem occurs when analyzing the sortable field's value.
     */
    public static String analyzeSortableValue(Analyzer analyzer, String fieldName, String text) {
        final TokenStream stream = analyzer.tokenStream(fieldName, new StringReader(text));
        try {
            try {
                String firstToken = null;
                CharTermAttribute term = stream.addAttribute(CharTermAttribute.class);
                stream.reset();
                if (stream.incrementToken()) {
                    firstToken = new String(term.buffer(), 0, term.length());
                    if (stream.incrementToken()) {
                        log.multipleTermsInAnalyzedSortableField(fieldName);
                    } else {
                        stream.end();
                    }
                }
                return firstToken;
            } finally {
                stream.close();
            }
        } catch (SearchException | IOException e) {
            throw log.couldNotAnalyzeSortableField(fieldName, e);
        }
    }

}