@@ -561,6 +561,62 @@ async fn raw_req() -> Result<()> {
561
561
assert_eq ! ( res[ 5 ] . 1 , "v4" . as_bytes( ) ) ;
562
562
assert_eq ! ( res[ 6 ] . 1 , "v5" . as_bytes( ) ) ;
563
563
564
+ // reverse scan
565
+
566
+ // By default end key is exclusive, so k5 is not included and start key in included
567
+ let res = client
568
+ . scan_reverse ( "k2" . to_owned ( ) .."k5" . to_owned ( ) , 5 )
569
+ . await ?;
570
+ assert_eq ! ( res. len( ) , 3 ) ;
571
+ assert_eq ! ( res[ 0 ] . 1 , "v4" . as_bytes( ) ) ;
572
+ assert_eq ! ( res[ 1 ] . 1 , "v3" . as_bytes( ) ) ;
573
+ assert_eq ! ( res[ 2 ] . 1 , "v2" . as_bytes( ) ) ;
574
+
575
+ // by default end key in exclusive and start key is inclusive but now exclude start key
576
+ let res = client
577
+ . scan_reverse ( "k2\0 " . to_owned ( ) .."k5" . to_owned ( ) , 5 )
578
+ . await ?;
579
+ assert_eq ! ( res. len( ) , 2 ) ;
580
+ assert_eq ! ( res[ 0 ] . 1 , "v4" . as_bytes( ) ) ;
581
+ assert_eq ! ( res[ 1 ] . 1 , "v3" . as_bytes( ) ) ;
582
+
583
+ // reverse scan
584
+ // by default end key is exclusive and start key is inclusive but now include end key
585
+ let res = client
586
+ . scan_reverse ( "k2" . to_owned ( ) ..="k5" . to_owned ( ) , 5 )
587
+ . await ?;
588
+ assert_eq ! ( res. len( ) , 4 ) ;
589
+ assert_eq ! ( res[ 0 ] . 1 , "v5" . as_bytes( ) ) ;
590
+ assert_eq ! ( res[ 1 ] . 1 , "v4" . as_bytes( ) ) ;
591
+ assert_eq ! ( res[ 2 ] . 1 , "v3" . as_bytes( ) ) ;
592
+ assert_eq ! ( res[ 3 ] . 1 , "v2" . as_bytes( ) ) ;
593
+
594
+ // by default end key is exclusive and start key is inclusive but now include end key and exclude start key
595
+ let res = client
596
+ . scan_reverse ( "k2\0 " . to_owned ( ) ..="k5" . to_owned ( ) , 5 )
597
+ . await ?;
598
+ assert_eq ! ( res. len( ) , 3 ) ;
599
+ assert_eq ! ( res[ 0 ] . 1 , "v5" . as_bytes( ) ) ;
600
+ assert_eq ! ( res[ 1 ] . 1 , "v4" . as_bytes( ) ) ;
601
+ assert_eq ! ( res[ 2 ] . 1 , "v3" . as_bytes( ) ) ;
602
+
603
+ // limit results to first 2
604
+ let res = client
605
+ . scan_reverse ( "k2" . to_owned ( ) .."k5" . to_owned ( ) , 2 )
606
+ . await ?;
607
+ assert_eq ! ( res. len( ) , 2 ) ;
608
+ assert_eq ! ( res[ 0 ] . 1 , "v4" . as_bytes( ) ) ;
609
+ assert_eq ! ( res[ 1 ] . 1 , "v3" . as_bytes( ) ) ;
610
+
611
+ // if endKey is not provided then it scan everything including end key
612
+ let range = BoundRange :: range_from ( Key :: from ( "k2" . to_owned ( ) ) ) ;
613
+ let res = client. scan_reverse ( range, 20 ) . await ?;
614
+ assert_eq ! ( res. len( ) , 4 ) ;
615
+ assert_eq ! ( res[ 0 ] . 1 , "v5" . as_bytes( ) ) ;
616
+ assert_eq ! ( res[ 1 ] . 1 , "v4" . as_bytes( ) ) ;
617
+ assert_eq ! ( res[ 2 ] . 1 , "v3" . as_bytes( ) ) ;
618
+ assert_eq ! ( res[ 3 ] . 1 , "v2" . as_bytes( ) ) ;
619
+
564
620
Ok ( ( ) )
565
621
}
566
622
@@ -704,6 +760,105 @@ async fn raw_write_million() -> Result<()> {
704
760
r = client. scan ( .., limit) . await ?;
705
761
assert_eq ! ( r. len( ) , limit as usize ) ;
706
762
763
+ // test scan_reverse
764
+ // test scan, key range from [0,0,0,0] to [255.0.0.0]
765
+ let mut limit = 2000 ;
766
+ let mut r = client. scan_reverse ( .., limit) . await ?;
767
+ assert_eq ! ( r. len( ) , 256 ) ;
768
+ for ( i, val) in r. iter ( ) . rev ( ) . enumerate ( ) {
769
+ let k: Vec < u8 > = val. 0 . clone ( ) . into ( ) ;
770
+ assert_eq ! ( k[ 0 ] , i as u8 ) ;
771
+ }
772
+ r = client. scan_reverse ( vec ! [ 100 , 0 , 0 , 0 ] .., limit) . await ?;
773
+ assert_eq ! ( r. len( ) , 156 ) ;
774
+ for ( i, val) in r. iter ( ) . rev ( ) . enumerate ( ) {
775
+ let k: Vec < u8 > = val. 0 . clone ( ) . into ( ) ;
776
+ assert_eq ! ( k[ 0 ] , i as u8 + 100 ) ;
777
+ }
778
+ r = client
779
+ . scan_reverse ( vec ! [ 5 , 0 , 0 , 0 ] ..vec ! [ 200 , 0 , 0 , 0 ] , limit)
780
+ . await ?;
781
+ assert_eq ! ( r. len( ) , 195 ) ;
782
+ for ( i, val) in r. iter ( ) . rev ( ) . enumerate ( ) {
783
+ let k: Vec < u8 > = val. 0 . clone ( ) . into ( ) ;
784
+ assert_eq ! ( k[ 0 ] , i as u8 + 5 ) ;
785
+ }
786
+ r = client
787
+ . scan_reverse ( vec ! [ 5 , 0 , 0 , 0 ] ..=vec ! [ 200 , 0 , 0 , 0 ] , limit)
788
+ . await ?;
789
+ assert_eq ! ( r. len( ) , 196 ) ;
790
+ for ( i, val) in r. iter ( ) . rev ( ) . enumerate ( ) {
791
+ let k: Vec < u8 > = val. 0 . clone ( ) . into ( ) ;
792
+ assert_eq ! ( k[ 0 ] , i as u8 + 5 ) ;
793
+ }
794
+ r = client
795
+ . scan_reverse ( vec ! [ 5 , 0 , 0 , 0 ] ..=vec ! [ 255 , 10 , 0 , 0 ] , limit)
796
+ . await ?;
797
+ assert_eq ! ( r. len( ) , 251 ) ;
798
+ for ( i, val) in r. iter ( ) . rev ( ) . enumerate ( ) {
799
+ let k: Vec < u8 > = val. 0 . clone ( ) . into ( ) ;
800
+ assert_eq ! ( k[ 0 ] , i as u8 + 5 ) ;
801
+ }
802
+ r = client
803
+ . scan_reverse ( vec ! [ 255 , 1 , 0 , 0 ] ..=vec ! [ 255 , 10 , 0 , 0 ] , limit)
804
+ . await ?;
805
+ assert_eq ! ( r. len( ) , 0 ) ;
806
+ r = client. scan_reverse ( ..vec ! [ 0 , 0 , 0 , 0 ] , limit) . await ?;
807
+ assert_eq ! ( r. len( ) , 0 ) ;
808
+
809
+ limit = 3 ;
810
+ let mut r = client. scan_reverse ( .., limit) . await ?;
811
+ let mut expected_start: u8 = 255 - limit as u8 + 1 ; // including endKey
812
+ assert_eq ! ( r. len( ) , limit as usize ) ;
813
+ for ( i, val) in r. iter ( ) . rev ( ) . enumerate ( ) {
814
+ let k: Vec < u8 > = val. 0 . clone ( ) . into ( ) ;
815
+ assert_eq ! ( k[ 0 ] , i as u8 + expected_start) ;
816
+ }
817
+ r = client. scan_reverse ( vec ! [ 100 , 0 , 0 , 0 ] .., limit) . await ?;
818
+ expected_start = 255 - limit as u8 + 1 ; // including endKey
819
+ assert_eq ! ( r. len( ) , limit as usize ) ;
820
+ for ( i, val) in r. iter ( ) . rev ( ) . enumerate ( ) {
821
+ let k: Vec < u8 > = val. 0 . clone ( ) . into ( ) ;
822
+ assert_eq ! ( k[ 0 ] , i as u8 + expected_start) ;
823
+ }
824
+ r = client
825
+ . scan_reverse ( vec ! [ 5 , 0 , 0 , 0 ] ..vec ! [ 200 , 0 , 0 , 0 ] , limit)
826
+ . await ?;
827
+ expected_start = 200 - limit as u8 ;
828
+ assert_eq ! ( r. len( ) , limit as usize ) ;
829
+ for ( i, val) in r. iter ( ) . rev ( ) . enumerate ( ) {
830
+ let k: Vec < u8 > = val. 0 . clone ( ) . into ( ) ;
831
+ assert_eq ! ( k[ 0 ] , i as u8 + expected_start) ;
832
+ }
833
+ r = client
834
+ . scan_reverse ( vec ! [ 5 , 0 , 0 , 0 ] ..=vec ! [ 200 , 0 , 0 , 0 ] , limit)
835
+ . await ?;
836
+ expected_start = 200 - limit as u8 + 1 ; // including endKey
837
+ assert_eq ! ( r. len( ) , limit as usize ) ;
838
+ for ( i, val) in r. iter ( ) . rev ( ) . enumerate ( ) {
839
+ let k: Vec < u8 > = val. 0 . clone ( ) . into ( ) ;
840
+ assert_eq ! ( k[ 0 ] , i as u8 + expected_start) ;
841
+ }
842
+ r = client
843
+ . scan_reverse ( vec ! [ 5 , 0 , 0 , 0 ] ..=vec ! [ 255 , 10 , 0 , 0 ] , limit)
844
+ . await ?;
845
+ expected_start = 255 - limit as u8 + 1 ; // including endKey
846
+ assert_eq ! ( r. len( ) , limit as usize ) ;
847
+ for ( i, val) in r. iter ( ) . rev ( ) . enumerate ( ) {
848
+ let k: Vec < u8 > = val. 0 . clone ( ) . into ( ) ;
849
+ assert_eq ! ( k[ 0 ] , i as u8 + expected_start) ;
850
+ }
851
+ r = client
852
+ . scan_reverse ( vec ! [ 255 , 1 , 0 , 0 ] ..=vec ! [ 255 , 10 , 0 , 0 ] , limit)
853
+ . await ?;
854
+ assert_eq ! ( r. len( ) , 0 ) ;
855
+ r = client. scan_reverse ( ..vec ! [ 0 , 0 , 0 , 0 ] , limit) . await ?;
856
+ assert_eq ! ( r. len( ) , 0 ) ;
857
+
858
+ limit = 0 ;
859
+ r = client. scan_reverse ( .., limit) . await ?;
860
+ assert_eq ! ( r. len( ) , limit as usize ) ;
861
+
707
862
// test batch_scan
708
863
for batch_num in 1 ..4 {
709
864
let _ = client
0 commit comments