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

epugh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/main by this push:
     new 5cb05a1ddbd SOLR-18248 : Refactor List APIs to use Nested Interfaces 
(#4537)
5cb05a1ddbd is described below

commit 5cb05a1ddbdb3ed9a46cddca797ddb72f5b52bca
Author: Jalaz Kumar <[email protected]>
AuthorDate: Tue Aug 25 03:09:45 2026 +0530

    SOLR-18248 : Refactor List APIs to use Nested Interfaces (#4537)
    
    Signed-off-by: jaykay12 <[email protected]>
    Co-authored-by: Eric Pugh <[email protected]>
---
 .../unreleased/SOLR-18248-refactor-list-api.yml    |  7 ++++
 .../apache/solr/client/api/endpoint/TasksApi.java  | 32 +++++++++++--------
 .../api/{ActiveTask.java => GetTaskStatus.java}    | 36 ++-------------------
 .../api/{ActiveTask.java => ListActiveTasks.java}  | 20 ++----------
 .../handler/component/ActiveTaskQuerySupport.java  |  6 ++--
 .../handler/component/ActiveTasksListHandler.java  |  5 +--
 ...{ActiveTaskTest.java => GetTaskStatusTest.java} | 37 +++-------------------
 ...ctiveTaskTest.java => ListActiveTasksTest.java} | 26 +++------------
 8 files changed, 44 insertions(+), 125 deletions(-)

diff --git a/changelog/unreleased/SOLR-18248-refactor-list-api.yml 
b/changelog/unreleased/SOLR-18248-refactor-list-api.yml
new file mode 100644
index 00000000000..d7fb976ca7f
--- /dev/null
+++ b/changelog/unreleased/SOLR-18248-refactor-list-api.yml
@@ -0,0 +1,7 @@
+title: Refactor Tasks API to use Nested Interfaces
+type: changed
+authors:
+  - name: Jalaz Kumar
+links:
+  - name: SOLR-18248
+    url: https://issues.apache.org/jira/browse/SOLR-18248
diff --git 
a/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java 
b/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java
index 3e46c1465c6..46d80de5d9d 100644
--- a/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java
+++ b/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java
@@ -27,21 +27,25 @@ import 
org.apache.solr.client.api.model.ListActiveTaskResponse;
 import org.apache.solr.client.api.model.TaskStatusResponse;
 import org.apache.solr.client.api.util.StoreApiParameters;
 
-@Path(INDEX_PATH_PREFIX + "/tasks")
 public interface TasksApi {
 
-  @GET
-  @StoreApiParameters
-  @Operation(
-      summary = "Lists all the active tasks",
-      tags = {"tasks"})
-  ListActiveTaskResponse listAllActiveTasks() throws Exception;
+  @Path(INDEX_PATH_PREFIX + "/tasks")
+  interface List {
+    @GET
+    @StoreApiParameters
+    @Operation(
+        summary = "Lists all the active tasks",
+        tags = {"tasks"})
+    ListActiveTaskResponse listAllActiveTasks() throws Exception;
+  }
 
-  @GET
-  @Path("/{taskID}")
-  @StoreApiParameters
-  @Operation(
-      summary = "Status of a specific task",
-      tags = {"tasks"})
-  TaskStatusResponse getTaskStatus(@PathParam("taskID") String taskID) throws 
Exception;
+  @Path(INDEX_PATH_PREFIX + "/tasks/{taskID}")
+  interface Status {
+    @GET
+    @StoreApiParameters
+    @Operation(
+        summary = "Status of a specific task",
+        tags = {"tasks"})
+    TaskStatusResponse getTaskStatus(@PathParam("taskID") String taskID) 
throws Exception;
+  }
 }
diff --git 
a/solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java 
b/solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java
similarity index 57%
copy from solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java
copy to solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java
index 6ed8fa001fd..39e64eb68ca 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java
@@ -20,36 +20,22 @@ package org.apache.solr.handler.admin.api;
 import static org.apache.solr.security.PermissionNameProvider.Name.READ_PERM;
 
 import jakarta.inject.Inject;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
 import org.apache.solr.api.JerseyResource;
 import org.apache.solr.client.api.endpoint.TasksApi;
-import org.apache.solr.client.api.model.ActiveTaskDetails;
-import org.apache.solr.client.api.model.ListActiveTaskResponse;
 import org.apache.solr.client.api.model.TaskStatusResponse;
 import org.apache.solr.handler.component.ActiveTaskQuerySupport;
 import org.apache.solr.jersey.PermissionName;
 import org.apache.solr.request.SolrQueryRequest;
 
-public class ActiveTask extends JerseyResource implements TasksApi {
+public class GetTaskStatus extends JerseyResource implements TasksApi.Status {
 
   private final SolrQueryRequest solrQueryRequest;
 
   @Inject
-  public ActiveTask(SolrQueryRequest solrQueryRequest) {
+  public GetTaskStatus(SolrQueryRequest solrQueryRequest) {
     this.solrQueryRequest = solrQueryRequest;
   }
 
-  @Override
-  @PermissionName(READ_PERM)
-  public ListActiveTaskResponse listAllActiveTasks() throws Exception {
-    final ListActiveTaskResponse response = 
instantiateJerseyResponse(ListActiveTaskResponse.class);
-    response.tasks = ActiveTaskQuerySupport.listActiveTasks(solrQueryRequest);
-    return response;
-  }
-
   @Override
   @PermissionName(READ_PERM)
   public TaskStatusResponse getTaskStatus(String taskID) throws Exception {
@@ -64,22 +50,4 @@ public class ActiveTask extends JerseyResource implements 
TasksApi {
 
     return response;
   }
-
-  public static List<ActiveTaskDetails> getActiveTasksOnThisShard(
-      SolrQueryRequest solrQueryRequest) {
-    Iterator<Map.Entry<String, String>> iterator =
-        
solrQueryRequest.getCore().getCancellableQueryTracker().getActiveQueriesGenerated();
-
-    List<ActiveTaskDetails> activeTaskDetails = new ArrayList<>();
-    while (iterator.hasNext()) {
-      Map.Entry<String, String> entry = iterator.next();
-      activeTaskDetails.add(new ActiveTaskDetails(entry.getKey(), 
entry.getValue()));
-    }
-
-    return activeTaskDetails;
-  }
-
-  public static boolean isTaskActiveOnThisShard(SolrQueryRequest 
solrQueryRequest, String taskId) {
-    return 
solrQueryRequest.getCore().getCancellableQueryTracker().isQueryIdActive(taskId);
-  }
 }
diff --git 
a/solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java 
b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java
similarity index 79%
rename from solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java
rename to 
solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java
index 6ed8fa001fd..6717fd095fc 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java
@@ -28,17 +28,16 @@ import org.apache.solr.api.JerseyResource;
 import org.apache.solr.client.api.endpoint.TasksApi;
 import org.apache.solr.client.api.model.ActiveTaskDetails;
 import org.apache.solr.client.api.model.ListActiveTaskResponse;
-import org.apache.solr.client.api.model.TaskStatusResponse;
 import org.apache.solr.handler.component.ActiveTaskQuerySupport;
 import org.apache.solr.jersey.PermissionName;
 import org.apache.solr.request.SolrQueryRequest;
 
-public class ActiveTask extends JerseyResource implements TasksApi {
+public class ListActiveTasks extends JerseyResource implements TasksApi.List {
 
   private final SolrQueryRequest solrQueryRequest;
 
   @Inject
-  public ActiveTask(SolrQueryRequest solrQueryRequest) {
+  public ListActiveTasks(SolrQueryRequest solrQueryRequest) {
     this.solrQueryRequest = solrQueryRequest;
   }
 
@@ -50,21 +49,6 @@ public class ActiveTask extends JerseyResource implements 
TasksApi {
     return response;
   }
 
-  @Override
-  @PermissionName(READ_PERM)
-  public TaskStatusResponse getTaskStatus(String taskID) throws Exception {
-    final TaskStatusResponse response = 
instantiateJerseyResponse(TaskStatusResponse.class);
-
-    boolean isTaskActive = 
ActiveTaskQuerySupport.isTaskActive(solrQueryRequest, taskID);
-
-    response.status =
-        (isTaskActive)
-            ? TaskStatusResponse.TaskStatus.ACTIVE
-            : TaskStatusResponse.TaskStatus.INACTIVE;
-
-    return response;
-  }
-
   public static List<ActiveTaskDetails> getActiveTasksOnThisShard(
       SolrQueryRequest solrQueryRequest) {
     Iterator<Map.Entry<String, String>> iterator =
diff --git 
a/solr/core/src/java/org/apache/solr/handler/component/ActiveTaskQuerySupport.java
 
b/solr/core/src/java/org/apache/solr/handler/component/ActiveTaskQuerySupport.java
index e1da0f6bb44..6276b419451 100644
--- 
a/solr/core/src/java/org/apache/solr/handler/component/ActiveTaskQuerySupport.java
+++ 
b/solr/core/src/java/org/apache/solr/handler/component/ActiveTaskQuerySupport.java
@@ -29,7 +29,7 @@ import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.core.CoreContainer;
-import org.apache.solr.handler.admin.api.ActiveTask;
+import org.apache.solr.handler.admin.api.ListActiveTasks;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
 
@@ -55,9 +55,9 @@ public class ActiveTaskQuerySupport {
 
   private static TaskQueryResult localResult(SolrQueryRequest req, String 
taskId) {
     if (taskId != null) {
-      return new TaskQueryResult(List.of(), 
ActiveTask.isTaskActiveOnThisShard(req, taskId));
+      return new TaskQueryResult(List.of(), 
ListActiveTasks.isTaskActiveOnThisShard(req, taskId));
     }
-    return new TaskQueryResult(ActiveTask.getActiveTasksOnThisShard(req), 
false);
+    return new TaskQueryResult(ListActiveTasks.getActiveTasksOnThisShard(req), 
false);
   }
 
   private static TaskQueryResult distributedResult(SolrQueryRequest req, 
String taskId)
diff --git 
a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java
 
b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java
index 810e66d8957..bb6fa6c2523 100644
--- 
a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java
+++ 
b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java
@@ -26,7 +26,8 @@ import org.apache.solr.client.api.model.ActiveTaskDetails;
 import org.apache.solr.common.params.ShardParams;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SimpleOrderedMap;
-import org.apache.solr.handler.admin.api.ActiveTask;
+import org.apache.solr.handler.admin.api.GetTaskStatus;
+import org.apache.solr.handler.admin.api.ListActiveTasks;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.request.SolrRequestHandler;
 import org.apache.solr.response.SolrQueryResponse;
@@ -102,6 +103,6 @@ public class ActiveTasksListHandler extends 
TaskManagementHandler {
 
   @Override
   public Collection<Class<? extends JerseyResource>> getJerseyResources() {
-    return List.of(ActiveTask.class);
+    return List.of(ListActiveTasks.class, GetTaskStatus.class);
   }
 }
diff --git 
a/solr/core/src/test/org/apache/solr/handler/admin/api/ActiveTaskTest.java 
b/solr/core/src/test/org/apache/solr/handler/admin/api/GetTaskStatusTest.java
similarity index 64%
copy from 
solr/core/src/test/org/apache/solr/handler/admin/api/ActiveTaskTest.java
copy to 
solr/core/src/test/org/apache/solr/handler/admin/api/GetTaskStatusTest.java
index 1ab1e2bc489..acc4fa1d1c7 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/api/ActiveTaskTest.java
+++ 
b/solr/core/src/test/org/apache/solr/handler/admin/api/GetTaskStatusTest.java
@@ -20,11 +20,7 @@ package org.apache.solr.handler.admin.api;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.Map;
 import org.apache.solr.SolrTestCaseJ4;
-import org.apache.solr.client.api.model.ListActiveTaskResponse;
 import org.apache.solr.client.api.model.TaskStatusResponse;
 import org.apache.solr.core.CancellableQueryTracker;
 import org.apache.solr.core.SolrCore;
@@ -33,13 +29,13 @@ import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-public class ActiveTaskTest extends SolrTestCaseJ4 {
+public class GetTaskStatusTest extends SolrTestCaseJ4 {
 
   private SolrQueryRequest mockQueryRequest;
   private SolrCore solrCore;
   private CancellableQueryTracker cancellableQueryTracker;
 
-  private ActiveTask activeTask;
+  private GetTaskStatus getTaskStatus;
 
   @BeforeClass
   public static void ensureWorkingMockito() {
@@ -55,30 +51,7 @@ public class ActiveTaskTest extends SolrTestCaseJ4 {
     solrCore = mock(SolrCore.class);
     cancellableQueryTracker = mock(CancellableQueryTracker.class);
 
-    activeTask = new ActiveTask(mockQueryRequest);
-  }
-
-  @Test
-  public void testGetActiveTasks() throws Exception {
-
-    Map<String, String> myMap = new LinkedHashMap<>();
-    myMap.put("taskID1", "/search?q=h&gf=text-1");
-    myMap.put("taskID2", "/search?q=h&gf=text-2");
-    Iterator<Map.Entry<String, String>> mockIterator = 
myMap.entrySet().iterator();
-
-    when(mockQueryRequest.getCore()).thenReturn(solrCore);
-    
when(solrCore.getCancellableQueryTracker()).thenReturn(cancellableQueryTracker);
-    
when(cancellableQueryTracker.getActiveQueriesGenerated()).thenReturn(mockIterator);
-
-    ListActiveTaskResponse response = activeTask.listAllActiveTasks();
-    assertNotNull(response.tasks);
-
-    assertEquals(2, response.tasks.size());
-
-    assertEquals("taskID1", response.tasks.get(0).id);
-    assertEquals("/search?q=h&gf=text-1", response.tasks.get(0).query);
-
-    assertNull(response.error);
+    getTaskStatus = new GetTaskStatus(mockQueryRequest);
   }
 
   @Test
@@ -89,11 +62,11 @@ public class ActiveTaskTest extends SolrTestCaseJ4 {
     
when(cancellableQueryTracker.isQueryIdActive("taskID_running")).thenReturn(true);
     
when(cancellableQueryTracker.isQueryIdActive("taskID_stopped")).thenReturn(false);
 
-    TaskStatusResponse responseRunningTask = 
activeTask.getTaskStatus("taskID_running");
+    TaskStatusResponse responseRunningTask = 
getTaskStatus.getTaskStatus("taskID_running");
     assertEquals(TaskStatusResponse.TaskStatus.ACTIVE, 
responseRunningTask.status);
     assertNull(responseRunningTask.error);
 
-    TaskStatusResponse responseStoppedTask = 
activeTask.getTaskStatus("taskID_stopped");
+    TaskStatusResponse responseStoppedTask = 
getTaskStatus.getTaskStatus("taskID_stopped");
     assertEquals(TaskStatusResponse.TaskStatus.INACTIVE, 
responseStoppedTask.status);
     assertNull(responseStoppedTask.error);
   }
diff --git 
a/solr/core/src/test/org/apache/solr/handler/admin/api/ActiveTaskTest.java 
b/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java
similarity index 70%
rename from 
solr/core/src/test/org/apache/solr/handler/admin/api/ActiveTaskTest.java
rename to 
solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java
index 1ab1e2bc489..113f9dcb82a 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/api/ActiveTaskTest.java
+++ 
b/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java
@@ -25,7 +25,6 @@ import java.util.LinkedHashMap;
 import java.util.Map;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.api.model.ListActiveTaskResponse;
-import org.apache.solr.client.api.model.TaskStatusResponse;
 import org.apache.solr.core.CancellableQueryTracker;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.request.SolrQueryRequest;
@@ -33,13 +32,13 @@ import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-public class ActiveTaskTest extends SolrTestCaseJ4 {
+public class ListActiveTasksTest extends SolrTestCaseJ4 {
 
   private SolrQueryRequest mockQueryRequest;
   private SolrCore solrCore;
   private CancellableQueryTracker cancellableQueryTracker;
 
-  private ActiveTask activeTask;
+  private ListActiveTasks listActiveTasks;
 
   @BeforeClass
   public static void ensureWorkingMockito() {
@@ -55,7 +54,7 @@ public class ActiveTaskTest extends SolrTestCaseJ4 {
     solrCore = mock(SolrCore.class);
     cancellableQueryTracker = mock(CancellableQueryTracker.class);
 
-    activeTask = new ActiveTask(mockQueryRequest);
+    listActiveTasks = new ListActiveTasks(mockQueryRequest);
   }
 
   @Test
@@ -70,7 +69,7 @@ public class ActiveTaskTest extends SolrTestCaseJ4 {
     
when(solrCore.getCancellableQueryTracker()).thenReturn(cancellableQueryTracker);
     
when(cancellableQueryTracker.getActiveQueriesGenerated()).thenReturn(mockIterator);
 
-    ListActiveTaskResponse response = activeTask.listAllActiveTasks();
+    ListActiveTaskResponse response = listActiveTasks.listAllActiveTasks();
     assertNotNull(response.tasks);
 
     assertEquals(2, response.tasks.size());
@@ -80,21 +79,4 @@ public class ActiveTaskTest extends SolrTestCaseJ4 {
 
     assertNull(response.error);
   }
-
-  @Test
-  public void testGetTaskStatus() throws Exception {
-
-    when(mockQueryRequest.getCore()).thenReturn(solrCore);
-    
when(solrCore.getCancellableQueryTracker()).thenReturn(cancellableQueryTracker);
-    
when(cancellableQueryTracker.isQueryIdActive("taskID_running")).thenReturn(true);
-    
when(cancellableQueryTracker.isQueryIdActive("taskID_stopped")).thenReturn(false);
-
-    TaskStatusResponse responseRunningTask = 
activeTask.getTaskStatus("taskID_running");
-    assertEquals(TaskStatusResponse.TaskStatus.ACTIVE, 
responseRunningTask.status);
-    assertNull(responseRunningTask.error);
-
-    TaskStatusResponse responseStoppedTask = 
activeTask.getTaskStatus("taskID_stopped");
-    assertEquals(TaskStatusResponse.TaskStatus.INACTIVE, 
responseStoppedTask.status);
-    assertNull(responseStoppedTask.error);
-  }
 }

Reply via email to