@@ -561,6 +561,62 @@ async fn raw_req() -> Result<()> {
561561 assert_eq ! ( res[ 5 ] . 1 , "v4" . as_bytes( ) ) ;
562562 assert_eq ! ( res[ 6 ] . 1 , "v5" . as_bytes( ) ) ;
563563
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+
564620 Ok ( ( ) )
565621}
566622
@@ -704,6 +760,105 @@ async fn raw_write_million() -> Result<()> {
704760 r = client. scan ( .., limit) . await ?;
705761 assert_eq ! ( r. len( ) , limit as usize ) ;
706762
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+
707862 // test batch_scan
708863 for batch_num in 1 ..4 {
709864 let _ = client
0 commit comments