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

jeb pushed a commit to branch SLING-7524
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-query.git

commit 485e32cdf64e600ed3d417d08ad46694f4fd120b
Author: JE Bailey <j...@apache.org>
AuthorDate: Thu Mar 1 12:27:50 2018 -0500

    SLING-7524 updated unique function to only return unique items
    
    Method is similar to how the distinct method works in the Stream api and
    utilizes a HashSet of previously seen items
---
 .../java/org/apache/sling/query/AbstractQuery.java |  2 +-
 .../sling/query/function/UniqueFunction.java       |  9 +-------
 .../sling/query/iterator/UniqueIterator.java       | 25 ++++++++++------------
 .../java/org/apache/sling/query/UniqueTest.java    |  2 +-
 4 files changed, 14 insertions(+), 24 deletions(-)

diff --git a/src/main/java/org/apache/sling/query/AbstractQuery.java 
b/src/main/java/org/apache/sling/query/AbstractQuery.java
index 52643a8..ea37084 100644
--- a/src/main/java/org/apache/sling/query/AbstractQuery.java
+++ b/src/main/java/org/apache/sling/query/AbstractQuery.java
@@ -757,7 +757,7 @@ public abstract class AbstractQuery<T, Q extends 
AbstractQuery<T, Q>> implements
         * @return new SlingQuery object transformed by this operation
         */
        public Q unique() {
-               return function(new UniqueFunction<>(provider));
+               return function(new UniqueFunction<>());
        }
 
        private Q function(Function<?, ?> function, Iterable<T> iterable) {
diff --git a/src/main/java/org/apache/sling/query/function/UniqueFunction.java 
b/src/main/java/org/apache/sling/query/function/UniqueFunction.java
index b9a95d3..b5332bf 100644
--- a/src/main/java/org/apache/sling/query/function/UniqueFunction.java
+++ b/src/main/java/org/apache/sling/query/function/UniqueFunction.java
@@ -23,20 +23,13 @@ import java.util.Iterator;
 
 import org.apache.sling.query.api.internal.IteratorToIteratorFunction;
 import org.apache.sling.query.api.internal.Option;
-import org.apache.sling.query.api.internal.TreeProvider;
 import org.apache.sling.query.iterator.UniqueIterator;
 
 public class UniqueFunction<T> implements IteratorToIteratorFunction<T> {
 
-       private final TreeProvider<T> treeProvider;
-
-       public UniqueFunction(TreeProvider<T> treeProvider) {
-               this.treeProvider = treeProvider;
-       }
-
        @Override
        public Iterator<Option<T>> apply(Iterator<Option<T>> input) {
-               return new UniqueIterator<>(input, treeProvider);
+               return new UniqueIterator<>(input);
        }
 
 }
diff --git a/src/main/java/org/apache/sling/query/iterator/UniqueIterator.java 
b/src/main/java/org/apache/sling/query/iterator/UniqueIterator.java
index 48b65b0..e5ad63f 100644
--- a/src/main/java/org/apache/sling/query/iterator/UniqueIterator.java
+++ b/src/main/java/org/apache/sling/query/iterator/UniqueIterator.java
@@ -19,22 +19,21 @@
 
 package org.apache.sling.query.iterator;
 
+import java.util.HashSet;
 import java.util.Iterator;
+import java.util.Set;
 
 import org.apache.sling.query.api.internal.Option;
-import org.apache.sling.query.api.internal.TreeProvider;
 
 public class UniqueIterator<T> extends AbstractIterator<Option<T>> {
 
        private final Iterator<Option<T>> iterator;
+       
+       private Set<T> seen;
 
-       private final TreeProvider<T> treeProvider;
-
-       private T lastElement;
-
-       public UniqueIterator(Iterator<Option<T>> input, TreeProvider<T> 
treeProvider) {
+       public UniqueIterator(Iterator<Option<T>> input) {
                this.iterator = input;
-               this.treeProvider = treeProvider;
+               seen = new HashSet<>();
        }
 
        @Override
@@ -43,14 +42,12 @@ public class UniqueIterator<T> extends 
AbstractIterator<Option<T>> {
                        return null;
                }
                Option<T> candidate = iterator.next();
-               Option<T> result;
-               if (treeProvider.sameElement(lastElement, 
candidate.getElement())) {
-                       result = Option.empty(candidate.getArgumentId());
-               } else {
-                       result = candidate;
+               if (!candidate.isEmpty()) {
+                       if (!seen.add(candidate.getElement())) {
+                               return Option.empty(candidate.getArgumentId());
+                       }
                }
-               lastElement = candidate.getElement();
-               return result;
+               return candidate;
        }
 
 }
diff --git a/src/test/java/org/apache/sling/query/UniqueTest.java 
b/src/test/java/org/apache/sling/query/UniqueTest.java
index 78966a1..1c58674 100644
--- a/src/test/java/org/apache/sling/query/UniqueTest.java
+++ b/src/test/java/org/apache/sling/query/UniqueTest.java
@@ -36,6 +36,6 @@ public class UniqueTest {
                Resource r3 = tree.getChild("home/java");
 
                SlingQuery query = $(r1, r1, r1, r2, r2, r3, r3, r3, 
r1).unique();
-               assertResourceListEquals(query.iterator(), "home", 
"application", "java", "home");
+               assertResourceListEquals(query.iterator(), "home", 
"application", "java");
        }
 }

-- 
To stop receiving notification emails like this one, please contact
j...@apache.org.

Reply via email to