You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2021/11/23 11:30:42 UTC
[isis] branch master updated: ISIS-2877: introduces OrderRelation a new value-semantics aspect
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git
The following commit(s) were added to refs/heads/master by this push:
new b64e97a ISIS-2877: introduces OrderRelation<T,D> a new value-semantics aspect
b64e97a is described below
commit b64e97a6c2f4c407c40b4841478542d62ed1c51b
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Nov 23 12:30:35 2021 +0100
ISIS-2877: introduces OrderRelation<T,D> a new value-semantics aspect
---
.../isis/applib/value/semantics/OrderRelation.java | 62 ++++++++++++++--------
.../value/semantics/ValueSemanticsAbstract.java | 6 +++
.../value/semantics/ValueSemanticsProvider.java | 6 ++-
.../metamodel/facets/object/value/ValueFacet.java | 6 +++
.../facets/object/value/ValueFacetAbstract.java | 14 +++++
.../testdomain/value/ValueSemanticsTester.java | 9 ++++
6 files changed, 78 insertions(+), 25 deletions(-)
diff --git a/api/applib/src/main/java/org/apache/isis/applib/value/semantics/OrderRelation.java b/api/applib/src/main/java/org/apache/isis/applib/value/semantics/OrderRelation.java
index 6bf337b..0a61084 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/value/semantics/OrderRelation.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/value/semantics/OrderRelation.java
@@ -1,34 +1,50 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
+package org.apache.isis.applib.value.semantics;
+
+/**
+ * Provides an ordering relation for a given value-type.
+ * <p>
+ * Does supports an <i>epsilon</i> parameter (measure of accuracy),
+ * which has different meaning, depending on context
+ * <ul>
+ * <li>Numbers: accuracy is usually given as number eg. {@code 1E-12} - in case of integers should default to {@code 0}</li>
+ * <li>Dates (temporal): accuracy is usually given as a number of days - should default to {@code 0}</li>
+ * <li>Times (temporal): accuracy is usually given as a number of seconds - eg. {@code 1E-3} for millisecond resolution</li>
+ * </ul>
+ *
+ * @param <T> - value-type
+ * @param <D> - measure of accuracy
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * @see DefaultsProvider
+ * @see Parser
+ * @see EncoderDecoder
+ * @see ValueSemanticsProvider
+ *
+ * @since 2.x {@index}
*
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
*/
-package org.apache.isis.applib.value.semantics;
+public interface OrderRelation<T, D> {
+
+ /**
+ * Default epsilon (measure of accuracy), if not specified.
+ */
+ D epsilon();
-public interface OrderRelation<T> extends Comparable<T> {
+ /**
+ * @param epsilon - measure of accuracy, has different meaning, depending on context
+ */
+ int compare(T a, T b, D epsilon);
- @Override
- public int compareTo(T o);
+ default int compare(final T a, final T b) {
+ return compare(a, b, epsilon());
+ }
/**
- * @param other
- * @param epsilon
+ * @param epsilon - measure of accuracy, has different meaning, depending on context
*/
- public default boolean isEqualTo(final T other, final int epsilon){
- return compareTo(other)==0;
+ boolean equals(T a, T b, D epsilon);
+
+ default boolean equals(final T a, final T b) {
+ return equals(a, b, epsilon());
}
}
diff --git a/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsAbstract.java b/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsAbstract.java
index f71bffd..eed725c 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsAbstract.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsAbstract.java
@@ -54,6 +54,12 @@ implements
@SuppressWarnings("unchecked")
@Override
+ public OrderRelation<T, ?> getOrderRelation() {
+ return this instanceof OrderRelation ? (OrderRelation<T, ?>)this : null;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
public Renderer<T> getRenderer() {
return this instanceof Renderer ? (Renderer<T>)this : null;
}
diff --git a/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsProvider.java b/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsProvider.java
index ed52d5b..2524887 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsProvider.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsProvider.java
@@ -65,8 +65,10 @@ public interface ValueSemanticsProvider<T> {
*/
ValueType getSchemaValueType();
- //TODO implement
- //OrderRelation<T> getOrderRelation();
+ /**
+ * The {@link OrderRelation}, if any.
+ */
+ OrderRelation<T, ?> getOrderRelation();
/**
* The {@link Renderer}, if any.
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacet.java
index ec061f3..fab1cb2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacet.java
@@ -26,6 +26,7 @@ import org.springframework.lang.Nullable;
import org.apache.isis.applib.Identifier;
import org.apache.isis.applib.id.LogicalType;
import org.apache.isis.applib.value.semantics.EncoderDecoder;
+import org.apache.isis.applib.value.semantics.OrderRelation;
import org.apache.isis.applib.value.semantics.Parser;
import org.apache.isis.applib.value.semantics.Renderer;
import org.apache.isis.applib.value.semantics.ValueSemanticsProvider;
@@ -52,6 +53,11 @@ public interface ValueFacet<T> extends Facet {
Context createValueSemanticsContext(@Nullable ObjectFeature feature);
<X> Stream<X> streamValueSemantics(Class<X> requiredType);
+ // -- ORDER RELATION
+
+ /** no qualifiers allowed on the default semantics provider*/
+ Optional<OrderRelation<T, ?>> selectDefaultOrderRelation();
+
// -- ENCODER DECODER
/** no qualifiers allowed on the default semantics provider*/
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java
index 6dfdb81..c3a1c1d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java
@@ -28,6 +28,7 @@ import org.springframework.lang.Nullable;
import org.apache.isis.applib.Identifier;
import org.apache.isis.applib.id.LogicalType;
import org.apache.isis.applib.value.semantics.EncoderDecoder;
+import org.apache.isis.applib.value.semantics.OrderRelation;
import org.apache.isis.applib.value.semantics.Parser;
import org.apache.isis.applib.value.semantics.Renderer;
import org.apache.isis.applib.value.semantics.ValueSemanticsProvider;
@@ -106,6 +107,19 @@ implements ValueFacet<T> {
iaProvider.currentInteractionContext().orElse(null));
}
+ // -- ORDER RELATIONN
+
+ @Override
+ public Optional<OrderRelation<T, ?>> selectDefaultOrderRelation() {
+ return getValueSemantics()
+ .stream()
+ .filter(isMatchingAnyOf(Can.empty()))
+ .map(ValueSemanticsProvider::getOrderRelation)
+ .filter(_NullSafe::isPresent)
+ .findFirst()
+ .map(rel->(OrderRelation<T, ?>)rel);
+ }
+
// -- ENCODER DECODER
@Override
diff --git a/regressiontests/stable-value/src/test/java/org/apache/isis/testdomain/value/ValueSemanticsTester.java b/regressiontests/stable-value/src/test/java/org/apache/isis/testdomain/value/ValueSemanticsTester.java
index 99b9ab2..5cb7cf6 100644
--- a/regressiontests/stable-value/src/test/java/org/apache/isis/testdomain/value/ValueSemanticsTester.java
+++ b/regressiontests/stable-value/src/test/java/org/apache/isis/testdomain/value/ValueSemanticsTester.java
@@ -31,6 +31,7 @@ import org.apache.isis.applib.services.command.Command;
import org.apache.isis.applib.services.iactnlayer.InteractionContext;
import org.apache.isis.applib.services.iactnlayer.InteractionService;
import org.apache.isis.applib.value.semantics.EncoderDecoder;
+import org.apache.isis.applib.value.semantics.OrderRelation;
import org.apache.isis.applib.value.semantics.Parser;
import org.apache.isis.applib.value.semantics.Renderer;
import org.apache.isis.applib.value.semantics.ValueSemanticsProvider;
@@ -60,6 +61,7 @@ public class ValueSemanticsTester<T extends Serializable> {
private final Class<T> valueType;
private final Object domainObject;
+ private Optional<OrderRelation<T, ?>> currentOrderRelation = Optional.empty();
public ValueSemanticsTester(final Class<T> valueType, final Object domainObject) {
this.valueType = valueType;
@@ -134,6 +136,11 @@ public class ValueSemanticsTester<T extends Serializable> {
//assertEquals(a, b, message);
return;
}
+
+ if(currentOrderRelation.isPresent()) {
+ currentOrderRelation.get().equals(a, (T)b);
+ }
+
assertEquals(a, b, message);
}
@@ -161,6 +168,8 @@ public class ValueSemanticsTester<T extends Serializable> {
"Value type Property or Parameter %s is missing a ValueFacet",
feature.getFeatureIdentifier()));
+ currentOrderRelation = valueFacet.selectDefaultOrderRelation();
+
return _Casts.uncheckedCast(valueFacet);
}