public QueryBuilder<T> options(QueryOptions options) { if (options.getCondition() != null) { where(options.getCondition()); } if (options.getPreOrders() != null) { preOrders.addAll(options.getPreOrders()); } if (options.getPostOrders() != null) { postOrders.addAll(options.getPostOrders()); } if (options.getLimit() != null) { limit(options.getLimit()); } if (options.getCursor() != null) { cursor(options.getCursor()); } return this; }
public static QueryOptions parse(String json) { return new QueryOptions(json); }
private BaseCondition parseSimpleCondition(JsonObject json) { String field = json.get("p").getAsString(); String op = json.get("op").getAsString(); Object value = getJsonObjectValue(json.get("v")); return Condition.c(field, op, value); }
@Test public void testEmpty() { String q = "{}"; QueryOptions options = QueryOptions.parse(q); assertNull(options.getPreOrders()); assertNull(options.getPostOrders()); assertNull(options.getLimit()); }
@Test public void testWhereSimpleCondition() { String q = "{where: {p: 'longValue', op: '=', v: 1}}"; QueryOptions options = QueryOptions.parse(q); assertSimpleCondition(options.getCondition(), "longValue", WhereOperator.EQUAL, 1l); }
@Override public Object action() { QueryBuilder<?> query = query(); if (id != null) { query.from(id); } boolean returnCursor = false; if (params.containsKey(QUERY_OPTIONS)) { QueryOptions options = QueryOptions.parse(params.get(QUERY_OPTIONS)); query.options(options); returnCursor = options.returnCursor(); } if (hasShieldCondition()) { query.and(shield.getWhere()); } List<?> objects = list(query); if (returnCursor) { Map<String, Object> result = new HashMap<>(); result.put("results", objects); result.put("cursor", query.getCursor()); return result; } return objects; }
@Test public void testQueryFromOptions() { saveManyBasicObjects(3); QueryOptions options = QueryOptions .parse("{where: ['stringValue', '=', 'xpto'], order: [{p: 'intValue', d: 'desc'}], limit: 2}"); List<BasicObject> objects = yawp(BasicObject.class).options(options).list(); assertEquals(2, objects.size()); assertEquals(3, objects.get(0).getIntValue()); assertEquals(2, objects.get(1).getIntValue()); }
private List<QueryOrder> parseOrders(JsonArray jsonArray) { if (jsonArray == null) { return null; } List<QueryOrder> orders = new ArrayList<>(); for (JsonElement jsonElement : jsonArray) { String entity = getJsonStringValue(jsonElement, "e"); String property = getJsonStringValue(jsonElement, "p"); String direction = getJsonStringValue(jsonElement, "d"); orders.add(new QueryOrder(entity, property, direction)); } return orders; }
private Object getJsonObjectValue(JsonElement jsonElement) { if (jsonElement.isJsonArray()) { return getJsonObjectValueForArrays(jsonElement); } if (jsonElement.isJsonNull()) { return null; } JsonPrimitive jsonPrimitive = jsonElement.getAsJsonPrimitive(); if (jsonPrimitive.isNumber()) { if (jsonPrimitive.getAsString().indexOf(".") != -1) { return jsonPrimitive.getAsDouble(); } return jsonPrimitive.getAsLong(); } if (jsonPrimitive.isString()) { return jsonPrimitive.getAsString(); } if (jsonPrimitive.isBoolean()) { return jsonPrimitive.getAsBoolean(); } // TODO timestamp throw new RuntimeException("Invalid json value: " + jsonPrimitive.getAsString()); }
@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()); }
@Test public void testBooleanCodition() { String q = "{where: {p: 'booleanValue', op: '=', v: true}}"; QueryOptions options = QueryOptions.parse(q); assertSimpleCondition(options.getCondition(), "booleanValue", WhereOperator.EQUAL, true); }
@Test public void testWhereWithIn() { String q = "{ where: [ 'id', 'in', ['1', '3', '5'] ] }"; QueryOptions options = QueryOptions.parse(q); assertSimpleCondition(options.getCondition(), "id", WhereOperator.IN, Arrays.asList("1", "3", "5")); }
private BaseCondition parseSimpleCondition(JsonArray jsonArray) { if (jsonArray.size() % 3 != 0) { throw new HttpException(422, "Array condition in where must have size multiple of three ([<field1>, <op1>, <value1>, <field2>, <op2>, <value2>, ...])"); } BaseCondition[] conditions = new BaseCondition[jsonArray.size() / 3]; for (int i = 0; i < jsonArray.size(); i += 3) { String field = jsonArray.get(i).getAsString(); String op = jsonArray.get(i + 1).getAsString(); Object value = getJsonObjectValue(jsonArray.get(i + 2)); conditions[i / 3] = Condition.c(field, op, value); } return Condition.and(conditions); }
@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); }
@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); }