@@ -964,43 +964,57 @@ def validate_parent_id(table: dict, table_name: str, entity_name: str, check_typ
964964 """
965965 has_errors = False
966966 for entity , attributes in table .items ():
967- if parent_name := attributes .get ("parent_id" ):
967+ if parents := attributes .get ("parent_id" ):
968968 ancestors = []
969- parent_attributes = attributes
970- while (parent_name := parent_attributes .get ("parent_id" )):
971- if parent_name in ancestors :
969+ parents = parents if isinstance (parents , list ) else [parents ]
970+ no_errors = True
971+ next_parents = parents
972+ while next_parents and no_errors :
973+ parents = next_parents
974+ next_parents = []
975+ for parent_name in parents :
976+ ancestors .append (parent_name )
977+ if parent_name in table and (grandparents := table [parent_name ].get ("parent_id" )):
978+ grandparents = grandparents if isinstance (grandparents , list ) else [grandparents ]
979+ for grandparent_name in grandparents :
980+ if grandparent_name in ancestors :
981+ ## Don't print the circular ancestry message if an entity has itself as a parent.
982+ ## This is specifically checked for just below this.
983+ if grandparent_name != entity :
984+ print ("Error: The " + entity_name + ", \" " + entity + "\" , in the \" " + \
985+ table_name + "\" table has a circular ancestry, i.e., somewhere in the lineage a " + \
986+ entity_name + " has a \" parent_id\" to a child in the lineage." , file = sys .stderr )
987+ has_errors = True
988+ no_errors = False
989+ break
990+ next_parents .append (grandparent_name )
991+ if not no_errors :
992+ break
993+
994+ parents = attributes ["parent_id" ]
995+ parents = parents if isinstance (parents , list ) else [parents ]
996+ for parent_name in parents :
997+ if parent_name == entity :
972998 print ("Error: The " + entity_name + ", \" " + entity + "\" , in the \" " + \
973- table_name + "\" table has a circular ancestry, i.e., somewhere in the lineage a " + \
974- entity_name + " has a \" parent_id\" to a child in the lineage." , file = sys .stderr )
999+ table_name + "\" table has itself listed in its parent_id. " + \
1000+ "Records cannot be their own parents." , file = sys .stderr )
1001+ has_errors = True
1002+
1003+ if parent_name not in table :
1004+ print ("Error: The parent " + entity_name + ", \" " + parent_name + \
1005+ "\" , for the " + entity_name + " \" " + entity + \
1006+ "\" in the \" " + table_name + "\" table is not itself in the \" " + \
1007+ table_name + "\" table. " + \
1008+ "Parent entities must be in the table as well." , file = sys .stderr )
1009+ has_errors = True
1010+
1011+ elif check_type and (type_to_check := attributes .get (type_keyword )) and \
1012+ (parent_type := table [parent_name ].get (type_keyword )) and \
1013+ type_to_check != parent_type :
1014+ print ("Error: The " + entity_name + ", \" " + entity + \
1015+ "\" , does not have the same " + type_keyword + " as its parent \" " + \
1016+ parent_name + "\" ." , file = sys .stderr )
9751017 has_errors = True
976- break
977- ancestors .append (parent_name )
978- if not parent_name in table :
979- break
980- parent_attributes = table [parent_name ]
981-
982- parent_name = attributes ["parent_id" ]
983- if parent_name == entity :
984- print ("Error: The " + entity_name + ", \" " + entity + "\" , in the \" " + \
985- table_name + "\" table has itself listed for its parent_id. " + \
986- "Records cannot be their own parents." , file = sys .stderr )
987- has_errors = True
988-
989- if parent_name not in table :
990- print ("Error: The parent " + entity_name + ", \" " + parent_name + \
991- "\" , for the " + entity_name + " \" " + entity + \
992- "\" in the \" " + table_name + "\" table is not itself in the \" " + \
993- table_name + "\" table. " + \
994- "Parent entities must be in the table as well." , file = sys .stderr )
995- has_errors = True
996-
997- elif check_type and (type_to_check := attributes .get (type_keyword )) and \
998- (parent_type := table [parent_name ].get (type_keyword )) and \
999- type_to_check != parent_type :
1000- print ("Error: The " + entity_name + ", \" " + entity + \
1001- "\" , does not have the same " + type_keyword + " as its parent \" " + \
1002- parent_name + "\" ." , file = sys .stderr )
1003- has_errors = True
10041018
10051019 return has_errors
10061020
0 commit comments