@@ -16,7 +16,7 @@ use crate::redisjson::SetOptions;
16
16
use serde_json:: { Number , Value } ;
17
17
18
18
use itertools:: FoldWhile :: { Continue , Done } ;
19
- use itertools:: Itertools ;
19
+ use itertools:: { EitherOrBoth , Itertools } ;
20
20
use serde:: { Serialize , Serializer } ;
21
21
use std:: collections:: HashMap ;
22
22
@@ -758,40 +758,43 @@ where
758
758
. collect :: < Vec < Value > > ( )
759
759
}
760
760
761
- /// Sort the paths so higher indices precede lower indices on the same on the same array
762
- /// And objects with higher hierarchy (closer to the top-level) preceded objects with deeper hierarchy
761
+ /// Sort the paths so higher indices precede lower indices on the same array,
762
+ /// And if one path is a sub-path of the other, then paths with shallower hierarchy (closer to the top-level) precedes paths with deeper hierarchy
763
763
fn prepare_paths_for_deletion ( paths : & mut Vec < Vec < String > > ) {
764
- paths. sort_by ( |v1, v2| match ( v1. len ( ) , v2. len ( ) ) {
765
- ( l1, l2) if l1 < l2 => Ordering :: Less , // Shorter paths before longer paths
766
- ( l1, l2) if l1 > l2 => Ordering :: Greater , // Shorter paths before longer paths
767
- _ => v1
768
- . iter ( )
769
- . zip ( v2. iter ( ) )
770
- . fold_while ( Ordering :: Equal , |_acc, ( p1, p2) | {
771
- let i1 = p1. parse :: < usize > ( ) ;
772
- let i2 = p2. parse :: < usize > ( ) ;
773
- match ( i1, i2) {
774
- ( Err ( _) , Err ( _) ) => match p1. cmp ( p2) {
775
- // String compare
776
- Ordering :: Less => Done ( Ordering :: Less ) ,
777
- Ordering :: Equal => Continue ( Ordering :: Equal ) ,
778
- Ordering :: Greater => Done ( Ordering :: Greater ) ,
779
- } ,
780
- ( Ok ( _) , Err ( _) ) => Done ( Ordering :: Greater ) , //String before Numeric
781
- ( Err ( _) , Ok ( _) ) => Done ( Ordering :: Less ) , //String before Numeric
782
- ( Ok ( i1) , Ok ( i2) ) => {
783
- // Numeric compare - higher indices before lower ones
784
- if i1 < i2 {
785
- Done ( Ordering :: Greater )
786
- } else if i2 < i1 {
787
- Done ( Ordering :: Less )
788
- } else {
789
- Continue ( Ordering :: Equal )
764
+ paths. sort_by ( |v1, v2| {
765
+ v1. iter ( )
766
+ . zip_longest ( v2. iter ( ) )
767
+ . fold_while ( Ordering :: Equal , |_acc, v| {
768
+ match v {
769
+ EitherOrBoth :: Left ( _) => Done ( Ordering :: Greater ) , // Shorter paths before longer paths
770
+ EitherOrBoth :: Right ( _) => Done ( Ordering :: Less ) , // Shorter paths before longer paths
771
+ EitherOrBoth :: Both ( p1, p2) => {
772
+ let i1 = p1. parse :: < usize > ( ) ;
773
+ let i2 = p2. parse :: < usize > ( ) ;
774
+ match ( i1, i2) {
775
+ ( Err ( _) , Err ( _) ) => match p1. cmp ( p2) {
776
+ // String compare
777
+ Ordering :: Less => Done ( Ordering :: Less ) ,
778
+ Ordering :: Equal => Continue ( Ordering :: Equal ) ,
779
+ Ordering :: Greater => Done ( Ordering :: Greater ) ,
780
+ } ,
781
+ ( Ok ( _) , Err ( _) ) => Done ( Ordering :: Greater ) , //String before Numeric
782
+ ( Err ( _) , Ok ( _) ) => Done ( Ordering :: Less ) , //String before Numeric
783
+ ( Ok ( i1) , Ok ( i2) ) => {
784
+ // Numeric compare - higher indices before lower ones
785
+ if i1 < i2 {
786
+ Done ( Ordering :: Greater )
787
+ } else if i2 < i1 {
788
+ Done ( Ordering :: Less )
789
+ } else {
790
+ Continue ( Ordering :: Equal )
791
+ }
792
+ }
790
793
}
791
794
}
792
795
}
793
796
} )
794
- . into_inner ( ) ,
797
+ . into_inner ( )
795
798
} ) ;
796
799
}
797
800
0 commit comments