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

org.unipop.rest.util.PredicatesTranslator Maven / Gradle / Ivy

There is a newer version: 0.2.1
Show newest version
package org.unipop.rest.util;

import org.apache.commons.lang3.tuple.Pair;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
import org.json.JSONObject;
import org.unipop.query.predicates.PredicatesHolder;

import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * Created by sbarzilay on 28/11/16.
 */
public class PredicatesTranslator {
    public static Map translate(PredicatesHolder predicatesHolder, JSONObject opTranslator, MatcherHolder complexTranslator, boolean valuesToString, int limit) {
        Map translate = translate(predicatesHolder, opTranslator, complexTranslator, valuesToString);
        translate.put("limit", limit);
        return translate;
    }

    public static Map translate(PredicatesHolder predicatesHolder, JSONObject opTranslator, MatcherHolder complexTranslator, boolean valuesToString) {
        List predicates = predicatesHolder.getPredicates();
        Map complexOps = predicates.stream().map(hasContainer -> {
            String match = complexTranslator.match(hasContainer);
            if (match != null)
                return Pair.of(hasContainer, match);
            return null;
        }).filter(t -> t != null).collect(Collectors.toMap(Pair::getKey, Pair::getValue));
        List> predicatesMaps = predicates.stream().filter(has -> !complexOps.containsKey(has)).map(has -> {
            // TODO: maybe implement a simple matcher for op translator
            HashMap map = new HashMap<>();
            String[] split = has.getKey().split("\\.");
            map.put("key", split[split.length - 1]);
            Object value = has.getValue();
            if (value instanceof String)
                map.put("value", "\"" + value + "\"");
            else if (value instanceof Collection) {
                String finalString = "[%s]";
                List values = ((Collection) value).stream().map(v -> "\"" + v.toString() + "\"").collect(Collectors.toList());
                String valuesString = "";
                String join = valuesString.join(",", values);
                map.put("value", String.format(finalString, join));
            } else {
                if (!valuesToString)
                    map.put("value", value);
                else
                    map.put("value", "\"" + value + "\"");
            }
            if (!opTranslator.has(has.getBiPredicate().toString())) return null;
            map.put("op", opTranslator.getString(has.getBiPredicate().toString()));
            return map;
        }).filter(m -> m != null).collect(Collectors.toList());

        List> children = predicatesHolder.getChildren().stream()
                .map(p -> translate(p, opTranslator, complexTranslator, valuesToString)).collect(Collectors.toList());

        Map map = new HashMap<>();
        Map predicateChildrenMap = new HashMap<>();
        if (predicatesMaps.size() > 0)
            predicateChildrenMap.put("predicates", predicatesMaps);
        if (complexOps.values().size() > 0)
            predicateChildrenMap.put("complex", complexOps.values());
        if (children.size() > 0)
            predicateChildrenMap.put("children", children);
        if (predicateChildrenMap.size() > 0)
            map.put(predicatesHolder.getClause().toString().toLowerCase(), predicateChildrenMap);

        Map result = new HashMap<>();
        if (map.size() > 0)
            result.put("predicates", map);

        return result;
    }
}