@Test public void testFlattenWithOr() { Condition c1 = Condition.eq(IdGenerator.of("c1"), "1"); Condition c2 = Condition.eq(IdGenerator.of("c2"), "2"); ConditionQuery query = new ConditionQuery(HugeType.VERTEX); query.query(c1.or(c2)); Assert.assertEquals(1, query.conditions().size()); List<ConditionQuery> queries = ConditionQueryFlatten.flatten(query); Assert.assertEquals(2, queries.size()); Set<Set<Condition>> expect; expect = ImmutableSet.of(ImmutableSet.of(c1), ImmutableSet.of(c2)); Set<Set<Condition>> actual = new HashSet<>(); for (ConditionQuery q : queries) { actual.add(q.conditions()); } Assert.assertEquals(expect, actual); }
Condition cond = flattenIn(condition); if (cond == null) { for (Condition condition : query.conditions()) { if (results == null) { results = flattenAndOr(condition); } else { results = and(results, flattenAndOr(condition)); relations = optimizeRelations(relations); continue; ConditionQuery cq = newQueryFromRelations(query, relations); if (cq != null) { queries.add(cq);
case GT: isNum = true; if (gt == null || compare(relation, gt) > 0) { gt = relation; case GTE: isNum = true; if (gte == null || compare(relation, gte) > 0) { gte = relation; case LT: isNum = true; if (lt == null || compare(lt, relation) > 0) { lt = relation; case LTE: isNum = true; if (lte == null || compare(lte, relation) > 0) { lte = relation; result.addAll(calcValidRange(gte, gt, eq, lte, lt));
private static Set<Relations> flattenAndOr(Condition condition) { Set<Relations> result = new HashSet<>(); switch (condition.type()) { case RELATION: Relation relation = (Relation) condition; result.add(Relations.of(relation)); break; case AND: Condition.And and = (Condition.And) condition; result = and(flattenAndOr(and.left()), flattenAndOr(and.right())); break; case OR: Condition.Or or = (Condition.Or) condition; result = or(flattenAndOr(or.left()), flattenAndOr(or.right())); break; default: throw new AssertionError(String.format( "Wrong condition type: '%s'", condition.type())); } return result; }
private static Condition flattenIn(Condition condition) { switch (condition.type()) { case RELATION: Relation relation = (Relation) condition; switch (relation.relation()) { case IN: // Flatten IN if needed return convIn2Or(relation); case NOT_IN: // Flatten NOT_IN if needed return convNotin2And(relation); case TEXT_CONTAINS_ANY: // Flatten TEXT_CONTAINS_ANY if needed return convTextContainsAny2Or(relation); default: return condition; } case AND: Condition.And and = (Condition.And) condition; return new Condition.And(flattenIn(and.left()), flattenIn(and.right())); case OR: Condition.Or or = (Condition.Or) condition; return new Condition.Or(flattenIn(or.left()), flattenIn(or.right())); default: throw new AssertionError(String.format( "Wrong condition type: '%s'", condition.type())); } }
lower = highRelation(gte, gt); upper = lowRelation(lte, lt); if (!validRange(lower, upper)) { return Relations.of(); if (!validEq(eq, lower, upper)) { return Relations.of();
private static Relation selectRelation(Relation first, Relation second, boolean high) { if (first == null) { return second; } if (second == null) { return first; } if (high) { if (compare(first, second) > 0) { return first; } else { return second; } } else { if (compare(first, second) < 0) { return first; } else { return second; } } }
private static Condition flattenIn(Condition condition) { switch (condition.type()) { case RELATION: Relation relation = (Relation) condition; switch (relation.relation()) { case IN: // Flatten IN if needed return convIn2Or(relation); case NOT_IN: // Flatten NOT_IN if needed return convNotin2And(relation); case TEXT_CONTAINS_ANY: // Flatten TEXT_CONTAINS_ANY if needed return convTextContainsAny2Or(relation); default: return condition; } case AND: Condition.And and = (Condition.And) condition; return new Condition.And(flattenIn(and.left()), flattenIn(and.right())); case OR: Condition.Or or = (Condition.Or) condition; return new Condition.Or(flattenIn(or.left()), flattenIn(or.right())); default: throw new AssertionError(String.format( "Wrong condition type: '%s'", condition.type())); } }
lower = highRelation(gte, gt); upper = lowRelation(lte, lt); if (!validRange(lower, upper)) { return Relations.of(); if (!validEq(eq, lower, upper)) { return Relations.of();
private static Set<Relations> flattenAndOr(Condition condition) { Set<Relations> result = new HashSet<>(); switch (condition.type()) { case RELATION: Relation relation = (Relation) condition; result.add(Relations.of(relation)); break; case AND: Condition.And and = (Condition.And) condition; result = and(flattenAndOr(and.left()), flattenAndOr(and.right())); break; case OR: Condition.Or or = (Condition.Or) condition; result = or(flattenAndOr(or.left()), flattenAndOr(or.right())); break; default: throw new AssertionError(String.format( "Wrong condition type: '%s'", condition.type())); } return result; }
@Test public void testFlattenWithAnd() { Condition c1 = Condition.eq(IdGenerator.of("c1"), "1"); Condition c2 = Condition.eq(IdGenerator.of("c2"), "2"); ConditionQuery query = new ConditionQuery(HugeType.VERTEX); query.query(c1.and(c2)); Assert.assertEquals(1, query.conditions().size()); List<ConditionQuery> queries = ConditionQueryFlatten.flatten(query); Assert.assertEquals(1, queries.size()); Set<Set<Condition>> expect; expect = ImmutableSet.of(ImmutableSet.of(c1, c2)); Set<Set<Condition>> actual = new HashSet<>(); for (ConditionQuery q : queries) { actual.add(q.conditions()); } Assert.assertEquals(expect, actual); }
Condition cond = flattenIn(condition); if (cond == null) { for (Condition condition : query.conditions()) { if (results == null) { results = flattenAndOr(condition); } else { results = and(results, flattenAndOr(condition)); relations = optimizeRelations(relations); continue; ConditionQuery cq = newQueryFromRelations(query, relations); if (cq != null) { queries.add(cq);
case GT: isNum = true; if (gt == null || compare(relation, gt) > 0) { gt = relation; case GTE: isNum = true; if (gte == null || compare(relation, gte) > 0) { gte = relation; case LT: isNum = true; if (lt == null || compare(lt, relation) > 0) { lt = relation; case LTE: isNum = true; if (lte == null || compare(lte, relation) > 0) { lte = relation; result.addAll(calcValidRange(gte, gt, eq, lte, lt));
@Test public void testFlattenWithOrTree() { Condition c1 = Condition.eq(IdGenerator.of("c1"), "1"); Condition c2 = Condition.eq(IdGenerator.of("c2"), "2"); Condition c3 = Condition.eq(IdGenerator.of("c3"), "3"); Condition c4 = Condition.eq(IdGenerator.of("c4"), "4"); ConditionQuery query = new ConditionQuery(HugeType.VERTEX); query.query(c1.or(c2).or(c3.or(c4))); Assert.assertEquals(1, query.conditions().size()); List<ConditionQuery> queries = ConditionQueryFlatten.flatten(query); Assert.assertEquals(4, queries.size()); Set<Set<Condition>> expect; expect = ImmutableSet.of(ImmutableSet.of(c1), ImmutableSet.of(c2), ImmutableSet.of(c3), ImmutableSet.of(c4)); Set<Set<Condition>> actual = new HashSet<>(); for (ConditionQuery q : queries) { actual.add(q.conditions()); } Assert.assertEquals(expect, actual); }
private static Relation selectRelation(Relation first, Relation second, boolean high) { if (first == null) { return second; } if (second == null) { return first; } if (high) { if (compare(first, second) > 0) { return first; } else { return second; } } else { if (compare(first, second) < 0) { return first; } else { return second; } } }
@Test public void testFlattenWithAndOrTree() { Condition c1 = Condition.eq(IdGenerator.of("c1"), "1"); Condition c2 = Condition.eq(IdGenerator.of("c2"), "2"); Condition c3 = Condition.eq(IdGenerator.of("c3"), "3"); Condition c4 = Condition.eq(IdGenerator.of("c4"), "4"); ConditionQuery query = new ConditionQuery(HugeType.VERTEX); query.query(c1.or(c2).and(c3.or(c4))); Assert.assertEquals(1, query.conditions().size()); List<ConditionQuery> queries = ConditionQueryFlatten.flatten(query); Assert.assertEquals(4, queries.size()); Set<Set<Condition>> expect; expect = ImmutableSet.of(ImmutableSet.of(c1, c3), ImmutableSet.of(c1, c4), ImmutableSet.of(c2, c3), ImmutableSet.of(c2, c4)); Set<Set<Condition>> actual = new HashSet<>(); for (ConditionQuery q : queries) { actual.add(q.conditions()); } Assert.assertEquals(expect, actual); }
@Test public void testFlattenWithMultiOr() { Condition c1 = Condition.eq(IdGenerator.of("c1"), "1"); Condition c2 = Condition.eq(IdGenerator.of("c2"), "2"); Condition c3 = Condition.eq(IdGenerator.of("c3"), "3"); Condition c4 = Condition.eq(IdGenerator.of("c4"), "4"); ConditionQuery query = new ConditionQuery(HugeType.VERTEX); query.query(c1.or(c2)); query.query(c3.or(c4)); Assert.assertEquals(2, query.conditions().size()); List<ConditionQuery> queries = ConditionQueryFlatten.flatten(query); Assert.assertEquals(4, queries.size()); Set<Set<Condition>> expect; expect = ImmutableSet.of(ImmutableSet.of(c1, c3), ImmutableSet.of(c1, c4), ImmutableSet.of(c2, c3), ImmutableSet.of(c2, c4)); Set<Set<Condition>> actual = new HashSet<>(); for (ConditionQuery q : queries) { actual.add(q.conditions()); } Assert.assertEquals(expect, actual); }