Skip to content

Implement Redis Sorted Set Operations #5

@fnLog0

Description

@fnLog0

🎯 Objective

Implement comprehensive Redis Sorted Set operations following the same detailed pattern as hash.rs, including all essential Sorted Set operations with HTTP REST API, WebSocket support, and TypeScript SDK integration.

📋 Description

Redis Sorted Sets are collections of unique strings where each member is associated with a score. This issue covers implementing all essential Sorted Set operations including ZADD, ZREM, ZSCORE, ZRANK, ZREVRANK, ZRANGE, ZREVRANGE, ZRANGEBYSCORE, ZREVRANGEBYSCORE, ZCARD, ZCOUNT, ZINCRBY, ZPOPMAX, ZPOPMIN, and batch operations following the comprehensive hash.rs pattern.

🚀 Priority

High Priority - Phase 1, Redis Completion

📝 Tasks

Task 1: Create Redis Sorted Set Primitives with Test Cases

1.1 Create Sorted Set Primitives (crates/adapter/redis/primitives/sorted_set.rs)

  • Core Sorted Set Operations

    • Implement RedisSortedSet struct
    • Basic operations (zadd, zrem, zscore, zcard, zcount)
    • Rank operations (zrank, zrevrank)
    • Range operations (zrange, zrevrange, zrangebyscore, zrevrangebyscore)
    • Score operations (zincrby, zpopmax, zpopmin)
    • Management operations (del, exists, ttl, expire)
  • Pipeline Operations

    • with_pipeline() method
    • zadd_many() - Batch add operations
    • zget_many() - Batch get operations
    • zrem_many() - Batch remove operations
    • zscore_many() - Batch score operations
  • Transaction Operations

    • with_transaction() method
    • Atomic batch operations
    • Transaction rollback handling
  • Lua Script Operations

    • create_script() method
    • eval_script() method
    • Custom Lua scripts for complex operations

1.2 Update Primitives Module (crates/adapter/redis/primitives/mod.rs)

  • Add pub mod sorted_set; to the module exports
  • Update documentation to include Sorted Set operations

1.3 Unit Tests for Sorted Set Primitives

  • Core Operations Tests

    • Test all basic Sorted Set operations
    • Test error handling and edge cases
    • Test with invalid keys and values
  • Pipeline Tests

    • Test batch operations
    • Test pipeline efficiency
    • Test pipeline error handling
  • Transaction Tests

    • Test atomic operations
    • Test transaction rollback
    • Test concurrent transactions
  • Lua Script Tests

    • Test custom Lua scripts
    • Test script execution
    • Test script error handling

Task 2: Build HTTP and WebSocket APIs with Test Cases

2.1 Create Sorted Set Operations in Common Layer (api/src/routes/common/sorted_set.rs)

  • Data Structures

    • Implement SortedSetOperation struct
    • Implement SortedSetResponse struct
    • Implement SortedSetInfo struct
    • Implement SortedSetMember struct
  • Single Member Operations

    • Implement sorted_set_add() - ZADD operation
    • Implement sorted_set_remove() - ZREM operation
    • Implement sorted_set_score() - ZSCORE operation
    • Implement sorted_set_rank() - ZRANK operation
    • Implement sorted_set_revrank() - ZREVRANK operation
    • Implement sorted_set_increment() - ZINCRBY operation
    • Implement sorted_set_pop_max() - ZPOPMAX operation
    • Implement sorted_set_pop_min() - ZPOPMIN operation
  • Range Operations

    • Implement sorted_set_range() - ZRANGE operation
    • Implement sorted_set_revrange() - ZREVRANGE operation
    • Implement sorted_set_range_by_score() - ZRANGEBYSCORE operation
    • Implement sorted_set_revrange_by_score() - ZREVRANGEBYSCORE operation
    • Implement sorted_set_get_all() - Get all members with scores
  • Sorted Set Management

    • Implement delete_sorted_set() - Delete entire sorted set
    • Implement sorted_set_exists() - Check if sorted set exists
    • Implement get_sorted_set_ttl() - Get sorted set TTL
    • Implement set_sorted_set_ttl() - Set sorted set TTL
    • Implement get_sorted_set_cardinality() - ZCARD operation
    • Implement get_sorted_set_count() - ZCOUNT operation
  • Batch Operations

    • Implement get_multiple_sorted_set_scores() - Get scores from multiple sets
    • Implement add_multiple_sorted_sets() - Add to multiple sorted sets
    • Implement remove_multiple_sorted_set_members() - Remove from multiple sets
    • Implement get_multiple_sorted_set_cardinalities() - Get cardinalities of multiple sets

2.2 Create HTTP Routes (api/src/routes/redis/sorted_set.rs)

  • Request Structures

    • AddSortedSetMemberRequest - For add operations
    • RemoveSortedSetMemberRequest - For remove operations
    • IncrementSortedSetScoreRequest - For increment operations
    • RangeSortedSetRequest - For range operations
    • BatchAddSortedSetRequest - For batch add operations
    • BatchGetSortedSetRequest - For batch get operations
    • SetSortedSetTtlRequest - For TTL operations
  • Single Member Handlers

    • add_member_handler() - POST /redis/sorted-set/:key/add
    • remove_member_handler() - DELETE /redis/sorted-set/:key/:member
    • get_score_handler() - GET /redis/sorted-set/:key/:member/score
    • get_rank_handler() - GET /redis/sorted-set/:key/:member/rank
    • get_revrank_handler() - GET /redis/sorted-set/:key/:member/revrank
    • increment_score_handler() - POST /redis/sorted-set/:key/:member/increment
    • pop_max_handler() - DELETE /redis/sorted-set/:key/pop-max
    • pop_min_handler() - DELETE /redis/sorted-set/:key/pop-min
  • Range Operation Handlers

    • get_range_handler() - GET /redis/sorted-set/:key/range
    • get_revrange_handler() - GET /redis/sorted-set/:key/revrange
    • get_range_by_score_handler() - GET /redis/sorted-set/:key/range-by-score
    • get_revrange_by_score_handler() - GET /redis/sorted-set/:key/revrange-by-score
    • get_all_handler() - GET /redis/sorted-set/:key
  • Sorted Set Management Handlers

    • delete_sorted_set_handler() - DELETE /redis/sorted-set/:key
    • sorted_set_exists_handler() - GET /redis/sorted-set/:key/exists
    • get_sorted_set_ttl_handler() - GET /redis/sorted-set/:key/ttl
    • set_sorted_set_ttl_handler() - POST /redis/sorted-set/:key/ttl
    • get_cardinality_handler() - GET /redis/sorted-set/:key/cardinality
    • get_count_handler() - GET /redis/sorted-set/:key/count
  • Batch Operation Handlers

    • batch_get_scores_handler() - POST /redis/sorted-set/batch/scores
    • batch_add_members_handler() - POST /redis/sorted-set/batch/add
    • batch_remove_members_handler() - POST /redis/sorted-set/batch/remove
    • batch_get_cardinalities_handler() - POST /redis/sorted-set/batch/cardinalities
  • Route Configuration

    • Create create_redis_sorted_set_routes() function
    • Add all routes with proper HTTP methods
    • Add method not allowed handler
    • Integrate with main router

2.3 Create WebSocket Routes (api/src/routes/redis_ws/sorted_set.rs)

  • WebSocket Message Types

    • SortedSetWsMessage enum with all operations
    • SortedSetWsResponse enum for responses
    • Implement serialization/deserialization
  • WebSocket Handlers

    • redis_ws_sorted_set_handler() - Main WebSocket handler
    • handle_redis_ws_sorted_set_socket() - Socket message processing
    • Support all Sorted Set operations via WebSocket

2.4 API Integration

  • Update Main Router
    • Add Sorted Set routes to main router
    • Add WebSocket Sorted Set routes
    • Update route documentation

2.5 API Tests

  • Common Layer Tests (api/tests/common/sorted_set.rs)

    • Test all Sorted Set operations in common layer
    • Test error handling
    • Test edge cases
  • HTTP Route Tests (api/tests/redis/sorted_set.rs)

    • Test all HTTP endpoints
    • Test request/response formats
    • Test error responses
  • WebSocket Tests (api/tests/redis_ws/sorted_set.rs)

    • Test WebSocket connections
    • Test WebSocket message handling
    • Test real-time operations

Task 3: Build TypeScript SDK with Test Cases

3.1 Add Sorted Set Client (ts/src/clients/sorted-set.ts)

  • Sorted Set Client Class

    • Create SortedSetClient class extending BaseClient
    • Implement all Sorted Set operations
    • Add proper error handling
    • Add TypeScript types
  • Sorted Set Operations

    • zadd(key, member, score) - Add member with score
    • zrem(key, member) - Remove member
    • zscore(key, member) - Get member score
    • zrank(key, member) - Get member rank
    • zrevrank(key, member) - Get member reverse rank
    • zincrby(key, member, increment) - Increment member score
    • zpopmax(key, count?) - Pop members with highest scores
    • zpopmin(key, count?) - Pop members with lowest scores
    • zrange(key, start, stop, withscores?) - Get range by rank
    • zrevrange(key, start, stop, withscores?) - Get reverse range by rank
    • zrangebyscore(key, min, max, withscores?, limit?) - Get range by score
    • zrevrangebyscore(key, max, min, withscores?, limit?) - Get reverse range by score
    • zcard(key) - Get cardinality
    • zcount(key, min, max) - Count members in score range
  • Batch Operations

    • batchZadd(operations) - Batch add members
    • batchZrem(operations) - Batch remove members
    • batchZscore(operations) - Batch get scores
    • batchZcard(keys) - Batch get cardinalities

3.2 Add Sorted Set Types (ts/src/types/sorted-set.ts)

  • Type Definitions
    • SortedSetOperation interface
    • SortedSetResponse interface
    • SortedSetInfo interface
    • SortedSetMember interface
    • WebSocket message types

3.3 Add Sorted Set WebSocket Client (ts/src/clients/sorted-set.ts)

  • WebSocket Support
    • createSortedSetWebSocket() method
    • WebSocket message handling
    • Real-time Sorted Set operations

3.4 SDK Integration

  • Update SDK Exports
    • Add Sorted Set client to main exports
    • Add Sorted Set types to main exports
    • Update SDK documentation

3.5 TypeScript SDK Tests

  • TypeScript SDK Tests (ts/src/__tests__/sorted-set-client.test.ts)

    • Test all Sorted Set operations
    • Test WebSocket operations
    • Test error handling
  • End-to-End Tests

    • Test Sorted Set operations with real Redis
    • Test concurrent Sorted Set operations
    • Test Sorted Set operations with large datasets

📊 Acceptance Criteria

  • All basic Sorted Set operations (ZADD, ZREM, ZSCORE, ZRANK, ZREVRANK, ZCARD, ZCOUNT) implemented
  • Advanced Sorted Set operations (ZRANGE, ZREVRANGE, ZRANGEBYSCORE, ZREVRANGEBYSCORE, ZINCRBY, ZPOPMAX, ZPOPMIN) implemented
  • Batch operations for performance
  • HTTP REST API endpoints working with proper request/response structures
  • WebSocket support for real-time Sorted Set operations
  • TypeScript SDK with full Sorted Set support
  • Comprehensive test coverage (>90%)
  • Documentation updated with Sorted Set examples
  • Follows same pattern as hash.rs implementation

🔧 Technical Details

API Endpoints (Following hash.rs pattern)

# Single member operations
POST /redis/sorted-set/:key/add
DELETE /redis/sorted-set/:key/:member
GET /redis/sorted-set/:key/:member/score
GET /redis/sorted-set/:key/:member/rank
GET /redis/sorted-set/:key/:member/revrank
POST /redis/sorted-set/:key/:member/increment
DELETE /redis/sorted-set/:key/pop-max
DELETE /redis/sorted-set/:key/pop-min

# Range operations
GET /redis/sorted-set/:key/range?start=0&stop=-1&withscores=false
GET /redis/sorted-set/:key/revrange?start=0&stop=-1&withscores=false
GET /redis/sorted-set/:key/range-by-score?min=0&max=100&withscores=false&limit=10
GET /redis/sorted-set/:key/revrange-by-score?max=100&min=0&withscores=false&limit=10
GET /redis/sorted-set/:key

# Sorted set management
DELETE /redis/sorted-set/:key
GET /redis/sorted-set/:key/exists
GET /redis/sorted-set/:key/ttl
POST /redis/sorted-set/:key/ttl
GET /redis/sorted-set/:key/cardinality
GET /redis/sorted-set/:key/count

# Batch operations
POST /redis/sorted-set/batch/scores
POST /redis/sorted-set/batch/add
POST /redis/sorted-set/batch/remove
POST /redis/sorted-set/batch/cardinalities

🏷️ Labels

  • enhancement
  • redis
  • high-priority
  • phase-1
  • backend
  • frontend

📚 References

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions