From 3d06fbbe40ecbc930dd01bc03324a6cd889f96e4 Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Tue, 28 Mar 2023 09:13:51 +0200 Subject: - Count number of items in the tree that has a unique id. - Use this to either exit early, or presize the array to collect them in. --- .../com/yahoo/prelude/query/CompositeItem.java | 45 ++++++++++++++-------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/container-search/src/main/java/com/yahoo/prelude/query/CompositeItem.java b/container-search/src/main/java/com/yahoo/prelude/query/CompositeItem.java index f48dc9a8630..3f0bcf177dc 100644 --- a/container-search/src/main/java/com/yahoo/prelude/query/CompositeItem.java +++ b/container-search/src/main/java/com/yahoo/prelude/query/CompositeItem.java @@ -210,7 +210,7 @@ public abstract class CompositeItem extends Item { public CompositeItem clone() { CompositeItem copy = (CompositeItem) super.clone(); - copy.subitems = new java.util.ArrayList<>(); + copy.subitems = new java.util.ArrayList<>(subitems.size()); for (Item subItem : subitems) { Item subItemCopy = subItem.clone(); subItemCopy.setParent(copy); @@ -221,14 +221,16 @@ public abstract class CompositeItem extends Item { } private void fixConnexity(CompositeItem copy) { - List flatland = new ArrayList<>(); - List flatCopy = new ArrayList<>(); - taggingFlatten(this, flatland); + int hasUniqueIdCount = countUniqueId(this); + if (hasUniqueIdCount == 0) return; + List flat = new ArrayList<>(hasUniqueIdCount); + List flatCopy = new ArrayList<>(hasUniqueIdCount); + taggingFlatten(this, flat); taggingFlatten(copy, flatCopy); - int barrier = flatland.size(); + int barrier = flat.size(); for (int i = 0; i < barrier; ++i) { - Item orig = flatland.get(i); - int connectedTo = find(orig.connectedItem, flatland); + Item orig = flat.get(i); + int connectedTo = find(orig.connectedItem, flat); if (connectedTo >= 0) { TaggableItem tagged = (TaggableItem) flatCopy.get(i); tagged.setConnectivity(flatCopy.get(connectedTo), orig.connectivity); @@ -236,18 +238,30 @@ public abstract class CompositeItem extends Item { } } - private void taggingFlatten(Item tree, List container) { + private static int countUniqueId(Item tree) { + if (tree.hasUniqueID()) { + return 1; + } else if (tree instanceof CompositeItem asComposite) { + int sum = 0; + for (Iterator i = asComposite.getItemIterator(); i.hasNext();) { + sum += countUniqueId(i.next()); + } + return sum; + } + return 0; + } + + private static void taggingFlatten(Item tree, List container) { if (tree.hasUniqueID()) { container.add(tree); - } else if (tree instanceof CompositeItem) { - CompositeItem asComposite = (CompositeItem) tree; + } else if (tree instanceof CompositeItem asComposite) { for (Iterator i = asComposite.getItemIterator(); i.hasNext();) { taggingFlatten(i.next(), container); } } } - private int find(Item needle, List haystack) { + private static int find(Item needle, List haystack) { if (needle == null) { return -1; } @@ -352,8 +366,7 @@ public abstract class CompositeItem extends Item { } @Override - public void set(Item o) { - Item newItem = o; + public void set(Item newItem) { owner.removing(current); owner.adding(newItem); current = newItem; @@ -361,12 +374,10 @@ public abstract class CompositeItem extends Item { } @Override - public void add(Item o) { - Item newItem = o; - + public void add(Item newItem) { owner.adding(newItem); // TODO: Change current here? Check javadoc - wrapped.add(o); + wrapped.add(newItem); } } -- cgit v1.2.3 From c8d9a23044e71dbfb6e4839e1b77052a1f319fe1 Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Tue, 28 Mar 2023 09:47:19 +0200 Subject: Allow composites with uniqueId to included as well. --- .../src/main/java/com/yahoo/prelude/query/CompositeItem.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/container-search/src/main/java/com/yahoo/prelude/query/CompositeItem.java b/container-search/src/main/java/com/yahoo/prelude/query/CompositeItem.java index 3f0bcf177dc..30c02944f19 100644 --- a/container-search/src/main/java/com/yahoo/prelude/query/CompositeItem.java +++ b/container-search/src/main/java/com/yahoo/prelude/query/CompositeItem.java @@ -239,22 +239,20 @@ public abstract class CompositeItem extends Item { } private static int countUniqueId(Item tree) { - if (tree.hasUniqueID()) { - return 1; - } else if (tree instanceof CompositeItem asComposite) { - int sum = 0; + int sum = tree.hasUniqueID() ? 1 : 0; + if (tree instanceof CompositeItem asComposite) { for (Iterator i = asComposite.getItemIterator(); i.hasNext();) { sum += countUniqueId(i.next()); } - return sum; } - return 0; + return sum; } private static void taggingFlatten(Item tree, List container) { if (tree.hasUniqueID()) { container.add(tree); - } else if (tree instanceof CompositeItem asComposite) { + } + if (tree instanceof CompositeItem asComposite) { for (Iterator i = asComposite.getItemIterator(); i.hasNext();) { taggingFlatten(i.next(), container); } -- cgit v1.2.3