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
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 @@
*/
public class LastIterator<T> extends AbstractIterator<Option<T>> {
- private final Iterator<Option<T>> iterator;
+ private final Iterator<Option<T>> iterator;
- private Option<T> previous;
+ private Option<T> previous;
- public LastIterator(Iterator<Option<T>> iterator) {
- this.iterator = iterator;
- }
+ 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());
- }
+ @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 @@
public class LastTest {
- private static final String PAR_PATH = "home/java/labels/jcr:content/par";
+ private static final String PAR_PATH = "home/java/labels/jcr:content/par";
- private Resource tree = TestUtils.getTree();
+ 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 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 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");
+ }
}