@@ -16,39 +16,19 @@ use std::ops::Range;
1616
1717use crate :: error:: Result ;
1818use crate :: memtable:: merge_tree:: data:: DataBatch ;
19+ use crate :: memtable:: merge_tree:: shard:: DataBatchSource ;
1920use crate :: memtable:: merge_tree:: PkId ;
2021
21- pub trait DedupSource {
22- /// Returns whether current source is still valid.
23- fn is_valid ( & self ) -> bool ;
24-
25- /// Advances source to next data batch.
26- fn next ( & mut self ) -> Result < ( ) > ;
27-
28- /// Returns current pk id.
29- /// # Panics
30- /// If source is not valid.
31- fn current_pk_id ( & self ) -> PkId ;
32-
33- /// Returns the current primary key bytes.
34- /// # Panics
35- /// If source is not valid.
36- fn current_key ( & self ) -> & [ u8 ] ;
37-
38- /// Returns the data part.
39- /// # Panics
40- /// If source is not valid.
41- fn current_data_batch ( & self ) -> DataBatch ;
42- }
43-
44- struct DedupReader < T > {
22+ /// A reader that dedup sorted batches from a merger.
23+ pub struct DedupReader < T > {
4524 prev_batch_last_row : Option < ( PkId , i64 ) > ,
4625 current_batch_range : Option < Range < usize > > ,
4726 inner : T ,
4827}
4928
50- impl < T : DedupSource > DedupReader < T > {
51- fn try_new ( inner : T ) -> Result < Self > {
29+ impl < T : DataBatchSource > DedupReader < T > {
30+ /// Creates a new dedup reader.
31+ pub fn try_new ( inner : T ) -> Result < Self > {
5232 let mut res = Self {
5333 prev_batch_last_row : None ,
5434 current_batch_range : None ,
@@ -57,24 +37,13 @@ impl<T: DedupSource> DedupReader<T> {
5737 res. next ( ) ?;
5838 Ok ( res)
5939 }
40+ }
6041
42+ impl < T : DataBatchSource > DataBatchSource for DedupReader < T > {
6143 fn is_valid ( & self ) -> bool {
6244 self . current_batch_range . is_some ( )
6345 }
6446
65- /// Returns current encoded primary key.
66- /// # Panics
67- /// If inner reader is exhausted.
68- fn current_key ( & self ) -> & [ u8 ] {
69- self . inner . current_key ( )
70- }
71-
72- fn current_data_batch ( & self ) -> DataBatch {
73- let range = self . current_batch_range . as_ref ( ) . unwrap ( ) ;
74- let data_batch = self . inner . current_data_batch ( ) ;
75- data_batch. slice ( range. start , range. len ( ) )
76- }
77-
7847 fn next ( & mut self ) -> Result < ( ) > {
7948 loop {
8049 match & mut self . prev_batch_last_row {
@@ -122,40 +91,56 @@ impl<T: DedupSource> DedupReader<T> {
12291 }
12392 Ok ( ( ) )
12493 }
94+
95+ fn current_pk_id ( & self ) -> PkId {
96+ self . inner . current_pk_id ( )
97+ }
98+
99+ fn current_key ( & self ) -> Option < & [ u8 ] > {
100+ self . inner . current_key ( )
101+ }
102+
103+ fn current_data_batch ( & self ) -> DataBatch {
104+ let range = self . current_batch_range . as_ref ( ) . unwrap ( ) ;
105+ let data_batch = self . inner . current_data_batch ( ) ;
106+ data_batch. slice ( range. start , range. len ( ) )
107+ }
125108}
126109
127110#[ cfg( test) ]
128111mod tests {
129112 use store_api:: metadata:: RegionMetadataRef ;
130113
131114 use super :: * ;
132- use crate :: memtable:: merge_tree:: data:: {
133- write_rows_to_buffer, DataBuffer , DataParts , DataPartsReader ,
115+ use crate :: memtable:: merge_tree:: data:: { DataBuffer , DataParts , DataPartsReader } ;
116+ use crate :: test_util:: memtable_util:: {
117+ extract_data_batch, metadata_for_test, write_rows_to_buffer,
134118 } ;
135- use crate :: test_util:: memtable_util:: { extract_data_batch, metadata_for_test} ;
136119
137- impl DedupSource for DataPartsReader {
120+ struct MockSource ( DataPartsReader ) ;
121+
122+ impl DataBatchSource for MockSource {
138123 fn is_valid ( & self ) -> bool {
139- self . is_valid ( )
124+ self . 0 . is_valid ( )
140125 }
141126
142127 fn next ( & mut self ) -> Result < ( ) > {
143- self . next ( )
128+ self . 0 . next ( )
144129 }
145130
146131 fn current_pk_id ( & self ) -> PkId {
147132 PkId {
148133 shard_id : 0 ,
149- pk_index : self . current_data_batch ( ) . pk_index ( ) ,
134+ pk_index : self . 0 . current_data_batch ( ) . pk_index ( ) ,
150135 }
151136 }
152137
153- fn current_key ( & self ) -> & [ u8 ] {
154- b"abcf"
138+ fn current_key ( & self ) -> Option < & [ u8 ] > {
139+ None
155140 }
156141
157142 fn current_data_batch ( & self ) -> DataBatch {
158- self . current_data_batch ( )
143+ self . 0 . current_data_batch ( )
159144 }
160145 }
161146
@@ -194,7 +179,7 @@ mod tests {
194179 let mut parts = DataParts :: new ( meta, 10 , true ) . with_frozen ( frozens) ;
195180
196181 let mut res = Vec :: with_capacity ( expected. len ( ) ) ;
197- let mut reader = DedupReader :: try_new ( parts. read ( ) . unwrap ( ) ) . unwrap ( ) ;
182+ let mut reader = DedupReader :: try_new ( MockSource ( parts. read ( ) . unwrap ( ) ) ) . unwrap ( ) ;
198183 while reader. is_valid ( ) {
199184 let batch = reader. current_data_batch ( ) ;
200185 res. push ( extract_data_batch ( & batch) ) ;
0 commit comments