Skip to content

Commit 5b7bf59

Browse files
committed
Support AddFunctionField/DropCollectionField/DropFunctionField
Signed-off-by: yhmo <yihua.mo@zilliz.com>
1 parent ee4b440 commit 5b7bf59

9 files changed

Lines changed: 660 additions & 0 deletions

File tree

sdk-core/src/main/java/io/milvus/v2/client/MilvusClientV2.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -509,6 +509,15 @@ public void alterCollectionField(AlterCollectionFieldReq request) {
509509
rpcUtils.retry(() -> collectionService.alterCollectionField(this.getRpcStub(), request));
510510
}
511511

512+
/**
513+
* Drop a field from collection.
514+
*
515+
* @param request drop field request
516+
*/
517+
public void dropCollectionField(DropCollectionFieldReq request) {
518+
rpcUtils.retry(() -> collectionService.dropCollectionField(this.getRpcStub(), request));
519+
}
520+
512521
/**
513522
* drop a collection's properties.
514523
*
@@ -643,6 +652,15 @@ public void addCollectionFunction(AddCollectionFunctionReq request) {
643652
rpcUtils.retry(() -> collectionService.addCollectionFunction(this.getRpcStub(), request));
644653
}
645654

655+
/**
656+
* Add a function-backed field to collection.
657+
*
658+
* @param request add function field request
659+
*/
660+
public void addFunctionField(AddFunctionFieldReq request) {
661+
rpcUtils.retry(() -> collectionService.addFunctionField(this.getRpcStub(), request));
662+
}
663+
646664
/**
647665
* Alter a function of collection.
648666
*
@@ -661,6 +679,17 @@ public void dropCollectionFunction(DropCollectionFunctionReq request) {
661679
rpcUtils.retry(() -> collectionService.dropCollectionFunction(this.getRpcStub(), request));
662680
}
663681

682+
/**
683+
* Drop a function-backed field from collection.
684+
* This removes the function and its output field(s), unlike dropCollectionFunction,
685+
* which only drops the function definition.
686+
*
687+
* @param request drop function field request
688+
*/
689+
public void dropFunctionField(DropFunctionFieldReq request) {
690+
rpcUtils.retry(() -> collectionService.dropFunctionField(this.getRpcStub(), request));
691+
}
692+
664693
/////////////////////////////////////////////////////////////////////////////////////////////
665694
// Index Operations
666695
/////////////////////////////////////////////////////////////////////////////////////////////

sdk-core/src/main/java/io/milvus/v2/service/collection/CollectionService.java

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,40 @@ public Void alterCollectionField(MilvusServiceGrpc.MilvusServiceBlockingStub blo
343343
return null;
344344
}
345345

346+
public Void dropCollectionField(MilvusServiceGrpc.MilvusServiceBlockingStub blockingStub, DropCollectionFieldReq request) {
347+
String dbName = request.getDatabaseName();
348+
String collectionName = request.getCollectionName();
349+
String fieldName = request.getFieldName();
350+
Long fieldId = request.getFieldId();
351+
boolean hasFieldName = StringUtils.isNotBlank(fieldName);
352+
boolean hasFieldId = fieldId != null && fieldId > 0;
353+
if (hasFieldName == hasFieldId) {
354+
throw new MilvusClientException(ErrorCode.INVALID_PARAMS,
355+
"Exactly one of fieldName or fieldId must be provided.");
356+
}
357+
358+
String title = String.format("Drop field of collection: '%s' in database: '%s'", collectionName, dbName);
359+
AlterCollectionSchemaRequest.DropRequest.Builder dropBuilder = AlterCollectionSchemaRequest.DropRequest.newBuilder();
360+
if (hasFieldName) {
361+
dropBuilder.setFieldName(fieldName);
362+
} else {
363+
dropBuilder.setFieldId(fieldId);
364+
}
365+
366+
AlterCollectionSchemaRequest.Builder builder = AlterCollectionSchemaRequest.newBuilder()
367+
.setCollectionName(collectionName)
368+
.setAction(AlterCollectionSchemaRequest.Action.newBuilder()
369+
.setDropRequest(dropBuilder)
370+
.build());
371+
if (StringUtils.isNotEmpty(dbName)) {
372+
builder.setDbName(dbName);
373+
}
374+
375+
AlterCollectionSchemaResponse response = blockingStub.alterCollectionSchema(builder.build());
376+
rpcUtils.handleResponse(title, response.getAlterStatus());
377+
return null;
378+
}
379+
346380
public Void dropCollectionProperties(MilvusServiceGrpc.MilvusServiceBlockingStub blockingStub, DropCollectionPropertiesReq request) {
347381
String dbName = request.getDatabaseName();
348382
String collectionName = request.getCollectionName();
@@ -697,6 +731,49 @@ public Void addCollectionFunction(MilvusServiceGrpc.MilvusServiceBlockingStub bl
697731
return null;
698732
}
699733

734+
public Void addFunctionField(MilvusServiceGrpc.MilvusServiceBlockingStub blockingStub,
735+
AddFunctionFieldReq request) {
736+
if (request.getFunction() == null) {
737+
throw new MilvusClientException(ErrorCode.INVALID_PARAMS, "Function cannot be null.");
738+
}
739+
if (CollectionUtils.isEmpty(request.getFunction().getOutputFieldNames())
740+
|| request.getFunction().getOutputFieldNames().size() != 1
741+
|| !StringUtils.equals(request.getFieldName(), request.getFunction().getOutputFieldNames().get(0))) {
742+
throw new MilvusClientException(ErrorCode.INVALID_PARAMS,
743+
"Function must have exactly one output field matching the field being added.");
744+
}
745+
746+
String dbName = request.getDatabaseName();
747+
String collectionName = request.getCollectionName();
748+
String title = String.format("Add function field to collection: '%s' in database: '%s'", collectionName, dbName);
749+
750+
CreateCollectionReq.FieldSchema fieldSchema = SchemaUtils.convertFieldReqToFieldSchema(request);
751+
FieldSchema grpcFieldSchema = SchemaUtils.convertToGrpcFieldSchema(fieldSchema)
752+
.toBuilder()
753+
.setIsFunctionOutput(true)
754+
.build();
755+
AlterCollectionSchemaRequest.FieldInfo fieldInfo = AlterCollectionSchemaRequest.FieldInfo.newBuilder()
756+
.setFieldSchema(grpcFieldSchema)
757+
.build();
758+
AlterCollectionSchemaRequest.AddRequest addRequest = AlterCollectionSchemaRequest.AddRequest.newBuilder()
759+
.addFieldInfos(fieldInfo)
760+
.addFuncSchema(SchemaUtils.convertToGrpcFunction(request.getFunction()))
761+
.build();
762+
763+
AlterCollectionSchemaRequest.Builder builder = AlterCollectionSchemaRequest.newBuilder()
764+
.setCollectionName(collectionName)
765+
.setAction(AlterCollectionSchemaRequest.Action.newBuilder()
766+
.setAddRequest(addRequest)
767+
.build());
768+
if (StringUtils.isNotEmpty(dbName)) {
769+
builder.setDbName(dbName);
770+
}
771+
772+
AlterCollectionSchemaResponse response = blockingStub.alterCollectionSchema(builder.build());
773+
rpcUtils.handleResponse(title, response.getAlterStatus());
774+
return null;
775+
}
776+
700777
public Void alterCollectionFunction(MilvusServiceGrpc.MilvusServiceBlockingStub blockingStub,
701778
AlterCollectionFunctionReq request) {
702779
if (request.getFunction() == null) {
@@ -740,6 +817,32 @@ public Void dropCollectionFunction(MilvusServiceGrpc.MilvusServiceBlockingStub b
740817
return null;
741818
}
742819

820+
public Void dropFunctionField(MilvusServiceGrpc.MilvusServiceBlockingStub blockingStub,
821+
DropFunctionFieldReq request) {
822+
if (StringUtils.isEmpty(request.getFunctionName())) {
823+
throw new MilvusClientException(ErrorCode.INVALID_PARAMS, "Function name cannot be empty.");
824+
}
825+
826+
String dbName = request.getDatabaseName();
827+
String collectionName = request.getCollectionName();
828+
String title = String.format("Drop function field of collection: '%s' in database: '%s'", collectionName, dbName);
829+
AlterCollectionSchemaRequest.Builder builder = AlterCollectionSchemaRequest.newBuilder()
830+
.setCollectionName(collectionName)
831+
.setAction(AlterCollectionSchemaRequest.Action.newBuilder()
832+
.setDropRequest(AlterCollectionSchemaRequest.DropRequest.newBuilder()
833+
.setFunctionName(request.getFunctionName())
834+
.setDropFunctionOutputFields(true)
835+
.build())
836+
.build());
837+
if (StringUtils.isNotEmpty(dbName)) {
838+
builder.setDbName(dbName);
839+
}
840+
841+
AlterCollectionSchemaResponse response = blockingStub.alterCollectionSchema(builder.build());
842+
rpcUtils.handleResponse(title, response.getAlterStatus());
843+
return null;
844+
}
845+
743846
private void waitForLoadCollection(MilvusServiceGrpc.MilvusServiceBlockingStub blockingStub, String databaseName,
744847
String collectionName, Long timeoutMs, boolean refreshLoad) {
745848
long startTime = System.currentTimeMillis();
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
package io.milvus.v2.service.collection.request;
21+
22+
public class AddFunctionFieldReq extends AddFieldReq {
23+
private String collectionName;
24+
private String databaseName;
25+
private CreateCollectionReq.Function function;
26+
27+
private AddFunctionFieldReq(AddFunctionFieldReqBuilder builder) {
28+
super(builder);
29+
this.collectionName = builder.collectionName;
30+
this.databaseName = builder.databaseName;
31+
this.function = builder.function;
32+
}
33+
34+
public String getCollectionName() {
35+
return collectionName;
36+
}
37+
38+
public void setCollectionName(String collectionName) {
39+
this.collectionName = collectionName;
40+
}
41+
42+
public String getDatabaseName() {
43+
return databaseName;
44+
}
45+
46+
public void setDatabaseName(String databaseName) {
47+
this.databaseName = databaseName;
48+
}
49+
50+
public CreateCollectionReq.Function getFunction() {
51+
return function;
52+
}
53+
54+
public void setFunction(CreateCollectionReq.Function function) {
55+
this.function = function;
56+
}
57+
58+
@Override
59+
public String toString() {
60+
return "AddFunctionFieldReq{" +
61+
"collectionName='" + collectionName + '\'' +
62+
", databaseName='" + databaseName + '\'' +
63+
", function=" + function +
64+
", " + super.toString() +
65+
'}';
66+
}
67+
68+
public static AddFunctionFieldReqBuilder builder() {
69+
return new AddFunctionFieldReqBuilder();
70+
}
71+
72+
public static class AddFunctionFieldReqBuilder extends AddFieldReq.AddFieldReqBuilder<AddFunctionFieldReqBuilder> {
73+
private String collectionName = "";
74+
private String databaseName = "";
75+
private CreateCollectionReq.Function function;
76+
77+
private AddFunctionFieldReqBuilder() {
78+
}
79+
80+
public AddFunctionFieldReqBuilder collectionName(String collectionName) {
81+
this.collectionName = collectionName;
82+
return this;
83+
}
84+
85+
public AddFunctionFieldReqBuilder databaseName(String databaseName) {
86+
this.databaseName = databaseName;
87+
return this;
88+
}
89+
90+
public AddFunctionFieldReqBuilder function(CreateCollectionReq.Function function) {
91+
this.function = function;
92+
return this;
93+
}
94+
95+
@Override
96+
public AddFunctionFieldReq build() {
97+
return new AddFunctionFieldReq(this);
98+
}
99+
}
100+
}
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
package io.milvus.v2.service.collection.request;
21+
22+
public class DropCollectionFieldReq {
23+
private String collectionName;
24+
private String databaseName;
25+
private String fieldName;
26+
private Long fieldId;
27+
28+
private DropCollectionFieldReq(DropCollectionFieldReqBuilder builder) {
29+
this.collectionName = builder.collectionName;
30+
this.databaseName = builder.databaseName;
31+
this.fieldName = builder.fieldName;
32+
this.fieldId = builder.fieldId;
33+
}
34+
35+
public String getCollectionName() {
36+
return collectionName;
37+
}
38+
39+
public void setCollectionName(String collectionName) {
40+
this.collectionName = collectionName;
41+
}
42+
43+
public String getDatabaseName() {
44+
return databaseName;
45+
}
46+
47+
public void setDatabaseName(String databaseName) {
48+
this.databaseName = databaseName;
49+
}
50+
51+
public String getFieldName() {
52+
return fieldName;
53+
}
54+
55+
public void setFieldName(String fieldName) {
56+
this.fieldName = fieldName;
57+
}
58+
59+
public Long getFieldId() {
60+
return fieldId;
61+
}
62+
63+
public void setFieldId(Long fieldId) {
64+
this.fieldId = fieldId;
65+
}
66+
67+
@Override
68+
public String toString() {
69+
return "DropCollectionFieldReq{" +
70+
"collectionName='" + collectionName + '\'' +
71+
", databaseName='" + databaseName + '\'' +
72+
", fieldName='" + fieldName + '\'' +
73+
", fieldId=" + fieldId +
74+
'}';
75+
}
76+
77+
public static DropCollectionFieldReqBuilder builder() {
78+
return new DropCollectionFieldReqBuilder();
79+
}
80+
81+
public static class DropCollectionFieldReqBuilder {
82+
private String collectionName = "";
83+
private String databaseName = "";
84+
private String fieldName = "";
85+
private Long fieldId;
86+
87+
private DropCollectionFieldReqBuilder() {
88+
}
89+
90+
public DropCollectionFieldReqBuilder collectionName(String collectionName) {
91+
this.collectionName = collectionName;
92+
return this;
93+
}
94+
95+
public DropCollectionFieldReqBuilder databaseName(String databaseName) {
96+
this.databaseName = databaseName;
97+
return this;
98+
}
99+
100+
public DropCollectionFieldReqBuilder fieldName(String fieldName) {
101+
this.fieldName = fieldName;
102+
return this;
103+
}
104+
105+
public DropCollectionFieldReqBuilder fieldId(Long fieldId) {
106+
this.fieldId = fieldId;
107+
return this;
108+
}
109+
110+
public DropCollectionFieldReq build() {
111+
return new DropCollectionFieldReq(this);
112+
}
113+
}
114+
}

0 commit comments

Comments
 (0)