Skip to content

Commit fc6af13

Browse files
committed
feat: FieldValues autogenerated enums takes the concrete type of the column, not QueryParameter anymore
1 parent 700bc3a commit fc6af13

10 files changed

Lines changed: 118 additions & 74 deletions

File tree

canyon_core/src/query/bounds.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ pub trait FieldIdentifier: std::fmt::Display {
8585
/// Ex:
8686
/// `SELECT * FROM some_table WHERE id = 2`
8787
///
88-
/// That '2' it's extracted from some enum that implements [`FieldValueIdentifier`],
88+
/// That '2' it's extracted from some enum that implements [`FieldValueIdentifier<'a>`],
8989
/// where usually the variant w'd be something like:
9090
///
9191
/// ```
@@ -94,7 +94,7 @@ pub trait FieldIdentifier: std::fmt::Display {
9494
/// }
9595
/// ```
9696
pub trait FieldValueIdentifier<'a> {
97-
fn value(self) -> (&'static str, &'a dyn QueryParameter<'a>);
97+
fn value(&'a self) -> (&'static str, &'a dyn QueryParameter<'_>);
9898
}
9999

100100
/// Bounds to some type T in order to make it callable over some fn parameter T

canyon_core/src/query/querybuilder/contracts/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,15 +126,15 @@ pub trait QueryBuilderOps<'a> {
126126
/// column name and the value for the filter
127127
/// * `op` - Any element that implements [`Operator`] for create the comparison
128128
/// or equality binary operator
129-
fn r#where<Z: FieldValueIdentifier<'a>>(self, column: Z, op: impl Operator) -> Self;
129+
fn r#where<Z: FieldValueIdentifier<'a>>(self, column: &'a Z, op: impl Operator) -> Self;
130130

131131
/// Generates an `AND` SQL clause for constraint the query.
132132
///
133133
/// * `column` - A [`FieldValueIdentifier`] that will provide the target
134134
/// column name and the value for the filter
135135
/// * `op` - Any element that implements [`Operator`] for create the comparison
136136
/// or equality binary operator
137-
fn and<Z: FieldValueIdentifier<'a>>(self, column: Z, op: impl Operator) -> Self;
137+
fn and<Z: FieldValueIdentifier<'a>>(self, column: &'a Z, op: impl Operator) -> Self;
138138

139139
/// Generates an `AND` SQL clause for constraint the query that's being constructed
140140
///
@@ -167,7 +167,7 @@ pub trait QueryBuilderOps<'a> {
167167
/// column name and the value for the filter
168168
/// * `op` - Any element that implements [`Operator`] for create the comparison
169169
/// or equality binary operator
170-
fn or<Z: FieldValueIdentifier<'a>>(self, column: Z, op: impl Operator) -> Self;
170+
fn or<Z: FieldValueIdentifier<'a>>(self, column: &'a Z, op: impl Operator) -> Self;
171171

172172
/// Generates a `ORDER BY` SQL clause for constraint the query.
173173
///

canyon_core/src/query/querybuilder/impl/delete.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@ impl<'a> QueryBuilderOps<'a> for DeleteQueryBuilder<'a> {
1818
}
1919

2020
#[inline]
21-
fn r#where<Z: FieldValueIdentifier<'a>>(mut self, r#where: Z, op: impl Operator) -> Self {
21+
fn r#where<Z: FieldValueIdentifier<'a>>(mut self, r#where: &'a Z, op: impl Operator) -> Self {
2222
self._inner.r#where(r#where, op);
2323
self
2424
}
2525

2626
#[inline]
27-
fn and<Z: FieldValueIdentifier<'a>>(mut self, column: Z, op: impl Operator) -> Self {
27+
fn and<Z: FieldValueIdentifier<'a>>(mut self, column: &'a Z, op: impl Operator) -> Self {
2828
self._inner.and(column, op);
2929
self
3030
}
@@ -35,7 +35,7 @@ impl<'a> QueryBuilderOps<'a> for DeleteQueryBuilder<'a> {
3535
Z: FieldIdentifier,
3636
Q: QueryParameter<'a>,
3737
{
38-
self._inner.or_values_in(and, values);
38+
self._inner.and_values_in(and, values);
3939
self
4040
}
4141

@@ -50,7 +50,7 @@ impl<'a> QueryBuilderOps<'a> for DeleteQueryBuilder<'a> {
5050
}
5151

5252
#[inline]
53-
fn or<Z: FieldValueIdentifier<'a>>(mut self, column: Z, op: impl Operator) -> Self {
53+
fn or<Z: FieldValueIdentifier<'a>>(mut self, column: &'a Z, op: impl Operator) -> Self {
5454
self._inner.or(column, op);
5555
self
5656
}

canyon_core/src/query/querybuilder/impl/select.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,13 @@ impl<'a> QueryBuilderOps<'a> for SelectQueryBuilder<'a> {
7474
}
7575

7676
#[inline]
77-
fn r#where<Z: FieldValueIdentifier<'a>>(mut self, r#where: Z, op: impl Operator) -> Self {
77+
fn r#where<Z: FieldValueIdentifier<'a>>(mut self, r#where: &'a Z, op: impl Operator) -> Self {
7878
self._inner.r#where(r#where, op);
7979
self
8080
}
8181

8282
#[inline]
83-
fn and<Z: FieldValueIdentifier<'a>>(mut self, column: Z, op: impl Operator) -> Self {
83+
fn and<Z: FieldValueIdentifier<'a>>(mut self, column: &'a Z, op: impl Operator) -> Self {
8484
self._inner.and(column, op);
8585
self
8686
}
@@ -106,7 +106,7 @@ impl<'a> QueryBuilderOps<'a> for SelectQueryBuilder<'a> {
106106
}
107107

108108
#[inline]
109-
fn or<Z: FieldValueIdentifier<'a>>(mut self, column: Z, op: impl Operator) -> Self {
109+
fn or<Z: FieldValueIdentifier<'a>>(mut self, column: &'a Z, op: impl Operator) -> Self {
110110
self._inner.or(column, op);
111111
self
112112
}

canyon_core/src/query/querybuilder/impl/update.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,13 @@ impl<'a> QueryBuilderOps<'a> for UpdateQueryBuilder<'a> {
5858
}
5959

6060
#[inline]
61-
fn r#where<Z: FieldValueIdentifier<'a>>(mut self, r#where: Z, op: impl Operator) -> Self {
61+
fn r#where<Z: FieldValueIdentifier<'a>>(mut self, r#where: &'a Z, op: impl Operator) -> Self {
6262
self._inner.r#where(r#where, op);
6363
self
6464
}
6565

6666
#[inline]
67-
fn and<Z: FieldValueIdentifier<'a>>(mut self, column: Z, op: impl Operator) -> Self {
67+
fn and<Z: FieldValueIdentifier<'a>>(mut self, column: &'a Z, op: impl Operator) -> Self {
6868
self._inner.and(column, op);
6969
self
7070
}
@@ -90,7 +90,7 @@ impl<'a> QueryBuilderOps<'a> for UpdateQueryBuilder<'a> {
9090
}
9191

9292
#[inline]
93-
fn or<Z: FieldValueIdentifier<'a>>(mut self, column: Z, op: impl Operator) -> Self {
93+
fn or<Z: FieldValueIdentifier<'a>>(mut self, column: &'a Z, op: impl Operator) -> Self {
9494
self._inner.or(column, op);
9595
self
9696
}

canyon_core/src/query/querybuilder/types/mod.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ impl<'a> QueryBuilder<'a> {
3838
Ok(Query::new(self.sql, self.params))
3939
}
4040

41-
pub fn r#where<Z: FieldValueIdentifier<'a>>(&mut self, r#where: Z, op: impl Operator) {
41+
pub fn r#where<Z: FieldValueIdentifier<'a>>(&mut self, r#where: &'a Z, op: impl Operator) {
4242
let (column_name, value) = r#where.value();
4343

4444
let where_ = String::from(" WHERE ")
@@ -49,7 +49,7 @@ impl<'a> QueryBuilder<'a> {
4949
self.params.push(value);
5050
}
5151

52-
pub fn and<Z: FieldValueIdentifier<'a>>(&mut self, r#and: Z, op: impl Operator) {
52+
pub fn and<Z: FieldValueIdentifier<'a>>(&mut self, r#and: &'a Z, op: impl Operator) {
5353
let (column_name, value) = r#and.value();
5454

5555
let and_ = String::from(" AND ")
@@ -110,14 +110,14 @@ impl<'a> QueryBuilder<'a> {
110110
self.sql.push(')');
111111
}
112112

113-
pub fn or<Z: FieldValueIdentifier<'a>>(&mut self, r#and: Z, op: impl Operator) {
114-
let (column_name, value) = r#and.value();
113+
pub fn or<Z: FieldValueIdentifier<'a>>(&mut self, r#or: &'a Z, op: impl Operator) {
114+
let (column_name, value) = r#or.value();
115115

116-
let and_ = String::from(" OR ")
116+
let or_ = String::from(" OR ")
117117
+ column_name
118118
+ &op.as_str(self.params.len() + 1, &self.database_type);
119119

120-
self.sql.push_str(&and_);
120+
self.sql.push_str(&or_);
121121
self.params.push(value);
122122
}
123123

canyon_entities/src/entity.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,14 @@ impl CanyonEntity {
4444
/// which this enum is related to.
4545
///
4646
/// Makes a variant `#field_name(#ty)` where `#ty` it's a trait object
47-
/// of type `canyon_core::QueryParameter`
47+
/// of type `canyon_core::QueryParameter` TODO: correct the comment when refactored
4848
pub fn get_fields_as_enum_variants_with_value(&self) -> Vec<TokenStream> {
4949
self.fields
5050
.iter()
5151
.map(|f| {
5252
let field_name = &f.name;
53-
quote! { #field_name(&'a dyn canyon_sql::query::QueryParameter<'a>) }
53+
let field_ty = &f.field_type;
54+
quote! { #field_name(#field_ty) }
5455
})
5556
.collect::<Vec<_>>()
5657
}
@@ -91,7 +92,7 @@ impl CanyonEntity {
9192

9293
/// Generates an implementation of the match pattern to find whatever variant
9394
/// is being requested when the method `.value()` it's invoked over some
94-
/// instance that implements the `canyon_sql_root::crud::bounds::FieldValueIdentifier` trait
95+
/// instance that implements the `canyon_sql_root::crud::bounds::FieldValueIdentifier<'a>` trait
9596
pub fn create_match_arm_for_relate_fields_with_values(
9697
&self,
9798
enum_name: &Ident,
@@ -103,7 +104,7 @@ impl CanyonEntity {
103104
let field_name_as_string = f.name.to_string();
104105

105106
quote! {
106-
#enum_name::#field_name(v) => (#field_name_as_string, v)
107+
#enum_name::#field_name(v) => (#field_name_as_string, v as &dyn canyon_sql::query::QueryParameter<'_>)
107108
}
108109
})
109110
.collect::<Vec<_>>()

canyon_entities/src/manager_builder.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -197,14 +197,16 @@ pub fn generate_enum_with_fields_values(canyon_entity: &CanyonEntity) -> TokenSt
197197
/// opt(Option<String>)
198198
/// }
199199
/// ```
200-
#visibility enum #enum_name<'a> {
201-
#(#fields_names),*
200+
#visibility enum #enum_name<'field_value> {
201+
#(#fields_names),*,
202+
None(std::marker::PhantomData<&'field_value ()>)
202203
}
203204

204-
impl<'a> canyon_sql::query::bounds::FieldValueIdentifier<'a> for #enum_name<'a> {
205-
fn value(self) -> (&'static str, &'a dyn canyon_sql::query::QueryParameter<'a>) {
205+
impl<'field_value> canyon_sql::query::bounds::FieldValueIdentifier<'field_value> for #enum_name<'field_value> {
206+
fn value(&'field_value self) -> (&'static str, &'field_value dyn canyon_sql::query::QueryParameter<'_>) {
206207
match self {
207-
#(#match_arms),*
208+
#(#match_arms),*,
209+
_ => panic!()
208210
}
209211
}
210212
}

tests/crud/hex_arch_example.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,17 @@ fn test_hex_arch_find_insert_ops() {
6666
let find_new_league = league_service.get(&other_league.id).await.unwrap();
6767
assert!(find_new_league.is_some());
6868
assert_eq!(
69-
find_new_league.unwrap().name,
69+
find_new_league.as_ref().unwrap().name,
7070
String::from("Test LeagueHex on layered")
7171
);
72+
73+
let mut updt = find_new_league.unwrap();
74+
updt.ext_id = 5;
75+
let r = LeagueHexRepositoryAdapter::<DatabaseConnection>::update_entity(&updt).await;
76+
assert!(r.is_ok());
77+
78+
let updated = league_service.get(&other_league.id).await.unwrap();
79+
assert_eq!(updated.unwrap().ext_id, 5)
7280
}
7381

7482
#[derive(CanyonMapper, Debug)]

0 commit comments

Comments
 (0)