public static Condition parsePredicate()

in hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/TraversalUtil.java [900:963]


    public static Condition parsePredicate(PropertyKey pk, String predicate) {
        Pattern pattern = Pattern.compile("^P\\.([a-z]+)\\(([\\S ]*)\\)$");
        Matcher matcher = pattern.matcher(predicate);
        if (!matcher.find()) {
            throw new HugeException("Invalid predicate: %s", predicate);
        }

        String method = matcher.group(1);
        String value = matcher.group(2);
        Object validValue;
        switch (method) {
            case "eq":
                validValue = validPropertyValue(predicateNumber(value), pk);
                return Condition.eq(pk.id(), validValue);
            case "neq":
                validValue = validPropertyValue(predicateNumber(value), pk);
                return Condition.neq(pk.id(), validValue);
            case "lt":
                validValue = validPropertyValue(predicateNumber(value), pk);
                return Condition.lt(pk.id(), validValue);
            case "lte":
                validValue = validPropertyValue(predicateNumber(value), pk);
                return Condition.lte(pk.id(), validValue);
            case "gt":
                validValue = validPropertyValue(predicateNumber(value), pk);
                return Condition.gt(pk.id(), validValue);
            case "gte":
                validValue = validPropertyValue(predicateNumber(value), pk);
                return Condition.gte(pk.id(), validValue);
            case "between":
                Number[] params = predicateNumbers(value, 2);
                Object v1 = validPropertyValue(params[0], pk);
                Object v2 = validPropertyValue(params[1], pk);
                return Condition.and(Condition.gte(pk.id(), v1),
                                     Condition.lt(pk.id(), v2));
            case "inside":
                params = predicateNumbers(value, 2);
                v1 = validPropertyValue(params[0], pk);
                v2 = validPropertyValue(params[1], pk);
                return Condition.and(Condition.gt(pk.id(), v1),
                                     Condition.lt(pk.id(), v2));
            case "outside":
                params = predicateNumbers(value, 2);
                v1 = validPropertyValue(params[0], pk);
                v2 = validPropertyValue(params[1], pk);
                return Condition.and(Condition.lt(pk.id(), v1),
                                     Condition.gt(pk.id(), v2));
            case "within":
                List<T> values = predicateArgs(value);
                List<T> validValues = new ArrayList<>(values.size());
                for (T v : values) {
                    validValues.add(validPropertyValue(v, pk));
                }
                return Condition.in(pk.id(), validValues);
            case "textcontains":
                validValue = validPropertyValue(value, pk);
                return Condition.textContains(pk.id(), (String) validValue);
            case "contains":
                validValue = validPropertyValue(value, pk);
                return Condition.contains(pk.id(), validValue);
            default:
                throw new NotSupportException("predicate '%s'", method);
        }
    }