From aacbc7d7c086bb83b3de436d6ec24c18ce1c8205 Mon Sep 17 00:00:00 2001 From: gianmarcoalarcon Date: Tue, 26 Sep 2023 20:16:51 +0700 Subject: [PATCH 1/4] Refactor(torii): fn register_model(), fn set_entity() --- crates/torii/core/src/sql.rs | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/crates/torii/core/src/sql.rs b/crates/torii/core/src/sql.rs index c778a60769..de11247495 100644 --- a/crates/torii/core/src/sql.rs +++ b/crates/torii/core/src/sql.rs @@ -155,16 +155,18 @@ impl Sql { let mut sql_types = self.sql_types.lock().await; let model_id = model.name.to_lowercase(); - let mut queries = vec![format!( + let insert_models = format!( "INSERT INTO models (id, name, class_hash) VALUES ('{}', '{}', '{:#x}') ON \ - CONFLICT(id) DO UPDATE SET class_hash='{:#x}'", + CONFLICT(id) DO UPDATE SET class_hash='{:#x}' RETURNING created_at", model_id, model.name, model.class_hash, model.class_hash - )]; + ); + let query_result: SqliteRow = sqlx::query(&insert_models).fetch_one(&self.pool).await?; let mut model_table_query = format!( "CREATE TABLE IF NOT EXISTS external_{} (entity_id TEXT NOT NULL PRIMARY KEY, ", model.name.to_lowercase() ); + let mut queries = vec![]; for member in &model.members { // FIXME: defaults all unknown model types to Enum for now until we support nested @@ -194,16 +196,7 @@ impl Sql { self.queue(queries).await; - // Since previous query has not been executed, we have to make sure created_at exists - let created_at: DateTime = - match sqlx::query("SELECT created_at FROM models WHERE id = ?") - .bind(model_id.clone()) - .fetch_one(&self.pool) - .await - { - Ok(query_result) => query_result.try_get("created_at")?, - Err(_) => Utc::now(), - }; + let created_at: DateTime = query_result.try_get("created_at")?; SimpleBroker::publish(ModelType { id: model_id, @@ -246,9 +239,10 @@ impl Sql { "INSERT INTO entities (id, keys, model_names) VALUES ('{}', '{}', '{}') ON \ CONFLICT(id) DO UPDATE SET model_names=excluded.model_names, - updated_at=CURRENT_TIMESTAMP", + updated_at=CURRENT_TIMESTAMP RETURNING created_at", entity_id, keys_str, model_names ); + let query_result: SqliteRow = sqlx::query(&insert_entities).fetch_one(&self.pool).await?; let member_names_result = sqlx::query("SELECT * FROM model_members WHERE model_id = ? ORDER BY id ASC") @@ -274,15 +268,10 @@ impl Sql { ); // tx commit required - self.queue(vec![insert_entities, insert_models]).await; + self.queue(vec![insert_models]).await; self.execute().await?; - let query_result = sqlx::query("SELECT created_at FROM entities WHERE id = ?") - .bind(entity_id.clone()) - .fetch_one(&self.pool) - .await?; let created_at: DateTime = query_result.try_get("created_at")?; - SimpleBroker::publish(Entity { id: entity_id.clone(), keys: keys_str, From 16de08605e9f6fd8831f2f191a71c917b3ee8ad2 Mon Sep 17 00:00:00 2001 From: gianmarcoalarcon Date: Mon, 23 Oct 2023 11:45:37 +0700 Subject: [PATCH 2/4] Feat: add Returning clause --- crates/torii/core/src/sql.rs | 35 +++++++++++++---------------------- 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/crates/torii/core/src/sql.rs b/crates/torii/core/src/sql.rs index b6ed54038e..6021fcdfa3 100644 --- a/crates/torii/core/src/sql.rs +++ b/crates/torii/core/src/sql.rs @@ -6,6 +6,7 @@ use chrono::{DateTime, Utc}; use dojo_types::primitive::Primitive; use dojo_types::schema::Ty; use sqlx::pool::PoolConnection; +use sqlx::sqlite::SqliteRow; use sqlx::{Executor, Pool, Row, Sqlite}; use starknet::core::types::{Event, FieldElement}; use starknet_crypto::poseidon_hash_many; @@ -90,31 +91,24 @@ impl Sql { .iter() .map(|x| >::try_into(*x).unwrap()) .collect::>(); - self.query_queue.push(format!( + let insert_models = format!( "INSERT INTO models (id, name, class_hash, layout, packed_size, unpacked_size) VALUES \ ('{id}', '{name}', '{class_hash:#x}', '{layout}', '{packed_size}', \ '{unpacked_size}') ON CONFLICT(id) DO UPDATE SET class_hash='{class_hash:#x}', \ - layout='{layout}', packed_size='{packed_size}', unpacked_size='{unpacked_size}'", + layout='{layout}', packed_size='{packed_size}', unpacked_size='{unpacked_size}' \ + RETURNING created_at", id = model.name(), name = model.name(), layout = hex::encode(&layout_blob) - )); + ); + // execute first to get created_at + let query_result: SqliteRow = sqlx::query(&insert_models).fetch_one(&self.pool).await?; let mut model_idx = 0_usize; self.build_register_queries_recursive(&model, vec![model.name()], &mut model_idx); - self.execute().await?; - // Since previous query has not been executed, we have to make sure created_at exists - let created_at: DateTime = - match sqlx::query("SELECT created_at FROM models WHERE id = ?") - .bind(model.name()) - .fetch_one(&self.pool) - .await - { - Ok(query_result) => query_result.try_get("created_at")?, - Err(_) => Utc::now(), - }; + let created_at: DateTime = query_result.try_get("created_at")?; SimpleBroker::publish(ModelType { id: model.name(), @@ -153,22 +147,19 @@ impl Sql { }; let keys_str = felts_sql_string(&keys); - self.query_queue.push(format!( + let insert_entities = format!( "INSERT INTO entities (id, keys, model_names, event_id) VALUES ('{}', '{}', '{}', \ '{}') ON CONFLICT(id) DO UPDATE SET model_names=excluded.model_names, \ - updated_at=CURRENT_TIMESTAMP, event_id=excluded.event_id", + updated_at=CURRENT_TIMESTAMP, event_id=excluded.event_id RETURNING created_at", entity_id, keys_str, model_names, event_id - )); + ); + // execute first to get created_at + let query_result: SqliteRow = sqlx::query(&insert_entities).fetch_one(&self.pool).await?; let path = vec![entity.name()]; self.build_set_entity_queries_recursive(path, event_id, &entity_id, &entity); - self.execute().await?; - let query_result = sqlx::query("SELECT created_at FROM entities WHERE id = ?") - .bind(entity_id.clone()) - .fetch_one(&self.pool) - .await?; let created_at: DateTime = query_result.try_get("created_at")?; SimpleBroker::publish(Entity { From abae01b3a226b6c217d3193a5e87739d4da87538 Mon Sep 17 00:00:00 2001 From: gianmarcoalarcon Date: Tue, 26 Sep 2023 20:16:51 +0700 Subject: [PATCH 3/4] Refactor(torii): fn register_model(), fn set_entity() --- crates/torii/core/src/sql.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/torii/core/src/sql.rs b/crates/torii/core/src/sql.rs index 6021fcdfa3..4368fa038d 100644 --- a/crates/torii/core/src/sql.rs +++ b/crates/torii/core/src/sql.rs @@ -161,7 +161,6 @@ impl Sql { self.execute().await?; let created_at: DateTime = query_result.try_get("created_at")?; - SimpleBroker::publish(Entity { id: entity_id.clone(), keys: keys_str, From 6127be3ed49fd022b430c53bff4880e9d6853ef8 Mon Sep 17 00:00:00 2001 From: gianmarcoalarcon Date: Thu, 26 Oct 2023 10:38:50 +0700 Subject: [PATCH 4/4] Refactor: Optimize sql query, use fn query_as() --- crates/torii/core/src/sql.rs | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/crates/torii/core/src/sql.rs b/crates/torii/core/src/sql.rs index 74b67d8655..9fa2bc8e1f 100644 --- a/crates/torii/core/src/sql.rs +++ b/crates/torii/core/src/sql.rs @@ -6,8 +6,7 @@ use chrono::{DateTime, Utc}; use dojo_types::primitive::Primitive; use dojo_types::schema::Ty; use sqlx::pool::PoolConnection; -use sqlx::sqlite::SqliteRow; -use sqlx::{Executor, Pool, Row, Sqlite}; +use sqlx::{Executor, Pool, Sqlite}; use starknet::core::types::{Event, FieldElement, InvokeTransactionV1}; use starknet_crypto::poseidon_hash_many; @@ -102,20 +101,18 @@ impl Sql { layout = hex::encode(&layout_blob) ); // execute first to get created_at - let query_result: SqliteRow = sqlx::query(&insert_models).fetch_one(&self.pool).await?; - + let query_result: (DateTime,) = + sqlx::query_as(&insert_models).fetch_one(&self.pool).await?; let mut model_idx = 0_usize; self.build_register_queries_recursive(&model, vec![model.name()], &mut model_idx); self.execute().await?; - let created_at: DateTime = query_result.try_get("created_at")?; - SimpleBroker::publish(ModelType { id: model.name(), name: model.name(), class_hash: format!("{:#x}", class_hash), transaction_hash: "0x0".to_string(), - created_at, + created_at: query_result.0, }); Ok(()) } @@ -154,19 +151,19 @@ impl Sql { entity_id, keys_str, model_names, event_id ); // execute first to get created_at - let query_result: SqliteRow = sqlx::query(&insert_entities).fetch_one(&self.pool).await?; + let query_result: (DateTime,) = + sqlx::query_as(&insert_entities).fetch_one(&self.pool).await?; let path = vec![entity.name()]; self.build_set_entity_queries_recursive(path, event_id, &entity_id, &entity); self.execute().await?; - let created_at: DateTime = query_result.try_get("created_at")?; SimpleBroker::publish(Entity { id: entity_id.clone(), keys: keys_str, model_names, event_id: event_id.to_string(), - created_at, + created_at: query_result.0, updated_at: Utc::now(), }); Ok(())