private QueryTask.NumericRange<?> createRange(String num, BinaryVerb op) { // if there's a decimal, treat as double Number d = null; if (num.contains(".")) { d = Double.parseDouble(num); } else { d = Long.parseLong(num); } if (op.equals(BinaryVerb.LT)) { return QueryTask.NumericRange.createLessThanRange(d); } if (op.equals(BinaryVerb.LE)) { return QueryTask.NumericRange.createLessThanOrEqualRange(d); } if (op.equals(BinaryVerb.GT)) { return QueryTask.NumericRange.createGreaterThanRange(d); } if (op.equals(BinaryVerb.GE)) { return QueryTask.NumericRange.createGreaterThanOrEqualRange(d); } if (op.equals(BinaryVerb.EQ)) { return QueryTask.NumericRange.createEqualRange(d); } return null; }
.addFieldClause(ServiceDocument.FIELD_NAME_SELF_LINK, services.get(0).getPath()) .addRangeClause(ServiceDocument.FIELD_NAME_UPDATE_TIME_MICROS, NumericRange.createLessThanOrEqualRange(documentUpdatedTime), Occurance.MUST_OCCUR) .build();
.addFieldClause(ServiceDocument.FIELD_NAME_SELF_LINK, services.get(0).getPath()) .addRangeClause(ServiceDocument.FIELD_NAME_UPDATE_TIME_MICROS, NumericRange.createLessThanOrEqualRange(documentUpdatedTime), Occurance.MUST_OCCUR) .build();
@Test public void testBooleanWithNumericRanges() throws Throwable { Query expected = new Query(); // The test ($filter name eq 'foo') OR (($filter age le 50) AND ($filter income ge 1000000)) // Top-level OR expected.occurance = Query.Occurance.MUST_OCCUR; // first term Query nameQ = new Query().setTermPropertyName("name").setTermMatchValue("foo"); // second term Query betweenRangesQ = new Query(); // first range NumericRange<?> lessThan50 = QueryTask.NumericRange .createLessThanOrEqualRange((long) 50); betweenRangesQ.addBooleanClause(new Query().setTermPropertyName("age").setNumericRange( lessThan50)); // second range NumericRange<?> greatherThanOrEqual1M = QueryTask.NumericRange .createGreaterThanOrEqualRange((long) 1000000); betweenRangesQ.addBooleanClause(new Query().setTermPropertyName("income").setNumericRange (greatherThanOrEqual1M)); nameQ.occurance = Query.Occurance.SHOULD_OCCUR; betweenRangesQ.occurance = Query.Occurance.SHOULD_OCCUR; expected.addBooleanClause(nameQ); expected.addBooleanClause(betweenRangesQ); String odataFilter = "(name eq foo) or ((age le 50) and (income ge 1000000))"; Query actual = toQuery(odataFilter); assertQueriesEqual(actual, expected); }
@Test public void testBooleanWithNumericRanges() throws Throwable { Query expected = new Query(); // The test ($filter name eq 'foo') OR (($filter age le 50) AND ($filter income ge 1000000)) // Top-level OR expected.occurance = Query.Occurance.MUST_OCCUR; // first term Query nameQ = new Query().setTermPropertyName("name").setTermMatchValue("foo"); // second term Query betweenRangesQ = new Query(); // first range NumericRange<?> lessThan50 = QueryTask.NumericRange .createLessThanOrEqualRange((long) 50); betweenRangesQ.addBooleanClause(new Query().setTermPropertyName("age").setNumericRange( lessThan50)); // second range NumericRange<?> greatherThanOrEqual1M = QueryTask.NumericRange .createGreaterThanOrEqualRange((long) 1000000); betweenRangesQ.addBooleanClause(new Query().setTermPropertyName("income").setNumericRange (greatherThanOrEqual1M)); nameQ.occurance = Query.Occurance.SHOULD_OCCUR; betweenRangesQ.occurance = Query.Occurance.SHOULD_OCCUR; expected.addBooleanClause(nameQ); expected.addBooleanClause(betweenRangesQ); String odataFilter = "(name eq foo) or ((age le 50) and (income ge 1000000))"; Query actual = toQuery(odataFilter); assertQueriesEqual(actual, expected); }