From 7c15c0e6e6a035458bdd89a939aacdf4a207e1cd Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Mon, 10 Apr 2023 19:18:29 +0200 Subject: refactor: rename RelationView to SymbolView * Add NodeFunctionView for symbols that hold function-like (single associated object for each key) relations as integer values for performance. --- .../store/query/ModelQueryStoreAdapter.java | 4 +- .../store/query/view/AbstractFunctionView.java | 116 +++++++++++++++++++++ .../refinery/store/query/view/AnyRelationView.java | 31 ------ .../refinery/store/query/view/AnySymbolView.java | 31 ++++++ .../store/query/view/FilteredRelationView.java | 54 ---------- .../refinery/store/query/view/FilteredView.java | 54 ++++++++++ .../store/query/view/ForbiddenRelationView.java | 21 ---- .../refinery/store/query/view/ForbiddenView.java | 21 ++++ .../store/query/view/FunctionalRelationView.java | 110 ------------------- .../store/query/view/KeyOnlyRelationView.java | 41 -------- .../refinery/store/query/view/KeyOnlyView.java | 41 ++++++++ .../refinery/store/query/view/MayRelationView.java | 21 ---- .../tools/refinery/store/query/view/MayView.java | 21 ++++ .../store/query/view/MustRelationView.java | 21 ---- .../tools/refinery/store/query/view/MustView.java | 21 ++++ .../refinery/store/query/view/RelationView.java | 82 --------------- .../store/query/view/RelationViewImplication.java | 24 ----- .../refinery/store/query/view/SymbolView.java | 82 +++++++++++++++ .../query/view/TuplePreservingRelationView.java | 62 ----------- .../store/query/view/TuplePreservingView.java | 65 ++++++++++++ 20 files changed, 454 insertions(+), 469 deletions(-) create mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/view/AbstractFunctionView.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/view/AnyRelationView.java create mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/view/AnySymbolView.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/view/FilteredRelationView.java create mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/view/FilteredView.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/view/ForbiddenRelationView.java create mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/view/ForbiddenView.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/view/FunctionalRelationView.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/view/KeyOnlyRelationView.java create mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/view/KeyOnlyView.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/view/MayRelationView.java create mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/view/MayView.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/view/MustRelationView.java create mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/view/MustView.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/view/RelationView.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/view/RelationViewImplication.java create mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/view/SymbolView.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/view/TuplePreservingRelationView.java create mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/view/TuplePreservingView.java (limited to 'subprojects/store-query/src/main/java') diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/ModelQueryStoreAdapter.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/ModelQueryStoreAdapter.java index 33318abc..f0a950a6 100644 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/ModelQueryStoreAdapter.java +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/ModelQueryStoreAdapter.java @@ -8,12 +8,12 @@ package tools.refinery.store.query; import tools.refinery.store.adapter.ModelStoreAdapter; import tools.refinery.store.model.Model; import tools.refinery.store.query.dnf.AnyQuery; -import tools.refinery.store.query.view.AnyRelationView; +import tools.refinery.store.query.view.AnySymbolView; import java.util.Collection; public interface ModelQueryStoreAdapter extends ModelStoreAdapter { - Collection getRelationViews(); + Collection getSymbolViews(); Collection getQueries(); diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/AbstractFunctionView.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/AbstractFunctionView.java new file mode 100644 index 00000000..c0aa35bf --- /dev/null +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/AbstractFunctionView.java @@ -0,0 +1,116 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.store.query.view; + +import tools.refinery.store.model.Model; +import tools.refinery.store.query.dnf.FunctionalDependency; +import tools.refinery.store.query.term.NodeSort; +import tools.refinery.store.query.term.Sort; +import tools.refinery.store.representation.Symbol; +import tools.refinery.store.tuple.Tuple; +import tools.refinery.store.tuple.Tuple1; + +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public abstract class AbstractFunctionView extends SymbolView { + private final T defaultValue; + + protected AbstractFunctionView(Symbol symbol, String name) { + super(symbol, name); + defaultValue = symbol.defaultValue(); + } + + @Override + public Set> getFunctionalDependencies() { + var arity = getSymbol().arity(); + var forEach = IntStream.range(0, arity).boxed().collect(Collectors.toUnmodifiableSet()); + var unique = Set.of(arity); + return Set.of(new FunctionalDependency<>(forEach, unique)); + } + + @Override + public Set getImpliedRelationViews() { + var symbol = getSymbol(); + var impliedIndices = IntStream.range(0, symbol.arity()).boxed().toList(); + var keysView = new KeyOnlyView<>(symbol); + return Set.of(new ViewImplication(this, keysView, impliedIndices)); + } + + @Override + public final boolean filter(Tuple key, T value) { + return !Objects.equals(defaultValue, value); + } + + protected abstract Sort getForwardMappedValueSort(); + + protected Object forwardMapValue(Tuple key, T value) { + return value; + } + + protected boolean valueEquals(Tuple key, T value, Object otherForwardMappedValue) { + return Objects.equals(otherForwardMappedValue, forwardMapValue(key, value)); + } + + @Override + public Object[] forwardMap(Tuple key, T value) { + int size = key.getSize(); + Object[] result = new Object[size + 1]; + for (int i = 0; i < size; i++) { + result[i] = Tuple.of(key.get(i)); + } + result[key.getSize()] = forwardMapValue(key, value); + return result; + } + + @Override + public boolean get(Model model, Object[] tuple) { + int[] content = new int[tuple.length - 1]; + for (int i = 0; i < tuple.length - 1; i++) { + if (!(tuple[i] instanceof Tuple1 wrapper)) { + return false; + } + content[i] = wrapper.value0(); + } + Tuple key = Tuple.of(content); + var valueInTuple = tuple[tuple.length - 1]; + T valueInMap = model.getInterpretation(getSymbol()).get(key); + return valueEquals(key, valueInMap, valueInTuple); + } + + @Override + public int arity() { + return getSymbol().arity() + 1; + } + + @Override + public List getSorts() { + var sorts = new Sort[arity()]; + int valueIndex = sorts.length - 1; + for (int i = 0; i < valueIndex; i++) { + sorts[i] = NodeSort.INSTANCE; + } + sorts[valueIndex] = getForwardMappedValueSort(); + return List.of(sorts); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + AbstractFunctionView that = (AbstractFunctionView) o; + return Objects.equals(defaultValue, that.defaultValue); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), defaultValue); + } +} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/AnyRelationView.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/AnyRelationView.java deleted file mode 100644 index 9aa923af..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/AnyRelationView.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.view; - -import tools.refinery.store.model.Model; -import tools.refinery.store.query.dnf.FunctionalDependency; -import tools.refinery.store.representation.AnySymbol; -import tools.refinery.store.query.Constraint; - -import java.util.Set; - -public sealed interface AnyRelationView extends Constraint permits RelationView { - AnySymbol getSymbol(); - - String getViewName(); - - default Set> getFunctionalDependencies() { - return Set.of(); - } - - default Set getImpliedRelationViews() { - return Set.of(); - } - - boolean get(Model model, Object[] tuple); - - Iterable getAll(Model model); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/AnySymbolView.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/AnySymbolView.java new file mode 100644 index 00000000..90b27ebb --- /dev/null +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/AnySymbolView.java @@ -0,0 +1,31 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.store.query.view; + +import tools.refinery.store.model.Model; +import tools.refinery.store.query.dnf.FunctionalDependency; +import tools.refinery.store.representation.AnySymbol; +import tools.refinery.store.query.Constraint; + +import java.util.Set; + +public sealed interface AnySymbolView extends Constraint permits SymbolView { + AnySymbol getSymbol(); + + String getViewName(); + + default Set> getFunctionalDependencies() { + return Set.of(); + } + + default Set getImpliedRelationViews() { + return Set.of(); + } + + boolean get(Model model, Object[] tuple); + + Iterable getAll(Model model); +} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/FilteredRelationView.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/FilteredRelationView.java deleted file mode 100644 index 9717b2c1..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/FilteredRelationView.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.view; - -import tools.refinery.store.tuple.Tuple; -import tools.refinery.store.representation.Symbol; - -import java.util.Objects; -import java.util.function.BiPredicate; -import java.util.function.Predicate; - -public class FilteredRelationView extends TuplePreservingRelationView { - private final BiPredicate predicate; - - public FilteredRelationView(Symbol symbol, String name, BiPredicate predicate) { - super(symbol, name); - this.predicate = predicate; - } - - public FilteredRelationView(Symbol symbol, BiPredicate predicate) { - super(symbol); - this.predicate = predicate; - } - - public FilteredRelationView(Symbol symbol, String name, Predicate predicate) { - this(symbol, name, (k, v) -> predicate.test(v)); - } - - public FilteredRelationView(Symbol symbol, Predicate predicate) { - this(symbol, (k, v) -> predicate.test(v)); - } - - @Override - public boolean filter(Tuple key, T value) { - return this.predicate.test(key, value); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - FilteredRelationView that = (FilteredRelationView) o; - return Objects.equals(predicate, that.predicate); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), predicate); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/FilteredView.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/FilteredView.java new file mode 100644 index 00000000..922c7355 --- /dev/null +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/FilteredView.java @@ -0,0 +1,54 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.store.query.view; + +import tools.refinery.store.tuple.Tuple; +import tools.refinery.store.representation.Symbol; + +import java.util.Objects; +import java.util.function.BiPredicate; +import java.util.function.Predicate; + +public class FilteredView extends TuplePreservingView { + private final BiPredicate predicate; + + public FilteredView(Symbol symbol, String name, BiPredicate predicate) { + super(symbol, name); + this.predicate = predicate; + } + + public FilteredView(Symbol symbol, BiPredicate predicate) { + super(symbol); + this.predicate = predicate; + } + + public FilteredView(Symbol symbol, String name, Predicate predicate) { + this(symbol, name, (k, v) -> predicate.test(v)); + } + + public FilteredView(Symbol symbol, Predicate predicate) { + this(symbol, (k, v) -> predicate.test(v)); + } + + @Override + public boolean filter(Tuple key, T value) { + return this.predicate.test(key, value); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + FilteredView that = (FilteredView) o; + return Objects.equals(predicate, that.predicate); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), predicate); + } +} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/ForbiddenRelationView.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/ForbiddenRelationView.java deleted file mode 100644 index c19d9282..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/ForbiddenRelationView.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.view; - -import tools.refinery.store.representation.Symbol; -import tools.refinery.store.representation.TruthValue; -import tools.refinery.store.tuple.Tuple; - -public class ForbiddenRelationView extends TuplePreservingRelationView { - public ForbiddenRelationView(Symbol symbol) { - super(symbol, "forbidden"); - } - - @Override - public boolean filter(Tuple key, TruthValue value) { - return !value.may(); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/ForbiddenView.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/ForbiddenView.java new file mode 100644 index 00000000..26b717ee --- /dev/null +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/ForbiddenView.java @@ -0,0 +1,21 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.store.query.view; + +import tools.refinery.store.representation.Symbol; +import tools.refinery.store.representation.TruthValue; +import tools.refinery.store.tuple.Tuple; + +public class ForbiddenView extends TuplePreservingView { + public ForbiddenView(Symbol symbol) { + super(symbol, "forbidden"); + } + + @Override + public boolean filter(Tuple key, TruthValue value) { + return !value.may(); + } +} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/FunctionalRelationView.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/FunctionalRelationView.java deleted file mode 100644 index ab48386e..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/FunctionalRelationView.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.view; - -import tools.refinery.store.model.Model; -import tools.refinery.store.query.dnf.FunctionalDependency; -import tools.refinery.store.query.term.DataSort; -import tools.refinery.store.query.term.NodeSort; -import tools.refinery.store.query.term.Sort; -import tools.refinery.store.representation.Symbol; -import tools.refinery.store.tuple.Tuple; -import tools.refinery.store.tuple.Tuple1; - -import java.util.List; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -public final class FunctionalRelationView extends RelationView { - private final T defaultValue; - - public FunctionalRelationView(Symbol symbol, String name) { - super(symbol, name); - defaultValue = symbol.defaultValue(); - } - - public FunctionalRelationView(Symbol symbol) { - super(symbol); - defaultValue = symbol.defaultValue(); - } - - @Override - public Set> getFunctionalDependencies() { - var arity = getSymbol().arity(); - var forEach = IntStream.range(0, arity).boxed().collect(Collectors.toUnmodifiableSet()); - var unique = Set.of(arity); - return Set.of(new FunctionalDependency<>(forEach, unique)); - } - - @Override - public Set getImpliedRelationViews() { - var symbol = getSymbol(); - var impliedIndices = IntStream.range(0, symbol.arity()).boxed().toList(); - var keyOnlyRelationView = new KeyOnlyRelationView<>(symbol); - return Set.of(new RelationViewImplication(this, keyOnlyRelationView, impliedIndices)); - } - - @Override - public boolean filter(Tuple key, T value) { - return !Objects.equals(defaultValue, value); - } - - @Override - public Object[] forwardMap(Tuple key, T value) { - int size = key.getSize(); - Object[] result = new Object[size + 1]; - for (int i = 0; i < size; i++) { - result[i] = Tuple.of(key.get(i)); - } - result[key.getSize()] = value; - return result; - } - - @Override - public boolean get(Model model, Object[] tuple) { - int[] content = new int[tuple.length - 1]; - for (int i = 0; i < tuple.length - 1; i++) { - content[i] = ((Tuple1) tuple[i]).value0(); - } - Tuple key = Tuple.of(content); - @SuppressWarnings("unchecked") - T valueInTuple = (T) tuple[tuple.length - 1]; - T valueInMap = model.getInterpretation(getSymbol()).get(key); - return valueInTuple.equals(valueInMap); - } - - @Override - public int arity() { - return getSymbol().arity() + 1; - } - - @Override - public List getSorts() { - var sorts = new Sort[arity()]; - int valueIndex = sorts.length - 1; - for (int i = 0; i < valueIndex; i++) { - sorts[i] = NodeSort.INSTANCE; - } - sorts[valueIndex] = new DataSort<>(getSymbol().valueType()); - return List.of(sorts); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - FunctionalRelationView that = (FunctionalRelationView) o; - return Objects.equals(defaultValue, that.defaultValue); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), defaultValue); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/KeyOnlyRelationView.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/KeyOnlyRelationView.java deleted file mode 100644 index 9553a0cc..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/KeyOnlyRelationView.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.view; - -import tools.refinery.store.representation.Symbol; -import tools.refinery.store.tuple.Tuple; - -import java.util.Objects; - -public final class KeyOnlyRelationView extends TuplePreservingRelationView { - public static final String VIEW_NAME = "key"; - - private final T defaultValue; - - public KeyOnlyRelationView(Symbol symbol) { - super(symbol, VIEW_NAME); - defaultValue = symbol.defaultValue(); - } - - @Override - public boolean filter(Tuple key, T value) { - return !Objects.equals(value, defaultValue); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - KeyOnlyRelationView that = (KeyOnlyRelationView) o; - return Objects.equals(defaultValue, that.defaultValue); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), defaultValue); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/KeyOnlyView.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/KeyOnlyView.java new file mode 100644 index 00000000..7e86f6e4 --- /dev/null +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/KeyOnlyView.java @@ -0,0 +1,41 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.store.query.view; + +import tools.refinery.store.representation.Symbol; +import tools.refinery.store.tuple.Tuple; + +import java.util.Objects; + +public final class KeyOnlyView extends TuplePreservingView { + public static final String VIEW_NAME = "key"; + + private final T defaultValue; + + public KeyOnlyView(Symbol symbol) { + super(symbol, VIEW_NAME); + defaultValue = symbol.defaultValue(); + } + + @Override + public boolean filter(Tuple key, T value) { + return !Objects.equals(value, defaultValue); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + KeyOnlyView that = (KeyOnlyView) o; + return Objects.equals(defaultValue, that.defaultValue); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), defaultValue); + } +} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/MayRelationView.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/MayRelationView.java deleted file mode 100644 index 60325f35..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/MayRelationView.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.view; - -import tools.refinery.store.representation.Symbol; -import tools.refinery.store.representation.TruthValue; -import tools.refinery.store.tuple.Tuple; - -public class MayRelationView extends TuplePreservingRelationView { - public MayRelationView(Symbol symbol) { - super(symbol, "may"); - } - - @Override - public boolean filter(Tuple key, TruthValue value) { - return value.may(); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/MayView.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/MayView.java new file mode 100644 index 00000000..e75a8171 --- /dev/null +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/MayView.java @@ -0,0 +1,21 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.store.query.view; + +import tools.refinery.store.representation.Symbol; +import tools.refinery.store.representation.TruthValue; +import tools.refinery.store.tuple.Tuple; + +public class MayView extends TuplePreservingView { + public MayView(Symbol symbol) { + super(symbol, "may"); + } + + @Override + public boolean filter(Tuple key, TruthValue value) { + return value.may(); + } +} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/MustRelationView.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/MustRelationView.java deleted file mode 100644 index d7e7ae2e..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/MustRelationView.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.view; - -import tools.refinery.store.representation.Symbol; -import tools.refinery.store.representation.TruthValue; -import tools.refinery.store.tuple.Tuple; - -public class MustRelationView extends TuplePreservingRelationView { - public MustRelationView(Symbol symbol) { - super(symbol, "must"); - } - - @Override - public boolean filter(Tuple key, TruthValue value) { - return value.must(); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/MustView.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/MustView.java new file mode 100644 index 00000000..a48f8045 --- /dev/null +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/MustView.java @@ -0,0 +1,21 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.store.query.view; + +import tools.refinery.store.representation.Symbol; +import tools.refinery.store.representation.TruthValue; +import tools.refinery.store.tuple.Tuple; + +public class MustView extends TuplePreservingView { + public MustView(Symbol symbol) { + super(symbol, "must"); + } + + @Override + public boolean filter(Tuple key, TruthValue value) { + return value.must(); + } +} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/RelationView.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/RelationView.java deleted file mode 100644 index fd4f47b4..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/RelationView.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.view; - -import tools.refinery.store.map.CursorAsIterator; -import tools.refinery.store.model.Model; -import tools.refinery.store.representation.Symbol; -import tools.refinery.store.tuple.Tuple; - -import java.util.Objects; -import java.util.UUID; - -/** - * Represents a view of a {@link Symbol} that can be queried. - * - * @param - * @author Oszkar Semerath - */ -public abstract non-sealed class RelationView implements AnyRelationView { - private final Symbol symbol; - - private final String viewName; - - protected RelationView(Symbol symbol, String viewName) { - this.symbol = symbol; - this.viewName = viewName; - } - - protected RelationView(Symbol representation) { - this(representation, UUID.randomUUID().toString()); - } - - @Override - public Symbol getSymbol() { - return symbol; - } - - @Override - public String getViewName() { - return viewName; - } - - @Override - public String name() { - return symbol.name() + "#" + viewName; - } - - public abstract boolean filter(Tuple key, T value); - - public abstract Object[] forwardMap(Tuple key, T value); - - @Override - public Iterable getAll(Model model) { - return (() -> new CursorAsIterator<>(model.getInterpretation(symbol).getAll(), this::forwardMap, this::filter)); - } - - @Override - public String toString() { - return name(); - } - - @Override - public String toReferenceString() { - return "@RelationView(\"%s\") %s".formatted(viewName, symbol.name()); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - RelationView that = (RelationView) o; - return Objects.equals(symbol, that.symbol) && Objects.equals(viewName, that.viewName); - } - - @Override - public int hashCode() { - return Objects.hash(symbol, viewName); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/RelationViewImplication.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/RelationViewImplication.java deleted file mode 100644 index c54cce2f..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/RelationViewImplication.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.view; - -import java.util.List; - -public record RelationViewImplication(AnyRelationView implyingRelationView, AnyRelationView impliedRelationView, - List impliedIndices) { - public RelationViewImplication { - if (impliedIndices.size() != impliedRelationView.arity()) { - throw new IllegalArgumentException("Expected %d implied indices for %s, but %d are provided" - .formatted(impliedRelationView.arity(), impliedRelationView, impliedIndices.size())); - } - for (var index : impliedIndices) { - if (impliedRelationView.invalidIndex(index)) { - throw new IllegalArgumentException("%d is not a valid index for %s".formatted(index, - implyingRelationView)); - } - } - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/SymbolView.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/SymbolView.java new file mode 100644 index 00000000..267a99d3 --- /dev/null +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/SymbolView.java @@ -0,0 +1,82 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.store.query.view; + +import tools.refinery.store.map.CursorAsIterator; +import tools.refinery.store.model.Model; +import tools.refinery.store.representation.Symbol; +import tools.refinery.store.tuple.Tuple; + +import java.util.Objects; +import java.util.UUID; + +/** + * Represents a view of a {@link Symbol} that can be queried. + * + * @param + * @author Oszkar Semerath + */ +public abstract non-sealed class SymbolView implements AnySymbolView { + private final Symbol symbol; + + private final String viewName; + + protected SymbolView(Symbol symbol, String viewName) { + this.symbol = symbol; + this.viewName = viewName; + } + + protected SymbolView(Symbol representation) { + this(representation, UUID.randomUUID().toString()); + } + + @Override + public Symbol getSymbol() { + return symbol; + } + + @Override + public String getViewName() { + return viewName; + } + + @Override + public String name() { + return symbol.name() + "#" + viewName; + } + + public abstract boolean filter(Tuple key, T value); + + public abstract Object[] forwardMap(Tuple key, T value); + + @Override + public Iterable getAll(Model model) { + return (() -> new CursorAsIterator<>(model.getInterpretation(symbol).getAll(), this::forwardMap, this::filter)); + } + + @Override + public String toString() { + return name(); + } + + @Override + public String toReferenceString() { + return "@RelationView(\"%s\") %s".formatted(viewName, symbol.name()); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + SymbolView that = (SymbolView) o; + return Objects.equals(symbol, that.symbol) && Objects.equals(viewName, that.viewName); + } + + @Override + public int hashCode() { + return Objects.hash(symbol, viewName); + } +} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/TuplePreservingRelationView.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/TuplePreservingRelationView.java deleted file mode 100644 index e6e54aa1..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/TuplePreservingRelationView.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.view; - -import tools.refinery.store.model.Model; -import tools.refinery.store.query.term.NodeSort; -import tools.refinery.store.query.term.Sort; -import tools.refinery.store.tuple.Tuple; -import tools.refinery.store.tuple.Tuple1; -import tools.refinery.store.representation.Symbol; - -import java.util.Arrays; -import java.util.List; - -public abstract class TuplePreservingRelationView extends RelationView { - protected TuplePreservingRelationView(Symbol symbol, String name) { - super(symbol, name); - } - - protected TuplePreservingRelationView(Symbol symbol) { - super(symbol); - } - - public Object[] forwardMap(Tuple key) { - Object[] result = new Object[key.getSize()]; - for (int i = 0; i < key.getSize(); i++) { - result[i] = Tuple.of(key.get(i)); - } - return result; - } - - @Override - public Object[] forwardMap(Tuple key, T value) { - return forwardMap(key); - } - - @Override - public boolean get(Model model, Object[] tuple) { - int[] content = new int[tuple.length]; - for (int i = 0; i < tuple.length; i++) { - content[i] = ((Tuple1) tuple[i]).value0(); - } - Tuple key = Tuple.of(content); - T value = model.getInterpretation(getSymbol()).get(key); - return filter(key, value); - } - - @Override - public int arity() { - return this.getSymbol().arity(); - } - - @Override - public List getSorts() { - var sorts = new Sort[arity()]; - Arrays.fill(sorts, NodeSort.INSTANCE); - return List.of(sorts); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/TuplePreservingView.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/TuplePreservingView.java new file mode 100644 index 00000000..19862e3a --- /dev/null +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/TuplePreservingView.java @@ -0,0 +1,65 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.store.query.view; + +import tools.refinery.store.model.Model; +import tools.refinery.store.query.term.NodeSort; +import tools.refinery.store.query.term.Sort; +import tools.refinery.store.tuple.Tuple; +import tools.refinery.store.tuple.Tuple1; +import tools.refinery.store.representation.Symbol; + +import java.util.Arrays; +import java.util.List; + +public abstract class TuplePreservingView extends SymbolView { + protected TuplePreservingView(Symbol symbol, String name) { + super(symbol, name); + } + + protected TuplePreservingView(Symbol symbol) { + super(symbol); + } + + public Object[] forwardMap(Tuple key) { + Object[] result = new Object[key.getSize()]; + for (int i = 0; i < key.getSize(); i++) { + result[i] = Tuple.of(key.get(i)); + } + return result; + } + + @Override + public Object[] forwardMap(Tuple key, T value) { + return forwardMap(key); + } + + @Override + public boolean get(Model model, Object[] tuple) { + int[] content = new int[tuple.length]; + for (int i = 0; i < tuple.length; i++) { + if (!(tuple[i] instanceof Tuple1 wrapper)) { + return false; + } + content[i] = wrapper.value0(); + } + Tuple key = Tuple.of(content); + T value = model.getInterpretation(getSymbol()).get(key); + return filter(key, value); + } + + @Override + public int arity() { + return this.getSymbol().arity(); + } + + @Override + public List getSorts() { + var sorts = new Sort[arity()]; + Arrays.fill(sorts, NodeSort.INSTANCE); + return List.of(sorts); + } +} -- cgit v1.2.3-54-g00ecf