Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support Json commands after RESP3 update #3460

Merged
merged 23 commits into from
Aug 16, 2023
Merged
Show file tree
Hide file tree
Changes from 11 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
151 changes: 146 additions & 5 deletions src/main/java/redis/clients/jedis/CommandObjects.java
Original file line number Diff line number Diff line change
Expand Up @@ -3445,19 +3445,34 @@ public final CommandObject<String> jsonMerge(String key, Path path, Object pojo)
}

public final CommandObject<Object> jsonGet(String key) {
return new CommandObject<>(commandArguments(JsonCommand.GET).key(key), new JsonObjectBuilder<>(Object.class));
return new CommandObject<>(commandArguments(JsonCommand.GET).key(key), JSON_GENERIC_OBJECT_COMMON);
}

public final <T> CommandObject<T> jsonGet(String key, Class<T> clazz) {
return new CommandObject<>(commandArguments(JsonCommand.GET).key(key), new JsonObjectBuilder<>(clazz));
}

public final CommandObject<Object> jsonGet(String key, Path2... paths) {
return new CommandObject<>(commandArguments(JsonCommand.GET).key(key).addObjects((Object[]) paths), JsonBuilderFactory.JSON_OBJECT);
return new CommandObject<>(commandArguments(JsonCommand.GET).key(key).addObjects((Object[]) paths),
JsonBuilderFactory.JSON_OBJECT);
}

public final CommandObject<Object> jsonGet(String key, Path... paths) {
return new CommandObject<>(commandArguments(JsonCommand.GET).key(key).addObjects((Object[]) paths), new JsonObjectBuilder<>(Object.class));
return new CommandObject<>(commandArguments(JsonCommand.GET).key(key).addObjects((Object[]) paths), JSON_GENERIC_OBJECT);
}
//
// public final CommandObject<List<Object>> jsonGetResp3(String key, Path... paths) {
// return new CommandObject<>(commandArguments(JsonCommand.GET).key(key).addObjects((Object[]) paths),
// JSON_GENERIC_OBJECT_LIST_RESP3);
// }

public final CommandObject<List<List<Object>>> jsonGetResp3(String key) {
return new CommandObject<>(commandArguments(JsonCommand.GET).key(key), JsonBuilderFactory.JSON_GET_RESPONSE_RESP3);
}

public final CommandObject<List<List<Object>>> jsonGetResp3(String key, Path2... paths) {
return new CommandObject<>(commandArguments(JsonCommand.GET).key(key).addObjects((Object[]) paths),
JsonBuilderFactory.JSON_GET_RESPONSE_RESP3);
}

public final CommandObject<String> jsonGetAsPlainString(String key, Path path) {
Expand All @@ -3467,6 +3482,17 @@ public final CommandObject<String> jsonGetAsPlainString(String key, Path path) {
public final <T> CommandObject<T> jsonGet(String key, Class<T> clazz, Path... paths) {
return new CommandObject<>(commandArguments(JsonCommand.GET).key(key).addObjects((Object[]) paths), new JsonObjectBuilder<>(clazz));
}
//
// public final CommandObject<List<Object>> jsonGetResp3(String key, Map<Path, Class<?>> paths) {
// List<Class<?>> clazz = new ArrayList<>(paths.size());
// CommandArguments args = commandArguments(JsonCommand.GET).key(key);
// paths.forEach( (k, v) -> { args.add(k); clazz.add(v); });
// return new CommandObject<>(args, new JsonObjectListResp3Builder(clazz));
// }
//
// public final <T> CommandObject<T> jsonGetResp3(String key, Class<T> clazz, Path path) {
// return new CommandObject<>(commandArguments(JsonCommand.GET).key(key).add(path), new JsonObjectObjectResp3Builder<>(clazz));
// }

public final CommandObject<List<JSONArray>> jsonMGet(Path2 path, String... keys) {
return new CommandObject<>(commandArguments(JsonCommand.MGET).keys((Object[]) keys).add(path), JsonBuilderFactory.JSON_ARRAY_LIST);
Expand Down Expand Up @@ -3509,16 +3535,27 @@ public final CommandObject<String> jsonToggle(String key, Path path) {
}

public final CommandObject<Class<?>> jsonType(String key) {
// return new CommandObject<>(commandArguments(JsonCommand.TYPE).key(key), getJsonTypeV1Builder());
return new CommandObject<>(commandArguments(JsonCommand.TYPE).key(key), JsonBuilderFactory.JSON_TYPE);
}

public final CommandObject<Class<?>> jsonType(String key, Path path) {
// return new CommandObject<>(commandArguments(JsonCommand.TYPE).key(key).add(path), getJsonTypeV1Builder());
return new CommandObject<>(commandArguments(JsonCommand.TYPE).key(key).add(path), JsonBuilderFactory.JSON_TYPE);
}

public final CommandObject<List<Class<?>>> jsonType(String key, Path2 path) {
return new CommandObject<>(commandArguments(JsonCommand.TYPE).key(key).add(path), JsonBuilderFactory.JSON_TYPE_LIST);
}

public final CommandObject<Class<?>> jsonType(String key, Path path) {
return new CommandObject<>(commandArguments(JsonCommand.TYPE).key(key).add(path), JsonBuilderFactory.JSON_TYPE);
public final CommandObject<List<List<Class<?>>>> jsonTypeResp3(String key, Path2 path) {
return new CommandObject<>(commandArguments(JsonCommand.TYPE).key(key).add(path), JsonBuilderFactory.JSON_TYPE_RESPONSE_RESP3);
}
//
// private Builder<Class<?>> getJsonTypeV1Builder() {
// if (proto == RedisProtocol.RESP3) return JsonBuilderFactory.JSON_TYPE_V1_RESP3;
// return JsonBuilderFactory.JSON_TYPE;
// }

public final CommandObject<Long> jsonStrAppend(String key, Object string) {
return new CommandObject<>(commandArguments(JsonCommand.STRAPPEND).key(key).add(
Expand Down Expand Up @@ -3551,9 +3588,17 @@ public final CommandObject<JSONArray> jsonNumIncrBy(String key, Path2 path, doub
return new CommandObject<>(commandArguments(JsonCommand.NUMINCRBY).key(key).add(path).add(value), JsonBuilderFactory.JSON_ARRAY);
}

public final CommandObject<List<Double>> jsonNumIncrByResp3(String key, Path2 path, double value) {
return new CommandObject<>(commandArguments(JsonCommand.NUMINCRBY).key(key).add(path).add(value), BuilderFactory.DOUBLE_LIST);
}

public final CommandObject<Double> jsonNumIncrBy(String key, Path path, double value) {
return new CommandObject<>(commandArguments(JsonCommand.NUMINCRBY).key(key).add(path).add(value), BuilderFactory.DOUBLE);
}
//
// public final CommandObject<List<Double>> jsonNumIncrByResp3(String key, Path path, double value) {
// return new CommandObject<>(commandArguments(JsonCommand.NUMINCRBY).key(key).add(path).add(value), BuilderFactory.DOUBLE_LIST);
// }

public final CommandObject<Long> jsonArrAppend(String key, String path, JSONObject... objects) {
CommandArguments args = commandArguments(JsonCommand.ARRAPPEND).key(key).add(path);
Expand Down Expand Up @@ -4222,6 +4267,23 @@ public T build(Object data) {
}
}

private final Builder<Object> JSON_GENERIC_OBJECT = new JsonObjectBuilder<>(Object.class);

private final Builder<Object> JSON_GENERIC_OBJECT_COMMON = new Builder<Object>() {
@Override
public Object build(Object data) {
if (data == null) return null;
if (data instanceof List) {
List<List<Object>> list = (List<List<Object>>) data;
if (list.isEmpty()) return null;
List<Object> innerList = list.get(0);
if (list.isEmpty()) return null;
return JSON_GENERIC_OBJECT.build(innerList.get(0));
}
return JSON_GENERIC_OBJECT.build(data);
}
};

private class JsonObjectListBuilder<T> extends Builder<List<T>> {

private final Class<T> clazz;
Expand All @@ -4239,6 +4301,85 @@ public List<T> build(Object data) {
return list.stream().map(s -> getJsonObjectMapper().fromJson(s, clazz)).collect(Collectors.toList());
}
}
//
// private class JsonObjectListResp3Builder extends Builder<List<Object>> {
//
// private final List<Class<?>> clazz;
//
// public JsonObjectListResp3Builder(List<Class<?>> clazz) {
// this.clazz = clazz;
// }
//
// @Override
// public List<Object> build(Object data) {
// if (data == null) return null;
// List<List<Object>> rawDataList = (List<List<Object>>) data;
// assert clazz.size() == rawDataList.size();
// final int size = clazz.size();
// List<Object> returnList = new ArrayList<>(size);
// for (int i = 0; i < size; i++) {
// List<Object> innerList = rawDataList.get(i);
// if (innerList.isEmpty()) {
// returnList.add(null);
// continue;
// }
// Object rawObject = innerList.get(0);
// if (!(rawObject instanceof byte[])) {
// returnList.add(rawObject);
// continue;
// }
// returnList.add(getJsonObjectMapper()
// .fromJson(BuilderFactory.STRING.build(rawObject), clazz.get(i)));
// }
// return returnList;
// }
// }
//
// private class JsonObjectObjectResp3Builder<T> extends Builder<T> {
//
// private final Class<T> clazz;
//
// public JsonObjectObjectResp3Builder(Class<T> clazz) {
// this.clazz = clazz;
// }
//
// @Override
// public T build(Object data) {
// if (data == null) return null;
// List<List<Object>> rawDataList = (List<List<Object>>) data;
// assert 1 == rawDataList.size();
// List<Object> innerList = rawDataList.get(0);
// if (innerList.isEmpty()) return null;
// Object rawObject = innerList.get(0);
// if (!(rawObject instanceof byte[])) return (T) rawObject;
// return getJsonObjectMapper().fromJson(BuilderFactory.STRING.build(rawObject), clazz);
// }
// }
//
// private final Builder<List<Object>> JSON_GENERIC_OBJECT_LIST_RESP3 = new Builder<List<Object>>() {
// @Override
// public List<Object> build(Object data) {
// if (data == null) return null;
// List<List<Object>> rawDataList = (List<List<Object>>) data;
// final int size = rawDataList.size();
// List<Object> returnList = new ArrayList<>(size);
// for (int i = 0; i < size; i++) {
// List<Object> innerList = rawDataList.get(i);
// if (innerList.isEmpty()) {
// returnList.add(null);
// continue;
// }
// Object rawObject = innerList.get(0);
// if (!(rawObject instanceof byte[])) {
// returnList.add(rawObject);
// continue;
// }
// returnList.add(getJsonObjectMapper()
// .fromJson(BuilderFactory.STRING.build(rawObject), Object.class));
// }
// return returnList;
// }
// };

private static final Builder<Map.Entry<Long, byte[]>> BLOOM_SCANDUMP_RESPONSE = new Builder<Map.Entry<Long, byte[]>>() {
@Override
Expand Down
15 changes: 15 additions & 0 deletions src/main/java/redis/clients/jedis/PipelineBase.java
Original file line number Diff line number Diff line change
Expand Up @@ -3510,6 +3510,11 @@ public <T> Response<T> jsonGet(String key, Class<T> clazz, Path... paths) {
return appendCommand(commandObjects.jsonGet(key, clazz, paths));
}

@Override
public Response<List<List<Object>>> jsonGetResp3(String key, Path2... paths) {
return appendCommand(commandObjects.jsonGetResp3(key, paths));
}

@Override
public Response<List<JSONArray>> jsonMGet(Path2 path, String... keys) {
return appendCommand(commandObjects.jsonMGet(path, keys));
Expand Down Expand Up @@ -3575,6 +3580,11 @@ public Response<Class<?>> jsonType(String key, Path path) {
return appendCommand(commandObjects.jsonType(key, path));
}

@Override
public Response<List<List<Class<?>>>> jsonTypeResp3(String key, Path2 path) {
return appendCommand(commandObjects.jsonTypeResp3(key, path));
}

@Override
public Response<Long> jsonStrAppend(String key, Object string) {
return appendCommand(commandObjects.jsonStrAppend(key, string));
Expand Down Expand Up @@ -3615,6 +3625,11 @@ public Response<Double> jsonNumIncrBy(String key, Path path, double value) {
return appendCommand(commandObjects.jsonNumIncrBy(key, path, value));
}

@Override
public Response<List<Double>> jsonNumIncrByResp3(String key, Path2 path, double value) {
return appendCommand(commandObjects.jsonNumIncrByResp3(key, path, value));
}

@Override
public Response<List<Long>> jsonArrAppend(String key, Path2 path, Object... objects) {
return appendCommand(commandObjects.jsonArrAppend(key, path, objects));
Expand Down
15 changes: 15 additions & 0 deletions src/main/java/redis/clients/jedis/TransactionBase.java
Original file line number Diff line number Diff line change
Expand Up @@ -3678,6 +3678,11 @@ public <T> Response<T> jsonGet(String key, Class<T> clazz, Path... paths) {
return appendCommand(commandObjects.jsonGet(key, clazz, paths));
}

@Override
public Response<List<List<Object>>> jsonGetResp3(String key, Path2... paths) {
return appendCommand(commandObjects.jsonGetResp3(key, paths));
}

@Override
public Response<List<JSONArray>> jsonMGet(Path2 path, String... keys) {
return appendCommand(commandObjects.jsonMGet(path, keys));
Expand Down Expand Up @@ -3743,6 +3748,11 @@ public Response<Class<?>> jsonType(String key, Path path) {
return appendCommand(commandObjects.jsonType(key, path));
}

@Override
public Response<List<List<Class<?>>>> jsonTypeResp3(String key, Path2 path) {
return appendCommand(commandObjects.jsonTypeResp3(key, path));
}

@Override
public Response<Long> jsonStrAppend(String key, Object string) {
return appendCommand(commandObjects.jsonStrAppend(key, string));
Expand Down Expand Up @@ -3783,6 +3793,11 @@ public Response<Double> jsonNumIncrBy(String key, Path path, double value) {
return appendCommand(commandObjects.jsonNumIncrBy(key, path, value));
}

@Override
public Response<List<Double>> jsonNumIncrByResp3(String key, Path2 path, double value) {
return appendCommand(commandObjects.jsonNumIncrByResp3(key, path, value));
}

@Override
public Response<List<Long>> jsonArrAppend(String key, Path2 path, Object... objects) {
return appendCommand(commandObjects.jsonArrAppend(key, path, objects));
Expand Down
40 changes: 40 additions & 0 deletions src/main/java/redis/clients/jedis/UnifiedJedis.java
Original file line number Diff line number Diff line change
Expand Up @@ -3948,6 +3948,21 @@ public Object jsonGet(String key, Path2... paths) {
public Object jsonGet(String key, Path... paths) {
return executeCommand(commandObjects.jsonGet(key, paths));
}
//
// @Override
// public List<Object> jsonGetResp3(String key, Path... paths) {
// return executeCommand(commandObjects.jsonGetResp3(key, paths));
// }

// @Override
// public List<List<Object>> jsonGetResp3(String key) {
// return executeCommand(commandObjects.jsonGetResp3(key));
// }
//
@Override
public List<List<Object>> jsonGetResp3(String key, Path2... paths) {
return executeCommand(commandObjects.jsonGetResp3(key, paths));
}

@Override
public String jsonGetAsPlainString(String key, Path path) {
Expand All @@ -3958,6 +3973,16 @@ public String jsonGetAsPlainString(String key, Path path) {
public <T> T jsonGet(String key, Class<T> clazz, Path... paths) {
return executeCommand(commandObjects.jsonGet(key, clazz, paths));
}
//
// @Override
// public List<Object> jsonGetResp3(String key, Map<Path, Class<?>> paths) {
// return executeCommand(commandObjects.jsonGetResp3(key, paths));
// }
//
// @Override
// public <T> T jsonGetResp3(String key, Class<T> clazz, Path path) {
// return executeCommand(commandObjects.jsonGetResp3(key, clazz, path));
// }

@Override
public List<JSONArray> jsonMGet(Path2 path, String... keys) {
Expand Down Expand Up @@ -4019,6 +4044,11 @@ public List<Class<?>> jsonType(String key, Path2 path) {
return executeCommand(commandObjects.jsonType(key, path));
}

@Override
public List<List<Class<?>>> jsonTypeResp3(String key, Path2 path) {
return executeCommand(commandObjects.jsonTypeResp3(key, path));
}

@Override
public Class<?> jsonType(String key, Path path) {
return executeCommand(commandObjects.jsonType(key, path));
Expand Down Expand Up @@ -4059,10 +4089,20 @@ public JSONArray jsonNumIncrBy(String key, Path2 path, double value) {
return executeCommand(commandObjects.jsonNumIncrBy(key, path, value));
}

@Override
public List<Double> jsonNumIncrByResp3(String key, Path2 path, double value) {
return executeCommand(commandObjects.jsonNumIncrByResp3(key, path, value));
}

@Override
public double jsonNumIncrBy(String key, Path path, double value) {
return executeCommand(commandObjects.jsonNumIncrBy(key, path, value));
}
//
// @Override
// public List<Double> jsonNumIncrByResp3(String key, Path path, double value) {
// return executeCommand(commandObjects.jsonNumIncrByResp3(key, path, value));
// }

@Override
public List<Long> jsonArrAppend(String key, Path2 path, Object... objects) {
Expand Down
Loading