From 7a310819cbbdd70767a9ed17e1bf84c2add9faed Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Tue, 27 Sep 2022 02:08:44 +0200 Subject: refactor: tuples in QueryableModel --- .../store/query/viatra/ViatraTupleLike.java | 18 ++++++++ .../query/viatra/internal/RawPatternMatcher.java | 48 ++++++++++++++-------- .../query/viatra/internal/RelationalScope.java | 2 +- .../viatra/internal/ViatraQueryableModel.java | 19 +++++---- .../internal/viewupdate/ModelUpdateListener.java | 2 +- .../internal/viewupdate/ViewUpdateBuffer.java | 2 +- .../internal/viewupdate/ViewUpdateTranslator.java | 2 +- 7 files changed, 62 insertions(+), 31 deletions(-) create mode 100644 subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/ViatraTupleLike.java (limited to 'subprojects/store-query-viatra/src/main') diff --git a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/ViatraTupleLike.java b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/ViatraTupleLike.java new file mode 100644 index 00000000..46c28434 --- /dev/null +++ b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/ViatraTupleLike.java @@ -0,0 +1,18 @@ +package tools.refinery.store.query.viatra; + +import org.eclipse.viatra.query.runtime.matchers.tuple.ITuple; +import tools.refinery.store.tuple.Tuple1; +import tools.refinery.store.tuple.TupleLike; + +public record ViatraTupleLike(ITuple wrappedTuple) implements TupleLike { + @Override + public int getSize() { + return wrappedTuple.getSize(); + } + + @Override + public int get(int element) { + var wrappedValue = (Tuple1) wrappedTuple.get(element); + return wrappedValue.value0(); + } +} diff --git a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/RawPatternMatcher.java b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/RawPatternMatcher.java index be348a63..2c488319 100644 --- a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/RawPatternMatcher.java +++ b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/RawPatternMatcher.java @@ -2,8 +2,9 @@ package tools.refinery.store.query.viatra.internal; import org.eclipse.viatra.query.runtime.api.GenericPatternMatcher; import org.eclipse.viatra.query.runtime.api.GenericQuerySpecification; -import org.eclipse.viatra.query.runtime.matchers.tuple.AbstractTuple; -import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; +import tools.refinery.store.query.viatra.ViatraTupleLike; +import tools.refinery.store.tuple.Tuple; +import tools.refinery.store.tuple.TupleLike; import java.util.Optional; import java.util.stream.Stream; @@ -13,39 +14,50 @@ public class RawPatternMatcher extends GenericPatternMatcher { public RawPatternMatcher(GenericQuerySpecification specification) { super(specification); - this.empty = new Object[specification.getParameterNames().size()]; + empty = new Object[specification.getParameterNames().size()]; } public boolean hasResult() { - return hasResult(empty); + return backend.hasMatch(empty); } - public boolean hasResult(Object[] parameters) { - return this.backend.hasMatch(parameters); + public boolean hasResult(Tuple parameters) { + return backend.hasMatch(toParametersArray(parameters)); } - public Optional oneResult() { - return oneResult(empty); + public Optional oneResult() { + return backend.getOneArbitraryMatch(empty).map(ViatraTupleLike::new); } - public Optional oneResult(Object[] parameters) { - Optional tuple = this.backend.getOneArbitraryMatch(parameters); - return tuple.map(AbstractTuple::getElements); + public Optional oneResult(Tuple parameters) { + return backend.getOneArbitraryMatch(toParametersArray(parameters)).map(ViatraTupleLike::new); } - public Stream allResults() { - return allResults(empty); + public Stream allResults() { + return backend.getAllMatches(empty).map(ViatraTupleLike::new); } - public Stream allResults(Object[] parameters) { - return this.backend.getAllMatches(parameters).map(AbstractTuple::getElements); + public Stream allResults(Tuple parameters) { + return backend.getAllMatches(toParametersArray(parameters)).map(ViatraTupleLike::new); } public int countResults() { - return countResults(empty); + return backend.countMatches(empty); } - public int countResults(Object[] parameters) { - return backend.countMatches(parameters); + public int countResults(Tuple parameters) { + return backend.countMatches(toParametersArray(parameters)); + } + + private Object[] toParametersArray(Tuple tuple) { + int size = tuple.getSize(); + var array = new Object[tuple.getSize()]; + for (int i = 0; i < size; i++) { + var value = tuple.get(i); + if (value >= 0) { + array[i] = Tuple.of(value); + } + } + return array; } } diff --git a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/RelationalScope.java b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/RelationalScope.java index 8dfa22e0..5ddad67d 100644 --- a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/RelationalScope.java +++ b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/RelationalScope.java @@ -6,7 +6,7 @@ import org.eclipse.viatra.query.runtime.api.scope.IEngineContext; import org.eclipse.viatra.query.runtime.api.scope.IIndexingErrorListener; import org.eclipse.viatra.query.runtime.api.scope.QueryScope; import tools.refinery.store.model.Model; -import tools.refinery.store.model.Tuple; +import tools.refinery.store.tuple.Tuple; import tools.refinery.store.model.representation.Relation; import tools.refinery.store.query.viatra.internal.context.RelationalEngineContext; import tools.refinery.store.query.viatra.internal.viewupdate.ModelUpdateListener; diff --git a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/ViatraQueryableModel.java b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/ViatraQueryableModel.java index 3803702d..1c15e8f9 100644 --- a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/ViatraQueryableModel.java +++ b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/ViatraQueryableModel.java @@ -8,12 +8,13 @@ import tools.refinery.store.map.Cursor; import tools.refinery.store.map.DiffCursor; import tools.refinery.store.model.Model; import tools.refinery.store.model.ModelDiffCursor; -import tools.refinery.store.model.Tuple; import tools.refinery.store.model.representation.DataRepresentation; import tools.refinery.store.model.representation.Relation; import tools.refinery.store.query.QueryableModel; import tools.refinery.store.query.QueryableModelStore; import tools.refinery.store.query.building.DNFPredicate; +import tools.refinery.store.tuple.Tuple; +import tools.refinery.store.tuple.TupleLike; import java.util.HashMap; import java.util.Map; @@ -124,9 +125,9 @@ public class ViatraQueryableModel implements QueryableModel { return result; } - protected void validateParameters(DNFPredicate predicate, Object[] parameters) { + protected void validateParameters(DNFPredicate predicate, Tuple parameters) { int predicateArity = predicate.getVariables().size(); - int parameterArity = parameters.length; + int parameterArity = parameters.getSize(); if (parameterArity != predicateArity) { throw new IllegalArgumentException( "Predicate %s with %d arity called with different number of parameters (%d)" @@ -140,29 +141,29 @@ public class ViatraQueryableModel implements QueryableModel { } @Override - public boolean hasResult(DNFPredicate predicate, Object[] parameters) { + public boolean hasResult(DNFPredicate predicate, Tuple parameters) { validateParameters(predicate, parameters); return getMatcher(predicate).hasResult(parameters); } @Override - public Optional oneResult(DNFPredicate predicate) { + public Optional oneResult(DNFPredicate predicate) { return getMatcher(predicate).oneResult(); } @Override - public Optional oneResult(DNFPredicate predicate, Object[] parameters) { + public Optional oneResult(DNFPredicate predicate, Tuple parameters) { validateParameters(predicate, parameters); return getMatcher(predicate).oneResult(parameters); } @Override - public Stream allResults(DNFPredicate predicate) { + public Stream allResults(DNFPredicate predicate) { return getMatcher(predicate).allResults(); } @Override - public Stream allResults(DNFPredicate predicate, Object[] parameters) { + public Stream allResults(DNFPredicate predicate, Tuple parameters) { validateParameters(predicate, parameters); return getMatcher(predicate).allResults(parameters); } @@ -173,7 +174,7 @@ public class ViatraQueryableModel implements QueryableModel { } @Override - public int countResults(DNFPredicate predicate, Object[] parameters) { + public int countResults(DNFPredicate predicate, Tuple parameters) { validateParameters(predicate, parameters); return getMatcher(predicate).countResults(parameters); diff --git a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/viewupdate/ModelUpdateListener.java b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/viewupdate/ModelUpdateListener.java index 5a0da315..1a2fcee7 100644 --- a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/viewupdate/ModelUpdateListener.java +++ b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/viewupdate/ModelUpdateListener.java @@ -3,7 +3,7 @@ package tools.refinery.store.query.viatra.internal.viewupdate; import org.eclipse.viatra.query.runtime.matchers.context.IInputKey; import org.eclipse.viatra.query.runtime.matchers.context.IQueryRuntimeContextListener; import org.eclipse.viatra.query.runtime.matchers.tuple.ITuple; -import tools.refinery.store.model.Tuple; +import tools.refinery.store.tuple.Tuple; import tools.refinery.store.model.representation.Relation; import tools.refinery.store.query.view.RelationView; diff --git a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/viewupdate/ViewUpdateBuffer.java b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/viewupdate/ViewUpdateBuffer.java index e13a9cb8..49f4c501 100644 --- a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/viewupdate/ViewUpdateBuffer.java +++ b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/viewupdate/ViewUpdateBuffer.java @@ -1,6 +1,6 @@ package tools.refinery.store.query.viatra.internal.viewupdate; -import tools.refinery.store.model.Tuple; +import tools.refinery.store.tuple.Tuple; import java.util.ArrayList; import java.util.Arrays; diff --git a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/viewupdate/ViewUpdateTranslator.java b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/viewupdate/ViewUpdateTranslator.java index 62a10e45..74d0b366 100644 --- a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/viewupdate/ViewUpdateTranslator.java +++ b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/viewupdate/ViewUpdateTranslator.java @@ -4,7 +4,7 @@ import org.eclipse.viatra.query.runtime.matchers.context.IInputKey; import org.eclipse.viatra.query.runtime.matchers.context.IQueryRuntimeContextListener; import org.eclipse.viatra.query.runtime.matchers.tuple.ITuple; import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; -import tools.refinery.store.model.Tuple; +import tools.refinery.store.tuple.Tuple; import tools.refinery.store.query.view.RelationView; import java.util.Objects; -- cgit v1.2.3-70-g09d2