diff --git a/sdk-core/src/main/java/io/milvus/v2/client/MilvusClientV2.java b/sdk-core/src/main/java/io/milvus/v2/client/MilvusClientV2.java index f14eff405..f1f58e378 100644 --- a/sdk-core/src/main/java/io/milvus/v2/client/MilvusClientV2.java +++ b/sdk-core/src/main/java/io/milvus/v2/client/MilvusClientV2.java @@ -1240,6 +1240,34 @@ public ListRefreshExternalCollectionJobsResp listRefreshExternalCollectionJobs(L return rpcUtils.retry(() -> utilityService.listRefreshExternalCollectionJobs(this.getRpcStub(), request)); } + /** + * Add a file resource to Milvus. + * + * @param request add file resource request containing name and path + */ + public void addFileResource(AddFileResourceReq request) { + rpcUtils.retry(() -> utilityService.addFileResource(this.getRpcStub(), request)); + } + + /** + * Remove a file resource from Milvus. + * + * @param request remove file resource request containing name + */ + public void removeFileResource(RemoveFileResourceReq request) { + rpcUtils.retry(() -> utilityService.removeFileResource(this.getRpcStub(), request)); + } + + /** + * List all file resources in Milvus. + * + * @param request list file resources request + * @return ListFileResourcesResp containing the list of file resources + */ + public ListFileResourcesResp listFileResources(ListFileResourcesReq request) { + return rpcUtils.retry(() -> utilityService.listFileResources(this.getRpcStub(), request)); + } + /** * Optimize collection to adjust segment sizes for better query performance. * diff --git a/sdk-core/src/main/java/io/milvus/v2/service/utility/UtilityService.java b/sdk-core/src/main/java/io/milvus/v2/service/utility/UtilityService.java index 971a8badc..ac96dccb1 100644 --- a/sdk-core/src/main/java/io/milvus/v2/service/utility/UtilityService.java +++ b/sdk-core/src/main/java/io/milvus/v2/service/utility/UtilityService.java @@ -408,4 +408,61 @@ private io.milvus.v2.service.utility.response.RefreshExternalCollectionJobInfo c .endTime(info.getEndTime()) .build(); } + + public Void addFileResource(MilvusServiceGrpc.MilvusServiceBlockingStub blockingStub, + AddFileResourceReq request) { + if (StringUtils.isEmpty(request.getName())) { + throw new MilvusClientException(ErrorCode.INVALID_PARAMS, "File resource name cannot be null or empty"); + } + if (StringUtils.isEmpty(request.getPath())) { + throw new MilvusClientException(ErrorCode.INVALID_PARAMS, "File resource path cannot be null or empty"); + } + String title = String.format("AddFileResource name: '%s', path: '%s'", request.getName(), request.getPath()); + + AddFileResourceRequest grpcRequest = AddFileResourceRequest.newBuilder() + .setName(request.getName()) + .setPath(request.getPath()) + .build(); + + Status status = blockingStub.addFileResource(grpcRequest); + rpcUtils.handleResponse(title, status); + return null; + } + + public Void removeFileResource(MilvusServiceGrpc.MilvusServiceBlockingStub blockingStub, + RemoveFileResourceReq request) { + if (StringUtils.isEmpty(request.getName())) { + throw new MilvusClientException(ErrorCode.INVALID_PARAMS, "File resource name cannot be null or empty"); + } + String title = String.format("RemoveFileResource name: '%s'", request.getName()); + + RemoveFileResourceRequest grpcRequest = RemoveFileResourceRequest.newBuilder() + .setName(request.getName()) + .build(); + + Status status = blockingStub.removeFileResource(grpcRequest); + rpcUtils.handleResponse(title, status); + return null; + } + + public ListFileResourcesResp listFileResources(MilvusServiceGrpc.MilvusServiceBlockingStub blockingStub, + ListFileResourcesReq request) { + String title = "ListFileResources"; + + ListFileResourcesRequest grpcRequest = ListFileResourcesRequest.newBuilder().build(); + + ListFileResourcesResponse response = blockingStub.listFileResources(grpcRequest); + rpcUtils.handleResponse(title, response.getStatus()); + + List resources = new ArrayList<>(); + for (io.milvus.grpc.FileResourceInfo info : response.getResourcesList()) { + resources.add(io.milvus.v2.service.utility.response.FileResourceInfo.builder() + .name(info.getName()) + .path(info.getPath()) + .build()); + } + return ListFileResourcesResp.builder() + .resources(resources) + .build(); + } } diff --git a/sdk-core/src/main/java/io/milvus/v2/service/utility/request/AddFileResourceReq.java b/sdk-core/src/main/java/io/milvus/v2/service/utility/request/AddFileResourceReq.java new file mode 100644 index 000000000..d7324f324 --- /dev/null +++ b/sdk-core/src/main/java/io/milvus/v2/service/utility/request/AddFileResourceReq.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package io.milvus.v2.service.utility.request; + +public class AddFileResourceReq { + private final String name; + private final String path; + + private AddFileResourceReq(AddFileResourceReqBuilder builder) { + this.name = builder.name; + this.path = builder.path; + } + + public static AddFileResourceReqBuilder builder() { + return new AddFileResourceReqBuilder(); + } + + public String getName() { + return name; + } + + public String getPath() { + return path; + } + + @Override + public String toString() { + return "AddFileResourceReq{" + + "name='" + name + '\'' + + ", path='" + path + '\'' + + '}'; + } + + public static class AddFileResourceReqBuilder { + private String name; + private String path; + + public AddFileResourceReqBuilder name(String name) { + this.name = name; + return this; + } + + public AddFileResourceReqBuilder path(String path) { + this.path = path; + return this; + } + + public AddFileResourceReq build() { + return new AddFileResourceReq(this); + } + } +} diff --git a/sdk-core/src/main/java/io/milvus/v2/service/utility/request/ListFileResourcesReq.java b/sdk-core/src/main/java/io/milvus/v2/service/utility/request/ListFileResourcesReq.java new file mode 100644 index 000000000..796335eb2 --- /dev/null +++ b/sdk-core/src/main/java/io/milvus/v2/service/utility/request/ListFileResourcesReq.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package io.milvus.v2.service.utility.request; + +public class ListFileResourcesReq { + + private ListFileResourcesReq(ListFileResourcesReqBuilder builder) { + } + + public static ListFileResourcesReqBuilder builder() { + return new ListFileResourcesReqBuilder(); + } + + @Override + public String toString() { + return "ListFileResourcesReq{}"; + } + + public static class ListFileResourcesReqBuilder { + + public ListFileResourcesReq build() { + return new ListFileResourcesReq(this); + } + } +} diff --git a/sdk-core/src/main/java/io/milvus/v2/service/utility/request/RemoveFileResourceReq.java b/sdk-core/src/main/java/io/milvus/v2/service/utility/request/RemoveFileResourceReq.java new file mode 100644 index 000000000..8de4ff084 --- /dev/null +++ b/sdk-core/src/main/java/io/milvus/v2/service/utility/request/RemoveFileResourceReq.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package io.milvus.v2.service.utility.request; + +public class RemoveFileResourceReq { + private final String name; + + private RemoveFileResourceReq(RemoveFileResourceReqBuilder builder) { + this.name = builder.name; + } + + public static RemoveFileResourceReqBuilder builder() { + return new RemoveFileResourceReqBuilder(); + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return "RemoveFileResourceReq{" + + "name='" + name + '\'' + + '}'; + } + + public static class RemoveFileResourceReqBuilder { + private String name; + + public RemoveFileResourceReqBuilder name(String name) { + this.name = name; + return this; + } + + public RemoveFileResourceReq build() { + return new RemoveFileResourceReq(this); + } + } +} diff --git a/sdk-core/src/main/java/io/milvus/v2/service/utility/response/FileResourceInfo.java b/sdk-core/src/main/java/io/milvus/v2/service/utility/response/FileResourceInfo.java new file mode 100644 index 000000000..0745dea18 --- /dev/null +++ b/sdk-core/src/main/java/io/milvus/v2/service/utility/response/FileResourceInfo.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package io.milvus.v2.service.utility.response; + +public class FileResourceInfo { + private final String name; + private final String path; + + private FileResourceInfo(FileResourceInfoBuilder builder) { + this.name = builder.name; + this.path = builder.path; + } + + public static FileResourceInfoBuilder builder() { + return new FileResourceInfoBuilder(); + } + + public String getName() { + return name; + } + + public String getPath() { + return path; + } + + @Override + public String toString() { + return "FileResourceInfo{" + + "name='" + name + '\'' + + ", path='" + path + '\'' + + '}'; + } + + public static class FileResourceInfoBuilder { + private String name; + private String path; + + public FileResourceInfoBuilder name(String name) { + this.name = name; + return this; + } + + public FileResourceInfoBuilder path(String path) { + this.path = path; + return this; + } + + public FileResourceInfo build() { + return new FileResourceInfo(this); + } + } +} diff --git a/sdk-core/src/main/java/io/milvus/v2/service/utility/response/ListFileResourcesResp.java b/sdk-core/src/main/java/io/milvus/v2/service/utility/response/ListFileResourcesResp.java new file mode 100644 index 000000000..e05748490 --- /dev/null +++ b/sdk-core/src/main/java/io/milvus/v2/service/utility/response/ListFileResourcesResp.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package io.milvus.v2.service.utility.response; + +import java.util.List; + +public class ListFileResourcesResp { + private final List resources; + + private ListFileResourcesResp(ListFileResourcesRespBuilder builder) { + this.resources = builder.resources; + } + + public static ListFileResourcesRespBuilder builder() { + return new ListFileResourcesRespBuilder(); + } + + public List getResources() { + return resources; + } + + @Override + public String toString() { + return "ListFileResourcesResp{" + + "resources=" + resources + + '}'; + } + + public static class ListFileResourcesRespBuilder { + private List resources; + + public ListFileResourcesRespBuilder resources(List resources) { + this.resources = resources; + return this; + } + + public ListFileResourcesResp build() { + return new ListFileResourcesResp(this); + } + } +} diff --git a/sdk-core/src/test/java/io/milvus/v2/BaseTest.java b/sdk-core/src/test/java/io/milvus/v2/BaseTest.java index 513f2ac85..76e6ba66e 100644 --- a/sdk-core/src/test/java/io/milvus/v2/BaseTest.java +++ b/sdk-core/src/test/java/io/milvus/v2/BaseTest.java @@ -205,6 +205,24 @@ public void setUp() { .setEndTime(0L) .build()) .build()); + + // file resource api + when(blockingStub.addFileResource(any())).thenReturn(successStatus); + when(blockingStub.removeFileResource(any())).thenReturn(successStatus); + when(blockingStub.listFileResources(any())).thenReturn( + ListFileResourcesResponse.newBuilder() + .setStatus(successStatus) + .addResources(io.milvus.grpc.FileResourceInfo.newBuilder() + .setId(1L) + .setName("test_resource") + .setPath("/data/test.parquet") + .build()) + .addResources(io.milvus.grpc.FileResourceInfo.newBuilder() + .setId(2L) + .setName("test_resource_2") + .setPath("/data/test2.parquet") + .build()) + .build()); } @AfterEach diff --git a/sdk-core/src/test/java/io/milvus/v2/service/utility/UtilityTest.java b/sdk-core/src/test/java/io/milvus/v2/service/utility/UtilityTest.java index 65c1602af..141129535 100644 --- a/sdk-core/src/test/java/io/milvus/v2/service/utility/UtilityTest.java +++ b/sdk-core/src/test/java/io/milvus/v2/service/utility/UtilityTest.java @@ -27,7 +27,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; class UtilityTest extends BaseTest { Logger logger = LoggerFactory.getLogger(UtilityTest.class); @@ -147,4 +148,37 @@ void testListRefreshExternalCollectionJobsWithDatabase() { assertNotNull(resp.getJobs()); assertEquals(2, resp.getJobs().size()); } + + @Test + void testAddFileResource() { + AddFileResourceReq req = AddFileResourceReq.builder() + .name("test_resource") + .path("/data/test.parquet") + .build(); + client_v2.addFileResource(req); + } + + @Test + void testRemoveFileResource() { + RemoveFileResourceReq req = RemoveFileResourceReq.builder() + .name("test_resource") + .build(); + client_v2.removeFileResource(req); + } + + @Test + void testListFileResources() { + ListFileResourcesReq req = ListFileResourcesReq.builder().build(); + ListFileResourcesResp resp = client_v2.listFileResources(req); + assertNotNull(resp.getResources()); + assertEquals(2, resp.getResources().size()); + + FileResourceInfo info1 = resp.getResources().get(0); + assertEquals("test_resource", info1.getName()); + assertEquals("/data/test.parquet", info1.getPath()); + + FileResourceInfo info2 = resp.getResources().get(1); + assertEquals("test_resource_2", info2.getName()); + assertEquals("/data/test2.parquet", info2.getPath()); + } } \ No newline at end of file