public static BaseCondition and(BaseCondition... conditions) { if (conditions.length == 1) { return conditions[0]; } return new JoinedCondition(LogicalOperator.AND, conditions); }
@Override public boolean evaluate(Object object) { if (logicalOperator == LogicalOperator.AND) { return evaluateAnd(object); } return evaluateOr(object); }
private String joinedWhere(JoinedCondition joinedCondition) throws FalsePredicateException { BaseCondition[] conditions = joinedCondition.getConditions(); LogicalOperator logicalOperator = joinedCondition.getLogicalOperator(); List<String> wheres = new ArrayList<>(); for (int i = 0; i < conditions.length; i++) { try { BaseCondition condition = conditions[i]; if (!condition.hasPreFilter()) { continue; } wheres.add(where(condition)); } catch (FalsePredicateException e) { if (logicalOperator == LogicalOperator.AND) { throw e; } } } if (wheres.isEmpty()) { throw new FalsePredicateException(); } if (wheres.size() == 1) { return wheres.get(0); } return applyLogicalOperator(logicalOperator, wheres); }
@Test public void testWhereJoinedConditionsWithPrecedence() { String q = "{where: {op: 'and', c: [{p: 'longValue', op: '=', v: 1}, {op: 'or', c: [{p: 'intValue', op: '=', v: 3}, {p: 'doubleValue', op: '=', v: 4.3}]}]}}"; QueryOptions options = QueryOptions.parse(q); JoinedCondition condition1 = assertJoinedCondition(options.getCondition(), LogicalOperator.AND, 2); assertSimpleCondition(condition1.getConditions()[0], "longValue", WhereOperator.EQUAL, 1l); JoinedCondition condition2 = assertJoinedCondition(condition1.getConditions()[1], LogicalOperator.OR, 2); assertSimpleCondition(condition2.getConditions()[0], "intValue", WhereOperator.EQUAL, 3l); assertSimpleCondition(condition2.getConditions()[1], "doubleValue", WhereOperator.EQUAL, 4.3); }
private Filter createJoinedFilter(QueryBuilder<?> builder, JoinedCondition joinedCondition) throws FalsePredicateException { BaseCondition[] conditions = joinedCondition.getConditions(); LogicalOperator logicalOperator = joinedCondition.getLogicalOperator();
@Test public void testWhereJoinedConditions() { String q = "{where: {op: 'and', c: [{p: 'longValue', op: '=', v: 1}, {p: 'intValue', op: '=', v: 3}]}}"; QueryOptions options = QueryOptions.parse(q); JoinedCondition condition = assertJoinedCondition(options.getCondition(), LogicalOperator.AND, 2); assertSimpleCondition(condition.getConditions()[0], "longValue", WhereOperator.EQUAL, 1l); assertSimpleCondition(condition.getConditions()[1], "intValue", WhereOperator.EQUAL, 3l); }
private JoinedCondition assertJoinedCondition(BaseCondition c, LogicalOperator logicalOperator, int length) { assertEquals(JoinedCondition.class, c.getClass()); JoinedCondition condition = (JoinedCondition) c; assertEquals(logicalOperator, condition.getLogicalOperator()); assertEquals(length, condition.getConditions().length); return condition; }
@Test public void testQueryOptions() { String q = "{where: ['longValue', '=', 1, 'intValue', '=', 3, 'doubleValue', '=', 4.3], order: [{p:'stringValue', d:'desc'}], sort: [{p:'longValue', d:'desc'}], limit: 2}"; QueryOptions options = QueryOptions.parse(q); JoinedCondition conditions = assertJoinedCondition(options.getCondition(), LogicalOperator.AND, 3); assertSimpleCondition(conditions.getConditions()[0], "longValue", WhereOperator.EQUAL, 1l); assertSimpleCondition(conditions.getConditions()[1], "intValue", WhereOperator.EQUAL, 3l); assertSimpleCondition(conditions.getConditions()[2], "doubleValue", WhereOperator.EQUAL, 4.3); List<QueryOrder> order = options.getPreOrders(); assertEquals(1, order.size()); assertOrderEquals("stringValue", "desc", order.get(0)); List<QueryOrder> sort = options.getPostOrders(); assertEquals(1, sort.size()); assertOrderEquals("longValue", "desc", sort.get(0)); assertEquals(new Integer(2), options.getLimit()); }
public static BaseCondition or(BaseCondition... conditions) { if (conditions.length == 1) { return conditions[0]; } return new JoinedCondition(LogicalOperator.OR, conditions); }
@Override public BaseCondition not() { BaseCondition[] reversedConditions = new BaseCondition[conditions.length]; for (int i = 0; i < conditions.length; i++) { reversedConditions[i] = conditions[i].not(); } return new JoinedCondition(logicalOperator.not(), reversedConditions); }