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 2018/09/29 04:32:21 UTC

[isis] 02/02: ISIS-1976: CollectionFacet API: remove contains(..)

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch v2
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 3a1bd77ce47dea41dc4dd3da2aee6b4f14d9850b
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sat Sep 29 06:30:08 2018 +0200

    ISIS-1976: CollectionFacet API: remove contains(..)
    
    improves memento one-to-many update performance
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
 .../commons/internal/functions/_Predicates.java    |  8 ++++
 .../collections/CollectionFacetAbstract.java       |  6 ---
 .../facets/collections/modify/CollectionFacet.java |  6 ---
 .../CollectionFacetOnStandaloneList.java           |  5 ---
 .../ObjectAdapterContext_MementoSupport.java       | 49 +++++++++++++---------
 5 files changed, 38 insertions(+), 36 deletions(-)

diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/functions/_Predicates.java b/core/commons/src/main/java/org/apache/isis/commons/internal/functions/_Predicates.java
index eb06059..68bce34 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/functions/_Predicates.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/functions/_Predicates.java
@@ -67,5 +67,13 @@ public final class _Predicates {
     public static <T> Predicate<T> isPresent() {
         return _NullSafe::isPresent;
     }
+
+    /**
+     * Negates the specified {@code predicate}. (Obsolete with Java-11) 
+     * @param predicate
+     */
+    public static <T> Predicate<T> not(Predicate<T> predicate) {
+        return null;
+    }
     
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/CollectionFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/CollectionFacetAbstract.java
index 4f3dbda..53af6b4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/CollectionFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/CollectionFacetAbstract.java
@@ -23,7 +23,6 @@ import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
 
 public abstract class CollectionFacetAbstract extends FacetAbstract implements CollectionFacet {
 
@@ -36,9 +35,4 @@ public abstract class CollectionFacetAbstract extends FacetAbstract implements C
         return getFacetHolder().getFacet(TypeOfFacet.class);
     }
     
-    @Override
-    public boolean contains(ManagedObject collectionAdapter, ManagedObject element) {
-        return stream(collectionAdapter).anyMatch(x->x.equals(element));
-    }
-    
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionFacet.java
index edbfee2..03b215d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionFacet.java
@@ -56,12 +56,6 @@ public interface CollectionFacet extends Facet {
     }
 
     /**
-     * @deprecated implementations do not scale well with the size of the collection 
-     */
-    @Deprecated
-    boolean contains(ManagedObject collectionAdapter, ManagedObject element);
-
-    /**
      * Set the contents of the collection (POJO) as provided by the optional supplier.
      * <p>
      * 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/standalonelist/CollectionFacetOnStandaloneList.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/standalonelist/CollectionFacetOnStandaloneList.java
index 74b904e..4828b16 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/standalonelist/CollectionFacetOnStandaloneList.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/standalonelist/CollectionFacetOnStandaloneList.java
@@ -43,11 +43,6 @@ public class CollectionFacetOnStandaloneList extends CollectionFacetAbstract {
         return list.stream()
                 .map(x->(T)x);
     }
-    
-    @Override
-    public boolean contains(ManagedObject collectionAdapter, ManagedObject element) {
-        return collection(collectionAdapter).contains(element);
-    }
 
     /**
      * Expected to be called with a {@link ObjectAdapter} wrapping a
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_MementoSupport.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_MementoSupport.java
index ef254e0..c070f16 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_MementoSupport.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_MementoSupport.java
@@ -18,8 +18,12 @@
  */
 package org.apache.isis.core.runtime.system.persistence.adaptermanager;
 
-import java.util.List;
+import static org.apache.isis.commons.internal.functions._Predicates.not;
+
+import java.util.LinkedHashSet;
+import java.util.Set;
 import java.util.function.Supplier;
+import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import org.slf4j.Logger;
@@ -204,29 +208,36 @@ class ObjectAdapterContext_MementoSupport implements MementoRecreateObjectSuppor
         }
     }
 
-    private void updateOneToManyAssociation(final ObjectAdapter objectAdapter, final OneToManyAssociation otma, final CollectionData collectionData) {
+    private void updateOneToManyAssociation(
+            final ObjectAdapter objectAdapter, 
+            final OneToManyAssociation otma, 
+            final CollectionData collectionData) {
+        
         final ObjectAdapter collection = otma.get(objectAdapter, InteractionInitiatedBy.FRAMEWORK);
-        final CollectionFacet facet = CollectionFacet.Utils.getCollectionFacetFromSpec(collection);
-        final List<ObjectAdapter> original = CollectionFacet.Utils.toAdapterList(collection); 
-
-        collectionData.streamElements().forEach((final Data data) -> {
-            final ObjectAdapter elementAdapter = recreateReference(data);
-            if (!facet.contains(collection, elementAdapter)) {
-                if (LOG.isDebugEnabled()) {
-                    LOG.debug("  association {} changed, added {}", otma, elementAdapter.getOid());
-                }
-                otma.addElement(objectAdapter, elementAdapter, InteractionInitiatedBy.FRAMEWORK);
-            } else {
-                otma.removeElement(objectAdapter, elementAdapter, InteractionInitiatedBy.FRAMEWORK);
+        final Set<ObjectAdapter> original = CollectionFacet.Utils.streamAdapters(collection)
+                .collect(Collectors.toCollection(LinkedHashSet::new));
+        final Set<ObjectAdapter> incoming = collectionData.streamElements()
+                .map(this::recreateReference)
+                .collect(Collectors.toCollection(LinkedHashSet::new));
+                
+        incoming.stream()
+        .filter(original::contains)
+        .forEach(elementAdapter->{
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("  association {} changed, added {}", otma, elementAdapter.getOid());
             }
+            otma.addElement(objectAdapter, elementAdapter, InteractionInitiatedBy.FRAMEWORK);
         });
-
-        for (final ObjectAdapter element : original) {
+        
+        original.stream()
+        .filter(not(incoming::contains))
+        .forEach(elementAdapter->{
             if (LOG.isDebugEnabled()) {
-                LOG.debug("  association {} changed, removed {}", otma, element.getOid());
+                LOG.debug("  association {} changed, removed {}", otma, elementAdapter.getOid());
             }
-            otma.removeElement(objectAdapter, element, InteractionInitiatedBy.FRAMEWORK);
-        }
+            otma.removeElement(objectAdapter, elementAdapter, InteractionInitiatedBy.FRAMEWORK);
+        });
+
     }
 
     private void updateOneToOneAssociation(final ObjectAdapter objectAdapter, final OneToOneAssociation otoa, final Data assocData) {