You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by je...@apache.org on 2018/03/01 17:30:23 UTC
[sling-org-apache-sling-query] 01/01: SLING-7524 updated unique
function to only return unique items
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 69b331dce08e915397f20d5ca5bb1e843515c3d0
Author: JE Bailey <je...@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 | 26 ++++++++++------------
.../java/org/apache/sling/query/UniqueTest.java | 2 +-
4 files changed, 15 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..3692d59 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,13 @@ 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()) {
+ return candidate;
+ }
+ 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
jeb@apache.org.