mirror of
https://github.com/hasura/graphql-engine.git
synced 2024-12-15 01:12:56 +03:00
Include data_connector_type_mappings
along with object_types. (#532)
<!-- Thank you for submitting this PR! :) --> ## Description `data_connector_type_mappings` is a map of data connector information keyed by `CustomTypeName`. We create it when we resolve object types, which are also keyed by `CustomTypeName`, however we pass them around separately and it's not immediately obvious that they are related. This PR stops passing `data_connector_type_mappings` around and instead includes them with the object information. Functional no-op. V3_GIT_ORIGIN_REV_ID: 3ac1341907ea88c11fbc3639adf63140aa702262
This commit is contained in:
parent
0323da8144
commit
b9a29c3e1d
@ -179,7 +179,6 @@ pub(crate) fn resolve_value_expression_for_argument(
|
|||||||
boolean_expressions::ObjectBooleanExpressionType,
|
boolean_expressions::ObjectBooleanExpressionType,
|
||||||
>,
|
>,
|
||||||
data_connectors: &data_connector_scalar_types::DataConnectorsWithScalars,
|
data_connectors: &data_connector_scalar_types::DataConnectorsWithScalars,
|
||||||
data_connector_type_mappings: &data_connector_type_mappings::DataConnectorTypeMappings,
|
|
||||||
) -> Result<ValueExpression, Error> {
|
) -> Result<ValueExpression, Error> {
|
||||||
match value_expression {
|
match value_expression {
|
||||||
open_dds::permissions::ValueExpression::SessionVariable(session_variable) => {
|
open_dds::permissions::ValueExpression::SessionVariable(session_variable) => {
|
||||||
@ -213,9 +212,9 @@ pub(crate) fn resolve_value_expression_for_argument(
|
|||||||
|
|
||||||
// look up this type in the context of it's data connector
|
// look up this type in the context of it's data connector
|
||||||
// so that we use the correct column names for the data source
|
// so that we use the correct column names for the data source
|
||||||
let data_connector_field_mappings = data_connector_type_mappings
|
let data_connector_field_mappings = object_type_representation
|
||||||
|
.type_mappings
|
||||||
.get(
|
.get(
|
||||||
&boolean_expression_type.object_type,
|
|
||||||
&boolean_expression_type.data_connector_name,
|
&boolean_expression_type.data_connector_name,
|
||||||
&boolean_expression_type.data_connector_object_type,
|
&boolean_expression_type.data_connector_object_type,
|
||||||
)
|
)
|
||||||
|
@ -50,7 +50,6 @@ pub enum TypeMappingCollectionError {
|
|||||||
|
|
||||||
pub(crate) fn collect_type_mapping_for_source(
|
pub(crate) fn collect_type_mapping_for_source(
|
||||||
mapping_to_collect: &TypeMappingToCollect,
|
mapping_to_collect: &TypeMappingToCollect,
|
||||||
data_connector_type_mappings: &data_connector_type_mappings::DataConnectorTypeMappings,
|
|
||||||
data_connector_name: &Qualified<DataConnectorName>,
|
data_connector_name: &Qualified<DataConnectorName>,
|
||||||
object_types: &HashMap<Qualified<CustomTypeName>, type_permissions::ObjectTypeWithPermissions>,
|
object_types: &HashMap<Qualified<CustomTypeName>, type_permissions::ObjectTypeWithPermissions>,
|
||||||
scalar_types: &HashMap<Qualified<CustomTypeName>, scalar_types::ScalarTypeRepresentation>,
|
scalar_types: &HashMap<Qualified<CustomTypeName>, scalar_types::ScalarTypeRepresentation>,
|
||||||
@ -59,41 +58,38 @@ pub(crate) fn collect_type_mapping_for_source(
|
|||||||
data_connector_type_mappings::TypeMapping,
|
data_connector_type_mappings::TypeMapping,
|
||||||
>,
|
>,
|
||||||
) -> Result<(), TypeMappingCollectionError> {
|
) -> Result<(), TypeMappingCollectionError> {
|
||||||
let type_mapping = data_connector_type_mappings
|
|
||||||
.get(
|
|
||||||
mapping_to_collect.type_name,
|
|
||||||
data_connector_name,
|
|
||||||
mapping_to_collect.ndc_object_type_name,
|
|
||||||
)
|
|
||||||
.ok_or_else(|| TypeMappingCollectionError::MappingNotDefined {
|
|
||||||
type_name: mapping_to_collect.type_name.clone(),
|
|
||||||
data_connector: data_connector_name.clone(),
|
|
||||||
ndc_type_name: mapping_to_collect.ndc_object_type_name.to_string(),
|
|
||||||
})?;
|
|
||||||
|
|
||||||
// If there is an existing mapping, make sure it maps to the same NDC object type.
|
|
||||||
if let Some(inserted_mapping) =
|
|
||||||
collected_mappings.insert(mapping_to_collect.type_name.clone(), type_mapping.clone())
|
|
||||||
{
|
|
||||||
let data_connector_type_mappings::TypeMapping::Object {
|
|
||||||
ndc_object_type_name,
|
|
||||||
..
|
|
||||||
} = inserted_mapping;
|
|
||||||
if ndc_object_type_name != mapping_to_collect.ndc_object_type_name {
|
|
||||||
return Err(
|
|
||||||
TypeMappingCollectionError::MappingToMultipleDataConnectorObjectType {
|
|
||||||
type_name: mapping_to_collect.type_name.clone(),
|
|
||||||
ndc_type_1: ndc_object_type_name,
|
|
||||||
ndc_type_2: mapping_to_collect.ndc_object_type_name.to_string(),
|
|
||||||
},
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
match object_types.get(mapping_to_collect.type_name) {
|
match object_types.get(mapping_to_collect.type_name) {
|
||||||
Some(object_type_representation) => {
|
Some(object_type_representation) => {
|
||||||
|
let type_mapping = object_type_representation
|
||||||
|
.type_mappings
|
||||||
|
.get(data_connector_name, mapping_to_collect.ndc_object_type_name)
|
||||||
|
.ok_or_else(|| TypeMappingCollectionError::MappingNotDefined {
|
||||||
|
type_name: mapping_to_collect.type_name.clone(),
|
||||||
|
data_connector: data_connector_name.clone(),
|
||||||
|
ndc_type_name: mapping_to_collect.ndc_object_type_name.to_string(),
|
||||||
|
})?;
|
||||||
|
|
||||||
|
// If there is an existing mapping, make sure it maps to the same NDC object type.
|
||||||
|
if let Some(inserted_mapping) = collected_mappings
|
||||||
|
.insert(mapping_to_collect.type_name.clone(), type_mapping.clone())
|
||||||
|
{
|
||||||
|
let data_connector_type_mappings::TypeMapping::Object {
|
||||||
|
ndc_object_type_name,
|
||||||
|
..
|
||||||
|
} = inserted_mapping;
|
||||||
|
if ndc_object_type_name != mapping_to_collect.ndc_object_type_name {
|
||||||
|
return Err(
|
||||||
|
TypeMappingCollectionError::MappingToMultipleDataConnectorObjectType {
|
||||||
|
type_name: mapping_to_collect.type_name.clone(),
|
||||||
|
ndc_type_1: ndc_object_type_name,
|
||||||
|
ndc_type_2: mapping_to_collect.ndc_object_type_name.to_string(),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let data_connector_type_mappings::TypeMapping::Object { field_mappings, .. } =
|
let data_connector_type_mappings::TypeMapping::Object { field_mappings, .. } =
|
||||||
type_mapping;
|
type_mapping;
|
||||||
// For each field in the ObjectType, if that field is using an ObjectType in its type,
|
// For each field in the ObjectType, if that field is using an ObjectType in its type,
|
||||||
@ -122,7 +118,6 @@ pub(crate) fn collect_type_mapping_for_source(
|
|||||||
|
|
||||||
collect_type_mapping_for_source(
|
collect_type_mapping_for_source(
|
||||||
&field_type_mapping_to_collect,
|
&field_type_mapping_to_collect,
|
||||||
data_connector_type_mappings,
|
|
||||||
data_connector_name,
|
data_connector_name,
|
||||||
object_types,
|
object_types,
|
||||||
scalar_types,
|
scalar_types,
|
||||||
|
@ -22,7 +22,6 @@ pub use types::{
|
|||||||
pub fn resolve(
|
pub fn resolve(
|
||||||
metadata_accessor: &open_dds::accessor::MetadataAccessor,
|
metadata_accessor: &open_dds::accessor::MetadataAccessor,
|
||||||
data_connectors: &data_connector_scalar_types::DataConnectorsWithScalars,
|
data_connectors: &data_connector_scalar_types::DataConnectorsWithScalars,
|
||||||
data_connector_type_mappings: &data_connector_type_mappings::DataConnectorTypeMappings,
|
|
||||||
object_types: &HashMap<Qualified<CustomTypeName>, type_permissions::ObjectTypeWithPermissions>,
|
object_types: &HashMap<Qualified<CustomTypeName>, type_permissions::ObjectTypeWithPermissions>,
|
||||||
scalar_types: &HashMap<Qualified<CustomTypeName>, scalar_types::ScalarTypeRepresentation>,
|
scalar_types: &HashMap<Qualified<CustomTypeName>, scalar_types::ScalarTypeRepresentation>,
|
||||||
existing_graphql_types: &HashSet<ast::TypeName>,
|
existing_graphql_types: &HashSet<ast::TypeName>,
|
||||||
@ -40,7 +39,6 @@ pub fn resolve(
|
|||||||
boolean_expression_type,
|
boolean_expression_type,
|
||||||
subgraph,
|
subgraph,
|
||||||
data_connectors,
|
data_connectors,
|
||||||
data_connector_type_mappings,
|
|
||||||
object_types,
|
object_types,
|
||||||
scalar_types,
|
scalar_types,
|
||||||
&mut graphql_types,
|
&mut graphql_types,
|
||||||
@ -68,7 +66,6 @@ pub(crate) fn resolve_boolean_expression_type(
|
|||||||
object_boolean_expression: &open_dds::types::ObjectBooleanExpressionTypeV1,
|
object_boolean_expression: &open_dds::types::ObjectBooleanExpressionTypeV1,
|
||||||
subgraph: &str,
|
subgraph: &str,
|
||||||
data_connectors: &data_connector_scalar_types::DataConnectorsWithScalars,
|
data_connectors: &data_connector_scalar_types::DataConnectorsWithScalars,
|
||||||
data_connector_type_mappings: &data_connector_type_mappings::DataConnectorTypeMappings,
|
|
||||||
object_types: &HashMap<Qualified<CustomTypeName>, type_permissions::ObjectTypeWithPermissions>,
|
object_types: &HashMap<Qualified<CustomTypeName>, type_permissions::ObjectTypeWithPermissions>,
|
||||||
scalar_types: &HashMap<Qualified<CustomTypeName>, scalar_types::ScalarTypeRepresentation>,
|
scalar_types: &HashMap<Qualified<CustomTypeName>, scalar_types::ScalarTypeRepresentation>,
|
||||||
existing_graphql_types: &mut HashSet<ast::TypeName>,
|
existing_graphql_types: &mut HashSet<ast::TypeName>,
|
||||||
@ -94,6 +91,7 @@ pub(crate) fn resolve_boolean_expression_type(
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
let qualified_data_connector_name = Qualified::new(
|
let qualified_data_connector_name = Qualified::new(
|
||||||
subgraph.to_string(),
|
subgraph.to_string(),
|
||||||
object_boolean_expression.data_connector_name.to_owned(),
|
object_boolean_expression.data_connector_name.to_owned(),
|
||||||
@ -130,9 +128,8 @@ pub(crate) fn resolve_boolean_expression_type(
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
data_connector_type_mappings
|
object_type_representation.type_mappings
|
||||||
.get(
|
.get(
|
||||||
&qualified_object_type_name,
|
|
||||||
&qualified_data_connector_name,
|
&qualified_data_connector_name,
|
||||||
&object_boolean_expression.data_connector_object_type,
|
&object_boolean_expression.data_connector_object_type,
|
||||||
)
|
)
|
||||||
@ -207,7 +204,6 @@ pub(crate) fn resolve_boolean_expression_type(
|
|||||||
};
|
};
|
||||||
type_mappings::collect_type_mapping_for_source(
|
type_mappings::collect_type_mapping_for_source(
|
||||||
&type_mapping_to_collect,
|
&type_mapping_to_collect,
|
||||||
data_connector_type_mappings,
|
|
||||||
&qualified_data_connector_name,
|
&qualified_data_connector_name,
|
||||||
object_types,
|
object_types,
|
||||||
scalar_types,
|
scalar_types,
|
||||||
|
@ -7,8 +7,7 @@ use indexmap::IndexMap;
|
|||||||
use open_dds::{commands::CommandName, types::CustomTypeName};
|
use open_dds::{commands::CommandName, types::CustomTypeName};
|
||||||
|
|
||||||
use crate::metadata::resolved::stages::{
|
use crate::metadata::resolved::stages::{
|
||||||
boolean_expressions, commands, data_connector_scalar_types, data_connector_type_mappings,
|
boolean_expressions, commands, data_connector_scalar_types, relationships,
|
||||||
relationships,
|
|
||||||
};
|
};
|
||||||
use crate::metadata::resolved::types::error::Error;
|
use crate::metadata::resolved::types::error::Error;
|
||||||
use crate::metadata::resolved::types::permission::ValueExpression;
|
use crate::metadata::resolved::types::permission::ValueExpression;
|
||||||
@ -45,7 +44,6 @@ pub fn resolve(
|
|||||||
boolean_expressions::ObjectBooleanExpressionType,
|
boolean_expressions::ObjectBooleanExpressionType,
|
||||||
>,
|
>,
|
||||||
data_connectors: &data_connector_scalar_types::DataConnectorsWithScalars,
|
data_connectors: &data_connector_scalar_types::DataConnectorsWithScalars,
|
||||||
data_connector_type_mappings: &data_connector_type_mappings::DataConnectorTypeMappings,
|
|
||||||
) -> Result<IndexMap<Qualified<CommandName>, CommandWithPermissions>, Error> {
|
) -> Result<IndexMap<Qualified<CommandName>, CommandWithPermissions>, Error> {
|
||||||
let mut commands_with_permissions: IndexMap<Qualified<CommandName>, CommandWithPermissions> =
|
let mut commands_with_permissions: IndexMap<Qualified<CommandName>, CommandWithPermissions> =
|
||||||
commands
|
commands
|
||||||
@ -79,7 +77,6 @@ pub fn resolve(
|
|||||||
object_types,
|
object_types,
|
||||||
boolean_expression_types,
|
boolean_expression_types,
|
||||||
data_connectors,
|
data_connectors,
|
||||||
data_connector_type_mappings,
|
|
||||||
subgraph,
|
subgraph,
|
||||||
)?;
|
)?;
|
||||||
} else {
|
} else {
|
||||||
@ -100,7 +97,6 @@ pub fn resolve_command_permissions(
|
|||||||
boolean_expressions::ObjectBooleanExpressionType,
|
boolean_expressions::ObjectBooleanExpressionType,
|
||||||
>,
|
>,
|
||||||
data_connectors: &data_connector_scalar_types::DataConnectorsWithScalars,
|
data_connectors: &data_connector_scalar_types::DataConnectorsWithScalars,
|
||||||
data_connector_type_mappings: &data_connector_type_mappings::DataConnectorTypeMappings,
|
|
||||||
subgraph: &str,
|
subgraph: &str,
|
||||||
) -> Result<HashMap<Role, CommandPermission>, Error> {
|
) -> Result<HashMap<Role, CommandPermission>, Error> {
|
||||||
let mut validated_permissions = HashMap::new();
|
let mut validated_permissions = HashMap::new();
|
||||||
@ -125,7 +121,6 @@ pub fn resolve_command_permissions(
|
|||||||
object_types,
|
object_types,
|
||||||
boolean_expression_types,
|
boolean_expression_types,
|
||||||
data_connectors,
|
data_connectors,
|
||||||
data_connector_type_mappings,
|
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
// additionally typecheck literals
|
// additionally typecheck literals
|
||||||
|
@ -6,8 +6,8 @@ use crate::metadata::resolved::helpers::types::{
|
|||||||
get_type_representation, mk_name, object_type_exists, unwrap_custom_type_name,
|
get_type_representation, mk_name, object_type_exists, unwrap_custom_type_name,
|
||||||
};
|
};
|
||||||
use crate::metadata::resolved::stages::{
|
use crate::metadata::resolved::stages::{
|
||||||
boolean_expressions, data_connector_scalar_types, data_connector_type_mappings,
|
boolean_expressions, data_connector_scalar_types, data_connectors, scalar_types,
|
||||||
data_connectors, scalar_types, type_permissions,
|
type_permissions,
|
||||||
};
|
};
|
||||||
use crate::metadata::resolved::types::error::Error;
|
use crate::metadata::resolved::types::error::Error;
|
||||||
use crate::metadata::resolved::types::subgraph::{
|
use crate::metadata::resolved::types::subgraph::{
|
||||||
@ -28,7 +28,6 @@ use crate::metadata::resolved::helpers::type_mappings;
|
|||||||
pub fn resolve(
|
pub fn resolve(
|
||||||
metadata_accessor: &open_dds::accessor::MetadataAccessor,
|
metadata_accessor: &open_dds::accessor::MetadataAccessor,
|
||||||
data_connectors: &data_connector_scalar_types::DataConnectorsWithScalars,
|
data_connectors: &data_connector_scalar_types::DataConnectorsWithScalars,
|
||||||
data_connector_type_mappings: &data_connector_type_mappings::DataConnectorTypeMappings,
|
|
||||||
object_types: &HashMap<Qualified<CustomTypeName>, type_permissions::ObjectTypeWithPermissions>,
|
object_types: &HashMap<Qualified<CustomTypeName>, type_permissions::ObjectTypeWithPermissions>,
|
||||||
scalar_types: &HashMap<Qualified<CustomTypeName>, scalar_types::ScalarTypeRepresentation>,
|
scalar_types: &HashMap<Qualified<CustomTypeName>, scalar_types::ScalarTypeRepresentation>,
|
||||||
boolean_expression_types: &HashMap<
|
boolean_expression_types: &HashMap<
|
||||||
@ -55,7 +54,6 @@ pub fn resolve(
|
|||||||
&mut resolved_command,
|
&mut resolved_command,
|
||||||
subgraph,
|
subgraph,
|
||||||
data_connectors,
|
data_connectors,
|
||||||
data_connector_type_mappings,
|
|
||||||
object_types,
|
object_types,
|
||||||
scalar_types,
|
scalar_types,
|
||||||
boolean_expression_types,
|
boolean_expression_types,
|
||||||
@ -187,7 +185,6 @@ pub fn resolve_command_source(
|
|||||||
command: &mut Command,
|
command: &mut Command,
|
||||||
subgraph: &str,
|
subgraph: &str,
|
||||||
data_connectors: &data_connector_scalar_types::DataConnectorsWithScalars,
|
data_connectors: &data_connector_scalar_types::DataConnectorsWithScalars,
|
||||||
data_connector_type_mappings: &data_connector_type_mappings::DataConnectorTypeMappings,
|
|
||||||
object_types: &HashMap<Qualified<CustomTypeName>, type_permissions::ObjectTypeWithPermissions>,
|
object_types: &HashMap<Qualified<CustomTypeName>, type_permissions::ObjectTypeWithPermissions>,
|
||||||
scalar_types: &HashMap<Qualified<CustomTypeName>, scalar_types::ScalarTypeRepresentation>,
|
scalar_types: &HashMap<Qualified<CustomTypeName>, scalar_types::ScalarTypeRepresentation>,
|
||||||
boolean_expression_types: &HashMap<
|
boolean_expression_types: &HashMap<
|
||||||
@ -312,7 +309,6 @@ pub fn resolve_command_source(
|
|||||||
{
|
{
|
||||||
type_mappings::collect_type_mapping_for_source(
|
type_mappings::collect_type_mapping_for_source(
|
||||||
type_mapping_to_collect,
|
type_mapping_to_collect,
|
||||||
data_connector_type_mappings,
|
|
||||||
&qualified_data_connector_name,
|
&qualified_data_connector_name,
|
||||||
object_types,
|
object_types,
|
||||||
scalar_types,
|
scalar_types,
|
||||||
|
@ -2,9 +2,9 @@ use std::collections::{BTreeMap, HashMap, HashSet};
|
|||||||
pub mod types;
|
pub mod types;
|
||||||
use open_dds::types::CustomTypeName;
|
use open_dds::types::CustomTypeName;
|
||||||
pub use types::{
|
pub use types::{
|
||||||
DataConnectorTypeMappings, DataConnectorTypeMappingsOutput, FieldDefinition, FieldMapping,
|
DataConnectorTypeMappingsForObject, DataConnectorTypeMappingsOutput, FieldDefinition,
|
||||||
ObjectTypeRepresentation, ResolvedApolloFederationObjectKey,
|
FieldMapping, ObjectTypeRepresentation, ObjectTypeWithTypeMappings,
|
||||||
ResolvedObjectApolloFederationConfig, TypeMapping,
|
ResolvedApolloFederationObjectKey, ResolvedObjectApolloFederationConfig, TypeMapping,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::metadata::resolved::helpers::types::{mk_name, store_new_graphql_type};
|
use crate::metadata::resolved::helpers::types::{mk_name, store_new_graphql_type};
|
||||||
@ -22,7 +22,6 @@ pub(crate) fn resolve(
|
|||||||
metadata_accessor: &open_dds::accessor::MetadataAccessor,
|
metadata_accessor: &open_dds::accessor::MetadataAccessor,
|
||||||
data_connectors: &data_connectors::DataConnectors,
|
data_connectors: &data_connectors::DataConnectors,
|
||||||
) -> Result<DataConnectorTypeMappingsOutput, Error> {
|
) -> Result<DataConnectorTypeMappingsOutput, Error> {
|
||||||
let mut data_connector_type_mappings = DataConnectorTypeMappings::new();
|
|
||||||
let mut object_types = HashMap::new();
|
let mut object_types = HashMap::new();
|
||||||
let mut graphql_types = HashSet::new();
|
let mut graphql_types = HashSet::new();
|
||||||
let mut global_id_enabled_types = HashMap::new();
|
let mut global_id_enabled_types = HashMap::new();
|
||||||
@ -45,6 +44,8 @@ pub(crate) fn resolve(
|
|||||||
&mut apollo_federation_entity_enabled_types,
|
&mut apollo_federation_entity_enabled_types,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
|
let mut type_mappings = DataConnectorTypeMappingsForObject::new();
|
||||||
|
|
||||||
// resolve object types' type mappings
|
// resolve object types' type mappings
|
||||||
for dc_type_mapping in &object_type_definition.data_connector_type_mapping {
|
for dc_type_mapping in &object_type_definition.data_connector_type_mapping {
|
||||||
let qualified_data_connector_name = Qualified::new(
|
let qualified_data_connector_name = Qualified::new(
|
||||||
@ -64,16 +65,23 @@ pub(crate) fn resolve(
|
|||||||
error: type_validation_error,
|
error: type_validation_error,
|
||||||
}
|
}
|
||||||
})?;
|
})?;
|
||||||
data_connector_type_mappings.insert(
|
type_mappings.insert(
|
||||||
&qualified_object_type_name,
|
|
||||||
&qualified_data_connector_name,
|
&qualified_data_connector_name,
|
||||||
&dc_type_mapping.data_connector_object_type,
|
&dc_type_mapping.data_connector_object_type,
|
||||||
type_mapping,
|
type_mapping,
|
||||||
)?;
|
)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let object_type_with_type_mappings = ObjectTypeWithTypeMappings {
|
||||||
|
object_type: resolved_object_type,
|
||||||
|
type_mappings,
|
||||||
|
};
|
||||||
|
|
||||||
if object_types
|
if object_types
|
||||||
.insert(qualified_object_type_name.clone(), resolved_object_type)
|
.insert(
|
||||||
|
qualified_object_type_name.clone(),
|
||||||
|
object_type_with_type_mappings,
|
||||||
|
)
|
||||||
.is_some()
|
.is_some()
|
||||||
{
|
{
|
||||||
return Err(Error::DuplicateTypeDefinition {
|
return Err(Error::DuplicateTypeDefinition {
|
||||||
@ -83,7 +91,6 @@ pub(crate) fn resolve(
|
|||||||
}
|
}
|
||||||
|
|
||||||
Ok(DataConnectorTypeMappingsOutput {
|
Ok(DataConnectorTypeMappingsOutput {
|
||||||
data_connector_type_mappings,
|
|
||||||
object_types,
|
object_types,
|
||||||
graphql_types,
|
graphql_types,
|
||||||
global_id_enabled_types,
|
global_id_enabled_types,
|
||||||
|
@ -13,61 +13,48 @@ use crate::metadata::resolved::types::subgraph::Qualified;
|
|||||||
use lang_graphql::ast::common as ast;
|
use lang_graphql::ast::common as ast;
|
||||||
use open_dds::data_connector::DataConnectorName;
|
use open_dds::data_connector::DataConnectorName;
|
||||||
|
|
||||||
pub type DataConnectorTypeMappingsForObjectType =
|
#[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq)]
|
||||||
HashMap<Qualified<DataConnectorName>, HashMap<String, TypeMapping>>;
|
pub struct DataConnectorTypeMappingsForObject(
|
||||||
|
HashMap<Qualified<DataConnectorName>, HashMap<String, TypeMapping>>,
|
||||||
#[derive(Debug)]
|
|
||||||
pub struct DataConnectorTypeMappings(
|
|
||||||
HashMap<Qualified<CustomTypeName>, DataConnectorTypeMappingsForObjectType>,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
impl Default for DataConnectorTypeMappings {
|
impl Default for DataConnectorTypeMappingsForObject {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self::new()
|
Self::new()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DataConnectorTypeMappings {
|
impl DataConnectorTypeMappingsForObject {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
Self(HashMap::new())
|
Self(HashMap::new())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get(
|
pub fn get(
|
||||||
&self,
|
&self,
|
||||||
object_type_name: &Qualified<CustomTypeName>,
|
|
||||||
data_connector_name: &Qualified<DataConnectorName>,
|
data_connector_name: &Qualified<DataConnectorName>,
|
||||||
data_connector_object_type: &str,
|
data_connector_object_type: &str,
|
||||||
) -> Option<&TypeMapping> {
|
) -> Option<&TypeMapping> {
|
||||||
self.0
|
self.0
|
||||||
.get(object_type_name)
|
.get(data_connector_name)
|
||||||
.and_then(|connectors| {
|
.and_then(|data_connector_object_types| {
|
||||||
connectors
|
data_connector_object_types.get(data_connector_object_type)
|
||||||
.get(data_connector_name)
|
|
||||||
.map(|data_connector_object_types| {
|
|
||||||
data_connector_object_types.get(data_connector_object_type)
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
.flatten()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn insert(
|
pub fn insert(
|
||||||
&mut self,
|
&mut self,
|
||||||
object_type_name: &Qualified<CustomTypeName>,
|
|
||||||
data_connector_name: &Qualified<DataConnectorName>,
|
data_connector_name: &Qualified<DataConnectorName>,
|
||||||
data_connector_object_type: &str,
|
data_connector_object_type: &str,
|
||||||
type_mapping: TypeMapping,
|
type_mapping: TypeMapping,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
if self
|
if self
|
||||||
.0
|
.0
|
||||||
.entry(object_type_name.clone())
|
|
||||||
.or_default()
|
|
||||||
.entry(data_connector_name.clone())
|
.entry(data_connector_name.clone())
|
||||||
.or_default()
|
.or_default()
|
||||||
.insert(data_connector_object_type.to_string(), type_mapping)
|
.insert(data_connector_object_type.to_string(), type_mapping)
|
||||||
.is_some()
|
.is_some()
|
||||||
{
|
{
|
||||||
return Err(Error::DuplicateDataConnectorTypeMapping {
|
return Err(Error::DuplicateDataConnectorObjectTypeMapping {
|
||||||
type_name: object_type_name.clone(),
|
|
||||||
data_connector: data_connector_name.clone(),
|
data_connector: data_connector_name.clone(),
|
||||||
data_connector_object_type: data_connector_object_type.to_string(),
|
data_connector_object_type: data_connector_object_type.to_string(),
|
||||||
});
|
});
|
||||||
@ -82,8 +69,7 @@ pub struct DataConnectorTypeMappingsOutput {
|
|||||||
pub global_id_enabled_types: HashMap<Qualified<CustomTypeName>, Vec<Qualified<ModelName>>>,
|
pub global_id_enabled_types: HashMap<Qualified<CustomTypeName>, Vec<Qualified<ModelName>>>,
|
||||||
pub apollo_federation_entity_enabled_types:
|
pub apollo_federation_entity_enabled_types:
|
||||||
HashMap<Qualified<CustomTypeName>, Option<Qualified<open_dds::models::ModelName>>>,
|
HashMap<Qualified<CustomTypeName>, Option<Qualified<open_dds::models::ModelName>>>,
|
||||||
pub data_connector_type_mappings: DataConnectorTypeMappings,
|
pub object_types: HashMap<Qualified<CustomTypeName>, ObjectTypeWithTypeMappings>,
|
||||||
pub object_types: HashMap<Qualified<CustomTypeName>, ObjectTypeRepresentation>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, derive_more::Display)]
|
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, derive_more::Display)]
|
||||||
@ -98,6 +84,11 @@ pub struct ObjectTypeRepresentation {
|
|||||||
// TODO: add graphql_output_type_kind if we support creating interfaces.
|
// TODO: add graphql_output_type_kind if we support creating interfaces.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct ObjectTypeWithTypeMappings {
|
||||||
|
pub object_type: ObjectTypeRepresentation,
|
||||||
|
pub type_mappings: DataConnectorTypeMappingsForObject,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
|
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
|
||||||
pub struct FieldDefinition {
|
pub struct FieldDefinition {
|
||||||
pub field_type: QualifiedTypeReference,
|
pub field_type: QualifiedTypeReference,
|
||||||
|
@ -32,7 +32,6 @@ pub fn resolve(metadata: open_dds::Metadata) -> Result<Metadata, Error> {
|
|||||||
let data_connectors = data_connectors::resolve(&metadata_accessor)?;
|
let data_connectors = data_connectors::resolve(&metadata_accessor)?;
|
||||||
|
|
||||||
let data_connector_type_mappings::DataConnectorTypeMappingsOutput {
|
let data_connector_type_mappings::DataConnectorTypeMappingsOutput {
|
||||||
data_connector_type_mappings,
|
|
||||||
graphql_types,
|
graphql_types,
|
||||||
global_id_enabled_types,
|
global_id_enabled_types,
|
||||||
apollo_federation_entity_enabled_types,
|
apollo_federation_entity_enabled_types,
|
||||||
@ -63,7 +62,6 @@ pub fn resolve(metadata: open_dds::Metadata) -> Result<Metadata, Error> {
|
|||||||
} = boolean_expressions::resolve(
|
} = boolean_expressions::resolve(
|
||||||
&metadata_accessor,
|
&metadata_accessor,
|
||||||
&data_connectors,
|
&data_connectors,
|
||||||
&data_connector_type_mappings,
|
|
||||||
&object_types_with_permissions,
|
&object_types_with_permissions,
|
||||||
&scalar_types,
|
&scalar_types,
|
||||||
&graphql_types,
|
&graphql_types,
|
||||||
@ -78,7 +76,6 @@ pub fn resolve(metadata: open_dds::Metadata) -> Result<Metadata, Error> {
|
|||||||
} = models::resolve(
|
} = models::resolve(
|
||||||
&metadata_accessor,
|
&metadata_accessor,
|
||||||
&data_connectors,
|
&data_connectors,
|
||||||
&data_connector_type_mappings,
|
|
||||||
&graphql_types,
|
&graphql_types,
|
||||||
&global_id_enabled_types,
|
&global_id_enabled_types,
|
||||||
&apollo_federation_entity_enabled_types,
|
&apollo_federation_entity_enabled_types,
|
||||||
@ -91,7 +88,6 @@ pub fn resolve(metadata: open_dds::Metadata) -> Result<Metadata, Error> {
|
|||||||
let commands = commands::resolve(
|
let commands = commands::resolve(
|
||||||
&metadata_accessor,
|
&metadata_accessor,
|
||||||
&data_connectors,
|
&data_connectors,
|
||||||
&data_connector_type_mappings,
|
|
||||||
&object_types_with_permissions,
|
&object_types_with_permissions,
|
||||||
&scalar_types,
|
&scalar_types,
|
||||||
&boolean_expression_types,
|
&boolean_expression_types,
|
||||||
@ -116,7 +112,6 @@ pub fn resolve(metadata: open_dds::Metadata) -> Result<Metadata, Error> {
|
|||||||
&object_types_with_relationships,
|
&object_types_with_relationships,
|
||||||
&boolean_expression_types,
|
&boolean_expression_types,
|
||||||
&data_connectors,
|
&data_connectors,
|
||||||
&data_connector_type_mappings,
|
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
let models_with_permissions = model_permissions::resolve(
|
let models_with_permissions = model_permissions::resolve(
|
||||||
@ -125,7 +120,6 @@ pub fn resolve(metadata: open_dds::Metadata) -> Result<Metadata, Error> {
|
|||||||
&object_types_with_relationships,
|
&object_types_with_relationships,
|
||||||
&models,
|
&models,
|
||||||
&boolean_expression_types,
|
&boolean_expression_types,
|
||||||
&data_connector_type_mappings,
|
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
let roles = roles::resolve(
|
let roles = roles::resolve(
|
||||||
|
@ -39,7 +39,6 @@ pub fn resolve(
|
|||||||
Qualified<CustomTypeName>,
|
Qualified<CustomTypeName>,
|
||||||
boolean_expressions::ObjectBooleanExpressionType,
|
boolean_expressions::ObjectBooleanExpressionType,
|
||||||
>,
|
>,
|
||||||
data_connector_type_mappings: &data_connector_type_mappings::DataConnectorTypeMappings,
|
|
||||||
) -> Result<IndexMap<Qualified<ModelName>, ModelWithPermissions>, Error> {
|
) -> Result<IndexMap<Qualified<ModelName>, ModelWithPermissions>, Error> {
|
||||||
let mut models_with_permissions: IndexMap<Qualified<ModelName>, ModelWithPermissions> = models
|
let mut models_with_permissions: IndexMap<Qualified<ModelName>, ModelWithPermissions> = models
|
||||||
.iter()
|
.iter()
|
||||||
@ -78,7 +77,6 @@ pub fn resolve(
|
|||||||
object_types,
|
object_types,
|
||||||
models, // This is required to get the model for the relationship target
|
models, // This is required to get the model for the relationship target
|
||||||
boolean_expression_types,
|
boolean_expression_types,
|
||||||
data_connector_type_mappings,
|
|
||||||
)?);
|
)?);
|
||||||
|
|
||||||
model.select_permissions = select_permissions;
|
model.select_permissions = select_permissions;
|
||||||
@ -506,7 +504,6 @@ pub fn resolve_model_select_permissions(
|
|||||||
Qualified<CustomTypeName>,
|
Qualified<CustomTypeName>,
|
||||||
boolean_expressions::ObjectBooleanExpressionType,
|
boolean_expressions::ObjectBooleanExpressionType,
|
||||||
>,
|
>,
|
||||||
data_connector_type_mappings: &data_connector_type_mappings::DataConnectorTypeMappings,
|
|
||||||
) -> Result<HashMap<Role, SelectPermission>, Error> {
|
) -> Result<HashMap<Role, SelectPermission>, Error> {
|
||||||
let mut validated_permissions = HashMap::new();
|
let mut validated_permissions = HashMap::new();
|
||||||
for model_permission in &model_permissions.permissions {
|
for model_permission in &model_permissions.permissions {
|
||||||
@ -545,7 +542,6 @@ pub fn resolve_model_select_permissions(
|
|||||||
object_types,
|
object_types,
|
||||||
boolean_expression_types,
|
boolean_expression_types,
|
||||||
data_connectors,
|
data_connectors,
|
||||||
data_connector_type_mappings,
|
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
// additionally typecheck literals
|
// additionally typecheck literals
|
||||||
|
@ -38,7 +38,6 @@ use std::iter;
|
|||||||
pub fn resolve(
|
pub fn resolve(
|
||||||
metadata_accessor: &open_dds::accessor::MetadataAccessor,
|
metadata_accessor: &open_dds::accessor::MetadataAccessor,
|
||||||
data_connectors: &data_connector_scalar_types::DataConnectorsWithScalars,
|
data_connectors: &data_connector_scalar_types::DataConnectorsWithScalars,
|
||||||
data_connector_type_mappings: &data_connector_type_mappings::DataConnectorTypeMappings,
|
|
||||||
existing_graphql_types: &HashSet<ast::TypeName>,
|
existing_graphql_types: &HashSet<ast::TypeName>,
|
||||||
global_id_enabled_types: &HashMap<Qualified<CustomTypeName>, Vec<Qualified<ModelName>>>,
|
global_id_enabled_types: &HashMap<Qualified<CustomTypeName>, Vec<Qualified<ModelName>>>,
|
||||||
apollo_federation_entity_enabled_types: &HashMap<
|
apollo_federation_entity_enabled_types: &HashMap<
|
||||||
@ -98,7 +97,6 @@ pub fn resolve(
|
|||||||
data_connectors,
|
data_connectors,
|
||||||
object_types,
|
object_types,
|
||||||
scalar_types,
|
scalar_types,
|
||||||
data_connector_type_mappings,
|
|
||||||
boolean_expression_types,
|
boolean_expression_types,
|
||||||
)?;
|
)?;
|
||||||
}
|
}
|
||||||
@ -574,7 +572,6 @@ fn resolve_model_source(
|
|||||||
data_connectors: &data_connector_scalar_types::DataConnectorsWithScalars,
|
data_connectors: &data_connector_scalar_types::DataConnectorsWithScalars,
|
||||||
object_types: &HashMap<Qualified<CustomTypeName>, type_permissions::ObjectTypeWithPermissions>,
|
object_types: &HashMap<Qualified<CustomTypeName>, type_permissions::ObjectTypeWithPermissions>,
|
||||||
scalar_types: &HashMap<Qualified<CustomTypeName>, scalar_types::ScalarTypeRepresentation>,
|
scalar_types: &HashMap<Qualified<CustomTypeName>, scalar_types::ScalarTypeRepresentation>,
|
||||||
data_connector_type_mappings: &data_connector_type_mappings::DataConnectorTypeMappings,
|
|
||||||
boolean_expression_types: &HashMap<
|
boolean_expression_types: &HashMap<
|
||||||
Qualified<CustomTypeName>,
|
Qualified<CustomTypeName>,
|
||||||
boolean_expressions::ObjectBooleanExpressionType,
|
boolean_expressions::ObjectBooleanExpressionType,
|
||||||
@ -636,7 +633,6 @@ fn resolve_model_source(
|
|||||||
{
|
{
|
||||||
type_mappings::collect_type_mapping_for_source(
|
type_mappings::collect_type_mapping_for_source(
|
||||||
type_mapping_to_collect,
|
type_mapping_to_collect,
|
||||||
data_connector_type_mappings,
|
|
||||||
&qualified_data_connector_name,
|
&qualified_data_connector_name,
|
||||||
object_types,
|
object_types,
|
||||||
scalar_types,
|
scalar_types,
|
||||||
|
@ -43,6 +43,7 @@ pub fn resolve(
|
|||||||
type_output_permissions,
|
type_output_permissions,
|
||||||
type_input_permissions,
|
type_input_permissions,
|
||||||
object_type,
|
object_type,
|
||||||
|
type_mappings,
|
||||||
},
|
},
|
||||||
) in object_types_with_permissions
|
) in object_types_with_permissions
|
||||||
{
|
{
|
||||||
@ -53,6 +54,7 @@ pub fn resolve(
|
|||||||
type_output_permissions: type_output_permissions.clone(),
|
type_output_permissions: type_output_permissions.clone(),
|
||||||
type_input_permissions: type_input_permissions.clone(),
|
type_input_permissions: type_input_permissions.clone(),
|
||||||
relationships: IndexMap::new(),
|
relationships: IndexMap::new(),
|
||||||
|
type_mappings: type_mappings.clone(),
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,8 @@ pub struct ObjectTypeWithRelationships {
|
|||||||
pub type_input_permissions: HashMap<Role, type_permissions::TypeInputPermission>,
|
pub type_input_permissions: HashMap<Role, type_permissions::TypeInputPermission>,
|
||||||
/// any relationships defined on this object
|
/// any relationships defined on this object
|
||||||
pub relationships: IndexMap<ast::Name, Relationship>,
|
pub relationships: IndexMap<ast::Name, Relationship>,
|
||||||
|
/// type mappings for each data connector
|
||||||
|
pub type_mappings: data_connector_type_mappings::DataConnectorTypeMappingsForObject,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
|
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
|
||||||
|
@ -30,6 +30,8 @@ pub struct ObjectTypeWithPermissions {
|
|||||||
/// permissions on this type, when it is used in an input context (e.g. in
|
/// permissions on this type, when it is used in an input context (e.g. in
|
||||||
/// an argument type of Model or Command)
|
/// an argument type of Model or Command)
|
||||||
pub type_input_permissions: HashMap<Role, TypeInputPermission>,
|
pub type_input_permissions: HashMap<Role, TypeInputPermission>,
|
||||||
|
/// type mappings for each data connector
|
||||||
|
pub type_mappings: data_connector_type_mappings::DataConnectorTypeMappingsForObject,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// resolve type permissions
|
/// resolve type permissions
|
||||||
@ -37,7 +39,7 @@ pub fn resolve(
|
|||||||
metadata_accessor: &open_dds::accessor::MetadataAccessor,
|
metadata_accessor: &open_dds::accessor::MetadataAccessor,
|
||||||
object_types: &HashMap<
|
object_types: &HashMap<
|
||||||
Qualified<CustomTypeName>,
|
Qualified<CustomTypeName>,
|
||||||
data_connector_type_mappings::ObjectTypeRepresentation,
|
data_connector_type_mappings::ObjectTypeWithTypeMappings,
|
||||||
>,
|
>,
|
||||||
) -> Result<HashMap<Qualified<CustomTypeName>, ObjectTypeWithPermissions>, Error> {
|
) -> Result<HashMap<Qualified<CustomTypeName>, ObjectTypeWithPermissions>, Error> {
|
||||||
let mut object_types_with_permissions = HashMap::new();
|
let mut object_types_with_permissions = HashMap::new();
|
||||||
@ -45,7 +47,8 @@ pub fn resolve(
|
|||||||
object_types_with_permissions.insert(
|
object_types_with_permissions.insert(
|
||||||
object_type_name.clone(),
|
object_type_name.clone(),
|
||||||
ObjectTypeWithPermissions {
|
ObjectTypeWithPermissions {
|
||||||
object_type: object_type.clone(),
|
object_type: object_type.object_type.clone(),
|
||||||
|
type_mappings: object_type.type_mappings.clone(),
|
||||||
type_input_permissions: HashMap::new(),
|
type_input_permissions: HashMap::new(),
|
||||||
type_output_permissions: HashMap::new(),
|
type_output_permissions: HashMap::new(),
|
||||||
},
|
},
|
||||||
|
@ -33,9 +33,8 @@ pub enum Error {
|
|||||||
type_name: Qualified<CustomTypeName>,
|
type_name: Qualified<CustomTypeName>,
|
||||||
error: TypeMappingValidationError,
|
error: TypeMappingValidationError,
|
||||||
},
|
},
|
||||||
#[error("Multiple mappings have been defined from type {type_name:} to object {data_connector_object_type:} of data connector {data_connector:}")]
|
#[error("Multiple mappings have been defined from object {data_connector_object_type:} of data connector {data_connector:}")]
|
||||||
DuplicateDataConnectorTypeMapping {
|
DuplicateDataConnectorObjectTypeMapping {
|
||||||
type_name: Qualified<CustomTypeName>,
|
|
||||||
data_connector: Qualified<DataConnectorName>,
|
data_connector: Qualified<DataConnectorName>,
|
||||||
data_connector_object_type: String,
|
data_connector_object_type: String,
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user