Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ let result = client
| `num_dim` | integer | Set this to a non-zero value to treat a field of type `float[]` as a vector field. |
| `locale` | string | Locale for text processing |
| `vec_dist` | string | Distance metric to be used for vector search |
| `reference` | string | Name of a field in another collection to be used for JOINs |
| `type` | string | Override the field type in Typesense |
| `rename` | string | Rename the field in the Typesense schema |
| `flatten` | -- | Generate Typesense field schemas for a nested struct |
Expand Down
4 changes: 4 additions & 0 deletions typesense/tests/derive/collection.rs
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,9 @@ struct KitchenSinkProduct {
// optional = false should override the Option<T> type
#[typesense(optional = false)]
optional_field: Option<i32>,

#[typesense(reference = "company.id")]
company_id: String,
}

#[test]
Expand Down Expand Up @@ -137,6 +140,7 @@ fn derived_document_handles_all_attributes() {
{ "name": "btree_map_vec", "type": "object[]" },

{ "name": "optional_field", "type": "int32", "optional": false },
{"name": "company_id", "type": "string", "reference": "company.id"}
],
"default_sorting_field": "renamed_price",
"token_separators": ["-", "/"],
Expand Down
17 changes: 16 additions & 1 deletion typesense_derive/src/field_attributes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ pub(crate) struct FieldAttributes {
flatten: bool,
pub(crate) rename: Option<String>,
skip: bool,
reference: Option<String>,
}

// This function will parse #[typesense(...)] on a FIELD
Expand Down Expand Up @@ -209,6 +210,16 @@ pub(crate) fn extract_field_attrs(field: &Field) -> syn::Result<FieldAttributes>
}
res.vec_dist = Some(string_literal(&mut tt_iter)?);
}
"reference" => {
skip_eq(&i, &mut tt_iter)?;
if res.reference.is_some() {
return Err(syn::Error::new_spanned(
&i,
"Attribute `reference` is duplicated",
));
}
res.reference = Some(string_literal(&mut tt_iter)?);
}
"type" => {
skip_eq(&i, &mut tt_iter)?;
if res.type_override.is_some() {
Expand Down Expand Up @@ -283,12 +294,16 @@ fn build_regular_field(field: &Field, field_attrs: &FieldAttributes) -> proc_mac
let range_index = field_attrs.range_index.map(|v| quote!(.range_index(#v)));
let locale = field_attrs.locale.as_ref().map(|v| quote!(.locale(#v)));
let vec_dist = field_attrs.vec_dist.as_ref().map(|v| quote!(.vec_dist(#v)));
let reference = field_attrs
.reference
.as_ref()
.map(|v| quote!(.reference(#v)));
let num_dim = field_attrs.num_dim.map(|v| quote!(.num_dim(#v)));

quote! {
vec![
typesense::models::Field::builder().name(#field_name).r#type(#typesense_field_type)
#optional #facet #index #store #sort #infix #stem #range_index #locale #vec_dist #num_dim
#optional #facet #index #store #sort #infix #stem #range_index #locale #vec_dist #reference #num_dim
.build()
]
}
Expand Down
Loading