Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: introduce updated at field in top level torii query #2807

Merged
merged 8 commits into from
Dec 16, 2024
Merged
Show file tree
Hide file tree
Changes from 5 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
20 changes: 20 additions & 0 deletions crates/torii/core/src/model.rs
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@
}

/// Creates a query that fetches all models and their nested data.
#[allow(clippy::too_many_arguments)]
pub fn build_sql_query(
schemas: &Vec<Ty>,
table_name: &str,
Expand All @@ -124,6 +125,7 @@
order_by: Option<&str>,
limit: Option<u32>,
offset: Option<u32>,
internal_updated_at: u64,
) -> Result<(String, String), Error> {
fn collect_columns(table_prefix: &str, path: &str, ty: &Ty, selections: &mut Vec<String>) {
match ty {
Expand Down Expand Up @@ -172,6 +174,7 @@
selections.push(format!("{}.id", table_name));
selections.push(format!("{}.keys", table_name));

let mut internal_updated_at_clause = Vec::with_capacity(schemas.len());
// Process each model schema
for model in schemas {
let model_table = model.name();
Expand All @@ -180,6 +183,10 @@
[{model_table}].{entity_relation_column}",
));

if internal_updated_at > 0 {
internal_updated_at_clause.push(format!("[{model_table}].internal_updated_at > ?"));

Check warning on line 187 in crates/torii/core/src/model.rs

View check run for this annotation

Codecov / codecov/patch

crates/torii/core/src/model.rs#L187

Added line #L187 was not covered by tests
}

// Collect columns with table prefix
collect_columns(&model_table, "", model, &mut selections);
}
Expand All @@ -197,6 +204,18 @@
count_query += &format!(" WHERE {}", where_clause);
}

if !internal_updated_at_clause.is_empty() {
if where_clause.is_none() {
query += " WHERE ";
count_query += " WHERE ";
} else {
query += " AND ";
count_query += " AND ";
}
query += &format!(" {}", internal_updated_at_clause.join(" AND "));
count_query += &format!(" {}", internal_updated_at_clause.join(" AND "));

Check warning on line 216 in crates/torii/core/src/model.rs

View check run for this annotation

Codecov / codecov/patch

crates/torii/core/src/model.rs#L208-L216

Added lines #L208 - L216 were not covered by tests
}

// Use custom order by if provided, otherwise default to event_id DESC
if let Some(order_clause) = order_by {
query += &format!(" ORDER BY {}", order_clause);
Expand Down Expand Up @@ -494,6 +513,7 @@
None,
None,
None,
0,
)
.unwrap();

Expand Down
1 change: 1 addition & 0 deletions crates/torii/grpc/proto/types.proto
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ message Query {
bool dont_include_hashed_keys = 4;
repeated OrderBy order_by = 5;
repeated string entity_models = 6;
uint64 internal_updated_at = 7;
}

message EventQuery {
Expand Down
31 changes: 30 additions & 1 deletion crates/torii/grpc/src/server/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
use rayon::iter::{IntoParallelRefIterator, ParallelIterator};
use sqlx::prelude::FromRow;
use sqlx::sqlite::SqliteRow;
use sqlx::types::chrono::{DateTime, Utc};
use sqlx::{Pool, Row, Sqlite};
use starknet::core::types::Felt;
use starknet::providers::jsonrpc::HttpTransport;
Expand Down Expand Up @@ -229,6 +230,7 @@
dont_include_hashed_keys: bool,
order_by: Option<&str>,
entity_models: Vec<String>,
internal_updated_at: u64,

Check warning on line 233 in crates/torii/grpc/src/server/mod.rs

View check run for this annotation

Codecov / codecov/patch

crates/torii/grpc/src/server/mod.rs#L233

Added line #L233 was not covered by tests
) -> Result<(Vec<proto::types::Entity>, u32), Error> {
self.query_by_hashed_keys(
table,
Expand All @@ -240,6 +242,7 @@
dont_include_hashed_keys,
order_by,
entity_models,
internal_updated_at,

Check warning on line 245 in crates/torii/grpc/src/server/mod.rs

View check run for this annotation

Codecov / codecov/patch

crates/torii/grpc/src/server/mod.rs#L245

Added line #L245 was not covered by tests
)
.await
}
Expand All @@ -258,6 +261,7 @@
row_events.iter().map(map_row_to_event).collect()
}

#[allow(clippy::too_many_arguments)]
async fn fetch_entities(
&self,
table: &str,
Expand All @@ -266,6 +270,7 @@
dont_include_hashed_keys: bool,
order_by: Option<&str>,
entity_models: Vec<String>,
internal_updated_at: u64,
) -> Result<Vec<proto::types::Entity>, Error> {
let entity_models =
entity_models.iter().map(|tag| compute_selector_from_tag(tag)).collect::<Vec<Felt>>();
Expand Down Expand Up @@ -354,9 +359,20 @@
order_by,
None,
None,
internal_updated_at,
)?;

let rows = sqlx::query(&entity_query).bind(models_str).fetch_all(&mut *tx).await?;
let mut query = sqlx::query(&entity_query).bind(models_str);
if internal_updated_at > 0 {
for _ in 0..schemas.len() {
query = query.bind(
DateTime::<Utc>::from_timestamp(internal_updated_at as i64, 0)
.ok_or_else(|| Error::from(QueryError::UnsupportedQuery))?
.to_rfc3339(),

Check warning on line 371 in crates/torii/grpc/src/server/mod.rs

View check run for this annotation

Codecov / codecov/patch

crates/torii/grpc/src/server/mod.rs#L367-L371

Added lines #L367 - L371 were not covered by tests
);
}
}
let rows = query.fetch_all(&mut *tx).await?;
let schemas = Arc::new(schemas);

let group_entities: Result<Vec<_>, Error> = rows
Expand Down Expand Up @@ -430,6 +446,7 @@
dont_include_hashed_keys: bool,
order_by: Option<&str>,
entity_models: Vec<String>,
internal_updated_at: u64,

Check warning on line 449 in crates/torii/grpc/src/server/mod.rs

View check run for this annotation

Codecov / codecov/patch

crates/torii/grpc/src/server/mod.rs#L449

Added line #L449 was not covered by tests
) -> Result<(Vec<proto::types::Entity>, u32), Error> {
// TODO: use prepared statement for where clause
let filter_ids = match hashed_keys {
Expand Down Expand Up @@ -510,6 +527,7 @@
dont_include_hashed_keys,
order_by,
entity_models,
internal_updated_at,

Check warning on line 530 in crates/torii/grpc/src/server/mod.rs

View check run for this annotation

Codecov / codecov/patch

crates/torii/grpc/src/server/mod.rs#L530

Added line #L530 was not covered by tests
)
.await?;
Ok((entities, total_count))
Expand All @@ -527,6 +545,7 @@
dont_include_hashed_keys: bool,
order_by: Option<&str>,
entity_models: Vec<String>,
internal_updated_at: u64,
) -> Result<(Vec<proto::types::Entity>, u32), Error> {
let keys_pattern = build_keys_pattern(keys_clause)?;

Expand Down Expand Up @@ -655,6 +674,7 @@
dont_include_hashed_keys,
order_by,
entity_models,
internal_updated_at,
)
.await?;
Ok((entities, total_count))
Expand Down Expand Up @@ -699,6 +719,7 @@
dont_include_hashed_keys: bool,
order_by: Option<&str>,
entity_models: Vec<String>,
internal_updated_at: u64,

Check warning on line 722 in crates/torii/grpc/src/server/mod.rs

View check run for this annotation

Codecov / codecov/patch

crates/torii/grpc/src/server/mod.rs#L722

Added line #L722 was not covered by tests
) -> Result<(Vec<proto::types::Entity>, u32), Error> {
let entity_models =
entity_models.iter().map(|model| compute_selector_from_tag(model)).collect::<Vec<_>>();
Expand Down Expand Up @@ -765,6 +786,7 @@
order_by,
limit,
offset,
internal_updated_at,

Check warning on line 789 in crates/torii/grpc/src/server/mod.rs

View check run for this annotation

Codecov / codecov/patch

crates/torii/grpc/src/server/mod.rs#L789

Added line #L789 was not covered by tests
)?;

let total_count = sqlx::query_scalar(&count_query)
Expand Down Expand Up @@ -798,6 +820,7 @@
dont_include_hashed_keys: bool,
order_by: Option<&str>,
entity_models: Vec<String>,
internal_updated_at: u64,

Check warning on line 823 in crates/torii/grpc/src/server/mod.rs

View check run for this annotation

Codecov / codecov/patch

crates/torii/grpc/src/server/mod.rs#L823

Added line #L823 was not covered by tests
) -> Result<(Vec<proto::types::Entity>, u32), Error> {
let (where_clause, having_clause, join_clause, bind_values) =
build_composite_clause(table, model_relation_table, &composite)?;
Expand Down Expand Up @@ -868,6 +891,7 @@
dont_include_hashed_keys,
order_by,
entity_models,
internal_updated_at,

Check warning on line 894 in crates/torii/grpc/src/server/mod.rs

View check run for this annotation

Codecov / codecov/patch

crates/torii/grpc/src/server/mod.rs#L894

Added line #L894 was not covered by tests
)
.await?;
Ok((entities, total_count))
Expand Down Expand Up @@ -1036,6 +1060,7 @@
query.dont_include_hashed_keys,
order_by,
query.entity_models,
query.internal_updated_at,

Check warning on line 1063 in crates/torii/grpc/src/server/mod.rs

View check run for this annotation

Codecov / codecov/patch

crates/torii/grpc/src/server/mod.rs#L1063

Added line #L1063 was not covered by tests
)
.await?
}
Expand All @@ -1059,6 +1084,7 @@
query.dont_include_hashed_keys,
order_by,
query.entity_models,
query.internal_updated_at,

Check warning on line 1087 in crates/torii/grpc/src/server/mod.rs

View check run for this annotation

Codecov / codecov/patch

crates/torii/grpc/src/server/mod.rs#L1087

Added line #L1087 was not covered by tests
)
.await?
}
Expand All @@ -1073,6 +1099,7 @@
query.dont_include_hashed_keys,
order_by,
query.entity_models,
query.internal_updated_at,

Check warning on line 1102 in crates/torii/grpc/src/server/mod.rs

View check run for this annotation

Codecov / codecov/patch

crates/torii/grpc/src/server/mod.rs#L1102

Added line #L1102 was not covered by tests
)
.await?
}
Expand All @@ -1087,6 +1114,7 @@
query.dont_include_hashed_keys,
order_by,
query.entity_models,
query.internal_updated_at,

Check warning on line 1117 in crates/torii/grpc/src/server/mod.rs

View check run for this annotation

Codecov / codecov/patch

crates/torii/grpc/src/server/mod.rs#L1117

Added line #L1117 was not covered by tests
)
.await?
}
Expand All @@ -1101,6 +1129,7 @@
query.dont_include_hashed_keys,
order_by,
query.entity_models,
query.internal_updated_at,

Check warning on line 1132 in crates/torii/grpc/src/server/mod.rs

View check run for this annotation

Codecov / codecov/patch

crates/torii/grpc/src/server/mod.rs#L1132

Added line #L1132 was not covered by tests
)
.await?
}
Expand Down
1 change: 1 addition & 0 deletions crates/torii/grpc/src/server/tests/entities_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ async fn test_entities_queries(sequencer: &RunnerCtx) {
false,
None,
vec![],
0,
)
.await
.unwrap()
Expand Down
2 changes: 2 additions & 0 deletions crates/torii/grpc/src/types/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@
pub dont_include_hashed_keys: bool,
pub order_by: Vec<OrderBy>,
pub entity_models: Vec<String>,
pub internal_updated_at: u64,
}

#[derive(Debug, Serialize, Deserialize, PartialEq, Hash, Eq, Clone)]
Expand Down Expand Up @@ -271,6 +272,7 @@
dont_include_hashed_keys: value.dont_include_hashed_keys,
order_by: value.order_by.into_iter().map(|o| o.into()).collect(),
entity_models: value.entity_models,
internal_updated_at: value.internal_updated_at,

Check warning on line 275 in crates/torii/grpc/src/types/mod.rs

View check run for this annotation

Codecov / codecov/patch

crates/torii/grpc/src/types/mod.rs#L275

Added line #L275 was not covered by tests
}
}
}
Expand Down
Loading