{@code
+ * Transaction transaction = new Transaction();
+ * MultiJson.set(transaction, "doc", ".", "{\"a\": 1.0, \"b\": 2}");
+ * MultiJson.get(transaction, "doc");
+ * Object[] result = client.exec(transaction).get();
+ * assert result[0].equals("OK"); // result of MultiJson.set()
+ * assert result[1].equals("{\"a\": 1.0, \"b\": 2}"); // result of MultiJson.get()
+ * }
+ */
+public class MultiJson {
+
+ private static final String JSON_PREFIX = "JSON.";
+ private static final String JSON_SET = JSON_PREFIX + "SET";
+ private static final String JSON_GET = JSON_PREFIX + "GET";
+ private static final String JSON_MGET = JSON_PREFIX + "MGET";
+ private static final String JSON_NUMINCRBY = JSON_PREFIX + "NUMINCRBY";
+ private static final String JSON_NUMMULTBY = JSON_PREFIX + "NUMMULTBY";
+ private static final String JSON_ARRAPPEND = JSON_PREFIX + "ARRAPPEND";
+ private static final String JSON_ARRINSERT = JSON_PREFIX + "ARRINSERT";
+ private static final String JSON_ARRINDEX = JSON_PREFIX + "ARRINDEX";
+ private static final String JSON_ARRLEN = JSON_PREFIX + "ARRLEN";
+ private static final String[] JSON_DEBUG_MEMORY = new String[] {JSON_PREFIX + "DEBUG", "MEMORY"};
+ private static final String[] JSON_DEBUG_FIELDS = new String[] {JSON_PREFIX + "DEBUG", "FIELDS"};
+ private static final String JSON_ARRPOP = JSON_PREFIX + "ARRPOP";
+ private static final String JSON_ARRTRIM = JSON_PREFIX + "ARRTRIM";
+ private static final String JSON_OBJLEN = JSON_PREFIX + "OBJLEN";
+ private static final String JSON_OBJKEYS = JSON_PREFIX + "OBJKEYS";
+ private static final String JSON_DEL = JSON_PREFIX + "DEL";
+ private static final String JSON_FORGET = JSON_PREFIX + "FORGET";
+ private static final String JSON_TOGGLE = JSON_PREFIX + "TOGGLE";
+ private static final String JSON_STRAPPEND = JSON_PREFIX + "STRAPPEND";
+ private static final String JSON_STRLEN = JSON_PREFIX + "STRLEN";
+ private static final String JSON_CLEAR = JSON_PREFIX + "CLEAR";
+ private static final String JSON_RESP = JSON_PREFIX + "RESP";
+ private static final String JSON_TYPE = JSON_PREFIX + "TYPE";
+
+ private MultiJson() {}
+
+ /**
+ * Sets the JSON value at the specified path stored at key.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @param path Represents the path within the JSON document where the value will be set. The key
+ * will be modified only if value is added as the last child in the specified
+ * path, or if the specified path acts as the parent of a new child
+ * being added.
+ * @param value The value to set at the specific path, in JSON formatted string.
+ * @return Command Response - A simple "OK" response if the value is successfully
+ * set.
+ */
+ public static > BaseTransaction set(
+ @NonNull BaseTransaction transaction,
+ @NonNull ArgType key,
+ @NonNull ArgType path,
+ @NonNull ArgType value) {
+ checkTypeOrThrow(key);
+ checkTypeOrThrow(path);
+ checkTypeOrThrow(value);
+ return transaction.customCommand(
+ newArgsBuilder().add(JSON_SET).add(key).add(path).add(value).toArray());
+ }
+
+ /**
+ * Sets the JSON value at the specified path stored at key.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @param path Represents the path within the JSON document where the value will be set. The key
+ * will be modified only if value is added as the last child in the specified
+ * path, or if the specified path acts as the parent of a new child
+ * being added.
+ * @param value The value to set at the specific path, in JSON formatted string.
+ * @param setCondition Set the value only if the given condition is met (within the key or path).
+ * @return Command Response - A simple "OK" response if the value is successfully
+ * set. If value isn't set because of setCondition, returns null.
+ */
+ public static > BaseTransaction set(
+ @NonNull BaseTransaction transaction,
+ @NonNull ArgType key,
+ @NonNull ArgType path,
+ @NonNull ArgType value,
+ @NonNull ConditionalChange setCondition) {
+ checkTypeOrThrow(key);
+ checkTypeOrThrow(path);
+ checkTypeOrThrow(value);
+ return transaction.customCommand(
+ newArgsBuilder()
+ .add(JSON_SET)
+ .add(key)
+ .add(path)
+ .add(value)
+ .add(setCondition.getValkeyApi())
+ .toArray());
+ }
+
+ /**
+ * Retrieves the JSON value at the specified path stored at key.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @return Command Response - Returns a string representation of the JSON document. If key
+ * doesn't exist, returns null.
+ */
+ public static > BaseTransaction get(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key) {
+ checkTypeOrThrow(key);
+ return transaction.customCommand(newArgsBuilder().add(JSON_GET).add(key).toArray());
+ }
+
+ /**
+ * Retrieves the JSON value at the specified paths stored at key.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @param paths List of paths within the JSON document.
+ * @return Command Response -
+ *
+ *
If one path is given:
+ *
+ *
For JSONPath (path starts with $): Returns a stringified JSON list
+ * replies for every possible path, or a string representation of an empty array,
+ * if path doesn't exist. If key doesn't exist, returns null
+ * .
+ *
For legacy path (path doesn't start with $): Returns a string
+ * representation of the value in paths. If paths
+ * doesn't exist, an error is raised. If key doesn't exist, returns
+ * null.
+ *
+ *
If multiple paths are given: Returns a stringified JSON, in which each path is a key,
+ * and it's corresponding value, is the value as if the path was executed in the command
+ * as a single path.
+ *
+ * In case of multiple paths, and paths are a mix of both JSONPath and legacy
+ * path, the command behaves as if all are JSONPath paths.
+ */
+ public static > BaseTransaction get(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key, @NonNull ArgType[] paths) {
+ checkTypeOrThrow(key);
+ checkTypeOrThrow(paths);
+ return transaction.customCommand(newArgsBuilder().add(JSON_GET).add(key).add(paths).toArray());
+ }
+
+ /**
+ * Retrieves the JSON value at the specified path stored at key.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @param options Options for formatting the byte representation of the JSON data. See
+ * JsonGetOptions.
+ * @return Command Response - Returns a string representation of the JSON document. If key
+ * doesn't exist, returns null.
+ */
+ public static > BaseTransaction get(
+ @NonNull BaseTransaction transaction,
+ @NonNull ArgType key,
+ @NonNull JsonGetOptions options) {
+ checkTypeOrThrow(key);
+ return transaction.customCommand(
+ newArgsBuilder().add(JSON_GET).add(key).add(options.toArgs()).toArray());
+ }
+
+ /**
+ * Retrieves the JSON value at the specified path stored at key.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @param paths List of paths within the JSON document.
+ * @param options Options for formatting the byte representation of the JSON data. See
+ * JsonGetOptions.
+ * @return Command Response -
+ *
+ *
If one path is given:
+ *
+ *
For JSONPath (path starts with $): Returns a stringified JSON list
+ * replies for every possible path, or a string representation of an empty array,
+ * if path doesn't exist. If key doesn't exist, returns null
+ * .
+ *
For legacy path (path doesn't start with $): Returns a string
+ * representation of the value in paths. If paths
+ * doesn't exist, an error is raised. If key doesn't exist, returns
+ * null.
+ *
+ *
If multiple paths are given: Returns a stringified JSON, in which each path is a key,
+ * and it's corresponding value, is the value as if the path was executed in the command
+ * as a single path.
+ *
+ * In case of multiple paths, and paths are a mix of both JSONPath and legacy
+ * path, the command behaves as if all are JSONPath paths.
+ */
+ public static > BaseTransaction get(
+ @NonNull BaseTransaction transaction,
+ @NonNull ArgType key,
+ @NonNull ArgType[] paths,
+ @NonNull JsonGetOptions options) {
+ checkTypeOrThrow(key);
+ checkTypeOrThrow(paths);
+ return transaction.customCommand(
+ newArgsBuilder().add(JSON_GET).add(key).add(options.toArgs()).add(paths).toArray());
+ }
+
+ /**
+ * Retrieves the JSON values at the specified path stored at multiple keys
+ * .
+ *
+ * @apiNote When using ClusterTransaction, all keys in the transaction must be mapped to the same
+ * slot.
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param keys The keys of the JSON documents.
+ * @param path The path within the JSON documents.
+ * @return Command Response -An array with requested values for each key.
+ *
+ *
For JSONPath (path starts with $): Returns a stringified JSON list
+ * replies for every possible path, or a string representation of an empty array, if
+ * path doesn't exist.
+ *
For legacy path (path doesn't start with $): Returns a string
+ * representation of the value in path. If path doesn't exist,
+ * the corresponding array element will be null.
+ *
+ * If a key doesn't exist, the corresponding array element will be null
+ * .
+ */
+ public static > BaseTransaction mget(
+ @NonNull BaseTransaction transaction, @NonNull ArgType[] keys, @NonNull ArgType path) {
+ checkTypeOrThrow(keys);
+ checkTypeOrThrow(path);
+ return transaction.customCommand(newArgsBuilder().add(JSON_MGET).add(keys).add(path).toArray());
+ }
+
+ /**
+ * Appends one or more values to the JSON array at the specified path
+ * within the JSON document stored at key.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @param path Represents the path within the JSON document where the values
+ * will be appended.
+ * @param values The JSON values to be appended to the array.
+ * JSON string values must be wrapped with quotes. For example, to append "foo",
+ * pass "\"foo\"".
+ * @return Command Response -
+ *
+ *
For JSONPath (path starts with $):
+ * Returns a list of integers for every possible path, indicating the new length of the
+ * array after appending values, or null for JSON values
+ * matching the path that are not an array. If path does not exist, an
+ * empty array will be returned.
+ *
For legacy path (path doesn't start with $):
+ * Returns the new length of the array after appending values to the array
+ * at path. If multiple paths are matched, returns the last updated array.
+ * If the JSON value at path is not an array or if path
+ * doesn't exist, an error is raised. If key doesn't exist, an error is
+ * raised.
+ */
+ public static > BaseTransaction arrappend(
+ @NonNull BaseTransaction transaction,
+ @NonNull ArgType key,
+ @NonNull ArgType path,
+ @NonNull ArgType[] values) {
+ checkTypeOrThrow(key);
+ checkTypeOrThrow(path);
+ checkTypeOrThrow(values);
+ return transaction.customCommand(
+ newArgsBuilder().add(JSON_ARRAPPEND).add(key).add(path).add(values).toArray());
+ }
+
+ /**
+ * Inserts one or more values into the array at the specified path within the JSON
+ * document stored at key, before the given index.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @param path The path within the JSON document.
+ * @param index The array index before which values are inserted.
+ * @param values The JSON values to be inserted into the array.
+ * JSON string values must be wrapped with quotes. For example, to insert "foo",
+ * pass "\"foo\"".
+ * @return Command Response -
+ *
+ *
For JSONPath (path starts with $):
+ * Returns an Object[] with a list of integers for every possible path,
+ * indicating the new length of the array, or null for JSON values matching
+ * the path that are not an array. If path does not exist, an empty array
+ * will be returned.
+ *
For legacy path (path doesn't start with $):
+ * Returns an integer representing the new length of the array. If multiple paths are
+ * matched, returns the length of the first modified array. If path doesn't
+ * exist or the value at path is not an array, an error is raised.
+ *
+ * If the index is out of bounds or key doesn't exist, an error is raised.
+ */
+ public static > BaseTransaction arrinsert(
+ @NonNull BaseTransaction transaction,
+ @NonNull ArgType key,
+ @NonNull ArgType path,
+ int index,
+ @NonNull ArgType[] values) {
+ checkTypeOrThrow(key);
+ checkTypeOrThrow(path);
+ checkTypeOrThrow(values);
+ return transaction.customCommand(
+ newArgsBuilder()
+ .add(JSON_ARRINSERT)
+ .add(key)
+ .add(path)
+ .add(Integer.toString(index))
+ .add(values)
+ .toArray());
+ }
+
+ /**
+ * Searches for the first occurrence of a scalar JSON value in the arrays at the
+ * path.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @param path The path within the JSON document.
+ * @param scalar The scalar value to search for.
+ * @return Command Response -
+ *
+ *
For JSONPath (path starts with $): Returns an array with a
+ * list of integers for every possible path, indicating the index of the matching
+ * element. The value is -1 if not found. If a value is not an array, its
+ * corresponding return value is null.
+ *
For legacy path (path doesn't start with $): Returns an integer
+ * representing the index of matching element, or -1 if not found. If the
+ * value at the path is not an array, an error is raised.
+ *
+ */
+ public static > BaseTransaction arrindex(
+ @NonNull BaseTransaction transaction,
+ @NonNull ArgType key,
+ @NonNull ArgType path,
+ @NonNull ArgType scalar) {
+ checkTypeOrThrow(key);
+ checkTypeOrThrow(path);
+ checkTypeOrThrow(scalar);
+ return transaction.customCommand(
+ newArgsBuilder().add(JSON_ARRINDEX).add(key).add(path).add(scalar).toArray());
+ }
+
+ /**
+ * Searches for the first occurrence of a scalar JSON value in the arrays at the
+ * path.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @param path The path within the JSON document.
+ * @param scalar The scalar value to search for.
+ * @param options The additional options for the command. See JsonArrindexOptions.
+ * @return Command Response -
+ *
+ *
For JSONPath (path starts with $): Returns an array with a
+ * list of integers for every possible path, indicating the index of the matching
+ * element. The value is -1 if not found. If a value is not an array, its
+ * corresponding return value is null.
+ *
For legacy path (path doesn't start with $): Returns an integer
+ * representing the index of matching element, or -1 if not found. If the
+ * value at the path is not an array, an error is raised.
+ *
+ */
+ public static > BaseTransaction arrindex(
+ @NonNull BaseTransaction transaction,
+ @NonNull ArgType key,
+ @NonNull ArgType path,
+ @NonNull ArgType scalar,
+ @NonNull JsonArrindexOptions options) {
+ checkTypeOrThrow(key);
+ checkTypeOrThrow(path);
+ checkTypeOrThrow(scalar);
+ return transaction.customCommand(
+ newArgsBuilder()
+ .add(JSON_ARRINDEX)
+ .add(key)
+ .add(path)
+ .add(scalar)
+ .add(options.toArgs())
+ .toArray());
+ }
+
+ /**
+ * Retrieves the length of the array at the specified path within the JSON document
+ * stored at key.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @param path The path within the JSON document.
+ * @return Command Response -
+ *
+ *
For JSONPath (path starts with $):
+ * Returns an Object[] with a list of integers for every possible path,
+ * indicating the length of the array, or null for JSON values matching the
+ * path that are not an array. If path does not exist, an empty array will
+ * be returned.
+ *
For legacy path (path doesn't start with $):
+ * Returns an integer representing the length of the array. If multiple paths are
+ * matched, returns the length of the first matching array. If path doesn't
+ * exist or the value at path is not an array, an error is raised.
+ *
+ * If key doesn't exist, returns null.
+ */
+ public static > BaseTransaction arrlen(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key, @NonNull ArgType path) {
+ checkTypeOrThrow(key);
+ checkTypeOrThrow(path);
+ return transaction.customCommand(
+ newArgsBuilder().add(JSON_ARRLEN).add(key).add(path).toArray());
+ }
+
+ /**
+ * Retrieves the length of the array at the root of the JSON document stored at key.
+ *
+ * Equivalent to {@link #arrlen(BaseTransaction, ArgType, ArgType)} with path set to
+ *
+ * ".".
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @return Command Response - The array length stored at the root of the document. If document
+ * root is not an array, an error is raised.
+ * If key doesn't exist, returns null.
+ */
+ public static > BaseTransaction arrlen(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key) {
+ checkTypeOrThrow(key);
+ return transaction.customCommand(newArgsBuilder().add(JSON_ARRLEN).add(key).toArray());
+ }
+
+ /**
+ * Reports memory usage in bytes of a JSON object at the specified path within the
+ * JSON document stored at key.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @param path The path within the JSON document.
+ * @return Command Response -
+ *
+ *
For JSONPath (path starts with $):
+ * Returns an Object[] with a list of numbers for every possible path,
+ * indicating the memory usage. If path does not exist, an empty array will
+ * be returned.
+ *
For legacy path (path doesn't start with $):
+ * Returns an integer representing the memory usage. If multiple paths are matched,
+ * returns the data of the first matching object. If path doesn't exist, an
+ * error is raised.
+ *
+ * If key doesn't exist, returns null.
+ */
+ public static > BaseTransaction debugMemory(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key, @NonNull ArgType path) {
+ checkTypeOrThrow(key);
+ checkTypeOrThrow(path);
+ return transaction.customCommand(
+ newArgsBuilder().add(JSON_DEBUG_MEMORY).add(key).add(path).toArray());
+ }
+
+ /**
+ * Reports memory usage in bytes of a JSON object at the specified path within the
+ * JSON document stored at key.
+ * Equivalent to {@link #debugMemory(BaseTransaction, ArgType, ArgType)} with path
+ * set to "..".
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @return Command Response - The total memory usage in bytes of the entire JSON document.
+ * If key doesn't exist, returns null.
+ * @example
+ *
+ */
+ public static > BaseTransaction debugMemory(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key) {
+ checkTypeOrThrow(key);
+ return transaction.customCommand(newArgsBuilder().add(JSON_DEBUG_MEMORY).add(key).toArray());
+ }
+
+ /**
+ * Reports the number of fields at the specified path within the JSON document stored
+ * at key.
+ * Each non-container JSON value counts as one field. Objects and arrays recursively count one
+ * field for each of their containing JSON values. Each container value, except the root
+ * container, counts as one additional field.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @param path The path within the JSON document.
+ * @return Command Response -
+ *
+ *
For JSONPath (path starts with $):
+ * Returns an Object[] with a list of numbers for every possible path,
+ * indicating the number of fields. If path does not exist, an empty array
+ * will be returned.
+ *
For legacy path (path doesn't start with $):
+ * Returns an integer representing the number of fields. If multiple paths are matched,
+ * returns the data of the first matching object. If path doesn't exist, an
+ * error is raised.
+ *
+ * If key doesn't exist, returns null.
+ */
+ public static > BaseTransaction debugFields(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key, @NonNull ArgType path) {
+ checkTypeOrThrow(key);
+ checkTypeOrThrow(path);
+ return transaction.customCommand(
+ newArgsBuilder().add(JSON_DEBUG_FIELDS).add(key).add(path).toArray());
+ }
+
+ /**
+ * Reports the number of fields at the specified path within the JSON document stored
+ * at key.
+ * Each non-container JSON value counts as one field. Objects and arrays recursively count one
+ * field for each of their containing JSON values. Each container value, except the root
+ * container, counts as one additional field.
+ * Equivalent to {@link #debugFields(BaseTransaction, ArgType, ArgType)} with path
+ * set to "..".
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @return Command Response - The total number of fields in the entire JSON document.
+ * If key doesn't exist, returns null.
+ */
+ public static > BaseTransaction debugFields(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key) {
+ checkTypeOrThrow(key);
+ return transaction.customCommand(newArgsBuilder().add(JSON_DEBUG_FIELDS).add(key).toArray());
+ }
+
+ /**
+ * Pops the last element from the array stored in the root of the JSON document stored at
+ * key. Equivalent to {@link #arrpop(BaseTransaction, ArgType, ArgType)} with
+ * path set to ".".
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @return Command Response - Returns a string representing the popped JSON value, or null
+ * if the array at document root is empty.
+ * If the JSON value at document root is not an array or if key doesn't exist, an
+ * error is raised.
+ */
+ public static > BaseTransaction arrpop(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key) {
+ checkTypeOrThrow(key);
+ return transaction.customCommand(newArgsBuilder().add(JSON_ARRPOP).add(key).toArray());
+ }
+
+ /**
+ * Pops the last element from the array located at path in the JSON document stored
+ * at key.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @param path The path within the JSON document.
+ * @return Command Response -
+ *
+ *
For JSONPath (path starts with $):
+ * Returns an array with a strings for every possible path, representing the popped JSON
+ * values, or null for JSON values matching the path that are not an array
+ * or an empty array.
+ *
For legacy path (path doesn't start with $):
+ * Returns a string representing the popped JSON value, or null if the
+ * array at path is empty. If multiple paths are matched, the value from
+ * the first matching array that is not empty is returned. If path doesn't
+ * exist or the value at path is not an array, an error is raised.
+ *
+ * If key doesn't exist, an error is raised.
+ */
+ public static > BaseTransaction arrpop(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key, @NonNull ArgType path) {
+ checkTypeOrThrow(key);
+ checkTypeOrThrow(path);
+ return transaction.customCommand(
+ newArgsBuilder().add(JSON_ARRPOP).add(key).add(path).toArray());
+ }
+
+ /**
+ * Pops an element from the array located at path in the JSON document stored at
+ * key.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @param path The path within the JSON document.
+ * @param index The index of the element to pop. Out of boundary indexes are rounded to their
+ * respective array boundaries.
+ * @return Command Response -
+ *
+ *
For JSONPath (path starts with $):
+ * Returns an array with a strings for every possible path, representing the popped JSON
+ * values, or null for JSON values matching the path that are not an array
+ * or an empty array.
+ *
For legacy path (path doesn't start with $):
+ * Returns a string representing the popped JSON value, or null if the
+ * array at path is empty. If multiple paths are matched, the value from
+ * the first matching array that is not empty is returned. If path doesn't
+ * exist or the value at path is not an array, an error is raised.
+ *
+ * If key doesn't exist, an error is raised.
+ */
+ public static > BaseTransaction arrpop(
+ @NonNull BaseTransaction transaction,
+ @NonNull ArgType key,
+ @NonNull ArgType path,
+ long index) {
+ checkTypeOrThrow(key);
+ checkTypeOrThrow(path);
+ return transaction.customCommand(
+ newArgsBuilder().add(JSON_ARRPOP).add(key).add(path).add(Long.toString(index)).toArray());
+ }
+
+ /**
+ * Trims an array at the specified path within the JSON document stored at key
+ * so that it becomes a subarray [start, end], both inclusive.
+ *
+ * If start < 0, it is treated as 0.
+ * If end >= size (size of the array), it is treated as size -1.
+ * If start >= size or start > end, the array is emptied
+ * and 0 is return.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @param path The path within the JSON document.
+ * @param start The index of the first element to keep, inclusive.
+ * @param end The index of the last element to keep, inclusive.
+ * @return Command Response -
+ *
+ *
For JSONPath (path starts with $):
+ * Returns an Object[] with a list of integers for every possible path,
+ * indicating the new length of the array, or null for JSON values matching
+ * the path that are not an array. If the array is empty, its corresponding return value
+ * is 0. If path doesn't exist, an empty array will be return. If an index
+ * argument is out of bounds, an error is raised.
+ *
For legacy path (path doesn't start with $):
+ * Returns an integer representing the new length of the array. If the array is empty,
+ * its corresponding return value is 0. If multiple paths match, the length of the first
+ * trimmed array match is returned. If path doesn't exist, or the value at
+ * path is not an array, an error is raised. If an index argument is out of
+ * bounds, an error is raised.
+ *
+ * If key doesn't exist, returns null.
+ */
+ public static > BaseTransaction arrtrim(
+ @NonNull BaseTransaction transaction,
+ @NonNull ArgType key,
+ @NonNull ArgType path,
+ int start,
+ int end) {
+ checkTypeOrThrow(key);
+ checkTypeOrThrow(path);
+ return transaction.customCommand(
+ newArgsBuilder()
+ .add(JSON_ARRTRIM)
+ .add(key)
+ .add(path)
+ .add(Integer.toString(start))
+ .add(Integer.toString(end))
+ .toArray());
+ }
+
+ /**
+ * Increments or decrements the JSON value(s) at the specified path by number
+ * within the JSON document stored at key.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @param path The path within the JSON document.
+ * @param number The number to increment or decrement by.
+ * @return Command Response -
+ *
+ *
For JSONPath (path starts with $):
+ * Returns a string representation of an array of strings, indicating the new values
+ * after incrementing for each matched path.
+ * If a value is not a number, its corresponding return value will be null.
+ *
+ * If path doesn't exist, a byte string representation of an empty array
+ * will be returned.
+ *
For legacy path (path doesn't start with $):
+ * Returns a string representation of the resulting value after the increment or
+ * decrement.
+ * If multiple paths match, the result of the last updated value is returned.
+ * If the value at the path is not a number or path doesn't
+ * exist, an error is raised.
+ *
+ * If key does not exist, an error is raised.
+ * If the result is out of the range of 64-bit IEEE double, an error is raised.
+ */
+ public static > BaseTransaction numincrby(
+ @NonNull BaseTransaction transaction,
+ @NonNull ArgType key,
+ @NonNull ArgType path,
+ Number number) {
+ checkTypeOrThrow(key);
+ checkTypeOrThrow(path);
+ return transaction.customCommand(
+ newArgsBuilder().add(JSON_NUMINCRBY).add(key).add(path).add(number.toString()).toArray());
+ }
+
+ /**
+ * Multiplies the JSON value(s) at the specified path by number within
+ * the JSON document stored at key.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @param path The path within the JSON document.
+ * @param number The number to multiply by.
+ * @return Command Response -
+ *
+ *
For JSONPath (path starts with $):
+ * Returns a string representation of an array of strings, indicating the new values
+ * after multiplication for each matched path.
+ * If a value is not a number, its corresponding return value will be null.
+ *
+ * If path doesn't exist, a byte string representation of an empty array
+ * will be returned.
+ *
For legacy path (path doesn't start with $):
+ * Returns a string representation of the resulting value after multiplication.
+ * If multiple paths match, the result of the last updated value is returned.
+ * If the value at the path is not a number or path doesn't
+ * exist, an error is raised.
+ *
+ * If key does not exist, an error is raised.
+ * If the result is out of the range of 64-bit IEEE double, an error is raised.
+ */
+ public static > BaseTransaction nummultby(
+ @NonNull BaseTransaction transaction,
+ @NonNull ArgType key,
+ @NonNull ArgType path,
+ Number number) {
+ checkTypeOrThrow(key);
+ checkTypeOrThrow(path);
+ return transaction.customCommand(
+ newArgsBuilder().add(JSON_NUMMULTBY).add(key).add(path).add(number.toString()).toArray());
+ }
+
+ /**
+ * Retrieves the number of key-value pairs in the object values at the specified path
+ * within the JSON document stored at key.
+ * Equivalent to {@link #objlen(BaseTransaction, ArgType, ArgType)} with path set to
+ *
+ * ".".
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @return Command Response - The object length stored at the root of the document. If document
+ * root is not an object, an error is raised.
+ * If key doesn't exist, returns null.
+ */
+ public static > BaseTransaction objlen(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key) {
+ checkTypeOrThrow(key);
+ return transaction.customCommand(newArgsBuilder().add(JSON_OBJLEN).add(key).toArray());
+ }
+
+ /**
+ * Retrieves the number of key-value pairs in the object values at the specified path
+ * within the JSON document stored at key.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @param path The path within the JSON document.
+ * @return Command Response -
+ *
+ *
For JSONPath (path starts with $):
+ * Returns an Object[] with a list of long integers for every possible
+ * path, indicating the number of key-value pairs for each matching object, or
+ * null
+ * for JSON values matching the path that are not an object. If path
+ * does not exist, an empty array will be returned.
+ *
For legacy path (path doesn't start with $):
+ * Returns the number of key-value pairs for the object value matching the path. If
+ * multiple paths are matched, returns the length of the first matching object. If
+ * path doesn't exist or the value at path is not an array, an
+ * error is raised.
+ *
+ * If key doesn't exist, returns null.
+ */
+ public static > BaseTransaction objlen(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key, @NonNull ArgType path) {
+ checkTypeOrThrow(key);
+ checkTypeOrThrow(path);
+ return transaction.customCommand(
+ newArgsBuilder().add(JSON_OBJLEN).add(key).add(path).toArray());
+ }
+
+ /**
+ * Retrieves the key names in the object values at the specified path within the JSON
+ * document stored at key.
+ * Equivalent to {@link #objkeys(BaseTransaction, ArgType, ArgType)} with path set to
+ *
+ * ".".
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @return Command Response - The object length stored at the root of the document. If document
+ * root is not an object, an error is raised.
+ * If key doesn't exist, returns null.
+ */
+ public static > BaseTransaction objkeys(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key) {
+ checkTypeOrThrow(key);
+ return transaction.customCommand(newArgsBuilder().add(JSON_OBJKEYS).add(key).toArray());
+ }
+
+ /**
+ * Retrieves the key names in the object values at the specified path within the JSON
+ * document stored at key.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @param path The path within the JSON document.
+ * @return Command Response -
+ *
+ *
For JSONPath (path starts with $):
+ * Returns an Object[][] with each nested array containing key names for
+ * each matching object for every possible path, indicating the list of object keys for
+ * each matching object, or null for JSON values matching the path that are
+ * not an object. If path does not exist, an empty sub-array will be
+ * returned.
+ *
For legacy path (path doesn't start with $):
+ * Returns an array of object keys for the object value matching the path. If multiple
+ * paths are matched, returns the length of the first matching object. If path
+ * doesn't exist or the value at path is not an array, an error is
+ * raised.
+ *
+ * If key doesn't exist, returns null.
+ */
+ public static > BaseTransaction objkeys(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key, @NonNull ArgType path) {
+ checkTypeOrThrow(key);
+ checkTypeOrThrow(path);
+ return transaction.customCommand(
+ newArgsBuilder().add(JSON_OBJKEYS).add(key).add(path).toArray());
+ }
+
+ /**
+ * Deletes the JSON document stored at key.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @return Command Response - The number of elements deleted. 0 if the key does not exist.
+ */
+ public static > BaseTransaction del(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key) {
+ checkTypeOrThrow(key);
+ return transaction.customCommand(newArgsBuilder().add(JSON_DEL).add(key).toArray());
+ }
+
+ /**
+ * Deletes the JSON value at the specified path within the JSON document stored at
+ * key.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @param path Represents the path within the JSON document where the value will be deleted.
+ * @return Command Response - The number of elements deleted. 0 if the key does not exist, or if
+ * the JSON path is invalid or does not exist.
+ */
+ public static > BaseTransaction del(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key, @NonNull ArgType path) {
+ checkTypeOrThrow(key);
+ checkTypeOrThrow(path);
+ return transaction.customCommand(newArgsBuilder().add(JSON_DEL).add(key).add(path).toArray());
+ }
+
+ /**
+ * Deletes the JSON document stored at key.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @return Command Response - The number of elements deleted. 0 if the key does not exist.
+ */
+ public static > BaseTransaction forget(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key) {
+ checkTypeOrThrow(key);
+ return transaction.customCommand(newArgsBuilder().add(JSON_FORGET).add(key).toArray());
+ }
+
+ /**
+ * Deletes the JSON value at the specified path within the JSON document stored at
+ * key.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @param path Represents the path within the JSON document where the value will be deleted.
+ * @return Command Response - The number of elements deleted. 0 if the key does not exist, or if
+ * the JSON path is invalid or does not exist.
+ */
+ public static > BaseTransaction forget(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key, @NonNull ArgType path) {
+ checkTypeOrThrow(key);
+ checkTypeOrThrow(path);
+ return transaction.customCommand(
+ newArgsBuilder().add(JSON_FORGET).add(key).add(path).toArray());
+ }
+
+ /**
+ * Toggles a Boolean value stored at the root within the JSON document stored at key.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @return Command Response - Returns the toggled boolean value at the root of the document, or
+ * null for JSON values matching the root that are not boolean. If key
+ * doesn't exist, returns null.
+ */
+ public static > BaseTransaction toggle(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key) {
+ checkTypeOrThrow(key);
+ return transaction.customCommand(newArgsBuilder().add(JSON_TOGGLE).add(key).toArray());
+ }
+
+ /**
+ * Toggles a Boolean value stored at the specified path within the JSON document
+ * stored at key.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @param path The path within the JSON document.
+ * @return Command Response -
+ *
+ *
For JSONPath (path starts with $):
+ * Returns a Boolean[] with the toggled boolean value for every possible
+ * path, or null for JSON values matching the path that are not boolean.
+ *
For legacy path (path doesn't start with $):
+ * Returns the value of the toggled boolean in path. If path
+ * doesn't exist or the value at path isn't a boolean, an error is raised.
+ *
+ * If key doesn't exist, returns null.
+ */
+ public static > BaseTransaction toggle(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key, @NonNull ArgType path) {
+ checkTypeOrThrow(key);
+ checkTypeOrThrow(path);
+ return transaction.customCommand(
+ newArgsBuilder().add(JSON_TOGGLE).add(key).add(path).toArray());
+ }
+
+ /**
+ * Appends the specified value to the string stored at the specified path
+ * within the JSON document stored at key.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @param value The value to append to the string. Must be wrapped with single quotes. For
+ * example, to append "foo", pass '"foo"'.
+ * @param path The path within the JSON document.
+ * @return Command Response -
+ *
+ *
For JSONPath (path starts with $):
+ * Returns a list of integer replies for every possible path, indicating the length of
+ * the resulting string after appending value, or null for
+ * JSON values matching the path that are not string.
+ * If key doesn't exist, an error is raised.
+ *
For legacy path (path doesn't start with $):
+ * Returns the length of the resulting string after appending value to the
+ * string at path.
+ * If multiple paths match, the length of the last updated string is returned.
+ * If the JSON value at path is not a string of if path
+ * doesn't exist, an error is raised.
+ * If key doesn't exist, an error is raised.
+ *
+ */
+ public static > BaseTransaction strappend(
+ @NonNull BaseTransaction transaction,
+ @NonNull ArgType key,
+ @NonNull ArgType value,
+ @NonNull ArgType path) {
+ checkTypeOrThrow(key);
+ checkTypeOrThrow(value);
+ checkTypeOrThrow(path);
+ return transaction.customCommand(
+ newArgsBuilder().add(JSON_STRAPPEND).add(key).add(path).add(value).toArray());
+ }
+
+ /**
+ * Appends the specified value to the string stored at the root within the JSON
+ * document stored at key.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @param value The value to append to the string. Must be wrapped with single quotes. For
+ * example, to append "foo", pass '"foo"'.
+ * @return Command Response - Returns the length of the resulting string after appending
+ * value to the string at the root.
+ * If the JSON value at root is not a string, an error is raised.
+ * If key doesn't exist, an error is raised.
+ */
+ public static > BaseTransaction strappend(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key, @NonNull ArgType value) {
+ checkTypeOrThrow(key);
+ checkTypeOrThrow(value);
+ return transaction.customCommand(
+ newArgsBuilder().add(JSON_STRAPPEND).add(key).add(value).toArray());
+ }
+
+ /**
+ * Returns the length of the JSON string value stored at the specified path within
+ * the JSON document stored at key.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @param path The path within the JSON document.
+ * @return Command Response -
+ *
+ *
For JSONPath (path starts with $):
+ * Returns a list of integer replies for every possible path, indicating the length of
+ * the JSON string value, or null for JSON values matching the path that
+ * are not string.
+ *
For legacy path (path doesn't start with $):
+ * Returns the length of the JSON value at path or null if
+ * key doesn't exist.
+ * If multiple paths match, the length of the first matched string is returned.
+ * If the JSON value at path is not a string of if path
+ * doesn't exist, an error is raised. If key doesn't exist, null
+ * is returned.
+ *
+ */
+ public static > BaseTransaction strlen(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key, @NonNull ArgType path) {
+ checkTypeOrThrow(key);
+ checkTypeOrThrow(path);
+ return transaction.customCommand(
+ newArgsBuilder().add(JSON_STRLEN).add(key).add(path).toArray());
+ }
+
+ /**
+ * Returns the length of the JSON string value stored at the root within the JSON document stored
+ * at key.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @return Command Response - Returns the length of the JSON value at the root.
+ * If the JSON value is not a string, an error is raised.
+ * If key doesn't exist, null is returned.
+ */
+ public static > BaseTransaction strlen(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key) {
+ checkTypeOrThrow(key);
+ return transaction.customCommand(newArgsBuilder().add(JSON_STRLEN).add(key).toArray());
+ }
+
+ /**
+ * Clears an array and an object at the root of the JSON document stored at key.
+ * Equivalent to {@link #clear(BaseTransaction, ArgType, ArgType)} with path set to
+ *
+ * ".".
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @return Command Response - 1 if the document wasn't empty or 0 if it
+ * was.
+ * If key doesn't exist, an error is raised.
+ */
+ public static > BaseTransaction clear(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key) {
+ checkTypeOrThrow(key);
+ return transaction.customCommand(newArgsBuilder().add(JSON_CLEAR).add(key).toArray());
+ }
+
+ /**
+ * Clears arrays and objects at the specified path within the JSON document stored at
+ * key.
+ * Numeric values are set to 0, boolean values are set to false, and
+ * string values are converted to empty strings.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @param path The path within the JSON document.
+ * @return Command Response - The number of containers cleared.
+ * If path doesn't exist, or the value at path is already cleared
+ * (e.g., an empty array, object, or string), 0 is returned. If key doesn't
+ * exist, an error is raised.
+ */
+ public static > BaseTransaction clear(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key, @NonNull ArgType path) {
+ checkTypeOrThrow(key);
+ checkTypeOrThrow(path);
+ return transaction.customCommand(newArgsBuilder().add(JSON_CLEAR).add(key).add(path).toArray());
+ }
+
+ /**
+ * Retrieves the JSON document stored at key. The returning result is in the Valkey
+ * or Redis OSS Serialization Protocol (RESP).
+ *
+ *
+ *
JSON null is mapped to the RESP Null Bulk String.
+ *
JSON Booleans are mapped to RESP Simple string.
+ *
JSON integers are mapped to RESP Integers.
+ *
JSON doubles are mapped to RESP Bulk Strings.
+ *
JSON strings are mapped to RESP Bulk Strings.
+ *
JSON arrays are represented as RESP arrays, where the first element is the simple string
+ * [, followed by the array's elements.
+ *
JSON objects are represented as RESP object, where the first element is the simple string
+ * {, followed by key-value pairs, each of which is a RESP bulk string.
+ *
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @return Command Response - Returns the JSON document in its RESP form. If key
+ * doesn't exist, null is returned.
+ */
+ public static > BaseTransaction resp(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key) {
+ checkTypeOrThrow(key);
+ return transaction.customCommand(newArgsBuilder().add(JSON_RESP).add(key).toArray());
+ }
+
+ /**
+ * Retrieve the JSON value at the specified path within the JSON document stored at
+ * key. The returning result is in the Valkey or Redis OSS Serialization Protocol
+ * (RESP).
+ *
+ *
+ *
JSON null is mapped to the RESP Null Bulk String.
+ *
JSON Booleans are mapped to RESP Simple string.
+ *
JSON integers are mapped to RESP Integers.
+ *
JSON doubles are mapped to RESP Bulk Strings.
+ *
JSON strings are mapped to RESP Bulk Strings.
+ *
JSON arrays are represented as RESP arrays, where the first element is the simple string
+ * [, followed by the array's elements.
+ *
JSON objects are represented as RESP object, where the first element is the simple string
+ * {, followed by key-value pairs, each of which is a RESP bulk string.
+ *
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @param path The path within the JSON document.
+ * @return Command Response -
+ *
+ *
For JSONPath (path starts with $): Returns a list of
+ * replies for every possible path, indicating the RESP form of the JSON value. If
+ * path doesn't exist, returns an empty list.
+ *
For legacy path (path doesn't starts with $): Returns a
+ * single reply for the JSON value at the specified path, in its RESP form. If multiple
+ * paths match, the value of the first JSON value match is returned. If path
+ * doesn't exist, an error is raised.
+ *
+ * If key doesn't exist, null is returned.
+ */
+ public static > BaseTransaction resp(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key, @NonNull ArgType path) {
+ checkTypeOrThrow(key);
+ checkTypeOrThrow(path);
+ return transaction.customCommand(newArgsBuilder().add(JSON_RESP).add(key).add(path).toArray());
+ }
+
+ /**
+ * Retrieves the type of the JSON value at the root of the JSON document stored at key
+ * .
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @return Command Response - Returns the type of the JSON value at root. If key
+ * doesn't exist,
+ * null is returned.
+ */
+ public static > BaseTransaction type(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key) {
+ checkTypeOrThrow(key);
+ return transaction.customCommand(newArgsBuilder().add(JSON_TYPE).add(key).toArray());
+ }
+
+ /**
+ * Retrieves the type of the JSON value at the specified path within the JSON
+ * document stored at key.
+ *
+ * @param transaction The Valkey GLIDE client to execute the command in transaction.
+ * @param key The key of the JSON document.
+ * @param path Represents the path within the JSON document where the type will be retrieved.
+ * @return Command Response -
+ *
+ *
For JSONPath (path starts with $): Returns a list of string
+ * replies for every possible path, indicating the type of the JSON value. If `path`
+ * doesn't exist, an empty array will be returned.
+ *
For legacy path (path doesn't starts with $): Returns the
+ * type of the JSON value at `path`. If multiple paths match, the type of the first JSON
+ * value match is returned. If `path` doesn't exist, null will be returned.
+ *
+ * If key doesn't exist, null is returned.
+ */
+ public static > BaseTransaction type(
+ @NonNull BaseTransaction transaction, @NonNull ArgType key, @NonNull ArgType path) {
+ checkTypeOrThrow(key);
+ checkTypeOrThrow(path);
+ return transaction.customCommand(newArgsBuilder().add(JSON_TYPE).add(key).add(path).toArray());
+ }
+}
diff --git a/java/client/src/main/java/glide/api/models/BaseTransaction.java b/java/client/src/main/java/glide/api/models/BaseTransaction.java
index 3914b05049..bfdd81efc0 100644
--- a/java/client/src/main/java/glide/api/models/BaseTransaction.java
+++ b/java/client/src/main/java/glide/api/models/BaseTransaction.java
@@ -215,6 +215,8 @@
import static glide.api.models.commands.stream.StreamReadOptions.READ_COUNT_VALKEY_API;
import static glide.api.models.commands.stream.XInfoStreamOptions.COUNT;
import static glide.api.models.commands.stream.XInfoStreamOptions.FULL;
+import static glide.utils.ArgsBuilder.checkTypeOrThrow;
+import static glide.utils.ArgsBuilder.newArgsBuilder;
import static glide.utils.ArrayTransformUtils.flattenAllKeysFollowedByAllValues;
import static glide.utils.ArrayTransformUtils.flattenMapToGlideStringArray;
import static glide.utils.ArrayTransformUtils.flattenMapToGlideStringArrayValueFirst;
@@ -7267,35 +7269,6 @@ protected ArgsArray emptyArgs() {
return commandArgs.build();
}
- protected ArgsBuilder newArgsBuilder() {
- return new ArgsBuilder();
- }
-
- protected void checkTypeOrThrow(ArgType arg) {
- if ((arg instanceof String) || (arg instanceof GlideString)) {
- return;
- }
- throw new IllegalArgumentException("Expected String or GlideString");
- }
-
- protected void checkTypeOrThrow(ArgType[] args) {
- if (args.length == 0) {
- // nothing to check here
- return;
- }
- checkTypeOrThrow(args[0]);
- }
-
- protected void checkTypeOrThrow(Map argsMap) {
- if (argsMap.isEmpty()) {
- // nothing to check here
- return;
- }
-
- var arg = argsMap.keySet().iterator().next();
- checkTypeOrThrow(arg);
- }
-
/** Helper function for creating generic type ("ArgType") array */
@SafeVarargs
protected final ArgType[] createArray(ArgType... args) {
diff --git a/java/client/src/main/java/glide/api/models/ClusterTransaction.java b/java/client/src/main/java/glide/api/models/ClusterTransaction.java
index 6252d69d36..667c8e2785 100644
--- a/java/client/src/main/java/glide/api/models/ClusterTransaction.java
+++ b/java/client/src/main/java/glide/api/models/ClusterTransaction.java
@@ -4,6 +4,8 @@
import static command_request.CommandRequestOuterClass.RequestType.PubSubShardChannels;
import static command_request.CommandRequestOuterClass.RequestType.PubSubShardNumSub;
import static command_request.CommandRequestOuterClass.RequestType.SPublish;
+import static glide.utils.ArgsBuilder.checkTypeOrThrow;
+import static glide.utils.ArgsBuilder.newArgsBuilder;
import glide.api.GlideClusterClient;
import lombok.NonNull;
diff --git a/java/client/src/main/java/glide/api/models/Transaction.java b/java/client/src/main/java/glide/api/models/Transaction.java
index ed69907b2b..ac7bf6e09f 100644
--- a/java/client/src/main/java/glide/api/models/Transaction.java
+++ b/java/client/src/main/java/glide/api/models/Transaction.java
@@ -7,6 +7,8 @@
import static command_request.CommandRequestOuterClass.RequestType.Select;
import static glide.api.commands.GenericBaseCommands.REPLACE_VALKEY_API;
import static glide.api.commands.GenericCommands.DB_VALKEY_API;
+import static glide.utils.ArgsBuilder.checkTypeOrThrow;
+import static glide.utils.ArgsBuilder.newArgsBuilder;
import glide.api.GlideClient;
import glide.api.models.commands.scan.ScanOptions;
diff --git a/java/client/src/main/java/glide/utils/ArgsBuilder.java b/java/client/src/main/java/glide/utils/ArgsBuilder.java
index 066d75a707..c6873f70fb 100644
--- a/java/client/src/main/java/glide/utils/ArgsBuilder.java
+++ b/java/client/src/main/java/glide/utils/ArgsBuilder.java
@@ -3,6 +3,7 @@
import glide.api.models.GlideString;
import java.util.ArrayList;
+import java.util.Map;
/**
* Helper class for collecting arbitrary type of arguments and stores them as an array of
@@ -63,4 +64,33 @@ public ArgsBuilder add(int[] args) {
public GlideString[] toArray() {
return argumentsList.toArray(new GlideString[0]);
}
+
+ public static void checkTypeOrThrow(ArgType arg) {
+ if ((arg instanceof String) || (arg instanceof GlideString)) {
+ return;
+ }
+ throw new IllegalArgumentException("Expected String or GlideString");
+ }
+
+ public static void checkTypeOrThrow(ArgType[] args) {
+ if (args.length == 0) {
+ // nothing to check here
+ return;
+ }
+ checkTypeOrThrow(args[0]);
+ }
+
+ public static void checkTypeOrThrow(Map argsMap) {
+ if (argsMap.isEmpty()) {
+ // nothing to check here
+ return;
+ }
+
+ var arg = argsMap.keySet().iterator().next();
+ checkTypeOrThrow(arg);
+ }
+
+ public static ArgsBuilder newArgsBuilder() {
+ return new ArgsBuilder();
+ }
}
diff --git a/java/integTest/src/test/java/glide/modules/JsonTests.java b/java/integTest/src/test/java/glide/modules/JsonTests.java
index 747a6078b6..21d051f12f 100644
--- a/java/integTest/src/test/java/glide/modules/JsonTests.java
+++ b/java/integTest/src/test/java/glide/modules/JsonTests.java
@@ -1,6 +1,7 @@
/** Copyright Valkey GLIDE Project Contributors - SPDX Identifier: Apache-2.0 */
package glide.modules;
+import static glide.TestUtilities.assertDeepEquals;
import static glide.TestUtilities.commonClusterClientConfig;
import static glide.api.BaseClient.OK;
import static glide.api.models.GlideString.gs;
@@ -16,12 +17,15 @@
import com.google.gson.JsonParser;
import glide.api.GlideClusterClient;
import glide.api.commands.servermodules.Json;
+import glide.api.commands.servermodules.MultiJson;
+import glide.api.models.ClusterTransaction;
import glide.api.models.GlideString;
import glide.api.models.commands.ConditionalChange;
import glide.api.models.commands.FlushMode;
import glide.api.models.commands.InfoOptions.Section;
import glide.api.models.commands.json.JsonArrindexOptions;
import glide.api.models.commands.json.JsonGetOptions;
+import java.util.ArrayList;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ExecutionException;
@@ -1225,4 +1229,201 @@ public void json_type() {
// Check for all types in the JSON document using legacy path
assertEquals("string", Json.type(client, key, "[*]").get());
}
+
+ @SneakyThrows
+ @Test
+ public void transaction_tests() {
+
+ ClusterTransaction transaction = new ClusterTransaction();
+ ArrayList