ZRANK key member — returns 0-based rank (Redis convention).
(
cmd: &RespCommand,
session: &RespSession,
state: &SharedState,
)
| 112 | |
| 113 | /// ZRANK key member — returns 0-based rank (Redis convention). |
| 114 | pub(super) async fn handle_zrank( |
| 115 | cmd: &RespCommand, |
| 116 | session: &RespSession, |
| 117 | state: &SharedState, |
| 118 | ) -> RespValue { |
| 119 | let Some(member) = cmd.arg(0) else { |
| 120 | return RespValue::err("ERR wrong number of arguments for 'zrank' command"); |
| 121 | }; |
| 122 | |
| 123 | let plan = PhysicalPlan::Kv(KvOp::SortedIndexRank { |
| 124 | index_name: session.collection.clone(), |
| 125 | primary_key: member.to_vec(), |
| 126 | }); |
| 127 | |
| 128 | match dispatch_kv(state, session, plan).await { |
| 129 | Ok(resp) if resp.status == Status::Ok => { |
| 130 | let rank = parse_json_field_i64(&resp.payload, "rank"); |
| 131 | match rank { |
| 132 | Some(r) if r > 0 => RespValue::integer(r - 1), // Convert to 0-based. |
| 133 | _ => RespValue::nil(), |
| 134 | } |
| 135 | } |
| 136 | Ok(_) => RespValue::nil(), |
| 137 | Err(e) => RespValue::err(format!("ERR {e}")), |
| 138 | } |
| 139 | } |
| 140 | |
| 141 | /// ZRANGE key start stop — returns members in rank range [start, stop] (0-based). |
| 142 | pub(super) async fn handle_zrange( |
no test coverage detected