22// Turns a mapping of tableName => (index_name, vec![index_fields]) into a
33// DatabaseSchema struct.
44macro_rules! db_schema_with_indexes {
5- ( $( $table: expr => [ $( ( $index_name: expr, $fields: expr) ) ,* ] ) ,* $( , ) ?) => {
5+ ( $( $table: expr => {
6+ $( indexes: $( ( $index_name: expr, $fields: expr) ) ,* $( , ) ? ) ?
7+ $( staged_db_indexes: $( (
8+ $staged_db_index_name: expr,
9+ $staged_db_index_fields: expr
10+ ) ) ,* $( , ) ? ) ?
11+ $( text_indexes: $( ( $text_index_name: expr, $text_index_field: expr) ) ,* $( , ) ? ) ?
12+ $( staged_text_indexes: $( (
13+ $staged_text_index_name: expr,
14+ $staged_text_index_field: expr
15+ ) ) ,* $( , ) ? ) ?
16+ $( vector_indexes: $( ( $vector_index_name: expr, $vector_index_field: expr) ) ,* $( , ) ? ) ?
17+ $( staged_vector_indexes: $( (
18+ $staged_vector_index_name: expr,
19+ $staged_vector_index_field: expr
20+ ) ) ,* $( , ) ? ) ?
21+ $( document_schema: $document_schema: expr$( , ) ? ) ?
22+ } ) ,* $( , ) ?) => {
623 {
724 #[ allow( unused) ]
825 let mut tables = std:: collections:: BTreeMap :: new( ) ;
926 {
1027 $(
11- let table_name: common :: types:: TableName = str :: parse ( $table) ?;
28+ let table_name: $crate :: types:: TableName = $table. parse ( ) ?;
1229 #[ allow( unused) ]
1330 let mut indexes = std:: collections:: BTreeMap :: new( ) ;
14- $(
15- let index_name = database :: test_helpers :: index_utils :: new_index_name(
31+ $( $ (
32+ let index_name = $crate :: index :: test_helpers :: new_index_name(
1633 $table,
1734 $index_name,
1835 ) ?;
19- let field_paths: Vec <common :: paths :: FieldPath > = $fields
36+ let field_paths = $fields
2037 . iter( )
21- . map( |s| str :: parse ( s ) . unwrap ( ) )
22- . collect( ) ;
38+ . map( |s| s . parse ( ) )
39+ . collect:: <anyhow :: Result < Vec <_>>> ( ) ? ;
2340 indexes. insert(
2441 index_name. descriptor( ) . clone( ) ,
25- common :: schemas:: IndexSchema {
42+ $crate :: schemas:: IndexSchema {
2643 index_descriptor: index_name. descriptor( ) . clone( ) ,
2744 fields: field_paths. try_into( ) ?,
2845 } ,
2946 ) ;
30- ) *
31- let table_def = common:: schemas:: TableDefinition {
32- table_name: table_name. clone( ) ,
33- indexes,
34- staged_db_indexes: Default :: default ( ) ,
35- text_indexes: Default :: default ( ) ,
36- staged_text_indexes: Default :: default ( ) ,
37- vector_indexes: Default :: default ( ) ,
38- staged_vector_indexes: Default :: default ( ) ,
39- document_type: None ,
40- } ;
41- tables. insert( table_name, table_def) ;
42- ) *
43- }
44- common:: schemas:: DatabaseSchema {
45- tables,
46- schema_validation: true ,
47- }
48- }
49- } ;
50- }
51-
52- #[ macro_export]
53- macro_rules! db_schema_with_search_indexes {
54- ( $( $table: expr => [ $( ( $index_name: expr, $field: expr) ) ,* ] ) ,* $( , ) ?) => {
55- {
56- use std:: collections:: {
57- BTreeMap ,
58- BTreeSet ,
59- } ;
60- use common:: types:: TableName ;
61- use common:: paths:: FieldPath ;
62- use common:: schemas:: {
63- TableDefinition ,
64- TextIndexSchema ,
65- } ;
66- use database:: test_helpers:: index_utils:: new_index_name;
67-
68- #[ allow( unused) ]
69- let mut tables = BTreeMap :: new( ) ;
70- {
71- $(
72- let table_name: TableName = str :: parse( $table) ?;
47+ ) * ) ?
7348 #[ allow( unused) ]
74- let mut text_indexes = BTreeMap :: new( ) ;
75- $(
76- let index_name = new_index_name( $table, $index_name) ?;
77- let field_path: FieldPath = str :: parse( $field) . unwrap( ) ;
49+ let mut staged_db_indexes = std:: collections:: BTreeMap :: new( ) ;
50+ $( $(
51+ let index_name = $crate:: index:: test_helpers:: new_index_name(
52+ $table,
53+ $staged_db_index_name,
54+ ) ?;
55+ let field_paths = $staged_db_index_fields
56+ . iter( )
57+ . map( |s| s. parse( ) )
58+ . collect:: <anyhow:: Result <Vec <_>>>( ) ?;
59+ staged_db_indexes. insert(
60+ index_name. descriptor( ) . clone( ) ,
61+ $crate:: schemas:: IndexSchema {
62+ index_descriptor: index_name. descriptor( ) . clone( ) ,
63+ fields: field_paths. try_into( ) ?,
64+ } ,
65+ ) ;
66+ ) * ) ?
67+ #[ allow( unused) ]
68+ let mut text_indexes = std:: collections:: BTreeMap :: new( ) ;
69+ $( $(
70+ let index_name = $crate:: index:: test_helpers:: new_index_name(
71+ $table,
72+ $text_index_name,
73+ ) ?;
74+ let field_path = $text_index_field. parse( ) ?;
7875 text_indexes. insert(
7976 index_name. descriptor( ) . clone( ) ,
80- TextIndexSchema :: new(
77+ $crate :: schemas :: TextIndexSchema :: new(
8178 index_name. descriptor( ) . clone( ) ,
82- field_path. try_into ( ) ? ,
83- BTreeSet :: new( ) ,
79+ field_path,
80+ std :: collections :: BTreeSet :: new( ) ,
8481 ) ?,
8582 ) ;
86- ) *
87- let table_def = TableDefinition {
88- table_name: table_name. clone( ) ,
89- indexes: BTreeMap :: new( ) ,
90- staged_db_indexes: Default :: default ( ) ,
91- text_indexes,
92- staged_text_indexes: Default :: default ( ) ,
93- vector_indexes: Default :: default ( ) ,
94- staged_vector_indexes: Default :: default ( ) ,
95- document_type: None ,
96- } ;
97- tables. insert( table_name, table_def) ;
98- ) *
99- }
100- DatabaseSchema {
101- tables,
102- schema_validation: true ,
103- }
104- }
105- } ;
106- }
107-
108- #[ macro_export]
109- // Turns a mapping of tableName => (index_name, vector_field) into a
110- // DatabaseSchema struct.
111- macro_rules! db_schema_with_vector_indexes {
112- ( $( $table: expr => {
113- $document_schema: expr, [ $( ( $index_name: expr, $vector_field: expr) ) ,* ]
114- } ) ,* $( , ) ?) => {
115- {
116- #[ allow( unused) ]
117- use std:: str :: FromStr ;
118- #[ allow( unused) ]
119- let mut tables = std:: collections:: BTreeMap :: new( ) ;
120- {
121- $(
122- let table_name: $crate:: types:: TableName =
123- str :: parse( $table) ?;
83+ ) * ) ?
84+ #[ allow( unused) ]
85+ let mut staged_text_indexes = std:: collections:: BTreeMap :: new( ) ;
86+ $( $(
87+ let index_name = $crate:: index:: test_helpers:: new_index_name(
88+ $table,
89+ $staged_text_index_name,
90+ ) ?;
91+ let field_path = $staged_text_index_field. parse( ) ?;
92+ staged_text_indexes. insert(
93+ index_name. descriptor( ) . clone( ) ,
94+ $crate:: schemas:: TextIndexSchema :: new(
95+ index_name. descriptor( ) . clone( ) ,
96+ field_path,
97+ std:: collections:: BTreeSet :: new( ) ,
98+ ) ?,
99+ ) ;
100+ ) * ) ?
124101 #[ allow( unused) ]
125102 let mut vector_indexes = std:: collections:: BTreeMap :: new( ) ;
126- $(
127- let index_name = $crate:: types :: IndexName :: new (
128- str :: parse ( $table) ? ,
129- $crate :: types :: IndexDescriptor :: new ( $index_name ) ?
103+ $( $ (
104+ let index_name = $crate:: index :: test_helpers :: new_index_name (
105+ $table,
106+ $vector_index_name ,
130107 ) ?;
131108 vector_indexes. insert(
132109 index_name. descriptor( ) . clone( ) ,
133110 $crate:: schemas:: VectorIndexSchema :: new(
134111 index_name. descriptor( ) . clone( ) ,
135- value :: FieldPath :: from_str ( $vector_field ) ?,
112+ $vector_index_field . parse ( ) ?,
136113 1536u32 . try_into( ) ?,
137114 Default :: default ( ) ,
138115 ) ?,
139116 ) ;
140- ) *
117+ ) * ) ?
118+ #[ allow( unused) ]
119+ let mut staged_vector_indexes = std:: collections:: BTreeMap :: new( ) ;
120+ $( $(
121+ let index_name = $crate:: index:: test_helpers:: new_index_name(
122+ $table,
123+ $staged_vector_index_name,
124+ ) ?;
125+ staged_vector_indexes. insert(
126+ index_name. descriptor( ) . clone( ) ,
127+ $crate:: schemas:: VectorIndexSchema :: new(
128+ index_name. descriptor( ) . clone( ) ,
129+ $staged_vector_index_field. parse( ) ?,
130+ 1536u32 . try_into( ) ?,
131+ Default :: default ( ) ,
132+ ) ?,
133+ ) ;
134+ ) * ) ?
135+ #[ allow( unused) ]
136+ let mut document_type = None ;
137+ $(
138+ document_type = Some ( $document_schema) ;
139+ ) ?
141140 let table_def = $crate:: schemas:: TableDefinition {
142141 table_name: table_name. clone( ) ,
143- indexes: Default :: default ( ) ,
144- staged_db_indexes: Default :: default ( ) ,
145- text_indexes: Default :: default ( ) ,
146- staged_text_indexes: Default :: default ( ) ,
142+ indexes,
143+ staged_db_indexes,
144+ text_indexes,
145+ staged_text_indexes,
147146 vector_indexes,
148- staged_vector_indexes: Default :: default ( ) ,
149- document_type: Some ( $document_schema ) ,
147+ staged_vector_indexes,
148+ document_type,
150149 } ;
151150 tables. insert( table_name, table_def) ;
152151 ) *
@@ -157,4 +156,84 @@ macro_rules! db_schema_with_vector_indexes {
157156 }
158157 }
159158 } ;
159+ ( $( $table: expr => [ $( ( $index_name: expr, $fields: expr) ) ,* ] ) ,* $( , ) ?) => {
160+ db_schema_with_indexes!( $( $table => {
161+ indexes: $( ( $index_name, $fields) ) ,*
162+ } ) ,* )
163+ } ;
164+ }
165+
166+ #[ test]
167+ fn test_db_schema_with_indexes ( ) -> anyhow:: Result < ( ) > {
168+ // Test with only indexes (array syntax)
169+ db_schema_with_indexes ! ( "table" => [ ( "indexname" , vec![ "a" ] ) ] ) ;
170+
171+ // Test with only indexes (new syntax)
172+ db_schema_with_indexes ! ( "table" => {
173+ indexes: ( "indexname" , vec![ "a" , "b" , "c" ] )
174+ } ) ;
175+
176+ // Test with only text_indexes
177+ db_schema_with_indexes ! ( "table" => {
178+ text_indexes: ( "text_indexname" , "a" )
179+ } ) ;
180+
181+ // Test with both indexes and text_indexes
182+ db_schema_with_indexes ! ( "table" => {
183+ indexes: ( "indexname" , vec![ "a" ] ) ,
184+ text_indexes: ( "text_indexname" , "a" )
185+ } ) ;
186+
187+ // Test with all index types
188+ db_schema_with_indexes ! ( "table" => {
189+ indexes: ( "indexname" , vec![ "a" ] ) ,
190+ staged_db_indexes: ( "staged_db_indexname" , vec![ "a" ] ) ,
191+ text_indexes: ( "text_indexname" , "a" ) ,
192+ staged_text_indexes: ( "staged_text_indexname" , "a" ) ,
193+ vector_indexes: ( "vector_indexname" , "a" ) ,
194+ staged_vector_indexes: ( "staged_vector_indexname" , "a" ) ,
195+ } ) ;
196+
197+ // Test with no indexes (empty table)
198+ db_schema_with_indexes ! ( "table" => { } ) ;
199+
200+ Ok ( ( ) )
201+ }
202+
203+ #[ macro_export]
204+ macro_rules! db_schema_with_search_indexes {
205+ ( $( $table: expr => [ $( ( $index_name: expr, $field: expr) ) ,* ] ) ,* $( , ) ?) => {
206+ $crate:: db_schema_with_indexes!( $( $table => {
207+ text_indexes: $( ( $index_name, $field) ) ,*
208+ } ) ,* )
209+ } ;
210+ }
211+
212+ #[ test]
213+ fn test_db_schema_with_text_indexes ( ) -> anyhow:: Result < ( ) > {
214+ db_schema_with_search_indexes ! ( "table" => [ ( "indexname" , "a" ) ] ) ;
215+ Ok ( ( ) )
216+ }
217+
218+ #[ macro_export]
219+ // Turns a mapping of tableName => (index_name, vector_field) into a
220+ // DatabaseSchema struct.
221+ macro_rules! db_schema_with_vector_indexes {
222+ ( $( $table: expr => {
223+ $document_schema: expr, [ $( ( $index_name: expr, $vector_field: expr) ) ,* ]
224+ } ) ,* $( , ) ?) => {
225+ $crate:: db_schema_with_indexes!( $( $table => {
226+ vector_indexes: $( ( $index_name, $vector_field) ) ,* ,
227+ document_schema: $document_schema,
228+ } ) ,* )
229+ } ;
230+ }
231+
232+ #[ test]
233+ fn test_db_schema_with_vector_indexes ( ) -> anyhow:: Result < ( ) > {
234+ let document_schema = crate :: schemas:: DocumentSchema :: Any ;
235+ db_schema_with_vector_indexes ! (
236+ "table" => { document_schema, [ ( "myVectorIndex" , "myField" ) ] }
237+ ) ;
238+ Ok ( ( ) )
160239}
0 commit comments