uk.ac.ebi.arrayexpress.utils.search.EFOExpandedHighlighter.java Source code

Java tutorial

Introduction

Here is the source code for uk.ac.ebi.arrayexpress.utils.search.EFOExpandedHighlighter.java

Source

package uk.ac.ebi.arrayexpress.utils.search;

import org.apache.lucene.search.Query;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.NullFragmenter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.ac.ebi.arrayexpress.utils.RegexHelper;
import uk.ac.ebi.arrayexpress.utils.saxon.search.AbstractIndexEnvironment;
import uk.ac.ebi.arrayexpress.utils.saxon.search.IQueryHighlighter;
import uk.ac.ebi.arrayexpress.utils.saxon.search.QueryInfo;

/*
 * Copyright 2009-2011 European Molecular Biology Laboratory
 *
 * Licensed 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.
 *
 */

public class EFOExpandedHighlighter implements IQueryHighlighter {
    // logging machinery
    private final Logger logger = LoggerFactory.getLogger(getClass());

    private AbstractIndexEnvironment env;

    private static final String HIT_OPEN_MARK = "\u00ab";
    private static final String HIT_CLOSE_MARK = "\u00bb";
    private static final String SYN_OPEN_MARK = "\u2039";
    private static final String SYN_CLOSE_MARK = "\u203a";
    private static final String EFO_OPEN_MARK = "\u2035";
    private static final String EFO_CLOSE_MARK = "\u2032";

    private final RegexHelper SYN_AND_HIT_REGEX = new RegexHelper(HIT_OPEN_MARK + SYN_OPEN_MARK + "([^"
            + SYN_CLOSE_MARK + HIT_CLOSE_MARK + "]+)" + SYN_CLOSE_MARK + HIT_CLOSE_MARK, "g");
    private final RegexHelper EFO_AND_SYN_REGEX = new RegexHelper(SYN_OPEN_MARK + EFO_OPEN_MARK + "([^"
            + EFO_CLOSE_MARK + SYN_CLOSE_MARK + "]+)" + EFO_CLOSE_MARK + SYN_CLOSE_MARK, "g");
    private final RegexHelper EFO_AND_HIT_REGEX = new RegexHelper(HIT_OPEN_MARK + EFO_OPEN_MARK + "([^"
            + EFO_CLOSE_MARK + HIT_CLOSE_MARK + "]+)" + EFO_CLOSE_MARK + HIT_CLOSE_MARK, "g");

    public IQueryHighlighter setEnvironment(AbstractIndexEnvironment env) {
        this.env = env;
        return this;
    }

    public String highlightQuery(QueryInfo info, String fieldName, String text) {
        String result = "";
        //      String fieldNameOriginal=fieldName;
        //      String textOriginal=text;
        //      String attributeName="";
        try {
            EFOExpandableQueryInfo queryInfo = null;
            //         logger.debug("text->{}", text);
            //         logger.debug("fieldName->{}", fieldName);
            if (info instanceof EFOExpandableQueryInfo) {
                queryInfo = (EFOExpandableQueryInfo) info;
            }

            //         if(fieldName.startsWith("attributes:")){
            //            fieldName="attributes";
            //            attributeName=fieldNameOriginal.replace("attributes:", "");
            //            text=attributeName+"="+text;
            //            
            //         }

            if (null == queryInfo) {
                result = doHighlightQuery(info.getQuery(), fieldName, text, HIT_OPEN_MARK, HIT_CLOSE_MARK);
            } else {
                result = doHighlightQuery(queryInfo.getOriginalQuery(), fieldName, text, HIT_OPEN_MARK,
                        HIT_CLOSE_MARK);
                result = doHighlightQuery(queryInfo.getSynonymPartQuery(), fieldName, result, SYN_OPEN_MARK,
                        SYN_CLOSE_MARK);
                result = doHighlightQuery(queryInfo.getEfoExpansionPartQuery(), fieldName, result, EFO_OPEN_MARK,
                        EFO_CLOSE_MARK);

                result = EFO_AND_SYN_REGEX.replace(result, SYN_OPEN_MARK + "$1" + SYN_CLOSE_MARK);
                result = SYN_AND_HIT_REGEX.replace(result, HIT_OPEN_MARK + "$1" + HIT_CLOSE_MARK);
                result = EFO_AND_HIT_REGEX.replace(result, HIT_OPEN_MARK + "$1" + HIT_CLOSE_MARK);
            }

        } catch (Exception x) {
            logger.error("Caught an exception:", x);
        }
        //logger.debug("result->"+result);
        return result;
    }

    private String doHighlightQuery(Query query, String fieldName, String text, String openMark, String closeMark) {
        try {
            SimpleHTMLFormatter htmlFormatter = new SimpleHTMLFormatter(openMark, closeMark);
            Highlighter highlighter = new Highlighter(htmlFormatter,
                    new QueryScorer(query, fieldName, this.env.defaultField));
            highlighter.setTextFragmenter(new NullFragmenter());

            String str = highlighter.getBestFragment(this.env.indexAnalyzer,
                    "".equals(fieldName) ? this.env.defaultField : fieldName, text);

            return null != str ? str : text;
        }

        catch (Exception x) {
            logger.error("Caught an exception:", x);
        }
        return text;

    }
}