This is an automated email from the ASF dual-hosted git repository.
jeb pushed a commit to branch master
in repository
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-query.git
The following commit(s) were added to refs/heads/master by this push:
new e5cc4ff SLING-7931 Last method was not ignoring empty Option elements
e5cc4ff is described below
commit e5cc4ffc98a8aca2ea3994cafdcf16ea1c505ffd
Author: JE Bailey <[email protected]>
AuthorDate: Mon Sep 24 14:51:42 2018 -0400
SLING-7931 Last method was not ignoring empty Option elements
re-wrote the last filter and added a JUnit test for a scenario where
there is a filter before the last function is called
---
.../sling/query/impl/iterator/LastIterator.java | 60 ++++++++++++----------
src/test/java/org/apache/sling/query/LastTest.java | 36 +++++++------
2 files changed, 55 insertions(+), 41 deletions(-)
diff --git
a/src/main/java/org/apache/sling/query/impl/iterator/LastIterator.java
b/src/main/java/org/apache/sling/query/impl/iterator/LastIterator.java
index 52acf92..bfbed8c 100644
--- a/src/main/java/org/apache/sling/query/impl/iterator/LastIterator.java
+++ b/src/main/java/org/apache/sling/query/impl/iterator/LastIterator.java
@@ -31,31 +31,39 @@ import org.apache.sling.query.api.internal.Option;
*/
public class LastIterator<T> extends AbstractIterator<Option<T>> {
- private final Iterator<Option<T>> iterator;
-
- private Option<T> previous;
-
- public LastIterator(Iterator<Option<T>> iterator) {
- this.iterator = iterator;
- }
-
- @Override
- protected Option<T> getElement() {
- Option<T> candidate = previous;
-
- if (!iterator.hasNext()) {
- previous = null;
- return candidate;
- }
-
- if (candidate == null) {
- candidate = iterator.next();
- if (!iterator.hasNext()) {
- return candidate;
- }
- }
- previous = iterator.next();
- return Option.empty(candidate.getArgumentId());
- }
+ private final Iterator<Option<T>> iterator;
+
+ private Option<T> previous;
+
+ public LastIterator(Iterator<Option<T>> iterator) {
+ this.iterator = iterator;
+ }
+
+ @Override
+ protected Option<T> getElement() {
+ Option<T> candidate = previous;
+ if (!iterator.hasNext()) {
+ previous = null;
+ return candidate;
+ }
+ if (candidate == null) {
+ candidate = iterator.next();
+ }
+ while (candidate.isEmpty() && iterator.hasNext()) {
+ candidate = iterator.next();
+ }
+ if (!iterator.hasNext()) {
+ return candidate;
+ }
+ Option<T> next = iterator.next();
+ while (next.isEmpty() && iterator.hasNext()) {
+ next = iterator.next();
+ }
+ if (!iterator.hasNext() && next.isEmpty()) {
+ return candidate;
+ }
+ previous = next;
+ return Option.empty(candidate.getArgumentId());
+ }
}
diff --git a/src/test/java/org/apache/sling/query/LastTest.java
b/src/test/java/org/apache/sling/query/LastTest.java
index 8a197ff..86a65d8 100644
--- a/src/test/java/org/apache/sling/query/LastTest.java
+++ b/src/test/java/org/apache/sling/query/LastTest.java
@@ -28,19 +28,25 @@ import org.junit.Test;
public class LastTest {
- private static final String PAR_PATH =
"home/java/labels/jcr:content/par";
-
- private Resource tree = TestUtils.getTree();
-
- @Test
- public void testLast() {
- SlingQuery query = $(tree.getChild(PAR_PATH)).children().last();
- assertResourceSetEquals(query.iterator(), "configvalue_2");
- }
-
- @Test
- public void testLastOnEmptyCollection() {
- SlingQuery query = $(tree).children("cq:Undefined").last();
- assertEmptyIterator(query.iterator());
- }
+ private static final String PAR_PATH = "home/java/labels/jcr:content/par";
+
+ private Resource tree = TestUtils.getTree();
+
+ @Test
+ public void testLast() {
+ SlingQuery query = $(tree.getChild(PAR_PATH)).children().last();
+ assertResourceSetEquals(query.iterator(), "configvalue_2");
+ }
+
+ @Test
+ public void testLastOnEmptyCollection() {
+ SlingQuery query = $(tree).children("cq:Undefined").last();
+ assertEmptyIterator(query.iterator());
+ }
+
+ @Test
+ public void testLastAfterFilter() {
+ SlingQuery query =
$(tree.getChild(PAR_PATH)).children().filter("[key=helloWorld]").last();
+ assertResourceSetEquals(query.iterator(), "configvalue");
+ }
}