Repository navigation
Add complete Redis and Valkey command surface - #76
Conversation
Cover audited Redis, Valkey, module, KeyDB, and Dragonfly commands with pre-encoded descriptors. Add typed bitmap, HyperLogLog, and geo facets with wire and integration tests. BREAKING CHANGE: IRespireClient implementers must expose the new facets and descriptor ExecuteAsync overload.
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughThe change adds a generated ChangesTyped command platform
Estimated code review effort: 4 (Complex) | ~45 minutes Sequence Diagram(s)sequenceDiagram
participant Application
participant RespireClient
participant RespireCommand
participant DedicatedConnection
participant Redis
Application->>RespireClient: ExecuteAsync(command, args)
RespireClient->>RespireCommand: classify command behavior
RespireClient->>DedicatedConnection: route blocking command
DedicatedConnection->>Redis: send command
Redis-->>DedicatedConnection: return response
DedicatedConnection-->>RespireClient: return result
RespireClient-->>Application: return RespireResult
Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 2📝 Generate docstrings 💡
🛠️ Fix failing CI checks 💡
🧪 Generate unit tests (beta)
Comment |
🧪 Integration Test Results (net10.0)ℹ️ Execution Details
Automated integration testing with Redis containers using TUnit |
🧪 Integration Test Results (net8.0)ℹ️ Execution Details
Automated integration testing with Redis containers using TUnit |
Redis Container Benchmark Results (net8.0)BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat) Runtime=.NET 8.0 IterationCount=3 WarmupCount=1
View raw benchmark output |
Redis Container Benchmark Results (net10.0)BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat) Runtime=.NET 8.0 IterationCount=3 WarmupCount=1
View raw benchmark output |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 97faa51946
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| var storedProcedureName = StoredProcedureName(command.Name, args); | ||
| var commandValue = new CatalogCommand(command, args); | ||
| var response = await (storedProcedureName is null | ||
| ? SendAsync(command.Name, commandValue, CancellationToken.None) |
There was a problem hiding this comment.
Reject connection-scoped descriptors on the shared send path
When callers execute catalog entries such as RespireCommands.Transaction.MULTI, WATCH, SELECT, or SUBSCRIBE, this routes them through a multiplexed connection without reserving that connection. With concurrent traffic, unrelated commands can be captured by a transaction or affected by changed connection state; with multiple configured connections, subsequent EXEC/UNWATCH calls may instead reach another socket. These descriptors need a connection-scoped execution mechanism or must be rejected in this overload.
Useful? React with 👍 / 👎.
| ? SendAsync(command.Name, commandValue, CancellationToken.None) | ||
| : SendStoredProcedureAsync(command.Name, commandValue, CancellationToken.None, storedProcedureName)) |
There was a problem hiding this comment.
Route blocking descriptors through the dedicated pool
When a catalog descriptor for a blocking command is used, for example ExecuteAsync(RespireCommands.List.BLPOP, "jobs", 0), it goes through the ordinary multiplexed SendAsync path with CancellationToken.None. With the default null command timeout, the shared socket can remain blocked indefinitely and every pipelined command behind it stalls, bypassing the isolation and cancellation behavior implemented by SendBlockingAsync for typed blocking commands.
Useful? React with 👍 / 👎.
| ({ } from, null) => client.IntegerAsync( | ||
| "BITPOS", new Cmd3(RespireCommands.Bitmap.BITPOS.Verb, client.Key(in key), value, from), cancellationToken), |
There was a problem hiding this comment.
Honor BIT indexing when end is omitted
When a caller supplies start and unit: BitIndexUnit.Bit but leaves end null, this branch emits only BITPOS key bit start; Redis interprets that start as a byte offset because the BYTE|BIT token can only be sent after an end argument. The method therefore silently searches from the wrong position; it should either emit an appropriate end before BIT or reject this option combination.
Useful? React with 👍 / 👎.
🧪 Integration Test Results (net10.0)ℹ️ Execution Details
Automated integration testing with Redis containers using TUnit |
🧪 Integration Test Results (net8.0)ℹ️ Execution Details
Automated integration testing with Redis containers using TUnit |
Redis Container Benchmark Results (net8.0)BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat) Runtime=.NET 8.0 IterationCount=3 WarmupCount=1
View raw benchmark output |
Redis Container Benchmark Results (net10.0)BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat) Runtime=.NET 8.0 IterationCount=3 WarmupCount=1
View raw benchmark output |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: abc104f4a5
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| "CLIENT NO-EVICT" or "CLIENT NO-TOUCH" or "CLIENT REPLY" or "CLIENT SETINFO" or | ||
| "CLIENT SETNAME" or "CLIENT TRACKING" or "DISCARD" or "EXEC" or "HELLO" or | ||
| "MONITOR" or "MULTI" or "PSUBSCRIBE" or "PSYNC" or "PUNSUBSCRIBE" or "QUIT" or | ||
| "READONLY" or "READWRITE" or "REPLCONF" or "RESET" or "SCRIPT DEBUG" or "SELECT" or |
There was a problem hiding this comment.
Reject SCRIPT DEBUG through the parent descriptor
When callers execute RespireCommands.Scripting.SCRIPT with arguments such as "DEBUG", "SYNC", classification sees only the parent name SCRIPT and routes it through the multiplexed connection, even though the equivalent SCRIPT DEBUG descriptor is correctly connection-scoped. This fresh parent-descriptor path bypasses the new rejection and can put the shared socket into Lua-debugging state, causing a subsequent script on that socket to disrupt unrelated traffic; inspect the first argument for DEBUG or reject the parent SCRIPT descriptor.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Actionable comments posted: 5
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/API_DESIGN.md`:
- Around line 292-295: Update the three raw-command examples in the surrounding
catalog section to use distinct result variable names and dispose each
RespireResult with using. Separate the alternatives into individual code blocks
if they share scope, preserving each command’s existing behavior while ensuring
the examples compile and pooled memory is released.
In `@src/Respire/Facets/BitmapCommands.cs`:
- Around line 68-72: Update ValueOperation to validate the complete BITFIELD
encoding and offset grammar before constructing BitFieldOperation: accept signed
widths 1–64, unsigned widths 1–63, and only non-negative numeric offsets
(including valid # offsets). Reject malformed encodings and offsets such as u64,
i0, x8, -1, and `#-1`, and add pre-send tests covering invalid widths and offsets.
In `@src/Respire/Facets/GeoCommands.cs`:
- Around line 314-317: Extend the validation near the existing Count check in
the Geo command options handling to throw ArgumentException when options.Any is
true and options.Sort is not GeoSortOrder.Unsorted. Update GeoCommandTests.cs to
assert this local validation and stop expecting the invalid command to be sent
to Redis.
- Around line 293-301: Update the shape validation in the
GEOSEARCH/GEOSEARCHSTORE path around shape.IsRadius to reject non-finite
dimensions: validate radius for circles and width and height for boxes with
double.IsFinite before issuing either command, while preserving the existing
positive-value checks. Add no-request tests covering NaN and positive infinity
for both circle and box dimensions.
In `@tests/Respire.Tests/Networking/BitmapCommandTests.cs`:
- Around line 33-40: Update the BITFIELD assertion using FieldAsync to pass
CollectionOrdering.Matching to IsEquivalentTo, ensuring results are validated in
the same order as the input operations. Leave the expected values and the
separate FieldReadOnlyAsync assertion unchanged.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 61a6a3b6-3856-4e5b-9e8f-dc5a245c88f7
📒 Files selected for processing (26)
README.mdbenchmarks/Respire.Benchmarks/RedisContainerBenchmarks.csdocs/API_DESIGN.mddocs/COMMAND_COVERAGE.mddocs/WHY_RESPIRE.mdsrc/Respire/Commands/CommandStructs.cssrc/Respire/Commands/Verbs.cssrc/Respire/Facets/BitmapCommands.cssrc/Respire/Facets/GeoCommands.cssrc/Respire/Facets/HyperLogLogCommands.cssrc/Respire/IRespireClient.cssrc/Respire/Internal/ResponseReader.cssrc/Respire/RespireClient.cssrc/Respire/RespireCommand.cssrc/Respire/RespireCommands.g.cssrc/Respire/RespireValue.cstests/Respire.Extensions.Caching.Tests/RespireDistributedCacheTests.cstests/Respire.IntegrationTests/TypedCommandIntegrationTests.cstests/Respire.Tests/Networking/BitmapCommandTests.cstests/Respire.Tests/Networking/CommandCatalogTests.cstests/Respire.Tests/Networking/GeoCommandTests.cstests/Respire.Tests/Networking/HyperLogLogCommandTests.cstools/Generate-CommandCatalog.ps1website/docs/commands/collections.mdwebsite/docs/guides/raw-commands.mdwebsite/docs/roadmap.md
🧪 Integration Test Results (net10.0)ℹ️ Execution Details
Automated integration testing with Redis containers using TUnit |
🧪 Integration Test Results (net8.0)ℹ️ Execution Details
Automated integration testing with Redis containers using TUnit |
Redis Container Benchmark Results (net8.0)BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat) Runtime=.NET 8.0 IterationCount=3 WarmupCount=1
View raw benchmark output |
Redis Container Benchmark Results (net10.0)BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat) Runtime=.NET 8.0 IterationCount=3 WarmupCount=1
View raw benchmark output |
🧪 Integration Test Results (net10.0)ℹ️ Execution Details
Automated integration testing with Redis containers using TUnit |
🧪 Integration Test Results (net8.0)ℹ️ Execution Details
Automated integration testing with Redis containers using TUnit |
🧪 Integration Test Results (net10.0)ℹ️ Execution Details
Automated integration testing with Redis containers using TUnit |
🧪 Integration Test Results (net8.0)ℹ️ Execution Details
Automated integration testing with Redis containers using TUnit |
🧪 Integration Test Results (net8.0)ℹ️ Execution Details
Automated integration testing with Redis containers using TUnit |
Redis Container Benchmark Results (net10.0)BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat) Runtime=.NET 8.0 IterationCount=3 WarmupCount=1
View raw benchmark output |
Redis Container Benchmark Results (net8.0)BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat) Runtime=.NET 8.0 IterationCount=3 WarmupCount=1
View raw benchmark output |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: c924acfc15
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| Add-Commands $commands 'cms' 'Redis' 'CMS.INCRBY,CMS.INFO,CMS.INITBYDIM,CMS.INITBYPROB,CMS.MERGE,CMS.QUERY' | ||
| Add-Commands $commands 'topk' 'Redis' 'TOPK.ADD,TOPK.COUNT,TOPK.INCRBY,TOPK.INFO,TOPK.LIST,TOPK.QUERY,TOPK.RESERVE' | ||
| Add-Commands $commands 'tdigest' 'Redis' 'TDIGEST.ADD,TDIGEST.BYRANK,TDIGEST.BYREVRANK,TDIGEST.CDF,TDIGEST.CREATE,TDIGEST.INFO,TDIGEST.MAX,TDIGEST.MERGE,TDIGEST.MIN,TDIGEST.QUANTILE,TDIGEST.RANK,TDIGEST.RESET,TDIGEST.REVRANK,TDIGEST.TRIMMED_MEAN' | ||
| Add-Commands $commands 'json' 'Redis' 'JSON.ARRAPPEND,JSON.ARRINDEX,JSON.ARRINSERT,JSON.ARRLEN,JSON.ARRPOP,JSON.ARRTRIM,JSON.CLEAR,JSON.DEBUG,JSON.DEBUG MEMORY,JSON.DEL,JSON.FORGET,JSON.GET,JSON.MERGE,JSON.MGET,JSON.MSET,JSON.NUMINCRBY,JSON.NUMMULTBY,JSON.OBJKEYS,JSON.OBJLEN,JSON.RESP,JSON.SET,JSON.STRAPPEND,JSON.STRLEN,JSON.TOGGLE,JSON.TYPE' |
There was a problem hiding this comment.
Add JSON.NUMPOWBY to the Redis catalog
The manually maintained Redis JSON list includes the related JSON.NUMMULTBY command but omits the documented JSON.NUMPOWBY command. A repo-wide search confirms it is absent from both this generator and RespireCommands.g.cs, so callers cannot discover or execute it through the advertised complete Redis 8.10 catalog; add it here and regenerate the output and coverage counts.
Useful? React with 👍 / 👎.
🧪 Integration Test Results (net10.0)ℹ️ Execution Details
Automated integration testing with Redis containers using TUnit |
🧪 Integration Test Results (net8.0)ℹ️ Execution Details
Automated integration testing with Redis containers using TUnit |
Redis Container Benchmark Results (net10.0)BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat) Runtime=.NET 8.0 IterationCount=3 WarmupCount=1
View raw benchmark output |
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (3)
tests/Respire.Tests/Networking/GeoCommandTests.cs (1)
38-41: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winPreserve ordered protocol assertions.
Pass
CollectionOrdering.Matchingto theIsEquivalentToassertions forHashAsync,PositionAsync, andserver.ReceivedCommands. These results are positional, so reordered replies or commands must fail the test.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@tests/Respire.Tests/Networking/GeoCommandTests.cs` around lines 38 - 41, Update the IsEquivalentTo assertions for Geo.HashAsync and Geo.PositionAsync to pass CollectionOrdering.Matching, and apply the same ordering option to the server.ReceivedCommands assertion in the surrounding test. Preserve the existing expected values while ensuring reordered replies or commands fail validation.tests/Respire.Tests/Networking/CommandCatalogTests.cs (1)
133-144: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winAssert RESP token boundaries, not only the rendered command string.
FakeRespServer.RecordCommandjoins parsed values with spaces. A four-token frame and a five-token frame can therefore produce the sameReceivedCommandsvalue. Capture the parsed arguments or raw RESP frame, and assert four bulk strings with the JSON value as one argument.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@tests/Respire.Tests/Networking/CommandCatalogTests.cs` around lines 133 - 144, Update CatalogCommand_PreservesArgumentsAsSingleTokens to validate parsed RESP token boundaries rather than only server.ReceivedCommands. Capture the server’s parsed arguments or raw frame through the existing FakeRespServer API, then assert the request contains exactly four bulk-string arguments, with the JSON value represented as one argument.tools/Generate-CommandCatalog.ps1 (1)
137-161: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winSort groups by the source group key.
$allReferencesinherits the loop order, but sorting by generated class names can placegeneric(Key) out of group order. UseSort-Object Nameto preserve the documented ordering.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@tools/Generate-CommandCatalog.ps1` around lines 137 - 161, Update the outer group iteration that builds `$allReferences` to sort each grouped result by its original `Name` key, rather than by `Get-ClassName $_.Name`. Preserve the existing command-name sorting and generated class-name logic so `All` remains ordered by source group and command name.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@tests/Respire.Tests/Networking/CommandCatalogTests.cs`:
- Around line 133-144: Update CatalogCommand_PreservesArgumentsAsSingleTokens to
validate parsed RESP token boundaries rather than only server.ReceivedCommands.
Capture the server’s parsed arguments or raw frame through the existing
FakeRespServer API, then assert the request contains exactly four bulk-string
arguments, with the JSON value represented as one argument.
In `@tests/Respire.Tests/Networking/GeoCommandTests.cs`:
- Around line 38-41: Update the IsEquivalentTo assertions for Geo.HashAsync and
Geo.PositionAsync to pass CollectionOrdering.Matching, and apply the same
ordering option to the server.ReceivedCommands assertion in the surrounding
test. Preserve the existing expected values while ensuring reordered replies or
commands fail validation.
In `@tools/Generate-CommandCatalog.ps1`:
- Around line 137-161: Update the outer group iteration that builds
`$allReferences` to sort each grouped result by its original `Name` key, rather
than by `Get-ClassName $_.Name`. Preserve the existing command-name sorting and
generated class-name logic so `All` remains ordered by source group and command
name.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: e55e8bfe-1854-4c1c-8428-fdbf2bb56520
📒 Files selected for processing (10)
benchmarks/Respire.Benchmarks/CommandInputBenchmarks.csdocs/COMMAND_COVERAGE.mdsrc/Respire/Facets/GeoCommands.cssrc/Respire/Facets/HyperLogLogCommands.cssrc/Respire/RespireCommand.cssrc/Respire/RespireCommands.g.cstests/Respire.Tests/Networking/CommandCatalogTests.cstests/Respire.Tests/Networking/GeoCommandTests.cstests/Respire.Tests/Networking/HyperLogLogCommandTests.cstools/Generate-CommandCatalog.ps1
🚧 Files skipped from review as they are similar to previous changes (6)
- tests/Respire.Tests/Networking/HyperLogLogCommandTests.cs
- docs/COMMAND_COVERAGE.md
- src/Respire/RespireCommand.cs
- src/Respire/Facets/GeoCommands.cs
- src/Respire/Facets/HyperLogLogCommands.cs
- benchmarks/Respire.Benchmarks/CommandInputBenchmarks.cs
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: cac6848a67
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| "BLMOVE" or "BLMOVEM" or "BLMPOP" or "BLPOP" or "BRPOP" or "BRPOPLPUSH" or | ||
| "BZMPOP" or "BZPOPMAX" or "BZPOPMIN" => RespireCommandBehavior.Blocking, | ||
|
|
||
| "XREAD" or "XREADGROUP" => RespireCommandBehavior.BlockingWhenRequested, |
There was a problem hiding this comment.
Route blocking TS.READ calls through the dedicated pool
When RespireCommands.TimeSeries.TS_READ is invoked with its BLOCK option, especially an unbounded timeout, it falls through to Multiplexed because only XREAD and XREADGROUP are classified as conditionally blocking. The command can therefore hold a shared socket and stall every pipelined request behind it; classify TS.READ as BlockingWhenRequested so catalog execution uses SendBlockingAsync.
Useful? React with 👍 / 👎.
| public readonly record struct GeoSearchResult( | ||
| string Member, |
There was a problem hiding this comment.
Preserve binary members in geo search results
When a member added through GeoEntry.Member contains non-UTF-8 bytes, ParseSearch converts the returned bytes with AsString(), which replaces invalid sequences and makes GeoSearchResult.Member unable to identify or round-trip the stored member; distinct binary members can even collapse to the same string. Keep this result member in a binary-preserving representation such as byte[] rather than declaring it as string.
Useful? React with 👍 / 👎.
Redis Container Benchmark Results (net8.0)BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat) Runtime=.NET 8.0 IterationCount=3 WarmupCount=1
View raw benchmark output |
🧪 Integration Test Results (net8.0)ℹ️ Execution Details
Automated integration testing with Redis containers using TUnit |
🧪 Integration Test Results (net10.0)ℹ️ Execution Details
Automated integration testing with Redis containers using TUnit |
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
tests/Respire.Tests/Networking/GeoCommandTests.cs (1)
38-41: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winMake the sequence assertions order-sensitive.
IsEquivalentToignores order by default. PassTUnit.Assertions.Enums.CollectionOrdering.Matchingto the hash, position, andReceivedCommandsassertions.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@tests/Respire.Tests/Networking/GeoCommandTests.cs` around lines 38 - 41, Update the assertions in the Geo command tests to pass CollectionOrdering.Matching to IsEquivalentTo for the hash, position, and ReceivedCommands sequences, ensuring each expected element is validated in order.benchmarks/Respire.Benchmarks/CommandInputBenchmarks.cs (1)
2-26: 🚀 Performance & Scalability | 🟡 Minor | ⚡ Quick winUse a Valkey catalog command in
ClassifyCatalogCommand.BLMOVEMis cataloged as Redis-only. UseBLMOVEor another command with theValkeysource flag.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@benchmarks/Respire.Benchmarks/CommandInputBenchmarks.cs` around lines 2 - 26, Update CommandInputBenchmarks.ClassifyCatalogCommand to classify a command cataloged for Valkey, replacing the Redis-only BLMOVEM input with BLMOVE or another command whose RespireCommandSource.Valkey flag is valid.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@benchmarks/Respire.Benchmarks/CommandInputBenchmarks.cs`:
- Around line 2-26: Update CommandInputBenchmarks.ClassifyCatalogCommand to
classify a command cataloged for Valkey, replacing the Redis-only BLMOVEM input
with BLMOVE or another command whose RespireCommandSource.Valkey flag is valid.
In `@tests/Respire.Tests/Networking/GeoCommandTests.cs`:
- Around line 38-41: Update the assertions in the Geo command tests to pass
CollectionOrdering.Matching to IsEquivalentTo for the hash, position, and
ReceivedCommands sequences, ensuring each expected element is validated in
order.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: f529bb28-3f21-498b-8ce9-b668e8a4d8a2
📒 Files selected for processing (5)
benchmarks/Respire.Benchmarks/CommandInputBenchmarks.cssrc/Respire/Facets/GeoCommands.cssrc/Respire/RespireCommand.cstests/Respire.Tests/Networking/CommandCatalogTests.cstests/Respire.Tests/Networking/GeoCommandTests.cs
🚧 Files skipped from review as they are similar to previous changes (3)
- tests/Respire.Tests/Networking/CommandCatalogTests.cs
- src/Respire/RespireCommand.cs
- src/Respire/Facets/GeoCommands.cs
🧪 Integration Test Results (net10.0)ℹ️ Execution Details
Automated integration testing with Redis containers using TUnit |
🧪 Integration Test Results (net8.0)ℹ️ Execution Details
Automated integration testing with Redis containers using TUnit |
Redis Container Benchmark Results (net8.0)BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat) Runtime=.NET 8.0 IterationCount=3 WarmupCount=1
View raw benchmark output |
Redis Container Benchmark Results (net10.0)BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat) Runtime=.NET 8.0 IterationCount=3 WarmupCount=1
View raw benchmark output |
Summary
Coverage
Source provenance is exposed through
RespireCommand.Sources; it intentionally records documentation provenance, not runtime feature negotiation.Validation
dotnet build Respire.slnx -c Release --no-restoredotnet test Respire.slnx -c Release --no-build --no-restore— 624 passed across .NET 8 and .NET 10dotnet format --verify-no-changesnpm run buildinwebsiteBreaking change
Custom
IRespireClientimplementations must add the Bitmap, HyperLogLog, and Geo facet properties and theExecuteAsync(RespireCommand, ...)overload.Summary by CodeRabbit
New Features
Documentation
Tests