protected StringBuilder condition2Sql(Condition condition) { switch (condition.type()) { case AND: Condition.And and = (Condition.And) condition; StringBuilder left = this.condition2Sql(and.left()); StringBuilder right = this.condition2Sql(and.right()); int size = left.length() + right.length() + " AND ".length(); StringBuilder sql = new StringBuilder(size); sql.append(left).append(" AND ").append(right); return sql; case OR: throw new BackendException("Not support OR currently"); case RELATION: Condition.Relation r = (Condition.Relation) condition; return this.relation2Sql(r); default: final String msg = "Unsupported condition: " + condition; throw new AssertionError(msg); } }
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; }
protected Clause condition2Cql(Condition condition) { switch (condition.type()) { case AND: Condition.And and = (Condition.And) condition; Clause left = condition2Cql(and.left()); Clause right = condition2Cql(and.right()); return Clauses.and(left, right); case OR: throw new BackendException("Not support OR currently"); case RELATION: Condition.Relation r = (Condition.Relation) condition; return relation2Cql(r); default: final String msg = "Unsupported condition: " + condition; throw new AssertionError(msg); } }
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())); } }
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; }
protected StringBuilder condition2Sql(Condition condition) { switch (condition.type()) { case AND: Condition.And and = (Condition.And) condition; StringBuilder left = this.condition2Sql(and.left()); StringBuilder right = this.condition2Sql(and.right()); int size = left.length() + right.length() + " AND ".length(); StringBuilder sql = new StringBuilder(size); sql.append(left).append(" AND ").append(right); return sql; case OR: throw new BackendException("Not support OR currently"); case RELATION: Condition.Relation r = (Condition.Relation) condition; return this.relation2Sql(r); default: final String msg = "Unsupported condition: " + condition; throw new AssertionError(msg); } }
protected Clause condition2Cql(Condition condition) { switch (condition.type()) { case AND: Condition.And and = (Condition.And) condition; Clause left = condition2Cql(and.left()); Clause right = condition2Cql(and.right()); return Clauses.and(left, right); case OR: throw new BackendException("Not support OR currently"); case RELATION: Condition.Relation r = (Condition.Relation) condition; return relation2Cql(r); default: final String msg = "Unsupported condition: " + condition; throw new AssertionError(msg); } }
@Override public boolean test(HugeElement element) { return this.left().test(element) && this.right().test(element); }
@Override public boolean test(Object value) { return this.left().test(value) && this.right().test(value); }
@Override public Condition copy() { return new And(this.left().copy(), this.right().copy()); } }
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())); } }
@Override public boolean test(HugeElement element) { return this.left().test(element) && this.right().test(element); }
@Override public boolean test(Object value) { return this.left().test(value) && this.right().test(value); }
@Override public boolean isFlattened() { // If this is flattened, its sub-condition should not be nested return this.left().isRelation() && this.right().isRelation(); } }
@Override public Condition copy() { return new And(this.left().copy(), this.right().copy()); }