Search in sources :

Example 1 with Contain

use of org.janusgraph.core.attribute.Contain in project janusgraph by JanusGraph.

the class QueryUtil method constraints2QNF.

/**
 * Prepares the constraints from the query builder into a QNF compliant condition.
 * If the condition is invalid or trivially false, it returns null.
 *
 * @param tx
 * @param constraints
 * @param <E>
 * @return
 * @see #isQueryNormalForm(org.janusgraph.graphdb.query.condition.Condition)
 */
public static <E extends JanusGraphElement> And<E> constraints2QNF(StandardJanusGraphTx tx, List<PredicateCondition<String, E>> constraints) {
    final And<E> conditions = new And<>(constraints.size() + 4);
    for (final PredicateCondition<String, E> atom : constraints) {
        final RelationType type = getType(tx, atom.getKey());
        if (type == null) {
            if (atom.getPredicate() == Cmp.EQUAL && atom.getValue() == null)
                // Ignore condition, its trivially satisfied
                continue;
            return null;
        }
        final Object value = atom.getValue();
        final JanusGraphPredicate predicate = atom.getPredicate();
        if (type.isPropertyKey()) {
            final PropertyKey key = (PropertyKey) type;
            assert predicate.isValidCondition(value);
            Preconditions.checkArgument(key.dataType() == Object.class || predicate.isValidValueType(key.dataType()), "Data type of key is not compatible with condition");
        } else {
            // its a label
            Preconditions.checkArgument(((EdgeLabel) type).isUnidirected());
            Preconditions.checkArgument(predicate.isValidValueType(JanusGraphVertex.class), "Data type of key is not compatible with condition");
        }
        if (predicate instanceof Contain) {
            // Rewrite contains conditions
            final Collection values = (Collection) value;
            if (predicate == Contain.NOT_IN) {
                // Simply ignore since trivially satisfied
                if (values.isEmpty())
                    continue;
                for (final Object inValue : values) addConstraint(type, Cmp.NOT_EQUAL, inValue, conditions, tx);
            } else {
                Preconditions.checkArgument(predicate == Contain.IN);
                if (values.isEmpty()) {
                    // Cannot be satisfied
                    return null;
                }
                if (values.size() == 1) {
                    addConstraint(type, Cmp.EQUAL, values.iterator().next(), conditions, tx);
                } else {
                    final Or<E> nested = new Or<>(values.size());
                    for (final Object invalue : values) addConstraint(type, Cmp.EQUAL, invalue, nested, tx);
                    conditions.add(nested);
                }
            }
        } else if (predicate instanceof AndJanusPredicate) {
            if (addConstraint(type, (AndJanusPredicate) (predicate), (List<Object>) (value), conditions, tx) == null) {
                return null;
            }
        } else if (predicate instanceof OrJanusPredicate) {
            final List<Object> values = (List<Object>) (value);
            // FIXME: this might generate a non QNF-compliant form, e.g. nested = PredicateCondition OR (PredicateCondition AND PredicateCondition)
            final Or<E> nested = addConstraint(type, (OrJanusPredicate) predicate, values, new Or<>(values.size()), tx);
            if (nested == null) {
                return null;
            }
            conditions.add(nested);
        } else {
            addConstraint(type, predicate, value, conditions, tx);
        }
    }
    return conditions;
}
Also used : Or(org.janusgraph.graphdb.query.condition.Or) AndJanusPredicate(org.janusgraph.graphdb.predicate.AndJanusPredicate) OrJanusPredicate(org.janusgraph.graphdb.predicate.OrJanusPredicate) And(org.janusgraph.graphdb.query.condition.And) RelationType(org.janusgraph.core.RelationType) InternalRelationType(org.janusgraph.graphdb.internal.InternalRelationType) JanusGraphVertex(org.janusgraph.core.JanusGraphVertex) Collection(java.util.Collection) ArrayList(java.util.ArrayList) List(java.util.List) Contain(org.janusgraph.core.attribute.Contain) PropertyKey(org.janusgraph.core.PropertyKey)

Example 2 with Contain

use of org.janusgraph.core.attribute.Contain in project janusgraph by JanusGraph.

the class QueryUtil method addConstraint.

private static <E extends JanusGraphElement> And<E> addConstraint(final RelationType type, AndJanusPredicate predicate, List<Object> values, And<E> and, StandardJanusGraphTx tx) {
    for (int i = 0; i < values.size(); i++) {
        final JanusGraphPredicate janusGraphPredicate = predicate.get(i);
        if (janusGraphPredicate instanceof Contain) {
            // Rewrite contains conditions
            final Collection childValues = (Collection) values.get(i);
            if (janusGraphPredicate == Contain.NOT_IN) {
                // Simply ignore since trivially satisfied
                if (childValues.isEmpty())
                    continue;
                for (final Object inValue : childValues) addConstraint(type, Cmp.NOT_EQUAL, inValue, and, tx);
            } else {
                Preconditions.checkArgument(janusGraphPredicate == Contain.IN);
                if (childValues.isEmpty()) {
                    // Cannot be satisfied
                    return null;
                }
                if (childValues.size() == 1) {
                    addConstraint(type, Cmp.EQUAL, childValues.iterator().next(), and, tx);
                } else {
                    final Or<E> nested = new Or<>(childValues.size());
                    for (final Object inValue : childValues) addConstraint(type, Cmp.EQUAL, inValue, nested, tx);
                    and.add(nested);
                }
            }
        } else if (janusGraphPredicate instanceof AndJanusPredicate) {
            if (addConstraint(type, (AndJanusPredicate) (janusGraphPredicate), (List<Object>) (values.get(i)), and, tx) == null) {
                return null;
            }
        } else if (predicate.get(i) instanceof OrJanusPredicate) {
            final List<Object> childValues = (List<Object>) (values.get(i));
            final Or<E> nested = addConstraint(type, (OrJanusPredicate) (janusGraphPredicate), childValues, new Or<>(childValues.size()), tx);
            if (nested == null) {
                return null;
            }
            and.add(nested);
        } else {
            addConstraint(type, janusGraphPredicate, values.get(i), and, tx);
        }
    }
    return and;
}
Also used : Or(org.janusgraph.graphdb.query.condition.Or) AndJanusPredicate(org.janusgraph.graphdb.predicate.AndJanusPredicate) OrJanusPredicate(org.janusgraph.graphdb.predicate.OrJanusPredicate) Collection(java.util.Collection) ArrayList(java.util.ArrayList) List(java.util.List) Contain(org.janusgraph.core.attribute.Contain)

Example 3 with Contain

use of org.janusgraph.core.attribute.Contain in project janusgraph by JanusGraph.

the class QueryUtil method addConstraint.

private static <E extends JanusGraphElement> Or<E> addConstraint(final RelationType type, OrJanusPredicate predicate, List<Object> values, Or<E> or, StandardJanusGraphTx tx) {
    for (int i = 0; i < values.size(); i++) {
        final JanusGraphPredicate janusGraphPredicate = predicate.get(i);
        if (janusGraphPredicate instanceof Contain) {
            // Rewrite contains conditions
            final Collection childValues = (Collection) values.get(i);
            if (janusGraphPredicate == Contain.NOT_IN) {
                if (childValues.size() == 1) {
                    addConstraint(type, Cmp.NOT_EQUAL, childValues.iterator().next(), or, tx);
                }
                // Don't need to handle the case where childValues is empty, because it defaults to
                // an or(and()) is added, which is a tautology
                final And<E> nested = new And<>(childValues.size());
                for (final Object inValue : childValues) {
                    addConstraint(type, Cmp.NOT_EQUAL, inValue, nested, tx);
                }
                or.add(nested);
            } else {
                Preconditions.checkArgument(janusGraphPredicate == Contain.IN);
                if (childValues.isEmpty()) {
                    // Handle any unsatisfiable condition that occurs within an OR statement like it does not exist
                    continue;
                }
                for (final Object inValue : childValues) {
                    addConstraint(type, Cmp.EQUAL, inValue, or, tx);
                }
            }
        } else if (janusGraphPredicate instanceof AndJanusPredicate) {
            final List<Object> childValues = (List<Object>) (values.get(i));
            final And<E> nested = addConstraint(type, (AndJanusPredicate) janusGraphPredicate, childValues, new And<>(childValues.size()), tx);
            if (nested == null) {
                return null;
            }
            or.add(nested);
        } else if (janusGraphPredicate instanceof OrJanusPredicate) {
            if (addConstraint(type, (OrJanusPredicate) janusGraphPredicate, (List<Object>) (values.get(i)), or, tx) == null) {
                return null;
            }
        } else {
            addConstraint(type, janusGraphPredicate, values.get(i), or, tx);
        }
    }
    return or;
}
Also used : And(org.janusgraph.graphdb.query.condition.And) Collection(java.util.Collection) ArrayList(java.util.ArrayList) List(java.util.List) Contain(org.janusgraph.core.attribute.Contain) AndJanusPredicate(org.janusgraph.graphdb.predicate.AndJanusPredicate) OrJanusPredicate(org.janusgraph.graphdb.predicate.OrJanusPredicate)

Aggregations

ArrayList (java.util.ArrayList)3 Collection (java.util.Collection)3 List (java.util.List)3 Contain (org.janusgraph.core.attribute.Contain)3 AndJanusPredicate (org.janusgraph.graphdb.predicate.AndJanusPredicate)3 OrJanusPredicate (org.janusgraph.graphdb.predicate.OrJanusPredicate)3 And (org.janusgraph.graphdb.query.condition.And)2 Or (org.janusgraph.graphdb.query.condition.Or)2 JanusGraphVertex (org.janusgraph.core.JanusGraphVertex)1 PropertyKey (org.janusgraph.core.PropertyKey)1 RelationType (org.janusgraph.core.RelationType)1 InternalRelationType (org.janusgraph.graphdb.internal.InternalRelationType)1