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");
+    }
 }

Reply via email to