Skip to content

Commit

Permalink
Java: Add XCLAIM command (#392)
Browse files Browse the repository at this point in the history
* Python: add XPENDING command (valkey-io#1704)

* Python: add XPENDING command

* PR suggestions

* PR suggestions

* Java: Add Command GeoSearch & GeoSearchStore

* Java: Add Command GeoSearch & GeoSearchStore
---------

* trigger build

* Python: add RANDOMKEY command (valkey-io#1701)

* Python: add RANDOMKEY command

* Enable randomkey() test for that redis-rs is fixed

Signed-off-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* NOP push

Signed-off-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

---------

Signed-off-by: Andrew Carbonetto <andrew.carbonetto@improving.com>
Co-authored-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* Python: add FUNCTION FLUSH command (valkey-io#1700)

* Python: Added FUNCTION LOAD command

* Python: adds FUNCTION FLUSH command

* Updated CHANGELOG.md

* Resolved merge issues related to FlushMode

* Minor adjustments on command documentation

* Revert one minor change in example.

---------

Co-authored-by: Shoham Elias <shohame@amazon.com>
Co-authored-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* removing redis references

* Java: Handle panics and errors in the Java FFI layer (valkey-io#1601)

* Restructure Java FFI layer to handle errors properly

* Fix failing tests

* Address clippy lints

* Add tests for error and panic handling

* Add missing errors module

* Fix clippy lint

* Fix FFI tests

* Apply Spotless

* Fix some minor issue I forgot about

* Add some comments

* Apply Spotless

* Make handle_panics return Option<T> instead

* Java: Add SSCAN and ZSCAN commands (valkey-io#1705)

* Java: Add `SSCAN` command (#394)

* Add ScanOptions base class for scan-family options.
* Expose the cursor as a String to support unsigned 64-bit cursor values.

Co-authored-by: James Duong <james.duong@improving.com>

* Java: Add `ZSCAN` command (#397)

---------

Co-authored-by: James Duong <james.duong@improving.com>

* WIP TODO: support transactions, docs, and more IT

* Added more tests

* Added tests and javadocs

* Improved examples and tests

* Correct use of SScanOptions instead of ScanOptions for SScan

* Remove plumbing for SCAN command

* Sleep after sadd() calls before sscan() calls

Due to eventual consistency

* Change sscan cursor to be a String

Also fix bug in SharedCommandTests

* WIP with todos

* Add ZScan to TransactionTestUtilities

* Spotless cleanup

* Test fixes

* Cleanup test code

* Apply IntelliJ suggestions
* Use String.valueOf() instead of concatenating empty string

* Added better error info for set comparison failures

* More logging for test failures

* Add sleeps after zadd() calls

To help make sure data is consistent without WAIT

* Longer sleeps

* Reduce wait time

* Experiment with unsigned 64-bit cursors

* Fix rebase error

* WIP TODO: support transactions, docs, and more IT

* Added more tests

* Added tests and javadocs

* Improved examples and tests

* Apply PR comments

* Fix method ordering in BaseTransaction
* Fix broken line breaks within code tags in ScanOptions
* More thoroughly test results in SharedCommandTests

* Add better logging for set comparisons

* Spotless

* Sleep after sadd() calls before sscan() calls

Due to eventual consistency

* Change sscan cursor to be a String

Also fix bug in SharedCommandTests

* Update java/integTest/src/test/java/glide/SharedCommandTests.java

Co-authored-by: Guian Gumpac <guian.gumpac@improving.com>

* Update java/integTest/src/test/java/glide/SharedCommandTests.java

Co-authored-by: Guian Gumpac <guian.gumpac@improving.com>

* Fix rebase conflicts

* Fix another rebase conflict

* Spotless

* Update java/client/src/main/java/glide/api/models/BaseTransaction.java

Co-authored-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* Update java/client/src/main/java/glide/api/models/BaseTransaction.java

Co-authored-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* Update java/client/src/main/java/glide/api/models/BaseTransaction.java

Co-authored-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* Update java/client/src/main/java/glide/api/models/BaseTransaction.java

Co-authored-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* Correctly use constants in TransactionTests

* Rename ScanOptions to BaseScanOptions

* Doc PR fixes

* Treat end of cursor as failure

* Spotless

* Fixes

* Update java/client/src/main/java/glide/api/commands/SortedSetBaseCommands.java

Co-authored-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* Update java/client/src/main/java/glide/api/commands/SortedSetBaseCommands.java

Co-authored-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* Update java/client/src/main/java/glide/api/commands/SortedSetBaseCommands.java

Co-authored-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* Update java/client/src/main/java/glide/api/commands/SortedSetBaseCommands.java

Co-authored-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* Minor doc changes

---------

Co-authored-by: Guian Gumpac <guian.gumpac@improving.com>
Co-authored-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* CI: Add Support for Valkey 6.2, 7.0 and 7.2  (valkey-io#1711)

- Transitioned the engine building process to be sourced from the Valkey repository.
- Introduced compatibility with the following engine versions:
Valkey and Redis 6.2
Valkey and Redis 7.0
Valkey and Redis 7.2 (first stable release of Valkey 7.2.5.)
- Engine Installation Checks:
Added check that the engine is installed with the requested version.
- Moved the engine version matrix to a JSON file for better management and readability.
- Fixed Object Encoding tests to expect quicklist on versions < 7.2 instead of 7.0
- Fixed C# and Java version parsing from redis-server -v output to support also Valkey's output
- Updated the README file with the supported versions & engine typ

* Python: add FUNCTION DELETE command (valkey-io#1714)

* Python: adds FUNCTION DELETE command

Co-authored-by: Shoham Elias <shohame@amazon.com>

* Python: add `SSCAN` command (valkey-io#1709)

* Added sscan command to python

* Fixed formatting

* Fixed CI failures

* Lint

* Improved example and test

* Changes based on sscan java PR

* Added to changelog

* Addressed PR comments

* Added string casting

* Java: Add HSCAN command (valkey-io#1706)

* Java: Add `SSCAN` command (#394)

* Add ScanOptions base class for scan-family options.
* Expose the cursor as a String to support unsigned 64-bit cursor values.

Co-authored-by: James Duong <james.duong@improving.com>

* Java: Add `ZSCAN` command (#397)

---------

Co-authored-by: James Duong <james.duong@improving.com>

* WIP TODO: support transactions, docs, and more IT

* Added more tests

* Added tests and javadocs

* Improved examples and tests

* Correct use of SScanOptions instead of ScanOptions for SScan

* Remove plumbing for SCAN command

* Sleep after sadd() calls before sscan() calls

Due to eventual consistency

* Change sscan cursor to be a String

Also fix bug in SharedCommandTests

* WIP with todos

* Add ZScan to TransactionTestUtilities

* Spotless cleanup

* Test fixes

* Cleanup test code

* Apply IntelliJ suggestions
* Use String.valueOf() instead of concatenating empty string

* Added better error info for set comparison failures

* More logging for test failures

* Add sleeps after zadd() calls

To help make sure data is consistent without WAIT

* Longer sleeps

* Reduce wait time

* Experiment with unsigned 64-bit cursors

* Fix rebase error

* WIP TODO: support transactions, docs, and more IT

* Added more tests

* Added tests and javadocs

* Improved examples and tests

* Sleep after sadd() calls before sscan() calls

Due to eventual consistency

* Change sscan cursor to be a String

Also fix bug in SharedCommandTests

* Fix rebase conflicts

* Fix another rebase conflict

* Spotless

* HScan

* Flakey test

* Add HScan transaction unit test

* Rename ScanOptions to BaseScanOptions

* Fix merge issues

* Fix module-info ordering

* Tidy up docs

* PR comments

Fix up merge duplication and use HScanOptions constants.

---------

Co-authored-by: Guian Gumpac <guian.gumpac@improving.com>

* Python: add LCS command (valkey-io#1716)

* python: add LCS command (#406)

* python: add LCS command

* update CHANGELOG

* add more comment explaning the functionality of the command

* address comments on the docs

* Java: Changed handling of large requests to transfer them as leaked pointers (valkey-io#1708)

* Restructure Java FFI layer to handle errors properly

* Address clippy lints

* Add tests for error and panic handling

* Fix FFI tests

* Apply Spotless

* Fix some minor issue I forgot about

* Add API to create the leaked bytes vec

* Bridge the MAX_REQUEST_ARGS_LENGTH constant from Rust to Java

* Fix warnings in Rust

* Update Java client to utilize the pointer with large argument sizes

* Update createLeakedBytesVec to handle panics

* spotless

* Add docs and run Rust linters

* Add large value tests

* Fix transactions and add transaction tests

* dummy commit for CI

* Revert "dummy commit for CI"

This reverts commit 3ed1937.

* Fix JDK11 build issue

Due to using a JDK17 function

* Fix another JDK11 issue

* Fix merge issues.

* Remove unneccesary mut prefix

* Clarify the MAX_REQUEST_ARGS_LENGTH_IN_BYTES constant

* Fix merge issue

---------

Co-authored-by: Jonathan Louie <jonathanl@bitquilltech.com>

* Create initial workflow for publishing to Maven Central (valkey-io#1600)

* WIP Create initial workflow for publishing to Maven Central (valkey-io#1594)

* WIP Create initial workflow for publishing to Maven Central

* Add classifier to workflow

* Remove condition to allow all jobs to run

* Try to fix Gradle workflow errors

* Re-enable aws related options

* Add missing property

* Revert "Add missing property"

This reverts commit 6cc5fba.

* Add AWS_ACTIONS option

* Sign JAR file

* Fix signing issue

* Try to fix issue with generating secring.gpg file

* Fix path to secring.gpg

* Try to fix secring.gpg retrieval issue

* Remove base64 decode

* Try to fix multi-line issue with GPG key secret

* Go back to echo approach

* Decode base64 properly this time

* Use GPG_KEY_ID

* Surround password in quotes

* Publish JAR to local Maven and upload

* Update examples build.gradle

* Sign publishToMavenLocal build

* Update version of Java JAR

* Properly fetch src_folder variable contents

* Reorganize JAR contents

* Update path of uploaded JAR

* Update artifact ID

* Add missing comma

* Replace placeholders in build.gradle

* Update examples build.gradle

* Remove test runs from java.yml workflow

* Add debugging info to workflow

* Adjust debug info

* Readd placeholder text in build.gradle

* Add more debug info

* Change how the JAR is copied

* Add configurations for ARM linux and x86 macos

* Prevent output artifacts from being swallowed

* Update build matrix to use proper RUNNERs

* Try to use self-hosted runner for ARM Linux builds

* Delete gradle-cd workflow

* Add id-token permissions

* Add step to setup self-hosted runner access

* Add CONTAINER property to java.yml workflow

* Remove install Redis step from java.yml workflow

* Remove test-benchmark step from java.yml workflow

* Fix issue with Java classifier

* Update java.yml to use classifier

* Bump version and add archiveClassifier

* Change groupId to valkey-client

* Update example and base archive name

* Update workflow

* Rename to glide-for-redis

* Extracting Java Deployment to a different workflow

Workflow will only trigger when a tag is pushed to the repo

Version is extracted from the tag and replaced in the build.grade files

reverted changes of java.yml file

* trying to make the workflow to build

* testing action to prepare build

* forcing new action to trigger

* Revert "forcing new action to trigger"

This reverts commit d097a1f.

* Revert "testing action to prepare build"

This reverts commit 8864434.

* Revert "trying to make the workflow to build"

This reverts commit 143818a.

* Revert "Extracting Java Deployment to a different workflow"

This reverts commit faff846.

* Revert "Revert "Extracting Java Deployment to a different workflow""

This reverts commit 11f8470.

* fixing workflow

* fixed path for the local maven

* removing bundle from the tests
fix to the JAVA CI not finding tests dependencies

* fix java workflow

* removing classifier from the pom

* fixing concurrency

* Remove publishToMavenLocal line in examples build.gradle

* fix examples

* cleaning up java.yml

* testing removing test dependency

* adding skip signing

* Revert "adding skip signing"

This reverts commit e448788.

* Revert "testing removing test dependency"

This reverts commit d0e06b7.

* Revert "cleaning up java.yml"

This reverts commit e7394d7.

* removing dependency of singing in the local build

* java.yml clean up

* removing steps from java.yml

* added comments

* removed step on sed the examples and removed if always from the upload artifacts

---------

Co-authored-by: affonsov <affonsov@bitquilltech.com>
Co-authored-by: affonsov <affonso.vieira@improving.com>

* valkey-io#1715: fix flakey test in xpending (valkey-io#1717)

Signed-off-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* Java: Adding command WAIT (valkey-io#1707)

* Java: Adding command WAIT

Java: Adding command WAIT

* addressing comments

* fixing timeout_idx in get_timeout_from_cmd_args call

* update timeout check

* fixing rust test

* adding special case for WAIT

* rust linter

* remove special case in get_timeout_from_cmd_args

* adding description for timeout 0

* rust linter

* updating timeout test

* changing transaction documentation

---------

Co-authored-by: TJ Zhang <tj.zhang@improving.com>

* support smismember with GlideString (valkey-io#1694)

* Support GlideString for sdiff commands (valkey-io#1722)

Co-authored-by: Yulazari <yulazari@b0de28c93acb.ant.amazon.com>

* Updated attribution files

* support hset, hget, lindex, linsert, blmove, incr, hlen and lmove wit… (valkey-io#1667)

* Python: move the commands return value to bytes (valkey-io#1617)

* In the case of Simple String, Bulk String, or Verbatim String commands, Bytes will be returned instead of strings.

---------

Co-authored-by: GilboaAWS <gilboabg@amazon.com>
Co-authored-by: Ubuntu <ubuntu@ip-172-31-41-43.eu-west-1.compute.internal>
Co-authored-by: Adar Ovadia <adarov@amazon.com>
Co-authored-by: Shoham Elias <shohame@amazon.com>
Co-authored-by: Shoham Elias <116083498+shohamazon@users.noreply.github.com>

* Java: Add XGROUP SETID command (valkey-io#1720)

* Initial implementation of XGroupSetId

* Unit tests

* Add integration tests

* PR feedback

* Address PR comments

doc updates

* Add 7.0.0 transaction integration test

* Java: update README directory to include Java's README.md (valkey-io#1734)

add java part to readme directory

* Java: Add XCLAIM command

Signed-off-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* Add unit tests

Signed-off-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* Add transaction tests

Signed-off-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* SPOTLESS

Signed-off-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* Update IT tests

Signed-off-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* Update IT tests

Signed-off-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* Add UT tests

Signed-off-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* Add transaction tests

Signed-off-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* Fix transaction tests

Signed-off-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* Update XCLAIM with options; remove LASTID

Signed-off-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* Add a couple more test cases

Signed-off-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* clean up

Signed-off-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* Clean rust

Signed-off-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* Add examples

Signed-off-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* Move to 2D string array in response

Signed-off-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* Fix Transaction tests; update examples

Signed-off-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* SPOTLESS

Signed-off-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

---------

Signed-off-by: Andrew Carbonetto <andrew.carbonetto@improving.com>
Co-authored-by: Aaron <69273634+aaron-congo@users.noreply.github.com>
Co-authored-by: tjzhang-BQ <111323543+tjzhang-BQ@users.noreply.github.com>
Co-authored-by: TJ Zhang <tj.zhang@improving.com>
Co-authored-by: Yi-Pin Chen <yi-pin.chen@improving.com>
Co-authored-by: Shoham Elias <shohame@amazon.com>
Co-authored-by: jonathanl-bq <72158117+jonathanl-bq@users.noreply.github.com>
Co-authored-by: James Duong <duong.james@gmail.com>
Co-authored-by: Guian Gumpac <guian.gumpac@improving.com>
Co-authored-by: Bar Shaul <88437685+barshaul@users.noreply.github.com>
Co-authored-by: James Duong <james.duong@improving.com>
Co-authored-by: James Xin <126831592+jamesx-improving@users.noreply.github.com>
Co-authored-by: Jonathan Louie <jonathanl@bitquilltech.com>
Co-authored-by: affonsov <affonsov@bitquilltech.com>
Co-authored-by: affonsov <affonso.vieira@improving.com>
Co-authored-by: Alon Arenberg <93711356+alon-arenberg@users.noreply.github.com>
Co-authored-by: yulazariy <yulazari@amazon.com>
Co-authored-by: Yulazari <yulazari@b0de28c93acb.ant.amazon.com>
Co-authored-by: ort-bot <glide-for-redis@amazon.com>
Co-authored-by: adarovadya <adarovadya@gmail.com>
Co-authored-by: GilboaAWS <gilboabg@amazon.com>
Co-authored-by: Ubuntu <ubuntu@ip-172-31-41-43.eu-west-1.compute.internal>
Co-authored-by: Adar Ovadia <adarov@amazon.com>
Co-authored-by: Shoham Elias <116083498+shohamazon@users.noreply.github.com>
Co-authored-by: Chloe Yip <168601573+cyip10@users.noreply.github.com>
  • Loading branch information
25 people committed Jul 1, 2024
1 parent 6111494 commit 52933a5
Show file tree
Hide file tree
Showing 11 changed files with 1,052 additions and 8 deletions.
40 changes: 40 additions & 0 deletions glide-core/src/client/value_conversion.rs
Original file line number Diff line number Diff line change
Expand Up @@ -925,6 +925,16 @@ pub(crate) fn expected_type_for_cmd(cmd: &Cmd) -> Option<ExpectedReturnType> {
key_type: &None,
value_type: &None,
}),
b"XCLAIM" => {
if cmd.position(b"JUSTID").is_some() {
Some(ExpectedReturnType::ArrayOfStrings)
} else {
Some(ExpectedReturnType::Map {
key_type: &Some(ExpectedReturnType::SimpleString),
value_type: &Some(ExpectedReturnType::ArrayOfPairs),
})
}
}
b"XAUTOCLAIM" => {
if cmd.position(b"JUSTID").is_some() {
// Value conversion is not needed if the JUSTID arg was passed.
Expand Down Expand Up @@ -1262,6 +1272,36 @@ mod tests {
assert!(converted_4.is_err());
}

#[test]
fn convert_xclaim() {
assert!(matches!(
expected_type_for_cmd(
redis::cmd("XCLAIM")
.arg("key")
.arg("grou")
.arg("consumer")
.arg("0")
.arg("id")
),
Some(ExpectedReturnType::Map {
key_type: &Some(ExpectedReturnType::SimpleString),
value_type: &Some(ExpectedReturnType::ArrayOfPairs),
})
));
assert!(matches!(
expected_type_for_cmd(
redis::cmd("XCLAIM")
.arg("key")
.arg("grou")
.arg("consumer")
.arg("0")
.arg("id")
.arg("JUSTID")
),
Some(ExpectedReturnType::ArrayOfStrings)
));
}

#[test]
fn convert_xrange_xrevrange() {
assert!(matches!(
Expand Down
1 change: 1 addition & 0 deletions glide-core/src/protobuf/redis_request.proto
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,7 @@ enum RequestType {
HScan = 202;
XAutoClaim = 203;
Wait = 208;
XClaim = 209;
}

message Command {
Expand Down
3 changes: 3 additions & 0 deletions glide-core/src/request_type.rs
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,7 @@ pub enum RequestType {
HScan = 202,
XAutoClaim = 203,
Wait = 208,
XClaim = 209,
}

fn get_two_word_command(first: &str, second: &str) -> Cmd {
Expand Down Expand Up @@ -429,6 +430,7 @@ impl From<::protobuf::EnumOrUnknown<ProtobufRequestType>> for RequestType {
ProtobufRequestType::HScan => RequestType::HScan,
ProtobufRequestType::XAutoClaim => RequestType::XAutoClaim,
ProtobufRequestType::Wait => RequestType::Wait,
ProtobufRequestType::XClaim => RequestType::XClaim,
}
}
}
Expand Down Expand Up @@ -643,6 +645,7 @@ impl RequestType {
RequestType::HScan => Some(cmd("HSCAN")),
RequestType::XAutoClaim => Some(cmd("XAUTOCLAIM")),
RequestType::Wait => Some(cmd("WAIT")),
RequestType::XClaim => Some(cmd("XCLAIM")),
}
}
}
63 changes: 63 additions & 0 deletions java/client/src/main/java/glide/api/BaseClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import static glide.api.models.commands.bitmap.BitFieldOptions.BitFieldReadOnlySubCommands;
import static glide.api.models.commands.bitmap.BitFieldOptions.BitFieldSubCommands;
import static glide.api.models.commands.bitmap.BitFieldOptions.createBitFieldArgs;
import static glide.api.models.commands.stream.StreamClaimOptions.JUST_ID_REDIS_API;
import static glide.ffi.resolvers.SocketListenerResolver.getSocket;
import static glide.utils.ArrayTransformUtils.cast3DArray;
import static glide.utils.ArrayTransformUtils.castArray;
Expand Down Expand Up @@ -136,6 +137,7 @@
import static redis_request.RedisRequestOuterClass.RequestType.Watch;
import static redis_request.RedisRequestOuterClass.RequestType.XAck;
import static redis_request.RedisRequestOuterClass.RequestType.XAdd;
import static redis_request.RedisRequestOuterClass.RequestType.XClaim;
import static redis_request.RedisRequestOuterClass.RequestType.XDel;
import static redis_request.RedisRequestOuterClass.RequestType.XGroupCreate;
import static redis_request.RedisRequestOuterClass.RequestType.XGroupCreateConsumer;
Expand Down Expand Up @@ -223,6 +225,7 @@
import glide.api.models.commands.scan.SScanOptions;
import glide.api.models.commands.scan.ZScanOptions;
import glide.api.models.commands.stream.StreamAddOptions;
import glide.api.models.commands.stream.StreamClaimOptions;
import glide.api.models.commands.stream.StreamGroupOptions;
import glide.api.models.commands.stream.StreamPendingOptions;
import glide.api.models.commands.stream.StreamRange;
Expand Down Expand Up @@ -2085,6 +2088,66 @@ public CompletableFuture<Object[][]> xpending(
XPending, args, response -> castArray(handleArrayResponse(response), Object[].class));
}

@Override
public CompletableFuture<Map<String, String[][]>> xclaim(
@NonNull String key,
@NonNull String group,
@NonNull String consumer,
long minIdleTime,
@NonNull String[] ids) {
String[] args =
concatenateArrays(new String[] {key, group, consumer, Long.toString(minIdleTime)}, ids);
return commandManager.submitNewCommand(XClaim, args, this::handleMapResponse);
}

@Override
public CompletableFuture<Map<String, String[][]>> xclaim(
@NonNull String key,
@NonNull String group,
@NonNull String consumer,
long minIdleTime,
@NonNull String[] ids,
@NonNull StreamClaimOptions options) {
String[] args =
concatenateArrays(
new String[] {key, group, consumer, Long.toString(minIdleTime)}, ids, options.toArgs());
return commandManager.submitNewCommand(XClaim, args, this::handleMapResponse);
}

@Override
public CompletableFuture<String[]> xclaimJustId(
@NonNull String key,
@NonNull String group,
@NonNull String consumer,
long minIdleTime,
@NonNull String[] ids) {
String[] args =
concatenateArrays(
new String[] {key, group, consumer, Long.toString(minIdleTime)},
ids,
new String[] {JUST_ID_REDIS_API});
return commandManager.submitNewCommand(
XClaim, args, response -> castArray(handleArrayResponse(response), String.class));
}

@Override
public CompletableFuture<String[]> xclaimJustId(
@NonNull String key,
@NonNull String group,
@NonNull String consumer,
long minIdleTime,
@NonNull String[] ids,
@NonNull StreamClaimOptions options) {
String[] args =
concatenateArrays(
new String[] {key, group, consumer, Long.toString(minIdleTime)},
ids,
options.toArgs(),
new String[] {JUST_ID_REDIS_API});
return commandManager.submitNewCommand(
XClaim, args, response -> castArray(handleArrayResponse(response), String.class));
}

@Override
public CompletableFuture<Long> pttl(@NonNull String key) {
return commandManager.submitNewCommand(PTTL, new String[] {key}, this::handleLongResponse);
Expand Down
116 changes: 116 additions & 0 deletions java/client/src/main/java/glide/api/commands/StreamBaseCommands.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import glide.api.models.GlideString;
import glide.api.models.commands.stream.StreamAddOptions;
import glide.api.models.commands.stream.StreamAddOptions.StreamAddOptionsBuilder;
import glide.api.models.commands.stream.StreamClaimOptions;
import glide.api.models.commands.stream.StreamGroupOptions;
import glide.api.models.commands.stream.StreamPendingOptions;
import glide.api.models.commands.stream.StreamRange;
Expand Down Expand Up @@ -711,4 +712,119 @@ CompletableFuture<Object[][]> xpending(
StreamRange end,
long count,
StreamPendingOptions options);

/**
* Changes the ownership of a pending message.
*
* @see <a href="https://valkey.io/commands/xclaim/">valkey.io</a> for details.
* @param key The key of the stream.
* @param group The consumer group name.
* @param consumer The group consumer.
* @param minIdleTime The minimum idle time for the message to be claimed.
* @param ids A array of entry ids.
* @return A <code>Map</code> of message entries with the format <code>
* {"entryId": [["entry", "data"], ...], ...}</code> that are claimed by the consumer.
* @example
* <pre>
* // read messages from streamId for consumer1
* var readResult = client.xreadgroup(Map.of("mystream", entryId), "mygroup", "consumer1").get();
* // assign unclaimed messages to consumer2
* Map<String, String[][]> results = client.xclaim("mystream", "mygroup", "consumer2", 0L, new String[] {entryId}).get();
* for (String key: results.keySet()) {
* System.out.println(key);
* for (String[] entry: results.get(key)) {
* System.out.printf("{%s=%s}%n", entry[0], entry[1]);
* }
* }
* </pre>
*/
CompletableFuture<Map<String, String[][]>> xclaim(
String key, String group, String consumer, long minIdleTime, String[] ids);

/**
* Changes the ownership of a pending message.
*
* @see <a href="https://valkey.io/commands/xclaim/">valkey.io</a> for details.
* @param key The key of the stream.
* @param group The consumer group name.
* @param consumer The group consumer.
* @param minIdleTime The minimum idle time for the message to be claimed.
* @param ids An array of entry ids.
* @param options Stream claim options {@link StreamClaimOptions}.
* @return A <code>Map</code> of message entries with the format <code>
* {"entryId": [["entry", "data"], ...], ...}</code> that are claimed by the consumer.
* @example
* <pre>
* // assign (force) unread and unclaimed messages to consumer2
* StreamClaimOptions options = StreamClaimOptions.builder().force().build()
* Map<String, String[]> results = client.xclaim("mystream", "mygroup", "consumer2", 0L, new String[] {entryId}, options).get();
* for (String key: results.keySet()) {
* System.out.println(key);
* for (String[] entry: results.get(key)) {
* System.out.printf("{%s=%s}%n", entry[0], entry[1]);
* }
* }
* </pre>
*/
CompletableFuture<Map<String, String[][]>> xclaim(
String key,
String group,
String consumer,
long minIdleTime,
String[] ids,
StreamClaimOptions options);

/**
* Changes the ownership of a pending message. This function returns an <code>array</code> with
* only the message/entry IDs, and is equivalent to using <code>JUSTID</code> in the Redis API.
*
* @see <a href="https://valkey.io/commands/xclaim/">valkey.io</a> for details.
* @param key The key of the stream.
* @param group The consumer group name.
* @param consumer The group consumer.
* @param minIdleTime The minimum idle time for the message to be claimed.
* @param ids An array of entry ids.
* @return An <code>array</code> of message ids claimed by the consumer.
* @example
* <pre>
* // read messages from streamId for consumer1
* var readResult = client.xreadgroup(Map.of("mystream", entryId), "mygroup", "consumer1").get();
* // assign unclaimed messages to consumer2
* Map<String, String[]> results = client.xclaimJustId("mystream", "mygroup", "consumer2", 0L, new String[] {entryId}).get();
* for (String key: results.keySet()) {
* System.out.println(key);
* }
* </pre>
*/
CompletableFuture<String[]> xclaimJustId(
String key, String group, String consumer, long minIdleTime, String[] ids);

/**
* Changes the ownership of a pending message. This function returns an <code>array</code> with
* only the message/entry IDs, and is equivalent to using <code>JUSTID</code> in the Redis API.
*
* @see <a href="https://valkey.io/commands/xclaim/">valkey.io</a> for details.
* @param key The key of the stream.
* @param group The consumer group name.
* @param consumer The group consumer.
* @param minIdleTime The minimum idle time for the message to be claimed.
* @param ids An array of entry ids.
* @param options Stream claim options {@link StreamClaimOptions}.
* @return An <code>array</code> of message ids claimed by the consumer.
* @example
* <pre>
* // assign (force) unread and unclaimed messages to consumer2
* StreamClaimOptions options = StreamClaimOptions.builder().force().build()
* Map<String, String[]> results = client.xclaimJustId("mystream", "mygroup", "consumer2", 0L, new String[] {entryId}, options).get();
* for (String key: results.keySet()) {
* System.out.println(key);
* }
*/
CompletableFuture<String[]> xclaimJustId(
String key,
String group,
String consumer,
long minIdleTime,
String[] ids,
StreamClaimOptions options);
}
Loading

0 comments on commit 52933a5

Please sign in to comment.