Skip to content

Commit 851c846

Browse files
nipunn1313Convex, Inc.
authored andcommitted
Unify the test helpers for db_schema_with_indexes (#39925)
Add test helper support for staged indexes too. In prep for testing the staged indexes GitOrigin-RevId: 35dfe7b5b6edf9f9fe148d19c37004648094fdde
1 parent a3c62e4 commit 851c846

File tree

3 files changed

+213
-119
lines changed

3 files changed

+213
-119
lines changed

crates/common/src/index.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,3 +210,25 @@ mod proptest {
210210
}
211211
}
212212
}
213+
214+
#[cfg(any(test, feature = "testing"))]
215+
pub mod test_helpers {
216+
use crate::types::{
217+
IndexDescriptor,
218+
IndexName,
219+
};
220+
221+
pub fn new_index_name(table_name: &str, index_name: &str) -> anyhow::Result<IndexName> {
222+
IndexName::new(
223+
str::parse(table_name)?,
224+
IndexDescriptor::new(index_name.to_string())?,
225+
)
226+
}
227+
228+
pub fn new_index_descriptor(
229+
table_name: &str,
230+
index_name: &str,
231+
) -> anyhow::Result<IndexDescriptor> {
232+
new_index_name(table_name, index_name).map(|name| name.descriptor().clone())
233+
}
234+
}

crates/common/src/schemas/test_helpers.rs

Lines changed: 187 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -2,151 +2,150 @@
22
// Turns a mapping of tableName => (index_name, vec![index_fields]) into a
33
// DatabaseSchema struct.
44
macro_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
}

crates/database/src/test_helpers/index_utils.rs

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ use std::{
55
};
66

77
use anyhow::Context;
8+
pub use common::index::test_helpers::{
9+
new_index_descriptor,
10+
new_index_name,
11+
};
812
use common::{
913
bootstrap_model::index::{
1014
database_index::{
@@ -136,17 +140,6 @@ pub async fn assert_enabled(
136140
Ok(())
137141
}
138142

139-
pub fn new_index_name(table_name: &str, index_name: &str) -> anyhow::Result<IndexName> {
140-
IndexName::new(
141-
str::parse(table_name)?,
142-
IndexDescriptor::new(index_name.to_string())?,
143-
)
144-
}
145-
146-
pub fn new_index_descriptor(table_name: &str, index_name: &str) -> anyhow::Result<IndexDescriptor> {
147-
new_index_name(table_name, index_name).map(|name| name.descriptor().clone())
148-
}
149-
150143
pub fn index_descriptors_and_fields(diff: &IndexDiff) -> Vec<Vec<(IndexDescriptor, Vec<String>)>> {
151144
let IndexDiff {
152145
added,

0 commit comments

Comments
 (0)