aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/store-query/src/main/java
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2023-03-01 02:15:50 +0100
committerLibravatar Kristóf Marussy <kristof@marussy.com>2023-03-01 11:10:39 +0100
commitda5d898b3bad6f55efd6619f0abee0ec8aa1de4b (patch)
treed752bb975189a52aaaa5211e64dec42ea0b152fe /subprojects/store-query/src/main/java
parentchore(deps): bump dependencies (diff)
downloadrefinery-da5d898b3bad6f55efd6619f0abee0ec8aa1de4b.tar.gz
refinery-da5d898b3bad6f55efd6619f0abee0ec8aa1de4b.tar.zst
refinery-da5d898b3bad6f55efd6619f0abee0ec8aa1de4b.zip
refactor: more direct access to VIATRA result set
Accessing VIATRA result sets through IQueryResultProvider requires a lot of indirection, allocations, and locking. We use reflection instead to have direct access to the underlying Indexer instead. Unfortunately, projection to arbitrary tuple masks (with wildcard entries in a tuple) is completely broken in VIATRA when RETE update propagation is delayed. While a new, ad-hoc projection indexer gets added to the RETE net immediately, it is not populated with the projection results until updates are flushed in the query engine. Therefore, when encountering an ad-hoc projection for the first time, the projection results will always be empty (thus usually out of date). While declaring the desired projections ahead of time would be a possible solution, for now, we completely remove ad-hoc projection support. If projections are needed on the ModelQuery level, we should create an API for declaring projections for each registered Dnf.
Diffstat (limited to 'subprojects/store-query/src/main/java')
-rw-r--r--subprojects/store-query/src/main/java/tools/refinery/store/query/EmptyResultSet.java29
-rw-r--r--subprojects/store-query/src/main/java/tools/refinery/store/query/ResultSet.java16
2 files changed, 5 insertions, 40 deletions
diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/EmptyResultSet.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/EmptyResultSet.java
index a01a5a2f..0c2e07d6 100644
--- a/subprojects/store-query/src/main/java/tools/refinery/store/query/EmptyResultSet.java
+++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/EmptyResultSet.java
@@ -1,49 +1,22 @@
1package tools.refinery.store.query; 1package tools.refinery.store.query;
2 2
3import tools.refinery.store.tuple.Tuple;
4import tools.refinery.store.tuple.TupleLike; 3import tools.refinery.store.tuple.TupleLike;
5 4
6import java.util.Optional;
7import java.util.stream.Stream; 5import java.util.stream.Stream;
8 6
9public class EmptyResultSet implements ResultSet { 7public class EmptyResultSet implements ResultSet {
10 @Override 8 @Override
11 public boolean hasResult() { 9 public boolean hasResult(TupleLike parameters) {
12 return false; 10 return false;
13 } 11 }
14 12
15 @Override 13 @Override
16 public boolean hasResult(Tuple parameters) {
17 return false;
18 }
19
20 @Override
21 public Optional<TupleLike> oneResult() {
22 return Optional.empty();
23 }
24
25 @Override
26 public Optional<TupleLike> oneResult(Tuple parameters) {
27 return Optional.empty();
28 }
29
30 @Override
31 public Stream<TupleLike> allResults() { 14 public Stream<TupleLike> allResults() {
32 return Stream.of(); 15 return Stream.of();
33 } 16 }
34 17
35 @Override 18 @Override
36 public Stream<TupleLike> allResults(Tuple parameters) {
37 return Stream.of();
38 }
39
40 @Override
41 public int countResults() { 19 public int countResults() {
42 return 0; 20 return 0;
43 } 21 }
44
45 @Override
46 public int countResults(Tuple parameters) {
47 return 0;
48 }
49} 22}
diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/ResultSet.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/ResultSet.java
index 3542e252..407cf075 100644
--- a/subprojects/store-query/src/main/java/tools/refinery/store/query/ResultSet.java
+++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/ResultSet.java
@@ -1,25 +1,17 @@
1package tools.refinery.store.query; 1package tools.refinery.store.query;
2 2
3import tools.refinery.store.tuple.Tuple;
4import tools.refinery.store.tuple.TupleLike; 3import tools.refinery.store.tuple.TupleLike;
5 4
6import java.util.Optional;
7import java.util.stream.Stream; 5import java.util.stream.Stream;
8 6
9public interface ResultSet { 7public interface ResultSet {
10 boolean hasResult(); 8 default boolean hasResult() {
9 return countResults() > 0;
10 }
11 11
12 boolean hasResult(Tuple parameters); 12 boolean hasResult(TupleLike parameters);
13
14 Optional<TupleLike> oneResult();
15
16 Optional<TupleLike> oneResult(Tuple parameters);
17 13
18 Stream<TupleLike> allResults(); 14 Stream<TupleLike> allResults();
19 15
20 Stream<TupleLike> allResults(Tuple parameters);
21
22 int countResults(); 16 int countResults();
23
24 int countResults(Tuple parameters);
25} 17}