Skip to content
This repository was archived by the owner on Apr 20, 2020. It is now read-only.

Commit c52cc6d

Browse files
authored
fix #53 stop==(-1 or 0) is the default stop (#54)
* fix #53 stop==(-1 or 0) is the default stop
1 parent c674489 commit c52cc6d

File tree

2 files changed

+17
-13
lines changed

2 files changed

+17
-13
lines changed

src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -431,8 +431,8 @@ fn json_arr_index(ctx: &Context, args: Vec<String>) -> RedisResult {
431431
let key = args.next_string()?;
432432
let path = backwards_compat_path(args.next_string()?);
433433
let json_scalar = args.next_string()?;
434-
let start = args.next().map(|v| v.parse()).unwrap_or(Ok(0))?;
435-
let end = args.next().map(|v| v.parse()).unwrap_or(Ok(usize::MAX))?;
434+
let start: i64 = args.next().map(|v| v.parse()).unwrap_or(Ok(0))?;
435+
let end: i64 = args.next().map(|v| v.parse()).unwrap_or(Ok(i64::MAX))?;
436436

437437
args.done()?; // TODO: Add to other functions as well to terminate args list
438438

src/redisjson.rs

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -218,21 +218,25 @@ impl RedisJSON {
218218
.map(|obj| obj.keys().collect())
219219
}
220220

221-
pub fn arr_index(
222-
&self,
223-
path: &str,
224-
scalar: &str,
225-
start: usize,
226-
end: usize,
227-
) -> Result<i64, Error> {
221+
pub fn arr_index(&self, path: &str, scalar: &str, start: i64, end: i64) -> Result<i64, Error> {
228222
if let Value::Array(arr) = self.get_doc(path)? {
223+
// end=-1/0 means INFINITY to support backward with RedisJSON
224+
if arr.is_empty() || end < -1 {
225+
return Ok(-1);
226+
}
229227
match serde_json::from_str(scalar)? {
230228
Value::Array(_) | Value::Object(_) => Ok(-1),
231229
v => {
232-
let mut start = start.max(0);
233-
let end = end.min(arr.len() - 1);
234-
start = end.min(start);
235-
230+
let end: usize = if end == 0 || end == -1 {
231+
// default end of array
232+
arr.len() - 1
233+
} else {
234+
(end as usize).min(arr.len() - 1)
235+
};
236+
let start = start.max(0) as usize;
237+
if end < start {
238+
return Ok(-1);
239+
}
236240
let slice = &arr[start..=end];
237241
match slice.iter().position(|r| r == &v) {
238242
Some(i) => Ok((start + i) as i64),

0 commit comments

Comments
 (0)