de.dlr.knowledgefinder.webapp.webservice.solr.query.AbstractSolrQueryFactory.java Source code

Java tutorial

Introduction

Here is the source code for de.dlr.knowledgefinder.webapp.webservice.solr.query.AbstractSolrQueryFactory.java

Source

/*******************************************************************************
 * Copyright 2016 DLR - German Aerospace Center
 *
 * 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.
 *******************************************************************************/
package de.dlr.knowledgefinder.webapp.webservice.solr.query;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrQuery.ORDER;
import org.apache.solr.client.solrj.SolrQuery.SortClause;
import org.apache.solr.common.params.FacetParams;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.dlr.knowledgefinder.webapp.webservice.service.impl.KnowledgeFinderServiceImpl;

/**
 * The Class AbstractSolrQueryFactory.
 */
public abstract class AbstractSolrQueryFactory {

    protected String DEFAULT_QUERY = "";
    protected String[] DEFAULT_FQ = new String[] {};
    protected String[] DEFAULT_FIELDS = new String[] {};
    protected String[] DEFAULT_HL_FIELDS = new String[] {};
    protected String DEFAULT_SORT_FIELD = "";
    protected SolrQuery.ORDER DEFAULT_SORT_ORDER = SolrQuery.ORDER.asc;
    protected int DEFAULT_FACET_LIMIT = 0;

    protected String APPEND_QUERY = "";
    protected String[] ALLOWED_FIELDS = new String[] {};
    protected String[] ALLOWED_FACET_FIELDS = new String[] {};

    private final Logger logger = LoggerFactory.getLogger(AbstractSolrQueryFactory.class);

    protected String getAppendQuery() {
        return APPEND_QUERY;
    }

    protected String[] getAllowedFields() {
        return ALLOWED_FIELDS;
    }

    protected String[] getAllowedFacetFields() {
        return ALLOWED_FACET_FIELDS;
    }

    protected String getDefaultQuery() {
        return DEFAULT_QUERY;
    }

    protected String[] getDefaultFields() {
        return DEFAULT_FIELDS;
    }

    protected String[] getDefaultHLFields() {
        return DEFAULT_HL_FIELDS;
    }

    protected String[] getDefaultFilterQueries() {
        return DEFAULT_FQ;
    }

    protected int getDefaultFacetLimit() {
        return DEFAULT_FACET_LIMIT;
    }

    protected SortClause getDefaultSort() {
        return new SortClause(DEFAULT_SORT_FIELD, DEFAULT_SORT_ORDER);
    }

    /**
     * Creates the query.
     *
     * @param query
     *            the query, which should be executed
     * @param filterQuery
     *            the filter query
     * @param fields
     *            the fields
     * @param facetFields
     *            the facet fields
     * @param start
     *            the start
     * @param rows
     *            the rows
     * @param sort
     *            the sort
     * @param highlightFields
     *            the highlight fields
     * @param limit
     *            the limit
     * @return the solr query
     */
    public SolrQuery createQuery(String query, String[] filterQuery, String[] fields, String[] facetFields,
            String start, String rows, String[] sort, String[] highlightFields, String limit) {

        query = ((query != null) && !query.equals("")) ? query : getDefaultQuery();
        fields = fields != null ? fields : getDefaultFields();
        highlightFields = highlightFields != null ? highlightFields : getDefaultHLFields();
        filterQuery = filterQuery != null ? filterQuery : getDefaultFilterQueries();

        List<String> fieldList = splitStringArrays(fields);
        List<String> fieldHLList = splitStringArrays(highlightFields);
        for (int i = 0; i < fieldHLList.size(); i++) {
            fieldHLList.set(i, fieldHLList.get(i).trim());
        }

        SolrQuery solrQuery = createSolrQueryWithQueryString(query);

        setSolrQueryParameter(solrQuery);

        addFilterQuery(solrQuery, filterQuery);
        addFieldsToSolrQuery(solrQuery, fieldList);
        makeFieldsToHighlightFields(solrQuery, fieldHLList);
        addSortMethodToSolrQuery(solrQuery, sort);
        setStartForSolrQuery(solrQuery, start);
        setRowsForSolrQuery(solrQuery, rows);

        if (facetFields != null) {
            setFacetFieldsForSolrQuery(solrQuery, facetFields);
            setLimitForSolrQuery(solrQuery, limit);

        }
        return solrQuery;
    }

    private List<String> splitStringArrays(String[] strArr) {
        List<String> list = new ArrayList<String>();
        for (String f : strArr) {
            if (f != null) {
                list.addAll(splitString(f));
            }
        }
        return list;
    }

    private List<String> splitString(String toSplit) {
        return Arrays.asList(toSplit.split(","));
    }

    private SolrQuery createSolrQueryWithQueryString(String query) {
        SolrQuery solrQuery = new SolrQuery();

        String appendQuery = getAppendQuery().trim();
        String qValue = query;
        if (appendQuery != "" && !appendQuery.equals(qValue)) {
            qValue = appendQuery + " AND " + qValue;
        }
        solrQuery.setQuery(qValue);
        solrQuery.addField(null);

        return solrQuery;
    }

    private void addFilterQuery(SolrQuery solrQuery, String[] filterQuery) {

        for (String fq : filterQuery) {
            // cached queries, better performance and not in
            // highlight hl.q = q but fq != q and fq != hl.q
            if (fq != null && fq != "") {
                solrQuery.addFilterQuery(fq.trim());
            }
        }
    }

    private void addFieldsToSolrQuery(SolrQuery solrQuery, List<String> fieldList) {

        tryToAddGivenFieldsToSolrQuery(solrQuery, fieldList);
        if (solrQuery.getFields().equals("")) {
            addDefaultFieldsToSolrQuery(solrQuery);
        }
    }

    private void tryToAddGivenFieldsToSolrQuery(SolrQuery solrQuery, List<String> fieldList) {
        List<String> allowedFields = Arrays.asList(getAllowedFields());
        for (String f : fieldList) {
            f = f.trim();
            if (allowedFields.contains(f)) {
                solrQuery.addField(f);
            }
        }
    }

    private void addDefaultFieldsToSolrQuery(SolrQuery solrQuery) {
        for (String f : getDefaultFields()) {
            solrQuery.addField(f.trim());
        }
    }

    private void setSolrQueryParameter(SolrQuery solrQuery) {
        solrQuery.setHighlight(true);
        solrQuery.setParam("hl.fragsize", "0");
        solrQuery.setParam("hl.preserveMulti", "true");
    }

    private void makeFieldsToHighlightFields(SolrQuery solrQuery, List<String> fieldHLList) {
        List<String> fieldList = splitString(solrQuery.getFields());

        for (String field : fieldList) {
            field = field.trim();
            if (fieldHLList.contains(field)) {
                solrQuery.addHighlightField(field);

            }
        }
    }

    private void addSortMethodToSolrQuery(SolrQuery solrQuery, String[] sort) {
        if (sort != null) {
            for (String s : sort) {
                tryToAddSortOrder(solrQuery, s);
            }
        }

        if (solrQuery.getSorts().size() == 0) {
            solrQuery.addSort(getDefaultSort());
        }
    }

    private void tryToAddSortOrder(SolrQuery solrQuery, String s) {
        if (s != null && !s.equals("")) {
            String[] sortSplit = s.trim().split(" ");
            if (sortSplit.length == 2) {
                ORDER queryOrderSort = null;
                if (sortSplit[1].equals("asc")) {
                    queryOrderSort = SolrQuery.ORDER.asc;
                } else if (sortSplit[1].equals("desc")) {
                    queryOrderSort = SolrQuery.ORDER.desc;
                }
                String fieldSort = sortSplit[0];
                if (queryOrderSort != null) {
                    solrQuery.addSort(new SortClause(fieldSort, queryOrderSort));
                }
            }
        }
    }

    private void setStartForSolrQuery(SolrQuery solrQuery, String start) {
        try {
            int startInt = Integer.parseInt(start);
            if (startInt >= 0) {
                solrQuery.setStart(startInt);
            }
        } catch (NumberFormatException e) {
        }

    }

    private void setRowsForSolrQuery(SolrQuery solrQuery, String rows) {
        try {
            int rowsInt = Integer.parseInt(rows);
            if (rowsInt >= 0) {
                solrQuery.setRows(rowsInt);
            }
        } catch (NumberFormatException e) {
        }
    }

    private void setFacetFieldsForSolrQuery(SolrQuery solrQuery, String[] facetFields) {

        List<String> allowedFacetFields = Arrays.asList(getAllowedFacetFields());
        List<String> facetFieldList = splitStringArrays(facetFields);

        solrQuery.setFacetSort(FacetParams.FACET_SORT_COUNT);

        for (String fField : facetFieldList) {
            fField = fField.trim();
            if (allowedFacetFields.contains(fField)) {
                solrQuery.addFacetField(fField);
            }
        }

    }

    private void setLimitForSolrQuery(SolrQuery solrQuery, String limit) {
        try {
            int limitInt = Integer.parseInt(limit);
            if (limitInt >= 0) {
                solrQuery.setFacetLimit(limitInt);
            } else {
                solrQuery.setFacetLimit(getDefaultFacetLimit());
            }
        } catch (NumberFormatException e) {
            solrQuery.setFacetLimit(getDefaultFacetLimit());
        }
    }

}