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);
     }