Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 65 additions & 0 deletions examples/src/main/java/io/milvus/v2/AddFieldExample.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,21 @@
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import io.milvus.v1.CommonUtils;
import io.milvus.common.clientenum.FunctionType;
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.common.ConsistencyLevel;
import io.milvus.v2.common.DataType;
import io.milvus.v2.common.IndexParam;
import io.milvus.v2.service.collection.request.AddCollectionFieldReq;
import io.milvus.v2.service.collection.request.AddFieldReq;
import io.milvus.v2.service.collection.request.AddFunctionFieldReq;
import io.milvus.v2.service.collection.request.CreateCollectionReq;
import io.milvus.v2.service.collection.request.DescribeCollectionReq;
import io.milvus.v2.service.collection.request.DropCollectionFieldReq;
import io.milvus.v2.service.collection.request.DropCollectionReq;
import io.milvus.v2.service.collection.request.DropFunctionFieldReq;
import io.milvus.v2.service.collection.response.DescribeCollectionResp;
import io.milvus.v2.service.vector.request.InsertReq;
import io.milvus.v2.service.vector.request.QueryReq;
import io.milvus.v2.service.vector.response.QueryResp;
Expand Down Expand Up @@ -107,6 +113,15 @@ private static void query(long id) {
System.out.println("=============================================================");
}

private static void describeCollection() {
DescribeCollectionResp resp = client.describeCollection(DescribeCollectionReq.builder()
.collectionName(COLLECTION_NAME)
.build());
System.out.println("\nCollection fields:");
System.out.println(resp.getFieldNames());
System.out.println("=============================================================");
}

public static void main(String[] args) {
createCollection();

Expand All @@ -132,6 +147,8 @@ public static void main(String[] args) {
.isNullable(true)
.build());

describeCollection();

// Query the previous row
query(100L);
}
Expand All @@ -151,6 +168,54 @@ public static void main(String[] args) {
query(500L);
}

{
// Drop the field added above
client.dropCollectionField(DropCollectionFieldReq.builder()
.collectionName(COLLECTION_NAME)
.fieldName("text")
.build());
System.out.println("Field 'text' dropped");
describeCollection();
}

{
// Add the text field back for function-field demo
client.addCollectionField(AddCollectionFieldReq.builder()
.collectionName(COLLECTION_NAME)
.fieldName("text")
.dataType(DataType.VarChar)
.maxLength(100)
.enableAnalyzer(true)
.enableMatch(true)
.isNullable(true)
.build());

// Add a function-backed sparse field
client.addFunctionField(AddFunctionFieldReq.builder()
.collectionName(COLLECTION_NAME)
.fieldName("sparse")
.dataType(DataType.SparseFloatVector)
.function(CreateCollectionReq.Function.builder()
.name("bm25")
.functionType(FunctionType.BM25)
.inputFieldNames(Collections.singletonList("text"))
.outputFieldNames(Collections.singletonList("sparse"))
.build())
.build());
System.out.println("Function-backed field 'sparse' added");
describeCollection();
}

{
// Drop the function and its output field
client.dropFunctionField(DropFunctionFieldReq.builder()
.collectionName(COLLECTION_NAME)
.functionName("bm25")
.build());
System.out.println("Function-backed field 'sparse' dropped");
describeCollection();
}

client.close();
}
}
42 changes: 38 additions & 4 deletions examples/src/main/java/io/milvus/v2/CDCExample.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,19 +22,25 @@
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.cdc.request.CrossClusterTopology;
import io.milvus.v2.service.cdc.request.DumpMessagesReq;
import io.milvus.v2.service.cdc.request.GetReplicateInfoReq;
import io.milvus.v2.service.cdc.request.MilvusCluster;
import io.milvus.v2.service.cdc.request.ReplicateConfiguration;
import io.milvus.v2.service.cdc.request.UpdateReplicateConfigurationReq;
import io.milvus.v2.service.cdc.response.DumpMessageInfo;
import io.milvus.v2.service.cdc.response.DumpMessagesResp;
import io.milvus.v2.service.cdc.response.GetReplicateConfigurationResp;
import io.milvus.v2.service.cdc.response.GetReplicateInfoResp;

import java.util.ArrayList;
import java.util.List;

public class CDCExample {
private static final String clusterAURI = "http://192.168.1.1:19530";
private static final String clusterBURI = "http://192.168.1.1:19500";
private static final String clusterAURI = "http://localhost:19530";
private static final String clusterBURI = "http://localhost:29530";

private static final String clusterAId = "cdc-test-upstream";
private static final String clusterBId = "cdc-test-downstream";
private static final String clusterAId = "cdc-a";
private static final String clusterBId = "cdc-b";

private static final Integer pchannelNum = 16;

Expand All @@ -51,11 +57,13 @@ public static void main(String[] args) {
.uri(clusterAURI)
.build();
MilvusClientV2 clusterAClient = new MilvusClientV2(clusterA);
System.out.println("Cluster A connected: " + clusterAClient.getServerVersion());

ConnectConfig clusterB = ConnectConfig.builder()
.uri(clusterBURI)
.build();
MilvusClientV2 clusterBClient = new MilvusClientV2(clusterB);
System.out.println("Cluster B connected: " + clusterBClient.getServerVersion());

MilvusCluster milvusClusterA = MilvusCluster.builder()
.clusterId(clusterAId)
Expand Down Expand Up @@ -88,6 +96,32 @@ public static void main(String[] args) {
.build();

clusterAClient.updateReplicateConfiguration(updateReq);
System.out.println("Replicate configuration updated for cluster A");
clusterBClient.updateReplicateConfiguration(updateReq);
System.out.println("Replicate configuration updated for cluster B");

GetReplicateConfigurationResp replicateConfigurationResp = clusterAClient.getReplicateConfiguration();
System.out.println("Replicate configuration: " + replicateConfigurationResp.getReplicateConfiguration());

GetReplicateInfoResp replicateInfoResp = clusterBClient.getReplicateInfo(GetReplicateInfoReq.builder()
.sourceClusterId(clusterAId)
.targetPchannel(generatePChannels(clusterBId).get(0))
.build());
System.out.println("Replicate info: " + replicateInfoResp);

String dumpStartMessageId = replicateInfoResp.getSalvageCheckpoint().getMessageID().getId();

DumpMessagesResp dumpMessagesResp = clusterAClient.dumpMessages(DumpMessagesReq.builder()
.pchannel(generatePChannels(clusterAId).get(0))
.startMessageID(GetReplicateInfoResp.MessageID.builder()
.id(dumpStartMessageId)
.walName("RocksMQ")
.build())
.build());
System.out.println("Dump messages:");
for (DumpMessageInfo message : dumpMessagesResp) {
System.out.println("\tmessage id: " + message.getMessageID().getId());
System.out.println("\tpayload size: " + message.getPayload().length);
}
}
}
30 changes: 30 additions & 0 deletions sdk-core/src/main/java/io/milvus/v2/client/MilvusClientV2.java
Original file line number Diff line number Diff line change
Expand Up @@ -509,6 +509,15 @@ public void alterCollectionField(AlterCollectionFieldReq request) {
rpcUtils.retry(() -> collectionService.alterCollectionField(this.getRpcStub(), request));
}

/**
* Drop a field from collection.
*
* @param request drop field request
*/
public void dropCollectionField(DropCollectionFieldReq request) {
rpcUtils.retry(() -> collectionService.dropCollectionField(this.getRpcStub(), request));
}

/**
* drop a collection's properties.
*
Expand Down Expand Up @@ -643,6 +652,15 @@ public void addCollectionFunction(AddCollectionFunctionReq request) {
rpcUtils.retry(() -> collectionService.addCollectionFunction(this.getRpcStub(), request));
}

/**
* Add a function-backed field to collection.
*
* @param request add function field request
*/
public void addFunctionField(AddFunctionFieldReq request) {
rpcUtils.retry(() -> collectionService.addFunctionField(this.getRpcStub(), request));
}

/**
* Alter a function of collection.
*
Expand All @@ -654,13 +672,25 @@ public void alterCollectionFunction(AlterCollectionFunctionReq request) {

/**
* Drop a function of collection.
* This removes only the function definition and keeps its output field(s).
*
* @param request drop function request
*/
public void dropCollectionFunction(DropCollectionFunctionReq request) {
rpcUtils.retry(() -> collectionService.dropCollectionFunction(this.getRpcStub(), request));
}

/**
* Drop a function-backed field from collection.
* This removes the function and its output field(s), unlike dropCollectionFunction,
* which only drops the function definition.
*
* @param request drop function field request
*/
public void dropFunctionField(DropFunctionFieldReq request) {
rpcUtils.retry(() -> collectionService.dropFunctionField(this.getRpcStub(), request));
}

/////////////////////////////////////////////////////////////////////////////////////////////
// Index Operations
/////////////////////////////////////////////////////////////////////////////////////////////
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -343,6 +343,40 @@ public Void alterCollectionField(MilvusServiceGrpc.MilvusServiceBlockingStub blo
return null;
}

public Void dropCollectionField(MilvusServiceGrpc.MilvusServiceBlockingStub blockingStub, DropCollectionFieldReq request) {
String dbName = request.getDatabaseName();
String collectionName = request.getCollectionName();
String fieldName = request.getFieldName();
Long fieldId = request.getFieldId();
boolean hasFieldName = StringUtils.isNotBlank(fieldName);
boolean hasFieldId = fieldId != null && fieldId > 0;
if (hasFieldName == hasFieldId) {
throw new MilvusClientException(ErrorCode.INVALID_PARAMS,
"Exactly one of fieldName or fieldId must be provided.");
}

String title = String.format("Drop field of collection: '%s' in database: '%s'", collectionName, dbName);
AlterCollectionSchemaRequest.DropRequest.Builder dropBuilder = AlterCollectionSchemaRequest.DropRequest.newBuilder();
if (hasFieldName) {
dropBuilder.setFieldName(fieldName);
} else {
dropBuilder.setFieldId(fieldId);
}

AlterCollectionSchemaRequest.Builder builder = AlterCollectionSchemaRequest.newBuilder()
.setCollectionName(collectionName)
.setAction(AlterCollectionSchemaRequest.Action.newBuilder()
.setDropRequest(dropBuilder)
.build());
if (StringUtils.isNotEmpty(dbName)) {
builder.setDbName(dbName);
}

AlterCollectionSchemaResponse response = blockingStub.alterCollectionSchema(builder.build());
rpcUtils.handleResponse(title, response.getAlterStatus());
return null;
}

public Void dropCollectionProperties(MilvusServiceGrpc.MilvusServiceBlockingStub blockingStub, DropCollectionPropertiesReq request) {
String dbName = request.getDatabaseName();
String collectionName = request.getCollectionName();
Expand Down Expand Up @@ -697,6 +731,49 @@ public Void addCollectionFunction(MilvusServiceGrpc.MilvusServiceBlockingStub bl
return null;
}

public Void addFunctionField(MilvusServiceGrpc.MilvusServiceBlockingStub blockingStub,
AddFunctionFieldReq request) {
if (request.getFunction() == null) {
throw new MilvusClientException(ErrorCode.INVALID_PARAMS, "Function cannot be null.");
}
if (CollectionUtils.isEmpty(request.getFunction().getOutputFieldNames())
|| request.getFunction().getOutputFieldNames().size() != 1
|| !StringUtils.equals(request.getFieldName(), request.getFunction().getOutputFieldNames().get(0))) {
throw new MilvusClientException(ErrorCode.INVALID_PARAMS,
"Function must have exactly one output field matching the field being added.");
}

String dbName = request.getDatabaseName();
String collectionName = request.getCollectionName();
String title = String.format("Add function field to collection: '%s' in database: '%s'", collectionName, dbName);

CreateCollectionReq.FieldSchema fieldSchema = SchemaUtils.convertFieldReqToFieldSchema(request);
FieldSchema grpcFieldSchema = SchemaUtils.convertToGrpcFieldSchema(fieldSchema)
.toBuilder()
.setIsFunctionOutput(true)
.build();
AlterCollectionSchemaRequest.FieldInfo fieldInfo = AlterCollectionSchemaRequest.FieldInfo.newBuilder()
.setFieldSchema(grpcFieldSchema)
.build();
AlterCollectionSchemaRequest.AddRequest addRequest = AlterCollectionSchemaRequest.AddRequest.newBuilder()
.addFieldInfos(fieldInfo)
.addFuncSchema(SchemaUtils.convertToGrpcFunction(request.getFunction()))
Comment thread
yhmo marked this conversation as resolved.
.build();

AlterCollectionSchemaRequest.Builder builder = AlterCollectionSchemaRequest.newBuilder()
.setCollectionName(collectionName)
.setAction(AlterCollectionSchemaRequest.Action.newBuilder()
.setAddRequest(addRequest)
.build());
if (StringUtils.isNotEmpty(dbName)) {
builder.setDbName(dbName);
}

AlterCollectionSchemaResponse response = blockingStub.alterCollectionSchema(builder.build());
rpcUtils.handleResponse(title, response.getAlterStatus());
return null;
}

public Void alterCollectionFunction(MilvusServiceGrpc.MilvusServiceBlockingStub blockingStub,
AlterCollectionFunctionReq request) {
if (request.getFunction() == null) {
Expand Down Expand Up @@ -728,15 +805,47 @@ public Void dropCollectionFunction(MilvusServiceGrpc.MilvusServiceBlockingStub b
String dbName = request.getDatabaseName();
String collectionName = request.getCollectionName();
String title = String.format("Drop function to collection: '%s' in database: '%s'", collectionName, dbName);
DropCollectionFunctionRequest.Builder builder = DropCollectionFunctionRequest.newBuilder()
AlterCollectionSchemaRequest.Builder builder = AlterCollectionSchemaRequest.newBuilder()
.setCollectionName(collectionName)
.setFunctionName(request.getFunctionName());
.setAction(AlterCollectionSchemaRequest.Action.newBuilder()
.setDropRequest(AlterCollectionSchemaRequest.DropRequest.newBuilder()
.setFunctionName(request.getFunctionName())
.setDropFunctionOutputFields(false)
.build())
.build());
if (StringUtils.isNotEmpty(dbName)) {
builder.setDbName(dbName);
}

AlterCollectionSchemaResponse response = blockingStub.alterCollectionSchema(builder.build());
rpcUtils.handleResponse(title, response.getAlterStatus());

return null;
}

public Void dropFunctionField(MilvusServiceGrpc.MilvusServiceBlockingStub blockingStub,
DropFunctionFieldReq request) {
if (StringUtils.isEmpty(request.getFunctionName())) {
throw new MilvusClientException(ErrorCode.INVALID_PARAMS, "Function name cannot be empty.");
}

String dbName = request.getDatabaseName();
String collectionName = request.getCollectionName();
String title = String.format("Drop function field of collection: '%s' in database: '%s'", collectionName, dbName);
AlterCollectionSchemaRequest.Builder builder = AlterCollectionSchemaRequest.newBuilder()
.setCollectionName(collectionName)
.setAction(AlterCollectionSchemaRequest.Action.newBuilder()
.setDropRequest(AlterCollectionSchemaRequest.DropRequest.newBuilder()
.setFunctionName(request.getFunctionName())
.setDropFunctionOutputFields(true)
Comment thread
yhmo marked this conversation as resolved.
.build())
.build());
if (StringUtils.isNotEmpty(dbName)) {
builder.setDbName(dbName);
}
Status status = blockingStub.dropCollectionFunction(builder.build());
rpcUtils.handleResponse(title, status);

AlterCollectionSchemaResponse response = blockingStub.alterCollectionSchema(builder.build());
rpcUtils.handleResponse(title, response.getAlterStatus());
return null;
}

Expand Down
Loading
Loading