All Downloads are FREE. Search and download functionalities are using the official Maven repository.

apoc.es.ElasticSearchHandler Maven / Gradle / Ivy

package apoc.es;


import apoc.util.UrlResolver;
import apoc.util.Util;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;

import java.util.Arrays;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public abstract class ElasticSearchHandler {

    /**
     * With this pattern we can match both key:value params and key=value params
     */
    private final static Pattern KEY_VALUE = Pattern.compile("(.*)(:|=)(.*)");

    protected String getElasticSearchUrl(String hostOrKey) {
        return new UrlResolver("http", "localhost", 9200).getUrl("es", hostOrKey);
    }
    
    /**
     * @param query
     * @return
     */
    protected String toQueryParams(Object query) {
        if (query == null) return "";
        if (query instanceof Map) {
            Map map = (Map) query;
            if (map.isEmpty()) return "";
            return map.entrySet().stream().map(e -> e.getKey() + "=" + Util.encodeUrlComponent(e.getValue().toString())).collect(Collectors.joining("&"));
        } else {
            // We have to encode only the values not the keys
            return Pattern.compile("&").splitAsStream(query.toString())
                    .map(KEY_VALUE::matcher)
                    .filter(Matcher::matches)
                    .map(matcher -> matcher.group(1) + matcher.group(2) + Util.encodeUrlComponent(matcher.group(3)))
                    .collect(Collectors.joining("&"));
        }
    }

    /**
     * Get the full Elasticsearch url
     */
    protected String getQueryUrl(String hostOrKey, String index, String type, String id, Object query) {
        return getElasticSearchUrl(hostOrKey) + formatQueryUrl(index, type, id, query);
    }

    /**
     * Get the full Elasticsearch search url
     */
    protected String getSearchQueryUrl(String hostOrKey, String index, String type, Object query) {
        return getElasticSearchUrl(hostOrKey) + formatSearchQueryUrl(index, type, query);
    }

    /**
     * Format the Search API url template according to the parameters.
     */
    protected abstract String formatSearchQueryUrl(String index, String type, Object query);

    /**
     * Format the query url template according to the parameters.
     * The format will be /{index}/{type}/{id}?{query} if query is not empty (or null) otherwise the format will be /{index}/{type}/{id}
     */
    protected abstract String formatQueryUrl(String index, String type, String id, Object query);
    
    enum Version {
        EIGHT(new Eight()),
        DEFAULT(new Default());

        private final ElasticSearchHandler handler;
        Version(ElasticSearchHandler handler) {
            this.handler = handler;
        }

        public ElasticSearchHandler get() {
            return handler;
        }
    }

    static class Eight extends ElasticSearchHandler {

        @Override
        protected String formatSearchQueryUrl(String index, String type, Object query) {
            
            String queryUrl = String.format( "/%s/_search?%s",
                    index == null ? "_all" : index,
                    toQueryParams(query));
            
            return removeTerminalQuote(queryUrl);
        }

        @Override
        protected String formatQueryUrl(String index, String type, String id, Object query) {

            String queryUrl = Arrays.asList(index, type, id)
                    .stream()
                    .filter(StringUtils::isNotBlank)
                    .collect(Collectors.joining("/"));

            String queryParams = toQueryParams(query);
            queryParams = "".equals(queryParams)
                    ? ""
                    : ("?" + queryParams);

            return "/" + queryUrl + queryParams;
        }
    }

    static class Default extends ElasticSearchHandler {

        private final String fullQueryTemplate = "/%s/%s/%s?%s";
        private final String fullQuerySearchTemplate = "/%s/%s/_search?%s";
        
        @Override
        protected String formatSearchQueryUrl(String index, String type, Object query) {
            String queryUrl = String.format(fullQuerySearchTemplate,
                    index == null ? "_all" : index,
                    type == null ? "_all" : type,
                    toQueryParams(query));

            return removeTerminalQuote(queryUrl);
        }

        @Override
        protected String formatQueryUrl(String index, String type, String id, Object query) {
            String queryUrl = String.format(fullQueryTemplate,
                    index == null ? "_all" : index,
                    type == null ? "_all" : type,
                    id == null ? "" : id,
                    toQueryParams(query));

            return removeTerminalQuote(queryUrl);
        }
    }

    @NotNull
    private static String removeTerminalQuote(String queryUrl) {
        return queryUrl.endsWith("?") ? queryUrl.substring(0, queryUrl.length() - 1) : queryUrl;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy