aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/PartialInterpretation2Json.java
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/PartialInterpretation2Json.java')
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/PartialInterpretation2Json.java81
1 files changed, 81 insertions, 0 deletions
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/PartialInterpretation2Json.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/PartialInterpretation2Json.java
new file mode 100644
index 00000000..5d5da8fe
--- /dev/null
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/PartialInterpretation2Json.java
@@ -0,0 +1,81 @@
1/*
2 * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.web.semantics;
7
8import com.google.gson.JsonArray;
9import com.google.gson.JsonObject;
10import com.google.inject.Inject;
11import com.google.inject.Singleton;
12import tools.refinery.language.semantics.model.ModelInitializer;
13import tools.refinery.language.semantics.model.SemanticsUtils;
14import tools.refinery.store.map.Cursor;
15import tools.refinery.store.model.Model;
16import tools.refinery.store.reasoning.ReasoningAdapter;
17import tools.refinery.store.reasoning.literal.Concreteness;
18import tools.refinery.store.reasoning.representation.PartialRelation;
19import tools.refinery.store.reasoning.translator.multiobject.MultiObjectTranslator;
20import tools.refinery.store.tuple.Tuple;
21import tools.refinery.store.util.CancellationToken;
22
23import java.util.TreeMap;
24
25@Singleton
26public class PartialInterpretation2Json {
27 @Inject
28 private SemanticsUtils semanticsUtils;
29
30 public JsonObject getPartialInterpretation(ModelInitializer initializer, Model model, Concreteness concreteness,
31 CancellationToken cancellationToken) {
32 var adapter = model.getAdapter(ReasoningAdapter.class);
33 var json = new JsonObject();
34 for (var entry : initializer.getRelationTrace().entrySet()) {
35 var relation = entry.getKey();
36 var partialSymbol = entry.getValue();
37 var tuples = getTuplesJson(adapter, concreteness, partialSymbol);
38 var name = semanticsUtils.getName(relation).orElse(partialSymbol.name());
39 json.add(name, tuples);
40 cancellationToken.checkCancelled();
41 }
42 json.add("builtin::count", getCountJson(model));
43 return json;
44 }
45
46 private static JsonArray getTuplesJson(ReasoningAdapter adapter, Concreteness concreteness,
47 PartialRelation partialSymbol) {
48 var interpretation = adapter.getPartialInterpretation(concreteness, partialSymbol);
49 var cursor = interpretation.getAll();
50 return getTuplesJson(cursor);
51 }
52
53 private static JsonArray getTuplesJson(Cursor<Tuple, ?> cursor) {
54 var map = new TreeMap<Tuple, Object>();
55 while (cursor.move()) {
56 map.put(cursor.getKey(), cursor.getValue());
57 }
58 var tuples = new JsonArray();
59 for (var entry : map.entrySet()) {
60 tuples.add(toArray(entry.getKey(), entry.getValue()));
61 }
62 return tuples;
63 }
64
65 private static JsonArray toArray(Tuple tuple, Object value) {
66 int arity = tuple.getSize();
67 var json = new JsonArray(arity + 1);
68 for (int i = 0; i < arity; i++) {
69 json.add(tuple.get(i));
70 }
71 json.add(value.toString());
72 return json;
73 }
74
75 private static JsonArray getCountJson(Model model) {
76 var interpretation = model.getInterpretation(MultiObjectTranslator.COUNT_STORAGE);
77 var cursor = interpretation.getAll();
78 return getTuplesJson(cursor);
79
80 }
81}