diff --git a/glide-core/benches/rotating_buffer_benchmark.rs b/glide-core/benches/rotating_buffer_benchmark.rs index 581a278453..224d1b702b 100644 --- a/glide-core/benches/rotating_buffer_benchmark.rs +++ b/glide-core/benches/rotating_buffer_benchmark.rs @@ -6,8 +6,8 @@ use std::io::Write; use bytes::BufMut; use criterion::{black_box, criterion_group, criterion_main, Criterion}; use glide_core::{ - redis_request::{command, redis_request}, - redis_request::{Command, RedisRequest, RequestType}, + command_request::{command, command_request}, + command_request::{Command, CommandRequest, RequestType}, rotating_buffer::RotatingBuffer, }; use integer_encoding::VarInt; @@ -118,7 +118,7 @@ fn write_length(buffer: &mut Vec, length: u32) { u32::encode_var(length, &mut buffer[new_len - required_space..]); } -fn message_buffer(request: RedisRequest) -> Vec { +fn message_buffer(request: CommandRequest) -> Vec { let message_length = request.compute_size() as usize; let mut buffer = Vec::with_capacity(message_length); write_length(&mut buffer, message_length as u32); @@ -164,8 +164,8 @@ fn split_data() -> Vec> { vec![vec, vec1, vec2] } -fn create_request(args: Vec, args_pointer: bool) -> RedisRequest { - let mut request = RedisRequest::new(); +fn create_request(args: Vec, args_pointer: bool) -> CommandRequest { + let mut request = CommandRequest::new(); request.callback_idx = 1; let mut command = Command::new(); command.request_type = RequestType::CustomCommand.into(); @@ -178,15 +178,15 @@ fn create_request(args: Vec, args_pointer: bool) -> RedisRequest { args_array.args = args; command.args = Some(command::Args::ArgsArray(args_array)); } - request.command = Some(redis_request::Command::SingleCommand(command)); + request.command = Some(command_request::Command::SingleCommand(command)); request } -fn short_request() -> RedisRequest { +fn short_request() -> CommandRequest { create_request(vec!["GET".into(), "goo".into(), "bar".into()], false) } -fn medium_request() -> RedisRequest { +fn medium_request() -> CommandRequest { create_request( vec![ "GET".into(), @@ -197,7 +197,7 @@ fn medium_request() -> RedisRequest { ) } -fn long_request(args_pointer: bool) -> RedisRequest { +fn long_request(args_pointer: bool) -> CommandRequest { create_request( vec![ "GET".into(), @@ -215,7 +215,7 @@ macro_rules! run_bench { $test_name($c, "rotating_buffer", |test_data: &Vec>| { for data in test_data { $rotating_buffer.current_buffer().put(&data[..]); - $rotating_buffer.get_requests::().unwrap(); + $rotating_buffer.get_requests::().unwrap(); } $rotating_buffer.current_buffer().clear() }); diff --git a/glide-core/build.rs b/glide-core/build.rs index a20b5dadea..cd838c9a53 100644 --- a/glide-core/build.rs +++ b/glide-core/build.rs @@ -11,7 +11,7 @@ fn build_protobuf() { protobuf_codegen::Codegen::new() .cargo_out_dir("protobuf") .include("src") - .input("src/protobuf/redis_request.proto") + .input("src/protobuf/command_request.proto") .input("src/protobuf/response.proto") .input("src/protobuf/connection_request.proto") .customize(customization_options) diff --git a/glide-core/src/protobuf/redis_request.proto b/glide-core/src/protobuf/command_request.proto similarity index 99% rename from glide-core/src/protobuf/redis_request.proto rename to glide-core/src/protobuf/command_request.proto index e3d2b01b2c..c7fc1cba03 100644 --- a/glide-core/src/protobuf/redis_request.proto +++ b/glide-core/src/protobuf/command_request.proto @@ -1,5 +1,5 @@ syntax = "proto3"; -package redis_request; +package command_request; enum SimpleRoutes { AllNodes=0; @@ -261,7 +261,7 @@ message Transaction { repeated Command commands = 1; } -message RedisRequest { +message CommandRequest { uint32 callback_idx = 1; oneof command { diff --git a/glide-core/src/request_type.rs b/glide-core/src/request_type.rs index 805db2dc91..bd25416138 100644 --- a/glide-core/src/request_type.rs +++ b/glide-core/src/request_type.rs @@ -4,7 +4,7 @@ use redis::{cmd, Cmd}; #[cfg(feature = "socket-layer")] -use crate::redis_request::RequestType as ProtobufRequestType; +use crate::command_request::RequestType as ProtobufRequestType; #[repr(C)] #[derive(Debug)] diff --git a/glide-core/src/rotating_buffer.rs b/glide-core/src/rotating_buffer.rs index cbd32313ed..b87f666605 100644 --- a/glide-core/src/rotating_buffer.rs +++ b/glide-core/src/rotating_buffer.rs @@ -65,8 +65,8 @@ impl RotatingBuffer { #[cfg(test)] mod tests { use super::*; - use crate::redis_request::{command, redis_request}; - use crate::redis_request::{Command, RedisRequest, RequestType}; + use crate::command_request::{command, command_request}; + use crate::command_request::{Command, CommandRequest, RequestType}; use bytes::BufMut; use rand::{distributions::Alphanumeric, Rng}; use rstest::rstest; @@ -83,8 +83,8 @@ mod tests { args: Vec, request_type: RequestType, args_pointer: bool, - ) -> RedisRequest { - let mut request = RedisRequest::new(); + ) -> CommandRequest { + let mut request = CommandRequest::new(); request.callback_idx = callback_index; let mut command = Command::new(); command.request_type = request_type.into(); @@ -97,7 +97,7 @@ mod tests { args_array.args.clone_from(&args); command.args = Some(command::Args::ArgsArray(args_array)); } - request.command = Some(redis_request::Command::SingleCommand(command)); + request.command = Some(command_request::Command::SingleCommand(command)); request } @@ -141,14 +141,14 @@ mod tests { } fn assert_request( - request: &RedisRequest, + request: &CommandRequest, expected_type: RequestType, expected_index: u32, expected_args: Vec, args_pointer: bool, ) { assert_eq!(request.callback_idx, expected_index); - let Some(redis_request::Command::SingleCommand(ref command)) = request.command else { + let Some(command_request::Command::SingleCommand(ref command)) = request.command else { panic!("expected single command"); }; assert_eq!(command.request_type, expected_type.into()); @@ -312,7 +312,7 @@ mod tests { let required_varint_length = u32::required_space(KEY_LENGTH as u32); assert!(required_varint_length > 1); // so we could split the write of the varint buffer.extend_from_slice(&request_bytes[..NUM_OF_LENGTH_BYTES]); - let requests = rotating_buffer.get_requests::().unwrap(); + let requests = rotating_buffer.get_requests::().unwrap(); assert_eq!(requests.len(), 0); let buffer = rotating_buffer.current_buffer(); buffer.extend_from_slice(&request_bytes[NUM_OF_LENGTH_BYTES..]); diff --git a/glide-core/src/socket_listener.rs b/glide-core/src/socket_listener.rs index a2a333f103..8c567104d1 100644 --- a/glide-core/src/socket_listener.rs +++ b/glide-core/src/socket_listener.rs @@ -3,11 +3,12 @@ */ use super::rotating_buffer::RotatingBuffer; use crate::client::Client; +use crate::command_request::{ + command, command_request, Command, CommandRequest, Routes, ScriptInvocation, SlotTypes, + Transaction, +}; use crate::connection_request::ConnectionRequest; use crate::errors::{error_message, error_type, RequestErrorType}; -use crate::redis_request::{ - command, redis_request, Command, RedisRequest, Routes, ScriptInvocation, SlotTypes, Transaction, -}; use crate::response; use crate::response::Response; use crate::retry_strategies::get_fixed_interval_backoff; @@ -353,7 +354,7 @@ fn get_route( route: Option>, cmd: Option<&Cmd>, ) -> ClientUsageResult> { - use crate::redis_request::routes::Value; + use crate::command_request::routes::Value; let Some(route) = route.and_then(|route| route.value) else { return Ok(None); }; @@ -369,17 +370,16 @@ fn get_route( ClienUsageError::Internal(format!("Received unexpected simple route type {id}")) })?; match simple_route { - crate::redis_request::SimpleRoutes::AllNodes => Ok(Some(RoutingInfo::MultiNode(( - MultipleNodeRoutingInfo::AllNodes, - get_response_policy(cmd), - )))), - crate::redis_request::SimpleRoutes::AllPrimaries => { + crate::command_request::SimpleRoutes::AllNodes => Ok(Some(RoutingInfo::MultiNode( + (MultipleNodeRoutingInfo::AllNodes, get_response_policy(cmd)), + ))), + crate::command_request::SimpleRoutes::AllPrimaries => { Ok(Some(RoutingInfo::MultiNode(( MultipleNodeRoutingInfo::AllMasters, get_response_policy(cmd), )))) } - crate::redis_request::SimpleRoutes::Random => { + crate::command_request::SimpleRoutes::Random => { Ok(Some(RoutingInfo::SingleNode(SingleNodeRoutingInfo::Random))) } } @@ -411,11 +411,11 @@ fn get_route( } } -fn handle_request(request: RedisRequest, client: Client, writer: Rc) { +fn handle_request(request: CommandRequest, client: Client, writer: Rc) { task::spawn_local(async move { let result = match request.command { Some(action) => match action { - redis_request::Command::SingleCommand(command) => { + command_request::Command::SingleCommand(command) => { match get_redis_command(&command) { Ok(cmd) => match get_route(request.route.0, Some(&cmd)) { Ok(routes) => send_command(cmd, client, routes).await, @@ -424,13 +424,13 @@ fn handle_request(request: RedisRequest, client: Client, writer: Rc) { Err(e) => Err(e), } } - redis_request::Command::Transaction(transaction) => { + command_request::Command::Transaction(transaction) => { match get_route(request.route.0, None) { Ok(routes) => send_transaction(transaction, client, routes).await, Err(e) => Err(e), } } - redis_request::Command::ScriptInvocation(script) => { + command_request::Command::ScriptInvocation(script) => { match get_route(request.route.0, None) { Ok(routes) => invoke_script(script, client, routes).await, Err(e) => Err(e), @@ -456,7 +456,7 @@ fn handle_request(request: RedisRequest, client: Client, writer: Rc) { } async fn handle_requests( - received_requests: Vec, + received_requests: Vec, client: &Client, writer: &Rc, ) { diff --git a/glide-core/tests/test_socket_listener.rs b/glide-core/tests/test_socket_listener.rs index bfa27ebc9c..cfea5413f8 100644 --- a/glide-core/tests/test_socket_listener.rs +++ b/glide-core/tests/test_socket_listener.rs @@ -22,13 +22,13 @@ mod socket_listener { use crate::utilities::mocks::{Mock, ServerMock}; use super::*; - use glide_core::redis_request::command::{Args, ArgsArray}; - use glide_core::redis_request::{Command, Transaction}; + use command_request::{CommandRequest, RequestType}; + use glide_core::command_request::command::{Args, ArgsArray}; + use glide_core::command_request::{Command, Transaction}; use glide_core::response::{response, ConstantResponse, Response}; use glide_core::scripts_container::add_script; use protobuf::{EnumOrUnknown, Message}; use redis::{Cmd, ConnectionAddr, FromRedisValue, Value}; - use redis_request::{RedisRequest, RequestType}; use rstest::rstest; use std::mem::size_of; use tokio::{net::UnixListener, runtime::Builder}; @@ -256,11 +256,11 @@ mod socket_listener { args: Vec, request_type: EnumOrUnknown, args_pointer: bool, - ) -> RedisRequest { - let mut request = RedisRequest::new(); + ) -> CommandRequest { + let mut request = CommandRequest::new(); request.callback_idx = callback_index; - request.command = Some(redis_request::redis_request::Command::SingleCommand( + request.command = Some(command_request::command_request::Command::SingleCommand( get_command(CommandComponents { args, request_type, @@ -270,7 +270,7 @@ mod socket_listener { request } - fn write_request(buffer: &mut Vec, socket: &mut UnixStream, request: RedisRequest) { + fn write_request(buffer: &mut Vec, socket: &mut UnixStream, request: CommandRequest) { write_message(buffer, request); socket.write_all(buffer).unwrap(); } @@ -294,7 +294,7 @@ mod socket_listener { callback_index: u32, commands_components: Vec, ) { - let mut request = RedisRequest::new(); + let mut request = CommandRequest::new(); request.callback_idx = callback_index; let mut transaction = Transaction::new(); transaction.commands.reserve(commands_components.len()); @@ -303,7 +303,7 @@ mod socket_listener { transaction.commands.push(get_command(components)); } - request.command = Some(redis_request::redis_request::Command::Transaction( + request.command = Some(command_request::command_request::Command::Transaction( transaction, )); @@ -685,8 +685,8 @@ mod socket_listener { RequestType::CustomCommand.into(), false, ); - let mut routes = redis_request::Routes::default(); - routes.set_simple_routes(redis_request::SimpleRoutes::AllPrimaries); + let mut routes = command_request::Routes::default(); + routes.set_simple_routes(command_request::SimpleRoutes::AllPrimaries); request.route = Some(routes).into(); write_request(&mut buffer, &mut test_basics.socket, request); @@ -733,8 +733,8 @@ mod socket_listener { RequestType::CustomCommand.into(), false, ); - let mut routes = redis_request::Routes::default(); - routes.set_simple_routes(redis_request::SimpleRoutes::Random); + let mut routes = command_request::Routes::default(); + routes.set_simple_routes(command_request::SimpleRoutes::Random); request.route = Some(routes).into(); write_request(&mut buffer, &mut test_basics.socket, request.clone()); @@ -755,8 +755,8 @@ mod socket_listener { .unwrap(); buffer.clear(); - let mut routes = redis_request::Routes::default(); - let by_address_route = glide_core::redis_request::ByAddressRoute { + let mut routes = command_request::Routes::default(); + let by_address_route = glide_core::command_request::ByAddressRoute { host: host.into(), port, ..Default::default() @@ -1216,10 +1216,10 @@ mod socket_listener { let approx_message_length = hash.len() + value.len() + key.len() + APPROX_RESP_HEADER_LEN; let mut buffer = Vec::with_capacity(approx_message_length); - let mut request = RedisRequest::new(); + let mut request = CommandRequest::new(); request.callback_idx = CALLBACK_INDEX; - request.command = Some(redis_request::redis_request::Command::ScriptInvocation( - redis_request::ScriptInvocation { + request.command = Some(command_request::command_request::Command::ScriptInvocation( + command_request::ScriptInvocation { hash: hash.into(), keys: vec![key.into()], args: vec![value.clone().into()], diff --git a/go/Makefile b/go/Makefile index 160eaa394b..0400e849f5 100644 --- a/go/Makefile +++ b/go/Makefile @@ -34,7 +34,7 @@ generate-protobuf: mkdir -p protobuf protoc --proto_path=../glide-core/src/protobuf \ --go_opt=Mconnection_request.proto=github.com/aws/glide-for-redis/go/protobuf \ - --go_opt=Mredis_request.proto=github.com/aws/glide-for-redis/go/protobuf \ + --go_opt=Mcommand_request.proto=github.com/aws/glide-for-redis/go/protobuf \ --go_opt=Mresponse.proto=github.com/aws/glide-for-redis/go/protobuf \ --go_out=./protobuf \ --go_opt=paths=source_relative \ diff --git a/java/client/build.gradle b/java/client/build.gradle index c35794d882..e7c1effd9d 100644 --- a/java/client/build.gradle +++ b/java/client/build.gradle @@ -69,7 +69,7 @@ tasks.register('protobuf', Exec) { '-Iprotobuf=glide-core/src/protobuf/', '--java_out=java/client/src/main/java/glide/models/protobuf', 'glide-core/src/protobuf/connection_request.proto', - 'glide-core/src/protobuf/redis_request.proto', + 'glide-core/src/protobuf/command_request.proto', 'glide-core/src/protobuf/response.proto' workingDir Paths.get(project.rootDir.path, '..').toFile() } diff --git a/java/client/src/main/java/glide/api/BaseClient.java b/java/client/src/main/java/glide/api/BaseClient.java index c777e40c30..4654e83f85 100644 --- a/java/client/src/main/java/glide/api/BaseClient.java +++ b/java/client/src/main/java/glide/api/BaseClient.java @@ -17,158 +17,158 @@ import static glide.utils.ArrayTransformUtils.convertMapToKeyValueStringArray; import static glide.utils.ArrayTransformUtils.convertMapToValueKeyStringArray; import static glide.utils.ArrayTransformUtils.mapGeoDataToArray; -import static redis_request.RedisRequestOuterClass.RequestType.Append; -import static redis_request.RedisRequestOuterClass.RequestType.BLMPop; -import static redis_request.RedisRequestOuterClass.RequestType.BLMove; -import static redis_request.RedisRequestOuterClass.RequestType.BLPop; -import static redis_request.RedisRequestOuterClass.RequestType.BRPop; -import static redis_request.RedisRequestOuterClass.RequestType.BZMPop; -import static redis_request.RedisRequestOuterClass.RequestType.BZPopMax; -import static redis_request.RedisRequestOuterClass.RequestType.BZPopMin; -import static redis_request.RedisRequestOuterClass.RequestType.BitCount; -import static redis_request.RedisRequestOuterClass.RequestType.BitField; -import static redis_request.RedisRequestOuterClass.RequestType.BitFieldReadOnly; -import static redis_request.RedisRequestOuterClass.RequestType.BitOp; -import static redis_request.RedisRequestOuterClass.RequestType.BitPos; -import static redis_request.RedisRequestOuterClass.RequestType.Copy; -import static redis_request.RedisRequestOuterClass.RequestType.Decr; -import static redis_request.RedisRequestOuterClass.RequestType.DecrBy; -import static redis_request.RedisRequestOuterClass.RequestType.Del; -import static redis_request.RedisRequestOuterClass.RequestType.Dump; -import static redis_request.RedisRequestOuterClass.RequestType.Exists; -import static redis_request.RedisRequestOuterClass.RequestType.Expire; -import static redis_request.RedisRequestOuterClass.RequestType.ExpireAt; -import static redis_request.RedisRequestOuterClass.RequestType.ExpireTime; -import static redis_request.RedisRequestOuterClass.RequestType.FCall; -import static redis_request.RedisRequestOuterClass.RequestType.FCallReadOnly; -import static redis_request.RedisRequestOuterClass.RequestType.GeoAdd; -import static redis_request.RedisRequestOuterClass.RequestType.GeoDist; -import static redis_request.RedisRequestOuterClass.RequestType.GeoHash; -import static redis_request.RedisRequestOuterClass.RequestType.GeoPos; -import static redis_request.RedisRequestOuterClass.RequestType.Get; -import static redis_request.RedisRequestOuterClass.RequestType.GetBit; -import static redis_request.RedisRequestOuterClass.RequestType.GetDel; -import static redis_request.RedisRequestOuterClass.RequestType.GetEx; -import static redis_request.RedisRequestOuterClass.RequestType.GetRange; -import static redis_request.RedisRequestOuterClass.RequestType.HDel; -import static redis_request.RedisRequestOuterClass.RequestType.HExists; -import static redis_request.RedisRequestOuterClass.RequestType.HGet; -import static redis_request.RedisRequestOuterClass.RequestType.HGetAll; -import static redis_request.RedisRequestOuterClass.RequestType.HIncrBy; -import static redis_request.RedisRequestOuterClass.RequestType.HIncrByFloat; -import static redis_request.RedisRequestOuterClass.RequestType.HKeys; -import static redis_request.RedisRequestOuterClass.RequestType.HLen; -import static redis_request.RedisRequestOuterClass.RequestType.HMGet; -import static redis_request.RedisRequestOuterClass.RequestType.HRandField; -import static redis_request.RedisRequestOuterClass.RequestType.HSet; -import static redis_request.RedisRequestOuterClass.RequestType.HSetNX; -import static redis_request.RedisRequestOuterClass.RequestType.HStrlen; -import static redis_request.RedisRequestOuterClass.RequestType.HVals; -import static redis_request.RedisRequestOuterClass.RequestType.Incr; -import static redis_request.RedisRequestOuterClass.RequestType.IncrBy; -import static redis_request.RedisRequestOuterClass.RequestType.IncrByFloat; -import static redis_request.RedisRequestOuterClass.RequestType.LCS; -import static redis_request.RedisRequestOuterClass.RequestType.LIndex; -import static redis_request.RedisRequestOuterClass.RequestType.LInsert; -import static redis_request.RedisRequestOuterClass.RequestType.LLen; -import static redis_request.RedisRequestOuterClass.RequestType.LMPop; -import static redis_request.RedisRequestOuterClass.RequestType.LMove; -import static redis_request.RedisRequestOuterClass.RequestType.LPop; -import static redis_request.RedisRequestOuterClass.RequestType.LPos; -import static redis_request.RedisRequestOuterClass.RequestType.LPush; -import static redis_request.RedisRequestOuterClass.RequestType.LPushX; -import static redis_request.RedisRequestOuterClass.RequestType.LRange; -import static redis_request.RedisRequestOuterClass.RequestType.LRem; -import static redis_request.RedisRequestOuterClass.RequestType.LSet; -import static redis_request.RedisRequestOuterClass.RequestType.LTrim; -import static redis_request.RedisRequestOuterClass.RequestType.MGet; -import static redis_request.RedisRequestOuterClass.RequestType.MSet; -import static redis_request.RedisRequestOuterClass.RequestType.MSetNX; -import static redis_request.RedisRequestOuterClass.RequestType.ObjectEncoding; -import static redis_request.RedisRequestOuterClass.RequestType.ObjectFreq; -import static redis_request.RedisRequestOuterClass.RequestType.ObjectIdleTime; -import static redis_request.RedisRequestOuterClass.RequestType.ObjectRefCount; -import static redis_request.RedisRequestOuterClass.RequestType.PExpire; -import static redis_request.RedisRequestOuterClass.RequestType.PExpireAt; -import static redis_request.RedisRequestOuterClass.RequestType.PExpireTime; -import static redis_request.RedisRequestOuterClass.RequestType.PTTL; -import static redis_request.RedisRequestOuterClass.RequestType.Persist; -import static redis_request.RedisRequestOuterClass.RequestType.PfAdd; -import static redis_request.RedisRequestOuterClass.RequestType.PfCount; -import static redis_request.RedisRequestOuterClass.RequestType.PfMerge; -import static redis_request.RedisRequestOuterClass.RequestType.RPop; -import static redis_request.RedisRequestOuterClass.RequestType.RPush; -import static redis_request.RedisRequestOuterClass.RequestType.RPushX; -import static redis_request.RedisRequestOuterClass.RequestType.Rename; -import static redis_request.RedisRequestOuterClass.RequestType.RenameNX; -import static redis_request.RedisRequestOuterClass.RequestType.Restore; -import static redis_request.RedisRequestOuterClass.RequestType.SAdd; -import static redis_request.RedisRequestOuterClass.RequestType.SCard; -import static redis_request.RedisRequestOuterClass.RequestType.SDiff; -import static redis_request.RedisRequestOuterClass.RequestType.SDiffStore; -import static redis_request.RedisRequestOuterClass.RequestType.SInter; -import static redis_request.RedisRequestOuterClass.RequestType.SInterCard; -import static redis_request.RedisRequestOuterClass.RequestType.SInterStore; -import static redis_request.RedisRequestOuterClass.RequestType.SIsMember; -import static redis_request.RedisRequestOuterClass.RequestType.SMIsMember; -import static redis_request.RedisRequestOuterClass.RequestType.SMembers; -import static redis_request.RedisRequestOuterClass.RequestType.SMove; -import static redis_request.RedisRequestOuterClass.RequestType.SPop; -import static redis_request.RedisRequestOuterClass.RequestType.SRandMember; -import static redis_request.RedisRequestOuterClass.RequestType.SRem; -import static redis_request.RedisRequestOuterClass.RequestType.SUnion; -import static redis_request.RedisRequestOuterClass.RequestType.SUnionStore; -import static redis_request.RedisRequestOuterClass.RequestType.Set; -import static redis_request.RedisRequestOuterClass.RequestType.SetBit; -import static redis_request.RedisRequestOuterClass.RequestType.SetRange; -import static redis_request.RedisRequestOuterClass.RequestType.Sort; -import static redis_request.RedisRequestOuterClass.RequestType.SortReadOnly; -import static redis_request.RedisRequestOuterClass.RequestType.Strlen; -import static redis_request.RedisRequestOuterClass.RequestType.TTL; -import static redis_request.RedisRequestOuterClass.RequestType.Touch; -import static redis_request.RedisRequestOuterClass.RequestType.Type; -import static redis_request.RedisRequestOuterClass.RequestType.Unlink; -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.XDel; -import static redis_request.RedisRequestOuterClass.RequestType.XGroupCreate; -import static redis_request.RedisRequestOuterClass.RequestType.XGroupCreateConsumer; -import static redis_request.RedisRequestOuterClass.RequestType.XGroupDelConsumer; -import static redis_request.RedisRequestOuterClass.RequestType.XGroupDestroy; -import static redis_request.RedisRequestOuterClass.RequestType.XLen; -import static redis_request.RedisRequestOuterClass.RequestType.XPending; -import static redis_request.RedisRequestOuterClass.RequestType.XRange; -import static redis_request.RedisRequestOuterClass.RequestType.XRead; -import static redis_request.RedisRequestOuterClass.RequestType.XReadGroup; -import static redis_request.RedisRequestOuterClass.RequestType.XRevRange; -import static redis_request.RedisRequestOuterClass.RequestType.XTrim; -import static redis_request.RedisRequestOuterClass.RequestType.ZAdd; -import static redis_request.RedisRequestOuterClass.RequestType.ZCard; -import static redis_request.RedisRequestOuterClass.RequestType.ZCount; -import static redis_request.RedisRequestOuterClass.RequestType.ZDiff; -import static redis_request.RedisRequestOuterClass.RequestType.ZDiffStore; -import static redis_request.RedisRequestOuterClass.RequestType.ZIncrBy; -import static redis_request.RedisRequestOuterClass.RequestType.ZInter; -import static redis_request.RedisRequestOuterClass.RequestType.ZInterCard; -import static redis_request.RedisRequestOuterClass.RequestType.ZInterStore; -import static redis_request.RedisRequestOuterClass.RequestType.ZLexCount; -import static redis_request.RedisRequestOuterClass.RequestType.ZMPop; -import static redis_request.RedisRequestOuterClass.RequestType.ZMScore; -import static redis_request.RedisRequestOuterClass.RequestType.ZPopMax; -import static redis_request.RedisRequestOuterClass.RequestType.ZPopMin; -import static redis_request.RedisRequestOuterClass.RequestType.ZRandMember; -import static redis_request.RedisRequestOuterClass.RequestType.ZRange; -import static redis_request.RedisRequestOuterClass.RequestType.ZRangeStore; -import static redis_request.RedisRequestOuterClass.RequestType.ZRank; -import static redis_request.RedisRequestOuterClass.RequestType.ZRem; -import static redis_request.RedisRequestOuterClass.RequestType.ZRemRangeByLex; -import static redis_request.RedisRequestOuterClass.RequestType.ZRemRangeByRank; -import static redis_request.RedisRequestOuterClass.RequestType.ZRemRangeByScore; -import static redis_request.RedisRequestOuterClass.RequestType.ZRevRank; -import static redis_request.RedisRequestOuterClass.RequestType.ZScore; -import static redis_request.RedisRequestOuterClass.RequestType.ZUnion; -import static redis_request.RedisRequestOuterClass.RequestType.ZUnionStore; +import static command_request.CommandRequestOuterClass.RequestType.Append; +import static command_request.CommandRequestOuterClass.RequestType.BLMPop; +import static command_request.CommandRequestOuterClass.RequestType.BLMove; +import static command_request.CommandRequestOuterClass.RequestType.BLPop; +import static command_request.CommandRequestOuterClass.RequestType.BRPop; +import static command_request.CommandRequestOuterClass.RequestType.BZMPop; +import static command_request.CommandRequestOuterClass.RequestType.BZPopMax; +import static command_request.CommandRequestOuterClass.RequestType.BZPopMin; +import static command_request.CommandRequestOuterClass.RequestType.BitCount; +import static command_request.CommandRequestOuterClass.RequestType.BitField; +import static command_request.CommandRequestOuterClass.RequestType.BitFieldReadOnly; +import static command_request.CommandRequestOuterClass.RequestType.BitOp; +import static command_request.CommandRequestOuterClass.RequestType.BitPos; +import static command_request.CommandRequestOuterClass.RequestType.Copy; +import static command_request.CommandRequestOuterClass.RequestType.Decr; +import static command_request.CommandRequestOuterClass.RequestType.DecrBy; +import static command_request.CommandRequestOuterClass.RequestType.Del; +import static command_request.CommandRequestOuterClass.RequestType.Dump; +import static command_request.CommandRequestOuterClass.RequestType.Exists; +import static command_request.CommandRequestOuterClass.RequestType.Expire; +import static command_request.CommandRequestOuterClass.RequestType.ExpireAt; +import static command_request.CommandRequestOuterClass.RequestType.ExpireTime; +import static command_request.CommandRequestOuterClass.RequestType.FCall; +import static command_request.CommandRequestOuterClass.RequestType.FCallReadOnly; +import static command_request.CommandRequestOuterClass.RequestType.GeoAdd; +import static command_request.CommandRequestOuterClass.RequestType.GeoDist; +import static command_request.CommandRequestOuterClass.RequestType.GeoHash; +import static command_request.CommandRequestOuterClass.RequestType.GeoPos; +import static command_request.CommandRequestOuterClass.RequestType.Get; +import static command_request.CommandRequestOuterClass.RequestType.GetBit; +import static command_request.CommandRequestOuterClass.RequestType.GetDel; +import static command_request.CommandRequestOuterClass.RequestType.GetEx; +import static command_request.CommandRequestOuterClass.RequestType.GetRange; +import static command_request.CommandRequestOuterClass.RequestType.HDel; +import static command_request.CommandRequestOuterClass.RequestType.HExists; +import static command_request.CommandRequestOuterClass.RequestType.HGet; +import static command_request.CommandRequestOuterClass.RequestType.HGetAll; +import static command_request.CommandRequestOuterClass.RequestType.HIncrBy; +import static command_request.CommandRequestOuterClass.RequestType.HIncrByFloat; +import static command_request.CommandRequestOuterClass.RequestType.HKeys; +import static command_request.CommandRequestOuterClass.RequestType.HLen; +import static command_request.CommandRequestOuterClass.RequestType.HMGet; +import static command_request.CommandRequestOuterClass.RequestType.HRandField; +import static command_request.CommandRequestOuterClass.RequestType.HSet; +import static command_request.CommandRequestOuterClass.RequestType.HSetNX; +import static command_request.CommandRequestOuterClass.RequestType.HStrlen; +import static command_request.CommandRequestOuterClass.RequestType.HVals; +import static command_request.CommandRequestOuterClass.RequestType.Incr; +import static command_request.CommandRequestOuterClass.RequestType.IncrBy; +import static command_request.CommandRequestOuterClass.RequestType.IncrByFloat; +import static command_request.CommandRequestOuterClass.RequestType.LCS; +import static command_request.CommandRequestOuterClass.RequestType.LIndex; +import static command_request.CommandRequestOuterClass.RequestType.LInsert; +import static command_request.CommandRequestOuterClass.RequestType.LLen; +import static command_request.CommandRequestOuterClass.RequestType.LMPop; +import static command_request.CommandRequestOuterClass.RequestType.LMove; +import static command_request.CommandRequestOuterClass.RequestType.LPop; +import static command_request.CommandRequestOuterClass.RequestType.LPos; +import static command_request.CommandRequestOuterClass.RequestType.LPush; +import static command_request.CommandRequestOuterClass.RequestType.LPushX; +import static command_request.CommandRequestOuterClass.RequestType.LRange; +import static command_request.CommandRequestOuterClass.RequestType.LRem; +import static command_request.CommandRequestOuterClass.RequestType.LSet; +import static command_request.CommandRequestOuterClass.RequestType.LTrim; +import static command_request.CommandRequestOuterClass.RequestType.MGet; +import static command_request.CommandRequestOuterClass.RequestType.MSet; +import static command_request.CommandRequestOuterClass.RequestType.MSetNX; +import static command_request.CommandRequestOuterClass.RequestType.ObjectEncoding; +import static command_request.CommandRequestOuterClass.RequestType.ObjectFreq; +import static command_request.CommandRequestOuterClass.RequestType.ObjectIdleTime; +import static command_request.CommandRequestOuterClass.RequestType.ObjectRefCount; +import static command_request.CommandRequestOuterClass.RequestType.PExpire; +import static command_request.CommandRequestOuterClass.RequestType.PExpireAt; +import static command_request.CommandRequestOuterClass.RequestType.PExpireTime; +import static command_request.CommandRequestOuterClass.RequestType.PTTL; +import static command_request.CommandRequestOuterClass.RequestType.Persist; +import static command_request.CommandRequestOuterClass.RequestType.PfAdd; +import static command_request.CommandRequestOuterClass.RequestType.PfCount; +import static command_request.CommandRequestOuterClass.RequestType.PfMerge; +import static command_request.CommandRequestOuterClass.RequestType.RPop; +import static command_request.CommandRequestOuterClass.RequestType.RPush; +import static command_request.CommandRequestOuterClass.RequestType.RPushX; +import static command_request.CommandRequestOuterClass.RequestType.Rename; +import static command_request.CommandRequestOuterClass.RequestType.RenameNX; +import static command_request.CommandRequestOuterClass.RequestType.Restore; +import static command_request.CommandRequestOuterClass.RequestType.SAdd; +import static command_request.CommandRequestOuterClass.RequestType.SCard; +import static command_request.CommandRequestOuterClass.RequestType.SDiff; +import static command_request.CommandRequestOuterClass.RequestType.SDiffStore; +import static command_request.CommandRequestOuterClass.RequestType.SInter; +import static command_request.CommandRequestOuterClass.RequestType.SInterCard; +import static command_request.CommandRequestOuterClass.RequestType.SInterStore; +import static command_request.CommandRequestOuterClass.RequestType.SIsMember; +import static command_request.CommandRequestOuterClass.RequestType.SMIsMember; +import static command_request.CommandRequestOuterClass.RequestType.SMembers; +import static command_request.CommandRequestOuterClass.RequestType.SMove; +import static command_request.CommandRequestOuterClass.RequestType.SPop; +import static command_request.CommandRequestOuterClass.RequestType.SRandMember; +import static command_request.CommandRequestOuterClass.RequestType.SRem; +import static command_request.CommandRequestOuterClass.RequestType.SUnion; +import static command_request.CommandRequestOuterClass.RequestType.SUnionStore; +import static command_request.CommandRequestOuterClass.RequestType.Set; +import static command_request.CommandRequestOuterClass.RequestType.SetBit; +import static command_request.CommandRequestOuterClass.RequestType.SetRange; +import static command_request.CommandRequestOuterClass.RequestType.Sort; +import static command_request.CommandRequestOuterClass.RequestType.SortReadOnly; +import static command_request.CommandRequestOuterClass.RequestType.Strlen; +import static command_request.CommandRequestOuterClass.RequestType.TTL; +import static command_request.CommandRequestOuterClass.RequestType.Touch; +import static command_request.CommandRequestOuterClass.RequestType.Type; +import static command_request.CommandRequestOuterClass.RequestType.Unlink; +import static command_request.CommandRequestOuterClass.RequestType.Watch; +import static command_request.CommandRequestOuterClass.RequestType.XAck; +import static command_request.CommandRequestOuterClass.RequestType.XAdd; +import static command_request.CommandRequestOuterClass.RequestType.XDel; +import static command_request.CommandRequestOuterClass.RequestType.XGroupCreate; +import static command_request.CommandRequestOuterClass.RequestType.XGroupCreateConsumer; +import static command_request.CommandRequestOuterClass.RequestType.XGroupDelConsumer; +import static command_request.CommandRequestOuterClass.RequestType.XGroupDestroy; +import static command_request.CommandRequestOuterClass.RequestType.XLen; +import static command_request.CommandRequestOuterClass.RequestType.XPending; +import static command_request.CommandRequestOuterClass.RequestType.XRange; +import static command_request.CommandRequestOuterClass.RequestType.XRead; +import static command_request.CommandRequestOuterClass.RequestType.XReadGroup; +import static command_request.CommandRequestOuterClass.RequestType.XRevRange; +import static command_request.CommandRequestOuterClass.RequestType.XTrim; +import static command_request.CommandRequestOuterClass.RequestType.ZAdd; +import static command_request.CommandRequestOuterClass.RequestType.ZCard; +import static command_request.CommandRequestOuterClass.RequestType.ZCount; +import static command_request.CommandRequestOuterClass.RequestType.ZDiff; +import static command_request.CommandRequestOuterClass.RequestType.ZDiffStore; +import static command_request.CommandRequestOuterClass.RequestType.ZIncrBy; +import static command_request.CommandRequestOuterClass.RequestType.ZInter; +import static command_request.CommandRequestOuterClass.RequestType.ZInterCard; +import static command_request.CommandRequestOuterClass.RequestType.ZInterStore; +import static command_request.CommandRequestOuterClass.RequestType.ZLexCount; +import static command_request.CommandRequestOuterClass.RequestType.ZMPop; +import static command_request.CommandRequestOuterClass.RequestType.ZMScore; +import static command_request.CommandRequestOuterClass.RequestType.ZPopMax; +import static command_request.CommandRequestOuterClass.RequestType.ZPopMin; +import static command_request.CommandRequestOuterClass.RequestType.ZRandMember; +import static command_request.CommandRequestOuterClass.RequestType.ZRange; +import static command_request.CommandRequestOuterClass.RequestType.ZRangeStore; +import static command_request.CommandRequestOuterClass.RequestType.ZRank; +import static command_request.CommandRequestOuterClass.RequestType.ZRem; +import static command_request.CommandRequestOuterClass.RequestType.ZRemRangeByLex; +import static command_request.CommandRequestOuterClass.RequestType.ZRemRangeByRank; +import static command_request.CommandRequestOuterClass.RequestType.ZRemRangeByScore; +import static command_request.CommandRequestOuterClass.RequestType.ZRevRank; +import static command_request.CommandRequestOuterClass.RequestType.ZScore; +import static command_request.CommandRequestOuterClass.RequestType.ZUnion; +import static command_request.CommandRequestOuterClass.RequestType.ZUnionStore; import glide.api.commands.BitmapBaseCommands; import glide.api.commands.GenericBaseCommands; diff --git a/java/client/src/main/java/glide/api/GlideClient.java b/java/client/src/main/java/glide/api/GlideClient.java new file mode 100644 index 0000000000..30b6fb8da0 --- /dev/null +++ b/java/client/src/main/java/glide/api/GlideClient.java @@ -0,0 +1,418 @@ +/** Copyright Valkey GLIDE Project Contributors - SPDX Identifier: Apache-2.0 */ +package glide.api; + +import static glide.api.models.GlideString.gs; +import static glide.api.models.commands.SortBaseOptions.STORE_COMMAND_STRING; +import static glide.api.models.commands.SortOptions.STORE_COMMAND_STRING; +import static glide.api.models.commands.function.FunctionListOptions.LIBRARY_NAME_REDIS_API; +import static glide.api.models.commands.function.FunctionListOptions.WITH_CODE_REDIS_API; +import static glide.api.models.commands.function.FunctionLoadOptions.REPLACE; +import static glide.utils.ArrayTransformUtils.castArray; +import static glide.utils.ArrayTransformUtils.concatenateArrays; +import static glide.utils.ArrayTransformUtils.convertMapToKeyValueStringArray; +import static command_request.CommandRequestOuterClass.RequestType.ClientGetName; +import static command_request.CommandRequestOuterClass.RequestType.ClientId; +import static command_request.CommandRequestOuterClass.RequestType.ConfigGet; +import static command_request.CommandRequestOuterClass.RequestType.ConfigResetStat; +import static command_request.CommandRequestOuterClass.RequestType.ConfigRewrite; +import static command_request.CommandRequestOuterClass.RequestType.ConfigSet; +import static command_request.CommandRequestOuterClass.RequestType.Copy; +import static command_request.CommandRequestOuterClass.RequestType.CustomCommand; +import static command_request.CommandRequestOuterClass.RequestType.DBSize; +import static command_request.CommandRequestOuterClass.RequestType.Echo; +import static command_request.CommandRequestOuterClass.RequestType.FlushAll; +import static command_request.CommandRequestOuterClass.RequestType.FlushDB; +import static command_request.CommandRequestOuterClass.RequestType.FunctionDelete; +import static command_request.CommandRequestOuterClass.RequestType.FunctionDump; +import static command_request.CommandRequestOuterClass.RequestType.FunctionFlush; +import static command_request.CommandRequestOuterClass.RequestType.FunctionKill; +import static command_request.CommandRequestOuterClass.RequestType.FunctionList; +import static command_request.CommandRequestOuterClass.RequestType.FunctionLoad; +import static command_request.CommandRequestOuterClass.RequestType.FunctionRestore; +import static command_request.CommandRequestOuterClass.RequestType.FunctionStats; +import static command_request.CommandRequestOuterClass.RequestType.Info; +import static command_request.CommandRequestOuterClass.RequestType.LastSave; +import static command_request.CommandRequestOuterClass.RequestType.Lolwut; +import static command_request.CommandRequestOuterClass.RequestType.Move; +import static command_request.CommandRequestOuterClass.RequestType.Ping; +import static command_request.CommandRequestOuterClass.RequestType.RandomKey; +import static command_request.CommandRequestOuterClass.RequestType.Select; +import static command_request.CommandRequestOuterClass.RequestType.Sort; +import static command_request.CommandRequestOuterClass.RequestType.SortReadOnly; +import static command_request.CommandRequestOuterClass.RequestType.Time; +import static command_request.CommandRequestOuterClass.RequestType.UnWatch; + +import glide.api.commands.ConnectionManagementCommands; +import glide.api.commands.GenericCommands; +import glide.api.commands.ScriptingAndFunctionsCommands; +import glide.api.commands.ServerManagementCommands; +import glide.api.commands.TransactionsCommands; +import glide.api.models.GlideString; +import glide.api.models.Transaction; +import glide.api.models.commands.FlushMode; +import glide.api.models.commands.InfoOptions; +import glide.api.models.commands.SortOptions; +import glide.api.models.commands.function.FunctionRestorePolicy; +import glide.api.models.configuration.GlideClientConfiguration; +import glide.managers.CommandManager; +import glide.managers.ConnectionManager; +import java.util.Arrays; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import lombok.NonNull; +import org.apache.commons.lang3.ArrayUtils; + +/** + * Async (non-blocking) client for Redis in Standalone mode. Use {@link #CreateClient} to request a + * client to Redis. + */ +public class GlideClient extends BaseClient + implements GenericCommands, + ServerManagementCommands, + ConnectionManagementCommands, + ScriptingAndFunctionsCommands, + TransactionsCommands { + + protected GlideClient(ConnectionManager connectionManager, CommandManager commandManager) { + super(connectionManager, commandManager); + } + + /** + * Async request for an async (non-blocking) Redis client in Standalone mode. + * + * @param config Redis client Configuration + * @return A Future to connect and return a GlideClient + */ + public static CompletableFuture CreateClient( + @NonNull GlideClientConfiguration config) { + return CreateClient(config, GlideClient::new); + } + + @Override + public CompletableFuture customCommand(@NonNull String[] args) { + return commandManager.submitNewCommand(CustomCommand, args, this::handleObjectOrNullResponse); + } + + @Override + public CompletableFuture exec(@NonNull Transaction transaction) { + return commandManager.submitNewTransaction(transaction, this::handleArrayOrNullResponse); + } + + @Override + public CompletableFuture ping() { + return commandManager.submitNewCommand(Ping, new String[0], this::handleStringResponse); + } + + @Override + public CompletableFuture ping(@NonNull String message) { + return commandManager.submitNewCommand( + Ping, new String[] {message}, this::handleStringResponse); + } + + @Override + public CompletableFuture info() { + return commandManager.submitNewCommand(Info, new String[0], this::handleStringResponse); + } + + @Override + public CompletableFuture info(@NonNull InfoOptions options) { + return commandManager.submitNewCommand(Info, options.toArgs(), this::handleStringResponse); + } + + @Override + public CompletableFuture select(long index) { + return commandManager.submitNewCommand( + Select, new String[] {Long.toString(index)}, this::handleStringResponse); + } + + @Override + public CompletableFuture clientId() { + return commandManager.submitNewCommand(ClientId, new String[0], this::handleLongResponse); + } + + @Override + public CompletableFuture clientGetName() { + return commandManager.submitNewCommand( + ClientGetName, new String[0], this::handleStringOrNullResponse); + } + + @Override + public CompletableFuture configRewrite() { + return commandManager.submitNewCommand( + ConfigRewrite, new String[0], this::handleStringResponse); + } + + @Override + public CompletableFuture configResetStat() { + return commandManager.submitNewCommand( + ConfigResetStat, new String[0], this::handleStringResponse); + } + + @Override + public CompletableFuture> configGet(@NonNull String[] parameters) { + return commandManager.submitNewCommand(ConfigGet, parameters, this::handleMapResponse); + } + + @Override + public CompletableFuture configSet(@NonNull Map parameters) { + return commandManager.submitNewCommand( + ConfigSet, convertMapToKeyValueStringArray(parameters), this::handleStringResponse); + } + + @Override + public CompletableFuture echo(@NonNull String message) { + return commandManager.submitNewCommand( + Echo, new String[] {message}, this::handleStringResponse); + } + + @Override + public CompletableFuture echo(@NonNull GlideString message) { + return commandManager.submitNewCommand( + Echo, new GlideString[] {message}, this::handleGlideStringResponse); + } + + @Override + public CompletableFuture time() { + return commandManager.submitNewCommand( + Time, new String[0], response -> castArray(handleArrayResponse(response), String.class)); + } + + @Override + public CompletableFuture lastsave() { + return commandManager.submitNewCommand(LastSave, new String[0], this::handleLongResponse); + } + + @Override + public CompletableFuture flushall() { + return commandManager.submitNewCommand(FlushAll, new String[0], this::handleStringResponse); + } + + @Override + public CompletableFuture flushall(@NonNull FlushMode mode) { + return commandManager.submitNewCommand( + FlushAll, new String[] {mode.toString()}, this::handleStringResponse); + } + + @Override + public CompletableFuture flushdb() { + return commandManager.submitNewCommand(FlushDB, new String[0], this::handleStringResponse); + } + + @Override + public CompletableFuture flushdb(@NonNull FlushMode mode) { + return commandManager.submitNewCommand( + FlushDB, new String[] {mode.toString()}, this::handleStringResponse); + } + + @Override + public CompletableFuture lolwut() { + return commandManager.submitNewCommand(Lolwut, new String[0], this::handleStringResponse); + } + + @Override + public CompletableFuture lolwut(int @NonNull [] parameters) { + String[] arguments = + Arrays.stream(parameters).mapToObj(Integer::toString).toArray(String[]::new); + return commandManager.submitNewCommand(Lolwut, arguments, this::handleStringResponse); + } + + @Override + public CompletableFuture lolwut(int version) { + return commandManager.submitNewCommand( + Lolwut, + new String[] {VERSION_REDIS_API, Integer.toString(version)}, + this::handleStringResponse); + } + + @Override + public CompletableFuture lolwut(int version, int @NonNull [] parameters) { + String[] arguments = + concatenateArrays( + new String[] {VERSION_REDIS_API, Integer.toString(version)}, + Arrays.stream(parameters).mapToObj(Integer::toString).toArray(String[]::new)); + return commandManager.submitNewCommand(Lolwut, arguments, this::handleStringResponse); + } + + @Override + public CompletableFuture dbsize() { + return commandManager.submitNewCommand(DBSize, new String[0], this::handleLongResponse); + } + + @Override + public CompletableFuture functionLoad(@NonNull String libraryCode, boolean replace) { + String[] arguments = + replace ? new String[] {REPLACE.toString(), libraryCode} : new String[] {libraryCode}; + return commandManager.submitNewCommand(FunctionLoad, arguments, this::handleStringResponse); + } + + @Override + public CompletableFuture move(@NonNull String key, long dbIndex) { + return commandManager.submitNewCommand( + Move, new String[] {key, Long.toString(dbIndex)}, this::handleBooleanResponse); + } + + @Override + public CompletableFuture move(@NonNull GlideString key, long dbIndex) { + return commandManager.submitNewCommand( + Move, new GlideString[] {key, gs(Long.toString(dbIndex))}, this::handleBooleanResponse); + } + + @Override + public CompletableFuture[]> functionList(boolean withCode) { + return commandManager.submitNewCommand( + FunctionList, + withCode ? new String[] {WITH_CODE_REDIS_API} : new String[0], + response -> handleFunctionListResponse(handleArrayResponse(response))); + } + + @Override + public CompletableFuture[]> functionList( + @NonNull String libNamePattern, boolean withCode) { + return commandManager.submitNewCommand( + FunctionList, + withCode + ? new String[] {LIBRARY_NAME_REDIS_API, libNamePattern, WITH_CODE_REDIS_API} + : new String[] {LIBRARY_NAME_REDIS_API, libNamePattern}, + response -> handleFunctionListResponse(handleArrayResponse(response))); + } + + @Override + public CompletableFuture functionFlush() { + return commandManager.submitNewCommand( + FunctionFlush, new String[0], this::handleStringResponse); + } + + @Override + public CompletableFuture functionFlush(@NonNull FlushMode mode) { + return commandManager.submitNewCommand( + FunctionFlush, new String[] {mode.toString()}, this::handleStringResponse); + } + + @Override + public CompletableFuture functionDelete(@NonNull String libName) { + return commandManager.submitNewCommand( + FunctionDelete, new String[] {libName}, this::handleStringResponse); + } + + @Override + public CompletableFuture functionDump() { + return commandManager.submitNewCommand( + FunctionDump, new GlideString[0], this::handleBytesOrNullResponse); + } + + @Override + public CompletableFuture functionRestore(byte @NonNull [] payload) { + return commandManager.submitNewCommand( + FunctionRestore, new GlideString[] {gs(payload)}, this::handleStringResponse); + } + + @Override + public CompletableFuture functionRestore( + byte @NonNull [] payload, @NonNull FunctionRestorePolicy policy) { + return commandManager.submitNewCommand( + FunctionRestore, + new GlideString[] {gs(payload), gs(policy.toString())}, + this::handleStringResponse); + } + + @Override + public CompletableFuture fcall(@NonNull String function) { + return fcall(function, new String[0], new String[0]); + } + + @Override + public CompletableFuture fcallReadOnly(@NonNull String function) { + return fcallReadOnly(function, new String[0], new String[0]); + } + + @Override + public CompletableFuture copy( + @NonNull String source, @NonNull String destination, long destinationDB) { + String[] arguments = + new String[] {source, destination, DB_REDIS_API, Long.toString(destinationDB)}; + return commandManager.submitNewCommand(Copy, arguments, this::handleBooleanResponse); + } + + @Override + public CompletableFuture copy( + @NonNull GlideString source, @NonNull GlideString destination, long destinationDB) { + GlideString[] arguments = + new GlideString[] {source, destination, gs(DB_REDIS_API), gs(Long.toString(destinationDB))}; + return commandManager.submitNewCommand(Copy, arguments, this::handleBooleanResponse); + } + + @Override + public CompletableFuture copy( + @NonNull String source, @NonNull String destination, long destinationDB, boolean replace) { + String[] arguments = + new String[] {source, destination, DB_REDIS_API, Long.toString(destinationDB)}; + if (replace) { + arguments = ArrayUtils.add(arguments, REPLACE_REDIS_API); + } + return commandManager.submitNewCommand(Copy, arguments, this::handleBooleanResponse); + } + + @Override + public CompletableFuture copy( + @NonNull GlideString source, + @NonNull GlideString destination, + long destinationDB, + boolean replace) { + GlideString[] arguments = + new GlideString[] {source, destination, gs(DB_REDIS_API), gs(Long.toString(destinationDB))}; + if (replace) { + arguments = ArrayUtils.add(arguments, gs(REPLACE_REDIS_API)); + } + return commandManager.submitNewCommand(Copy, arguments, this::handleBooleanResponse); + } + + @Override + public CompletableFuture functionKill() { + return commandManager.submitNewCommand(FunctionKill, new String[0], this::handleStringResponse); + } + + @Override + public CompletableFuture>> functionStats() { + return commandManager.submitNewCommand( + FunctionStats, + new String[0], + response -> handleFunctionStatsResponse(handleMapResponse(response))); + } + + @Override + public CompletableFuture unwatch() { + return commandManager.submitNewCommand(UnWatch, new String[0], this::handleStringResponse); + } + + @Override + public CompletableFuture randomKey() { + return commandManager.submitNewCommand( + RandomKey, new String[0], this::handleStringOrNullResponse); + } + + @Override + public CompletableFuture sort(@NonNull String key, @NonNull SortOptions sortOptions) { + String[] arguments = ArrayUtils.addFirst(sortOptions.toArgs(), key); + return commandManager.submitNewCommand( + Sort, arguments, response -> castArray(handleArrayResponse(response), String.class)); + } + + @Override + public CompletableFuture sortReadOnly( + @NonNull String key, @NonNull SortOptions sortOptions) { + String[] arguments = ArrayUtils.addFirst(sortOptions.toArgs(), key); + return commandManager.submitNewCommand( + SortReadOnly, + arguments, + response -> castArray(handleArrayResponse(response), String.class)); + } + + @Override + public CompletableFuture sortStore( + @NonNull String key, @NonNull String destination, @NonNull SortOptions sortOptions) { + String[] storeArguments = new String[] {STORE_COMMAND_STRING, destination}; + String[] arguments = + concatenateArrays(new String[] {key}, sortOptions.toArgs(), storeArguments); + return commandManager.submitNewCommand(Sort, arguments, this::handleLongResponse); + } +} diff --git a/java/client/src/main/java/glide/api/RedisClient.java b/java/client/src/main/java/glide/api/RedisClient.java index 0f8607afb7..dc9f44f490 100644 --- a/java/client/src/main/java/glide/api/RedisClient.java +++ b/java/client/src/main/java/glide/api/RedisClient.java @@ -10,37 +10,37 @@ import static glide.utils.ArrayTransformUtils.castArray; import static glide.utils.ArrayTransformUtils.concatenateArrays; import static glide.utils.ArrayTransformUtils.convertMapToKeyValueStringArray; -import static redis_request.RedisRequestOuterClass.RequestType.ClientGetName; -import static redis_request.RedisRequestOuterClass.RequestType.ClientId; -import static redis_request.RedisRequestOuterClass.RequestType.ConfigGet; -import static redis_request.RedisRequestOuterClass.RequestType.ConfigResetStat; -import static redis_request.RedisRequestOuterClass.RequestType.ConfigRewrite; -import static redis_request.RedisRequestOuterClass.RequestType.ConfigSet; -import static redis_request.RedisRequestOuterClass.RequestType.Copy; -import static redis_request.RedisRequestOuterClass.RequestType.CustomCommand; -import static redis_request.RedisRequestOuterClass.RequestType.DBSize; -import static redis_request.RedisRequestOuterClass.RequestType.Echo; -import static redis_request.RedisRequestOuterClass.RequestType.FlushAll; -import static redis_request.RedisRequestOuterClass.RequestType.FlushDB; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionDelete; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionDump; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionFlush; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionKill; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionList; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionLoad; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionRestore; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionStats; -import static redis_request.RedisRequestOuterClass.RequestType.Info; -import static redis_request.RedisRequestOuterClass.RequestType.LastSave; -import static redis_request.RedisRequestOuterClass.RequestType.Lolwut; -import static redis_request.RedisRequestOuterClass.RequestType.Move; -import static redis_request.RedisRequestOuterClass.RequestType.Ping; -import static redis_request.RedisRequestOuterClass.RequestType.RandomKey; -import static redis_request.RedisRequestOuterClass.RequestType.Select; -import static redis_request.RedisRequestOuterClass.RequestType.Sort; -import static redis_request.RedisRequestOuterClass.RequestType.SortReadOnly; -import static redis_request.RedisRequestOuterClass.RequestType.Time; -import static redis_request.RedisRequestOuterClass.RequestType.UnWatch; +import static command_request.CommandRequestOuterClass.RequestType.ClientGetName; +import static command_request.CommandRequestOuterClass.RequestType.ClientId; +import static command_request.CommandRequestOuterClass.RequestType.ConfigGet; +import static command_request.CommandRequestOuterClass.RequestType.ConfigResetStat; +import static command_request.CommandRequestOuterClass.RequestType.ConfigRewrite; +import static command_request.CommandRequestOuterClass.RequestType.ConfigSet; +import static command_request.CommandRequestOuterClass.RequestType.Copy; +import static command_request.CommandRequestOuterClass.RequestType.CustomCommand; +import static command_request.CommandRequestOuterClass.RequestType.DBSize; +import static command_request.CommandRequestOuterClass.RequestType.Echo; +import static command_request.CommandRequestOuterClass.RequestType.FlushAll; +import static command_request.CommandRequestOuterClass.RequestType.FlushDB; +import static command_request.CommandRequestOuterClass.RequestType.FunctionDelete; +import static command_request.CommandRequestOuterClass.RequestType.FunctionDump; +import static command_request.CommandRequestOuterClass.RequestType.FunctionFlush; +import static command_request.CommandRequestOuterClass.RequestType.FunctionKill; +import static command_request.CommandRequestOuterClass.RequestType.FunctionList; +import static command_request.CommandRequestOuterClass.RequestType.FunctionLoad; +import static command_request.CommandRequestOuterClass.RequestType.FunctionRestore; +import static command_request.CommandRequestOuterClass.RequestType.FunctionStats; +import static command_request.CommandRequestOuterClass.RequestType.Info; +import static command_request.CommandRequestOuterClass.RequestType.LastSave; +import static command_request.CommandRequestOuterClass.RequestType.Lolwut; +import static command_request.CommandRequestOuterClass.RequestType.Move; +import static command_request.CommandRequestOuterClass.RequestType.Ping; +import static command_request.CommandRequestOuterClass.RequestType.RandomKey; +import static command_request.CommandRequestOuterClass.RequestType.Select; +import static command_request.CommandRequestOuterClass.RequestType.Sort; +import static command_request.CommandRequestOuterClass.RequestType.SortReadOnly; +import static command_request.CommandRequestOuterClass.RequestType.Time; +import static command_request.CommandRequestOuterClass.RequestType.UnWatch; import glide.api.commands.ConnectionManagementCommands; import glide.api.commands.GenericCommands; diff --git a/java/client/src/main/java/glide/api/RedisClusterClient.java b/java/client/src/main/java/glide/api/RedisClusterClient.java index 26fc3e86e7..179474a612 100644 --- a/java/client/src/main/java/glide/api/RedisClusterClient.java +++ b/java/client/src/main/java/glide/api/RedisClusterClient.java @@ -11,36 +11,36 @@ import static glide.utils.ArrayTransformUtils.castMapOfArrays; import static glide.utils.ArrayTransformUtils.concatenateArrays; import static glide.utils.ArrayTransformUtils.convertMapToKeyValueStringArray; -import static redis_request.RedisRequestOuterClass.RequestType.ClientGetName; -import static redis_request.RedisRequestOuterClass.RequestType.ClientId; -import static redis_request.RedisRequestOuterClass.RequestType.ConfigGet; -import static redis_request.RedisRequestOuterClass.RequestType.ConfigResetStat; -import static redis_request.RedisRequestOuterClass.RequestType.ConfigRewrite; -import static redis_request.RedisRequestOuterClass.RequestType.ConfigSet; -import static redis_request.RedisRequestOuterClass.RequestType.CustomCommand; -import static redis_request.RedisRequestOuterClass.RequestType.DBSize; -import static redis_request.RedisRequestOuterClass.RequestType.Echo; -import static redis_request.RedisRequestOuterClass.RequestType.FCall; -import static redis_request.RedisRequestOuterClass.RequestType.FCallReadOnly; -import static redis_request.RedisRequestOuterClass.RequestType.FlushAll; -import static redis_request.RedisRequestOuterClass.RequestType.FlushDB; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionDelete; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionDump; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionFlush; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionKill; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionList; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionLoad; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionRestore; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionStats; -import static redis_request.RedisRequestOuterClass.RequestType.Info; -import static redis_request.RedisRequestOuterClass.RequestType.LastSave; -import static redis_request.RedisRequestOuterClass.RequestType.Lolwut; -import static redis_request.RedisRequestOuterClass.RequestType.Ping; -import static redis_request.RedisRequestOuterClass.RequestType.RandomKey; -import static redis_request.RedisRequestOuterClass.RequestType.Sort; -import static redis_request.RedisRequestOuterClass.RequestType.SortReadOnly; -import static redis_request.RedisRequestOuterClass.RequestType.Time; -import static redis_request.RedisRequestOuterClass.RequestType.UnWatch; +import static command_request.CommandRequestOuterClass.RequestType.ClientGetName; +import static command_request.CommandRequestOuterClass.RequestType.ClientId; +import static command_request.CommandRequestOuterClass.RequestType.ConfigGet; +import static command_request.CommandRequestOuterClass.RequestType.ConfigResetStat; +import static command_request.CommandRequestOuterClass.RequestType.ConfigRewrite; +import static command_request.CommandRequestOuterClass.RequestType.ConfigSet; +import static command_request.CommandRequestOuterClass.RequestType.CustomCommand; +import static command_request.CommandRequestOuterClass.RequestType.DBSize; +import static command_request.CommandRequestOuterClass.RequestType.Echo; +import static command_request.CommandRequestOuterClass.RequestType.FCall; +import static command_request.CommandRequestOuterClass.RequestType.FCallReadOnly; +import static command_request.CommandRequestOuterClass.RequestType.FlushAll; +import static command_request.CommandRequestOuterClass.RequestType.FlushDB; +import static command_request.CommandRequestOuterClass.RequestType.FunctionDelete; +import static command_request.CommandRequestOuterClass.RequestType.FunctionDump; +import static command_request.CommandRequestOuterClass.RequestType.FunctionFlush; +import static command_request.CommandRequestOuterClass.RequestType.FunctionKill; +import static command_request.CommandRequestOuterClass.RequestType.FunctionList; +import static command_request.CommandRequestOuterClass.RequestType.FunctionLoad; +import static command_request.CommandRequestOuterClass.RequestType.FunctionRestore; +import static command_request.CommandRequestOuterClass.RequestType.FunctionStats; +import static command_request.CommandRequestOuterClass.RequestType.Info; +import static command_request.CommandRequestOuterClass.RequestType.LastSave; +import static command_request.CommandRequestOuterClass.RequestType.Lolwut; +import static command_request.CommandRequestOuterClass.RequestType.Ping; +import static command_request.CommandRequestOuterClass.RequestType.RandomKey; +import static command_request.CommandRequestOuterClass.RequestType.Sort; +import static command_request.CommandRequestOuterClass.RequestType.SortReadOnly; +import static command_request.CommandRequestOuterClass.RequestType.Time; +import static command_request.CommandRequestOuterClass.RequestType.UnWatch; import glide.api.commands.ConnectionManagementClusterCommands; import glide.api.commands.GenericClusterCommands; 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 a07db292e5..94fd4d1e44 100644 --- a/java/client/src/main/java/glide/api/models/BaseTransaction.java +++ b/java/client/src/main/java/glide/api/models/BaseTransaction.java @@ -24,177 +24,177 @@ import static glide.utils.ArrayTransformUtils.convertMapToKeyValueStringArray; import static glide.utils.ArrayTransformUtils.convertMapToValueKeyStringArray; import static glide.utils.ArrayTransformUtils.mapGeoDataToArray; -import static redis_request.RedisRequestOuterClass.RequestType.Append; -import static redis_request.RedisRequestOuterClass.RequestType.BLMPop; -import static redis_request.RedisRequestOuterClass.RequestType.BLMove; -import static redis_request.RedisRequestOuterClass.RequestType.BLPop; -import static redis_request.RedisRequestOuterClass.RequestType.BRPop; -import static redis_request.RedisRequestOuterClass.RequestType.BZMPop; -import static redis_request.RedisRequestOuterClass.RequestType.BZPopMax; -import static redis_request.RedisRequestOuterClass.RequestType.BZPopMin; -import static redis_request.RedisRequestOuterClass.RequestType.BitCount; -import static redis_request.RedisRequestOuterClass.RequestType.BitField; -import static redis_request.RedisRequestOuterClass.RequestType.BitFieldReadOnly; -import static redis_request.RedisRequestOuterClass.RequestType.BitOp; -import static redis_request.RedisRequestOuterClass.RequestType.BitPos; -import static redis_request.RedisRequestOuterClass.RequestType.ClientGetName; -import static redis_request.RedisRequestOuterClass.RequestType.ClientId; -import static redis_request.RedisRequestOuterClass.RequestType.ConfigGet; -import static redis_request.RedisRequestOuterClass.RequestType.ConfigResetStat; -import static redis_request.RedisRequestOuterClass.RequestType.ConfigRewrite; -import static redis_request.RedisRequestOuterClass.RequestType.ConfigSet; -import static redis_request.RedisRequestOuterClass.RequestType.Copy; -import static redis_request.RedisRequestOuterClass.RequestType.CustomCommand; -import static redis_request.RedisRequestOuterClass.RequestType.DBSize; -import static redis_request.RedisRequestOuterClass.RequestType.Decr; -import static redis_request.RedisRequestOuterClass.RequestType.DecrBy; -import static redis_request.RedisRequestOuterClass.RequestType.Del; -import static redis_request.RedisRequestOuterClass.RequestType.Echo; -import static redis_request.RedisRequestOuterClass.RequestType.Exists; -import static redis_request.RedisRequestOuterClass.RequestType.Expire; -import static redis_request.RedisRequestOuterClass.RequestType.ExpireAt; -import static redis_request.RedisRequestOuterClass.RequestType.ExpireTime; -import static redis_request.RedisRequestOuterClass.RequestType.FCall; -import static redis_request.RedisRequestOuterClass.RequestType.FCallReadOnly; -import static redis_request.RedisRequestOuterClass.RequestType.FlushAll; -import static redis_request.RedisRequestOuterClass.RequestType.FlushDB; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionDelete; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionFlush; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionList; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionLoad; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionStats; -import static redis_request.RedisRequestOuterClass.RequestType.GeoAdd; -import static redis_request.RedisRequestOuterClass.RequestType.GeoDist; -import static redis_request.RedisRequestOuterClass.RequestType.GeoHash; -import static redis_request.RedisRequestOuterClass.RequestType.GeoPos; -import static redis_request.RedisRequestOuterClass.RequestType.Get; -import static redis_request.RedisRequestOuterClass.RequestType.GetBit; -import static redis_request.RedisRequestOuterClass.RequestType.GetDel; -import static redis_request.RedisRequestOuterClass.RequestType.GetEx; -import static redis_request.RedisRequestOuterClass.RequestType.GetRange; -import static redis_request.RedisRequestOuterClass.RequestType.HDel; -import static redis_request.RedisRequestOuterClass.RequestType.HExists; -import static redis_request.RedisRequestOuterClass.RequestType.HGet; -import static redis_request.RedisRequestOuterClass.RequestType.HGetAll; -import static redis_request.RedisRequestOuterClass.RequestType.HIncrBy; -import static redis_request.RedisRequestOuterClass.RequestType.HIncrByFloat; -import static redis_request.RedisRequestOuterClass.RequestType.HKeys; -import static redis_request.RedisRequestOuterClass.RequestType.HLen; -import static redis_request.RedisRequestOuterClass.RequestType.HMGet; -import static redis_request.RedisRequestOuterClass.RequestType.HRandField; -import static redis_request.RedisRequestOuterClass.RequestType.HSet; -import static redis_request.RedisRequestOuterClass.RequestType.HSetNX; -import static redis_request.RedisRequestOuterClass.RequestType.HStrlen; -import static redis_request.RedisRequestOuterClass.RequestType.HVals; -import static redis_request.RedisRequestOuterClass.RequestType.Incr; -import static redis_request.RedisRequestOuterClass.RequestType.IncrBy; -import static redis_request.RedisRequestOuterClass.RequestType.IncrByFloat; -import static redis_request.RedisRequestOuterClass.RequestType.Info; -import static redis_request.RedisRequestOuterClass.RequestType.LCS; -import static redis_request.RedisRequestOuterClass.RequestType.LIndex; -import static redis_request.RedisRequestOuterClass.RequestType.LInsert; -import static redis_request.RedisRequestOuterClass.RequestType.LLen; -import static redis_request.RedisRequestOuterClass.RequestType.LMPop; -import static redis_request.RedisRequestOuterClass.RequestType.LMove; -import static redis_request.RedisRequestOuterClass.RequestType.LPop; -import static redis_request.RedisRequestOuterClass.RequestType.LPos; -import static redis_request.RedisRequestOuterClass.RequestType.LPush; -import static redis_request.RedisRequestOuterClass.RequestType.LPushX; -import static redis_request.RedisRequestOuterClass.RequestType.LRange; -import static redis_request.RedisRequestOuterClass.RequestType.LRem; -import static redis_request.RedisRequestOuterClass.RequestType.LSet; -import static redis_request.RedisRequestOuterClass.RequestType.LTrim; -import static redis_request.RedisRequestOuterClass.RequestType.LastSave; -import static redis_request.RedisRequestOuterClass.RequestType.Lolwut; -import static redis_request.RedisRequestOuterClass.RequestType.MGet; -import static redis_request.RedisRequestOuterClass.RequestType.MSet; -import static redis_request.RedisRequestOuterClass.RequestType.MSetNX; -import static redis_request.RedisRequestOuterClass.RequestType.ObjectEncoding; -import static redis_request.RedisRequestOuterClass.RequestType.ObjectFreq; -import static redis_request.RedisRequestOuterClass.RequestType.ObjectIdleTime; -import static redis_request.RedisRequestOuterClass.RequestType.ObjectRefCount; -import static redis_request.RedisRequestOuterClass.RequestType.PExpire; -import static redis_request.RedisRequestOuterClass.RequestType.PExpireAt; -import static redis_request.RedisRequestOuterClass.RequestType.PExpireTime; -import static redis_request.RedisRequestOuterClass.RequestType.PTTL; -import static redis_request.RedisRequestOuterClass.RequestType.Persist; -import static redis_request.RedisRequestOuterClass.RequestType.PfAdd; -import static redis_request.RedisRequestOuterClass.RequestType.PfCount; -import static redis_request.RedisRequestOuterClass.RequestType.PfMerge; -import static redis_request.RedisRequestOuterClass.RequestType.Ping; -import static redis_request.RedisRequestOuterClass.RequestType.RPop; -import static redis_request.RedisRequestOuterClass.RequestType.RPush; -import static redis_request.RedisRequestOuterClass.RequestType.RPushX; -import static redis_request.RedisRequestOuterClass.RequestType.RandomKey; -import static redis_request.RedisRequestOuterClass.RequestType.Rename; -import static redis_request.RedisRequestOuterClass.RequestType.RenameNX; -import static redis_request.RedisRequestOuterClass.RequestType.SAdd; -import static redis_request.RedisRequestOuterClass.RequestType.SCard; -import static redis_request.RedisRequestOuterClass.RequestType.SDiff; -import static redis_request.RedisRequestOuterClass.RequestType.SDiffStore; -import static redis_request.RedisRequestOuterClass.RequestType.SInter; -import static redis_request.RedisRequestOuterClass.RequestType.SInterCard; -import static redis_request.RedisRequestOuterClass.RequestType.SInterStore; -import static redis_request.RedisRequestOuterClass.RequestType.SIsMember; -import static redis_request.RedisRequestOuterClass.RequestType.SMIsMember; -import static redis_request.RedisRequestOuterClass.RequestType.SMembers; -import static redis_request.RedisRequestOuterClass.RequestType.SMove; -import static redis_request.RedisRequestOuterClass.RequestType.SPop; -import static redis_request.RedisRequestOuterClass.RequestType.SRandMember; -import static redis_request.RedisRequestOuterClass.RequestType.SRem; -import static redis_request.RedisRequestOuterClass.RequestType.SUnion; -import static redis_request.RedisRequestOuterClass.RequestType.SUnionStore; -import static redis_request.RedisRequestOuterClass.RequestType.Set; -import static redis_request.RedisRequestOuterClass.RequestType.SetBit; -import static redis_request.RedisRequestOuterClass.RequestType.SetRange; -import static redis_request.RedisRequestOuterClass.RequestType.Sort; -import static redis_request.RedisRequestOuterClass.RequestType.SortReadOnly; -import static redis_request.RedisRequestOuterClass.RequestType.Strlen; -import static redis_request.RedisRequestOuterClass.RequestType.TTL; -import static redis_request.RedisRequestOuterClass.RequestType.Time; -import static redis_request.RedisRequestOuterClass.RequestType.Touch; -import static redis_request.RedisRequestOuterClass.RequestType.Type; -import static redis_request.RedisRequestOuterClass.RequestType.Unlink; -import static redis_request.RedisRequestOuterClass.RequestType.XAck; -import static redis_request.RedisRequestOuterClass.RequestType.XAdd; -import static redis_request.RedisRequestOuterClass.RequestType.XDel; -import static redis_request.RedisRequestOuterClass.RequestType.XGroupCreate; -import static redis_request.RedisRequestOuterClass.RequestType.XGroupCreateConsumer; -import static redis_request.RedisRequestOuterClass.RequestType.XGroupDelConsumer; -import static redis_request.RedisRequestOuterClass.RequestType.XGroupDestroy; -import static redis_request.RedisRequestOuterClass.RequestType.XLen; -import static redis_request.RedisRequestOuterClass.RequestType.XPending; -import static redis_request.RedisRequestOuterClass.RequestType.XRange; -import static redis_request.RedisRequestOuterClass.RequestType.XRead; -import static redis_request.RedisRequestOuterClass.RequestType.XReadGroup; -import static redis_request.RedisRequestOuterClass.RequestType.XRevRange; -import static redis_request.RedisRequestOuterClass.RequestType.XTrim; -import static redis_request.RedisRequestOuterClass.RequestType.ZAdd; -import static redis_request.RedisRequestOuterClass.RequestType.ZCard; -import static redis_request.RedisRequestOuterClass.RequestType.ZCount; -import static redis_request.RedisRequestOuterClass.RequestType.ZDiff; -import static redis_request.RedisRequestOuterClass.RequestType.ZDiffStore; -import static redis_request.RedisRequestOuterClass.RequestType.ZIncrBy; -import static redis_request.RedisRequestOuterClass.RequestType.ZInter; -import static redis_request.RedisRequestOuterClass.RequestType.ZInterCard; -import static redis_request.RedisRequestOuterClass.RequestType.ZInterStore; -import static redis_request.RedisRequestOuterClass.RequestType.ZLexCount; -import static redis_request.RedisRequestOuterClass.RequestType.ZMPop; -import static redis_request.RedisRequestOuterClass.RequestType.ZMScore; -import static redis_request.RedisRequestOuterClass.RequestType.ZPopMax; -import static redis_request.RedisRequestOuterClass.RequestType.ZPopMin; -import static redis_request.RedisRequestOuterClass.RequestType.ZRandMember; -import static redis_request.RedisRequestOuterClass.RequestType.ZRange; -import static redis_request.RedisRequestOuterClass.RequestType.ZRangeStore; -import static redis_request.RedisRequestOuterClass.RequestType.ZRank; -import static redis_request.RedisRequestOuterClass.RequestType.ZRem; -import static redis_request.RedisRequestOuterClass.RequestType.ZRemRangeByLex; -import static redis_request.RedisRequestOuterClass.RequestType.ZRemRangeByRank; -import static redis_request.RedisRequestOuterClass.RequestType.ZRemRangeByScore; -import static redis_request.RedisRequestOuterClass.RequestType.ZRevRank; -import static redis_request.RedisRequestOuterClass.RequestType.ZScore; -import static redis_request.RedisRequestOuterClass.RequestType.ZUnion; -import static redis_request.RedisRequestOuterClass.RequestType.ZUnionStore; +import static command_request.CommandRequestOuterClass.RequestType.Append; +import static command_request.CommandRequestOuterClass.RequestType.BLMPop; +import static command_request.CommandRequestOuterClass.RequestType.BLMove; +import static command_request.CommandRequestOuterClass.RequestType.BLPop; +import static command_request.CommandRequestOuterClass.RequestType.BRPop; +import static command_request.CommandRequestOuterClass.RequestType.BZMPop; +import static command_request.CommandRequestOuterClass.RequestType.BZPopMax; +import static command_request.CommandRequestOuterClass.RequestType.BZPopMin; +import static command_request.CommandRequestOuterClass.RequestType.BitCount; +import static command_request.CommandRequestOuterClass.RequestType.BitField; +import static command_request.CommandRequestOuterClass.RequestType.BitFieldReadOnly; +import static command_request.CommandRequestOuterClass.RequestType.BitOp; +import static command_request.CommandRequestOuterClass.RequestType.BitPos; +import static command_request.CommandRequestOuterClass.RequestType.ClientGetName; +import static command_request.CommandRequestOuterClass.RequestType.ClientId; +import static command_request.CommandRequestOuterClass.RequestType.ConfigGet; +import static command_request.CommandRequestOuterClass.RequestType.ConfigResetStat; +import static command_request.CommandRequestOuterClass.RequestType.ConfigRewrite; +import static command_request.CommandRequestOuterClass.RequestType.ConfigSet; +import static command_request.CommandRequestOuterClass.RequestType.Copy; +import static command_request.CommandRequestOuterClass.RequestType.CustomCommand; +import static command_request.CommandRequestOuterClass.RequestType.DBSize; +import static command_request.CommandRequestOuterClass.RequestType.Decr; +import static command_request.CommandRequestOuterClass.RequestType.DecrBy; +import static command_request.CommandRequestOuterClass.RequestType.Del; +import static command_request.CommandRequestOuterClass.RequestType.Echo; +import static command_request.CommandRequestOuterClass.RequestType.Exists; +import static command_request.CommandRequestOuterClass.RequestType.Expire; +import static command_request.CommandRequestOuterClass.RequestType.ExpireAt; +import static command_request.CommandRequestOuterClass.RequestType.ExpireTime; +import static command_request.CommandRequestOuterClass.RequestType.FCall; +import static command_request.CommandRequestOuterClass.RequestType.FCallReadOnly; +import static command_request.CommandRequestOuterClass.RequestType.FlushAll; +import static command_request.CommandRequestOuterClass.RequestType.FlushDB; +import static command_request.CommandRequestOuterClass.RequestType.FunctionDelete; +import static command_request.CommandRequestOuterClass.RequestType.FunctionFlush; +import static command_request.CommandRequestOuterClass.RequestType.FunctionList; +import static command_request.CommandRequestOuterClass.RequestType.FunctionLoad; +import static command_request.CommandRequestOuterClass.RequestType.FunctionStats; +import static command_request.CommandRequestOuterClass.RequestType.GeoAdd; +import static command_request.CommandRequestOuterClass.RequestType.GeoDist; +import static command_request.CommandRequestOuterClass.RequestType.GeoHash; +import static command_request.CommandRequestOuterClass.RequestType.GeoPos; +import static command_request.CommandRequestOuterClass.RequestType.Get; +import static command_request.CommandRequestOuterClass.RequestType.GetBit; +import static command_request.CommandRequestOuterClass.RequestType.GetDel; +import static command_request.CommandRequestOuterClass.RequestType.GetEx; +import static command_request.CommandRequestOuterClass.RequestType.GetRange; +import static command_request.CommandRequestOuterClass.RequestType.HDel; +import static command_request.CommandRequestOuterClass.RequestType.HExists; +import static command_request.CommandRequestOuterClass.RequestType.HGet; +import static command_request.CommandRequestOuterClass.RequestType.HGetAll; +import static command_request.CommandRequestOuterClass.RequestType.HIncrBy; +import static command_request.CommandRequestOuterClass.RequestType.HIncrByFloat; +import static command_request.CommandRequestOuterClass.RequestType.HKeys; +import static command_request.CommandRequestOuterClass.RequestType.HLen; +import static command_request.CommandRequestOuterClass.RequestType.HMGet; +import static command_request.CommandRequestOuterClass.RequestType.HRandField; +import static command_request.CommandRequestOuterClass.RequestType.HSet; +import static command_request.CommandRequestOuterClass.RequestType.HSetNX; +import static command_request.CommandRequestOuterClass.RequestType.HStrlen; +import static command_request.CommandRequestOuterClass.RequestType.HVals; +import static command_request.CommandRequestOuterClass.RequestType.Incr; +import static command_request.CommandRequestOuterClass.RequestType.IncrBy; +import static command_request.CommandRequestOuterClass.RequestType.IncrByFloat; +import static command_request.CommandRequestOuterClass.RequestType.Info; +import static command_request.CommandRequestOuterClass.RequestType.LCS; +import static command_request.CommandRequestOuterClass.RequestType.LIndex; +import static command_request.CommandRequestOuterClass.RequestType.LInsert; +import static command_request.CommandRequestOuterClass.RequestType.LLen; +import static command_request.CommandRequestOuterClass.RequestType.LMPop; +import static command_request.CommandRequestOuterClass.RequestType.LMove; +import static command_request.CommandRequestOuterClass.RequestType.LPop; +import static command_request.CommandRequestOuterClass.RequestType.LPos; +import static command_request.CommandRequestOuterClass.RequestType.LPush; +import static command_request.CommandRequestOuterClass.RequestType.LPushX; +import static command_request.CommandRequestOuterClass.RequestType.LRange; +import static command_request.CommandRequestOuterClass.RequestType.LRem; +import static command_request.CommandRequestOuterClass.RequestType.LSet; +import static command_request.CommandRequestOuterClass.RequestType.LTrim; +import static command_request.CommandRequestOuterClass.RequestType.LastSave; +import static command_request.CommandRequestOuterClass.RequestType.Lolwut; +import static command_request.CommandRequestOuterClass.RequestType.MGet; +import static command_request.CommandRequestOuterClass.RequestType.MSet; +import static command_request.CommandRequestOuterClass.RequestType.MSetNX; +import static command_request.CommandRequestOuterClass.RequestType.ObjectEncoding; +import static command_request.CommandRequestOuterClass.RequestType.ObjectFreq; +import static command_request.CommandRequestOuterClass.RequestType.ObjectIdleTime; +import static command_request.CommandRequestOuterClass.RequestType.ObjectRefCount; +import static command_request.CommandRequestOuterClass.RequestType.PExpire; +import static command_request.CommandRequestOuterClass.RequestType.PExpireAt; +import static command_request.CommandRequestOuterClass.RequestType.PExpireTime; +import static command_request.CommandRequestOuterClass.RequestType.PTTL; +import static command_request.CommandRequestOuterClass.RequestType.Persist; +import static command_request.CommandRequestOuterClass.RequestType.PfAdd; +import static command_request.CommandRequestOuterClass.RequestType.PfCount; +import static command_request.CommandRequestOuterClass.RequestType.PfMerge; +import static command_request.CommandRequestOuterClass.RequestType.Ping; +import static command_request.CommandRequestOuterClass.RequestType.RPop; +import static command_request.CommandRequestOuterClass.RequestType.RPush; +import static command_request.CommandRequestOuterClass.RequestType.RPushX; +import static command_request.CommandRequestOuterClass.RequestType.RandomKey; +import static command_request.CommandRequestOuterClass.RequestType.Rename; +import static command_request.CommandRequestOuterClass.RequestType.RenameNX; +import static command_request.CommandRequestOuterClass.RequestType.SAdd; +import static command_request.CommandRequestOuterClass.RequestType.SCard; +import static command_request.CommandRequestOuterClass.RequestType.SDiff; +import static command_request.CommandRequestOuterClass.RequestType.SDiffStore; +import static command_request.CommandRequestOuterClass.RequestType.SInter; +import static command_request.CommandRequestOuterClass.RequestType.SInterCard; +import static command_request.CommandRequestOuterClass.RequestType.SInterStore; +import static command_request.CommandRequestOuterClass.RequestType.SIsMember; +import static command_request.CommandRequestOuterClass.RequestType.SMIsMember; +import static command_request.CommandRequestOuterClass.RequestType.SMembers; +import static command_request.CommandRequestOuterClass.RequestType.SMove; +import static command_request.CommandRequestOuterClass.RequestType.SPop; +import static command_request.CommandRequestOuterClass.RequestType.SRandMember; +import static command_request.CommandRequestOuterClass.RequestType.SRem; +import static command_request.CommandRequestOuterClass.RequestType.SUnion; +import static command_request.CommandRequestOuterClass.RequestType.SUnionStore; +import static command_request.CommandRequestOuterClass.RequestType.Set; +import static command_request.CommandRequestOuterClass.RequestType.SetBit; +import static command_request.CommandRequestOuterClass.RequestType.SetRange; +import static command_request.CommandRequestOuterClass.RequestType.Sort; +import static command_request.CommandRequestOuterClass.RequestType.SortReadOnly; +import static command_request.CommandRequestOuterClass.RequestType.Strlen; +import static command_request.CommandRequestOuterClass.RequestType.TTL; +import static command_request.CommandRequestOuterClass.RequestType.Time; +import static command_request.CommandRequestOuterClass.RequestType.Touch; +import static command_request.CommandRequestOuterClass.RequestType.Type; +import static command_request.CommandRequestOuterClass.RequestType.Unlink; +import static command_request.CommandRequestOuterClass.RequestType.XAck; +import static command_request.CommandRequestOuterClass.RequestType.XAdd; +import static command_request.CommandRequestOuterClass.RequestType.XDel; +import static command_request.CommandRequestOuterClass.RequestType.XGroupCreate; +import static command_request.CommandRequestOuterClass.RequestType.XGroupCreateConsumer; +import static command_request.CommandRequestOuterClass.RequestType.XGroupDelConsumer; +import static command_request.CommandRequestOuterClass.RequestType.XGroupDestroy; +import static command_request.CommandRequestOuterClass.RequestType.XLen; +import static command_request.CommandRequestOuterClass.RequestType.XPending; +import static command_request.CommandRequestOuterClass.RequestType.XRange; +import static command_request.CommandRequestOuterClass.RequestType.XRead; +import static command_request.CommandRequestOuterClass.RequestType.XReadGroup; +import static command_request.CommandRequestOuterClass.RequestType.XRevRange; +import static command_request.CommandRequestOuterClass.RequestType.XTrim; +import static command_request.CommandRequestOuterClass.RequestType.ZAdd; +import static command_request.CommandRequestOuterClass.RequestType.ZCard; +import static command_request.CommandRequestOuterClass.RequestType.ZCount; +import static command_request.CommandRequestOuterClass.RequestType.ZDiff; +import static command_request.CommandRequestOuterClass.RequestType.ZDiffStore; +import static command_request.CommandRequestOuterClass.RequestType.ZIncrBy; +import static command_request.CommandRequestOuterClass.RequestType.ZInter; +import static command_request.CommandRequestOuterClass.RequestType.ZInterCard; +import static command_request.CommandRequestOuterClass.RequestType.ZInterStore; +import static command_request.CommandRequestOuterClass.RequestType.ZLexCount; +import static command_request.CommandRequestOuterClass.RequestType.ZMPop; +import static command_request.CommandRequestOuterClass.RequestType.ZMScore; +import static command_request.CommandRequestOuterClass.RequestType.ZPopMax; +import static command_request.CommandRequestOuterClass.RequestType.ZPopMin; +import static command_request.CommandRequestOuterClass.RequestType.ZRandMember; +import static command_request.CommandRequestOuterClass.RequestType.ZRange; +import static command_request.CommandRequestOuterClass.RequestType.ZRangeStore; +import static command_request.CommandRequestOuterClass.RequestType.ZRank; +import static command_request.CommandRequestOuterClass.RequestType.ZRem; +import static command_request.CommandRequestOuterClass.RequestType.ZRemRangeByLex; +import static command_request.CommandRequestOuterClass.RequestType.ZRemRangeByRank; +import static command_request.CommandRequestOuterClass.RequestType.ZRemRangeByScore; +import static command_request.CommandRequestOuterClass.RequestType.ZRevRank; +import static command_request.CommandRequestOuterClass.RequestType.ZScore; +import static command_request.CommandRequestOuterClass.RequestType.ZUnion; +import static command_request.CommandRequestOuterClass.RequestType.ZUnionStore; import com.google.protobuf.ByteString; import glide.api.models.commands.ExpireOptions; @@ -256,10 +256,10 @@ import lombok.Getter; import lombok.NonNull; import org.apache.commons.lang3.ArrayUtils; -import redis_request.RedisRequestOuterClass.Command; -import redis_request.RedisRequestOuterClass.Command.ArgsArray; -import redis_request.RedisRequestOuterClass.RequestType; -import redis_request.RedisRequestOuterClass.Transaction; +import command_request.CommandRequestOuterClass.Command; +import command_request.CommandRequestOuterClass.Command.ArgsArray; +import command_request.CommandRequestOuterClass.RequestType; +import command_request.CommandRequestOuterClass.Transaction; /** * Base class encompassing shared commands for both standalone and cluster mode implementations in a 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 1fabea46fd..e70236535c 100644 --- a/java/client/src/main/java/glide/api/models/ClusterTransaction.java +++ b/java/client/src/main/java/glide/api/models/ClusterTransaction.java @@ -3,14 +3,14 @@ import static glide.api.models.commands.SortBaseOptions.STORE_COMMAND_STRING; import static glide.utils.ArrayTransformUtils.concatenateArrays; -import static redis_request.RedisRequestOuterClass.RequestType.Sort; -import static redis_request.RedisRequestOuterClass.RequestType.SortReadOnly; +import static command_request.CommandRequestOuterClass.RequestType.Sort; +import static command_request.CommandRequestOuterClass.RequestType.SortReadOnly; import glide.api.models.commands.SortClusterOptions; import lombok.AllArgsConstructor; import lombok.NonNull; import org.apache.commons.lang3.ArrayUtils; -import redis_request.RedisRequestOuterClass; +import command_request.CommandRequestOuterClass; /** * Extends BaseTransaction class for cluster mode commands. Transactions allow the execution of a @@ -50,7 +50,7 @@ protected ClusterTransaction getThis() { */ public ClusterTransaction sort( @NonNull String key, @NonNull SortClusterOptions sortClusterOptions) { - RedisRequestOuterClass.Command.ArgsArray commandArgs = + CommandRequestOuterClass.Command.ArgsArray commandArgs = buildArgs(ArrayUtils.addFirst(sortClusterOptions.toArgs(), key)); protobufTransaction.addCommands(buildCommand(Sort, commandArgs)); return this; @@ -69,7 +69,7 @@ public ClusterTransaction sort( */ public ClusterTransaction sortReadOnly( @NonNull String key, @NonNull SortClusterOptions sortClusterOptions) { - RedisRequestOuterClass.Command.ArgsArray commandArgs = + CommandRequestOuterClass.Command.ArgsArray commandArgs = buildArgs(ArrayUtils.addFirst(sortClusterOptions.toArgs(), key)); protobufTransaction.addCommands(buildCommand(SortReadOnly, commandArgs)); return this; @@ -94,7 +94,7 @@ public ClusterTransaction sortStore( @NonNull String destination, @NonNull SortClusterOptions sortClusterOptions) { String[] storeArguments = new String[] {STORE_COMMAND_STRING, destination}; - RedisRequestOuterClass.Command.ArgsArray commandArgs = + CommandRequestOuterClass.Command.ArgsArray commandArgs = buildArgs( concatenateArrays(new String[] {key}, sortClusterOptions.toArgs(), storeArguments)); protobufTransaction.addCommands(buildCommand(Sort, commandArgs)); 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 ff49530ab4..2b268cb15e 100644 --- a/java/client/src/main/java/glide/api/models/Transaction.java +++ b/java/client/src/main/java/glide/api/models/Transaction.java @@ -6,17 +6,17 @@ import static glide.api.models.commands.SortBaseOptions.STORE_COMMAND_STRING; import static glide.api.models.commands.SortOptions.STORE_COMMAND_STRING; import static glide.utils.ArrayTransformUtils.concatenateArrays; -import static redis_request.RedisRequestOuterClass.RequestType.Copy; -import static redis_request.RedisRequestOuterClass.RequestType.Move; -import static redis_request.RedisRequestOuterClass.RequestType.Select; -import static redis_request.RedisRequestOuterClass.RequestType.Sort; -import static redis_request.RedisRequestOuterClass.RequestType.SortReadOnly; +import static command_request.CommandRequestOuterClass.RequestType.Copy; +import static command_request.CommandRequestOuterClass.RequestType.Move; +import static command_request.CommandRequestOuterClass.RequestType.Select; +import static command_request.CommandRequestOuterClass.RequestType.Sort; +import static command_request.CommandRequestOuterClass.RequestType.SortReadOnly; import glide.api.models.commands.SortOptions; import lombok.AllArgsConstructor; import lombok.NonNull; import org.apache.commons.lang3.ArrayUtils; -import redis_request.RedisRequestOuterClass.Command.ArgsArray; +import command_request.CommandRequestOuterClass.Command.ArgsArray; /** * Extends BaseTransaction class for Redis standalone commands. Transactions allow the execution of diff --git a/java/client/src/main/java/glide/api/models/commands/SetOptions.java b/java/client/src/main/java/glide/api/models/commands/SetOptions.java index f116e4538c..8f824daa42 100644 --- a/java/client/src/main/java/glide/api/models/commands/SetOptions.java +++ b/java/client/src/main/java/glide/api/models/commands/SetOptions.java @@ -14,7 +14,7 @@ import lombok.Builder; import lombok.Getter; import lombok.RequiredArgsConstructor; -import redis_request.RedisRequestOuterClass.Command; +import command_request.CommandRequestOuterClass.Command; /** * Optional arguments for {@link StringBaseCommands#set(String, String, SetOptions)} command. diff --git a/java/client/src/main/java/glide/connectors/handlers/ChannelHandler.java b/java/client/src/main/java/glide/connectors/handlers/ChannelHandler.java index af9507b867..bd7cd4a29e 100644 --- a/java/client/src/main/java/glide/connectors/handlers/ChannelHandler.java +++ b/java/client/src/main/java/glide/connectors/handlers/ChannelHandler.java @@ -12,7 +12,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import lombok.NonNull; import lombok.RequiredArgsConstructor; -import redis_request.RedisRequestOuterClass.RedisRequest; +import command_request.CommandRequestOuterClass.CommandRequest; import response.ResponseOuterClass.Response; /** @@ -62,7 +62,7 @@ public ChannelHandler( * @param flush True to flush immediately * @return A response promise */ - public CompletableFuture write(RedisRequest.Builder request, boolean flush) { + public CompletableFuture write(CommandRequest.Builder request, boolean flush) { var commandId = callbackDispatcher.registerRequest(); request.setCallbackIdx(commandId.getKey()); diff --git a/java/client/src/main/java/glide/managers/CommandManager.java b/java/client/src/main/java/glide/managers/CommandManager.java index 1dd41e7bba..0a84f8609c 100644 --- a/java/client/src/main/java/glide/managers/CommandManager.java +++ b/java/client/src/main/java/glide/managers/CommandManager.java @@ -20,15 +20,15 @@ import java.util.Optional; import java.util.concurrent.CompletableFuture; import lombok.RequiredArgsConstructor; -import redis_request.RedisRequestOuterClass; -import redis_request.RedisRequestOuterClass.Command; -import redis_request.RedisRequestOuterClass.Command.ArgsArray; -import redis_request.RedisRequestOuterClass.RedisRequest; -import redis_request.RedisRequestOuterClass.RequestType; -import redis_request.RedisRequestOuterClass.Routes; -import redis_request.RedisRequestOuterClass.ScriptInvocation; -import redis_request.RedisRequestOuterClass.SimpleRoutes; -import redis_request.RedisRequestOuterClass.SlotTypes; +import command_request.CommandRequestOuterClass; +import command_request.CommandRequestOuterClass.Command; +import command_request.CommandRequestOuterClass.Command.ArgsArray; +import command_request.CommandRequestOuterClass.CommandRequest; +import command_request.CommandRequestOuterClass.RequestType; +import command_request.CommandRequestOuterClass.Routes; +import command_request.CommandRequestOuterClass.ScriptInvocation; +import command_request.CommandRequestOuterClass.SimpleRoutes; +import command_request.CommandRequestOuterClass.SlotTypes; import response.ResponseOuterClass.Response; /** @@ -54,7 +54,7 @@ public CompletableFuture submitNewCommand( String[] arguments, RedisExceptionCheckedFunction responseHandler) { - RedisRequest.Builder command = prepareRedisRequest(requestType, arguments); + CommandRequest.Builder command = prepareCommandRequest(requestType, arguments); return submitCommandToChannel(command, responseHandler); } @@ -71,7 +71,7 @@ public CompletableFuture submitNewCommand( GlideString[] arguments, RedisExceptionCheckedFunction responseHandler) { - RedisRequest.Builder command = prepareRedisRequest(requestType, arguments); + CommandRequest.Builder command = prepareCommandRequest(requestType, arguments); return submitCommandToChannel(command, responseHandler); } @@ -90,7 +90,7 @@ public CompletableFuture submitNewCommand( Route route, RedisExceptionCheckedFunction responseHandler) { - RedisRequest.Builder command = prepareRedisRequest(requestType, arguments, route); + CommandRequest.Builder command = prepareCommandRequest(requestType, arguments, route); return submitCommandToChannel(command, responseHandler); } @@ -109,7 +109,7 @@ public CompletableFuture submitNewCommand( Route route, RedisExceptionCheckedFunction responseHandler) { - RedisRequest.Builder command = prepareRedisRequest(requestType, arguments, route); + CommandRequest.Builder command = prepareCommandRequest(requestType, arguments, route); return submitCommandToChannel(command, responseHandler); } @@ -123,7 +123,7 @@ public CompletableFuture submitNewCommand( public CompletableFuture submitNewTransaction( Transaction transaction, RedisExceptionCheckedFunction responseHandler) { - RedisRequest.Builder command = prepareRedisRequest(transaction); + CommandRequest.Builder command = prepareCommandRequest(transaction); return submitCommandToChannel(command, responseHandler); } @@ -142,7 +142,7 @@ public CompletableFuture submitScript( List args, RedisExceptionCheckedFunction responseHandler) { - RedisRequest.Builder command = prepareRedisRequest(script, keys, args); + CommandRequest.Builder command = prepareCommandRequest(script, keys, args); return submitCommandToChannel(command, responseHandler); } @@ -159,7 +159,7 @@ public CompletableFuture submitNewTransaction( Optional route, RedisExceptionCheckedFunction responseHandler) { - RedisRequest.Builder command = prepareRedisRequest(transaction, route); + CommandRequest.Builder command = prepareCommandRequest(transaction, route); return submitCommandToChannel(command, responseHandler); } @@ -171,7 +171,7 @@ public CompletableFuture submitNewTransaction( * @return A result promise of type T */ protected CompletableFuture submitCommandToChannel( - RedisRequest.Builder command, RedisExceptionCheckedFunction responseHandler) { + CommandRequest.Builder command, RedisExceptionCheckedFunction responseHandler) { if (channel.isClosed()) { var errorFuture = new CompletableFuture(); errorFuture.completeExceptionally( @@ -196,7 +196,7 @@ protected CompletableFuture submitCommandToChannel( * @return An incomplete request. {@link CallbackDispatcher} is responsible to complete it by * adding a callback id. */ - protected RedisRequest.Builder prepareRedisRequest( + protected CommandRequest.Builder prepareCommandRequest( RequestType requestType, String[] arguments, Route route) { ArgsArray.Builder commandArgs = ArgsArray.newBuilder(); for (var arg : arguments) { @@ -204,14 +204,14 @@ protected RedisRequest.Builder prepareRedisRequest( } var builder = - RedisRequest.newBuilder() + CommandRequest.newBuilder() .setSingleCommand( Command.newBuilder() .setRequestType(requestType) .setArgsArray(commandArgs.build()) .build()); - return prepareRedisRequestRoute(builder, route); + return prepareCommandRequestRoute(builder, route); } /** @@ -223,7 +223,7 @@ protected RedisRequest.Builder prepareRedisRequest( * @return An incomplete request. {@link CallbackDispatcher} is responsible to complete it by * adding a callback id. */ - protected RedisRequest.Builder prepareRedisRequest( + protected CommandRequest.Builder prepareCommandRequest( RequestType requestType, GlideString[] arguments, Route route) { ArgsArray.Builder commandArgs = ArgsArray.newBuilder(); for (var arg : arguments) { @@ -231,14 +231,14 @@ protected RedisRequest.Builder prepareRedisRequest( } var builder = - RedisRequest.newBuilder() + CommandRequest.newBuilder() .setSingleCommand( Command.newBuilder() .setRequestType(requestType) .setArgsArray(commandArgs.build()) .build()); - return prepareRedisRequestRoute(builder, route); + return prepareCommandRequestRoute(builder, route); } /** @@ -248,8 +248,8 @@ protected RedisRequest.Builder prepareRedisRequest( * @return An uncompleted request. {@link CallbackDispatcher} is responsible to complete it by * adding a callback id. */ - protected RedisRequest.Builder prepareRedisRequest(Transaction transaction) { - return RedisRequest.newBuilder().setTransaction(transaction.getProtobufTransaction().build()); + protected CommandRequest.Builder prepareCommandRequest(Transaction transaction) { + return CommandRequest.newBuilder().setTransaction(transaction.getProtobufTransaction().build()); } /** @@ -261,9 +261,9 @@ protected RedisRequest.Builder prepareRedisRequest(Transaction transaction) { * @return An uncompleted request. {@link CallbackDispatcher} is responsible to complete it by * adding a callback id. */ - protected RedisRequest.Builder prepareRedisRequest( + protected CommandRequest.Builder prepareCommandRequest( Script script, List keys, List args) { - return RedisRequest.newBuilder() + return CommandRequest.newBuilder() .setScriptInvocation( ScriptInvocation.newBuilder() .setHash(script.getHash()) @@ -280,13 +280,13 @@ protected RedisRequest.Builder prepareRedisRequest( * @return An uncompleted request. {@link CallbackDispatcher} is responsible to complete it by * adding a callback id. */ - protected RedisRequest.Builder prepareRedisRequest( + protected CommandRequest.Builder prepareCommandRequest( ClusterTransaction transaction, Optional route) { - RedisRequest.Builder builder = - RedisRequest.newBuilder().setTransaction(transaction.getProtobufTransaction().build()); + CommandRequest.Builder builder = + CommandRequest.newBuilder().setTransaction(transaction.getProtobufTransaction().build()); - return route.isPresent() ? prepareRedisRequestRoute(builder, route.get()) : builder; + return route.isPresent() ? prepareCommandRequestRoute(builder, route.get()) : builder; } /** @@ -297,13 +297,13 @@ protected RedisRequest.Builder prepareRedisRequest( * @return An uncompleted request. {@link CallbackDispatcher} is responsible to complete it by * adding a callback id. */ - protected RedisRequest.Builder prepareRedisRequest(RequestType requestType, String[] arguments) { + protected CommandRequest.Builder prepareCommandRequest(RequestType requestType, String[] arguments) { ArgsArray.Builder commandArgs = ArgsArray.newBuilder(); for (var arg : arguments) { commandArgs.addArgs(ByteString.copyFromUtf8(arg)); } - return RedisRequest.newBuilder() + return CommandRequest.newBuilder() .setSingleCommand( Command.newBuilder() .setRequestType(requestType) @@ -319,14 +319,14 @@ protected RedisRequest.Builder prepareRedisRequest(RequestType requestType, Stri * @return An uncompleted request. {@link CallbackDispatcher} is responsible to complete it by * adding a callback id. */ - protected RedisRequest.Builder prepareRedisRequest( + protected CommandRequest.Builder prepareCommandRequest( RequestType requestType, GlideString[] arguments) { ArgsArray.Builder commandArgs = ArgsArray.newBuilder(); for (var arg : arguments) { commandArgs.addArgs(ByteString.copyFrom(arg.getBytes())); } - return RedisRequest.newBuilder() + return CommandRequest.newBuilder() .setSingleCommand( Command.newBuilder() .setRequestType(requestType) @@ -334,7 +334,7 @@ protected RedisRequest.Builder prepareRedisRequest( .build()); } - private RedisRequest.Builder prepareRedisRequestRoute(RedisRequest.Builder builder, Route route) { + private CommandRequest.Builder prepareCommandRequestRoute(CommandRequest.Builder builder, Route route) { if (route instanceof SimpleMultiNodeRoute) { builder.setRoute( @@ -350,7 +350,7 @@ private RedisRequest.Builder prepareRedisRequestRoute(RedisRequest.Builder build builder.setRoute( Routes.newBuilder() .setSlotIdRoute( - RedisRequestOuterClass.SlotIdRoute.newBuilder() + CommandRequestOuterClass.SlotIdRoute.newBuilder() .setSlotId(((SlotIdRoute) route).getSlotId()) .setSlotType( SlotTypes.forNumber(((SlotIdRoute) route).getSlotType().ordinal())))); @@ -358,7 +358,7 @@ private RedisRequest.Builder prepareRedisRequestRoute(RedisRequest.Builder build builder.setRoute( Routes.newBuilder() .setSlotKeyRoute( - RedisRequestOuterClass.SlotKeyRoute.newBuilder() + CommandRequestOuterClass.SlotKeyRoute.newBuilder() .setSlotKey(((SlotKeyRoute) route).getSlotKey()) .setSlotType( SlotTypes.forNumber(((SlotKeyRoute) route).getSlotType().ordinal())))); @@ -366,7 +366,7 @@ private RedisRequest.Builder prepareRedisRequestRoute(RedisRequest.Builder build builder.setRoute( Routes.newBuilder() .setByAddressRoute( - RedisRequestOuterClass.ByAddressRoute.newBuilder() + CommandRequestOuterClass.ByAddressRoute.newBuilder() .setHost(((ByAddressRoute) route).getHost()) .setPort(((ByAddressRoute) route).getPort()))); } else { diff --git a/java/client/src/test/java/glide/ExceptionHandlingTests.java b/java/client/src/test/java/glide/ExceptionHandlingTests.java index eb7232ae3f..3364f298f5 100644 --- a/java/client/src/test/java/glide/ExceptionHandlingTests.java +++ b/java/client/src/test/java/glide/ExceptionHandlingTests.java @@ -6,7 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -import static redis_request.RedisRequestOuterClass.RequestType.CustomCommand; +import static command_request.CommandRequestOuterClass.RequestType.CustomCommand; import static response.ResponseOuterClass.RequestErrorType.Disconnect; import static response.ResponseOuterClass.RequestErrorType.ExecAbort; import static response.ResponseOuterClass.RequestErrorType.Timeout; @@ -40,7 +40,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import redis_request.RedisRequestOuterClass.RedisRequest; +import command_request.CommandRequestOuterClass.CommandRequest; import response.ResponseOuterClass.RequestError; import response.ResponseOuterClass.RequestErrorType; import response.ResponseOuterClass.Response; @@ -298,7 +298,7 @@ public ChannelFuture close() { } @Override - public CompletableFuture write(RedisRequest.Builder request, boolean flush) { + public CompletableFuture write(CommandRequest.Builder request, boolean flush) { var commandId = callbackDispatcher.registerRequest(); return commandId.getValue(); } diff --git a/java/client/src/test/java/glide/api/GlideClusterClientTest.java b/java/client/src/test/java/glide/api/GlideClusterClientTest.java new file mode 100644 index 0000000000..189c85229c --- /dev/null +++ b/java/client/src/test/java/glide/api/GlideClusterClientTest.java @@ -0,0 +1,2282 @@ +/** Copyright Valkey GLIDE Project Contributors - SPDX Identifier: Apache-2.0 */ +package glide.api; + +import static glide.api.BaseClient.OK; +import static glide.api.commands.ServerManagementCommands.VERSION_REDIS_API; +import static glide.api.models.GlideString.gs; +import static glide.api.models.commands.FlushMode.ASYNC; +import static glide.api.models.commands.FlushMode.SYNC; +import static glide.api.models.commands.SortBaseOptions.ALPHA_COMMAND_STRING; +import static glide.api.models.commands.SortBaseOptions.LIMIT_COMMAND_STRING; +import static glide.api.models.commands.SortBaseOptions.OrderBy.DESC; +import static glide.api.models.commands.SortBaseOptions.STORE_COMMAND_STRING; +import static glide.api.models.commands.function.FunctionListOptions.LIBRARY_NAME_REDIS_API; +import static glide.api.models.commands.function.FunctionListOptions.WITH_CODE_REDIS_API; +import static glide.api.models.configuration.RequestRoutingConfiguration.SimpleMultiNodeRoute.ALL_NODES; +import static glide.api.models.configuration.RequestRoutingConfiguration.SimpleMultiNodeRoute.ALL_PRIMARIES; +import static glide.api.models.configuration.RequestRoutingConfiguration.SimpleSingleNodeRoute.RANDOM; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import static command_request.CommandRequestOuterClass.RequestType.ClientGetName; +import static command_request.CommandRequestOuterClass.RequestType.ClientId; +import static command_request.CommandRequestOuterClass.RequestType.ConfigGet; +import static command_request.CommandRequestOuterClass.RequestType.ConfigResetStat; +import static command_request.CommandRequestOuterClass.RequestType.ConfigRewrite; +import static command_request.CommandRequestOuterClass.RequestType.ConfigSet; +import static command_request.CommandRequestOuterClass.RequestType.DBSize; +import static command_request.CommandRequestOuterClass.RequestType.Echo; +import static command_request.CommandRequestOuterClass.RequestType.FCall; +import static command_request.CommandRequestOuterClass.RequestType.FCallReadOnly; +import static command_request.CommandRequestOuterClass.RequestType.FlushAll; +import static command_request.CommandRequestOuterClass.RequestType.FlushDB; +import static command_request.CommandRequestOuterClass.RequestType.FunctionDelete; +import static command_request.CommandRequestOuterClass.RequestType.FunctionDump; +import static command_request.CommandRequestOuterClass.RequestType.FunctionFlush; +import static command_request.CommandRequestOuterClass.RequestType.FunctionKill; +import static command_request.CommandRequestOuterClass.RequestType.FunctionList; +import static command_request.CommandRequestOuterClass.RequestType.FunctionLoad; +import static command_request.CommandRequestOuterClass.RequestType.FunctionRestore; +import static command_request.CommandRequestOuterClass.RequestType.FunctionStats; +import static command_request.CommandRequestOuterClass.RequestType.Info; +import static command_request.CommandRequestOuterClass.RequestType.LastSave; +import static command_request.CommandRequestOuterClass.RequestType.Lolwut; +import static command_request.CommandRequestOuterClass.RequestType.Ping; +import static command_request.CommandRequestOuterClass.RequestType.RandomKey; +import static command_request.CommandRequestOuterClass.RequestType.Sort; +import static command_request.CommandRequestOuterClass.RequestType.SortReadOnly; +import static command_request.CommandRequestOuterClass.RequestType.Time; +import static command_request.CommandRequestOuterClass.RequestType.UnWatch; + +import glide.api.models.ClusterTransaction; +import glide.api.models.ClusterValue; +import glide.api.models.GlideString; +import glide.api.models.commands.FlushMode; +import glide.api.models.commands.InfoOptions; +import glide.api.models.commands.SortBaseOptions.Limit; +import glide.api.models.commands.SortClusterOptions; +import glide.api.models.commands.function.FunctionLoadOptions; +import glide.api.models.commands.function.FunctionRestorePolicy; +import glide.api.models.configuration.RequestRoutingConfiguration.Route; +import glide.api.models.configuration.RequestRoutingConfiguration.SingleNodeRoute; +import glide.managers.CommandManager; +import glide.managers.ConnectionManager; +import glide.managers.RedisExceptionCheckedFunction; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import lombok.SneakyThrows; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import command_request.CommandRequestOuterClass.CommandRequest; +import response.ResponseOuterClass.ConstantResponse; +import response.ResponseOuterClass.Response; + +public class GlideClusterClientTest { + + GlideClusterClient service; + + ConnectionManager connectionManager; + + CommandManager commandManager; + + private final String[] TEST_ARGS = new String[0]; + + @BeforeEach + public void setUp() { + connectionManager = mock(ConnectionManager.class); + commandManager = mock(CommandManager.class); + service = new GlideClusterClient(connectionManager, commandManager); + } + + @Test + @SneakyThrows + public void custom_command_returns_single_value() { + var commandManager = new TestCommandManager(null); + + try (var client = new TestClient(commandManager, "TEST")) { + var value = client.customCommand(TEST_ARGS).get(); + assertEquals("TEST", value.getSingleValue()); + } + } + + @Test + @SneakyThrows + public void custom_command_returns_multi_value() { + var commandManager = new TestCommandManager(null); + + var data = Map.of("key1", "value1", "key2", "value2"); + try (var client = new TestClient(commandManager, data)) { + var value = client.customCommand(TEST_ARGS).get(); + assertEquals(data, value.getMultiValue()); + } + } + + @Test + @SneakyThrows + // test checks that even a map returned as a single value when single node route is used + public void custom_command_with_single_node_route_returns_single_value() { + var commandManager = new TestCommandManager(null); + + var data = Map.of("key1", "value1", "key2", "value2"); + try (var client = new TestClient(commandManager, data)) { + var value = client.customCommand(TEST_ARGS, RANDOM).get(); + assertEquals(data, value.getSingleValue()); + } + } + + @Test + @SneakyThrows + public void custom_command_with_multi_node_route_returns_multi_value() { + var commandManager = new TestCommandManager(null); + + var data = Map.of("key1", "value1", "key2", "value2"); + try (var client = new TestClient(commandManager, data)) { + var value = client.customCommand(TEST_ARGS, ALL_NODES).get(); + assertEquals(data, value.getMultiValue()); + } + } + + @Test + @SneakyThrows + public void custom_command_returns_single_value_on_constant_response() { + var commandManager = + new TestCommandManager( + Response.newBuilder().setConstantResponse(ConstantResponse.OK).build()); + + try (var client = new TestClient(commandManager, "OK")) { + var value = client.customCommand(TEST_ARGS, ALL_NODES).get(); + assertEquals("OK", value.getSingleValue()); + } + } + + private static class TestClient extends GlideClusterClient { + + private final Object object; + + public TestClient(CommandManager commandManager, Object objectToReturn) { + super(null, commandManager); + object = objectToReturn; + } + + @Override + protected T handleRedisResponse( + Class classType, EnumSet flags, Response response) { + @SuppressWarnings("unchecked") + T returnValue = (T) object; + return returnValue; + } + + @Override + public void close() {} + } + + private static class TestCommandManager extends CommandManager { + + private final Response response; + + public TestCommandManager(Response responseToReturn) { + super(null); + response = responseToReturn != null ? responseToReturn : Response.newBuilder().build(); + } + + @Override + public CompletableFuture submitCommandToChannel( + CommandRequest.Builder command, RedisExceptionCheckedFunction responseHandler) { + return CompletableFuture.supplyAsync(() -> responseHandler.apply(response)); + } + } + + @SneakyThrows + @Test + public void exec_without_routing() { + // setup + Object[] value = new Object[] {"PONG", "PONG"}; + ClusterTransaction transaction = new ClusterTransaction().ping().ping(); + + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.submitNewTransaction( + eq(transaction), eq(Optional.empty()), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.exec(transaction); + Object[] payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertArrayEquals(value, payload); + } + + @SneakyThrows + @Test + public void exec_with_routing() { + // setup + Object[] value = new Object[] {"PONG", "PONG"}; + ClusterTransaction transaction = new ClusterTransaction().ping().ping(); + SingleNodeRoute route = RANDOM; + + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.submitNewTransaction( + eq(transaction), eq(Optional.of(route)), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.exec(transaction, route); + Object[] payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertArrayEquals(value, payload); + } + + @SneakyThrows + @Test + public void ping_returns_success() { + // setup + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete("PONG"); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(Ping), eq(new String[0]), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.ping(); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals("PONG", payload); + } + + @SneakyThrows + @Test + public void ping_with_message_returns_success() { + // setup + String message = "RETURN OF THE PONG"; + String[] arguments = new String[] {message}; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(message); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(Ping), eq(arguments), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.ping(message); + String pong = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(message, pong); + } + + @SneakyThrows + @Test + public void ping_with_route_returns_success() { + // setup + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete("PONG"); + + Route route = ALL_NODES; + + // match on protobuf request + when(commandManager.submitNewCommand(eq(Ping), eq(new String[0]), eq(route), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.ping(route); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals("PONG", payload); + } + + @SneakyThrows + @Test + public void ping_with_message_with_route_returns_success() { + // setup + String message = "RETURN OF THE PONG"; + String[] arguments = new String[] {message}; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(message); + + Route route = ALL_PRIMARIES; + + // match on protobuf request + when(commandManager.submitNewCommand(eq(Ping), eq(arguments), eq(route), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.ping(message, route); + String pong = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(message, pong); + } + + @SneakyThrows + @Test + public void echo_returns_success() { + // setup + String message = "GLIDE FOR REDIS"; + String[] arguments = new String[] {message}; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(message); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(Echo), eq(arguments), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.echo(message); + String echo = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(message, echo); + } + + @SneakyThrows + @Test + public void echo_binary_returns_success() { + // setup + GlideString message = gs("GLIDE FOR REDIS"); + GlideString[] arguments = new GlideString[] {message}; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(message); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(Echo), eq(arguments), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.echo(message); + GlideString echo = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(message, echo); + } + + @SneakyThrows + @Test + public void echo_with_route_returns_success() { + // setup + String message = "GLIDE FOR REDIS"; + String[] arguments = new String[] {message}; + CompletableFuture> testResponse = new CompletableFuture<>(); + testResponse.complete(ClusterValue.ofSingleValue(message)); + + // match on protobuf request + when(commandManager.>submitNewCommand( + eq(Echo), eq(arguments), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture> response = service.echo(message, RANDOM); + String echo = response.get().getSingleValue(); + + // verify + assertEquals(testResponse, response); + assertEquals(message, echo); + } + + @SneakyThrows + @Test + public void echo_binary_with_route_returns_success() { + // setup + GlideString message = gs("GLIDE FOR REDIS"); + GlideString[] arguments = new GlideString[] {message}; + CompletableFuture> testResponse = new CompletableFuture<>(); + testResponse.complete(ClusterValue.ofSingleValue(message)); + + // match on protobuf request + when(commandManager.>submitNewCommand( + eq(Echo), eq(arguments), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture> response = service.echo(message, RANDOM); + GlideString echo = response.get().getSingleValue(); + + // verify + assertEquals(testResponse, response); + assertEquals(message, echo); + } + + @SneakyThrows + @Test + public void info_returns_string() { + // setup + Map testPayload = new HashMap<>(); + testPayload.put("addr1", "value1"); + testPayload.put("addr2", "value2"); + testPayload.put("addr3", "value3"); + CompletableFuture> testResponse = new CompletableFuture<>(); + testResponse.complete(ClusterValue.of(testPayload)); + when(commandManager.>submitNewCommand(eq(Info), eq(new String[0]), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture> response = service.info(); + + // verify + ClusterValue clusterValue = response.get(); + assertTrue(clusterValue.hasMultiData()); + Map payload = clusterValue.getMultiValue(); + assertEquals(testPayload, payload); + } + + @SneakyThrows + @Test + public void info_with_route_returns_string() { + // setup + Map testClusterValue = Map.of("addr1", "addr1 result", "addr2", "addr2 result"); + Route route = ALL_NODES; + CompletableFuture> testResponse = new CompletableFuture<>(); + testResponse.complete(ClusterValue.of(testClusterValue)); + when(commandManager.>submitNewCommand( + eq(Info), eq(new String[0]), eq(route), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture> response = service.info(route); + + // verify + ClusterValue clusterValue = response.get(); + assertTrue(clusterValue.hasMultiData()); + Map clusterMap = clusterValue.getMultiValue(); + assertEquals("addr1 result", clusterMap.get("addr1")); + assertEquals("addr2 result", clusterMap.get("addr2")); + } + + @SneakyThrows + @Test + public void info_with_route_with_infoOptions_returns_string() { + // setup + String[] infoArguments = new String[] {"ALL", "DEFAULT"}; + Map testClusterValue = Map.of("addr1", "addr1 result", "addr2", "addr2 result"); + CompletableFuture> testResponse = new CompletableFuture<>(); + testResponse.complete(ClusterValue.of(testClusterValue)); + + Route route = ALL_PRIMARIES; + when(commandManager.>submitNewCommand( + eq(Info), eq(infoArguments), eq(route), any())) + .thenReturn(testResponse); + + // exercise + InfoOptions options = + InfoOptions.builder() + .section(InfoOptions.Section.ALL) + .section(InfoOptions.Section.DEFAULT) + .build(); + CompletableFuture> response = service.info(options, route); + + // verify + assertEquals(testResponse.get(), response.get()); + ClusterValue clusterValue = response.get(); + assertTrue(clusterValue.hasMultiData()); + Map clusterMap = clusterValue.getMultiValue(); + assertEquals("addr1 result", clusterMap.get("addr1")); + assertEquals("addr2 result", clusterMap.get("addr2")); + } + + @Test + @SneakyThrows + public void info_with_single_node_route_returns_single_value() { + var commandManager = new TestCommandManager(null); + + var data = "info string"; + try (var client = new TestClient(commandManager, data)) { + var value = client.info(RANDOM).get(); + assertAll( + () -> assertTrue(value.hasSingleData()), + () -> assertEquals(data, value.getSingleValue())); + } + } + + @Test + @SneakyThrows + public void info_with_multi_node_route_returns_multi_value() { + var commandManager = new TestCommandManager(null); + + var data = Map.of("key1", "value1", "key2", "value2"); + try (var client = new TestClient(commandManager, data)) { + var value = client.info(ALL_NODES).get(); + assertAll( + () -> assertTrue(value.hasMultiData()), () -> assertEquals(data, value.getMultiValue())); + } + } + + @Test + @SneakyThrows + public void info_with_options_and_single_node_route_returns_single_value() { + var commandManager = new TestCommandManager(null); + + var data = "info string"; + try (var client = new TestClient(commandManager, data)) { + var value = client.info(InfoOptions.builder().build(), RANDOM).get(); + assertAll( + () -> assertTrue(value.hasSingleData()), + () -> assertEquals(data, value.getSingleValue())); + } + } + + @Test + @SneakyThrows + public void info_with_options_and_multi_node_route_returns_multi_value() { + var commandManager = new TestCommandManager(null); + + var data = Map.of("key1", "value1", "key2", "value2"); + try (var client = new TestClient(commandManager, data)) { + var value = client.info(InfoOptions.builder().build(), ALL_NODES).get(); + assertAll( + () -> assertTrue(value.hasMultiData()), () -> assertEquals(data, value.getMultiValue())); + } + } + + @SneakyThrows + @Test + public void clientId_returns_success() { + // setup + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(42L); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(ClientId), eq(new String[0]), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.clientId(); + + // verify + assertEquals(testResponse, response); + assertEquals(42L, response.get()); + } + + @Test + @SneakyThrows + public void clientId_with_multi_node_route_returns_success() { + var commandManager = new TestCommandManager(null); + + var data = Map.of("n1", 42L); + try (var client = new TestClient(commandManager, data)) { + var value = client.clientId(ALL_NODES).get(); + + assertEquals(data, value.getMultiValue()); + } + } + + @Test + @SneakyThrows + public void clientId_with_single_node_route_returns_success() { + var commandManager = new TestCommandManager(null); + + try (var client = new TestClient(commandManager, 42L)) { + var value = client.clientId(RANDOM).get(); + assertEquals(42, value.getSingleValue()); + } + } + + @SneakyThrows + @Test + public void clientGetName_returns_success() { + // setup + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete("TEST"); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(ClientGetName), eq(new String[0]), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.clientGetName(); + + // verify + assertEquals(testResponse, response); + assertEquals("TEST", response.get()); + } + + @Test + @SneakyThrows + public void clientGetName_with_single_node_route_returns_success() { + var commandManager = new TestCommandManager(null); + + try (var client = new TestClient(commandManager, "TEST")) { + var value = client.clientGetName(RANDOM).get(); + assertEquals("TEST", value.getSingleValue()); + } + } + + @Test + @SneakyThrows + public void clientGetName_with_multi_node_route_returns_success() { + var commandManager = new TestCommandManager(null); + + var data = Map.of("n1", "TEST"); + try (var client = new TestClient(commandManager, data)) { + var value = client.clientGetName(ALL_NODES).get(); + assertEquals(data, value.getMultiValue()); + } + } + + @SneakyThrows + @Test + public void configRewrite_without_route_returns_success() { + // setup + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(OK); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(ConfigRewrite), eq(new String[0]), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.configRewrite(); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(OK, payload); + } + + @SneakyThrows + @Test + public void configRewrite_with_route_returns_success() { + // setup + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(OK); + + Route route = ALL_NODES; + + // match on protobuf request + when(commandManager.submitNewCommand( + eq(ConfigRewrite), eq(new String[0]), eq(route), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.configRewrite(route); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(OK, payload); + } + + @SneakyThrows + @Test + public void configResetStat_without_route_returns_success() { + // setup + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(OK); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(ConfigResetStat), eq(new String[0]), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.configResetStat(); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(OK, payload); + } + + @SneakyThrows + @Test + public void configResetStat_with_route_returns_success() { + // setup + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(OK); + + Route route = ALL_NODES; + + // match on protobuf request + when(commandManager.submitNewCommand( + eq(ConfigResetStat), eq(new String[0]), eq(route), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.configResetStat(route); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(OK, payload); + } + + // TODO copy/move tests from GlideClientTest which call super for coverage + @SneakyThrows + @Test + public void configGet_returns_success() { + // setup + var testPayload = Map.of("timeout", "1000"); + CompletableFuture> testResponse = new CompletableFuture<>(); + testResponse.complete(testPayload); + + // match on protobuf request + when(commandManager.>submitNewCommand( + eq(ConfigGet), eq(new String[] {"timeout"}), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture> response = service.configGet(new String[] {"timeout"}); + Map payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(testPayload, payload); + } + + @Test + @SneakyThrows + // test checks that even a map returned as a single value when single node route is used + public void configGet_with_single_node_route_returns_single_value() { + var commandManager = new TestCommandManager(null); + + var data = Map.of("timeout", "1000", "maxmemory", "1GB"); + try (var client = new TestClient(commandManager, data)) { + var value = client.configGet(TEST_ARGS, RANDOM).get(); + assertAll( + () -> assertTrue(value.hasSingleData()), + () -> assertEquals(data, value.getSingleValue())); + } + } + + @Test + @SneakyThrows + public void configGet_with_multi_node_route_returns_multi_value() { + var commandManager = new TestCommandManager(null); + + var data = Map.of("node1", Map.of("timeout", "1000", "maxmemory", "1GB")); + try (var client = new TestClient(commandManager, data)) { + var value = client.configGet(TEST_ARGS, ALL_NODES).get(); + assertAll( + () -> assertTrue(value.hasMultiData()), () -> assertEquals(data, value.getMultiValue())); + } + } + + @SneakyThrows + @Test + public void configSet_returns_success() { + // setup + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(OK); + + // match on protobuf request + when(commandManager.submitNewCommand( + eq(ConfigSet), eq(new String[] {"timeout", "1000"}), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.configSet(Map.of("timeout", "1000")); + + // verify + assertEquals(testResponse, response); + assertEquals(OK, response.get()); + } + + @SneakyThrows + @Test + public void configSet_with_route_returns_success() { + // setup + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(OK); + + // match on protobuf request + when(commandManager.submitNewCommand( + eq(ConfigSet), eq(new String[] {"value", "42"}), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.configSet(Map.of("value", "42"), RANDOM); + + // verify + assertEquals(testResponse, response); + assertEquals(OK, response.get()); + } + + @SneakyThrows + @Test + public void time_returns_success() { + // setup + + String[] payload = new String[] {"UnixTime", "ms"}; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(payload); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(Time), eq(new String[0]), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.time(); + + // verify + assertEquals(testResponse, response); + assertEquals(payload, response.get()); + } + + @SneakyThrows + @Test + public void time_returns_with_route_success() { + // setup + String[] payload = new String[] {"UnixTime", "ms"}; + CompletableFuture> testResponse = new CompletableFuture<>(); + testResponse.complete(ClusterValue.ofSingleValue(payload)); + + // match on protobuf request + when(commandManager.>submitNewCommand( + eq(Time), eq(new String[0]), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture> response = service.time(RANDOM); + + // verify + assertEquals(testResponse, response); + assertEquals(payload, response.get().getSingleValue()); + } + + @SneakyThrows + @Test + public void lastsave_returns_success() { + // setup + Long value = 42L; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(LastSave), eq(new String[0]), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.lastsave(); + + // verify + assertEquals(testResponse, response); + assertEquals(value, response.get()); + } + + @SneakyThrows + @Test + public void lastsave_returns_with_route_success() { + // setup + Long value = 42L; + CompletableFuture> testResponse = new CompletableFuture<>(); + testResponse.complete(ClusterValue.ofSingleValue(value)); + + // match on protobuf request + when(commandManager.>submitNewCommand( + eq(LastSave), eq(new String[0]), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture> response = service.lastsave(RANDOM); + + // verify + assertEquals(testResponse, response); + assertEquals(value, response.get().getSingleValue()); + } + + @SneakyThrows + @Test + public void flushall_returns_success() { + // setup + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(OK); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(FlushAll), eq(new String[0]), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.flushall(); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(OK, payload); + } + + @SneakyThrows + @Test + public void flushall_with_mode_returns_success() { + // setup + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(OK); + + // match on protobuf request + when(commandManager.submitNewCommand( + eq(FlushAll), eq(new String[] {SYNC.toString()}), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.flushall(SYNC); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(OK, payload); + } + + @SneakyThrows + @Test + public void flushall_with_route_returns_success() { + // setup + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(OK); + + // match on protobuf request + when(commandManager.submitNewCommand( + eq(FlushAll), eq(new String[0]), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.flushall(RANDOM); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(OK, payload); + } + + @SneakyThrows + @Test + public void flushall_with_route_and_mode_returns_success() { + // setup + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(OK); + + // match on protobuf request + when(commandManager.submitNewCommand( + eq(FlushAll), eq(new String[] {SYNC.toString()}), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.flushall(SYNC, RANDOM); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(OK, payload); + } + + @SneakyThrows + @Test + public void flushdb_returns_success() { + // setup + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(OK); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(FlushDB), eq(new String[0]), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.flushdb(); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(OK, payload); + } + + @SneakyThrows + @Test + public void flushdb_with_mode_returns_success() { + // setup + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(OK); + + // match on protobuf request + when(commandManager.submitNewCommand( + eq(FlushDB), eq(new String[] {SYNC.toString()}), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.flushdb(SYNC); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(OK, payload); + } + + @SneakyThrows + @Test + public void flushdb_with_route_returns_success() { + // setup + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(OK); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(FlushDB), eq(new String[0]), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.flushdb(RANDOM); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(OK, payload); + } + + @SneakyThrows + @Test + public void flushdb_with_route_and_mode_returns_success() { + // setup + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(OK); + + // match on protobuf request + when(commandManager.submitNewCommand( + eq(FlushDB), eq(new String[] {SYNC.toString()}), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.flushdb(SYNC, RANDOM); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(OK, payload); + } + + @SneakyThrows + @Test + public void lolwut_returns_success() { + // setup + String value = "pewpew"; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(Lolwut), eq(new String[0]), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.lolwut(); + + // verify + assertEquals(testResponse, response); + assertEquals(value, response.get()); + } + + @SneakyThrows + @Test + public void lolwut_with_params_returns_success() { + // setup + String value = "pewpew"; + String[] arguments = new String[] {"1", "2"}; + int[] params = new int[] {1, 2}; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(Lolwut), eq(arguments), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.lolwut(params); + + // verify + assertEquals(testResponse, response); + assertEquals(value, response.get()); + } + + @SneakyThrows + @Test + public void lolwut_with_version_returns_success() { + // setup + String value = "pewpew"; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.submitNewCommand( + eq(Lolwut), eq(new String[] {VERSION_REDIS_API, "42"}), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.lolwut(42); + + // verify + assertEquals(testResponse, response); + assertEquals(value, response.get()); + } + + @SneakyThrows + @Test + public void lolwut_with_version_and_params_returns_success() { + // setup + String value = "pewpew"; + String[] arguments = new String[] {VERSION_REDIS_API, "42", "1", "2"}; + int[] params = new int[] {1, 2}; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(Lolwut), eq(arguments), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.lolwut(42, params); + + // verify + assertEquals(testResponse, response); + assertEquals(value, response.get()); + } + + @SneakyThrows + @Test + public void lolwut_with_route_returns_success() { + // setup + ClusterValue value = ClusterValue.ofSingleValue("pewpew"); + CompletableFuture> testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.>submitNewCommand( + eq(Lolwut), eq(new String[0]), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture> response = service.lolwut(RANDOM); + + // verify + assertEquals(testResponse, response); + assertEquals(value, response.get()); + } + + @SneakyThrows + @Test + public void lolwut_with_params_and_route_returns_success() { + // setup + ClusterValue value = ClusterValue.ofSingleValue("pewpew"); + String[] arguments = new String[] {"1", "2"}; + int[] params = new int[] {1, 2}; + CompletableFuture> testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.>submitNewCommand( + eq(Lolwut), eq(arguments), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture> response = service.lolwut(params, RANDOM); + + // verify + assertEquals(testResponse, response); + assertEquals(value, response.get()); + } + + @SneakyThrows + @Test + public void lolwut_with_version_and_route_returns_success() { + // setup + ClusterValue value = ClusterValue.ofSingleValue("pewpew"); + CompletableFuture> testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.>submitNewCommand( + eq(Lolwut), eq(new String[] {VERSION_REDIS_API, "42"}), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture> response = service.lolwut(42, RANDOM); + + // verify + assertEquals(testResponse, response); + assertEquals(value, response.get()); + } + + @SneakyThrows + @Test + public void lolwut_with_version_and_params_and_route_returns_success() { + // setup + ClusterValue value = ClusterValue.ofSingleValue("pewpew"); + String[] arguments = new String[] {VERSION_REDIS_API, "42", "1", "2"}; + int[] params = new int[] {1, 2}; + CompletableFuture> testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.>submitNewCommand( + eq(Lolwut), eq(arguments), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture> response = service.lolwut(42, params, RANDOM); + + // verify + assertEquals(testResponse, response); + assertEquals(value, response.get()); + } + + @SneakyThrows + @Test + public void dbsize_returns_success() { + // setup + Long value = 10L; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(DBSize), eq(new String[0]), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.dbsize(); + + // verify + assertEquals(testResponse, response); + assertEquals(value, response.get()); + } + + @SneakyThrows + @Test + public void dbsize_with_route_returns_success() { + // setup + Long value = 10L; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.submitNewCommand( + eq(DBSize), eq(new String[0]), eq(ALL_PRIMARIES), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.dbsize(ALL_PRIMARIES); + + // verify + assertEquals(testResponse, response); + assertEquals(value, response.get()); + } + + @SneakyThrows + @Test + public void functionLoad_returns_success() { + // setup + String code = "The best code ever"; + String[] args = new String[] {code}; + String value = "42"; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(FunctionLoad), eq(args), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.functionLoad(code, false); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(value, payload); + } + + @SneakyThrows + @Test + public void functionLoad_with_replace_returns_success() { + // setup + String code = "The best code ever"; + String[] args = new String[] {FunctionLoadOptions.REPLACE.toString(), code}; + String value = "42"; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(FunctionLoad), eq(args), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.functionLoad(code, true); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(value, payload); + } + + @SneakyThrows + @Test + public void functionLoad_with_route_returns_success() { + // setup + String code = "The best code ever"; + String[] args = new String[] {code}; + String value = "42"; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(FunctionLoad), eq(args), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.functionLoad(code, false, RANDOM); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(value, payload); + } + + @SneakyThrows + @Test + public void functionLoad_with_replace_with_route_returns_success() { + // setup + String code = "The best code ever"; + String[] args = new String[] {FunctionLoadOptions.REPLACE.toString(), code}; + String value = "42"; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(FunctionLoad), eq(args), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.functionLoad(code, true, RANDOM); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(value, payload); + } + + @SneakyThrows + @Test + public void functionList_returns_success() { + // setup + String[] args = new String[0]; + @SuppressWarnings("unchecked") + Map[] value = new Map[0]; + CompletableFuture[]> testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.[]>submitNewCommand(eq(FunctionList), eq(args), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture[]> response = service.functionList(false); + Map[] payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(value, payload); + } + + @SneakyThrows + @Test + public void functionList_with_pattern_returns_success() { + // setup + String pattern = "*"; + String[] args = new String[] {LIBRARY_NAME_REDIS_API, pattern, WITH_CODE_REDIS_API}; + @SuppressWarnings("unchecked") + Map[] value = new Map[0]; + CompletableFuture[]> testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.[]>submitNewCommand(eq(FunctionList), eq(args), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture[]> response = service.functionList(pattern, true); + Map[] payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(value, payload); + } + + @SneakyThrows + @Test + public void functionList_with_route_returns_success() { + // setup + String[] args = new String[] {WITH_CODE_REDIS_API}; + @SuppressWarnings("unchecked") + Map[] value = new Map[0]; + CompletableFuture[]>> testResponse = new CompletableFuture<>(); + testResponse.complete(ClusterValue.ofSingleValue(value)); + + // match on protobuf request + when(commandManager.[]>>submitNewCommand( + eq(FunctionList), eq(args), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture[]>> response = + service.functionList(true, RANDOM); + ClusterValue[]> payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(value, payload.getSingleValue()); + } + + @SneakyThrows + @Test + public void functionList_with_pattern_and_route_returns_success() { + // setup + String pattern = "*"; + String[] args = new String[] {LIBRARY_NAME_REDIS_API, pattern}; + @SuppressWarnings("unchecked") + Map[] value = new Map[0]; + CompletableFuture[]>> testResponse = new CompletableFuture<>(); + testResponse.complete(ClusterValue.ofSingleValue(value)); + + // match on protobuf request + when(commandManager.[]>>submitNewCommand( + eq(FunctionList), eq(args), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture[]>> response = + service.functionList(pattern, false, RANDOM); + ClusterValue[]> payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(value, payload.getSingleValue()); + } + + @SneakyThrows + @Test + public void functionFlush_returns_success() { + // setup + String[] args = new String[0]; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(OK); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(FunctionFlush), eq(args), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.functionFlush(); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(OK, payload); + } + + @SneakyThrows + @Test + public void functionFlush_with_mode_returns_success() { + // setup + FlushMode mode = ASYNC; + String[] args = new String[] {mode.toString()}; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(OK); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(FunctionFlush), eq(args), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.functionFlush(mode); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(OK, payload); + } + + @SneakyThrows + @Test + public void functionFlush_with_route_returns_success() { + // setup + String[] args = new String[0]; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(OK); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(FunctionFlush), eq(args), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.functionFlush(RANDOM); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(OK, payload); + } + + @SneakyThrows + @Test + public void functionFlush_with_mode_and_route_returns_success() { + // setup + FlushMode mode = ASYNC; + String[] args = new String[] {mode.toString()}; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(OK); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(FunctionFlush), eq(args), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.functionFlush(mode, RANDOM); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(OK, payload); + } + + @SneakyThrows + @Test + public void functionDelete_returns_success() { + // setup + String libName = "GLIDE"; + String[] args = new String[] {libName}; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(OK); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(FunctionDelete), eq(args), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.functionDelete(libName); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(OK, payload); + } + + @SneakyThrows + @Test + public void functionDelete_with_route_returns_success() { + // setup + String libName = "GLIDE"; + String[] args = new String[] {libName}; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(OK); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(FunctionDelete), eq(args), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.functionDelete(libName, RANDOM); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(OK, payload); + } + + @SneakyThrows + @Test + public void unwatch_returns_success() { + // setup + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(OK); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(UnWatch), eq(new String[0]), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.unwatch(); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(OK, payload); + } + + @SneakyThrows + @Test + public void unwatch_with_route_returns_success() { + // setup + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(OK); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(UnWatch), eq(new String[0]), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.unwatch(RANDOM); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(OK, payload); + } + + @SneakyThrows + @Test + public void fcall_without_keys_and_without_args_returns_success() { + // setup + String function = "func"; + String[] args = new String[] {function, "0"}; + Object value = "42"; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(FCall), eq(args), any())).thenReturn(testResponse); + + // exercise + CompletableFuture response = service.fcall(function); + Object payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(value, payload); + } + + @SneakyThrows + @Test + public void fcall_without_keys_and_without_args_but_with_route_returns_success() { + // setup + String function = "func"; + String[] args = new String[] {function, "0"}; + ClusterValue value = ClusterValue.ofSingleValue("42"); + CompletableFuture> testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.>submitNewCommand( + eq(FCall), eq(args), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture> response = service.fcall(function, RANDOM); + ClusterValue payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(value, payload); + } + + @SneakyThrows + @Test + public void fcall_without_keys_returns_success() { + // setup + String function = "func"; + String[] arguments = new String[] {"1", "2"}; + String[] args = new String[] {function, "0", "1", "2"}; + Object value = "42"; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(FCall), eq(args), any())).thenReturn(testResponse); + + // exercise + CompletableFuture response = service.fcall(function, arguments); + Object payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(value, payload); + } + + @SneakyThrows + @Test + public void fcall_without_keys_and_with_route_returns_success() { + // setup + String function = "func"; + String[] arguments = new String[] {"1", "2"}; + String[] args = new String[] {function, "0", "1", "2"}; + ClusterValue value = ClusterValue.ofSingleValue("42"); + CompletableFuture> testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.>submitNewCommand( + eq(FCall), eq(args), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture> response = service.fcall(function, arguments, RANDOM); + ClusterValue payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(value, payload); + } + + @SneakyThrows + @Test + public void fcallReadOnly_without_keys_and_without_args_returns_success() { + // setup + String function = "func"; + String[] args = new String[] {function, "0"}; + Object value = "42"; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(FCallReadOnly), eq(args), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.fcallReadOnly(function); + Object payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(value, payload); + } + + @SneakyThrows + @Test + public void functionKill_returns_success() { + // setup + String[] args = new String[0]; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(OK); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(FunctionKill), eq(args), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.functionKill(); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(OK, payload); + } + + @SneakyThrows + @Test + public void functionKill_with_route_returns_success() { + // setup + String[] args = new String[0]; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(OK); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(FunctionKill), eq(args), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.functionKill(RANDOM); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(OK, payload); + } + + @SneakyThrows + @Test + public void functionStats_returns_success() { + // setup + String[] args = new String[0]; + ClusterValue>> value = + ClusterValue.ofSingleValue(Map.of("1", Map.of("2", 2))); + CompletableFuture>>> testResponse = + new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.>>>submitNewCommand( + eq(FunctionStats), eq(args), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture>>> response = + service.functionStats(); + ClusterValue>> payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(value, payload); + } + + @SneakyThrows + @Test + public void fcallReadOnly_without_keys_and_without_args_but_with_route_returns_success() { + // setup + String function = "func"; + String[] args = new String[] {function, "0"}; + ClusterValue value = ClusterValue.ofSingleValue("42"); + CompletableFuture> testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.>submitNewCommand( + eq(FCallReadOnly), eq(args), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture> response = service.fcallReadOnly(function, RANDOM); + ClusterValue payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(value, payload); + } + + @SneakyThrows + @Test + public void fcallReadOnly_without_keys_returns_success() { + // setup + String function = "func"; + String[] arguments = new String[] {"1", "2"}; + String[] args = new String[] {function, "0", "1", "2"}; + Object value = "42"; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(FCallReadOnly), eq(args), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.fcallReadOnly(function, arguments); + Object payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(value, payload); + } + + @SneakyThrows + @Test + public void fcallReadOnly_without_keys_and_with_route_returns_success() { + // setup + String function = "func"; + String[] arguments = new String[] {"1", "2"}; + String[] args = new String[] {function, "0", "1", "2"}; + ClusterValue value = ClusterValue.ofSingleValue("42"); + CompletableFuture> testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.>submitNewCommand( + eq(FCallReadOnly), eq(args), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture> response = + service.fcallReadOnly(function, arguments, RANDOM); + ClusterValue payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(value, payload); + } + + @SneakyThrows + @Test + public void functionStats_with_route_returns_success() { + // setup + String[] args = new String[0]; + ClusterValue>> value = + ClusterValue.ofSingleValue(Map.of("1", Map.of("2", 2))); + CompletableFuture>>> testResponse = + new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.>>>submitNewCommand( + eq(FunctionStats), eq(args), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture>>> response = + service.functionStats(RANDOM); + ClusterValue>> payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(value, payload); + } + + @SneakyThrows + @Test + public void functionDump_returns_success() { + // setup + byte[] value = new byte[] {42}; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(FunctionDump), eq(new GlideString[0]), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.functionDump(); + byte[] payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(value, payload); + } + + @SneakyThrows + @Test + public void functionDump_with_route_returns_success() { + // setup + ClusterValue value = ClusterValue.of(new byte[] {42}); + CompletableFuture> testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.>submitNewCommand( + eq(FunctionDump), eq(new GlideString[0]), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture> response = service.functionDump(RANDOM); + ClusterValue payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(value, payload); + } + + @SneakyThrows + @Test + public void functionRestore_returns_success() { + // setup + byte[] data = new byte[] {42}; + GlideString[] args = {gs(data)}; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(OK); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(FunctionRestore), eq(args), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.functionRestore(data); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(OK, payload); + } + + @SneakyThrows + @Test + public void functionRestore_with_policy_returns_success() { + // setup + byte[] data = new byte[] {42}; + GlideString[] args = {gs(data), gs(FunctionRestorePolicy.FLUSH.toString())}; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(OK); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(FunctionRestore), eq(args), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.functionRestore(data, FunctionRestorePolicy.FLUSH); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(OK, payload); + } + + @SneakyThrows + @Test + public void functionRestore_with_route_returns_success() { + // setup + byte[] data = new byte[] {42}; + GlideString[] args = {gs(data)}; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(OK); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(FunctionRestore), eq(args), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.functionRestore(data, RANDOM); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(OK, payload); + } + + @SneakyThrows + @Test + public void functionRestore_with_policy_and_route_returns_success() { + // setup + byte[] data = new byte[] {42}; + GlideString[] args = {gs(data), gs(FunctionRestorePolicy.FLUSH.toString())}; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(OK); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(FunctionRestore), eq(args), eq(RANDOM), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = + service.functionRestore(data, FunctionRestorePolicy.FLUSH, RANDOM); + String payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(OK, payload); + } + + @SneakyThrows + @Test + public void randomKey_with_route() { + // setup + String key1 = "key1"; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(key1); + Route route = ALL_NODES; + + // match on protobuf request + when(commandManager.submitNewCommand( + eq(RandomKey), eq(new String[0]), eq(route), any())) + .thenReturn(testResponse); + CompletableFuture response = service.randomKey(route); + + // verify + assertEquals(testResponse, response); + } + + @SneakyThrows + @Test + public void randomKey() { + // setup + String key1 = "key1"; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(key1); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(RandomKey), eq(new String[0]), any())) + .thenReturn(testResponse); + CompletableFuture response = service.randomKey(); + + // verify + assertEquals(testResponse, response); + } + + @SneakyThrows + @Test + public void sort_returns_success() { + // setup + String[] result = new String[] {"1", "2", "3"}; + String key = "key"; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(result); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(Sort), eq(new String[] {key}), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.sort(key); + String[] payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(result, payload); + } + + @SneakyThrows + @Test + public void sort_with_options_returns_success() { + // setup + String[] result = new String[] {"1", "2", "3"}; + String key = "key"; + Long limitOffset = 0L; + Long limitCount = 2L; + String[] args = + new String[] { + key, + LIMIT_COMMAND_STRING, + limitOffset.toString(), + limitCount.toString(), + DESC.toString(), + ALPHA_COMMAND_STRING + }; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(result); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(Sort), eq(args), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = + service.sort( + key, + SortClusterOptions.builder() + .alpha() + .limit(new Limit(limitOffset, limitCount)) + .orderBy(DESC) + .build()); + String[] payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(result, payload); + } + + @SneakyThrows + @Test + public void sortReadOnly_returns_success() { + // setup + String[] result = new String[] {"1", "2", "3"}; + String key = "key"; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(result); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(SortReadOnly), eq(new String[] {key}), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.sortReadOnly(key); + String[] payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(result, payload); + } + + @SneakyThrows + @Test + public void sortReadOnly_with_options_returns_success() { + // setup + String[] result = new String[] {"1", "2", "3"}; + String key = "key"; + Long limitOffset = 0L; + Long limitCount = 2L; + String[] args = + new String[] { + key, + LIMIT_COMMAND_STRING, + limitOffset.toString(), + limitCount.toString(), + DESC.toString(), + ALPHA_COMMAND_STRING + }; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(result); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(SortReadOnly), eq(args), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = + service.sortReadOnly( + key, + SortClusterOptions.builder() + .alpha() + .limit(new Limit(limitOffset, limitCount)) + .orderBy(DESC) + .build()); + String[] payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(result, payload); + } + + @SneakyThrows + @Test + public void sortStore_returns_success() { + // setup + Long result = 5L; + String key = "key"; + String destKey = "destKey"; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(result); + + // match on protobuf request + when(commandManager.submitNewCommand( + eq(Sort), eq(new String[] {key, STORE_COMMAND_STRING, destKey}), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.sortStore(key, destKey); + Long payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(result, payload); + } + + @SneakyThrows + @Test + public void sortStore_with_options_returns_success() { + // setup + Long result = 5L; + String key = "key"; + String destKey = "destKey"; + Long limitOffset = 0L; + Long limitCount = 2L; + String[] args = + new String[] { + key, + LIMIT_COMMAND_STRING, + limitOffset.toString(), + limitCount.toString(), + DESC.toString(), + ALPHA_COMMAND_STRING, + STORE_COMMAND_STRING, + destKey + }; + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(result); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(Sort), eq(args), any())).thenReturn(testResponse); + + // exercise + CompletableFuture response = + service.sortStore( + key, + destKey, + SortClusterOptions.builder() + .alpha() + .limit(new Limit(limitOffset, limitCount)) + .orderBy(DESC) + .build()); + Long payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(result, payload); + } +} diff --git a/java/client/src/test/java/glide/api/RedisClientTest.java b/java/client/src/test/java/glide/api/RedisClientTest.java index e254d364ba..0af8fa78e2 100644 --- a/java/client/src/test/java/glide/api/RedisClientTest.java +++ b/java/client/src/test/java/glide/api/RedisClientTest.java @@ -69,185 +69,185 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import static redis_request.RedisRequestOuterClass.RequestType.Append; -import static redis_request.RedisRequestOuterClass.RequestType.BLMPop; -import static redis_request.RedisRequestOuterClass.RequestType.BLMove; -import static redis_request.RedisRequestOuterClass.RequestType.BLPop; -import static redis_request.RedisRequestOuterClass.RequestType.BRPop; -import static redis_request.RedisRequestOuterClass.RequestType.BZMPop; -import static redis_request.RedisRequestOuterClass.RequestType.BZPopMax; -import static redis_request.RedisRequestOuterClass.RequestType.BZPopMin; -import static redis_request.RedisRequestOuterClass.RequestType.BitCount; -import static redis_request.RedisRequestOuterClass.RequestType.BitField; -import static redis_request.RedisRequestOuterClass.RequestType.BitFieldReadOnly; -import static redis_request.RedisRequestOuterClass.RequestType.BitOp; -import static redis_request.RedisRequestOuterClass.RequestType.BitPos; -import static redis_request.RedisRequestOuterClass.RequestType.ClientGetName; -import static redis_request.RedisRequestOuterClass.RequestType.ClientId; -import static redis_request.RedisRequestOuterClass.RequestType.ConfigGet; -import static redis_request.RedisRequestOuterClass.RequestType.ConfigResetStat; -import static redis_request.RedisRequestOuterClass.RequestType.ConfigRewrite; -import static redis_request.RedisRequestOuterClass.RequestType.ConfigSet; -import static redis_request.RedisRequestOuterClass.RequestType.Copy; -import static redis_request.RedisRequestOuterClass.RequestType.CustomCommand; -import static redis_request.RedisRequestOuterClass.RequestType.DBSize; -import static redis_request.RedisRequestOuterClass.RequestType.Decr; -import static redis_request.RedisRequestOuterClass.RequestType.DecrBy; -import static redis_request.RedisRequestOuterClass.RequestType.Del; -import static redis_request.RedisRequestOuterClass.RequestType.Dump; -import static redis_request.RedisRequestOuterClass.RequestType.Echo; -import static redis_request.RedisRequestOuterClass.RequestType.Exists; -import static redis_request.RedisRequestOuterClass.RequestType.Expire; -import static redis_request.RedisRequestOuterClass.RequestType.ExpireAt; -import static redis_request.RedisRequestOuterClass.RequestType.ExpireTime; -import static redis_request.RedisRequestOuterClass.RequestType.FCall; -import static redis_request.RedisRequestOuterClass.RequestType.FCallReadOnly; -import static redis_request.RedisRequestOuterClass.RequestType.FlushAll; -import static redis_request.RedisRequestOuterClass.RequestType.FlushDB; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionDelete; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionDump; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionFlush; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionKill; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionList; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionLoad; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionRestore; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionStats; -import static redis_request.RedisRequestOuterClass.RequestType.GeoAdd; -import static redis_request.RedisRequestOuterClass.RequestType.GeoDist; -import static redis_request.RedisRequestOuterClass.RequestType.GeoHash; -import static redis_request.RedisRequestOuterClass.RequestType.GeoPos; -import static redis_request.RedisRequestOuterClass.RequestType.Get; -import static redis_request.RedisRequestOuterClass.RequestType.GetBit; -import static redis_request.RedisRequestOuterClass.RequestType.GetDel; -import static redis_request.RedisRequestOuterClass.RequestType.GetEx; -import static redis_request.RedisRequestOuterClass.RequestType.GetRange; -import static redis_request.RedisRequestOuterClass.RequestType.HDel; -import static redis_request.RedisRequestOuterClass.RequestType.HExists; -import static redis_request.RedisRequestOuterClass.RequestType.HGet; -import static redis_request.RedisRequestOuterClass.RequestType.HGetAll; -import static redis_request.RedisRequestOuterClass.RequestType.HIncrBy; -import static redis_request.RedisRequestOuterClass.RequestType.HIncrByFloat; -import static redis_request.RedisRequestOuterClass.RequestType.HKeys; -import static redis_request.RedisRequestOuterClass.RequestType.HLen; -import static redis_request.RedisRequestOuterClass.RequestType.HMGet; -import static redis_request.RedisRequestOuterClass.RequestType.HRandField; -import static redis_request.RedisRequestOuterClass.RequestType.HSet; -import static redis_request.RedisRequestOuterClass.RequestType.HSetNX; -import static redis_request.RedisRequestOuterClass.RequestType.HStrlen; -import static redis_request.RedisRequestOuterClass.RequestType.HVals; -import static redis_request.RedisRequestOuterClass.RequestType.Incr; -import static redis_request.RedisRequestOuterClass.RequestType.IncrBy; -import static redis_request.RedisRequestOuterClass.RequestType.IncrByFloat; -import static redis_request.RedisRequestOuterClass.RequestType.Info; -import static redis_request.RedisRequestOuterClass.RequestType.LCS; -import static redis_request.RedisRequestOuterClass.RequestType.LIndex; -import static redis_request.RedisRequestOuterClass.RequestType.LInsert; -import static redis_request.RedisRequestOuterClass.RequestType.LLen; -import static redis_request.RedisRequestOuterClass.RequestType.LMPop; -import static redis_request.RedisRequestOuterClass.RequestType.LMove; -import static redis_request.RedisRequestOuterClass.RequestType.LPop; -import static redis_request.RedisRequestOuterClass.RequestType.LPos; -import static redis_request.RedisRequestOuterClass.RequestType.LPush; -import static redis_request.RedisRequestOuterClass.RequestType.LPushX; -import static redis_request.RedisRequestOuterClass.RequestType.LRange; -import static redis_request.RedisRequestOuterClass.RequestType.LRem; -import static redis_request.RedisRequestOuterClass.RequestType.LSet; -import static redis_request.RedisRequestOuterClass.RequestType.LTrim; -import static redis_request.RedisRequestOuterClass.RequestType.LastSave; -import static redis_request.RedisRequestOuterClass.RequestType.Lolwut; -import static redis_request.RedisRequestOuterClass.RequestType.MGet; -import static redis_request.RedisRequestOuterClass.RequestType.MSet; -import static redis_request.RedisRequestOuterClass.RequestType.MSetNX; -import static redis_request.RedisRequestOuterClass.RequestType.Move; -import static redis_request.RedisRequestOuterClass.RequestType.ObjectEncoding; -import static redis_request.RedisRequestOuterClass.RequestType.ObjectFreq; -import static redis_request.RedisRequestOuterClass.RequestType.ObjectIdleTime; -import static redis_request.RedisRequestOuterClass.RequestType.ObjectRefCount; -import static redis_request.RedisRequestOuterClass.RequestType.PExpire; -import static redis_request.RedisRequestOuterClass.RequestType.PExpireAt; -import static redis_request.RedisRequestOuterClass.RequestType.PExpireTime; -import static redis_request.RedisRequestOuterClass.RequestType.PTTL; -import static redis_request.RedisRequestOuterClass.RequestType.Persist; -import static redis_request.RedisRequestOuterClass.RequestType.PfAdd; -import static redis_request.RedisRequestOuterClass.RequestType.PfCount; -import static redis_request.RedisRequestOuterClass.RequestType.PfMerge; -import static redis_request.RedisRequestOuterClass.RequestType.Ping; -import static redis_request.RedisRequestOuterClass.RequestType.RPop; -import static redis_request.RedisRequestOuterClass.RequestType.RPush; -import static redis_request.RedisRequestOuterClass.RequestType.RPushX; -import static redis_request.RedisRequestOuterClass.RequestType.RandomKey; -import static redis_request.RedisRequestOuterClass.RequestType.Rename; -import static redis_request.RedisRequestOuterClass.RequestType.RenameNX; -import static redis_request.RedisRequestOuterClass.RequestType.Restore; -import static redis_request.RedisRequestOuterClass.RequestType.SAdd; -import static redis_request.RedisRequestOuterClass.RequestType.SCard; -import static redis_request.RedisRequestOuterClass.RequestType.SDiff; -import static redis_request.RedisRequestOuterClass.RequestType.SDiffStore; -import static redis_request.RedisRequestOuterClass.RequestType.SInter; -import static redis_request.RedisRequestOuterClass.RequestType.SInterCard; -import static redis_request.RedisRequestOuterClass.RequestType.SInterStore; -import static redis_request.RedisRequestOuterClass.RequestType.SIsMember; -import static redis_request.RedisRequestOuterClass.RequestType.SMIsMember; -import static redis_request.RedisRequestOuterClass.RequestType.SMembers; -import static redis_request.RedisRequestOuterClass.RequestType.SMove; -import static redis_request.RedisRequestOuterClass.RequestType.SPop; -import static redis_request.RedisRequestOuterClass.RequestType.SRandMember; -import static redis_request.RedisRequestOuterClass.RequestType.SRem; -import static redis_request.RedisRequestOuterClass.RequestType.SUnion; -import static redis_request.RedisRequestOuterClass.RequestType.SUnionStore; -import static redis_request.RedisRequestOuterClass.RequestType.Select; -import static redis_request.RedisRequestOuterClass.RequestType.SetBit; -import static redis_request.RedisRequestOuterClass.RequestType.SetRange; -import static redis_request.RedisRequestOuterClass.RequestType.Sort; -import static redis_request.RedisRequestOuterClass.RequestType.SortReadOnly; -import static redis_request.RedisRequestOuterClass.RequestType.Strlen; -import static redis_request.RedisRequestOuterClass.RequestType.TTL; -import static redis_request.RedisRequestOuterClass.RequestType.Time; -import static redis_request.RedisRequestOuterClass.RequestType.Touch; -import static redis_request.RedisRequestOuterClass.RequestType.Type; -import static redis_request.RedisRequestOuterClass.RequestType.UnWatch; -import static redis_request.RedisRequestOuterClass.RequestType.Unlink; -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.XDel; -import static redis_request.RedisRequestOuterClass.RequestType.XGroupCreate; -import static redis_request.RedisRequestOuterClass.RequestType.XGroupCreateConsumer; -import static redis_request.RedisRequestOuterClass.RequestType.XGroupDelConsumer; -import static redis_request.RedisRequestOuterClass.RequestType.XGroupDestroy; -import static redis_request.RedisRequestOuterClass.RequestType.XLen; -import static redis_request.RedisRequestOuterClass.RequestType.XPending; -import static redis_request.RedisRequestOuterClass.RequestType.XRange; -import static redis_request.RedisRequestOuterClass.RequestType.XRead; -import static redis_request.RedisRequestOuterClass.RequestType.XReadGroup; -import static redis_request.RedisRequestOuterClass.RequestType.XRevRange; -import static redis_request.RedisRequestOuterClass.RequestType.XTrim; -import static redis_request.RedisRequestOuterClass.RequestType.ZAdd; -import static redis_request.RedisRequestOuterClass.RequestType.ZCard; -import static redis_request.RedisRequestOuterClass.RequestType.ZCount; -import static redis_request.RedisRequestOuterClass.RequestType.ZDiff; -import static redis_request.RedisRequestOuterClass.RequestType.ZDiffStore; -import static redis_request.RedisRequestOuterClass.RequestType.ZIncrBy; -import static redis_request.RedisRequestOuterClass.RequestType.ZInter; -import static redis_request.RedisRequestOuterClass.RequestType.ZInterCard; -import static redis_request.RedisRequestOuterClass.RequestType.ZInterStore; -import static redis_request.RedisRequestOuterClass.RequestType.ZLexCount; -import static redis_request.RedisRequestOuterClass.RequestType.ZMPop; -import static redis_request.RedisRequestOuterClass.RequestType.ZMScore; -import static redis_request.RedisRequestOuterClass.RequestType.ZPopMax; -import static redis_request.RedisRequestOuterClass.RequestType.ZPopMin; -import static redis_request.RedisRequestOuterClass.RequestType.ZRandMember; -import static redis_request.RedisRequestOuterClass.RequestType.ZRange; -import static redis_request.RedisRequestOuterClass.RequestType.ZRangeStore; -import static redis_request.RedisRequestOuterClass.RequestType.ZRank; -import static redis_request.RedisRequestOuterClass.RequestType.ZRem; -import static redis_request.RedisRequestOuterClass.RequestType.ZRemRangeByLex; -import static redis_request.RedisRequestOuterClass.RequestType.ZRemRangeByRank; -import static redis_request.RedisRequestOuterClass.RequestType.ZRemRangeByScore; -import static redis_request.RedisRequestOuterClass.RequestType.ZRevRank; -import static redis_request.RedisRequestOuterClass.RequestType.ZScore; -import static redis_request.RedisRequestOuterClass.RequestType.ZUnion; -import static redis_request.RedisRequestOuterClass.RequestType.ZUnionStore; +import static command_request.CommandRequestOuterClass.RequestType.Append; +import static command_request.CommandRequestOuterClass.RequestType.BLMPop; +import static command_request.CommandRequestOuterClass.RequestType.BLMove; +import static command_request.CommandRequestOuterClass.RequestType.BLPop; +import static command_request.CommandRequestOuterClass.RequestType.BRPop; +import static command_request.CommandRequestOuterClass.RequestType.BZMPop; +import static command_request.CommandRequestOuterClass.RequestType.BZPopMax; +import static command_request.CommandRequestOuterClass.RequestType.BZPopMin; +import static command_request.CommandRequestOuterClass.RequestType.BitCount; +import static command_request.CommandRequestOuterClass.RequestType.BitField; +import static command_request.CommandRequestOuterClass.RequestType.BitFieldReadOnly; +import static command_request.CommandRequestOuterClass.RequestType.BitOp; +import static command_request.CommandRequestOuterClass.RequestType.BitPos; +import static command_request.CommandRequestOuterClass.RequestType.ClientGetName; +import static command_request.CommandRequestOuterClass.RequestType.ClientId; +import static command_request.CommandRequestOuterClass.RequestType.ConfigGet; +import static command_request.CommandRequestOuterClass.RequestType.ConfigResetStat; +import static command_request.CommandRequestOuterClass.RequestType.ConfigRewrite; +import static command_request.CommandRequestOuterClass.RequestType.ConfigSet; +import static command_request.CommandRequestOuterClass.RequestType.Copy; +import static command_request.CommandRequestOuterClass.RequestType.CustomCommand; +import static command_request.CommandRequestOuterClass.RequestType.DBSize; +import static command_request.CommandRequestOuterClass.RequestType.Decr; +import static command_request.CommandRequestOuterClass.RequestType.DecrBy; +import static command_request.CommandRequestOuterClass.RequestType.Del; +import static command_request.CommandRequestOuterClass.RequestType.Dump; +import static command_request.CommandRequestOuterClass.RequestType.Echo; +import static command_request.CommandRequestOuterClass.RequestType.Exists; +import static command_request.CommandRequestOuterClass.RequestType.Expire; +import static command_request.CommandRequestOuterClass.RequestType.ExpireAt; +import static command_request.CommandRequestOuterClass.RequestType.ExpireTime; +import static command_request.CommandRequestOuterClass.RequestType.FCall; +import static command_request.CommandRequestOuterClass.RequestType.FCallReadOnly; +import static command_request.CommandRequestOuterClass.RequestType.FlushAll; +import static command_request.CommandRequestOuterClass.RequestType.FlushDB; +import static command_request.CommandRequestOuterClass.RequestType.FunctionDelete; +import static command_request.CommandRequestOuterClass.RequestType.FunctionDump; +import static command_request.CommandRequestOuterClass.RequestType.FunctionFlush; +import static command_request.CommandRequestOuterClass.RequestType.FunctionKill; +import static command_request.CommandRequestOuterClass.RequestType.FunctionList; +import static command_request.CommandRequestOuterClass.RequestType.FunctionLoad; +import static command_request.CommandRequestOuterClass.RequestType.FunctionRestore; +import static command_request.CommandRequestOuterClass.RequestType.FunctionStats; +import static command_request.CommandRequestOuterClass.RequestType.GeoAdd; +import static command_request.CommandRequestOuterClass.RequestType.GeoDist; +import static command_request.CommandRequestOuterClass.RequestType.GeoHash; +import static command_request.CommandRequestOuterClass.RequestType.GeoPos; +import static command_request.CommandRequestOuterClass.RequestType.Get; +import static command_request.CommandRequestOuterClass.RequestType.GetBit; +import static command_request.CommandRequestOuterClass.RequestType.GetDel; +import static command_request.CommandRequestOuterClass.RequestType.GetEx; +import static command_request.CommandRequestOuterClass.RequestType.GetRange; +import static command_request.CommandRequestOuterClass.RequestType.HDel; +import static command_request.CommandRequestOuterClass.RequestType.HExists; +import static command_request.CommandRequestOuterClass.RequestType.HGet; +import static command_request.CommandRequestOuterClass.RequestType.HGetAll; +import static command_request.CommandRequestOuterClass.RequestType.HIncrBy; +import static command_request.CommandRequestOuterClass.RequestType.HIncrByFloat; +import static command_request.CommandRequestOuterClass.RequestType.HKeys; +import static command_request.CommandRequestOuterClass.RequestType.HLen; +import static command_request.CommandRequestOuterClass.RequestType.HMGet; +import static command_request.CommandRequestOuterClass.RequestType.HRandField; +import static command_request.CommandRequestOuterClass.RequestType.HSet; +import static command_request.CommandRequestOuterClass.RequestType.HSetNX; +import static command_request.CommandRequestOuterClass.RequestType.HStrlen; +import static command_request.CommandRequestOuterClass.RequestType.HVals; +import static command_request.CommandRequestOuterClass.RequestType.Incr; +import static command_request.CommandRequestOuterClass.RequestType.IncrBy; +import static command_request.CommandRequestOuterClass.RequestType.IncrByFloat; +import static command_request.CommandRequestOuterClass.RequestType.Info; +import static command_request.CommandRequestOuterClass.RequestType.LCS; +import static command_request.CommandRequestOuterClass.RequestType.LIndex; +import static command_request.CommandRequestOuterClass.RequestType.LInsert; +import static command_request.CommandRequestOuterClass.RequestType.LLen; +import static command_request.CommandRequestOuterClass.RequestType.LMPop; +import static command_request.CommandRequestOuterClass.RequestType.LMove; +import static command_request.CommandRequestOuterClass.RequestType.LPop; +import static command_request.CommandRequestOuterClass.RequestType.LPos; +import static command_request.CommandRequestOuterClass.RequestType.LPush; +import static command_request.CommandRequestOuterClass.RequestType.LPushX; +import static command_request.CommandRequestOuterClass.RequestType.LRange; +import static command_request.CommandRequestOuterClass.RequestType.LRem; +import static command_request.CommandRequestOuterClass.RequestType.LSet; +import static command_request.CommandRequestOuterClass.RequestType.LTrim; +import static command_request.CommandRequestOuterClass.RequestType.LastSave; +import static command_request.CommandRequestOuterClass.RequestType.Lolwut; +import static command_request.CommandRequestOuterClass.RequestType.MGet; +import static command_request.CommandRequestOuterClass.RequestType.MSet; +import static command_request.CommandRequestOuterClass.RequestType.MSetNX; +import static command_request.CommandRequestOuterClass.RequestType.Move; +import static command_request.CommandRequestOuterClass.RequestType.ObjectEncoding; +import static command_request.CommandRequestOuterClass.RequestType.ObjectFreq; +import static command_request.CommandRequestOuterClass.RequestType.ObjectIdleTime; +import static command_request.CommandRequestOuterClass.RequestType.ObjectRefCount; +import static command_request.CommandRequestOuterClass.RequestType.PExpire; +import static command_request.CommandRequestOuterClass.RequestType.PExpireAt; +import static command_request.CommandRequestOuterClass.RequestType.PExpireTime; +import static command_request.CommandRequestOuterClass.RequestType.PTTL; +import static command_request.CommandRequestOuterClass.RequestType.Persist; +import static command_request.CommandRequestOuterClass.RequestType.PfAdd; +import static command_request.CommandRequestOuterClass.RequestType.PfCount; +import static command_request.CommandRequestOuterClass.RequestType.PfMerge; +import static command_request.CommandRequestOuterClass.RequestType.Ping; +import static command_request.CommandRequestOuterClass.RequestType.RPop; +import static command_request.CommandRequestOuterClass.RequestType.RPush; +import static command_request.CommandRequestOuterClass.RequestType.RPushX; +import static command_request.CommandRequestOuterClass.RequestType.RandomKey; +import static command_request.CommandRequestOuterClass.RequestType.Rename; +import static command_request.CommandRequestOuterClass.RequestType.RenameNX; +import static command_request.CommandRequestOuterClass.RequestType.Restore; +import static command_request.CommandRequestOuterClass.RequestType.SAdd; +import static command_request.CommandRequestOuterClass.RequestType.SCard; +import static command_request.CommandRequestOuterClass.RequestType.SDiff; +import static command_request.CommandRequestOuterClass.RequestType.SDiffStore; +import static command_request.CommandRequestOuterClass.RequestType.SInter; +import static command_request.CommandRequestOuterClass.RequestType.SInterCard; +import static command_request.CommandRequestOuterClass.RequestType.SInterStore; +import static command_request.CommandRequestOuterClass.RequestType.SIsMember; +import static command_request.CommandRequestOuterClass.RequestType.SMIsMember; +import static command_request.CommandRequestOuterClass.RequestType.SMembers; +import static command_request.CommandRequestOuterClass.RequestType.SMove; +import static command_request.CommandRequestOuterClass.RequestType.SPop; +import static command_request.CommandRequestOuterClass.RequestType.SRandMember; +import static command_request.CommandRequestOuterClass.RequestType.SRem; +import static command_request.CommandRequestOuterClass.RequestType.SUnion; +import static command_request.CommandRequestOuterClass.RequestType.SUnionStore; +import static command_request.CommandRequestOuterClass.RequestType.Select; +import static command_request.CommandRequestOuterClass.RequestType.SetBit; +import static command_request.CommandRequestOuterClass.RequestType.SetRange; +import static command_request.CommandRequestOuterClass.RequestType.Sort; +import static command_request.CommandRequestOuterClass.RequestType.SortReadOnly; +import static command_request.CommandRequestOuterClass.RequestType.Strlen; +import static command_request.CommandRequestOuterClass.RequestType.TTL; +import static command_request.CommandRequestOuterClass.RequestType.Time; +import static command_request.CommandRequestOuterClass.RequestType.Touch; +import static command_request.CommandRequestOuterClass.RequestType.Type; +import static command_request.CommandRequestOuterClass.RequestType.UnWatch; +import static command_request.CommandRequestOuterClass.RequestType.Unlink; +import static command_request.CommandRequestOuterClass.RequestType.Watch; +import static command_request.CommandRequestOuterClass.RequestType.XAck; +import static command_request.CommandRequestOuterClass.RequestType.XAdd; +import static command_request.CommandRequestOuterClass.RequestType.XDel; +import static command_request.CommandRequestOuterClass.RequestType.XGroupCreate; +import static command_request.CommandRequestOuterClass.RequestType.XGroupCreateConsumer; +import static command_request.CommandRequestOuterClass.RequestType.XGroupDelConsumer; +import static command_request.CommandRequestOuterClass.RequestType.XGroupDestroy; +import static command_request.CommandRequestOuterClass.RequestType.XLen; +import static command_request.CommandRequestOuterClass.RequestType.XPending; +import static command_request.CommandRequestOuterClass.RequestType.XRange; +import static command_request.CommandRequestOuterClass.RequestType.XRead; +import static command_request.CommandRequestOuterClass.RequestType.XReadGroup; +import static command_request.CommandRequestOuterClass.RequestType.XRevRange; +import static command_request.CommandRequestOuterClass.RequestType.XTrim; +import static command_request.CommandRequestOuterClass.RequestType.ZAdd; +import static command_request.CommandRequestOuterClass.RequestType.ZCard; +import static command_request.CommandRequestOuterClass.RequestType.ZCount; +import static command_request.CommandRequestOuterClass.RequestType.ZDiff; +import static command_request.CommandRequestOuterClass.RequestType.ZDiffStore; +import static command_request.CommandRequestOuterClass.RequestType.ZIncrBy; +import static command_request.CommandRequestOuterClass.RequestType.ZInter; +import static command_request.CommandRequestOuterClass.RequestType.ZInterCard; +import static command_request.CommandRequestOuterClass.RequestType.ZInterStore; +import static command_request.CommandRequestOuterClass.RequestType.ZLexCount; +import static command_request.CommandRequestOuterClass.RequestType.ZMPop; +import static command_request.CommandRequestOuterClass.RequestType.ZMScore; +import static command_request.CommandRequestOuterClass.RequestType.ZPopMax; +import static command_request.CommandRequestOuterClass.RequestType.ZPopMin; +import static command_request.CommandRequestOuterClass.RequestType.ZRandMember; +import static command_request.CommandRequestOuterClass.RequestType.ZRange; +import static command_request.CommandRequestOuterClass.RequestType.ZRangeStore; +import static command_request.CommandRequestOuterClass.RequestType.ZRank; +import static command_request.CommandRequestOuterClass.RequestType.ZRem; +import static command_request.CommandRequestOuterClass.RequestType.ZRemRangeByLex; +import static command_request.CommandRequestOuterClass.RequestType.ZRemRangeByRank; +import static command_request.CommandRequestOuterClass.RequestType.ZRemRangeByScore; +import static command_request.CommandRequestOuterClass.RequestType.ZRevRank; +import static command_request.CommandRequestOuterClass.RequestType.ZScore; +import static command_request.CommandRequestOuterClass.RequestType.ZUnion; +import static command_request.CommandRequestOuterClass.RequestType.ZUnionStore; import glide.api.models.GlideString; import glide.api.models.Script; @@ -322,7 +322,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import redis_request.RedisRequestOuterClass.RequestType; +import command_request.CommandRequestOuterClass.RequestType; public class RedisClientTest { diff --git a/java/client/src/test/java/glide/api/RedisClusterClientTest.java b/java/client/src/test/java/glide/api/RedisClusterClientTest.java index 7a82ff5e35..0a38b01122 100644 --- a/java/client/src/test/java/glide/api/RedisClusterClientTest.java +++ b/java/client/src/test/java/glide/api/RedisClusterClientTest.java @@ -26,35 +26,35 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import static redis_request.RedisRequestOuterClass.RequestType.ClientGetName; -import static redis_request.RedisRequestOuterClass.RequestType.ClientId; -import static redis_request.RedisRequestOuterClass.RequestType.ConfigGet; -import static redis_request.RedisRequestOuterClass.RequestType.ConfigResetStat; -import static redis_request.RedisRequestOuterClass.RequestType.ConfigRewrite; -import static redis_request.RedisRequestOuterClass.RequestType.ConfigSet; -import static redis_request.RedisRequestOuterClass.RequestType.DBSize; -import static redis_request.RedisRequestOuterClass.RequestType.Echo; -import static redis_request.RedisRequestOuterClass.RequestType.FCall; -import static redis_request.RedisRequestOuterClass.RequestType.FCallReadOnly; -import static redis_request.RedisRequestOuterClass.RequestType.FlushAll; -import static redis_request.RedisRequestOuterClass.RequestType.FlushDB; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionDelete; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionDump; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionFlush; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionKill; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionList; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionLoad; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionRestore; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionStats; -import static redis_request.RedisRequestOuterClass.RequestType.Info; -import static redis_request.RedisRequestOuterClass.RequestType.LastSave; -import static redis_request.RedisRequestOuterClass.RequestType.Lolwut; -import static redis_request.RedisRequestOuterClass.RequestType.Ping; -import static redis_request.RedisRequestOuterClass.RequestType.RandomKey; -import static redis_request.RedisRequestOuterClass.RequestType.Sort; -import static redis_request.RedisRequestOuterClass.RequestType.SortReadOnly; -import static redis_request.RedisRequestOuterClass.RequestType.Time; -import static redis_request.RedisRequestOuterClass.RequestType.UnWatch; +import static command_request.CommandRequestOuterClass.RequestType.ClientGetName; +import static command_request.CommandRequestOuterClass.RequestType.ClientId; +import static command_request.CommandRequestOuterClass.RequestType.ConfigGet; +import static command_request.CommandRequestOuterClass.RequestType.ConfigResetStat; +import static command_request.CommandRequestOuterClass.RequestType.ConfigRewrite; +import static command_request.CommandRequestOuterClass.RequestType.ConfigSet; +import static command_request.CommandRequestOuterClass.RequestType.DBSize; +import static command_request.CommandRequestOuterClass.RequestType.Echo; +import static command_request.CommandRequestOuterClass.RequestType.FCall; +import static command_request.CommandRequestOuterClass.RequestType.FCallReadOnly; +import static command_request.CommandRequestOuterClass.RequestType.FlushAll; +import static command_request.CommandRequestOuterClass.RequestType.FlushDB; +import static command_request.CommandRequestOuterClass.RequestType.FunctionDelete; +import static command_request.CommandRequestOuterClass.RequestType.FunctionDump; +import static command_request.CommandRequestOuterClass.RequestType.FunctionFlush; +import static command_request.CommandRequestOuterClass.RequestType.FunctionKill; +import static command_request.CommandRequestOuterClass.RequestType.FunctionList; +import static command_request.CommandRequestOuterClass.RequestType.FunctionLoad; +import static command_request.CommandRequestOuterClass.RequestType.FunctionRestore; +import static command_request.CommandRequestOuterClass.RequestType.FunctionStats; +import static command_request.CommandRequestOuterClass.RequestType.Info; +import static command_request.CommandRequestOuterClass.RequestType.LastSave; +import static command_request.CommandRequestOuterClass.RequestType.Lolwut; +import static command_request.CommandRequestOuterClass.RequestType.Ping; +import static command_request.CommandRequestOuterClass.RequestType.RandomKey; +import static command_request.CommandRequestOuterClass.RequestType.Sort; +import static command_request.CommandRequestOuterClass.RequestType.SortReadOnly; +import static command_request.CommandRequestOuterClass.RequestType.Time; +import static command_request.CommandRequestOuterClass.RequestType.UnWatch; import glide.api.models.ClusterTransaction; import glide.api.models.ClusterValue; @@ -78,7 +78,7 @@ import lombok.SneakyThrows; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import redis_request.RedisRequestOuterClass.RedisRequest; +import command_request.CommandRequestOuterClass.CommandRequest; import response.ResponseOuterClass.ConstantResponse; import response.ResponseOuterClass.Response; @@ -192,7 +192,7 @@ public TestCommandManager(Response responseToReturn) { @Override public CompletableFuture submitCommandToChannel( - RedisRequest.Builder command, RedisExceptionCheckedFunction responseHandler) { + CommandRequest.Builder command, RedisExceptionCheckedFunction responseHandler) { return CompletableFuture.supplyAsync(() -> responseHandler.apply(response)); } } diff --git a/java/client/src/test/java/glide/api/models/ClusterTransactionTests.java b/java/client/src/test/java/glide/api/models/ClusterTransactionTests.java index c33a927792..fa1bf8b911 100644 --- a/java/client/src/test/java/glide/api/models/ClusterTransactionTests.java +++ b/java/client/src/test/java/glide/api/models/ClusterTransactionTests.java @@ -7,8 +7,8 @@ import static glide.api.models.commands.SortBaseOptions.OrderBy.ASC; import static glide.api.models.commands.SortBaseOptions.STORE_COMMAND_STRING; import static org.junit.jupiter.api.Assertions.assertEquals; -import static redis_request.RedisRequestOuterClass.RequestType.Sort; -import static redis_request.RedisRequestOuterClass.RequestType.SortReadOnly; +import static command_request.CommandRequestOuterClass.RequestType.Sort; +import static command_request.CommandRequestOuterClass.RequestType.SortReadOnly; import glide.api.models.commands.SortBaseOptions; import glide.api.models.commands.SortClusterOptions; @@ -19,7 +19,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import redis_request.RedisRequestOuterClass; +import command_request.CommandRequestOuterClass; public class ClusterTransactionTests { private static Stream getTransactionBuilders() { @@ -30,7 +30,7 @@ private static Stream getTransactionBuilders() { @ParameterizedTest @MethodSource("getTransactionBuilders") public void cluster_transaction_builds_protobuf_request(ClusterTransaction transaction) { - List> + List> results = new LinkedList<>(); transaction.sortReadOnly( @@ -83,7 +83,7 @@ public void cluster_transaction_builds_protobuf_request(ClusterTransaction trans var protobufTransaction = transaction.getProtobufTransaction().build(); for (int idx = 0; idx < protobufTransaction.getCommandsCount(); idx++) { - RedisRequestOuterClass.Command protobuf = protobufTransaction.getCommands(idx); + CommandRequestOuterClass.Command protobuf = protobufTransaction.getCommands(idx); assertEquals(results.get(idx).getLeft(), protobuf.getRequestType()); assertEquals( diff --git a/java/client/src/test/java/glide/api/models/StandaloneTransactionTests.java b/java/client/src/test/java/glide/api/models/StandaloneTransactionTests.java index 50331e1d96..4e9de06f04 100644 --- a/java/client/src/test/java/glide/api/models/StandaloneTransactionTests.java +++ b/java/client/src/test/java/glide/api/models/StandaloneTransactionTests.java @@ -12,23 +12,23 @@ import static glide.api.models.commands.SortOptions.BY_COMMAND_STRING; import static glide.api.models.commands.SortOptions.GET_COMMAND_STRING; import static org.junit.jupiter.api.Assertions.assertEquals; -import static redis_request.RedisRequestOuterClass.RequestType.Copy; -import static redis_request.RedisRequestOuterClass.RequestType.Move; -import static redis_request.RedisRequestOuterClass.RequestType.Select; -import static redis_request.RedisRequestOuterClass.RequestType.Sort; -import static redis_request.RedisRequestOuterClass.RequestType.SortReadOnly; +import static command_request.CommandRequestOuterClass.RequestType.Copy; +import static command_request.CommandRequestOuterClass.RequestType.Move; +import static command_request.CommandRequestOuterClass.RequestType.Select; +import static command_request.CommandRequestOuterClass.RequestType.Sort; +import static command_request.CommandRequestOuterClass.RequestType.SortReadOnly; import glide.api.models.commands.SortOptions; import java.util.LinkedList; import java.util.List; import org.apache.commons.lang3.tuple.Pair; import org.junit.jupiter.api.Test; -import redis_request.RedisRequestOuterClass; +import command_request.CommandRequestOuterClass; public class StandaloneTransactionTests { @Test public void standalone_transaction_commands() { - List> + List> results = new LinkedList<>(); Transaction transaction = new Transaction(); @@ -175,7 +175,7 @@ public void standalone_transaction_commands() { var protobufTransaction = transaction.getProtobufTransaction().build(); for (int idx = 0; idx < protobufTransaction.getCommandsCount(); idx++) { - RedisRequestOuterClass.Command protobuf = protobufTransaction.getCommands(idx); + CommandRequestOuterClass.Command protobuf = protobufTransaction.getCommands(idx); assertEquals(results.get(idx).getLeft(), protobuf.getRequestType()); assertEquals( diff --git a/java/client/src/test/java/glide/api/models/TransactionTests.java b/java/client/src/test/java/glide/api/models/TransactionTests.java index a0512764ec..9a22f52f17 100644 --- a/java/client/src/test/java/glide/api/models/TransactionTests.java +++ b/java/client/src/test/java/glide/api/models/TransactionTests.java @@ -43,176 +43,176 @@ import static glide.api.models.commands.stream.StreamTrimOptions.TRIM_EXACT_REDIS_API; import static glide.api.models.commands.stream.StreamTrimOptions.TRIM_MINID_REDIS_API; import static org.junit.jupiter.api.Assertions.assertEquals; -import static redis_request.RedisRequestOuterClass.RequestType.Append; -import static redis_request.RedisRequestOuterClass.RequestType.BLMPop; -import static redis_request.RedisRequestOuterClass.RequestType.BLMove; -import static redis_request.RedisRequestOuterClass.RequestType.BLPop; -import static redis_request.RedisRequestOuterClass.RequestType.BRPop; -import static redis_request.RedisRequestOuterClass.RequestType.BZMPop; -import static redis_request.RedisRequestOuterClass.RequestType.BZPopMax; -import static redis_request.RedisRequestOuterClass.RequestType.BZPopMin; -import static redis_request.RedisRequestOuterClass.RequestType.BitCount; -import static redis_request.RedisRequestOuterClass.RequestType.BitField; -import static redis_request.RedisRequestOuterClass.RequestType.BitFieldReadOnly; -import static redis_request.RedisRequestOuterClass.RequestType.BitOp; -import static redis_request.RedisRequestOuterClass.RequestType.BitPos; -import static redis_request.RedisRequestOuterClass.RequestType.ClientGetName; -import static redis_request.RedisRequestOuterClass.RequestType.ClientId; -import static redis_request.RedisRequestOuterClass.RequestType.ConfigGet; -import static redis_request.RedisRequestOuterClass.RequestType.ConfigResetStat; -import static redis_request.RedisRequestOuterClass.RequestType.ConfigRewrite; -import static redis_request.RedisRequestOuterClass.RequestType.ConfigSet; -import static redis_request.RedisRequestOuterClass.RequestType.Copy; -import static redis_request.RedisRequestOuterClass.RequestType.DBSize; -import static redis_request.RedisRequestOuterClass.RequestType.Decr; -import static redis_request.RedisRequestOuterClass.RequestType.DecrBy; -import static redis_request.RedisRequestOuterClass.RequestType.Del; -import static redis_request.RedisRequestOuterClass.RequestType.Echo; -import static redis_request.RedisRequestOuterClass.RequestType.Exists; -import static redis_request.RedisRequestOuterClass.RequestType.Expire; -import static redis_request.RedisRequestOuterClass.RequestType.ExpireAt; -import static redis_request.RedisRequestOuterClass.RequestType.ExpireTime; -import static redis_request.RedisRequestOuterClass.RequestType.FCall; -import static redis_request.RedisRequestOuterClass.RequestType.FCallReadOnly; -import static redis_request.RedisRequestOuterClass.RequestType.FlushAll; -import static redis_request.RedisRequestOuterClass.RequestType.FlushDB; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionDelete; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionFlush; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionList; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionLoad; -import static redis_request.RedisRequestOuterClass.RequestType.FunctionStats; -import static redis_request.RedisRequestOuterClass.RequestType.GeoAdd; -import static redis_request.RedisRequestOuterClass.RequestType.GeoDist; -import static redis_request.RedisRequestOuterClass.RequestType.GeoHash; -import static redis_request.RedisRequestOuterClass.RequestType.GeoPos; -import static redis_request.RedisRequestOuterClass.RequestType.Get; -import static redis_request.RedisRequestOuterClass.RequestType.GetBit; -import static redis_request.RedisRequestOuterClass.RequestType.GetDel; -import static redis_request.RedisRequestOuterClass.RequestType.GetEx; -import static redis_request.RedisRequestOuterClass.RequestType.GetRange; -import static redis_request.RedisRequestOuterClass.RequestType.HDel; -import static redis_request.RedisRequestOuterClass.RequestType.HExists; -import static redis_request.RedisRequestOuterClass.RequestType.HGet; -import static redis_request.RedisRequestOuterClass.RequestType.HGetAll; -import static redis_request.RedisRequestOuterClass.RequestType.HIncrBy; -import static redis_request.RedisRequestOuterClass.RequestType.HIncrByFloat; -import static redis_request.RedisRequestOuterClass.RequestType.HKeys; -import static redis_request.RedisRequestOuterClass.RequestType.HLen; -import static redis_request.RedisRequestOuterClass.RequestType.HMGet; -import static redis_request.RedisRequestOuterClass.RequestType.HRandField; -import static redis_request.RedisRequestOuterClass.RequestType.HSet; -import static redis_request.RedisRequestOuterClass.RequestType.HSetNX; -import static redis_request.RedisRequestOuterClass.RequestType.HStrlen; -import static redis_request.RedisRequestOuterClass.RequestType.HVals; -import static redis_request.RedisRequestOuterClass.RequestType.Incr; -import static redis_request.RedisRequestOuterClass.RequestType.IncrBy; -import static redis_request.RedisRequestOuterClass.RequestType.IncrByFloat; -import static redis_request.RedisRequestOuterClass.RequestType.Info; -import static redis_request.RedisRequestOuterClass.RequestType.LCS; -import static redis_request.RedisRequestOuterClass.RequestType.LIndex; -import static redis_request.RedisRequestOuterClass.RequestType.LInsert; -import static redis_request.RedisRequestOuterClass.RequestType.LLen; -import static redis_request.RedisRequestOuterClass.RequestType.LMPop; -import static redis_request.RedisRequestOuterClass.RequestType.LMove; -import static redis_request.RedisRequestOuterClass.RequestType.LPop; -import static redis_request.RedisRequestOuterClass.RequestType.LPos; -import static redis_request.RedisRequestOuterClass.RequestType.LPush; -import static redis_request.RedisRequestOuterClass.RequestType.LPushX; -import static redis_request.RedisRequestOuterClass.RequestType.LRange; -import static redis_request.RedisRequestOuterClass.RequestType.LRem; -import static redis_request.RedisRequestOuterClass.RequestType.LSet; -import static redis_request.RedisRequestOuterClass.RequestType.LTrim; -import static redis_request.RedisRequestOuterClass.RequestType.LastSave; -import static redis_request.RedisRequestOuterClass.RequestType.Lolwut; -import static redis_request.RedisRequestOuterClass.RequestType.MGet; -import static redis_request.RedisRequestOuterClass.RequestType.MSet; -import static redis_request.RedisRequestOuterClass.RequestType.MSetNX; -import static redis_request.RedisRequestOuterClass.RequestType.ObjectEncoding; -import static redis_request.RedisRequestOuterClass.RequestType.ObjectFreq; -import static redis_request.RedisRequestOuterClass.RequestType.ObjectIdleTime; -import static redis_request.RedisRequestOuterClass.RequestType.ObjectRefCount; -import static redis_request.RedisRequestOuterClass.RequestType.PExpire; -import static redis_request.RedisRequestOuterClass.RequestType.PExpireAt; -import static redis_request.RedisRequestOuterClass.RequestType.PExpireTime; -import static redis_request.RedisRequestOuterClass.RequestType.PTTL; -import static redis_request.RedisRequestOuterClass.RequestType.Persist; -import static redis_request.RedisRequestOuterClass.RequestType.PfAdd; -import static redis_request.RedisRequestOuterClass.RequestType.PfCount; -import static redis_request.RedisRequestOuterClass.RequestType.PfMerge; -import static redis_request.RedisRequestOuterClass.RequestType.Ping; -import static redis_request.RedisRequestOuterClass.RequestType.RPop; -import static redis_request.RedisRequestOuterClass.RequestType.RPush; -import static redis_request.RedisRequestOuterClass.RequestType.RPushX; -import static redis_request.RedisRequestOuterClass.RequestType.RandomKey; -import static redis_request.RedisRequestOuterClass.RequestType.Rename; -import static redis_request.RedisRequestOuterClass.RequestType.RenameNX; -import static redis_request.RedisRequestOuterClass.RequestType.SAdd; -import static redis_request.RedisRequestOuterClass.RequestType.SCard; -import static redis_request.RedisRequestOuterClass.RequestType.SDiff; -import static redis_request.RedisRequestOuterClass.RequestType.SDiffStore; -import static redis_request.RedisRequestOuterClass.RequestType.SInter; -import static redis_request.RedisRequestOuterClass.RequestType.SInterCard; -import static redis_request.RedisRequestOuterClass.RequestType.SInterStore; -import static redis_request.RedisRequestOuterClass.RequestType.SIsMember; -import static redis_request.RedisRequestOuterClass.RequestType.SMIsMember; -import static redis_request.RedisRequestOuterClass.RequestType.SMembers; -import static redis_request.RedisRequestOuterClass.RequestType.SMove; -import static redis_request.RedisRequestOuterClass.RequestType.SPop; -import static redis_request.RedisRequestOuterClass.RequestType.SRandMember; -import static redis_request.RedisRequestOuterClass.RequestType.SRem; -import static redis_request.RedisRequestOuterClass.RequestType.SUnion; -import static redis_request.RedisRequestOuterClass.RequestType.SUnionStore; -import static redis_request.RedisRequestOuterClass.RequestType.Set; -import static redis_request.RedisRequestOuterClass.RequestType.SetBit; -import static redis_request.RedisRequestOuterClass.RequestType.SetRange; -import static redis_request.RedisRequestOuterClass.RequestType.Sort; -import static redis_request.RedisRequestOuterClass.RequestType.SortReadOnly; -import static redis_request.RedisRequestOuterClass.RequestType.Strlen; -import static redis_request.RedisRequestOuterClass.RequestType.TTL; -import static redis_request.RedisRequestOuterClass.RequestType.Time; -import static redis_request.RedisRequestOuterClass.RequestType.Touch; -import static redis_request.RedisRequestOuterClass.RequestType.Type; -import static redis_request.RedisRequestOuterClass.RequestType.Unlink; -import static redis_request.RedisRequestOuterClass.RequestType.XAck; -import static redis_request.RedisRequestOuterClass.RequestType.XAdd; -import static redis_request.RedisRequestOuterClass.RequestType.XDel; -import static redis_request.RedisRequestOuterClass.RequestType.XGroupCreate; -import static redis_request.RedisRequestOuterClass.RequestType.XGroupCreateConsumer; -import static redis_request.RedisRequestOuterClass.RequestType.XGroupDelConsumer; -import static redis_request.RedisRequestOuterClass.RequestType.XGroupDestroy; -import static redis_request.RedisRequestOuterClass.RequestType.XLen; -import static redis_request.RedisRequestOuterClass.RequestType.XPending; -import static redis_request.RedisRequestOuterClass.RequestType.XRange; -import static redis_request.RedisRequestOuterClass.RequestType.XRead; -import static redis_request.RedisRequestOuterClass.RequestType.XReadGroup; -import static redis_request.RedisRequestOuterClass.RequestType.XRevRange; -import static redis_request.RedisRequestOuterClass.RequestType.XTrim; -import static redis_request.RedisRequestOuterClass.RequestType.ZAdd; -import static redis_request.RedisRequestOuterClass.RequestType.ZCard; -import static redis_request.RedisRequestOuterClass.RequestType.ZCount; -import static redis_request.RedisRequestOuterClass.RequestType.ZDiff; -import static redis_request.RedisRequestOuterClass.RequestType.ZDiffStore; -import static redis_request.RedisRequestOuterClass.RequestType.ZIncrBy; -import static redis_request.RedisRequestOuterClass.RequestType.ZInter; -import static redis_request.RedisRequestOuterClass.RequestType.ZInterCard; -import static redis_request.RedisRequestOuterClass.RequestType.ZInterStore; -import static redis_request.RedisRequestOuterClass.RequestType.ZLexCount; -import static redis_request.RedisRequestOuterClass.RequestType.ZMPop; -import static redis_request.RedisRequestOuterClass.RequestType.ZMScore; -import static redis_request.RedisRequestOuterClass.RequestType.ZPopMax; -import static redis_request.RedisRequestOuterClass.RequestType.ZPopMin; -import static redis_request.RedisRequestOuterClass.RequestType.ZRandMember; -import static redis_request.RedisRequestOuterClass.RequestType.ZRange; -import static redis_request.RedisRequestOuterClass.RequestType.ZRangeStore; -import static redis_request.RedisRequestOuterClass.RequestType.ZRank; -import static redis_request.RedisRequestOuterClass.RequestType.ZRem; -import static redis_request.RedisRequestOuterClass.RequestType.ZRemRangeByLex; -import static redis_request.RedisRequestOuterClass.RequestType.ZRemRangeByRank; -import static redis_request.RedisRequestOuterClass.RequestType.ZRemRangeByScore; -import static redis_request.RedisRequestOuterClass.RequestType.ZRevRank; -import static redis_request.RedisRequestOuterClass.RequestType.ZScore; -import static redis_request.RedisRequestOuterClass.RequestType.ZUnion; -import static redis_request.RedisRequestOuterClass.RequestType.ZUnionStore; +import static command_request.CommandRequestOuterClass.RequestType.Append; +import static command_request.CommandRequestOuterClass.RequestType.BLMPop; +import static command_request.CommandRequestOuterClass.RequestType.BLMove; +import static command_request.CommandRequestOuterClass.RequestType.BLPop; +import static command_request.CommandRequestOuterClass.RequestType.BRPop; +import static command_request.CommandRequestOuterClass.RequestType.BZMPop; +import static command_request.CommandRequestOuterClass.RequestType.BZPopMax; +import static command_request.CommandRequestOuterClass.RequestType.BZPopMin; +import static command_request.CommandRequestOuterClass.RequestType.BitCount; +import static command_request.CommandRequestOuterClass.RequestType.BitField; +import static command_request.CommandRequestOuterClass.RequestType.BitFieldReadOnly; +import static command_request.CommandRequestOuterClass.RequestType.BitOp; +import static command_request.CommandRequestOuterClass.RequestType.BitPos; +import static command_request.CommandRequestOuterClass.RequestType.ClientGetName; +import static command_request.CommandRequestOuterClass.RequestType.ClientId; +import static command_request.CommandRequestOuterClass.RequestType.ConfigGet; +import static command_request.CommandRequestOuterClass.RequestType.ConfigResetStat; +import static command_request.CommandRequestOuterClass.RequestType.ConfigRewrite; +import static command_request.CommandRequestOuterClass.RequestType.ConfigSet; +import static command_request.CommandRequestOuterClass.RequestType.Copy; +import static command_request.CommandRequestOuterClass.RequestType.DBSize; +import static command_request.CommandRequestOuterClass.RequestType.Decr; +import static command_request.CommandRequestOuterClass.RequestType.DecrBy; +import static command_request.CommandRequestOuterClass.RequestType.Del; +import static command_request.CommandRequestOuterClass.RequestType.Echo; +import static command_request.CommandRequestOuterClass.RequestType.Exists; +import static command_request.CommandRequestOuterClass.RequestType.Expire; +import static command_request.CommandRequestOuterClass.RequestType.ExpireAt; +import static command_request.CommandRequestOuterClass.RequestType.ExpireTime; +import static command_request.CommandRequestOuterClass.RequestType.FCall; +import static command_request.CommandRequestOuterClass.RequestType.FCallReadOnly; +import static command_request.CommandRequestOuterClass.RequestType.FlushAll; +import static command_request.CommandRequestOuterClass.RequestType.FlushDB; +import static command_request.CommandRequestOuterClass.RequestType.FunctionDelete; +import static command_request.CommandRequestOuterClass.RequestType.FunctionFlush; +import static command_request.CommandRequestOuterClass.RequestType.FunctionList; +import static command_request.CommandRequestOuterClass.RequestType.FunctionLoad; +import static command_request.CommandRequestOuterClass.RequestType.FunctionStats; +import static command_request.CommandRequestOuterClass.RequestType.GeoAdd; +import static command_request.CommandRequestOuterClass.RequestType.GeoDist; +import static command_request.CommandRequestOuterClass.RequestType.GeoHash; +import static command_request.CommandRequestOuterClass.RequestType.GeoPos; +import static command_request.CommandRequestOuterClass.RequestType.Get; +import static command_request.CommandRequestOuterClass.RequestType.GetBit; +import static command_request.CommandRequestOuterClass.RequestType.GetDel; +import static command_request.CommandRequestOuterClass.RequestType.GetEx; +import static command_request.CommandRequestOuterClass.RequestType.GetRange; +import static command_request.CommandRequestOuterClass.RequestType.HDel; +import static command_request.CommandRequestOuterClass.RequestType.HExists; +import static command_request.CommandRequestOuterClass.RequestType.HGet; +import static command_request.CommandRequestOuterClass.RequestType.HGetAll; +import static command_request.CommandRequestOuterClass.RequestType.HIncrBy; +import static command_request.CommandRequestOuterClass.RequestType.HIncrByFloat; +import static command_request.CommandRequestOuterClass.RequestType.HKeys; +import static command_request.CommandRequestOuterClass.RequestType.HLen; +import static command_request.CommandRequestOuterClass.RequestType.HMGet; +import static command_request.CommandRequestOuterClass.RequestType.HRandField; +import static command_request.CommandRequestOuterClass.RequestType.HSet; +import static command_request.CommandRequestOuterClass.RequestType.HSetNX; +import static command_request.CommandRequestOuterClass.RequestType.HStrlen; +import static command_request.CommandRequestOuterClass.RequestType.HVals; +import static command_request.CommandRequestOuterClass.RequestType.Incr; +import static command_request.CommandRequestOuterClass.RequestType.IncrBy; +import static command_request.CommandRequestOuterClass.RequestType.IncrByFloat; +import static command_request.CommandRequestOuterClass.RequestType.Info; +import static command_request.CommandRequestOuterClass.RequestType.LCS; +import static command_request.CommandRequestOuterClass.RequestType.LIndex; +import static command_request.CommandRequestOuterClass.RequestType.LInsert; +import static command_request.CommandRequestOuterClass.RequestType.LLen; +import static command_request.CommandRequestOuterClass.RequestType.LMPop; +import static command_request.CommandRequestOuterClass.RequestType.LMove; +import static command_request.CommandRequestOuterClass.RequestType.LPop; +import static command_request.CommandRequestOuterClass.RequestType.LPos; +import static command_request.CommandRequestOuterClass.RequestType.LPush; +import static command_request.CommandRequestOuterClass.RequestType.LPushX; +import static command_request.CommandRequestOuterClass.RequestType.LRange; +import static command_request.CommandRequestOuterClass.RequestType.LRem; +import static command_request.CommandRequestOuterClass.RequestType.LSet; +import static command_request.CommandRequestOuterClass.RequestType.LTrim; +import static command_request.CommandRequestOuterClass.RequestType.LastSave; +import static command_request.CommandRequestOuterClass.RequestType.Lolwut; +import static command_request.CommandRequestOuterClass.RequestType.MGet; +import static command_request.CommandRequestOuterClass.RequestType.MSet; +import static command_request.CommandRequestOuterClass.RequestType.MSetNX; +import static command_request.CommandRequestOuterClass.RequestType.ObjectEncoding; +import static command_request.CommandRequestOuterClass.RequestType.ObjectFreq; +import static command_request.CommandRequestOuterClass.RequestType.ObjectIdleTime; +import static command_request.CommandRequestOuterClass.RequestType.ObjectRefCount; +import static command_request.CommandRequestOuterClass.RequestType.PExpire; +import static command_request.CommandRequestOuterClass.RequestType.PExpireAt; +import static command_request.CommandRequestOuterClass.RequestType.PExpireTime; +import static command_request.CommandRequestOuterClass.RequestType.PTTL; +import static command_request.CommandRequestOuterClass.RequestType.Persist; +import static command_request.CommandRequestOuterClass.RequestType.PfAdd; +import static command_request.CommandRequestOuterClass.RequestType.PfCount; +import static command_request.CommandRequestOuterClass.RequestType.PfMerge; +import static command_request.CommandRequestOuterClass.RequestType.Ping; +import static command_request.CommandRequestOuterClass.RequestType.RPop; +import static command_request.CommandRequestOuterClass.RequestType.RPush; +import static command_request.CommandRequestOuterClass.RequestType.RPushX; +import static command_request.CommandRequestOuterClass.RequestType.RandomKey; +import static command_request.CommandRequestOuterClass.RequestType.Rename; +import static command_request.CommandRequestOuterClass.RequestType.RenameNX; +import static command_request.CommandRequestOuterClass.RequestType.SAdd; +import static command_request.CommandRequestOuterClass.RequestType.SCard; +import static command_request.CommandRequestOuterClass.RequestType.SDiff; +import static command_request.CommandRequestOuterClass.RequestType.SDiffStore; +import static command_request.CommandRequestOuterClass.RequestType.SInter; +import static command_request.CommandRequestOuterClass.RequestType.SInterCard; +import static command_request.CommandRequestOuterClass.RequestType.SInterStore; +import static command_request.CommandRequestOuterClass.RequestType.SIsMember; +import static command_request.CommandRequestOuterClass.RequestType.SMIsMember; +import static command_request.CommandRequestOuterClass.RequestType.SMembers; +import static command_request.CommandRequestOuterClass.RequestType.SMove; +import static command_request.CommandRequestOuterClass.RequestType.SPop; +import static command_request.CommandRequestOuterClass.RequestType.SRandMember; +import static command_request.CommandRequestOuterClass.RequestType.SRem; +import static command_request.CommandRequestOuterClass.RequestType.SUnion; +import static command_request.CommandRequestOuterClass.RequestType.SUnionStore; +import static command_request.CommandRequestOuterClass.RequestType.Set; +import static command_request.CommandRequestOuterClass.RequestType.SetBit; +import static command_request.CommandRequestOuterClass.RequestType.SetRange; +import static command_request.CommandRequestOuterClass.RequestType.Sort; +import static command_request.CommandRequestOuterClass.RequestType.SortReadOnly; +import static command_request.CommandRequestOuterClass.RequestType.Strlen; +import static command_request.CommandRequestOuterClass.RequestType.TTL; +import static command_request.CommandRequestOuterClass.RequestType.Time; +import static command_request.CommandRequestOuterClass.RequestType.Touch; +import static command_request.CommandRequestOuterClass.RequestType.Type; +import static command_request.CommandRequestOuterClass.RequestType.Unlink; +import static command_request.CommandRequestOuterClass.RequestType.XAck; +import static command_request.CommandRequestOuterClass.RequestType.XAdd; +import static command_request.CommandRequestOuterClass.RequestType.XDel; +import static command_request.CommandRequestOuterClass.RequestType.XGroupCreate; +import static command_request.CommandRequestOuterClass.RequestType.XGroupCreateConsumer; +import static command_request.CommandRequestOuterClass.RequestType.XGroupDelConsumer; +import static command_request.CommandRequestOuterClass.RequestType.XGroupDestroy; +import static command_request.CommandRequestOuterClass.RequestType.XLen; +import static command_request.CommandRequestOuterClass.RequestType.XPending; +import static command_request.CommandRequestOuterClass.RequestType.XRange; +import static command_request.CommandRequestOuterClass.RequestType.XRead; +import static command_request.CommandRequestOuterClass.RequestType.XReadGroup; +import static command_request.CommandRequestOuterClass.RequestType.XRevRange; +import static command_request.CommandRequestOuterClass.RequestType.XTrim; +import static command_request.CommandRequestOuterClass.RequestType.ZAdd; +import static command_request.CommandRequestOuterClass.RequestType.ZCard; +import static command_request.CommandRequestOuterClass.RequestType.ZCount; +import static command_request.CommandRequestOuterClass.RequestType.ZDiff; +import static command_request.CommandRequestOuterClass.RequestType.ZDiffStore; +import static command_request.CommandRequestOuterClass.RequestType.ZIncrBy; +import static command_request.CommandRequestOuterClass.RequestType.ZInter; +import static command_request.CommandRequestOuterClass.RequestType.ZInterCard; +import static command_request.CommandRequestOuterClass.RequestType.ZInterStore; +import static command_request.CommandRequestOuterClass.RequestType.ZLexCount; +import static command_request.CommandRequestOuterClass.RequestType.ZMPop; +import static command_request.CommandRequestOuterClass.RequestType.ZMScore; +import static command_request.CommandRequestOuterClass.RequestType.ZPopMax; +import static command_request.CommandRequestOuterClass.RequestType.ZPopMin; +import static command_request.CommandRequestOuterClass.RequestType.ZRandMember; +import static command_request.CommandRequestOuterClass.RequestType.ZRange; +import static command_request.CommandRequestOuterClass.RequestType.ZRangeStore; +import static command_request.CommandRequestOuterClass.RequestType.ZRank; +import static command_request.CommandRequestOuterClass.RequestType.ZRem; +import static command_request.CommandRequestOuterClass.RequestType.ZRemRangeByLex; +import static command_request.CommandRequestOuterClass.RequestType.ZRemRangeByRank; +import static command_request.CommandRequestOuterClass.RequestType.ZRemRangeByScore; +import static command_request.CommandRequestOuterClass.RequestType.ZRevRank; +import static command_request.CommandRequestOuterClass.RequestType.ZScore; +import static command_request.CommandRequestOuterClass.RequestType.ZUnion; +import static command_request.CommandRequestOuterClass.RequestType.ZUnionStore; import com.google.protobuf.ByteString; import glide.api.models.commands.ConditionalChange; @@ -265,9 +265,9 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import redis_request.RedisRequestOuterClass.Command; -import redis_request.RedisRequestOuterClass.Command.ArgsArray; -import redis_request.RedisRequestOuterClass.RequestType; +import command_request.CommandRequestOuterClass.Command; +import command_request.CommandRequestOuterClass.Command.ArgsArray; +import command_request.CommandRequestOuterClass.RequestType; public class TransactionTests { private static Stream getTransactionBuilders() { diff --git a/java/client/src/test/java/glide/connection/ConnectionWithGlideMockTests.java b/java/client/src/test/java/glide/connection/ConnectionWithGlideMockTests.java index 27e00ef52b..ab053e83bc 100644 --- a/java/client/src/test/java/glide/connection/ConnectionWithGlideMockTests.java +++ b/java/client/src/test/java/glide/connection/ConnectionWithGlideMockTests.java @@ -27,7 +27,7 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import redis_request.RedisRequestOuterClass.RedisRequest; +import command_request.CommandRequestOuterClass.CommandRequest; import response.ResponseOuterClass.Response; public class ConnectionWithGlideMockTests extends RustCoreLibMockTestBase { @@ -74,7 +74,7 @@ public Response connection(ConnectionRequest request) { } @Override - public Response.Builder redisRequest(RedisRequest request) { + public Response.Builder redisRequest(CommandRequest request) { return null; } }); @@ -97,7 +97,7 @@ public Response connection(ConnectionRequest request) { } @Override - public Response.Builder redisRequest(RedisRequest request) { + public Response.Builder redisRequest(CommandRequest request) { return null; } }); @@ -120,7 +120,7 @@ public Response connection(ConnectionRequest request) { } @Override - public Response.Builder redisRequest(RedisRequest request) { + public Response.Builder redisRequest(CommandRequest request) { return null; } }); @@ -139,7 +139,7 @@ public Response connection(ConnectionRequest request) { } @Override - public Response.Builder redisRequest(RedisRequest request) { + public Response.Builder redisRequest(CommandRequest request) { return null; } }); diff --git a/java/client/src/test/java/glide/managers/CommandManagerTest.java b/java/client/src/test/java/glide/managers/CommandManagerTest.java index 876851cfb1..032d7d56f5 100644 --- a/java/client/src/test/java/glide/managers/CommandManagerTest.java +++ b/java/client/src/test/java/glide/managers/CommandManagerTest.java @@ -15,7 +15,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static redis_request.RedisRequestOuterClass.RequestType.CustomCommand; +import static command_request.CommandRequestOuterClass.RequestType.CustomCommand; import com.google.protobuf.ByteString; import glide.api.models.ClusterTransaction; @@ -40,9 +40,9 @@ import org.junit.jupiter.params.provider.EnumSource; import org.junit.jupiter.params.provider.MethodSource; import org.mockito.ArgumentCaptor; -import redis_request.RedisRequestOuterClass.RedisRequest; -import redis_request.RedisRequestOuterClass.SimpleRoutes; -import redis_request.RedisRequestOuterClass.SlotTypes; +import command_request.CommandRequestOuterClass.CommandRequest; +import command_request.CommandRequestOuterClass.SimpleRoutes; +import command_request.CommandRequestOuterClass.SlotTypes; import response.ResponseOuterClass.Response; public class CommandManagerTest { @@ -144,8 +144,8 @@ public void prepare_request_with_simple_routes(Route routeType) { when(channelHandler.write(any(), anyBoolean())).thenReturn(future); when(channelHandler.isClosed()).thenReturn(false); - ArgumentCaptor captor = - ArgumentCaptor.forClass(RedisRequest.Builder.class); + ArgumentCaptor captor = + ArgumentCaptor.forClass(CommandRequest.Builder.class); service.submitNewCommand(CustomCommand, new String[0], routeType, r -> null); verify(channelHandler).write(captor.capture(), anyBoolean()); @@ -175,8 +175,8 @@ public void prepare_request_with_slot_id_routes(SlotType slotType) { when(channelHandler.write(any(), anyBoolean())).thenReturn(future); when(channelHandler.isClosed()).thenReturn(false); - ArgumentCaptor captor = - ArgumentCaptor.forClass(RedisRequest.Builder.class); + ArgumentCaptor captor = + ArgumentCaptor.forClass(CommandRequest.Builder.class); service.submitNewCommand( CustomCommand, new String[0], new SlotIdRoute(42, slotType), r -> null); @@ -208,8 +208,8 @@ public void prepare_request_with_slot_key_routes(SlotType slotType) { when(channelHandler.write(any(), anyBoolean())).thenReturn(future); when(channelHandler.isClosed()).thenReturn(false); - ArgumentCaptor captor = - ArgumentCaptor.forClass(RedisRequest.Builder.class); + ArgumentCaptor captor = + ArgumentCaptor.forClass(CommandRequest.Builder.class); service.submitNewCommand( CustomCommand, new String[0], new SlotKeyRoute("TEST", slotType), r -> null); @@ -240,8 +240,8 @@ public void prepare_request_with_by_address_route() { when(channelHandler.write(any(), anyBoolean())).thenReturn(future); when(channelHandler.isClosed()).thenReturn(false); - ArgumentCaptor captor = - ArgumentCaptor.forClass(RedisRequest.Builder.class); + ArgumentCaptor captor = + ArgumentCaptor.forClass(CommandRequest.Builder.class); service.submitNewCommand( CustomCommand, new String[0], new ByAddressRoute("testhost", 6379), r -> null); @@ -285,8 +285,8 @@ public void submitNewCommand_with_Transaction_sends_protobuf_request() { when(channelHandler.write(any(), anyBoolean())).thenReturn(future); when(channelHandler.isClosed()).thenReturn(false); - ArgumentCaptor captor = - ArgumentCaptor.forClass(RedisRequest.Builder.class); + ArgumentCaptor captor = + ArgumentCaptor.forClass(CommandRequest.Builder.class); // exercise service.submitNewTransaction(trans, r -> null); @@ -303,7 +303,7 @@ public void submitNewCommand_with_Transaction_sends_protobuf_request() { resultPayloads.add(ByteString.copyFromUtf8("one")); resultPayloads.add(ByteString.copyFromUtf8("two")); resultPayloads.add(ByteString.copyFromUtf8("three")); - for (redis_request.RedisRequestOuterClass.Command command : + for (command_request.CommandRequestOuterClass.Command command : requestBuilder.getTransaction().getCommandsList()) { assertEquals(CustomCommand, command.getRequestType()); assertEquals(ByteString.copyFromUtf8("GETSTRING"), command.getArgsArray().getArgs(0)); @@ -326,8 +326,8 @@ public void submitNewCommand_with_ClusterTransaction_with_route_sends_protobuf_r when(channelHandler.write(any(), anyBoolean())).thenReturn(future); when(channelHandler.isClosed()).thenReturn(false); - ArgumentCaptor captor = - ArgumentCaptor.forClass(RedisRequest.Builder.class); + ArgumentCaptor captor = + ArgumentCaptor.forClass(CommandRequest.Builder.class); service.submitNewTransaction(trans, Optional.of(routeType), r -> null); verify(channelHandler).write(captor.capture(), anyBoolean()); diff --git a/java/client/src/test/java/glide/utils/RustCoreMock.java b/java/client/src/test/java/glide/utils/RustCoreMock.java index 93fa8d0030..7ef0c5e0eb 100644 --- a/java/client/src/test/java/glide/utils/RustCoreMock.java +++ b/java/client/src/test/java/glide/utils/RustCoreMock.java @@ -24,7 +24,7 @@ import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; -import redis_request.RedisRequestOuterClass.RedisRequest; +import command_request.CommandRequestOuterClass.CommandRequest; import response.ResponseOuterClass.ConstantResponse; import response.ResponseOuterClass.Response; @@ -54,9 +54,9 @@ public byte[] handle(byte[] request) { public abstract Response connection(ConnectionRequest request); /** Return `null` to do not reply. */ - public abstract Response.Builder redisRequest(RedisRequest request); + public abstract Response.Builder redisRequest(CommandRequest request); - public Response redisRequestWithCallbackId(RedisRequest request) { + public Response redisRequestWithCallbackId(CommandRequest request) { var responseDraft = redisRequest(request); return responseDraft == null ? null @@ -166,7 +166,7 @@ public void channelRead(@NonNull ChannelHandlerContext ctx, @NonNull Object msg) response = handler.connection(connection); anybodyConnected.setPlain(true); } else { - var request = RedisRequest.parseFrom(bytes); + var request = CommandRequest.parseFrom(bytes); response = handler.redisRequestWithCallbackId(request); } if (response != null) { diff --git a/node/src/BaseClient.ts b/node/src/BaseClient.ts index 9e6438cc83..f7ffdce756 100644 --- a/node/src/BaseClient.ts +++ b/node/src/BaseClient.ts @@ -113,7 +113,11 @@ import { TimeoutError, } from "./Errors"; import { Logger } from "./Logger"; -import { connection_request, redis_request, response } from "./ProtobufMessage"; +import { + command_request, + connection_request, + response, +} from "./ProtobufMessage"; /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ type PromiseFunction = (value?: any) => void; @@ -373,10 +377,10 @@ export class BaseClient { */ protected createWritePromise( command: - | redis_request.Command - | redis_request.Command[] - | redis_request.ScriptInvocation, - route?: redis_request.Routes, + | command_request.Command + | command_request.Command[] + | command_request.ScriptInvocation, + route?: command_request.Routes, ): Promise { if (this.isClosed) { throw new ClosingError( @@ -387,31 +391,31 @@ export class BaseClient { return new Promise((resolve, reject) => { const callbackIndex = this.getCallbackIndex(); this.promiseCallbackFunctions[callbackIndex] = [resolve, reject]; - this.writeOrBufferRedisRequest(callbackIndex, command, route); + this.writeOrBufferCommandRequest(callbackIndex, command, route); }); } - private writeOrBufferRedisRequest( + private writeOrBufferCommandRequest( callbackIdx: number, command: - | redis_request.Command - | redis_request.Command[] - | redis_request.ScriptInvocation, - route?: redis_request.Routes, + | command_request.Command + | command_request.Command[] + | command_request.ScriptInvocation, + route?: command_request.Routes, ) { const message = Array.isArray(command) - ? redis_request.RedisRequest.create({ + ? command_request.CommandRequest.create({ callbackIdx, - transaction: redis_request.Transaction.create({ + transaction: command_request.Transaction.create({ commands: command, }), }) - : command instanceof redis_request.Command - ? redis_request.RedisRequest.create({ + : command instanceof command_request.Command + ? command_request.CommandRequest.create({ callbackIdx, singleCommand: command, }) - : redis_request.RedisRequest.create({ + : command_request.CommandRequest.create({ callbackIdx, scriptInvocation: command, }); @@ -419,8 +423,8 @@ export class BaseClient { this.writeOrBufferRequest( message, - (message: redis_request.RedisRequest, writer: Writer) => { - redis_request.RedisRequest.encodeDelimited(message, writer); + (message: command_request.CommandRequest, writer: Writer) => { + command_request.CommandRequest.encodeDelimited(message, writer); }, ); } @@ -1627,7 +1631,7 @@ export class BaseClient { script: Script, option?: ScriptOptions, ): Promise { - const scriptInvocation = redis_request.ScriptInvocation.create({ + const scriptInvocation = command_request.ScriptInvocation.create({ hash: script.getHash(), keys: option?.keys, args: option?.args, diff --git a/node/src/Commands.ts b/node/src/Commands.ts index 9e527cfe03..90c98b050b 100644 --- a/node/src/Commands.ts +++ b/node/src/Commands.ts @@ -5,9 +5,9 @@ import { createLeakedStringVec, MAX_REQUEST_ARGS_LEN } from "glide-rs"; import Long from "long"; -import { redis_request } from "./ProtobufMessage"; +import { command_request } from "./ProtobufMessage"; -import RequestType = redis_request.RequestType; +import RequestType = command_request.RequestType; function isLargeCommand(args: BulkString[]) { let lenSum = 0; @@ -61,10 +61,10 @@ export function parseInfoResponse(response: string): Record { } function createCommand( - requestType: redis_request.RequestType, + requestType: command_request.RequestType, args: BulkString[], -): redis_request.Command { - const singleCommand = redis_request.Command.create({ +): command_request.Command { + const singleCommand = command_request.Command.create({ requestType, }); @@ -76,7 +76,7 @@ function createCommand( const pointer = new Long(pointerArr[0], pointerArr[1]); singleCommand.argsVecPointer = pointer; } else { - singleCommand.argsArray = redis_request.Command.ArgsArray.create({ + singleCommand.argsArray = command_request.Command.ArgsArray.create({ args: argsBytes, }); } @@ -87,7 +87,7 @@ function createCommand( /** * @internal */ -export function createGet(key: string): redis_request.Command { +export function createGet(key: string): command_request.Command { return createCommand(RequestType.Get, [key]); } @@ -146,7 +146,7 @@ export function createSet( key: BulkString, value: BulkString, options?: SetOptions, -): redis_request.Command { +): command_request.Command { const args = [key, value]; if (options) { @@ -266,7 +266,7 @@ export enum InfoOptions { /** * @internal */ -export function createPing(str?: string): redis_request.Command { +export function createPing(str?: string): command_request.Command { const args: string[] = str == undefined ? [] : [str]; return createCommand(RequestType.Ping, args); } @@ -274,7 +274,7 @@ export function createPing(str?: string): redis_request.Command { /** * @internal */ -export function createInfo(options?: InfoOptions[]): redis_request.Command { +export function createInfo(options?: InfoOptions[]): command_request.Command { const args: string[] = options == undefined ? [] : options; return createCommand(RequestType.Info, args); } @@ -282,42 +282,42 @@ export function createInfo(options?: InfoOptions[]): redis_request.Command { /** * @internal */ -export function createDel(keys: string[]): redis_request.Command { +export function createDel(keys: string[]): command_request.Command { return createCommand(RequestType.Del, keys); } /** * @internal */ -export function createSelect(index: number): redis_request.Command { +export function createSelect(index: number): command_request.Command { return createCommand(RequestType.Select, [index.toString()]); } /** * @internal */ -export function createClientGetName(): redis_request.Command { +export function createClientGetName(): command_request.Command { return createCommand(RequestType.ClientGetName, []); } /** * @internal */ -export function createConfigRewrite(): redis_request.Command { +export function createConfigRewrite(): command_request.Command { return createCommand(RequestType.ConfigRewrite, []); } /** * @internal */ -export function createConfigResetStat(): redis_request.Command { +export function createConfigResetStat(): command_request.Command { return createCommand(RequestType.ConfigResetStat, []); } /** * @internal */ -export function createMGet(keys: string[]): redis_request.Command { +export function createMGet(keys: string[]): command_request.Command { return createCommand(RequestType.MGet, keys); } @@ -326,14 +326,14 @@ export function createMGet(keys: string[]): redis_request.Command { */ export function createMSet( keyValueMap: Record, -): redis_request.Command { +): command_request.Command { return createCommand(RequestType.MSet, Object.entries(keyValueMap).flat()); } /** * @internal */ -export function createIncr(key: string): redis_request.Command { +export function createIncr(key: string): command_request.Command { return createCommand(RequestType.Incr, [key]); } @@ -343,7 +343,7 @@ export function createIncr(key: string): redis_request.Command { export function createIncrBy( key: string, amount: number, -): redis_request.Command { +): command_request.Command { return createCommand(RequestType.IncrBy, [key, amount.toString()]); } @@ -353,21 +353,21 @@ export function createIncrBy( export function createIncrByFloat( key: string, amount: number, -): redis_request.Command { +): command_request.Command { return createCommand(RequestType.IncrByFloat, [key, amount.toString()]); } /** * @internal */ -export function createClientId(): redis_request.Command { +export function createClientId(): command_request.Command { return createCommand(RequestType.ClientId, []); } /** * @internal */ -export function createConfigGet(parameters: string[]): redis_request.Command { +export function createConfigGet(parameters: string[]): command_request.Command { return createCommand(RequestType.ConfigGet, parameters); } @@ -376,7 +376,7 @@ export function createConfigGet(parameters: string[]): redis_request.Command { */ export function createConfigSet( parameters: Record, -): redis_request.Command { +): command_request.Command { return createCommand( RequestType.ConfigSet, Object.entries(parameters).flat(), @@ -386,7 +386,10 @@ export function createConfigSet( /** * @internal */ -export function createHGet(key: string, field: string): redis_request.Command { +export function createHGet( + key: string, + field: string, +): command_request.Command { return createCommand(RequestType.HGet, [key, field]); } @@ -396,7 +399,7 @@ export function createHGet(key: string, field: string): redis_request.Command { export function createHSet( key: string, fieldValueMap: Record, -): redis_request.Command { +): command_request.Command { return createCommand( RequestType.HSet, [key].concat(Object.entries(fieldValueMap).flat()), @@ -410,14 +413,14 @@ export function createHSetNX( key: string, field: string, value: string, -): redis_request.Command { +): command_request.Command { return createCommand(RequestType.HSetNX, [key, field, value]); } /** * @internal */ -export function createDecr(key: string): redis_request.Command { +export function createDecr(key: string): command_request.Command { return createCommand(RequestType.Decr, [key]); } @@ -427,7 +430,7 @@ export function createDecr(key: string): redis_request.Command { export function createDecrBy( key: string, amount: number, -): redis_request.Command { +): command_request.Command { return createCommand(RequestType.DecrBy, [key, amount.toString()]); } @@ -437,7 +440,7 @@ export function createDecrBy( export function createHDel( key: string, fields: string[], -): redis_request.Command { +): command_request.Command { return createCommand(RequestType.HDel, [key].concat(fields)); } @@ -447,7 +450,7 @@ export function createHDel( export function createHMGet( key: string, fields: string[], -): redis_request.Command { +): command_request.Command { return createCommand(RequestType.HMGet, [key].concat(fields)); } @@ -457,14 +460,14 @@ export function createHMGet( export function createHExists( key: string, field: string, -): redis_request.Command { +): command_request.Command { return createCommand(RequestType.HExists, [key, field]); } /** * @internal */ -export function createHGetAll(key: string): redis_request.Command { +export function createHGetAll(key: string): command_request.Command { return createCommand(RequestType.HGetAll, [key]); } @@ -474,14 +477,17 @@ export function createHGetAll(key: string): redis_request.Command { export function createLPush( key: string, elements: string[], -): redis_request.Command { +): command_request.Command { return createCommand(RequestType.LPush, [key].concat(elements)); } /** * @internal */ -export function createLPop(key: string, count?: number): redis_request.Command { +export function createLPop( + key: string, + count?: number, +): command_request.Command { const args: string[] = count == undefined ? [key] : [key, count.toString()]; return createCommand(RequestType.LPop, args); } @@ -493,7 +499,7 @@ export function createLRange( key: string, start: number, end: number, -): redis_request.Command { +): command_request.Command { return createCommand(RequestType.LRange, [ key, start.toString(), @@ -504,7 +510,7 @@ export function createLRange( /** * @internal */ -export function createLLen(key: string): redis_request.Command { +export function createLLen(key: string): command_request.Command { return createCommand(RequestType.LLen, [key]); } @@ -515,7 +521,7 @@ export function createLTrim( key: string, start: number, end: number, -): redis_request.Command { +): command_request.Command { return createCommand(RequestType.LTrim, [ key, start.toString(), @@ -530,7 +536,7 @@ export function createLRem( key: string, count: number, element: string, -): redis_request.Command { +): command_request.Command { return createCommand(RequestType.LRem, [key, count.toString(), element]); } @@ -540,14 +546,17 @@ export function createLRem( export function createRPush( key: string, elements: string[], -): redis_request.Command { +): command_request.Command { return createCommand(RequestType.RPush, [key].concat(elements)); } /** * @internal */ -export function createRPop(key: string, count?: number): redis_request.Command { +export function createRPop( + key: string, + count?: number, +): command_request.Command { const args: string[] = count == undefined ? [key] : [key, count.toString()]; return createCommand(RequestType.RPop, args); } @@ -558,7 +567,7 @@ export function createRPop(key: string, count?: number): redis_request.Command { export function createSAdd( key: string, members: string[], -): redis_request.Command { +): command_request.Command { return createCommand(RequestType.SAdd, [key].concat(members)); } @@ -568,14 +577,14 @@ export function createSAdd( export function createSRem( key: string, members: string[], -): redis_request.Command { +): command_request.Command { return createCommand(RequestType.SRem, [key].concat(members)); } /** * @internal */ -export function createSMembers(key: string): redis_request.Command { +export function createSMembers(key: string): command_request.Command { return createCommand(RequestType.SMembers, [key]); } @@ -587,21 +596,21 @@ export function createSMove( source: string, destination: string, member: string, -): redis_request.Command { +): command_request.Command { return createCommand(RequestType.SMove, [source, destination, member]); } /** * @internal */ -export function createSCard(key: string): redis_request.Command { +export function createSCard(key: string): command_request.Command { return createCommand(RequestType.SCard, [key]); } /** * @internal */ -export function createSInter(keys: string[]): redis_request.Command { +export function createSInter(keys: string[]): command_request.Command { return createCommand(RequestType.SInter, keys); } @@ -611,7 +620,7 @@ export function createSInter(keys: string[]): redis_request.Command { export function createSUnionStore( destination: string, keys: string[], -): redis_request.Command { +): command_request.Command { return createCommand(RequestType.SUnionStore, [destination].concat(keys)); } @@ -621,14 +630,17 @@ export function createSUnionStore( export function createSIsMember( key: string, member: string, -): redis_request.Command { +): command_request.Command { return createCommand(RequestType.SIsMember, [key, member]); } /** * @internal */ -export function createSPop(key: string, count?: number): redis_request.Command { +export function createSPop( + key: string, + count?: number, +): command_request.Command { const args: string[] = count == undefined ? [key] : [key, count.toString()]; return createCommand(RequestType.SPop, args); } @@ -647,7 +659,7 @@ export function createHIncrBy( key: string, field: string, amount: number, -): redis_request.Command { +): command_request.Command { return createCommand(RequestType.HIncrBy, [key, field, amount.toString()]); } @@ -658,7 +670,7 @@ export function createHIncrByFloat( key: string, field: string, amount: number, -): redis_request.Command { +): command_request.Command { return createCommand(RequestType.HIncrByFloat, [ key, field, @@ -669,28 +681,28 @@ export function createHIncrByFloat( /** * @internal */ -export function createHLen(key: string): redis_request.Command { +export function createHLen(key: string): command_request.Command { return createCommand(RequestType.HLen, [key]); } /** * @internal */ -export function createHVals(key: string): redis_request.Command { +export function createHVals(key: string): command_request.Command { return createCommand(RequestType.HVals, [key]); } /** * @internal */ -export function createExists(keys: string[]): redis_request.Command { +export function createExists(keys: string[]): command_request.Command { return createCommand(RequestType.Exists, keys); } /** * @internal */ -export function createUnlink(keys: string[]): redis_request.Command { +export function createUnlink(keys: string[]): command_request.Command { return createCommand(RequestType.Unlink, keys); } @@ -722,7 +734,7 @@ export function createExpire( key: string, seconds: number, option?: ExpireOptions, -): redis_request.Command { +): command_request.Command { const args: string[] = option == undefined ? [key, seconds.toString()] @@ -737,7 +749,7 @@ export function createExpireAt( key: string, unixSeconds: number, option?: ExpireOptions, -): redis_request.Command { +): command_request.Command { const args: string[] = option == undefined ? [key, unixSeconds.toString()] @@ -752,7 +764,7 @@ export function createPExpire( key: string, milliseconds: number, option?: ExpireOptions, -): redis_request.Command { +): command_request.Command { const args: string[] = option == undefined ? [key, milliseconds.toString()] @@ -767,7 +779,7 @@ export function createPExpireAt( key: string, unixMilliseconds: number, option?: ExpireOptions, -): redis_request.Command { +): command_request.Command { const args: string[] = option == undefined ? [key, unixMilliseconds.toString()] @@ -778,7 +790,7 @@ export function createPExpireAt( /** * @internal */ -export function createTTL(key: string): redis_request.Command { +export function createTTL(key: string): command_request.Command { return createCommand(RequestType.TTL, [key]); } @@ -807,7 +819,7 @@ export function createZAdd( membersScoresMap: Record, options?: ZAddOptions, changedOrIncr?: "CH" | "INCR", -): redis_request.Command { +): command_request.Command { let args = [key]; if (options) { @@ -859,7 +871,7 @@ export function createZInterstore( destination: string, keys: string[] | KeyWeight[], aggregationType?: AggregationType, -): redis_request.Command { +): command_request.Command { const args = createZCmdStoreArgs(destination, keys, aggregationType); return createCommand(RequestType.ZInterStore, args); } @@ -893,14 +905,14 @@ function createZCmdStoreArgs( export function createZRem( key: string, members: string[], -): redis_request.Command { +): command_request.Command { return createCommand(RequestType.ZRem, [key].concat(members)); } /** * @internal */ -export function createZCard(key: string): redis_request.Command { +export function createZCard(key: string): command_request.Command { return createCommand(RequestType.ZCard, [key]); } @@ -910,7 +922,7 @@ export function createZCard(key: string): redis_request.Command { export function createZInterCard( keys: string[], limit?: number, -): redis_request.Command { +): command_request.Command { let args: string[] = keys; args.unshift(keys.length.toString()); @@ -927,7 +939,7 @@ export function createZInterCard( export function createZScore( key: string, member: string, -): redis_request.Command { +): command_request.Command { return createCommand(RequestType.ZScore, [key, member]); } @@ -1078,7 +1090,7 @@ export function createZCount( key: string, minScore: ScoreBoundary, maxScore: ScoreBoundary, -): redis_request.Command { +): command_request.Command { const args = [key]; args.push(getScoreBoundaryArg(minScore)); args.push(getScoreBoundaryArg(maxScore)); @@ -1092,7 +1104,7 @@ export function createZRange( key: string, rangeQuery: RangeByIndex | RangeByScore | RangeByLex, reverse: boolean = false, -): redis_request.Command { +): command_request.Command { const args = createZRangeArgs(key, rangeQuery, reverse, false); return createCommand(RequestType.ZRange, args); } @@ -1104,7 +1116,7 @@ export function createZRangeWithScores( key: string, rangeQuery: RangeByIndex | RangeByScore | RangeByLex, reverse: boolean = false, -): redis_request.Command { +): command_request.Command { const args = createZRangeArgs(key, rangeQuery, reverse, true); return createCommand(RequestType.ZRange, args); } @@ -1112,14 +1124,14 @@ export function createZRangeWithScores( /** * @internal */ -export function createType(key: string): redis_request.Command { +export function createType(key: string): command_request.Command { return createCommand(RequestType.Type, [key]); } /** * @internal */ -export function createStrlen(key: string): redis_request.Command { +export function createStrlen(key: string): command_request.Command { return createCommand(RequestType.Strlen, [key]); } @@ -1129,7 +1141,7 @@ export function createStrlen(key: string): redis_request.Command { export function createLIndex( key: string, index: number, -): redis_request.Command { +): command_request.Command { return createCommand(RequestType.LIndex, [key, index.toString()]); } @@ -1155,7 +1167,7 @@ export function createLInsert( position: InsertPosition, pivot: string, element: string, -): redis_request.Command { +): command_request.Command { return createCommand(RequestType.LInsert, [key, position, pivot, element]); } @@ -1165,7 +1177,7 @@ export function createLInsert( export function createZPopMin( key: string, count?: number, -): redis_request.Command { +): command_request.Command { const args: string[] = count == undefined ? [key] : [key, count.toString()]; return createCommand(RequestType.ZPopMin, args); } @@ -1176,7 +1188,7 @@ export function createZPopMin( export function createZPopMax( key: string, count?: number, -): redis_request.Command { +): command_request.Command { const args: string[] = count == undefined ? [key] : [key, count.toString()]; return createCommand(RequestType.ZPopMax, args); } @@ -1184,14 +1196,14 @@ export function createZPopMax( /** * @internal */ -export function createEcho(message: string): redis_request.Command { +export function createEcho(message: string): command_request.Command { return createCommand(RequestType.Echo, [message]); } /** * @internal */ -export function createPTTL(key: string): redis_request.Command { +export function createPTTL(key: string): command_request.Command { return createCommand(RequestType.PTTL, [key]); } @@ -1202,7 +1214,7 @@ export function createZRemRangeByRank( key: string, start: number, stop: number, -): redis_request.Command { +): command_request.Command { return createCommand(RequestType.ZRemRangeByRank, [ key, start.toString(), @@ -1217,14 +1229,14 @@ export function createZRemRangeByScore( key: string, minScore: ScoreBoundary, maxScore: ScoreBoundary, -): redis_request.Command { +): command_request.Command { const args = [key]; args.push(getScoreBoundaryArg(minScore)); args.push(getScoreBoundaryArg(maxScore)); return createCommand(RequestType.ZRemRangeByScore, args); } -export function createPersist(key: string): redis_request.Command { +export function createPersist(key: string): command_request.Command { return createCommand(RequestType.Persist, [key]); } @@ -1232,7 +1244,7 @@ export function createZRank( key: string, member: string, withScores?: boolean, -): redis_request.Command { +): command_request.Command { const args = [key, member]; if (withScores) { @@ -1317,7 +1329,7 @@ export function createXAdd( key: string, values: [string, string][], options?: StreamAddOptions, -): redis_request.Command { +): command_request.Command { const args = [key]; if (options?.makeStream === false) { @@ -1348,7 +1360,7 @@ export function createXAdd( export function createXTrim( key: string, options: StreamTrimOptions, -): redis_request.Command { +): command_request.Command { const args = [key]; addTrimOptions(options, args); return createCommand(RequestType.XTrim, args); @@ -1357,7 +1369,7 @@ export function createXTrim( /** * @internal */ -export function createTime(): redis_request.Command { +export function createTime(): command_request.Command { return createCommand(RequestType.Time, []); } @@ -1367,7 +1379,7 @@ export function createTime(): redis_request.Command { export function createBRPop( keys: string[], timeout: number, -): redis_request.Command { +): command_request.Command { const args = [...keys, timeout.toString()]; return createCommand(RequestType.BRPop, args); } @@ -1378,7 +1390,7 @@ export function createBRPop( export function createBLPop( keys: string[], timeout: number, -): redis_request.Command { +): command_request.Command { const args = [...keys, timeout.toString()]; return createCommand(RequestType.BLPop, args); } @@ -1429,7 +1441,7 @@ function addStreamsArgs(keys_and_ids: Record, args: string[]) { export function createXRead( keys_and_ids: Record, options?: StreamReadOptions, -): redis_request.Command { +): command_request.Command { const args: string[] = []; if (options) { @@ -1444,7 +1456,7 @@ export function createXRead( /** * @internal */ -export function createXLen(key: string): redis_request.Command { +export function createXLen(key: string): command_request.Command { return createCommand(RequestType.XLen, [key]); } @@ -1454,7 +1466,7 @@ export function createXLen(key: string): redis_request.Command { export function createRename( key: string, newKey: string, -): redis_request.Command { +): command_request.Command { return createCommand(RequestType.Rename, [key, newKey]); } @@ -1464,7 +1476,7 @@ export function createRename( export function createRenameNX( key: string, newKey: string, -): redis_request.Command { +): command_request.Command { return createCommand(RequestType.RenameNX, [key, newKey]); } @@ -1474,7 +1486,7 @@ export function createRenameNX( export function createPfAdd( key: string, elements: string[], -): redis_request.Command { +): command_request.Command { const args = [key, ...elements]; return createCommand(RequestType.PfAdd, args); } @@ -1482,34 +1494,34 @@ export function createPfAdd( /** * @internal */ -export function createPfCount(keys: string[]): redis_request.Command { +export function createPfCount(keys: string[]): command_request.Command { return createCommand(RequestType.PfCount, keys); } /** * @internal */ -export function createObjectEncoding(key: string): redis_request.Command { +export function createObjectEncoding(key: string): command_request.Command { return createCommand(RequestType.ObjectEncoding, [key]); } /** * @internal */ -export function createObjectFreq(key: string): redis_request.Command { +export function createObjectFreq(key: string): command_request.Command { return createCommand(RequestType.ObjectFreq, [key]); } /** * @internal */ -export function createObjectIdletime(key: string): redis_request.Command { +export function createObjectIdletime(key: string): command_request.Command { return createCommand(RequestType.ObjectIdleTime, [key]); } /** * @internal */ -export function createObjectRefcount(key: string): redis_request.Command { +export function createObjectRefcount(key: string): command_request.Command { return createCommand(RequestType.ObjectRefCount, [key]); } diff --git a/node/src/GlideClusterClient.ts b/node/src/GlideClusterClient.ts index 527f1bf672..78ba72eadf 100644 --- a/node/src/GlideClusterClient.ts +++ b/node/src/GlideClusterClient.ts @@ -19,7 +19,7 @@ import { createTime, } from "./Commands"; import { RequestError } from "./Errors"; -import { connection_request, redis_request } from "./ProtobufMessage"; +import { command_request, connection_request } from "./ProtobufMessage"; import { ClusterTransaction } from "./Transaction"; /** @@ -130,48 +130,48 @@ export type SingleNodeRoute = function toProtobufRoute( route: Routes | undefined, -): redis_request.Routes | undefined { +): command_request.Routes | undefined { if (route === undefined) { return undefined; } if (route === "allPrimaries") { - return redis_request.Routes.create({ - simpleRoutes: redis_request.SimpleRoutes.AllPrimaries, + return command_request.Routes.create({ + simpleRoutes: command_request.SimpleRoutes.AllPrimaries, }); } else if (route === "allNodes") { - return redis_request.Routes.create({ - simpleRoutes: redis_request.SimpleRoutes.AllNodes, + return command_request.Routes.create({ + simpleRoutes: command_request.SimpleRoutes.AllNodes, }); } else if (route === "randomNode") { - return redis_request.Routes.create({ - simpleRoutes: redis_request.SimpleRoutes.Random, + return command_request.Routes.create({ + simpleRoutes: command_request.SimpleRoutes.Random, }); } else if (route.type === "primarySlotKey") { - return redis_request.Routes.create({ - slotKeyRoute: redis_request.SlotKeyRoute.create({ - slotType: redis_request.SlotTypes.Primary, + return command_request.Routes.create({ + slotKeyRoute: command_request.SlotKeyRoute.create({ + slotType: command_request.SlotTypes.Primary, slotKey: route.key, }), }); } else if (route.type === "replicaSlotKey") { - return redis_request.Routes.create({ - slotKeyRoute: redis_request.SlotKeyRoute.create({ - slotType: redis_request.SlotTypes.Replica, + return command_request.Routes.create({ + slotKeyRoute: command_request.SlotKeyRoute.create({ + slotType: command_request.SlotTypes.Replica, slotKey: route.key, }), }); } else if (route.type === "primarySlotId") { - return redis_request.Routes.create({ - slotKeyRoute: redis_request.SlotIdRoute.create({ - slotType: redis_request.SlotTypes.Primary, + return command_request.Routes.create({ + slotKeyRoute: command_request.SlotIdRoute.create({ + slotType: command_request.SlotTypes.Primary, slotId: route.id, }), }); } else if (route.type === "replicaSlotId") { - return redis_request.Routes.create({ - slotKeyRoute: redis_request.SlotIdRoute.create({ - slotType: redis_request.SlotTypes.Replica, + return command_request.Routes.create({ + slotKeyRoute: command_request.SlotIdRoute.create({ + slotType: command_request.SlotTypes.Replica, slotId: route.id, }), }); @@ -193,7 +193,7 @@ function toProtobufRoute( port = Number(split[1]); } - return redis_request.Routes.create({ + return command_request.Routes.create({ byAddressRoute: { host, port }, }); } diff --git a/node/src/Transaction.ts b/node/src/Transaction.ts index 8e14d3dd62..372025e432 100644 --- a/node/src/Transaction.ts +++ b/node/src/Transaction.ts @@ -109,7 +109,7 @@ import { createZRemRangeByScore, createZScore, } from "./Commands"; -import { redis_request } from "./ProtobufMessage"; +import { command_request } from "./ProtobufMessage"; /** * Base class encompassing shared commands for both standalone and cluster mode implementations in a transaction. @@ -134,7 +134,7 @@ export class BaseTransaction> { /** * @internal */ - readonly commands: redis_request.Command[] = []; + readonly commands: command_request.Command[] = []; /** * Array of command indexes indicating commands that need to be converted into a `Set` within the transaction. * @internal @@ -148,7 +148,7 @@ export class BaseTransaction> { * @returns The updated transaction instance. */ protected addAndReturn( - command: redis_request.Command, + command: command_request.Command, shouldConvertToSet: boolean = false, ): T { if (shouldConvertToSet) { diff --git a/node/tests/RedisClient.test.ts b/node/tests/RedisClient.test.ts index 0ec781ab17..debe11285d 100644 --- a/node/tests/RedisClient.test.ts +++ b/node/tests/RedisClient.test.ts @@ -14,7 +14,7 @@ import { BufferReader, BufferWriter } from "protobufjs"; import { v4 as uuidv4 } from "uuid"; import { GlideClient, ProtocolVersion, Transaction } from ".."; import { RedisCluster } from "../../utils/TestUtils.js"; -import { redis_request } from "../src/ProtobufMessage"; +import { command_request } from "../src/ProtobufMessage"; import { runBaseTests } from "./SharedTests"; import { checkSimple, @@ -69,7 +69,7 @@ describe("GlideClient", () => { callbackIdx: 1, singleCommand: { requestType: 2, - argsArray: redis_request.Command.ArgsArray.create({ + argsArray: command_request.Command.ArgsArray.create({ args: convertStringArrayToBuffer(["bar1", "bar2"]), }), }, @@ -78,24 +78,24 @@ describe("GlideClient", () => { callbackIdx: 3, singleCommand: { requestType: 4, - argsArray: redis_request.Command.ArgsArray.create({ + argsArray: command_request.Command.ArgsArray.create({ args: convertStringArrayToBuffer(["bar3", "bar4"]), }), }, }; - redis_request.RedisRequest.encodeDelimited(request, writer); - redis_request.RedisRequest.encodeDelimited(request2, writer); + command_request.CommandRequest.encodeDelimited(request, writer); + command_request.CommandRequest.encodeDelimited(request2, writer); const buffer = writer.finish(); const reader = new BufferReader(buffer); - const dec_msg1 = redis_request.RedisRequest.decodeDelimited(reader); + const dec_msg1 = command_request.CommandRequest.decodeDelimited(reader); expect(dec_msg1.callbackIdx).toEqual(1); expect(dec_msg1.singleCommand?.requestType).toEqual(2); expect(dec_msg1.singleCommand?.argsArray?.args).toEqual( convertStringArrayToBuffer(["bar1", "bar2"]), ); - const dec_msg2 = redis_request.RedisRequest.decodeDelimited(reader); + const dec_msg2 = command_request.CommandRequest.decodeDelimited(reader); expect(dec_msg2.callbackIdx).toEqual(3); expect(dec_msg2.singleCommand?.requestType).toEqual(4); expect(dec_msg2.singleCommand?.argsArray?.args).toEqual( diff --git a/node/tests/RedisClientInternals.test.ts b/node/tests/RedisClientInternals.test.ts index c910b3bb1d..8883667c45 100644 --- a/node/tests/RedisClientInternals.test.ts +++ b/node/tests/RedisClientInternals.test.ts @@ -33,12 +33,12 @@ import { Transaction, } from ".."; import { + command_request, connection_request, - redis_request, response, } from "../src/ProtobufMessage"; import { convertStringArrayToBuffer } from "./TestUtilities"; -const { RequestType, RedisRequest } = redis_request; +const { RequestType, CommandRequest } = command_request; beforeAll(() => { Logger.init("info"); @@ -236,14 +236,15 @@ async function testWithClusterResources( async function testSentValueMatches(config: { sendRequest: (client: GlideClient | GlideClusterClient) => Promise; - expectedRequestType: redis_request.RequestType | null | undefined; + expectedRequestType: command_request.RequestType | null | undefined; expectedValue: unknown; }) { let counter = 0; await testWithResources(async (connection, socket) => { socket.on("data", (data) => { const reader = Reader.create(data); - const request = redis_request.RedisRequest.decodeDelimited(reader); + const request = + command_request.CommandRequest.decodeDelimited(reader); expect(request.singleCommand?.requestType).toEqual( config.expectedRequestType, ); @@ -288,7 +289,7 @@ describe("SocketConnectionInternals", () => { await testWithResources(async (connection, socket) => { socket.once("data", (data) => { const reader = Reader.create(data); - const request = RedisRequest.decodeDelimited(reader); + const request = CommandRequest.decodeDelimited(reader); expect(request.singleCommand?.requestType).toEqual( RequestType.Get, ); @@ -342,7 +343,7 @@ describe("SocketConnectionInternals", () => { await testWithResources(async (connection, socket) => { socket.once("data", (data) => { const reader = Reader.create(data); - const request = RedisRequest.decodeDelimited(reader); + const request = CommandRequest.decodeDelimited(reader); expect(request.singleCommand?.requestType).toEqual( RequestType.Get, ); @@ -361,7 +362,7 @@ describe("SocketConnectionInternals", () => { await testWithClusterResources(async (connection, socket) => { socket.once("data", (data) => { const reader = Reader.create(data); - const request = RedisRequest.decodeDelimited(reader); + const request = CommandRequest.decodeDelimited(reader); expect( request.transaction?.commands?.at(0)?.requestType, @@ -390,7 +391,7 @@ describe("SocketConnectionInternals", () => { await testWithClusterResources(async (connection, socket) => { socket.once("data", (data) => { const reader = Reader.create(data); - const request = RedisRequest.decodeDelimited(reader); + const request = CommandRequest.decodeDelimited(reader); expect( request.transaction?.commands?.at(0)?.requestType, @@ -400,7 +401,7 @@ describe("SocketConnectionInternals", () => { ?.length, ).toEqual(1); expect(request.route?.simpleRoutes).toEqual( - redis_request.SimpleRoutes.Random, + command_request.SimpleRoutes.Random, ); sendResponse(socket, ResponseType.Value, request.callbackIdx, { @@ -418,7 +419,7 @@ describe("SocketConnectionInternals", () => { await testWithResources(async (connection, socket) => { socket.once("data", (data) => { const reader = Reader.create(data); - const request = RedisRequest.decodeDelimited(reader); + const request = CommandRequest.decodeDelimited(reader); expect(request.singleCommand?.requestType).toEqual( RequestType.Set, ); @@ -438,7 +439,7 @@ describe("SocketConnectionInternals", () => { const error = "check"; socket.once("data", (data) => { const reader = Reader.create(data); - const request = RedisRequest.decodeDelimited(reader); + const request = CommandRequest.decodeDelimited(reader); expect(request.singleCommand?.requestType).toEqual( RequestType.Get, ); @@ -463,7 +464,7 @@ describe("SocketConnectionInternals", () => { const error = "check"; socket.once("data", (data) => { const reader = Reader.create(data); - const request = RedisRequest.decodeDelimited(reader); + const request = CommandRequest.decodeDelimited(reader); expect(request.singleCommand?.requestType).toEqual( RequestType.Get, ); @@ -491,7 +492,7 @@ describe("SocketConnectionInternals", () => { socket.once("data", (data) => { const reader = Reader.create(data); const request = - redis_request.RedisRequest.decodeDelimited(reader); + command_request.CommandRequest.decodeDelimited(reader); expect(request.singleCommand?.requestType).toEqual( RequestType.Get, ); @@ -514,7 +515,7 @@ describe("SocketConnectionInternals", () => { await testWithResources(async (connection, socket) => { socket.once("data", (data) => { const reader = Reader.create(data); - const request = RedisRequest.decodeDelimited(reader); + const request = CommandRequest.decodeDelimited(reader); expect(request.singleCommand?.requestType).toEqual( RequestType.Set, ); @@ -548,7 +549,7 @@ describe("SocketConnectionInternals", () => { socket.once("data", (data) => { const reader = Reader.create(data); const request = - redis_request.RedisRequest.decodeDelimited(reader); + command_request.CommandRequest.decodeDelimited(reader); expect(request.singleCommand?.requestType).toEqual( RequestType.Get, ); @@ -569,7 +570,7 @@ describe("SocketConnectionInternals", () => { socket.once("data", (data) => { const reader = Reader.create(data); const request = - redis_request.RedisRequest.decodeDelimited(reader); + command_request.CommandRequest.decodeDelimited(reader); expect(request.singleCommand?.requestType).toEqual( RequestType.Get, ); @@ -662,7 +663,7 @@ describe("SocketConnectionInternals", () => { socket.on("data", (data) => { const reader = Reader.create(data); const request = - redis_request.RedisRequest.decodeDelimited(reader); + command_request.CommandRequest.decodeDelimited(reader); expect(request.singleCommand?.requestType).toEqual( RequestType.CustomCommand, ); @@ -673,7 +674,7 @@ describe("SocketConnectionInternals", () => { .toString() === "SET" ) { expect(request.route?.simpleRoutes).toEqual( - redis_request.SimpleRoutes.AllPrimaries, + command_request.SimpleRoutes.AllPrimaries, ); } else if ( request @@ -681,7 +682,7 @@ describe("SocketConnectionInternals", () => { .toString() === "GET" ) { expect(request.route?.slotKeyRoute).toEqual({ - slotType: redis_request.SlotTypes.Replica, + slotType: command_request.SlotTypes.Replica, slotKey: "foo", }); } else { diff --git a/python/python/glide/async_commands/cluster_commands.py b/python/python/glide/async_commands/cluster_commands.py index f2f17a01c6..75d8073d93 100644 --- a/python/python/glide/async_commands/cluster_commands.py +++ b/python/python/glide/async_commands/cluster_commands.py @@ -13,7 +13,7 @@ ) from glide.async_commands.transaction import BaseTransaction, ClusterTransaction from glide.constants import TOK, TClusterResponse, TResult, TSingleNodeRoute -from glide.protobuf.redis_request_pb2 import RequestType +from glide.protobuf.command_request_pb2 import RequestType from glide.routes import Route diff --git a/python/python/glide/async_commands/core.py b/python/python/glide/async_commands/core.py index 330a9018d3..e7b37dc32a 100644 --- a/python/python/glide/async_commands/core.py +++ b/python/python/glide/async_commands/core.py @@ -54,7 +54,7 @@ StreamTrimOptions, ) from glide.constants import TOK, TResult -from glide.protobuf.redis_request_pb2 import RequestType +from glide.protobuf.command_request_pb2 import RequestType from glide.routes import Route from ..glide import Script diff --git a/python/python/glide/async_commands/redis_modules/json.py b/python/python/glide/async_commands/redis_modules/json.py index 5ed6d96302..a38c87b58a 100644 --- a/python/python/glide/async_commands/redis_modules/json.py +++ b/python/python/glide/async_commands/redis_modules/json.py @@ -20,7 +20,7 @@ from glide.async_commands.core import ConditionalChange from glide.constants import TOK, TJsonResponse from glide.glide_client import TGlideClient -from glide.protobuf.redis_request_pb2 import RequestType +from glide.protobuf.command_request_pb2 import RequestType class JsonGetOptions: diff --git a/python/python/glide/async_commands/standalone_commands.py b/python/python/glide/async_commands/standalone_commands.py index cd5518d417..8a70e5503f 100644 --- a/python/python/glide/async_commands/standalone_commands.py +++ b/python/python/glide/async_commands/standalone_commands.py @@ -13,7 +13,7 @@ ) from glide.async_commands.transaction import BaseTransaction, Transaction from glide.constants import OK, TOK, TResult -from glide.protobuf.redis_request_pb2 import RequestType +from glide.protobuf.command_request_pb2 import RequestType class StandaloneCommands(CoreCommands): diff --git a/python/python/glide/async_commands/transaction.py b/python/python/glide/async_commands/transaction.py index 36ce987ea6..461ddf6a9f 100644 --- a/python/python/glide/async_commands/transaction.py +++ b/python/python/glide/async_commands/transaction.py @@ -50,7 +50,7 @@ StreamReadOptions, StreamTrimOptions, ) -from glide.protobuf.redis_request_pb2 import RequestType +from glide.protobuf.command_request_pb2 import RequestType TTransaction = TypeVar("TTransaction", bound="BaseTransaction") diff --git a/python/python/glide/constants.py b/python/python/glide/constants.py index f78398895a..0ff1682b67 100644 --- a/python/python/glide/constants.py +++ b/python/python/glide/constants.py @@ -2,8 +2,8 @@ from typing import Dict, List, Literal, Mapping, Optional, Set, TypeVar, Union +from glide.protobuf.command_request_pb2 import CommandRequest from glide.protobuf.connection_request_pb2 import ConnectionRequest -from glide.protobuf.redis_request_pb2 import RedisRequest from glide.routes import ByAddressRoute, RandomNode, SlotIdRoute, SlotKeyRoute OK: str = "OK" @@ -23,7 +23,7 @@ Set[T], List[T], ] -TRequest = Union[RedisRequest, ConnectionRequest] +TRequest = Union[CommandRequest, ConnectionRequest] # When routing to a single node, response will be T # Otherwise, response will be : {Address : response , ... } with type of Dict[str, T]. TClusterResponse = Union[T, Dict[str, T]] diff --git a/python/python/glide/glide_client.py b/python/python/glide/glide_client.py index 2840caf9a6..865f32af65 100644 --- a/python/python/glide/glide_client.py +++ b/python/python/glide/glide_client.py @@ -21,8 +21,8 @@ ) from glide.logger import Level as LogLevel from glide.logger import Logger as ClientLogger +from glide.protobuf.command_request_pb2 import Command, CommandRequest, RequestType from glide.protobuf.connection_request_pb2 import ConnectionRequest -from glide.protobuf.redis_request_pb2 import Command, RedisRequest, RequestType from glide.protobuf.response_pb2 import RequestErrorType, Response from glide.protobuf_codec import PartialMessageException, ProtobufCodec from glide.routes import Route, set_protobuf_route @@ -247,7 +247,7 @@ async def _execute_command( raise ClosingError( "Unable to execute requests; the client is closed. Please create a new client." ) - request = RedisRequest() + request = CommandRequest() request.callback_idx = self._get_callback_index() request.single_command.request_type = request_type (encoded_args, args_size) = self._encode_and_sum_size(args) @@ -269,7 +269,7 @@ async def _execute_transaction( raise ClosingError( "Unable to execute requests; the client is closed. Please create a new client." ) - request = RedisRequest() + request = CommandRequest() request.callback_idx = self._get_callback_index() transaction_commands = [] for requst_type, args in commands: @@ -298,7 +298,7 @@ async def _execute_script( raise ClosingError( "Unable to execute requests; the client is closed. Please create a new client." ) - request = RedisRequest() + request = CommandRequest() request.callback_idx = self._get_callback_index() request.script_invocation.hash = hash request.script_invocation.args[:] = args if args is not None else [] @@ -419,7 +419,7 @@ def _complete_pubsub_futures_safe(self): if pubsub_message: self._pubsub_futures.pop(0).set_result(pubsub_message) - async def _write_request_await_response(self, request: RedisRequest): + async def _write_request_await_response(self, request: CommandRequest): # Create a response future for this request and add it to the available # futures map response_future = self._get_future(request.callback_idx) diff --git a/python/python/glide/redis_client.py b/python/python/glide/redis_client.py new file mode 100644 index 0000000000..38958d1d0a --- /dev/null +++ b/python/python/glide/redis_client.py @@ -0,0 +1,531 @@ +# Copyright Valkey GLIDE Project Contributors - SPDX Identifier: Apache-2.0 + +import asyncio +import sys +import threading +from typing import Any, Dict, List, Optional, Tuple, Type, Union, cast + +import async_timeout +from glide.async_commands.cluster_commands import ClusterCommands +from glide.async_commands.core import CoreCommands +from glide.async_commands.standalone_commands import StandaloneCommands +from glide.config import BaseClientConfiguration +from glide.constants import DEFAULT_READ_BYTES_SIZE, OK, TRequest, TResult +from glide.exceptions import ( + ClosingError, + ConfigurationError, + ConnectionError, + ExecAbortError, + RequestError, + TimeoutError, +) +from glide.logger import Level as LogLevel +from glide.logger import Logger as ClientLogger +from glide.protobuf.command_request_pb2 import Command, CommandRequest, RequestType +from glide.protobuf.connection_request_pb2 import ConnectionRequest +from glide.protobuf.response_pb2 import RequestErrorType, Response +from glide.protobuf_codec import PartialMessageException, ProtobufCodec +from glide.routes import Route, set_protobuf_route +from typing_extensions import Self + +from .glide import ( + DEFAULT_TIMEOUT_IN_MILLISECONDS, + MAX_REQUEST_ARGS_LEN, + create_leaked_bytes_vec, + start_socket_listener_external, + value_from_pointer, +) + + +def get_request_error_class( + error_type: Optional[RequestErrorType.ValueType], +) -> Type[RequestError]: + if error_type == RequestErrorType.Disconnect: + return ConnectionError + if error_type == RequestErrorType.ExecAbort: + return ExecAbortError + if error_type == RequestErrorType.Timeout: + return TimeoutError + if error_type == RequestErrorType.Unspecified: + return RequestError + return RequestError + + +class BaseRedisClient(CoreCommands): + def __init__(self, config: BaseClientConfiguration): + """ + To create a new client, use the `create` classmethod + """ + self.config: BaseClientConfiguration = config + self._available_futures: dict[int, asyncio.Future] = {} + self._available_callback_indexes: List[int] = list() + self._buffered_requests: List[TRequest] = list() + self._writer_lock = threading.Lock() + self.socket_path: Optional[str] = None + self._reader_task: Optional[asyncio.Task] = None + self._is_closed: bool = False + self._pubsub_futures: List[asyncio.Future] = [] + self._pubsub_lock = threading.Lock() + self._pending_push_notifications: List[Response] = list() + + @classmethod + async def create(cls, config: BaseClientConfiguration) -> Self: + """Creates a Redis client. + + Args: + config (ClientConfiguration): The client configurations. + If no configuration is provided, a default client to "localhost":6379 will be created. + + Returns: + Self: a Redis Client instance. + """ + config = config + self = cls(config) + init_future: asyncio.Future = asyncio.Future() + loop = asyncio.get_event_loop() + + def init_callback(socket_path: Optional[str], err: Optional[str]): + if err is not None: + raise ClosingError(err) + elif socket_path is None: + raise ClosingError( + "Socket initialization error: Missing valid socket path." + ) + else: + # Received socket path + self.socket_path = socket_path + loop.call_soon_threadsafe(init_future.set_result, True) + + start_socket_listener_external(init_callback=init_callback) + + # will log if the logger was created (wrapper or costumer) on info + # level or higher + ClientLogger.log(LogLevel.INFO, "connection info", "new connection established") + # Wait for the socket listener to complete its initialization + await init_future + # Create UDS connection + await self._create_uds_connection() + # Start the reader loop as a background task + self._reader_task = asyncio.create_task(self._reader_loop()) + # Set the client configurations + await self._set_connection_configurations() + return self + + async def _create_uds_connection(self) -> None: + try: + # Open an UDS connection + async with async_timeout.timeout(DEFAULT_TIMEOUT_IN_MILLISECONDS): + reader, writer = await asyncio.open_unix_connection( + path=self.socket_path + ) + self._reader = reader + self._writer = writer + except Exception as e: + await self.close(f"Failed to create UDS connection: {e}") + raise + + def __del__(self) -> None: + try: + if self._reader_task: + self._reader_task.cancel() + except RuntimeError as e: + if "no running event loop" in str(e): + # event loop already closed + pass + + async def close(self, err_message: Optional[str] = None) -> None: + """ + Terminate the client by closing all associated resources, including the socket and any active futures. + All open futures will be closed with an exception. + + Args: + err_message (Optional[str]): If not None, this error message will be passed along with the exceptions when closing all open futures. + Defaults to None. + """ + self._is_closed = True + for response_future in self._available_futures.values(): + if not response_future.done(): + err_message = "" if err_message is None else err_message + response_future.set_exception(ClosingError(err_message)) + try: + self._pubsub_lock.acquire() + for pubsub_future in self._pubsub_futures: + if not response_future.done() and not pubsub_future.cancelled(): + pubsub_future.set_exception(ClosingError("")) + finally: + self._pubsub_lock.release() + + self._writer.close() + await self._writer.wait_closed() + self.__del__() + + def _get_future(self, callback_idx: int) -> asyncio.Future: + response_future: asyncio.Future = asyncio.Future() + self._available_futures.update({callback_idx: response_future}) + return response_future + + def _get_protobuf_conn_request(self) -> ConnectionRequest: + return self.config._create_a_protobuf_conn_request() + + async def _set_connection_configurations(self) -> None: + conn_request = self._get_protobuf_conn_request() + response_future: asyncio.Future = self._get_future(0) + await self._write_or_buffer_request(conn_request) + await response_future + if response_future.result() is not OK: + raise ClosingError(response_future.result()) + + def _create_write_task(self, request: TRequest): + asyncio.create_task(self._write_or_buffer_request(request)) + + async def _write_or_buffer_request(self, request: TRequest): + self._buffered_requests.append(request) + if self._writer_lock.acquire(False): + try: + while len(self._buffered_requests) > 0: + await self._write_buffered_requests_to_socket() + + finally: + self._writer_lock.release() + + async def _write_buffered_requests_to_socket(self) -> None: + requests = self._buffered_requests + self._buffered_requests = list() + b_arr = bytearray() + for request in requests: + ProtobufCodec.encode_delimited(b_arr, request) + self._writer.write(b_arr) + await self._writer.drain() + + # TODO: change `str` to `TEncodable` where `TEncodable = Union[str, bytes]` + def _encode_arg(self, arg: str) -> bytes: + """ + Converts a string argument to bytes. + + Args: + arg (str): An encodable argument. + + Returns: + bytes: The encoded argument as bytes. + """ + + # TODO: Allow passing different encoding options + return bytes(arg, encoding="utf8") + + # TODO: change `List[str]` to `List[TEncodable]` where `TEncodable = Union[str, bytes]` + def _encode_and_sum_size( + self, + args_list: Optional[List[str]], + ) -> Tuple[List[bytes], int]: + """ + Encodes the list and calculates the total memory size. + + Args: + args_list (Optional[List[str]]): A list of strings to be converted to bytes. + If None or empty, returns ([], 0). + + Returns: + int: The total memory size of the encoded arguments in bytes. + """ + args_size = 0 + encoded_args_list: List[bytes] = [] + if not args_list: + return (encoded_args_list, args_size) + for arg in args_list: + encoded_arg = self._encode_arg(arg) + encoded_args_list.append(encoded_arg) + args_size += sys.getsizeof(encoded_arg) + return (encoded_args_list, args_size) + + async def _execute_command( + self, + request_type: RequestType.ValueType, + args: List[str], + route: Optional[Route] = None, + ) -> TResult: + if self._is_closed: + raise ClosingError( + "Unable to execute requests; the client is closed. Please create a new client." + ) + request = CommandRequest() + request.callback_idx = self._get_callback_index() + request.single_command.request_type = request_type + (encoded_args, args_size) = self._encode_and_sum_size(args) + if args_size < MAX_REQUEST_ARGS_LEN: + request.single_command.args_array.args[:] = encoded_args + else: + request.single_command.args_vec_pointer = create_leaked_bytes_vec( + encoded_args + ) + set_protobuf_route(request, route) + return await self._write_request_await_response(request) + + async def _execute_transaction( + self, + commands: List[Tuple[RequestType.ValueType, List[str]]], + route: Optional[Route] = None, + ) -> List[TResult]: + if self._is_closed: + raise ClosingError( + "Unable to execute requests; the client is closed. Please create a new client." + ) + request = CommandRequest() + request.callback_idx = self._get_callback_index() + transaction_commands = [] + for requst_type, args in commands: + command = Command() + command.request_type = requst_type + # For now, we allow the user to pass the command as array of strings + # we convert them here into bytes (the datatype that our rust core expects) + (encoded_args, args_size) = self._encode_and_sum_size(args) + if args_size < MAX_REQUEST_ARGS_LEN: + command.args_array.args[:] = encoded_args + else: + command.args_vec_pointer = create_leaked_bytes_vec(encoded_args) + transaction_commands.append(command) + request.transaction.commands.extend(transaction_commands) + set_protobuf_route(request, route) + return await self._write_request_await_response(request) + + async def _execute_script( + self, + hash: str, + keys: Optional[List[str]] = None, + args: Optional[List[str]] = None, + route: Optional[Route] = None, + ) -> TResult: + if self._is_closed: + raise ClosingError( + "Unable to execute requests; the client is closed. Please create a new client." + ) + request = CommandRequest() + request.callback_idx = self._get_callback_index() + request.script_invocation.hash = hash + request.script_invocation.args[:] = args if args is not None else [] + request.script_invocation.keys[:] = keys if keys is not None else [] + set_protobuf_route(request, route) + return await self._write_request_await_response(request) + + async def get_pubsub_message(self) -> CoreCommands.PubSubMsg: + if self._is_closed: + raise ClosingError( + "Unable to execute requests; the client is closed. Please create a new client." + ) + + if not self.config._is_pubsub_configured(): + raise ConfigurationError( + "The operation will never complete since there was no pubsub subscriptions applied to the client." + ) + + if self.config._get_pubsub_callback_and_context()[0] is not None: + raise ConfigurationError( + "The operation will never complete since messages will be passed to the configured callback." + ) + + # locking might not be required + response_future: asyncio.Future = asyncio.Future() + try: + self._pubsub_lock.acquire() + self._pubsub_futures.append(response_future) + self._complete_pubsub_futures_safe() + finally: + self._pubsub_lock.release() + return await response_future + + def try_get_pubsub_message(self) -> Optional[CoreCommands.PubSubMsg]: + if self._is_closed: + raise ClosingError( + "Unable to execute requests; the client is closed. Please create a new client." + ) + + if not self.config._is_pubsub_configured(): + raise ConfigurationError( + "The operation will never succeed since there was no pubsbub subscriptions applied to the client." + ) + + if self.config._get_pubsub_callback_and_context()[0] is not None: + raise ConfigurationError( + "The operation will never succeed since messages will be passed to the configured callback." + ) + + # locking might not be required + msg: Optional[CoreCommands.PubSubMsg] = None + try: + self._pubsub_lock.acquire() + self._complete_pubsub_futures_safe() + while len(self._pending_push_notifications) and not msg: + push_notification = self._pending_push_notifications.pop(0) + msg = self._notification_to_pubsub_message_safe(push_notification) + finally: + self._pubsub_lock.release() + return msg + + def _cancel_pubsub_futures_with_exception_safe(self, exception: ConnectionError): + while len(self._pubsub_futures): + next_future = self._pubsub_futures.pop(0) + if not next_future.cancelled(): + next_future.set_exception(exception) + + def _notification_to_pubsub_message_safe( + self, response: Response + ) -> Optional[CoreCommands.PubSubMsg]: + pubsub_message = None + push_notification = cast( + Dict[str, Any], value_from_pointer(response.resp_pointer) + ) + message_kind = push_notification["kind"] + if message_kind == "Disconnection": + ClientLogger.log( + LogLevel.WARN, + "disconnect notification", + "Transport disconnected, messages might be lost", + ) + elif ( + message_kind == "Message" + or message_kind == "PMessage" + or message_kind == "SMessage" + ): + values: List = push_notification["values"] + if message_kind == "PMessage": + pubsub_message = BaseRedisClient.PubSubMsg( + message=values[2], channel=values[1], pattern=values[0] + ) + else: + pubsub_message = BaseRedisClient.PubSubMsg( + message=values[1], channel=values[0], pattern=None + ) + elif ( + message_kind == "PSubscribe" + or message_kind == "Subscribe" + or message_kind == "SSubscribe" + or message_kind == "Unsubscribe" + ): + pass + else: + ClientLogger.log( + LogLevel.WARN, + "unknown notification", + f"Unknown notification message: '{message_kind}'", + ) + + return pubsub_message + + def _complete_pubsub_futures_safe(self): + while len(self._pending_push_notifications) and len(self._pubsub_futures): + next_push_notification = self._pending_push_notifications.pop(0) + pubsub_message = self._notification_to_pubsub_message_safe( + next_push_notification + ) + if pubsub_message: + self._pubsub_futures.pop(0).set_result(pubsub_message) + + async def _write_request_await_response(self, request: CommandRequest): + # Create a response future for this request and add it to the available + # futures map + response_future = self._get_future(request.callback_idx) + self._create_write_task(request) + await response_future + return response_future.result() + + def _get_callback_index(self) -> int: + try: + return self._available_callback_indexes.pop() + except IndexError: + # The list is empty + return len(self._available_futures) + + async def _process_response(self, response: Response) -> None: + res_future = self._available_futures.pop(response.callback_idx, None) + if not res_future or response.HasField("closing_error"): + err_msg = ( + response.closing_error + if response.HasField("closing_error") + else f"Client Error - closing due to unknown error. callback index: {response.callback_idx}" + ) + if res_future is not None: + res_future.set_exception(ClosingError(err_msg)) + await self.close(err_msg) + raise ClosingError(err_msg) + else: + self._available_callback_indexes.append(response.callback_idx) + if response.HasField("request_error"): + error_type = get_request_error_class(response.request_error.type) + res_future.set_exception(error_type(response.request_error.message)) + elif response.HasField("resp_pointer"): + res_future.set_result(value_from_pointer(response.resp_pointer)) + elif response.HasField("constant_response"): + res_future.set_result(OK) + else: + res_future.set_result(None) + + async def _process_push(self, response: Response) -> None: + if response.HasField("closing_error") or not response.HasField("resp_pointer"): + err_msg = ( + response.closing_error + if response.HasField("closing_error") + else "Client Error - push notification without resp_pointer" + ) + await self.close(err_msg) + raise ClosingError(err_msg) + + try: + self._pubsub_lock.acquire() + callback, context = self.config._get_pubsub_callback_and_context() + if callback: + pubsub_message = self._notification_to_pubsub_message_safe(response) + if pubsub_message: + callback(pubsub_message, context) + else: + self._pending_push_notifications.append(response) + self._complete_pubsub_futures_safe() + finally: + self._pubsub_lock.release() + + async def _reader_loop(self) -> None: + # Socket reader loop + remaining_read_bytes = bytearray() + while True: + read_bytes = await self._reader.read(DEFAULT_READ_BYTES_SIZE) + if len(read_bytes) == 0: + err_msg = "The communication layer was unexpectedly closed." + await self.close(err_msg) + raise ClosingError(err_msg) + read_bytes = remaining_read_bytes + bytearray(read_bytes) + read_bytes_view = memoryview(read_bytes) + offset = 0 + while offset <= len(read_bytes): + try: + response, offset = ProtobufCodec.decode_delimited( + read_bytes, read_bytes_view, offset, Response + ) + except PartialMessageException: + # Recieved only partial response, break the inner loop + remaining_read_bytes = read_bytes[offset:] + break + response = cast(Response, response) + if response.is_push: + await self._process_push(response=response) + else: + await self._process_response(response=response) + + +class RedisClusterClient(BaseRedisClient, ClusterCommands): + """ + Client used for connection to cluster Redis servers. + For full documentation, see + https://github.com/aws/babushka/wiki/Python-wrapper#redis-cluster + """ + + def _get_protobuf_conn_request(self) -> ConnectionRequest: + return self.config._create_a_protobuf_conn_request(cluster_mode=True) + + +class RedisClient(BaseRedisClient, StandaloneCommands): + """ + Client used for connection to standalone Redis servers. + For full documentation, see + https://github.com/aws/babushka/wiki/Python-wrapper#redis-standalone + """ + + +TRedisClient = Union[RedisClient, RedisClusterClient] diff --git a/python/python/glide/routes.py b/python/python/glide/routes.py index a0c62cb70e..580f85beb0 100644 --- a/python/python/glide/routes.py +++ b/python/python/glide/routes.py @@ -4,8 +4,8 @@ from typing import Optional from glide.exceptions import RequestError -from glide.protobuf.redis_request_pb2 import RedisRequest, SimpleRoutes -from glide.protobuf.redis_request_pb2 import SlotTypes as ProtoSlotTypes +from glide.protobuf.command_request_pb2 import CommandRequest, SimpleRoutes +from glide.protobuf.command_request_pb2 import SlotTypes as ProtoSlotTypes class SlotType(Enum): @@ -92,7 +92,7 @@ def to_protobuf_slot_type(slot_type: SlotType) -> ProtoSlotTypes.ValueType: ) -def set_protobuf_route(request: RedisRequest, route: Optional[Route]) -> None: +def set_protobuf_route(request: CommandRequest, route: Optional[Route]) -> None: if route is None: return elif isinstance(route, AllNodes): diff --git a/python/python/tests/test_proto_coded.py b/python/python/tests/test_proto_coded.py index 2c0a248a1f..3834e5d1dc 100644 --- a/python/python/tests/test_proto_coded.py +++ b/python/python/tests/test_proto_coded.py @@ -1,14 +1,14 @@ # Copyright Valkey GLIDE Project Contributors - SPDX Identifier: Apache-2.0 import pytest -from glide.protobuf.redis_request_pb2 import RedisRequest, RequestType +from glide.protobuf.command_request_pb2 import CommandRequest, RequestType from glide.protobuf.response_pb2 import Response from glide.protobuf_codec import PartialMessageException, ProtobufCodec class TestProtobufCodec: def test_encode_decode_delimited(self): - request = RedisRequest() + request = CommandRequest() request.callback_idx = 1 request.single_command.request_type = RequestType.Set args = [ @@ -26,7 +26,7 @@ def test_encode_decode_delimited(self): offset = 0 b_arr_view = memoryview(b_arr) parsed_request, new_offset = ProtobufCodec.decode_delimited( - b_arr, b_arr_view, offset, RedisRequest + b_arr, b_arr_view, offset, CommandRequest ) assert new_offset == len(b_arr) assert parsed_request.callback_idx == 1