Skip to content

Commit dd3cce1

Browse files
authored
Merge pull request #157 from opengisch/fix_suppress_bag_of_catalogue
Discovery of BAGs OF: take into account BAGs OF when no mapping meta attr is present
2 parents 313c2a3 + 5f96cad commit dd3cce1

File tree

11 files changed

+685
-123
lines changed

11 files changed

+685
-123
lines changed

modelbaker/dataobjects/project.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,10 @@ def create(
280280
for layer_name, bag_of_enum in self.bags_of_enum.items():
281281
current_layer = None
282282
for attribute, bag_of_enum_info in bag_of_enum.items():
283+
mapping_type = bag_of_enum_info[5]
284+
if mapping_type is None or mapping_type.lower() != "array":
285+
continue
286+
283287
layer_obj = bag_of_enum_info[0]
284288
cardinality = bag_of_enum_info[1]
285289
domain_table = bag_of_enum_info[2]

modelbaker/dbconnector/db_connector.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ def get_bags_of_info(self):
206206
target_layer_name
207207
cardinality_max
208208
cardinality_min
209+
mapping_type
209210
"""
210211
return []
211212

modelbaker/dbconnector/gpkg_connector.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -625,7 +625,8 @@ def get_bags_of_info(self):
625625
cursor = self.conn.cursor()
626626
cursor.execute(
627627
"""SELECT cprop.tablename as current_layer_name, cprop.columnname as attribute, cprop.setting as target_layer_name,
628-
meta_attrs_cardinality_min.attr_value as cardinality_min, meta_attrs_cardinality_max.attr_value as cardinality_max
628+
meta_attrs_cardinality_min.attr_value as cardinality_min, meta_attrs_cardinality_max.attr_value as cardinality_max,
629+
meta_attrs_array.attr_value as mapping_type
629630
FROM T_ILI2DB_COLUMN_PROP as cprop
630631
LEFT JOIN T_ILI2DB_CLASSNAME as cname
631632
ON cname.sqlname = cprop.tablename
@@ -635,8 +636,8 @@ def get_bags_of_info(self):
635636
ON LOWER(meta_attrs_cardinality_min.ilielement) = LOWER(cname.iliname||'.'||cprop.columnname) AND meta_attrs_cardinality_min.attr_name = 'ili2db.ili.attrCardinalityMin'
636637
LEFT JOIN T_ILI2DB_META_ATTRS as meta_attrs_cardinality_max
637638
ON LOWER(meta_attrs_cardinality_max.ilielement) = LOWER(cname.iliname||'.'||cprop.columnname) AND meta_attrs_cardinality_max.attr_name = 'ili2db.ili.attrCardinalityMax'
638-
WHERE cprop.tag = 'ch.ehi.ili2db.foreignKey' AND meta_attrs_array.attr_value = 'ARRAY'
639-
"""
639+
WHERE cprop.tag = 'ch.ehi.ili2db.foreignKey'
640+
"""
640641
)
641642
bags_of_info = cursor.fetchall()
642643
cursor.close()

modelbaker/dbconnector/pg_connector.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -804,7 +804,8 @@ def get_bags_of_info(self):
804804
cur.execute(
805805
sql.SQL(
806806
"""SELECT cprop.tablename as current_layer_name, cprop.columnname as attribute, cprop.setting as target_layer_name,
807-
meta_attrs_cardinality_min.attr_value as cardinality_min, meta_attrs_cardinality_max.attr_value as cardinality_max
807+
meta_attrs_cardinality_min.attr_value as cardinality_min, meta_attrs_cardinality_max.attr_value as cardinality_max,
808+
meta_attrs_array.attr_value as mapping_type
808809
FROM {schema}.t_ili2db_column_prop as cprop
809810
LEFT JOIN {schema}.t_ili2db_classname as cname
810811
ON cname.sqlname = cprop.tablename
@@ -814,7 +815,7 @@ def get_bags_of_info(self):
814815
ON meta_attrs_cardinality_min.ilielement ILIKE cname.iliname||'.'||cprop.columnname AND meta_attrs_cardinality_min.attr_name = 'ili2db.ili.attrCardinalityMin'
815816
LEFT JOIN {schema}.{t_ili2db_meta_attrs} as meta_attrs_cardinality_max
816817
ON meta_attrs_cardinality_max.ilielement ILIKE cname.iliname||'.'||cprop.columnname AND meta_attrs_cardinality_max.attr_name = 'ili2db.ili.attrCardinalityMax'
817-
WHERE cprop.tag = 'ch.ehi.ili2db.foreignKey' AND meta_attrs_array.attr_value = 'ARRAY'
818+
WHERE cprop.tag = 'ch.ehi.ili2db.foreignKey'
818819
"""
819820
).format(
820821
schema=sql.Identifier(self.schema),

modelbaker/generator/generator.py

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -644,12 +644,13 @@ def relations(self, layers, filter_layer_list=[]):
644644
if record["current_layer_name"] == layer.name:
645645
new_item_list = [
646646
layer,
647-
record["cardinality_min"]
648-
+ ".."
649-
+ record["cardinality_max"],
647+
record["cardinality_min"] + ".." + record["cardinality_max"]
648+
if record["cardinality_min"] and record["cardinality_max"]
649+
else "",
650650
layer_map[record["target_layer_name"]][0],
651651
self._db_connector.tid,
652652
self._db_connector.dispName,
653+
record["mapping_type"],
653654
]
654655
unique_current_layer_name = "{}_{}".format(
655656
record["current_layer_name"], layer.geometry_column
@@ -687,30 +688,38 @@ def suppress_catalogue_reference_layers(available_layers, relations, bags_of_enu
687688

688689
# Remove reference layer if they are not BAG OF
689690
for item in catalogue_items:
690-
is_bag_of = False
691-
for bag_of_layer_k, bag_of_layer_v in bags_of_enum.items():
692-
for bag_of_attr_k, bag_of_data in bag_of_layer_v.items():
693-
if (
694-
item["name"] == bag_of_data[2].name
695-
): # BAG OF's target_layer_name
696-
is_bag_of = True
697-
698-
if is_bag_of:
699-
# It's a BAG OF, leave it, cause users will need it to add data
700-
continue
701-
702-
# The ref has no BAG OF pointing to the item, therefore,
703-
# we'll suppress the ref cause users won't need it to add data.
691+
ref_required = False
704692

705693
# First get the ref pointing to the item
694+
ref_to_item_iliname, ref_to_item = "", ""
706695
for relation in relations:
707696
if relation.referenced_layer.ili_name == item["ili_name"]:
708697
for ref in catalogue_refs:
709698
if relation.referencing_layer.ili_name == ref["ili_name"]:
710699
# We've found the corresponding ref structure
711-
layers_to_remove.append(ref["ili_name"])
700+
ref_to_item_iliname = ref["ili_name"]
701+
ref_to_item = ref["name"]
712702
break
713703

704+
# Check if there is a BAG OF pointing to the item or to the ref
705+
for bag_of_layer_k, bag_of_layer_v in bags_of_enum.items():
706+
for bag_of_attr_k, bag_of_data in bag_of_layer_v.items():
707+
if (
708+
ref_to_item
709+
== bag_of_data[0].name # Ref as origin of a relation
710+
and item["name"]
711+
!= bag_of_data[2].name # that does not point to the item
712+
): # So ref must be pointing to a layer
713+
ref_required = True
714+
715+
if ref_required:
716+
# It's a BAG OF, leave it, cause users will need it to add data
717+
continue
718+
719+
# The ref has no BAG OF pointing to the item, therefore,
720+
# we'll suppress the ref cause users won't need it to add data.
721+
layers_to_remove.append(ref_to_item_iliname)
722+
714723
# Finally, remove the ref layers that we've found are not BAGS OF from the list,
715724
# as well as the relations where they are involved (i.e., referenced/referencing)
716725
for layer_to_remove in layers_to_remove:

pytest.ini

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[pytest]
2+
markers =
3+
bagof: marks tests dealing with BAGs OF
4+
catalogue: marks tests dealing with catalogue

0 commit comments

Comments
 (0)