diff --git a/Cargo.lock b/Cargo.lock index d4ce9980..0ee63e0e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1690,14 +1690,14 @@ dependencies = [ [[package]] name = "ndc-models" -version = "0.1.2" -source = "git+http://github.com/hasura/ndc-spec.git?tag=v0.1.2#6e7d12a31787d5f618099a42ddc0bea786438c00" +version = "0.1.4" +source = "git+http://github.com/hasura/ndc-spec.git?tag=v0.1.4#20172e3b2552b78d16dbafcd047f559ced420309" dependencies = [ "indexmap 2.2.5", "schemars", "serde", "serde_json", - "serde_with 2.3.3", + "serde_with 3.7.0", ] [[package]] @@ -1720,8 +1720,8 @@ dependencies = [ [[package]] name = "ndc-sdk" -version = "0.1.0" -source = "git+https://github.com/hasura/ndc-sdk-rs.git#a273a01efccfc71ef3341cf5f357b2c9ae2d109f" +version = "0.1.4" +source = "git+https://github.com/hasura/ndc-sdk-rs.git?tag=v0.1.4#29adcb5983c1237e8a5f4732d5230c2ba8ab75d3" dependencies = [ "async-trait", "axum", @@ -1753,8 +1753,8 @@ dependencies = [ [[package]] name = "ndc-test" -version = "0.1.2" -source = "git+http://github.com/hasura/ndc-spec.git?tag=v0.1.2#6e7d12a31787d5f618099a42ddc0bea786438c00" +version = "0.1.4" +source = "git+http://github.com/hasura/ndc-spec.git?tag=v0.1.4#20172e3b2552b78d16dbafcd047f559ced420309" dependencies = [ "async-trait", "clap", @@ -2785,22 +2785,6 @@ dependencies = [ "serde_with_macros 1.5.2", ] -[[package]] -name = "serde_with" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07ff71d2c147a7b57362cead5e22f772cd52f6ab31cfcd9edcd7f6aeb2a0afbe" -dependencies = [ - "base64 0.13.1", - "chrono", - "hex", - "indexmap 1.9.3", - "serde", - "serde_json", - "serde_with_macros 2.3.3", - "time", -] - [[package]] name = "serde_with" version = "3.7.0" @@ -2831,18 +2815,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "serde_with_macros" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" -dependencies = [ - "darling 0.20.3", - "proc-macro2", - "quote", - "syn 2.0.52", -] - [[package]] name = "serde_with_macros" version = "3.7.0" diff --git a/Cargo.toml b/Cargo.toml index bb51c4ff..648b7991 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,8 +18,8 @@ resolver = "2" # The tag or rev of ndc-models must match the locked tag or rev of the # ndc-models dependency of ndc-sdk [workspace.dependencies] -ndc-sdk = { git = "https://github.com/hasura/ndc-sdk-rs.git" } -ndc-models = { git = "http://github.com/hasura/ndc-spec.git", tag = "v0.1.2" } +ndc-sdk = { git = "https://github.com/hasura/ndc-sdk-rs.git", tag = "v0.1.4" } +ndc-models = { git = "http://github.com/hasura/ndc-spec.git", tag = "v0.1.4" } indexmap = { version = "2", features = ["serde"] } # should match the version that ndc-models uses itertools = "^0.12.1" diff --git a/crates/cli/src/introspection/mod.rs b/crates/cli/src/introspection/mod.rs index e1fb76d6..b84e8327 100644 --- a/crates/cli/src/introspection/mod.rs +++ b/crates/cli/src/introspection/mod.rs @@ -4,4 +4,3 @@ pub mod validation_schema; pub use sampling::{sample_schema_from_db, type_from_bson}; pub use validation_schema::get_metadata_from_validation_schema; - diff --git a/crates/cli/src/lib.rs b/crates/cli/src/lib.rs index 46b510a5..1baef324 100644 --- a/crates/cli/src/lib.rs +++ b/crates/cli/src/lib.rs @@ -45,19 +45,28 @@ pub async fn run(command: Command, context: &Context) -> anyhow::Result<()> { /// Update the configuration in the current directory by introspecting the database. async fn update(context: &Context, args: &UpdateArgs) -> anyhow::Result<()> { - let configuration_options = configuration::parse_configuration_options_file(&context.path).await; + let configuration_options = + configuration::parse_configuration_options_file(&context.path).await; // Prefer arguments passed to cli, and fallback to the configuration file let sample_size = match args.sample_size { Some(size) => size, - None => configuration_options.introspection_options.sample_size + None => configuration_options.introspection_options.sample_size, }; let no_validator_schema = match args.no_validator_schema { Some(validator) => validator, - None => configuration_options.introspection_options.no_validator_schema + None => { + configuration_options + .introspection_options + .no_validator_schema + } }; let all_schema_nullable = match args.all_schema_nullable { Some(b) => b, - None => configuration_options.introspection_options.all_schema_nullable + None => { + configuration_options + .introspection_options + .all_schema_nullable + } }; let config_file_changed = configuration::get_config_file_changed(&context.path).await?; diff --git a/crates/configuration/src/schema/mod.rs b/crates/configuration/src/schema/mod.rs index f6524770..d69a658e 100644 --- a/crates/configuration/src/schema/mod.rs +++ b/crates/configuration/src/schema/mod.rs @@ -149,6 +149,7 @@ impl From for ndc_models::ObjectField { ndc_models::ObjectField { description: field.description, r#type: field.r#type.into(), + arguments: BTreeMap::new(), } } } diff --git a/crates/mongodb-agent-common/src/mongodb/mod.rs b/crates/mongodb-agent-common/src/mongodb/mod.rs index f311835e..8931d5db 100644 --- a/crates/mongodb-agent-common/src/mongodb/mod.rs +++ b/crates/mongodb-agent-common/src/mongodb/mod.rs @@ -10,12 +10,8 @@ mod stage; pub mod test_helpers; pub use self::{ - accumulator::Accumulator, - collection::CollectionTrait, - database::DatabaseTrait, - pipeline::Pipeline, - selection::Selection, - stage::Stage, + accumulator::Accumulator, collection::CollectionTrait, database::DatabaseTrait, + pipeline::Pipeline, selection::Selection, stage::Stage, }; // MockCollectionTrait is generated by automock when the test flag is active. diff --git a/crates/mongodb-connector/src/capabilities.rs b/crates/mongodb-connector/src/capabilities.rs index 3319e74e..1129bb8a 100644 --- a/crates/mongodb-connector/src/capabilities.rs +++ b/crates/mongodb-connector/src/capabilities.rs @@ -1,15 +1,21 @@ use ndc_sdk::models::{ - Capabilities, CapabilitiesResponse, LeafCapability, QueryCapabilities, RelationshipCapabilities, + Capabilities, CapabilitiesResponse, LeafCapability, NestedFieldCapabilities, QueryCapabilities, + RelationshipCapabilities, }; pub fn mongo_capabilities_response() -> CapabilitiesResponse { ndc_sdk::models::CapabilitiesResponse { - version: "0.1.2".to_owned(), + version: "0.1.4".to_owned(), capabilities: Capabilities { query: QueryCapabilities { aggregates: Some(LeafCapability {}), variables: Some(LeafCapability {}), explain: Some(LeafCapability {}), + nested_fields: NestedFieldCapabilities { + filter_by: Some(LeafCapability {}), + order_by: Some(LeafCapability {}), + aggregates: None, + }, }, mutation: ndc_sdk::models::MutationCapabilities { transactional: None, diff --git a/crates/mongodb-connector/src/mutation.rs b/crates/mongodb-connector/src/mutation.rs index 74a2bdbf..2b79d51d 100644 --- a/crates/mongodb-connector/src/mutation.rs +++ b/crates/mongodb-connector/src/mutation.rs @@ -145,7 +145,11 @@ fn rewrite_doc( .iter() .map(|(name, field)| { let field_value = match field { - ndc::Field::Column { column, fields } => { + ndc::Field::Column { + column, + fields, + arguments: _, + } => { let orig_value = doc.remove(column).ok_or_else(|| { MutationError::UnprocessableContent(format!( "missing expected field from response: {name}" diff --git a/crates/mongodb-support/src/align.rs b/crates/mongodb-support/src/align.rs index 02de15cb..89ecf741 100644 --- a/crates/mongodb-support/src/align.rs +++ b/crates/mongodb-support/src/align.rs @@ -1,7 +1,13 @@ use indexmap::IndexMap; use std::hash::Hash; -pub fn align(ts: IndexMap, mut us: IndexMap, ft: FT, fu: FU, ftu: FTU) -> IndexMap +pub fn align( + ts: IndexMap, + mut us: IndexMap, + ft: FT, + fu: FU, + ftu: FTU, +) -> IndexMap where K: Hash + Eq, FT: Fn(T) -> V, diff --git a/crates/ndc-query-plan/src/plan_for_query_request/mod.rs b/crates/ndc-query-plan/src/plan_for_query_request/mod.rs index 65a68aca..834b1a5f 100644 --- a/crates/ndc-query-plan/src/plan_for_query_request/mod.rs +++ b/crates/ndc-query-plan/src/plan_for_query_request/mod.rs @@ -137,10 +137,16 @@ fn plan_for_aggregate( aggregate: ndc::Aggregate, ) -> Result> { match aggregate { - ndc::Aggregate::ColumnCount { column, distinct } => { - Ok(plan::Aggregate::ColumnCount { column, distinct }) - } - ndc::Aggregate::SingleColumn { column, function } => { + ndc::Aggregate::ColumnCount { + column, + distinct, + field_path: _, + } => Ok(plan::Aggregate::ColumnCount { column, distinct }), + ndc::Aggregate::SingleColumn { + column, + function, + field_path: _, + } => { let object_type_field_type = find_object_field(collection_object_type, column.as_ref())?; // let column_scalar_type_name = get_scalar_type_name(&object_type_field.r#type)?; @@ -211,9 +217,13 @@ fn plan_for_order_by_element( element: ndc::OrderByElement, ) -> Result> { let target = match element.target { - ndc::OrderByTarget::Column { name, path } => plan::OrderByTarget::Column { + ndc::OrderByTarget::Column { + name, + field_path, + path, + } => plan::OrderByTarget::Column { name: name.clone(), - field_path: Default::default(), // TODO: propagate this after ndc-spec update + field_path, path: plan_for_relationship_path( plan_state, root_collection_object_type, @@ -227,6 +237,7 @@ fn plan_for_order_by_element( column, function, path, + field_path: _, } => { let (plan_path, target_object_type) = plan_for_relationship_path( plan_state, @@ -495,7 +506,11 @@ fn plan_for_comparison_target( target: ndc::ComparisonTarget, ) -> Result> { match target { - ndc::ComparisonTarget::Column { name, path } => { + ndc::ComparisonTarget::Column { + name, + field_path, + path, + } => { let requested_columns = vec![name.clone()]; let (path, target_object_type) = plan_for_relationship_path( plan_state, @@ -507,16 +522,16 @@ fn plan_for_comparison_target( let column_type = find_object_field(&target_object_type, &name)?.clone(); Ok(plan::ComparisonTarget::Column { name, - field_path: Default::default(), // TODO: propagate this after ndc-spec update + field_path, path, column_type, }) } - ndc::ComparisonTarget::RootCollectionColumn { name } => { + ndc::ComparisonTarget::RootCollectionColumn { name, field_path } => { let column_type = find_object_field(root_collection_object_type, &name)?.clone(); Ok(plan::ComparisonTarget::ColumnInScope { name, - field_path: Default::default(), // TODO: propagate this after ndc-spec update + field_path, column_type, scope: plan_state.scope.clone(), }) diff --git a/crates/ndc-query-plan/src/plan_for_query_request/tests.rs b/crates/ndc-query-plan/src/plan_for_query_request/tests.rs index e834b186..a9ac5ad1 100644 --- a/crates/ndc-query-plan/src/plan_for_query_request/tests.rs +++ b/crates/ndc-query-plan/src/plan_for_query_request/tests.rs @@ -55,6 +55,7 @@ fn translates_query_request_relationships() -> Result<(), anyhow::Error> { order_direction: OrderDirection::Asc, target: OrderByTarget::Column { name: "advisor_name".to_owned(), + field_path: None, path: vec![ path_element("school_classes") .predicate(binop( @@ -577,12 +578,14 @@ fn translates_relationships_in_fields_predicates_and_orderings() -> Result<(), a column: "year".into(), function: "Average".into(), path: vec![path_element("author_articles").into()], + field_path: None, }, }, ndc::OrderByElement { order_direction: OrderDirection::Desc, target: OrderByTarget::Column { name: "id".into(), + field_path: None, path: vec![], }, }, diff --git a/crates/ndc-query-plan/src/plan_for_query_request/type_annotated_field.rs b/crates/ndc-query-plan/src/plan_for_query_request/type_annotated_field.rs index fe1b720b..61589ef2 100644 --- a/crates/ndc-query-plan/src/plan_for_query_request/type_annotated_field.rs +++ b/crates/ndc-query-plan/src/plan_for_query_request/type_annotated_field.rs @@ -39,7 +39,11 @@ fn type_annotated_field_helper( path: &[&str], ) -> Result> { let field = match field { - ndc::Field::Column { column, fields } => { + ndc::Field::Column { + column, + fields, + arguments: _, + } => { let column_type = find_object_field(collection_object_type, &column)?; let fields = fields .map(|nested_field| { diff --git a/crates/ndc-test-helpers/src/aggregates.rs b/crates/ndc-test-helpers/src/aggregates.rs index bfa83d41..6579273d 100644 --- a/crates/ndc-test-helpers/src/aggregates.rs +++ b/crates/ndc-test-helpers/src/aggregates.rs @@ -5,7 +5,8 @@ macro_rules! column_aggregate { $name, $crate::ndc_models::Aggregate::SingleColumn { column: $column.to_owned(), - function: $function.to_owned() + function: $function.to_owned(), + field_path: None, }, ) }; @@ -14,10 +15,7 @@ macro_rules! column_aggregate { #[macro_export()] macro_rules! star_count_aggregate { ($name:literal) => { - ( - $name, - $crate::ndc_models::Aggregate::StarCount {}, - ) + ($name, $crate::ndc_models::Aggregate::StarCount {}) }; } @@ -29,6 +27,7 @@ macro_rules! column_count_aggregate { $crate::ndc_models::Aggregate::ColumnCount { column: $column.to_owned(), distinct: $distinct.to_owned(), + field_path: None, }, ) }; diff --git a/crates/ndc-test-helpers/src/comparison_target.rs b/crates/ndc-test-helpers/src/comparison_target.rs index 73586dd4..b8f9533f 100644 --- a/crates/ndc-test-helpers/src/comparison_target.rs +++ b/crates/ndc-test-helpers/src/comparison_target.rs @@ -3,6 +3,7 @@ macro_rules! target { ($column:literal) => { $crate::ndc_models::ComparisonTarget::Column { name: $column.to_owned(), + field_path: None, path: vec![], } }; @@ -16,6 +17,7 @@ macro_rules! target { ($column:literal, relations:$path:expr $(,)?) => { $crate::ndc_models::ComparisonTarget::Column { name: $column.to_owned(), + field_path: None, path: $path.into_iter().map(|x| x.into()).collect(), } }; @@ -37,5 +39,6 @@ where { ndc_models::ComparisonTarget::RootCollectionColumn { name: name.to_string(), + field_path: None, } } diff --git a/crates/ndc-test-helpers/src/field.rs b/crates/ndc-test-helpers/src/field.rs index c5987598..18cee830 100644 --- a/crates/ndc-test-helpers/src/field.rs +++ b/crates/ndc-test-helpers/src/field.rs @@ -5,6 +5,7 @@ macro_rules! field { $name, $crate::ndc_models::Field::Column { column: $name.to_owned(), + arguments: Default::default(), fields: None, }, ) @@ -14,6 +15,7 @@ macro_rules! field { $name, $crate::ndc_models::Field::Column { column: $column_name.to_owned(), + arguments: Default::default(), fields: None, }, ) @@ -23,6 +25,7 @@ macro_rules! field { $name, $crate::ndc_models::Field::Column { column: $column_name.to_owned(), + arguments: Default::default(), fields: Some($fields.into()), }, ) diff --git a/crates/ndc-test-helpers/src/object_type.rs b/crates/ndc-test-helpers/src/object_type.rs index 9950abad..58758525 100644 --- a/crates/ndc-test-helpers/src/object_type.rs +++ b/crates/ndc-test-helpers/src/object_type.rs @@ -1,3 +1,5 @@ +use std::collections::BTreeMap; + use ndc_models::{ObjectField, ObjectType, Type}; pub fn object_type( @@ -12,6 +14,7 @@ pub fn object_type( name.to_string(), ObjectField { description: Default::default(), + arguments: BTreeMap::new(), r#type: field_type.into(), }, )