From 77c37f7522c62cff8a6075beeb2b660f0db55820 Mon Sep 17 00:00:00 2001 From: Yun Date: Mon, 19 Feb 2024 12:05:21 -1000 Subject: [PATCH] Torii core store u64 primitive as string in db (#1532) --- crates/dojo-types/src/primitive.rs | 9 +++++---- crates/torii/core/src/model.rs | 7 +++++-- crates/torii/graphql/src/tests/mod.rs | 2 +- crates/torii/graphql/src/tests/models_test.rs | 12 ++++++++++-- crates/torii/graphql/src/tests/subscription_test.rs | 2 +- 5 files changed, 22 insertions(+), 10 deletions(-) diff --git a/crates/dojo-types/src/primitive.rs b/crates/dojo-types/src/primitive.rs index c2727e75e7..277ffa04f6 100644 --- a/crates/dojo-types/src/primitive.rs +++ b/crates/dojo-types/src/primitive.rs @@ -138,10 +138,11 @@ impl Primitive { Primitive::U8(_) | Primitive::U16(_) | Primitive::U32(_) - | Primitive::U64(_) | Primitive::USize(_) | Primitive::Bool(_) => SqlType::Integer, - Primitive::U128(_) + + Primitive::U64(_) + | Primitive::U128(_) | Primitive::U256(_) | Primitive::ContractAddress(_) | Primitive::ClassHash(_) @@ -160,11 +161,11 @@ impl Primitive { Primitive::U8(_) | Primitive::U16(_) | Primitive::U32(_) - | Primitive::U64(_) | Primitive::USize(_) | Primitive::Bool(_) => Ok(format!("{}", value[0])), - Primitive::U128(_) + Primitive::U64(_) + | Primitive::U128(_) | Primitive::ContractAddress(_) | Primitive::ClassHash(_) | Primitive::Felt252(_) => Ok(format!("0x{:064x}", value[0])), diff --git a/crates/torii/core/src/model.rs b/crates/torii/core/src/model.rs index ba4d42d81c..7b3d0a4fd6 100644 --- a/crates/torii/core/src/model.rs +++ b/crates/torii/core/src/model.rs @@ -249,8 +249,11 @@ pub fn map_row_to_ty(path: &str, struct_ty: &mut Struct, row: &SqliteRow) -> Res primitive.set_u32(Some(value))?; } Primitive::U64(_) => { - let value = row.try_get::(&column_name)?; - primitive.set_u64(Some(value as u64))?; + let value = row.try_get::(&column_name)?; + let hex_str = value.trim_start_matches("0x"); + primitive.set_u64(Some( + u64::from_str_radix(hex_str, 16).map_err(ParseError::ParseIntError)?, + ))?; } Primitive::U128(_) => { let value = row.try_get::(&column_name)?; diff --git a/crates/torii/graphql/src/tests/mod.rs b/crates/torii/graphql/src/tests/mod.rs index 232436d16a..5abb2da9f0 100644 --- a/crates/torii/graphql/src/tests/mod.rs +++ b/crates/torii/graphql/src/tests/mod.rs @@ -89,7 +89,7 @@ pub struct Record { pub type_u8: u8, pub type_u16: u16, pub type_u32: u32, - pub type_u64: u64, + pub type_u64: String, pub type_u128: String, pub type_u256: String, pub type_bool: bool, diff --git a/crates/torii/graphql/src/tests/models_test.rs b/crates/torii/graphql/src/tests/models_test.rs index ecf9a1721d..ff3e825ec5 100644 --- a/crates/torii/graphql/src/tests/models_test.rs +++ b/crates/torii/graphql/src/tests/models_test.rs @@ -198,10 +198,10 @@ mod tests { // where filter LT and GT let records = - records_model_query(&schema, "(where: { type_u32GT: 2, type_u64LT: 4 })").await; + records_model_query(&schema, "(where: { type_u32GT: 2, type_u16LT: 4 })").await; let connection: Connection = serde_json::from_value(records).unwrap(); let first_record = connection.edges.first().unwrap(); - assert_eq!(first_record.node.type_u64, 3); + assert_eq!(first_record.node.type_u16, 3); // NOTE: Server side is gonna parse "0x5" and "5" to hexadecimal format let felt_str_0x5 = "0x5"; @@ -220,6 +220,14 @@ mod tests { let first_record = connection.edges.first().unwrap(); assert_eq!(first_record.node.type_class_hash, "0x5"); + // where filter EQ on u64 (string) + let records = + records_model_query(&schema, &format!("(where: {{ type_u64: \"{}\" }})", felt_str_0x5)) + .await; + let connection: Connection = serde_json::from_value(records).unwrap(); + let first_record = connection.edges.first().unwrap(); + assert_eq!(first_record.node.type_u64, "0x5"); + // where filter GTE on u128 (string) let records = records_model_query( &schema, diff --git a/crates/torii/graphql/src/tests/subscription_test.rs b/crates/torii/graphql/src/tests/subscription_test.rs index 1f54c84f3a..f6b717e90b 100644 --- a/crates/torii/graphql/src/tests/subscription_test.rs +++ b/crates/torii/graphql/src/tests/subscription_test.rs @@ -35,7 +35,7 @@ mod tests { "depth": "Zero", "record_id": 0, "typeU16": 1, - "type_u64": 1, + "type_u64": "0x1", "typeBool": true, "type_felt": format!("{:#x}", FieldElement::from(1u128)), "typeContractAddress": format!("{:#x}", FieldElement::ONE)