Skip to content

Commit 8aa7d01

Browse files
nipunn1313Convex, Inc.
authored andcommitted
Move all the schema creation macros to one place (#39916)
Prepare to unify the macros into a single macro that covers all the cases including staged indexes. GitOrigin-RevId: 49a82a4a88d70d838935545be0dd425a54dcd1b7
1 parent 9c3a3fe commit 8aa7d01

File tree

5 files changed

+165
-158
lines changed

5 files changed

+165
-158
lines changed

crates/common/src/schemas/mod.rs

Lines changed: 2 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ use crate::{
5555
};
5656

5757
pub mod json;
58+
#[cfg(any(test, feature = "testing"))]
59+
pub mod test_helpers;
5860
#[cfg(test)]
5961
mod tests;
6062
pub mod validator;
@@ -223,60 +225,6 @@ macro_rules! db_schema_not_validated {
223225

224226
pub const VECTOR_DIMENSIONS: u32 = 1536;
225227

226-
#[macro_export]
227-
// Turns a mapping of tableName => (index_name, vector_field) into a
228-
// DatabaseSchema struct.
229-
macro_rules! db_schema_with_vector_indexes {
230-
($($table:expr => {
231-
$document_schema:expr, [$(($index_name:expr, $vector_field:expr)),*]
232-
}),* $(,)?) => {
233-
{
234-
#[allow(unused)]
235-
use std::str::FromStr;
236-
#[allow(unused)]
237-
let mut tables = std::collections::BTreeMap::new();
238-
{
239-
$(
240-
let table_name: $crate::types::TableName =
241-
str::parse($table)?;
242-
#[allow(unused)]
243-
let mut vector_indexes = std::collections::BTreeMap::new();
244-
$(
245-
let index_name = $crate::types::IndexName::new(
246-
str::parse($table)?,
247-
$crate::types::IndexDescriptor::new($index_name)?
248-
)?;
249-
vector_indexes.insert(
250-
index_name.descriptor().clone(),
251-
$crate::schemas::VectorIndexSchema::new(
252-
index_name.descriptor().clone(),
253-
value::FieldPath::from_str($vector_field)?,
254-
1536u32.try_into()?,
255-
Default::default(),
256-
)?,
257-
);
258-
)*
259-
let table_def = $crate::schemas::TableDefinition {
260-
table_name: table_name.clone(),
261-
indexes: Default::default(),
262-
staged_db_indexes: Default::default(),
263-
text_indexes: Default::default(),
264-
staged_text_indexes: Default::default(),
265-
vector_indexes,
266-
staged_vector_indexes: Default::default(),
267-
document_type: Some($document_schema),
268-
};
269-
tables.insert(table_name, table_def);
270-
)*
271-
}
272-
$crate::schemas::DatabaseSchema {
273-
tables,
274-
schema_validation: true,
275-
}
276-
}
277-
};
278-
}
279-
280228
impl DatabaseSchema {
281229
pub fn tables_to_validate<'a, C: ShapeConfig, S: ShapeCounter, F>(
282230
new_schema: &'a DatabaseSchema,
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
#[macro_export]
2+
// Turns a mapping of tableName => (index_name, vec![index_fields]) into a
3+
// DatabaseSchema struct.
4+
macro_rules! db_schema_with_indexes {
5+
($($table:expr => [$(($index_name:expr, $fields:expr)),*]),* $(,)?) => {
6+
{
7+
#[allow(unused)]
8+
let mut tables = std::collections::BTreeMap::new();
9+
{
10+
$(
11+
let table_name: common::types::TableName = str::parse($table)?;
12+
#[allow(unused)]
13+
let mut indexes = std::collections::BTreeMap::new();
14+
$(
15+
let index_name = database::test_helpers::index_utils::new_index_name(
16+
$table,
17+
$index_name,
18+
)?;
19+
let field_paths: Vec<common::paths::FieldPath> = $fields
20+
.iter()
21+
.map(|s| str::parse(s).unwrap())
22+
.collect();
23+
indexes.insert(
24+
index_name.descriptor().clone(),
25+
common::schemas::IndexSchema {
26+
index_descriptor: index_name.descriptor().clone(),
27+
fields: field_paths.try_into()?,
28+
},
29+
);
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)?;
73+
#[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();
78+
text_indexes.insert(
79+
index_name.descriptor().clone(),
80+
TextIndexSchema::new(
81+
index_name.descriptor().clone(),
82+
field_path.try_into()?,
83+
BTreeSet::new(),
84+
)?,
85+
);
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)?;
124+
#[allow(unused)]
125+
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)?
130+
)?;
131+
vector_indexes.insert(
132+
index_name.descriptor().clone(),
133+
$crate::schemas::VectorIndexSchema::new(
134+
index_name.descriptor().clone(),
135+
value::FieldPath::from_str($vector_field)?,
136+
1536u32.try_into()?,
137+
Default::default(),
138+
)?,
139+
);
140+
)*
141+
let table_def = $crate::schemas::TableDefinition {
142+
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(),
147+
vector_indexes,
148+
staged_vector_indexes: Default::default(),
149+
document_type: Some($document_schema),
150+
};
151+
tables.insert(table_name, table_def);
152+
)*
153+
}
154+
$crate::schemas::DatabaseSchema {
155+
tables,
156+
schema_validation: true,
157+
}
158+
}
159+
};
160+
}

crates/model/src/config/index_diff_tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use common::db_schema_with_indexes;
12
use database::{
23
test_helpers::{
34
index_utils::{
@@ -16,7 +17,6 @@ use value::TableNamespace;
1617
use crate::{
1718
config::index_test_utils::{
1819
backfill_indexes,
19-
db_schema_with_indexes,
2020
deploy_schema,
2121
expect_diff,
2222
prepare_schema,

crates/model/src/config/index_test_utils.rs

Lines changed: 0 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -68,57 +68,6 @@ macro_rules! expect_diff {
6868
}
6969
pub(crate) use expect_diff;
7070

71-
// Turns a mapping of tableName => (index_name, vec![index_fields]) into a
72-
// DatabaseSchema struct.
73-
macro_rules! db_schema_with_indexes {
74-
($($table:expr => [$(($index_name:expr, $fields:expr)),*]),* $(,)?) => {
75-
{
76-
#[allow(unused)]
77-
let mut tables = std::collections::BTreeMap::new();
78-
{
79-
$(
80-
let table_name: common::types::TableName = str::parse($table)?;
81-
#[allow(unused)]
82-
let mut indexes = std::collections::BTreeMap::new();
83-
$(
84-
let index_name = database::test_helpers::index_utils::new_index_name(
85-
$table,
86-
$index_name,
87-
)?;
88-
let field_paths: Vec<common::paths::FieldPath> = $fields
89-
.iter()
90-
.map(|s| str::parse(s).unwrap())
91-
.collect();
92-
indexes.insert(
93-
index_name.descriptor().clone(),
94-
common::schemas::IndexSchema {
95-
index_descriptor: index_name.descriptor().clone(),
96-
fields: field_paths.try_into()?,
97-
},
98-
);
99-
)*
100-
let table_def = common::schemas::TableDefinition {
101-
table_name: table_name.clone(),
102-
indexes,
103-
staged_db_indexes: Default::default(),
104-
text_indexes: Default::default(),
105-
staged_text_indexes: Default::default(),
106-
vector_indexes: Default::default(),
107-
staged_vector_indexes: Default::default(),
108-
document_type: None,
109-
};
110-
tables.insert(table_name, table_def);
111-
)*
112-
}
113-
common::schemas::DatabaseSchema {
114-
tables,
115-
schema_validation: true,
116-
}
117-
}
118-
};
119-
}
120-
pub(crate) use db_schema_with_indexes;
121-
12271
use super::types::ConfigMetadata;
12372

12473
pub fn assert_root_cause_contains<T: Debug>(result: anyhow::Result<T>, expected: &str) {

crates/model/src/config/index_tests.rs

Lines changed: 2 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
11
use std::{
2-
collections::{
3-
BTreeMap,
4-
BTreeSet,
5-
},
62
future::Future,
73
str::FromStr,
84
};
@@ -14,6 +10,8 @@ use common::{
1410
vector_index::VectorIndexState,
1511
IndexConfig,
1612
},
13+
db_schema_with_indexes,
14+
db_schema_with_search_indexes,
1715
object_validator,
1816
schemas::{
1917
validator::{
@@ -22,11 +20,8 @@ use common::{
2220
},
2321
DatabaseSchema,
2422
DocumentSchema,
25-
TableDefinition,
26-
TextIndexSchema,
2723
},
2824
types::TableName,
29-
value::FieldPath,
3025
};
3126
use database::{
3227
test_helpers::{
@@ -54,58 +49,13 @@ use crate::{
5449
apply_config,
5550
assert_root_cause_contains,
5651
backfill_indexes,
57-
db_schema_with_indexes,
5852
deploy_schema,
5953
expect_diff,
6054
prepare_schema,
6155
},
6256
test_helpers::DbFixturesWithModel,
6357
};
6458

65-
macro_rules! db_schema_with_search_indexes {
66-
($($table:expr => [$(($index_name:expr, $field:expr)),*]),* $(,)?) => {
67-
{
68-
69-
#[allow(unused)]
70-
let mut tables = BTreeMap::new();
71-
{
72-
$(
73-
let table_name: TableName = str::parse($table)?;
74-
#[allow(unused)]
75-
let mut text_indexes = BTreeMap::new();
76-
$(
77-
let index_name = new_index_name($table, $index_name)?;
78-
let field_path: FieldPath = str::parse($field).unwrap();
79-
text_indexes.insert(
80-
index_name.descriptor().clone(),
81-
TextIndexSchema::new(
82-
index_name.descriptor().clone(),
83-
field_path.try_into()?,
84-
BTreeSet::new(),
85-
)?,
86-
);
87-
)*
88-
let table_def = TableDefinition {
89-
table_name: table_name.clone(),
90-
indexes: BTreeMap::new(),
91-
staged_db_indexes: Default::default(),
92-
text_indexes,
93-
staged_text_indexes: Default::default(),
94-
vector_indexes: Default::default(),
95-
staged_vector_indexes: Default::default(),
96-
document_type: None,
97-
};
98-
tables.insert(table_name, table_def);
99-
)*
100-
}
101-
DatabaseSchema {
102-
tables,
103-
schema_validation: true,
104-
}
105-
}
106-
};
107-
}
108-
10959
type FnGenSchema =
11060
Box<dyn Fn(&str, &str, &str, Option<DocumentSchema>) -> anyhow::Result<DatabaseSchema>>;
11161

0 commit comments

Comments
 (0)