aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/NodeMetadataFactory.java
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/NodeMetadataFactory.java')
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/NodeMetadataFactory.java89
1 files changed, 89 insertions, 0 deletions
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/NodeMetadataFactory.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/NodeMetadataFactory.java
new file mode 100644
index 00000000..ce0e50c1
--- /dev/null
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/NodeMetadataFactory.java
@@ -0,0 +1,89 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.web.semantics.metadata;
7
8import com.google.inject.Inject;
9import tools.refinery.language.ide.syntaxcoloring.TypeHashProvider;
10import tools.refinery.language.semantics.NodeNameProvider;
11import tools.refinery.language.semantics.ProblemTrace;
12import tools.refinery.store.model.Interpretation;
13import tools.refinery.store.model.Model;
14import tools.refinery.store.reasoning.ReasoningAdapter;
15import tools.refinery.store.reasoning.interpretation.PartialInterpretation;
16import tools.refinery.store.reasoning.literal.Concreteness;
17import tools.refinery.store.reasoning.representation.PartialRelation;
18import tools.refinery.store.reasoning.translator.typehierarchy.InferredType;
19import tools.refinery.store.reasoning.translator.typehierarchy.TypeHierarchyTranslator;
20import tools.refinery.store.representation.TruthValue;
21import tools.refinery.store.tuple.Tuple;
22
23public class NodeMetadataFactory {
24 @Inject
25 private NodeNameProvider nodeNameProvider;
26
27 @Inject
28 private TypeHashProvider typeHashProvider;
29
30 private ProblemTrace problemTrace;
31 private Concreteness concreteness;
32 private Interpretation<InferredType> typeInterpretation;
33 private PartialInterpretation<TruthValue, Boolean> existsInterpretation;
34
35 public void initialize(ProblemTrace problemTrace, Concreteness concreteness, Model model) {
36 this.problemTrace = problemTrace;
37 this.concreteness = concreteness;
38 typeInterpretation = model.getInterpretation(TypeHierarchyTranslator.TYPE_SYMBOL);
39 existsInterpretation = model.getAdapter(ReasoningAdapter.class).getPartialInterpretation(concreteness,
40 ReasoningAdapter.EXISTS_SYMBOL);
41 nodeNameProvider.setProblem(problemTrace.getProblem());
42 }
43
44 public NodeMetadata doCreateMetadata(int nodeId, String name, String simpleName, NodeKind kind) {
45 var type = getType(nodeId);
46 return doCreateMetadata(name, simpleName, type, kind);
47 }
48
49 public NodeMetadata createFreshlyNamedMetadata(int nodeId) {
50 var type = getType(nodeId);
51 var name = getName(type, nodeId);
52 return doCreateMetadata(name, name, type, NodeKind.IMPLICIT);
53 }
54
55 private PartialRelation getType(int nodeId) {
56 var inferredType = typeInterpretation.get(Tuple.of(nodeId));
57 if (inferredType == null) {
58 return null;
59 }
60 return inferredType.candidateType();
61 }
62
63 private String getName(PartialRelation type, int nodeId) {
64 if (concreteness == Concreteness.CANDIDATE && !existsInterpretation.get(Tuple.of(nodeId)).may()) {
65 // Do not increment the node name counter for non-existent nodes in the candidate interpretation.
66 // While non-existent nodes may appear in the partial interpretation, they are never displayed in the
67 // candidate interpretation.
68 return "::" + nodeId;
69 }
70 if (type == null) {
71 return nodeNameProvider.getNextName(null);
72 }
73 var relation = problemTrace.getRelation(type);
74 return nodeNameProvider.getNextName(relation.getName());
75 }
76
77 private NodeMetadata doCreateMetadata(String name, String simpleName, PartialRelation type, NodeKind kind) {
78 var typeHash = getTypeHash(type);
79 return new NodeMetadata(name, simpleName, typeHash, kind);
80 }
81
82 private String getTypeHash(PartialRelation type) {
83 if (type == null) {
84 return null;
85 }
86 var relation = problemTrace.getRelation(type);
87 return typeHashProvider.getTypeHash(relation);
88 }
89}