@@ -20,8 +20,8 @@ impl InMemoryGenerator {
2020 . indexes
2121 . iter ( )
2222 . map ( |( i, idx) | {
23- if idx. is_unique {
24- Self :: gen_unique_index_fn ( i, idx, & self . columns . columns_map , row_ident. clone ( ) )
23+ let point_fn = if idx. is_unique {
24+ Self :: gen_unique_index_fn ( i, idx, & self . columns . columns_map , row_ident. clone ( ) ) ?
2525 } else {
2626 Self :: gen_non_unique_index_fn (
2727 i,
@@ -30,8 +30,19 @@ impl InMemoryGenerator {
3030 row_ident. clone ( ) ,
3131 & column_range_type,
3232 & row_fields_ident,
33- )
34- }
33+ ) ?
34+ } ;
35+
36+ let range_fn = Self :: gen_range_index_fn (
37+ i,
38+ idx,
39+ & self . columns . columns_map ,
40+ row_ident. clone ( ) ,
41+ & column_range_type,
42+ & row_fields_ident,
43+ ) ?;
44+
45+ Ok ( quote ! { #point_fn #range_fn } )
3546 } )
3647 . collect :: < Result < Vec < _ > , syn:: Error > > ( ) ?;
3748
@@ -111,4 +122,52 @@ impl InMemoryGenerator {
111122 }
112123 } )
113124 }
125+
126+ fn gen_range_index_fn (
127+ i : & Ident ,
128+ idx : & Index ,
129+ columns_map : & HashMap < Ident , TokenStream > ,
130+ row_ident : Ident ,
131+ column_range_type : & Ident ,
132+ row_fields_ident : & Ident ,
133+ ) -> syn:: Result < TokenStream > {
134+ let type_ = columns_map
135+ . get ( i)
136+ . ok_or ( syn:: Error :: new ( i. span ( ) , "Row not found" ) ) ?;
137+ let fn_name = Ident :: new ( format ! ( "select_by_{i}_range" ) . as_str ( ) , Span :: mixed_site ( ) ) ;
138+ let field_ident = & idx. name ;
139+
140+ let ( range_bounds, range_arg) = if is_float ( type_. to_string ( ) . as_str ( ) ) {
141+ (
142+ quote ! { std:: ops:: RangeBounds <#type_> } ,
143+ quote ! {
144+ (
145+ range. start_bound( ) . map( |v| OrderedFloat ( * v) ) ,
146+ range. end_bound( ) . map( |v| OrderedFloat ( * v) ) ,
147+ )
148+ } ,
149+ )
150+ } else {
151+ (
152+ quote ! { std:: ops:: RangeBounds <#type_> } ,
153+ quote ! { range } ,
154+ )
155+ } ;
156+
157+ Ok ( quote ! {
158+ pub fn #fn_name<R >( & self , range: R ) -> SelectQueryBuilder <#row_ident,
159+ impl DoubleEndedIterator <Item = #row_ident> + ' _,
160+ #column_range_type,
161+ #row_fields_ident>
162+ where
163+ R : #range_bounds
164+ {
165+ let rows = self . 0 . indexes. #field_ident
166+ . range( #range_arg)
167+ . filter_map( |( _, link) | self . 0 . data. select_non_ghosted( link. 0 ) . ok( ) ) ;
168+
169+ SelectQueryBuilder :: new( rows)
170+ }
171+ } )
172+ }
114173}
0 commit comments