diff --git a/easy-es-annotation/src/main/java/org/dromara/easyes/annotation/Signature.java b/easy-es-annotation/src/main/java/org/dromara/easyes/annotation/Signature.java index 23e3ca81..a51cd13c 100644 --- a/easy-es-annotation/src/main/java/org/dromara/easyes/annotation/Signature.java +++ b/easy-es-annotation/src/main/java/org/dromara/easyes/annotation/Signature.java @@ -39,4 +39,10 @@ public @interface Signature { */ Class[] args(); + /** + * use regexp + * + * @return java method name is use regexp + */ + boolean useRegexp() default false; } diff --git a/easy-es-extension/src/main/java/org/dromara/easyes/extension/plugins/Plugin.java b/easy-es-extension/src/main/java/org/dromara/easyes/extension/plugins/Plugin.java index cc99d957..d2b2632e 100644 --- a/easy-es-extension/src/main/java/org/dromara/easyes/extension/plugins/Plugin.java +++ b/easy-es-extension/src/main/java/org/dromara/easyes/extension/plugins/Plugin.java @@ -3,6 +3,8 @@ package org.dromara.easyes.extension.plugins; import org.dromara.easyes.annotation.Intercepts; import org.dromara.easyes.annotation.Signature; +import org.dromara.easyes.common.exception.EasyEsException; +import org.dromara.easyes.common.utils.CollectionUtils; import org.dromara.easyes.common.utils.ExceptionUtils; import org.dromara.easyes.extension.context.Interceptor; import org.dromara.easyes.extension.context.Invocation; @@ -10,10 +12,9 @@ import org.dromara.easyes.extension.context.Invocation; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; +import java.util.regex.Pattern; +import java.util.stream.Collectors; /** *

@@ -76,14 +77,26 @@ public class Plugin implements InvocationHandler { // 检查被@Signature标记的方法是否存在 for (Signature sig : sigs) { Set methods = signatureMap.computeIfAbsent(sig.type(), k -> new HashSet<>()); - try { - Method method = sig.type().getMethod(sig.method(), sig.args()); - methods.add(method); - } catch (NoSuchMethodException e) { - throw new RuntimeException("Could not find method on " + sig.type() + " named " + sig.method() + ". Cause: " + e, e); + if (sig.useRegexp()) { + Pattern pattern = Pattern.compile(sig.method()); + Set methodSet = Arrays.stream(sig.type().getMethods()) + .filter(item -> pattern.matcher(item.getName()).matches()) + .collect(Collectors.toSet()); + + if (CollectionUtils.isEmpty(methodSet)) { + throw new EasyEsException("This regular expression does not match any methods:" + sig.type() + " named " + sig.method()); + } + methods.addAll(methodSet); + } else { + try { + Method method = sig.type().getMethod(sig.method(), sig.args()); + methods.add(method); + } catch (NoSuchMethodException e) { + throw new EasyEsException("Could not find method on " + sig.type() + " named " + sig.method() + ". Cause: " + e, e); + } } } return signatureMap; } +} -} \ No newline at end of file diff --git a/easy-es-test/src/test/java/org/dromara/easyes/test/interceptor/TenantLineInnerInterceptor.java b/easy-es-test/src/test/java/org/dromara/easyes/test/interceptor/TenantLineInnerInterceptor.java new file mode 100644 index 00000000..965cdf95 --- /dev/null +++ b/easy-es-test/src/test/java/org/dromara/easyes/test/interceptor/TenantLineInnerInterceptor.java @@ -0,0 +1,58 @@ +package org.dromara.easyes.test.interceptor; + +import org.dromara.easyes.annotation.Intercepts; +import org.dromara.easyes.annotation.Signature; +import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper; +import org.dromara.easyes.core.kernel.BaseEsMapper; +import org.dromara.easyes.extension.context.Interceptor; +import org.dromara.easyes.extension.context.Invocation; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.client.RequestOptions; +import org.springframework.stereotype.Component; + +/** + * 文件描述 + * + * @ProductName: Hundsun HEP + * @ProjectName: easy-es + * @Package: org.dromara.easyes.test.interceptor + * @Description: note + * @Author: xingpc37977 + * @Date: 2025/2/1 19:35 + * @UpdateUser: xingpc37977 + * @UpdateDate: 2025/2/1 19:35 + * @UpdateRemark: The modified content + * @Version: 1.0 + *

+ * Copyright © 2025 Hundsun Technologies Inc. All Rights Reserved + **/ + +/** + * 测试方法使用正则表达式 + * + * @author huangjy + */ +@Intercepts( + { + @Signature(type = BaseEsMapper.class, method = "select.*", args = {LambdaEsQueryWrapper.class}, useRegexp = true), + @Signature(type = BaseEsMapper.class, method = "search", args = {SearchRequest.class, RequestOptions.class}), + @Signature(type = BaseEsMapper.class, method = "insert|update", args = {Object.class}, useRegexp = true), + @Signature(type = BaseEsMapper.class, method = ".*ById", args = {Object.class}, useRegexp = true), + } +) +@Component +public class TenantLineInnerInterceptor implements Interceptor { + @Override + public Object intercept(Invocation invocation) throws Throwable { + // TODO 这里可以写你自己的拦截处理逻辑,此处仅打印 + // Object[] args = invocation.getArgs(); + // Object arg = args[0]; + // if (arg instanceof LambdaEsQueryWrapper) { + // LambdaEsQueryWrapper wrapper = ((LambdaEsQueryWrapper) args[0]); + // wrapper.eq("tenantId", "1"); + // return invocation.proceed(); + // } + System.out.println("增则拦截方法"); + return invocation.proceed(); + } +} diff --git a/easy-es-test/src/test/java/org/dromara/easyes/test/performance/PerformanceTest.java b/easy-es-test/src/test/java/org/dromara/easyes/test/performance/PerformanceTest.java index fbf93815..e61f527d 100644 --- a/easy-es-test/src/test/java/org/dromara/easyes/test/performance/PerformanceTest.java +++ b/easy-es-test/src/test/java/org/dromara/easyes/test/performance/PerformanceTest.java @@ -15,11 +15,11 @@ import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.update.UpdateRequest; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; -import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; +import org.elasticsearch.xcontent.XContentType; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest;