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