From 2946c2a6a361ee18faae5272dfd0eb558b3d1109 Mon Sep 17 00:00:00 2001 From: code2tan <495140477@qq.com> Date: Wed, 5 Jun 2024 00:29:37 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?=E9=80=BB=E8=BE=91=20=E6=B7=BB=E5=8A=A0=E9=9B=86=E5=90=88?= =?UTF-8?q?=E5=88=AB=E5=90=8D=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、修改注解支持别名配置 2、新增ICAliasService 3、修改测试用例支持别名 --- .../plus/annotation/MilvusCollection.java | 5 ++++ .../plus/converter/MilvusConverter.java | 22 +++++++++------ .../milvus/plus/model/MilvusEntity.java | 2 ++ .../service/AbstractMilvusClientBuilder.java | 18 ++++++++---- .../milvus/plus/service/ICAliasService.java | 28 +++++++++++++++++++ .../org/dromara/milvus/demo/model/Face.java | 2 +- 6 files changed, 63 insertions(+), 14 deletions(-) create mode 100644 milvus-plus-core/src/main/java/org/dromara/milvus/plus/service/ICAliasService.java diff --git a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/annotation/MilvusCollection.java b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/annotation/MilvusCollection.java index d206b54..227afdb 100644 --- a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/annotation/MilvusCollection.java +++ b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/annotation/MilvusCollection.java @@ -15,4 +15,9 @@ public @interface MilvusCollection { * 集合的名称 */ String name(); + + /** + * 集合别名 + */ + String alias() default ""; } \ No newline at end of file diff --git a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/converter/MilvusConverter.java b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/converter/MilvusConverter.java index 1c8144e..b7da735 100644 --- a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/converter/MilvusConverter.java +++ b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/converter/MilvusConverter.java @@ -39,7 +39,6 @@ public class MilvusConverter { * * @param entityClass 需要转换的Java实体类的Class对象。 * @return 转换后的MilvusEntity对象,包含了Milvus表的结构信息和索引参数。 - * * @throws IllegalArgumentException 如果实体类没有@MilvusCollection注解,则抛出异常。 */ public static MilvusEntity convert(Class entityClass) { @@ -48,11 +47,12 @@ public class MilvusConverter { return cache.getMilvusEntity(); } MilvusEntity milvus = new MilvusEntity(); - // 获取实体类上的@MilvusCollection注解,校验其存在性 + // 集合名称 MilvusCollection collectionAnnotation = entityClass.getAnnotation(MilvusCollection.class); if (Objects.isNull(collectionAnnotation)) { throw new IllegalArgumentException("Entity must be annotated with @MilvusCollection"); } + // 分区信息 MilvusPartition milvusPartition = entityClass.getAnnotation(MilvusPartition.class); if (Objects.nonNull(milvusPartition)) { String[] name = milvusPartition.name(); @@ -60,9 +60,14 @@ public class MilvusConverter { } else { milvus.setPartitionName(Lists.newArrayList()); } - // 从注解中读取集合(表)名称 + + // 集合名称 String collectionName = collectionAnnotation.name(); milvus.setCollectionName(collectionName); + // 集合别名 + if (!StringUtils.isBlank(collectionAnnotation.alias())) { + milvus.setAlias(collectionAnnotation.alias()); + } // 初始化字段列表和索引参数列表 List milvusFields = new ArrayList<>(); List indexParams = new ArrayList<>(); @@ -175,11 +180,12 @@ public class MilvusConverter { } return original.substring(0, 1).toUpperCase() + original.substring(1); } - public static void create(MilvusEntity milvusEntity, MilvusClientV2 client){ - List indexParams = milvusEntity.getIndexParams(); - if(indexParams==null||indexParams.isEmpty()){ - throw new IllegalArgumentException("the index does not exist, please define the index"); - } + + public static void create(MilvusEntity milvusEntity, MilvusClientV2 client) { + List indexParams = milvusEntity.getIndexParams(); + if (indexParams == null || indexParams.isEmpty()) { + throw new IllegalArgumentException("the index does not exist, please define the index"); + } // 创建新集合 CollectionSchemaBuilder schemaBuilder = new CollectionSchemaBuilder( milvusEntity.getCollectionName(), client diff --git a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/model/MilvusEntity.java b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/model/MilvusEntity.java index 7a6751c..d31d778 100644 --- a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/model/MilvusEntity.java +++ b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/model/MilvusEntity.java @@ -5,12 +5,14 @@ import io.milvus.v2.service.collection.request.AddFieldReq; import lombok.Data; import java.util.List; + /** * @author xgc **/ @Data public class MilvusEntity { private String collectionName; + private String alias; private List indexParams; private List milvusFields; private List partitionName; diff --git a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/service/AbstractMilvusClientBuilder.java b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/service/AbstractMilvusClientBuilder.java index f67c482..cbeeccd 100644 --- a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/service/AbstractMilvusClientBuilder.java +++ b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/service/AbstractMilvusClientBuilder.java @@ -5,8 +5,11 @@ import io.milvus.v2.client.MilvusClientV2; import io.milvus.v2.service.collection.request.ReleaseCollectionReq; import lombok.Setter; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.dromara.milvus.plus.annotation.MilvusCollection; import org.dromara.milvus.plus.cache.CollectionToPrimaryCache; +import org.dromara.milvus.plus.converter.MilvusConverter; +import org.dromara.milvus.plus.model.MilvusEntity; import org.dromara.milvus.plus.model.MilvusProperties; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; @@ -20,7 +23,7 @@ import java.util.*; import java.util.stream.Collectors; @Slf4j -public abstract class AbstractMilvusClientBuilder implements MilvusClientBuilder, ICMService { +public abstract class AbstractMilvusClientBuilder implements MilvusClientBuilder, ICMService, ICAliasService { @Setter protected MilvusProperties properties; @@ -48,7 +51,7 @@ public abstract class AbstractMilvusClientBuilder implements MilvusClientBuilder @Override public void close() throws InterruptedException { if (client != null) { - //释放集合+释放client + // 释放集合+释放client Set co = CollectionToPrimaryCache.collectionToPrimary.keySet(); if (!co.isEmpty()) { for (String name : co) { @@ -77,7 +80,7 @@ public abstract class AbstractMilvusClientBuilder implements MilvusClientBuilder return client; } - //获取指定包下实体类 + // 获取指定包下实体类 private List> getClass(List packages) { ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver(); return Optional.ofNullable(packages) @@ -107,10 +110,15 @@ public abstract class AbstractMilvusClientBuilder implements MilvusClientBuilder .collect(Collectors.toList()); } - //缓存 + 是否构建集合 + // 缓存 + 是否构建集合 public void performBusinessLogic(List> annotatedClasses) { for (Class milvusClass : annotatedClasses) { - createCollection(milvusClass); + MilvusEntity milvusEntity = MilvusConverter.convert(milvusClass); + createCollection(milvusEntity); + if (StringUtils.isBlank(milvusEntity.getAlias())) { + continue; + } + createAlias(milvusEntity); } } } \ No newline at end of file diff --git a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/service/ICAliasService.java b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/service/ICAliasService.java new file mode 100644 index 0000000..d3c1c91 --- /dev/null +++ b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/service/ICAliasService.java @@ -0,0 +1,28 @@ +package org.dromara.milvus.plus.service; + +import io.milvus.v2.client.MilvusClientV2; +import io.milvus.v2.service.utility.request.CreateAliasReq; +import org.dromara.milvus.plus.converter.MilvusConverter; +import org.dromara.milvus.plus.model.MilvusEntity; + +/** + * 集合别名 + * + * @author code2tan + */ +public interface ICAliasService { + MilvusClientV2 getClient(); + + + default void createAlias(MilvusEntity milvusEntity) { + MilvusClientV2 client = getClient(); + CreateAliasReq createAliasReq = CreateAliasReq.builder().alias(milvusEntity.getAlias()) + .collectionName(milvusEntity.getCollectionName()).build(); + client.createAlias(createAliasReq); + } + + default void createAlias(Class milvusClass) { + MilvusEntity milvusEntity = MilvusConverter.convert(milvusClass); + createAlias(milvusEntity); + } +} diff --git a/milvus-spring-demo/src/main/java/org/dromara/milvus/demo/model/Face.java b/milvus-spring-demo/src/main/java/org/dromara/milvus/demo/model/Face.java index 9e6047b..813fa0b 100644 --- a/milvus-spring-demo/src/main/java/org/dromara/milvus/demo/model/Face.java +++ b/milvus-spring-demo/src/main/java/org/dromara/milvus/demo/model/Face.java @@ -8,7 +8,7 @@ import org.dromara.milvus.plus.annotation.*; import java.util.List; @Data -@MilvusCollection(name = "face_collection") // 指定Milvus集合的名称 +@MilvusCollection(name = "face_collection", alias = "my_face") @MilvusPartition(name = {"face_001","face_002"}) public class Face { @MilvusField( From 2f91e24f1299298bbc9974eaa4f4868587c4f1f5 Mon Sep 17 00:00:00 2001 From: code2tan <495140477@qq.com> Date: Wed, 5 Jun 2024 11:08:55 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=E9=87=8D=E6=9E=84=E5=88=AB?= =?UTF-8?q?=E5=90=8D=E6=94=AF=E6=8C=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、去除ICAliasService,合并到ICMService 2、支持配置过个别名 --- .../plus/annotation/MilvusCollection.java | 4 +- .../plus/converter/MilvusConverter.java | 5 +- .../milvus/plus/model/MilvusEntity.java | 2 +- .../service/AbstractMilvusClientBuilder.java | 26 ++++++++-- .../milvus/plus/service/ICAliasService.java | 28 ---------- .../milvus/plus/service/ICMService.java | 52 +++++++++++++++++++ .../org/dromara/milvus/demo/model/Face.java | 4 +- 7 files changed, 81 insertions(+), 40 deletions(-) delete mode 100644 milvus-plus-core/src/main/java/org/dromara/milvus/plus/service/ICAliasService.java diff --git a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/annotation/MilvusCollection.java b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/annotation/MilvusCollection.java index 227afdb..cc36d13 100644 --- a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/annotation/MilvusCollection.java +++ b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/annotation/MilvusCollection.java @@ -17,7 +17,7 @@ public @interface MilvusCollection { String name(); /** - * 集合别名 + * */ - String alias() default ""; + String[] alias() default {}; } \ No newline at end of file diff --git a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/converter/MilvusConverter.java b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/converter/MilvusConverter.java index b7da735..189c68e 100644 --- a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/converter/MilvusConverter.java +++ b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/converter/MilvusConverter.java @@ -39,6 +39,7 @@ public class MilvusConverter { * * @param entityClass 需要转换的Java实体类的Class对象。 * @return 转换后的MilvusEntity对象,包含了Milvus表的结构信息和索引参数。 + * * @throws IllegalArgumentException 如果实体类没有@MilvusCollection注解,则抛出异常。 */ public static MilvusEntity convert(Class entityClass) { @@ -65,8 +66,8 @@ public class MilvusConverter { String collectionName = collectionAnnotation.name(); milvus.setCollectionName(collectionName); // 集合别名 - if (!StringUtils.isBlank(collectionAnnotation.alias())) { - milvus.setAlias(collectionAnnotation.alias()); + if (collectionAnnotation.alias().length > 0) { + milvus.setAlias(Arrays.asList(collectionAnnotation.alias())); } // 初始化字段列表和索引参数列表 List milvusFields = new ArrayList<>(); diff --git a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/model/MilvusEntity.java b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/model/MilvusEntity.java index d31d778..78c5919 100644 --- a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/model/MilvusEntity.java +++ b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/model/MilvusEntity.java @@ -12,7 +12,7 @@ import java.util.List; @Data public class MilvusEntity { private String collectionName; - private String alias; + private List alias; private List indexParams; private List milvusFields; private List partitionName; diff --git a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/service/AbstractMilvusClientBuilder.java b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/service/AbstractMilvusClientBuilder.java index cbeeccd..1b72179 100644 --- a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/service/AbstractMilvusClientBuilder.java +++ b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/service/AbstractMilvusClientBuilder.java @@ -3,6 +3,7 @@ package org.dromara.milvus.plus.service; import io.milvus.v2.client.ConnectConfig; import io.milvus.v2.client.MilvusClientV2; import io.milvus.v2.service.collection.request.ReleaseCollectionReq; +import io.milvus.v2.service.utility.response.ListAliasResp; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -23,7 +24,7 @@ import java.util.*; import java.util.stream.Collectors; @Slf4j -public abstract class AbstractMilvusClientBuilder implements MilvusClientBuilder, ICMService, ICAliasService { +public abstract class AbstractMilvusClientBuilder implements MilvusClientBuilder, ICMService { @Setter protected MilvusProperties properties; @@ -115,10 +116,25 @@ public abstract class AbstractMilvusClientBuilder implements MilvusClientBuilder for (Class milvusClass : annotatedClasses) { MilvusEntity milvusEntity = MilvusConverter.convert(milvusClass); createCollection(milvusEntity); - if (StringUtils.isBlank(milvusEntity.getAlias())) { - continue; - } - createAlias(milvusEntity); + aliasProcess(milvusEntity); } } + + private void aliasProcess(MilvusEntity milvusEntity) { + if (StringUtils.isBlank(milvusEntity.getCollectionName()) || milvusEntity.getAlias().isEmpty()) { + return; + } + ListAliasResp listAliasResp = listAliases(milvusEntity); + Optional.ofNullable(listAliasResp) + .ifPresent(aliasInfo -> { + // 获取不存在的别名 + List aliasList = milvusEntity.getAlias().stream() + .filter(e -> !aliasInfo.getAlias().contains(e)) + .filter(StringUtils::isNotBlank) + .collect(Collectors.toList()); + log.info("processing alias: {}", aliasList); + milvusEntity.setAlias(aliasList); + createAlias(milvusEntity); + }); + } } \ No newline at end of file diff --git a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/service/ICAliasService.java b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/service/ICAliasService.java deleted file mode 100644 index d3c1c91..0000000 --- a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/service/ICAliasService.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.dromara.milvus.plus.service; - -import io.milvus.v2.client.MilvusClientV2; -import io.milvus.v2.service.utility.request.CreateAliasReq; -import org.dromara.milvus.plus.converter.MilvusConverter; -import org.dromara.milvus.plus.model.MilvusEntity; - -/** - * 集合别名 - * - * @author code2tan - */ -public interface ICAliasService { - MilvusClientV2 getClient(); - - - default void createAlias(MilvusEntity milvusEntity) { - MilvusClientV2 client = getClient(); - CreateAliasReq createAliasReq = CreateAliasReq.builder().alias(milvusEntity.getAlias()) - .collectionName(milvusEntity.getCollectionName()).build(); - client.createAlias(createAliasReq); - } - - default void createAlias(Class milvusClass) { - MilvusEntity milvusEntity = MilvusConverter.convert(milvusClass); - createAlias(milvusEntity); - } -} diff --git a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/service/ICMService.java b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/service/ICMService.java index d4ed2bd..a4665c4 100644 --- a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/service/ICMService.java +++ b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/service/ICMService.java @@ -11,6 +11,11 @@ import io.milvus.v2.service.index.request.DescribeIndexReq; import io.milvus.v2.service.index.request.DropIndexReq; import io.milvus.v2.service.index.response.DescribeIndexResp; import io.milvus.v2.service.partition.request.*; +import io.milvus.v2.service.utility.request.AlterAliasReq; +import io.milvus.v2.service.utility.request.CreateAliasReq; +import io.milvus.v2.service.utility.request.DropAliasReq; +import io.milvus.v2.service.utility.request.ListAliasesReq; +import io.milvus.v2.service.utility.response.ListAliasResp; import org.apache.commons.lang3.StringUtils; import org.dromara.milvus.plus.builder.CollectionSchemaBuilder; import org.dromara.milvus.plus.converter.MilvusConverter; @@ -423,5 +428,52 @@ public interface ICMService { releasePartitions(collectionName, Collections.singletonList(partitionName)); } + /** + * create aliases + */ + default void createAlias(MilvusEntity milvusEntity) { + MilvusClientV2 client = getClient(); + for (String alias : milvusEntity.getAlias()) { + CreateAliasReq createAliasReq = CreateAliasReq.builder().alias(alias) + .collectionName(milvusEntity.getCollectionName()).build(); + client.createAlias(createAliasReq); + } + } + default void createAlias(Class milvusClass) { + MilvusEntity milvusEntity = MilvusConverter.convert(milvusClass); + createAlias(milvusEntity); + } + + /** + * drop aliases + */ + default void dropAlias(MilvusEntity milvusEntity) { + MilvusClientV2 client = getClient(); + for (String alias : milvusEntity.getAlias()) { + client.dropAlias(DropAliasReq.builder().alias(alias).build()); + } + } + + /** + * alter aliases + */ + default void alterAlias(MilvusEntity milvusEntity) { + MilvusClientV2 client = getClient(); + for (String alias : milvusEntity.getAlias()) { + client.alterAlias(AlterAliasReq.builder() + .collectionName(milvusEntity.getCollectionName()) + .alias(alias).build()); + } + } + + /** + * list aliases + * + * @return List alias names + */ + default ListAliasResp listAliases(MilvusEntity milvusEntity) { + MilvusClientV2 client = getClient(); + return client.listAliases(ListAliasesReq.builder().collectionName(milvusEntity.getCollectionName()).build()); + } } diff --git a/milvus-spring-demo/src/main/java/org/dromara/milvus/demo/model/Face.java b/milvus-spring-demo/src/main/java/org/dromara/milvus/demo/model/Face.java index 813fa0b..1f75b37 100644 --- a/milvus-spring-demo/src/main/java/org/dromara/milvus/demo/model/Face.java +++ b/milvus-spring-demo/src/main/java/org/dromara/milvus/demo/model/Face.java @@ -8,8 +8,8 @@ import org.dromara.milvus.plus.annotation.*; import java.util.List; @Data -@MilvusCollection(name = "face_collection", alias = "my_face") -@MilvusPartition(name = {"face_001","face_002"}) +@MilvusCollection(name = "face_collection", alias = {"alias_face"}) +@MilvusPartition(name = {"face_001", "face_002"}) public class Face { @MilvusField( name = "person_id", // 字段名称