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) {