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

JSONSelection refactoring, $variable syntax, and an extensive new README.md #5142

Merged
merged 12 commits into from
May 13, 2024
Merged
Show file tree
Hide file tree
Changes from all 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
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ use crate::sources::connect::federated_query_graph::ConcreteNode;
use crate::sources::connect::federated_query_graph::EnumNode;
use crate::sources::connect::federated_query_graph::ScalarNode;
use crate::sources::connect::federated_query_graph::SourceEnteringEdge;
use crate::sources::connect::json_selection::JSONSelection;
use crate::sources::connect::json_selection::Key;
use crate::sources::connect::json_selection::SubSelection;
use crate::sources::connect::models::Connector;
use crate::sources::connect::selection_parser::Property;
use crate::sources::connect::selection_parser::SubSelection;
use crate::sources::connect::Selection;
use crate::sources::source::federated_query_graph::builder::FederatedQueryGraphBuilderApi;
use crate::sources::source::SourceId;
use crate::ValidFederationSubgraph;
Expand Down Expand Up @@ -106,7 +106,7 @@ impl FederatedQueryGraphBuilderApi for FederatedQueryGraphBuilder {
/// This method creates nodes from selection parameters of a field decorated by
/// a connect directive, making sure to reuse nodes if possible.
fn process_selection(
selection: Selection,
selection: JSONSelection,
field_output_type_pos: TypeDefinitionPosition,
subgraph_schema: &ValidFederationSchema,
builder: &mut impl IntraSourceQueryGraphBuilderApi,
Expand Down Expand Up @@ -137,7 +137,7 @@ fn process_selection(

// If we aren't a custom scalar, then look at the selection to see what to attempt
match selection {
Selection::Path(path) => match field_output_type_pos {
JSONSelection::Path(path) => match field_output_type_pos {
TypeDefinitionPosition::Enum(enum_type) => {
// Create the node for this enum
builder.add_enum_node(
Expand Down Expand Up @@ -179,7 +179,7 @@ fn process_selection(
)
}
},
Selection::Named(sub) => {
JSONSelection::Named(sub) => {
// Make sure that we aren't selecting sub fields from simple types
if field_ty.is_scalar() || field_ty.is_enum() {
return Err(FederationError::internal(
Expand All @@ -206,7 +206,7 @@ fn process_subselection(
subgraph_schema: &ValidFederationSchema,
builder: &mut impl IntraSourceQueryGraphBuilderApi,
node_cache: &mut IndexMap<Name, NodeIndex<u32>>,
properties_path: Option<Vec<Property>>,
properties_path: Option<Vec<Key>>,
) -> Result<NodeIndex<u32>, FederationError> {
// Get the type of the field
let field_ty = field_output_type_pos.get(subgraph_schema.schema())?;
Expand Down Expand Up @@ -669,7 +669,7 @@ mod tests {
use crate::source_aware::federated_query_graph::SelfConditionIndex;
use crate::sources::connect::federated_query_graph::ConcreteFieldEdge;
use crate::sources::connect::federated_query_graph::SourceEnteringEdge;
use crate::sources::connect::selection_parser::Property;
use crate::sources::connect::json_selection::Key;
use crate::sources::connect::ConnectId;
use crate::sources::source;
use crate::sources::source::SourceId;
Expand All @@ -690,7 +690,7 @@ mod tests {
/// A mock query edge
struct MockEdge {
field_name: Name,
path: Vec<Property>,
path: Vec<Key>,
}
impl Display for MockEdge {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
Expand All @@ -702,13 +702,13 @@ mod tests {
}

// Helper for checking name equality of a property
fn is_name_eq(prop: &Property, other: &str) -> bool {
fn is_name_eq(prop: &Key, other: &str) -> bool {
match prop {
Property::Field(f) => f == other,
Property::Quoted(q) => q == other,
Key::Field(f) => f == other,
Key::Quoted(q) => q == other,

// No string name will be equal to a number
Property::Index(_) => false,
Key::Index(_) => false,
}
}

Expand Down
20 changes: 10 additions & 10 deletions apollo-federation/src/sources/connect/federated_query_graph/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ use crate::schema::position::EnumTypeDefinitionPosition;
use crate::schema::position::ObjectTypeDefinitionPosition;
use crate::schema::position::ScalarTypeDefinitionPosition;
use crate::schema::ObjectFieldDefinitionPosition;
use crate::sources::connect::selection_parser::PathSelection;
use crate::sources::connect::selection_parser::Property;
use crate::sources::connect::Selection;
use crate::sources::connect::SubSelection;
use crate::sources::connect::json_selection::JSONSelection;
use crate::sources::connect::json_selection::Key;
use crate::sources::connect::json_selection::PathSelection;
use crate::sources::connect::json_selection::SubSelection;
use crate::sources::source;
use crate::sources::source::federated_query_graph::FederatedQueryGraphApi;
use crate::sources::source::SourceId;
Expand Down Expand Up @@ -42,7 +42,7 @@ pub(crate) enum ConcreteNode {
},
SelectionRoot {
subgraph_type: ObjectTypeDefinitionPosition,
property_path: Vec<Property>,
property_path: Vec<Key>,
},
SelectionChild {
subgraph_type: ObjectTypeDefinitionPosition,
Expand All @@ -53,7 +53,7 @@ pub(crate) enum ConcreteNode {
pub(crate) enum EnumNode {
SelectionRoot {
subgraph_type: EnumTypeDefinitionPosition,
property_path: Vec<Property>,
property_path: Vec<Key>,
},
SelectionChild {
subgraph_type: EnumTypeDefinitionPosition,
Expand All @@ -64,11 +64,11 @@ pub(crate) enum EnumNode {
pub(crate) enum ScalarNode {
SelectionRoot {
subgraph_type: ScalarTypeDefinitionPosition,
property_path: Vec<Property>,
property_path: Vec<Key>,
},
CustomScalarSelectionRoot {
subgraph_type: ScalarTypeDefinitionPosition,
selection: Selection,
selection: JSONSelection,
},
SelectionChild {
subgraph_type: ScalarTypeDefinitionPosition,
Expand All @@ -86,7 +86,7 @@ pub(crate) enum ConcreteFieldEdge {
},
Selection {
subgraph_field: ObjectFieldDefinitionPosition,
property_path: Vec<Property>,
property_path: Vec<Key>,
},
CustomScalarPathSelection {
subgraph_field: ObjectFieldDefinitionPosition,
Expand All @@ -95,7 +95,7 @@ pub(crate) enum ConcreteFieldEdge {
CustomScalarStarSelection {
subgraph_field: ObjectFieldDefinitionPosition,
star_subselection: Option<SubSelection>,
excluded_properties: IndexSet<Property>,
excluded_properties: IndexSet<Key>,
},
}

Expand Down
24 changes: 12 additions & 12 deletions apollo-federation/src/sources/connect/fetch_dependency_graph/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ use crate::source_aware::federated_query_graph::FederatedQueryGraph;
use crate::source_aware::federated_query_graph::SelfConditionIndex;
use crate::source_aware::query_plan::FetchDataPathElement;
use crate::source_aware::query_plan::QueryPlanCost;
use crate::sources::connect::selection_parser::PathSelection;
use crate::sources::connect::selection_parser::Property;
use crate::sources::connect::Selection;
use crate::sources::connect::SubSelection;
use crate::sources::connect::json_selection::JSONSelection;
use crate::sources::connect::json_selection::Key;
use crate::sources::connect::json_selection::PathSelection;
use crate::sources::connect::json_selection::SubSelection;
use crate::sources::source;
use crate::sources::source::fetch_dependency_graph::FetchDependencyGraphApi;
use crate::sources::source::fetch_dependency_graph::PathApi;
Expand Down Expand Up @@ -124,7 +124,7 @@ pub(crate) struct Node {
source_entering_edge: EdgeIndex,
field_response_name: Name,
field_arguments: IndexMap<Name, Value>,
selection: Selection,
selection: JSONSelection,
}

#[derive(Debug)]
Expand All @@ -145,26 +145,26 @@ pub(crate) struct PathField {
#[derive(Debug)]
pub(crate) enum PathSelections {
Selections {
head_property_path: Vec<Property>,
named_selections: Vec<(Name, Vec<Property>)>,
head_property_path: Vec<Key>,
named_selections: Vec<(Name, Vec<Key>)>,
tail_selection: Option<(Name, PathTailSelection)>,
},
CustomScalarRoot {
selection: Selection,
selection: JSONSelection,
},
}

#[derive(Debug)]
pub(crate) enum PathTailSelection {
Selection {
property_path: Vec<Property>,
property_path: Vec<Key>,
},
CustomScalarPathSelection {
path_selection: PathSelection,
},
CustomScalarStarSelection {
star_subselection: Option<SubSelection>,
excluded_properties: IndexSet<Property>,
excluded_properties: IndexSet<Key>,
},
}

Expand Down Expand Up @@ -205,7 +205,7 @@ mod tests {
use crate::sources::connect::federated_query_graph::ConcreteFieldEdge;
use crate::sources::connect::federated_query_graph::ConcreteNode;
use crate::sources::connect::federated_query_graph::SourceEnteringEdge;
use crate::sources::connect::selection_parser::Property;
use crate::sources::connect::json_selection::Key;
use crate::sources::connect::ConnectId;
use crate::sources::source::fetch_dependency_graph::FetchDependencyGraphApi;
use crate::sources::source::SourceId;
Expand Down Expand Up @@ -272,7 +272,7 @@ mod tests {
source_id: source_id.clone(),
source_data: ConcreteNode::SelectionRoot {
subgraph_type: node_type.clone(),
property_path: vec![Property::Field(type_name.to_lowercase().to_string())],
property_path: vec![Key::Field(type_name.to_lowercase().to_string())],
}
.into(),
});
Expand Down
Loading