diff options
8 files changed, 46 insertions, 138 deletions
diff --git a/store/src/main/java/tools/refinery/store/query/building/PredicateBuilder_string.java b/store/src/main/java/tools/refinery/store/query/building/PredicateBuilder_string.java deleted file mode 100644 index b99407a3..00000000 --- a/store/src/main/java/tools/refinery/store/query/building/PredicateBuilder_string.java +++ /dev/null | |||
@@ -1,107 +0,0 @@ | |||
1 | package tools.refinery.store.query.building; | ||
2 | |||
3 | import java.util.ArrayList; | ||
4 | import java.util.Collections; | ||
5 | import java.util.HashSet; | ||
6 | import java.util.List; | ||
7 | |||
8 | import tools.refinery.store.query.view.RelationView; | ||
9 | |||
10 | public class PredicateBuilder_string { | ||
11 | private PredicateBuilder_string() {} | ||
12 | |||
13 | public static PredicateBuild1 predicate(String name) { | ||
14 | return new PredicateBuild1(name); | ||
15 | } | ||
16 | public static class PredicateBuild1 { | ||
17 | private String name; | ||
18 | public PredicateBuild1(String name) { | ||
19 | this.name = name; | ||
20 | } | ||
21 | public PredicateBuild2 parameters(String... parameters) { | ||
22 | return new PredicateBuild2(name, parameters); | ||
23 | } | ||
24 | } | ||
25 | public static class PredicateBuild2 { | ||
26 | private String name; | ||
27 | private String[] parameters; | ||
28 | public PredicateBuild2(String name, String[] parameters) { | ||
29 | this.name = name; | ||
30 | this.parameters = parameters; | ||
31 | } | ||
32 | |||
33 | public PredicateBuild3 clause(DNFAtom...constraints) { | ||
34 | return new PredicateBuild3(name,parameters,List.<DNFAtom[]>of(constraints)); | ||
35 | } | ||
36 | } | ||
37 | public static class PredicateBuild3 { | ||
38 | String name; | ||
39 | String[] parameters; | ||
40 | List<DNFAtom[]> clauses; | ||
41 | public PredicateBuild3(String name, String[] parameters, List<DNFAtom[]> clauses) { | ||
42 | super(); | ||
43 | this.name = name; | ||
44 | this.parameters = parameters; | ||
45 | this.clauses = clauses; | ||
46 | } | ||
47 | |||
48 | public PredicateBuild3 clause(DNFAtom...constraints) { | ||
49 | List<DNFAtom[]> newClauses = new ArrayList<>(); | ||
50 | newClauses.addAll(clauses); | ||
51 | newClauses.add(constraints); | ||
52 | return new PredicateBuild3(name, parameters, newClauses); | ||
53 | } | ||
54 | public DNFPredicate build() { | ||
55 | List<Variable> newParameters = new ArrayList<>(this.parameters.length); | ||
56 | for(int i = 0; i<this.parameters.length; i++) { | ||
57 | newParameters.add(new Variable(parameters[i])); | ||
58 | } | ||
59 | |||
60 | List<DNFAnd> newClauses = new ArrayList<>(this.clauses.size()); | ||
61 | for(DNFAtom[] clause : this.clauses) { | ||
62 | List<DNFAtom> constraints = new ArrayList<>(clause.length); | ||
63 | Collections.addAll(constraints, clause); | ||
64 | newClauses.add(new DNFAnd(new HashSet<>(), constraints)); | ||
65 | } | ||
66 | |||
67 | return new DNFPredicate(name,newParameters,newClauses); | ||
68 | } | ||
69 | } | ||
70 | |||
71 | private static Variable stringToVariable(String name) { | ||
72 | if(name != null) { | ||
73 | return new Variable(name); | ||
74 | } else { | ||
75 | return null; | ||
76 | } | ||
77 | } | ||
78 | private static List<Variable> stringToVariable(String[] names) { | ||
79 | List<Variable> variables = new ArrayList<>(); | ||
80 | for(int i = 0; i<names.length; i++) { | ||
81 | variables.add(stringToVariable(names[i])); | ||
82 | } | ||
83 | return variables; | ||
84 | } | ||
85 | |||
86 | public static EquivalenceAtom cEquals(String v1, String v2) { | ||
87 | return new EquivalenceAtom(true,stringToVariable(v1),stringToVariable(v2)); | ||
88 | } | ||
89 | public static EquivalenceAtom cNotEquals(String v1, String v2) { | ||
90 | return new EquivalenceAtom(false,stringToVariable(v1),stringToVariable(v2)); | ||
91 | } | ||
92 | |||
93 | public static RelationAtom cInRelation(RelationView<?> view, String... variables) { | ||
94 | |||
95 | return new RelationAtom(view, stringToVariable(variables)); | ||
96 | } | ||
97 | |||
98 | public static PredicateAtom cInPredicate(DNFPredicate referred, String... variables) { | ||
99 | return new PredicateAtom(true, false, referred, stringToVariable(variables)); | ||
100 | } | ||
101 | public static PredicateAtom cInTransitivePredicate(DNFPredicate referred, String... variables) { | ||
102 | return new PredicateAtom(true, true, referred, stringToVariable(variables)); | ||
103 | } | ||
104 | public static PredicateAtom cNotInPredicate(DNFPredicate referred, String... variables) { | ||
105 | return new PredicateAtom(false, false, referred, stringToVariable(variables)); | ||
106 | } | ||
107 | } | ||
diff --git a/store/src/main/java/tools/refinery/store/query/internal/DNF2PQuery.java b/store/src/main/java/tools/refinery/store/query/internal/DNF2PQuery.java index c72e0234..bcc03fb4 100644 --- a/store/src/main/java/tools/refinery/store/query/internal/DNF2PQuery.java +++ b/store/src/main/java/tools/refinery/store/query/internal/DNF2PQuery.java | |||
@@ -35,10 +35,9 @@ import tools.refinery.store.query.building.RelationAtom; | |||
35 | import tools.refinery.store.query.building.Variable; | 35 | import tools.refinery.store.query.building.Variable; |
36 | 36 | ||
37 | public class DNF2PQuery { | 37 | public class DNF2PQuery { |
38 | //private static Map<DNFPredicate, SimplePQuery> DNF2PQueryMap = new HashMap<>(); | ||
39 | 38 | ||
40 | public static SimplePQuery translate(DNFPredicate predicate, Map<DNFPredicate, SimplePQuery> DNF2PQueryMap) { | 39 | public static SimplePQuery translate(DNFPredicate predicate, Map<DNFPredicate, SimplePQuery> dnf2PQueryMap) { |
41 | SimplePQuery query = DNF2PQueryMap.get(predicate); | 40 | SimplePQuery query = dnf2PQueryMap.get(predicate); |
42 | if (query != null) { | 41 | if (query != null) { |
43 | return query; | 42 | return query; |
44 | } | 43 | } |
@@ -61,14 +60,14 @@ public class DNF2PQuery { | |||
61 | body.setSymbolicParameters(symbolicParameters); | 60 | body.setSymbolicParameters(symbolicParameters); |
62 | query.addBody(body); | 61 | query.addBody(body); |
63 | for (DNFAtom constraint : clause.getConstraints()) { | 62 | for (DNFAtom constraint : clause.getConstraints()) { |
64 | translateDNFAtom(constraint, body, DNF2PQueryMap); | 63 | translateDNFAtom(constraint, body, dnf2PQueryMap); |
65 | } | 64 | } |
66 | } | 65 | } |
67 | DNF2PQueryMap.put(predicate, query); | 66 | dnf2PQueryMap.put(predicate, query); |
68 | return query; | 67 | return query; |
69 | } | 68 | } |
70 | 69 | ||
71 | private static void translateDNFAtom(DNFAtom constraint, PBody body, Map<DNFPredicate, SimplePQuery> DNF2PQueryMap) { | 70 | private static void translateDNFAtom(DNFAtom constraint, PBody body, Map<DNFPredicate, SimplePQuery> dnf2PQueryMap) { |
72 | if (constraint instanceof EquivalenceAtom equivalence) { | 71 | if (constraint instanceof EquivalenceAtom equivalence) { |
73 | translateEquivalenceAtom(equivalence, body); | 72 | translateEquivalenceAtom(equivalence, body); |
74 | } | 73 | } |
@@ -76,7 +75,7 @@ public class DNF2PQuery { | |||
76 | translateRelationAtom(relation, body); | 75 | translateRelationAtom(relation, body); |
77 | } | 76 | } |
78 | if (constraint instanceof PredicateAtom predicate) { | 77 | if (constraint instanceof PredicateAtom predicate) { |
79 | translatePredicateAtom(predicate, body, DNF2PQueryMap); | 78 | translatePredicateAtom(predicate, body, dnf2PQueryMap); |
80 | } | 79 | } |
81 | } | 80 | } |
82 | 81 | ||
@@ -101,7 +100,7 @@ public class DNF2PQuery { | |||
101 | new TypeConstraint(body, Tuples.flatTupleOf(variables), relation.getView()); | 100 | new TypeConstraint(body, Tuples.flatTupleOf(variables), relation.getView()); |
102 | } | 101 | } |
103 | 102 | ||
104 | private static void translatePredicateAtom(PredicateAtom predicate, PBody body, Map<DNFPredicate, SimplePQuery> DNF2PQueryMap) { | 103 | private static void translatePredicateAtom(PredicateAtom predicate, PBody body, Map<DNFPredicate, SimplePQuery> dnf2PQueryMap) { |
105 | Object[] variables = new Object[predicate.getSubstitution().size()]; | 104 | Object[] variables = new Object[predicate.getSubstitution().size()]; |
106 | for (int i = 0; i < predicate.getSubstitution().size(); i++) { | 105 | for (int i = 0; i < predicate.getSubstitution().size(); i++) { |
107 | variables[i] = body.getOrCreateVariableByName(predicate.getSubstitution().get(i).getName()); | 106 | variables[i] = body.getOrCreateVariableByName(predicate.getSubstitution().get(i).getName()); |
@@ -112,17 +111,17 @@ public class DNF2PQuery { | |||
112 | throw new IllegalArgumentException("Transitive Predicate Atoms must be binary."); | 111 | throw new IllegalArgumentException("Transitive Predicate Atoms must be binary."); |
113 | } | 112 | } |
114 | new BinaryTransitiveClosure(body, Tuples.flatTupleOf(variables), | 113 | new BinaryTransitiveClosure(body, Tuples.flatTupleOf(variables), |
115 | DNF2PQuery.translate(predicate.getReferred(), DNF2PQueryMap)); | 114 | DNF2PQuery.translate(predicate.getReferred(), dnf2PQueryMap)); |
116 | } else { | 115 | } else { |
117 | new PositivePatternCall(body, Tuples.flatTupleOf(variables), | 116 | new PositivePatternCall(body, Tuples.flatTupleOf(variables), |
118 | DNF2PQuery.translate(predicate.getReferred(), DNF2PQueryMap)); | 117 | DNF2PQuery.translate(predicate.getReferred(), dnf2PQueryMap)); |
119 | } | 118 | } |
120 | } else { | 119 | } else { |
121 | if (predicate.isTransitive()) { | 120 | if (predicate.isTransitive()) { |
122 | throw new InputMismatchException("Transitive Predicate Atoms cannot be negative."); | 121 | throw new InputMismatchException("Transitive Predicate Atoms cannot be negative."); |
123 | } else { | 122 | } else { |
124 | new NegativePatternCall(body, Tuples.flatTupleOf(variables), | 123 | new NegativePatternCall(body, Tuples.flatTupleOf(variables), |
125 | DNF2PQuery.translate(predicate.getReferred(), DNF2PQueryMap)); | 124 | DNF2PQuery.translate(predicate.getReferred(), dnf2PQueryMap)); |
126 | } | 125 | } |
127 | } | 126 | } |
128 | } | 127 | } |
diff --git a/store/src/main/java/tools/refinery/store/query/internal/ModelUpdateListener.java b/store/src/main/java/tools/refinery/store/query/internal/ModelUpdateListener.java index c784cb3c..aa80985f 100644 --- a/store/src/main/java/tools/refinery/store/query/internal/ModelUpdateListener.java +++ b/store/src/main/java/tools/refinery/store/query/internal/ModelUpdateListener.java | |||
@@ -35,17 +35,11 @@ public class ModelUpdateListener { | |||
35 | Relation<?> relation = view.getRepresentation(); | 35 | Relation<?> relation = view.getRepresentation(); |
36 | 36 | ||
37 | // 1. register views to relations, if necessary | 37 | // 1. register views to relations, if necessary |
38 | var views = relation2View.get(relation); | 38 | var views = relation2View.computeIfAbsent(relation, x->new HashSet<>()); |
39 | if (views == null) { | ||
40 | views = new HashSet<>(); | ||
41 | relation2View.put(relation, views); | ||
42 | } | ||
43 | views.add(view); | 39 | views.add(view); |
44 | 40 | ||
45 | // 2. register notifier map to views, if necessary | 41 | // 2. register notifier map to views, if necessary |
46 | if (!view2Buffers.containsKey(view)) { | 42 | view2Buffers.computeIfAbsent(view, x->new HashSet<>()); |
47 | view2Buffers.put(view, new HashSet<>()); | ||
48 | } | ||
49 | } | 43 | } |
50 | 44 | ||
51 | boolean containsRelationalView(RelationView<?> relationalKey) { | 45 | boolean containsRelationalView(RelationView<?> relationalKey) { |
diff --git a/store/src/main/java/tools/refinery/store/query/internal/QueriableModelImpl.java b/store/src/main/java/tools/refinery/store/query/internal/QueriableModelImpl.java index f30b947a..0f4d609f 100644 --- a/store/src/main/java/tools/refinery/store/query/internal/QueriableModelImpl.java +++ b/store/src/main/java/tools/refinery/store/query/internal/QueriableModelImpl.java | |||
@@ -174,7 +174,6 @@ public class QueriableModelImpl implements QueriableModel { | |||
174 | } | 174 | } |
175 | @Override | 175 | @Override |
176 | public void flushChanges() { | 176 | public void flushChanges() { |
177 | //this.initEngine(); | ||
178 | this.scope.flush(); | 177 | this.scope.flush(); |
179 | } | 178 | } |
180 | 179 | ||
diff --git a/store/src/main/java/tools/refinery/store/query/internal/RelationalRuntimeContext.java b/store/src/main/java/tools/refinery/store/query/internal/RelationalRuntimeContext.java index d5112128..a186b5dd 100644 --- a/store/src/main/java/tools/refinery/store/query/internal/RelationalRuntimeContext.java +++ b/store/src/main/java/tools/refinery/store/query/internal/RelationalRuntimeContext.java | |||
@@ -70,7 +70,7 @@ public class RelationalRuntimeContext implements IQueryRuntimeContext { | |||
70 | throw new IllegalStateException("Engine tries to index a new key " +key); | 70 | throw new IllegalStateException("Engine tries to index a new key " +key); |
71 | } | 71 | } |
72 | } | 72 | } |
73 | 73 | @SuppressWarnings("squid:S1452") | |
74 | RelationView<?> checkKey(IInputKey key) { | 74 | RelationView<?> checkKey(IInputKey key) { |
75 | if(key instanceof RelationView) { | 75 | if(key instanceof RelationView) { |
76 | RelationView<?> relationViewKey = (RelationView<?>) key; | 76 | RelationView<?> relationViewKey = (RelationView<?>) key; |
@@ -121,14 +121,6 @@ public class RelationalRuntimeContext implements IQueryRuntimeContext { | |||
121 | } | 121 | } |
122 | return true; | 122 | return true; |
123 | } | 123 | } |
124 | // private Object[] toObjectMask(RelationViewKey<?> relationalViewKey, TupleMask seedMask, ITuple seed) { | ||
125 | // final int arity = relationalViewKey.getArity(); | ||
126 | // Object[] result = new Object[arity]; | ||
127 | // for(int i = 0; i<seedMask.indices.length; i++) { | ||
128 | // result[seedMask.indices[i]] = seed.get(i); | ||
129 | // } | ||
130 | // return result; | ||
131 | // } | ||
132 | 124 | ||
133 | @Override | 125 | @Override |
134 | public Iterable<? extends Object> enumerateValues(IInputKey key, TupleMask seedMask, ITuple seed) { | 126 | public Iterable<? extends Object> enumerateValues(IInputKey key, TupleMask seedMask, ITuple seed) { |
diff --git a/store/src/main/java/tools/refinery/store/query/internal/ViewUpdate.java b/store/src/main/java/tools/refinery/store/query/internal/ViewUpdate.java index d4a295f8..7d1a4c05 100644 --- a/store/src/main/java/tools/refinery/store/query/internal/ViewUpdate.java +++ b/store/src/main/java/tools/refinery/store/query/internal/ViewUpdate.java | |||
@@ -1,4 +1,34 @@ | |||
1 | package tools.refinery.store.query.internal; | 1 | package tools.refinery.store.query.internal; |
2 | 2 | ||
3 | import java.util.Arrays; | ||
4 | import java.util.Objects; | ||
5 | |||
3 | record ViewUpdate (Object[] tuple, boolean isInsertion) { | 6 | record ViewUpdate (Object[] tuple, boolean isInsertion) { |
7 | |||
8 | @Override | ||
9 | public int hashCode() { | ||
10 | final int prime = 31; | ||
11 | int result = 1; | ||
12 | result = prime * result + Arrays.deepHashCode(tuple); | ||
13 | result = prime * result + Objects.hash(isInsertion); | ||
14 | return result; | ||
15 | } | ||
16 | |||
17 | @Override | ||
18 | public boolean equals(Object obj) { | ||
19 | if (this == obj) | ||
20 | return true; | ||
21 | if (obj == null) | ||
22 | return false; | ||
23 | if (getClass() != obj.getClass()) | ||
24 | return false; | ||
25 | ViewUpdate other = (ViewUpdate) obj; | ||
26 | return isInsertion == other.isInsertion && Arrays.deepEquals(tuple, other.tuple); | ||
27 | } | ||
28 | |||
29 | @Override | ||
30 | public String toString() { | ||
31 | return "ViewUpdate [" + Arrays.toString(tuple) + "insertion= "+this.isInsertion+"]"; | ||
32 | } | ||
33 | |||
4 | } | 34 | } |
diff --git a/store/src/main/java/tools/refinery/store/query/internal/ViewUpdateTranslator.java b/store/src/main/java/tools/refinery/store/query/internal/ViewUpdateTranslator.java index 4596b9c1..1c210c5f 100644 --- a/store/src/main/java/tools/refinery/store/query/internal/ViewUpdateTranslator.java +++ b/store/src/main/java/tools/refinery/store/query/internal/ViewUpdateTranslator.java | |||
@@ -28,7 +28,7 @@ public class ViewUpdateTranslator<D> { | |||
28 | public Object[] isMatching(Tuple tuple, D value){ | 28 | public Object[] isMatching(Tuple tuple, D value){ |
29 | return isMatching(key.getWrappedKey().transform(tuple, value), filter); | 29 | return isMatching(key.getWrappedKey().transform(tuple, value), filter); |
30 | } | 30 | } |
31 | 31 | @SuppressWarnings("squid:S1168") | |
32 | private Object[] isMatching(Object[] tuple, ITuple filter) { | 32 | private Object[] isMatching(Object[] tuple, ITuple filter) { |
33 | for(int i = 0; i<filter.getSize(); i++) { | 33 | for(int i = 0; i<filter.getSize(); i++) { |
34 | final Object filterObject = filter.get(i); | 34 | final Object filterObject = filter.get(i); |
diff --git a/store/src/main/java/tools/refinery/store/query/view/RelationView.java b/store/src/main/java/tools/refinery/store/query/view/RelationView.java index efe9945f..fd55eed4 100644 --- a/store/src/main/java/tools/refinery/store/query/view/RelationView.java +++ b/store/src/main/java/tools/refinery/store/query/view/RelationView.java | |||
@@ -49,7 +49,8 @@ public abstract class RelationView<D> extends BaseInputKeyWrapper<RelationView<D | |||
49 | protected abstract Object[] forwardMap(Tuple key, D value); | 49 | protected abstract Object[] forwardMap(Tuple key, D value); |
50 | 50 | ||
51 | public abstract boolean get(Model model, Object[] tuple); | 51 | public abstract boolean get(Model model, Object[] tuple); |
52 | 52 | ||
53 | @SuppressWarnings("squid:S1168") | ||
53 | public Object[] transform(Tuple tuple, D value) { | 54 | public Object[] transform(Tuple tuple, D value) { |
54 | if (filter(tuple, value)) { | 55 | if (filter(tuple, value)) { |
55 | return forwardMap(tuple, value); | 56 | return forwardMap(tuple, value); |