org.flockdata.search.helper.QueryGenerator.java Source code

Java tutorial

Introduction

Here is the source code for org.flockdata.search.helper.QueryGenerator.java

Source

/*
 *
 *  Copyright (c) 2012-2016 "FlockData LLC"
 *
 *  This file is part of FlockData.
 *
 *  FlockData is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  FlockData is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with FlockData.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.flockdata.search.helper;

import org.apache.commons.lang3.StringEscapeUtils;
import org.flockdata.helper.JsonUtils;
import org.flockdata.search.model.QueryInterface;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author  mholdsworth
 * @since 04/08/2014
 */
public class QueryGenerator {
    private static Logger logger = LoggerFactory.getLogger(QueryGenerator.class);

    public static String getSimpleQuery(QueryInterface params, Boolean highlightEnabled) {
        if (params.getFilter() != null)
            return getFilteredQuery(params, highlightEnabled);
        String queryString = params.getSearchText();
        if (queryString == null)
            queryString = "*";

        logger.debug("getSearchText {}", queryString);
        StringBuilder simpleQuery = new StringBuilder();
        if (queryString.contains("\"")) {
            queryString = StringEscapeUtils.escapeJson(queryString);
        }

        simpleQuery.append("{ \"query\": {" + "        \"query_string\": { " + "            \"query\": " + '"')
                .append(queryString.toLowerCase()).append('"').append("          }").append("  }");

        if (highlightEnabled) {
            simpleQuery.append(",\n" + "  \"highlight\": { " + "\"pre_tags\" : [\"<strong>\"],"
                    + "\"post_tags\" : [\"</strong>\"]," + "\"order\": \"score\", "
                    + "\"require_field_match\": false, " +

                    "\"encoder\" : \"html\"," + "    \"fields\": { " + "      \"*\": {} " + "    } " + "  }");
        }
        simpleQuery.append(" }");
        return simpleQuery.toString();
    }

    public static String getFilteredQuery(QueryInterface queryParams, Boolean highlightEnabled) {
        String queryString = queryParams.getSearchText();
        if (queryString == null)
            queryString = "*";

        logger.debug("getSearchText {}", queryString);
        StringBuilder simpleQuery = new StringBuilder();
        if (queryString.contains("\"")) {
            queryString = StringEscapeUtils.escapeJson(queryString);
        }
        if (queryString.equals(""))
            queryString = "*";
        String filter = getRelationshipFilter(queryParams);
        simpleQuery.append("\n" + " {\"query\": {\n" + "    \"filtered\": {\n" + "       \"query\": {\n"
                + "           \"query_string\": {\"query\":\"" + queryString.toLowerCase() + "\"}\n" + "   "
                + (!filter.equals("") ? "}," + filter : "}") +
                //                filter +
                "  }\n" + "}");

        if (highlightEnabled) {
            simpleQuery.append(",\n" + "  \"highlight\": { " + "\"pre_tags\" : [\"<strong>\"],"
                    + "\"post_tags\" : [\"</strong>\"]," + "\"encoder\" : \"html\"," + "    \"fields\": { "
                    + "      \"*\": {} " + "    } " + "  }");
        }
        simpleQuery.append(" }");
        return simpleQuery.toString();
    }

    private static String getRelationshipFilter(QueryInterface queryParams) {
        if (queryParams.getFilter() != null)
            return "\"filter\":" + JsonUtils.toJson(queryParams.getFilter());
        if (queryParams.getRelationships().isEmpty())
            return "";

        // Open filter
        String filter = "\t\t \"filter\" : {\n" + "            \"and\" : [\n";
        boolean first = true;
        for (String relationship : queryParams.getRelationships()) {
            if (first) {
                filter += "     { \"exists\":{    \"field\" : \"tag." + relationship.toLowerCase() + ".*\" }}\n";
                first = false;
            } else
                filter += "    ,{ \"exists\":{    \"field\" : \"tag." + relationship.toLowerCase() + ".*\" }}\n";
        }

        filter += "      ]}\n"; // Close filter

        return filter;

    }
}