|
@@ -455,3 +455,48 @@ Void function construct_model():
|
|
|
dict_add(global_models, input(), m)
|
|
|
else:
|
|
|
log("Modelling error: did not understand command " + command)
|
|
|
+
|
|
|
+Element function model_fuse(models : Element):
|
|
|
+ Element new_model
|
|
|
+ Element tagged_model
|
|
|
+ String model_name
|
|
|
+ Element model
|
|
|
+ Element keys
|
|
|
+ String key
|
|
|
+ Element selected_MM
|
|
|
+ String type
|
|
|
+
|
|
|
+ // Read out some data first
|
|
|
+ tagged_model = set_pop(models)
|
|
|
+ set_add(models, tagged_model)
|
|
|
+ model = list_read(tagged_model, 1)
|
|
|
+ selected_MM = model["metamodel"]
|
|
|
+ new_model = instantiate_model(selected_MM)
|
|
|
+
|
|
|
+ models = set_copy(models)
|
|
|
+ while (read_nr_out(models)):
|
|
|
+ tagged_model = set_pop(models)
|
|
|
+ model_name = list_read(tagged_model, 0)
|
|
|
+ model = list_read(tagged_model, 1)
|
|
|
+
|
|
|
+ // Add all elements from 'model', but prepend it with the 'model_name'
|
|
|
+ keys = set_to_list(dict_keys(model["model"]))
|
|
|
+ while (read_nr_out(keys) > 0):
|
|
|
+ key = list_pop(keys, 0)
|
|
|
+ type = reverseKeyLookup(model["metamodel"]["model"], dict_read_node(model["type_mapping"], model["model"][key]))
|
|
|
+
|
|
|
+ if (is_edge(model["model"][key])):
|
|
|
+ String src
|
|
|
+ String dst
|
|
|
+ src = (model_name + "/") + reverseKeyLookup(model["model"], read_edge_src(model["model"][key]))
|
|
|
+ dst = (model_name + "/") + reverseKeyLookup(model["model"], read_edge_dst(model["model"][key]))
|
|
|
+ if (bool_and(dict_in(new_model["model"], src), dict_in(new_model["model"], dst))):
|
|
|
+ instantiate_link(new_model, type, (model_name + "/") + key, (model_name + "/") + src, (model_name + "/") + dst)
|
|
|
+ else:
|
|
|
+ list_append(keys, key)
|
|
|
+ elif (has_value(model["model"][key])):
|
|
|
+ instantiate_value(new_model, type, (model_name + "/") + key, model["model"][key])
|
|
|
+ else:
|
|
|
+ instantiate_node(new_model, type, (model_name + "/") + key)
|
|
|
+
|
|
|
+ return new_model!
|