From c351863b73f6aecfb2d464758a24907c0dbb2665 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Mon, 28 Oct 2019 10:08:13 +0100 Subject: [PATCH] Turn off uniqueness checking for REPLACE deltas This is an attempt to improve performance of large groups processing: before more serious solution is implemented, as per MID-5889. --- .../main/java/com/evolveum/midpoint/prism/Item.java | 10 +++++++++- .../com/evolveum/midpoint/prism/impl/ItemImpl.java | 6 +++++- .../midpoint/prism/impl/delta/ItemDeltaImpl.java | 7 ++++++- .../midpoint/prism/impl/item/DummyContainerImpl.java | 6 ++++++ .../midpoint/prism/impl/item/DummyPropertyImpl.java | 6 ++++++ .../midpoint/prism/impl/item/DummyReferenceImpl.java | 6 ++++++ 6 files changed, 38 insertions(+), 3 deletions(-) diff --git a/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/Item.java b/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/Item.java index b60c256567a..32e65a4268a 100644 --- a/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/Item.java +++ b/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/Item.java @@ -272,12 +272,20 @@ public interface Item extends It /** * Adds given values, with the same semantics as repeated add(..) calls. - * For equality testing uses give strategy. + * For equality testing uses given strategy. * * @return true if this item changed as a result of the call (i.e. if at least one value was really added) */ boolean addAll(Collection newValues, EquivalenceStrategy strategy) throws SchemaException; + /** + * Adds given values, with the same semantics as repeated add(..) calls. + * For equality testing uses given strategy. + * + * @return true if this item changed as a result of the call (i.e. if at least one value was really added) + */ + boolean addAll(Collection newValues, boolean checkUniqueness, EquivalenceStrategy strategy) throws SchemaException; + /** * Removes given value from the item. * diff --git a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/ItemImpl.java b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/ItemImpl.java index 8b1e452d91b..e6f7c6d0a12 100644 --- a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/ItemImpl.java +++ b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/ItemImpl.java @@ -404,10 +404,14 @@ public boolean addAll(Collection newValues) throws SchemaException { } public boolean addAll(Collection newValues, EquivalenceStrategy strategy) throws SchemaException { + return addAll(newValues, true, strategy); + } + + public boolean addAll(Collection newValues, boolean checkUniqueness, EquivalenceStrategy strategy) throws SchemaException { checkMutability(); boolean changed = false; for (V val: newValues) { - if (add(val, strategy)) { + if (add(val, checkUniqueness, strategy)) { changed = true; } } diff --git a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/delta/ItemDeltaImpl.java b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/delta/ItemDeltaImpl.java index ae7fee744d6..fd73cb918ab 100644 --- a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/delta/ItemDeltaImpl.java +++ b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/delta/ItemDeltaImpl.java @@ -1270,8 +1270,13 @@ public void applyToMatchingPath(Item item, ParameterizedEquivalenceStrategy stra throw new SchemaException("Cannot apply delta "+this+" to "+item+" because the deltas is applicable only to "+getItemClass().getSimpleName()); } if (valuesToReplace != null) { + // FIXME This is a temporary solution (ugly hack). We do this to avoid O(n^2) comparisons when replacing + // a lot of values, like 100K members for a group. But the serious solution is to employ hashing in ItemImpl, + // and resolve this efficiency issue (1) for all cases - i.e. ADD+DELETE+REPLACE, (2) preserving uniqueness checking. + // See MID-5889. + item.clear(); //noinspection unchecked - item.replaceAll(PrismValueCollectionsUtil.cloneCollection(valuesToReplace), strategy); + item.addAll(PrismValueCollectionsUtil.cloneCollection(valuesToReplace), false, strategy); } else { if (valuesToDelete != null) { //noinspection unchecked diff --git a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/item/DummyContainerImpl.java b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/item/DummyContainerImpl.java index 3f168e57b98..8ec62bdca48 100644 --- a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/item/DummyContainerImpl.java +++ b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/item/DummyContainerImpl.java @@ -399,6 +399,12 @@ public boolean addAll(Collection> newValues, EquivalenceS return realContainer.addAll(newValues, strategy); } + @Override + public boolean addAll(Collection> newValues, boolean checkUniqueness, EquivalenceStrategy strategy) + throws SchemaException { + return realContainer.addAll(newValues, checkUniqueness, strategy); + } + public String debugDump(int indent) { return realContainer.debugDump(indent); } diff --git a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/item/DummyPropertyImpl.java b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/item/DummyPropertyImpl.java index 3f372196bbd..5fd366c7c42 100644 --- a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/item/DummyPropertyImpl.java +++ b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/item/DummyPropertyImpl.java @@ -297,6 +297,12 @@ public boolean addAll(Collection> newValues, EquivalenceSt return realProperty.addAll(newValues, strategy); } + @Override + public boolean addAll(Collection> newValues, boolean checkUniqueness, EquivalenceStrategy strategy) + throws SchemaException { + return realProperty.addAll(newValues, checkUniqueness, strategy); + } + public boolean remove(PrismPropertyValue value) { return realProperty.remove(value); } diff --git a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/item/DummyReferenceImpl.java b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/item/DummyReferenceImpl.java index 3bdb4fe82f3..2232d5649ff 100644 --- a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/item/DummyReferenceImpl.java +++ b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/item/DummyReferenceImpl.java @@ -225,6 +225,12 @@ public boolean addAll(Collection newValues, EquivalenceStra return realReference.addAll(newValues, strategy); } + @Override + public boolean addAll(Collection newValues, boolean checkUniqueness, EquivalenceStrategy strategy) + throws SchemaException { + return realReference.addAll(newValues, checkUniqueness, strategy); + } + public boolean remove(PrismReferenceValue value) { return realReference.remove(value); }