in cli/src/graphar_cli/importer.py [0:0]
def validate(import_config: ImportConfig):
vertex_types = set()
for vertex in import_config.import_schema.vertices:
if vertex.type in vertex_types:
msg = f"Duplicate vertex type {vertex.type}"
raise ValueError(msg)
vertex_types.add(vertex.type)
prop_names = set()
primary_keys = []
for prop_group in vertex.property_groups:
for prop in prop_group.properties:
if prop.name in prop_names:
msg = f"Duplicate property '{prop.name}' in vertex '{vertex.type}'"
raise ValueError(msg)
prop_names.add(prop.name)
if prop.is_primary:
if len(primary_keys):
msg = (
f"Multiple primary keys '{primary_keys[0]}' and '{prop.name}' "
f"found in vertex '{vertex.type}'"
)
raise ValueError(msg)
primary_keys.append(prop.name)
if prop.nullable:
msg = f"Primary key '{prop.name}' in '{vertex.type}' cannot be nullable"
raise ValueError(msg)
source_values = [value for source in vertex.sources for value in source.columns.values()]
for prop_name in prop_names:
if prop_name not in source_values:
msg = (
f"Property '{prop_name}' in vertex '{vertex.type}' not found in source columns"
)
raise ValueError(msg)
msg = f"Source columns are more than the properties in vertex '{vertex.type}'"
assert len(source_values) == len(prop_names), msg
logger.debug("Validated vertex %s", vertex.type)
edge_types = set()
for edge in import_config.import_schema.edges:
if edge.edge_type in edge_types:
msg = f"Duplicate edge type {edge.type}"
raise ValueError(msg)
edge_types.add(edge.edge_type)
if edge.src_type not in vertex_types:
msg = f"Source vertex type {edge.src_type} not found"
raise ValueError(msg)
if edge.dst_type not in vertex_types:
msg = f"Destination vertex type {edge.dst_type} not found"
raise ValueError(msg)
src_vertex = next(
vertex
for vertex in import_config.import_schema.vertices
if vertex.type == edge.src_type
)
if edge.src_prop not in [
prop.name for prop_group in src_vertex.property_groups for prop in prop_group.properties
]:
msg = (
f"Source property '{edge.src_prop}' "
f"not found in source vertex '{edge.src_type}' "
f"in edge '{edge.edge_type}'"
)
raise ValueError(msg)
dst_vertex = next(
vertex
for vertex in import_config.import_schema.vertices
if vertex.type == edge.dst_type
)
if edge.dst_prop not in [
prop.name for prop_group in dst_vertex.property_groups for prop in prop_group.properties
]:
msg = (
f"Destination property '{edge.dst_prop}' "
f"not found in destination vertex '{edge.dst_type}' "
f"in edge '{edge.edge_type}'"
)
raise ValueError(msg)
prop_names = set()
for prop_group in edge.property_groups:
for prop in prop_group.properties:
if prop.name in prop_names:
msg = f"Duplicate property '{prop.name}' in edge '{edge.edge_type}'"
raise ValueError(msg)
prop_names.add(prop.name)
source_values = [value for source in edge.sources for value in source.columns.values()]
for prop_name in prop_names:
if prop_name not in source_values:
msg = (
f"Property '{prop_name}' in edge "
f"'{edge.dst_prop}_{edge.edge_type}_{edge.edge_type}' "
f"not found in source columns"
)
raise ValueError(msg)
# TODO: Validate source columns
logger.debug("Validated edge %s %s %s", edge.src_type, edge.edge_type, edge.dst_type)