This is an automated email from the ASF dual-hosted git repository.

cstamas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-resolver.git


The following commit(s) were added to refs/heads/master by this push:
     new c4cbe77a [MRESOLVER-460] Implement top H/L (#401)
c4cbe77a is described below

commit c4cbe77ae46a093c3079d2389e22508bd0d849b7
Author: Tamas Cservenak <ta...@cservenak.net>
AuthorDate: Tue Dec 19 11:31:55 2023 +0100

    [MRESOLVER-460] Implement top H/L (#401)
    
    * [MRESOLVER-460] Implement top H/L
    
    Extend filters to implement top/bottom
    
    ---
    
    https://issues.apache.org/jira/browse/MRESOLVER-460
---
 .../util/graph/version/HighestVersionFilter.java   | 26 ++++++++++++++++++----
 .../util/graph/version/LowestVersionFilter.java    | 26 ++++++++++++++++++----
 .../graph/versions/HighestVersionFilterTest.java   |  8 +++++++
 .../graph/versions/LowestVersionFilterTest.java    |  8 +++++++
 4 files changed, 60 insertions(+), 8 deletions(-)

diff --git 
a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/HighestVersionFilter.java
 
b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/HighestVersionFilter.java
index dfbbd272..7c6c7b25 100644
--- 
a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/HighestVersionFilter.java
+++ 
b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/HighestVersionFilter.java
@@ -28,19 +28,37 @@ import org.eclipse.aether.version.Version;
  * A version filter that excludes any version except the highest one.
  */
 public final class HighestVersionFilter implements VersionFilter {
+    private final int count;
 
     /**
      * Creates a new instance of this version filter.
      */
-    public HighestVersionFilter() {}
+    public HighestVersionFilter() {
+        this.count = 1;
+    }
+
+    /**
+     * Creates a new instance of this version filter.
+     */
+    public HighestVersionFilter(int count) {
+        if (count < 1) {
+            throw new IllegalArgumentException("Count should be greater or 
equal to 1");
+        }
+        this.count = count;
+    }
 
     @Override
     public void filterVersions(VersionFilterContext context) {
+        if (context.getCount() <= count) {
+            return;
+        }
+        // iterator comes in ascending order, basically we "step over" 
(remove) first few
+        int stepOver = context.getCount() - count;
         Iterator<Version> it = context.iterator();
-        for (boolean hasNext = it.hasNext(); hasNext; ) {
+        while (it.hasNext()) {
             it.next();
-            hasNext = it.hasNext();
-            if (hasNext) {
+            stepOver--;
+            if (stepOver >= 0) {
                 it.remove();
             }
         }
diff --git 
a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/LowestVersionFilter.java
 
b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/LowestVersionFilter.java
index 77d1d7a1..afc444b6 100644
--- 
a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/LowestVersionFilter.java
+++ 
b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/LowestVersionFilter.java
@@ -30,19 +30,37 @@ import org.eclipse.aether.version.Version;
  * @since 2.0.0
  */
 public final class LowestVersionFilter implements VersionFilter {
+    private final int count;
 
     /**
      * Creates a new instance of this version filter.
      */
-    public LowestVersionFilter() {}
+    public LowestVersionFilter() {
+        this.count = 1;
+    }
+
+    /**
+     * Creates a new instance of this version filter.
+     */
+    public LowestVersionFilter(int count) {
+        if (count < 1) {
+            throw new IllegalArgumentException("Count should be greater or 
equal to 1");
+        }
+        this.count = count;
+    }
 
     @Override
     public void filterVersions(VersionFilterContext context) {
+        if (context.getCount() <= count) {
+            return;
+        }
+        // iterator comes in ascending order, basically we "step over" (leave) 
first few
+        int stepOver = count;
         Iterator<Version> it = context.iterator();
-        if (it.hasNext()) {
+        while (it.hasNext()) {
             it.next();
-            while (it.hasNext()) {
-                it.next();
+            stepOver--;
+            if (stepOver < 0) {
                 it.remove();
             }
         }
diff --git 
a/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/versions/HighestVersionFilterTest.java
 
b/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/versions/HighestVersionFilterTest.java
index b0180857..31ff8834 100644
--- 
a/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/versions/HighestVersionFilterTest.java
+++ 
b/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/versions/HighestVersionFilterTest.java
@@ -34,6 +34,14 @@ public class HighestVersionFilterTest extends 
AbstractVersionFilterTest {
         assertVersions(ctx, "9");
     }
 
+    @Test
+    void testFilterVersions3() {
+        HighestVersionFilter filter = new HighestVersionFilter(3);
+        VersionFilterContext ctx = newContext("g:a:[1,9]", "1", "2", "3", "4", 
"5", "6", "7", "8", "9");
+        filter.filterVersions(ctx);
+        assertVersions(ctx, "7", "8", "9");
+    }
+
     @Test
     void testDeriveChildFilter() {
         HighestVersionFilter filter = new HighestVersionFilter();
diff --git 
a/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/versions/LowestVersionFilterTest.java
 
b/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/versions/LowestVersionFilterTest.java
index 6e139b07..80508231 100644
--- 
a/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/versions/LowestVersionFilterTest.java
+++ 
b/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/versions/LowestVersionFilterTest.java
@@ -34,6 +34,14 @@ public class LowestVersionFilterTest extends 
AbstractVersionFilterTest {
         assertVersions(ctx, "1");
     }
 
+    @Test
+    void testFilterVersions3() {
+        LowestVersionFilter filter = new LowestVersionFilter(3);
+        VersionFilterContext ctx = newContext("g:a:[1,9]", "1", "2", "3", "4", 
"5", "6", "7", "8", "9");
+        filter.filterVersions(ctx);
+        assertVersions(ctx, "1", "2", "3");
+    }
+
     @Test
     void testDeriveChildFilter() {
         LowestVersionFilter filter = new LowestVersionFilter();

Reply via email to