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