1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
use bon::Builder;
use chrono::{DateTime, Utc};
use diesel::{Insertable, Queryable, Selectable};
use pgvector::Vector;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
use crate::{models::tags::Tag, utils};
#[derive(Debug, Deserialize, PartialEq, Queryable, Selectable, Serialize, ToSchema)]
#[diesel(table_name = crate::schema::recipes)]
#[diesel(check_for_backend(diesel::pg::Pg))]
pub struct Recipe {
/// Unique recipe ID.
pub id: i32,
/// Recipe title or description.
pub description: String,
/// Recipe ingredients.
pub ingredients: String,
/// Recipe instructions.
pub instructions: String,
/// Datetime the recipe was created in ISO format.
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Deserialize, PartialEq, Queryable, Selectable, Serialize, ToSchema)]
#[diesel(table_name = crate::schema::recipes)]
#[diesel(check_for_backend(diesel::pg::Pg))]
pub struct RecipePreview {
/// Unique recipe ID.
pub id: i32,
/// Recipe title or description.
pub description: String,
/// Datetime the recipe was created in ISO format.
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Deserialize, PartialEq, Serialize, ToSchema)]
pub struct RecipeTags {
/// Matching recipe preview.
pub recipe_preview: RecipePreview,
/// Matching tags.
pub tags: Vec<Tag>,
}
#[derive(Insertable)]
#[diesel(table_name = crate::schema::recipes)]
#[diesel(check_for_backend(diesel::pg::Pg))]
pub struct NewRecipe {
pub description: String,
pub ingredients: String,
pub instructions: String,
pub embedding: Vector,
}
#[derive(Insertable)]
#[diesel(table_name = crate::schema::recipe_tags)]
#[diesel(check_for_backend(diesel::pg::Pg))]
pub struct NewRecipeTag {
pub recipe_id: i32,
pub tag_id: i32,
}
#[derive(Builder, Deserialize, JsonSchema, Serialize, ToSchema)]
pub struct NewRecipeRequest {
/// Recipe title or description.
pub description: String,
/// Recipe ingredients.
pub ingredients: String,
/// Recipe instructions.
pub instructions: String,
/// Recipe tags.
pub tags: Vec<String>,
}
#[derive(Builder, Deserialize, JsonSchema, Serialize, ToSchema)]
pub struct RecipeSearchParams {
/// Update a recipe using their database-generated ID rather than
/// searching for them.
pub ids: Option<Vec<i32>>,
/// User query string to compare embeddings against. Basically,
/// if the user is asking something like "what color is my jacket?",
/// then the query string should be something like "jacket color" or
/// the user's original question. This can be left empty to ignore
/// similarity search in cases where the user wants to filter by
/// other means or get all items.
pub query: Option<String>,
/// Whether to match the query string more closely using a reranking -based
/// approach. `true` is useful for cases where the user is looking to match
/// to specific words or phrases, whereas `false` is useful for more broad
/// matching.
pub use_reranking_filter: Option<bool>,
/// Filter on recipes created after this ISO formatted datetime.
pub created_from: Option<DateTime<Utc>>,
/// Filter on recipes created before this ISO formatted datetime.
pub created_to: Option<DateTime<Utc>>,
/// How to order results for retrieved recipes.
pub order_by: Option<utils::OrderBy>,
/// Recipe tags to search with.
pub tags: Option<Vec<String>>,
/// Limit the max number of recipes to return from the search.
pub limit: Option<i64>,
}
#[derive(Builder, Deserialize, JsonSchema, Serialize, ToSchema)]
pub struct RecipeTagSearchParams {
/// Select an recipe using its database-generated IDs rather than
/// searching for it first.
pub recipe_id: Option<i32>,
/// User query string to compare embeddings against. Basically,
/// if the user is asking something like "what color is my jacket?",
/// then the query string should be something like "jacket color" or
/// the user's original question.
/// This can be left empty or null to ignore similarity search
/// in cases where the user wants to filter by other params
/// (e.g., get items by date or get all items).
pub recipe_query: Option<String>,
/// Whether to match the query string more closely using a reranking -based
/// approach. `true` is useful for cases where the user is looking to match
/// to a specific phrase, name, or words.
pub recipe_use_reranking_filter: Option<bool>,
/// Filter on recipes created after this ISO formatted datetime.
pub recipe_created_from: Option<DateTime<Utc>>,
/// Filter on recipes created before this ISO formatted datetime.
pub recipe_created_to: Option<DateTime<Utc>>,
/// How to order results for retrieved recipes.
pub recipe_order_by: Option<utils::OrderBy>,
/// Search tags using their database-generated IDs rather than
/// searching for them first.
pub tag_ids: Option<Vec<i32>>,
/// User query string to compare embeddings against. Basically,
/// if the user is asking something like "what color is my jacket?",
/// then the query string should be something like "jacket color" or
/// the user's original question.
/// This can be left empty or null to ignore similarity search
/// in cases where the user wants to filter by other params
/// (e.g., get items by date or get all items).
pub tag_query: Option<String>,
/// Whether to match the query string more closely using a reranking -based
/// approach. `true` is useful for cases where the user is looking to match
/// to a specific phrase, name, or words.
pub tag_use_reranking_filter: Option<bool>,
/// Whether to match the query string more closely, character-for-character.
pub tag_use_edit_distance_filter: Option<bool>,
/// Limit the max number of tags to return from the search.
pub tag_limit: Option<i64>,
}
#[derive(Builder, Deserialize, JsonSchema, Serialize, ToSchema)]
pub struct NewRecipeTagsRequest {
/// Update a recipe using their database-generated ID rather than
/// searching for them.
pub ids: Option<Vec<i32>>,
/// User query string to compare embeddings against. Basically,
/// if the user is asking something like "what color is my jacket?",
/// then the query string should be something like "jacket color" or
/// the user's original question. This can be left empty to ignore
/// similarity search in cases where the user wants to filter by
/// other means or get all items.
pub query: Option<String>,
/// Whether to match the query string more closely using a reranking -based
/// approach. `true` is useful for cases where the user is looking to match
/// to specific words or phrases, whereas `false` is useful for more broad
/// matching.
pub use_reranking_filter: Option<bool>,
/// Filter on recipes created after this ISO formatted datetime.
pub created_from: Option<DateTime<Utc>>,
/// Filter on recipes created before this ISO formatted datetime.
pub created_to: Option<DateTime<Utc>>,
/// How to order results for retrieved recipes.
pub order_by: Option<utils::OrderBy>,
/// Recipe tags to add.
pub tags: Vec<String>,
/// Limit the max number of recipes to return from the search.
pub limit: Option<i64>,
}