aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <marussy@mit.bme.hu>2021-10-25 17:34:31 +0200
committerLibravatar GitHub <noreply@github.com>2021-10-25 17:34:31 +0200
commitf8da1d057c78a4318a51d5d63ea53c130ae920f6 (patch)
tree19557ab416042d36debdd964302885ae6265d3b6
parentMerge pull request #5 from OszkarSemerath/main (diff)
parentImproved sonar report (diff)
downloadrefinery-f8da1d057c78a4318a51d5d63ea53c130ae920f6.tar.gz
refinery-f8da1d057c78a4318a51d5d63ea53c130ae920f6.tar.zst
refinery-f8da1d057c78a4318a51d5d63ea53c130ae920f6.zip
Merge pull request #6 from OszkarSemerath/main
QueriableModel code quality improvement
-rw-r--r--store/src/main/java/tools/refinery/store/query/building/PredicateBuilder_string.java107
-rw-r--r--store/src/main/java/tools/refinery/store/query/internal/DNF2PQuery.java21
-rw-r--r--store/src/main/java/tools/refinery/store/query/internal/ModelUpdateListener.java10
-rw-r--r--store/src/main/java/tools/refinery/store/query/internal/QueriableModelImpl.java1
-rw-r--r--store/src/main/java/tools/refinery/store/query/internal/RelationalRuntimeContext.java10
-rw-r--r--store/src/main/java/tools/refinery/store/query/internal/ViewUpdate.java30
-rw-r--r--store/src/main/java/tools/refinery/store/query/internal/ViewUpdateTranslator.java2
-rw-r--r--store/src/main/java/tools/refinery/store/query/view/RelationView.java3
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 @@
1package tools.refinery.store.query.building;
2
3import java.util.ArrayList;
4import java.util.Collections;
5import java.util.HashSet;
6import java.util.List;
7
8import tools.refinery.store.query.view.RelationView;
9
10public 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;
35import tools.refinery.store.query.building.Variable; 35import tools.refinery.store.query.building.Variable;
36 36
37public class DNF2PQuery { 37public 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 @@
1package tools.refinery.store.query.internal; 1package tools.refinery.store.query.internal;
2 2
3import java.util.Arrays;
4import java.util.Objects;
5
3record ViewUpdate (Object[] tuple, boolean isInsertion) { 6record 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);