diff options
Diffstat (limited to 'subprojects/store-query/src/main')
7 files changed, 40 insertions, 20 deletions
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 index c1f9d688..fd37604e 100644 --- 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 | |||
@@ -20,12 +20,10 @@ import java.util.stream.Collectors; | |||
20 | import java.util.stream.IntStream; | 20 | import java.util.stream.IntStream; |
21 | 21 | ||
22 | public abstract class AbstractFunctionView<T> extends SymbolView<T> { | 22 | public abstract class AbstractFunctionView<T> extends SymbolView<T> { |
23 | private final T defaultValue; | ||
24 | private final List<Parameter> parameters; | 23 | private final List<Parameter> parameters; |
25 | 24 | ||
26 | protected AbstractFunctionView(Symbol<T> symbol, String name, Parameter outParameter) { | 25 | protected AbstractFunctionView(Symbol<T> symbol, String name, Parameter outParameter) { |
27 | super(symbol, name); | 26 | super(symbol, name); |
28 | defaultValue = symbol.defaultValue(); | ||
29 | parameters = createParameters(symbol.arity(), outParameter); | 27 | parameters = createParameters(symbol.arity(), outParameter); |
30 | } | 28 | } |
31 | 29 | ||
@@ -46,16 +44,16 @@ public abstract class AbstractFunctionView<T> extends SymbolView<T> { | |||
46 | } | 44 | } |
47 | 45 | ||
48 | @Override | 46 | @Override |
49 | public final boolean filter(Tuple key, T value) { | 47 | protected boolean doFilter(Tuple key, T value) { |
50 | return !Objects.equals(defaultValue, value); | 48 | return true; |
51 | } | 49 | } |
52 | 50 | ||
53 | protected Object forwardMapValue(Tuple key, T value) { | 51 | protected Object forwardMapValue(T value) { |
54 | return value; | 52 | return value; |
55 | } | 53 | } |
56 | 54 | ||
57 | protected boolean valueEquals(Tuple key, T value, Object otherForwardMappedValue) { | 55 | protected boolean valueEquals(T value, Object otherForwardMappedValue) { |
58 | return Objects.equals(otherForwardMappedValue, forwardMapValue(key, value)); | 56 | return Objects.equals(otherForwardMappedValue, forwardMapValue(value)); |
59 | } | 57 | } |
60 | 58 | ||
61 | @Override | 59 | @Override |
@@ -65,7 +63,7 @@ public abstract class AbstractFunctionView<T> extends SymbolView<T> { | |||
65 | for (int i = 0; i < size; i++) { | 63 | for (int i = 0; i < size; i++) { |
66 | result[i] = Tuple.of(key.get(i)); | 64 | result[i] = Tuple.of(key.get(i)); |
67 | } | 65 | } |
68 | result[key.getSize()] = forwardMapValue(key, value); | 66 | result[key.getSize()] = forwardMapValue(value); |
69 | return result; | 67 | return result; |
70 | } | 68 | } |
71 | 69 | ||
@@ -81,7 +79,7 @@ public abstract class AbstractFunctionView<T> extends SymbolView<T> { | |||
81 | Tuple key = Tuple.of(content); | 79 | Tuple key = Tuple.of(content); |
82 | var valueInTuple = tuple[tuple.length - 1]; | 80 | var valueInTuple = tuple[tuple.length - 1]; |
83 | T valueInMap = model.getInterpretation(getSymbol()).get(key); | 81 | T valueInMap = model.getInterpretation(getSymbol()).get(key); |
84 | return valueEquals(key, valueInMap, valueInTuple); | 82 | return valueEquals(valueInMap, valueInTuple); |
85 | } | 83 | } |
86 | 84 | ||
87 | @Override | 85 | @Override |
@@ -95,12 +93,12 @@ public abstract class AbstractFunctionView<T> extends SymbolView<T> { | |||
95 | if (o == null || getClass() != o.getClass()) return false; | 93 | if (o == null || getClass() != o.getClass()) return false; |
96 | if (!super.equals(o)) return false; | 94 | if (!super.equals(o)) return false; |
97 | AbstractFunctionView<?> that = (AbstractFunctionView<?>) o; | 95 | AbstractFunctionView<?> that = (AbstractFunctionView<?>) o; |
98 | return Objects.equals(defaultValue, that.defaultValue) && Objects.equals(parameters, that.parameters); | 96 | return Objects.equals(parameters, that.parameters); |
99 | } | 97 | } |
100 | 98 | ||
101 | @Override | 99 | @Override |
102 | public int hashCode() { | 100 | public int hashCode() { |
103 | return Objects.hash(super.hashCode(), defaultValue, parameters); | 101 | return Objects.hash(super.hashCode(), parameters); |
104 | } | 102 | } |
105 | 103 | ||
106 | private static List<Parameter> createParameters(int symbolArity, Parameter outParameter) { | 104 | private static List<Parameter> createParameters(int symbolArity, Parameter outParameter) { |
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 index 922c7355..abae6e5c 100644 --- 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 | |||
@@ -27,14 +27,16 @@ public class FilteredView<T> extends TuplePreservingView<T> { | |||
27 | 27 | ||
28 | public FilteredView(Symbol<T> symbol, String name, Predicate<T> predicate) { | 28 | public FilteredView(Symbol<T> symbol, String name, Predicate<T> predicate) { |
29 | this(symbol, name, (k, v) -> predicate.test(v)); | 29 | this(symbol, name, (k, v) -> predicate.test(v)); |
30 | validateDefaultValue(predicate); | ||
30 | } | 31 | } |
31 | 32 | ||
32 | public FilteredView(Symbol<T> symbol, Predicate<T> predicate) { | 33 | public FilteredView(Symbol<T> symbol, Predicate<T> predicate) { |
33 | this(symbol, (k, v) -> predicate.test(v)); | 34 | this(symbol, (k, v) -> predicate.test(v)); |
35 | validateDefaultValue(predicate); | ||
34 | } | 36 | } |
35 | 37 | ||
36 | @Override | 38 | @Override |
37 | public boolean filter(Tuple key, T value) { | 39 | protected boolean doFilter(Tuple key, T value) { |
38 | return this.predicate.test(key, value); | 40 | return this.predicate.test(key, value); |
39 | } | 41 | } |
40 | 42 | ||
@@ -51,4 +53,21 @@ public class FilteredView<T> extends TuplePreservingView<T> { | |||
51 | public int hashCode() { | 53 | public int hashCode() { |
52 | return Objects.hash(super.hashCode(), predicate); | 54 | return Objects.hash(super.hashCode(), predicate); |
53 | } | 55 | } |
56 | |||
57 | private void validateDefaultValue(Predicate<T> predicate) { | ||
58 | var defaultValue = getSymbol().defaultValue(); | ||
59 | boolean matchesDefaultValue = false; | ||
60 | try { | ||
61 | matchesDefaultValue = predicate.test(defaultValue); | ||
62 | } catch (NullPointerException e) { | ||
63 | if (defaultValue != null) { | ||
64 | throw e; | ||
65 | } | ||
66 | // The predicate doesn't need to handle the default value if it is null. | ||
67 | } | ||
68 | if (matchesDefaultValue) { | ||
69 | throw new IllegalArgumentException("Tuples with default value %s cannot be enumerated in %s" | ||
70 | .formatted(defaultValue, getSymbol())); | ||
71 | } | ||
72 | } | ||
54 | } | 73 | } |
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 index 26b717ee..c312330e 100644 --- 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 | |||
@@ -15,7 +15,7 @@ public class ForbiddenView extends TuplePreservingView<TruthValue> { | |||
15 | } | 15 | } |
16 | 16 | ||
17 | @Override | 17 | @Override |
18 | public boolean filter(Tuple key, TruthValue value) { | 18 | protected boolean doFilter(Tuple key, TruthValue value) { |
19 | return !value.may(); | 19 | return !value.may(); |
20 | } | 20 | } |
21 | } | 21 | } |
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 index 7e86f6e4..f0e4a61e 100644 --- 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 | |||
@@ -21,8 +21,8 @@ public final class KeyOnlyView<T> extends TuplePreservingView<T> { | |||
21 | } | 21 | } |
22 | 22 | ||
23 | @Override | 23 | @Override |
24 | public boolean filter(Tuple key, T value) { | 24 | protected boolean doFilter(Tuple key, T value) { |
25 | return !Objects.equals(value, defaultValue); | 25 | return true; |
26 | } | 26 | } |
27 | 27 | ||
28 | @Override | 28 | @Override |
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 index e75a8171..c322e220 100644 --- 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 | |||
@@ -15,7 +15,7 @@ public class MayView extends TuplePreservingView<TruthValue> { | |||
15 | } | 15 | } |
16 | 16 | ||
17 | @Override | 17 | @Override |
18 | public boolean filter(Tuple key, TruthValue value) { | 18 | protected boolean doFilter(Tuple key, TruthValue value) { |
19 | return value.may(); | 19 | return value.may(); |
20 | } | 20 | } |
21 | } | 21 | } |
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 index a48f8045..65bb4e4c 100644 --- 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 | |||
@@ -15,7 +15,7 @@ public class MustView extends TuplePreservingView<TruthValue> { | |||
15 | } | 15 | } |
16 | 16 | ||
17 | @Override | 17 | @Override |
18 | public boolean filter(Tuple key, TruthValue value) { | 18 | protected boolean doFilter(Tuple key, TruthValue value) { |
19 | return value.must(); | 19 | return value.must(); |
20 | } | 20 | } |
21 | } | 21 | } |
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 index 267a99d3..cd8bd56b 100644 --- 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 | |||
@@ -21,7 +21,6 @@ import java.util.UUID; | |||
21 | */ | 21 | */ |
22 | public abstract non-sealed class SymbolView<T> implements AnySymbolView { | 22 | public abstract non-sealed class SymbolView<T> implements AnySymbolView { |
23 | private final Symbol<T> symbol; | 23 | private final Symbol<T> symbol; |
24 | |||
25 | private final String viewName; | 24 | private final String viewName; |
26 | 25 | ||
27 | protected SymbolView(Symbol<T> symbol, String viewName) { | 26 | protected SymbolView(Symbol<T> symbol, String viewName) { |
@@ -48,7 +47,11 @@ public abstract non-sealed class SymbolView<T> implements AnySymbolView { | |||
48 | return symbol.name() + "#" + viewName; | 47 | return symbol.name() + "#" + viewName; |
49 | } | 48 | } |
50 | 49 | ||
51 | public abstract boolean filter(Tuple key, T value); | 50 | public final boolean filter(Tuple key, T value) { |
51 | return !Objects.equals(symbol.defaultValue(), value) && doFilter(key, value); | ||
52 | } | ||
53 | |||
54 | protected abstract boolean doFilter(Tuple key, T value); | ||
52 | 55 | ||
53 | public abstract Object[] forwardMap(Tuple key, T value); | 56 | public abstract Object[] forwardMap(Tuple key, T value); |
54 | 57 | ||
@@ -77,6 +80,6 @@ public abstract non-sealed class SymbolView<T> implements AnySymbolView { | |||
77 | 80 | ||
78 | @Override | 81 | @Override |
79 | public int hashCode() { | 82 | public int hashCode() { |
80 | return Objects.hash(symbol, viewName); | 83 | return Objects.hash(getClass(), symbol, viewName); |
81 | } | 84 | } |
82 | } | 85 | } |