From 6227b99cee691294856b701421a5045987e6782a Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Mon, 6 Jan 2025 23:53:07 +0800 Subject: [PATCH 01/21] =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ModuleInjectionLimiter.java} | 13 +-- .../config/DoriveInjectionConfiguration.java | 35 +++--- ...nDefinition.java => ExportDefinition.java} | 6 +- .../ModuleDefinition.java} | 21 ++-- ...ava => DefaultModuleInjectionLimiter.java} | 104 ++++++++---------- .../LimitedAutowiredBeanPostProcessor.java | 20 ++-- ...CglibSubclassingInstantiationStrategy.java | 18 +-- .../spring/LimitedRootInitializingBean.java | 53 --------- .../gitee/dorive/inject/util/AopUtils.java | 43 -------- .../spring-configuration-metadata.json | 6 +- 10 files changed, 99 insertions(+), 220 deletions(-) rename dorive-inject/src/main/java/com/gitee/dorive/inject/{annotation/Root.java => api/ModuleInjectionLimiter.java} (80%) rename dorive-inject/src/main/java/com/gitee/dorive/inject/entity/{DomainDefinition.java => ExportDefinition.java} (89%) rename dorive-inject/src/main/java/com/gitee/dorive/inject/{api/TypeDomainResolver.java => entity/ModuleDefinition.java} (69%) rename dorive-inject/src/main/java/com/gitee/dorive/inject/impl/{DefaultTypeDomainResolver.java => DefaultModuleInjectionLimiter.java} (35%) delete mode 100644 dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedRootInitializingBean.java delete mode 100644 dorive-inject/src/main/java/com/gitee/dorive/inject/util/AopUtils.java diff --git a/dorive-inject/src/main/java/com/gitee/dorive/inject/annotation/Root.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/api/ModuleInjectionLimiter.java similarity index 80% rename from dorive-inject/src/main/java/com/gitee/dorive/inject/annotation/Root.java rename to dorive-inject/src/main/java/com/gitee/dorive/inject/api/ModuleInjectionLimiter.java index 00531fef..77ee93ed 100644 --- a/dorive-inject/src/main/java/com/gitee/dorive/inject/annotation/Root.java +++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/api/ModuleInjectionLimiter.java @@ -15,13 +15,12 @@ * limitations under the License. */ -package com.gitee.dorive.inject.annotation; +package com.gitee.dorive.inject.api; -import java.lang.annotation.*; +public interface ModuleInjectionLimiter { + + boolean isUnderScanPackage(Class typeToMatch); + + void checkInjectedType(Class type, Class injectedType); -@Inherited -@Documented -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.RUNTIME) -public @interface Root { } diff --git a/dorive-inject/src/main/java/com/gitee/dorive/inject/config/DoriveInjectionConfiguration.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/config/DoriveInjectionConfiguration.java index 3fd6e0b8..3f9a1616 100644 --- a/dorive-inject/src/main/java/com/gitee/dorive/inject/config/DoriveInjectionConfiguration.java +++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/config/DoriveInjectionConfiguration.java @@ -18,12 +18,11 @@ package com.gitee.dorive.inject.config; import cn.hutool.core.lang.Assert; -import com.gitee.dorive.inject.impl.DefaultTypeDomainResolver; +import com.gitee.dorive.inject.impl.DefaultModuleInjectionLimiter; import com.gitee.dorive.inject.spring.LimitedAutowiredBeanPostProcessor; import com.gitee.dorive.inject.spring.LimitedCglibSubclassingInstantiationStrategy; -import com.gitee.dorive.inject.spring.LimitedRootInitializingBean; -import com.gitee.dorive.inject.api.TypeDomainResolver; -import com.gitee.dorive.inject.entity.DomainDefinition; +import com.gitee.dorive.inject.api.ModuleInjectionLimiter; +import com.gitee.dorive.inject.entity.ModuleDefinition; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; @@ -44,8 +43,8 @@ import java.util.List; @ConditionalOnProperty(prefix = "dorive", name = "enable", havingValue = "true") public class DoriveInjectionConfiguration implements BeanFactoryPostProcessor { - public static final String SCAN_KEY = "dorive.scan"; - public static final String DOMAINS_KEY = "dorive.domains"; + public static final String DORIVE_SCAN_KEY = "dorive.scan"; + public static final String DORIVE_MODULES_KEY = "dorive.modules"; @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { @@ -55,26 +54,20 @@ public class DoriveInjectionConfiguration implements BeanFactoryPostProcessor { } } - @Bean("typeDomainResolverV3") + @Bean("moduleInjectionLimiterV3") @ConditionalOnMissingClass - public TypeDomainResolver typeDomainResolver(Environment environment) { - String scanPackage = environment.getProperty(SCAN_KEY); - Assert.notBlank(scanPackage, "The configuration item could not be found! name: [spring.domain.scan]"); - List domainDefinitions = Binder.get(environment).bind(DOMAINS_KEY, Bindable.listOf(DomainDefinition.class)).get(); - domainDefinitions.sort((o1, o2) -> o2.getName().compareTo(o1.getName())); - return new DefaultTypeDomainResolver(scanPackage, domainDefinitions); + public ModuleInjectionLimiter moduleInjectionLimiter(Environment environment) { + String scanPackage = environment.getProperty(DORIVE_SCAN_KEY); + Assert.notBlank(scanPackage, "The configuration item could not be found! name: {}", DORIVE_SCAN_KEY); + List moduleDefinitions = Binder.get(environment).bind(DORIVE_MODULES_KEY, Bindable.listOf(ModuleDefinition.class)).get(); + moduleDefinitions.sort((o1, o2) -> o2.getName().compareTo(o1.getName())); + return new DefaultModuleInjectionLimiter(scanPackage, moduleDefinitions); } @Bean("limitedAnnotationBeanPostProcessorV3") @ConditionalOnMissingClass - public LimitedAutowiredBeanPostProcessor limitedAnnotationBeanPostProcessor(TypeDomainResolver typeDomainResolver) { - return new LimitedAutowiredBeanPostProcessor(typeDomainResolver); - } - - @Bean("limitedRootInitializingBeanV3") - @ConditionalOnMissingClass - public LimitedRootInitializingBean limitedRootInitializingBean(TypeDomainResolver typeDomainResolver) { - return new LimitedRootInitializingBean(typeDomainResolver); + public LimitedAutowiredBeanPostProcessor limitedAnnotationBeanPostProcessor(ModuleInjectionLimiter moduleInjectionLimiter) { + return new LimitedAutowiredBeanPostProcessor(moduleInjectionLimiter); } } diff --git a/dorive-inject/src/main/java/com/gitee/dorive/inject/entity/DomainDefinition.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/entity/ExportDefinition.java similarity index 89% rename from dorive-inject/src/main/java/com/gitee/dorive/inject/entity/DomainDefinition.java rename to dorive-inject/src/main/java/com/gitee/dorive/inject/entity/ExportDefinition.java index afc5e0d1..702e14ce 100644 --- a/dorive-inject/src/main/java/com/gitee/dorive/inject/entity/DomainDefinition.java +++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/entity/ExportDefinition.java @@ -22,8 +22,6 @@ import lombok.Data; @Data @AllArgsConstructor -public class DomainDefinition { - private String name; - private String pattern; - private String protect; +public class ExportDefinition { + private String path; } diff --git a/dorive-inject/src/main/java/com/gitee/dorive/inject/api/TypeDomainResolver.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/entity/ModuleDefinition.java similarity index 69% rename from dorive-inject/src/main/java/com/gitee/dorive/inject/api/TypeDomainResolver.java rename to dorive-inject/src/main/java/com/gitee/dorive/inject/entity/ModuleDefinition.java index 1ea67118..38c7561a 100644 --- a/dorive-inject/src/main/java/com/gitee/dorive/inject/api/TypeDomainResolver.java +++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/entity/ModuleDefinition.java @@ -15,18 +15,17 @@ * limitations under the License. */ -package com.gitee.dorive.inject.api; +package com.gitee.dorive.inject.entity; -import com.gitee.dorive.inject.entity.DomainDefinition; +import lombok.AllArgsConstructor; +import lombok.Data; -public interface TypeDomainResolver { - - boolean isUnderScanPackage(Class typeToMatch); - - DomainDefinition getDomainDefinition(Class typeToMatch); - - void checkDomain(Class type, Class injectedType); - - void checkProtection(Class type); +import java.util.List; +@Data +@AllArgsConstructor +public class ModuleDefinition { + private String name; + private String path; + private List exports; } diff --git a/dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultTypeDomainResolver.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultModuleInjectionLimiter.java similarity index 35% rename from dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultTypeDomainResolver.java rename to dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultModuleInjectionLimiter.java index 39015df1..50ce955e 100644 --- a/dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultTypeDomainResolver.java +++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultModuleInjectionLimiter.java @@ -18,26 +18,23 @@ package com.gitee.dorive.inject.impl; import cn.hutool.core.collection.CollUtil; -import com.gitee.dorive.inject.annotation.Root; -import com.gitee.dorive.inject.api.TypeDomainResolver; -import com.gitee.dorive.inject.entity.DomainDefinition; -import org.apache.commons.lang3.StringUtils; +import com.gitee.dorive.inject.api.ModuleInjectionLimiter; +import com.gitee.dorive.inject.entity.ExportDefinition; +import com.gitee.dorive.inject.entity.ModuleDefinition; import org.springframework.beans.factory.BeanCreationException; -import org.springframework.core.annotation.AnnotationUtils; import org.springframework.util.AntPathMatcher; import java.util.List; -import java.util.Objects; -public class DefaultTypeDomainResolver implements TypeDomainResolver { +public class DefaultModuleInjectionLimiter implements ModuleInjectionLimiter { private final AntPathMatcher antPathMatcher = new AntPathMatcher("."); private final String scanPackage; - private final List domainDefinitions; + private final List moduleDefinitions; - public DefaultTypeDomainResolver(String scanPackage, List domainDefinitions) { + public DefaultModuleInjectionLimiter(String scanPackage, List moduleDefinitions) { this.scanPackage = scanPackage; - this.domainDefinitions = domainDefinitions; + this.moduleDefinitions = moduleDefinitions; } @Override @@ -46,59 +43,50 @@ public class DefaultTypeDomainResolver implements TypeDomainResolver { } @Override - public DomainDefinition getDomainDefinition(Class typeToMatch) { - return CollUtil.findOne(domainDefinitions, item -> antPathMatcher.match(item.getPattern(), typeToMatch.getName())); - } - - @Override - public void checkDomain(Class type, Class injectedType) { - Root rootAnnotation = AnnotationUtils.getAnnotation(injectedType, Root.class); - if (rootAnnotation != null) { - return; - } - - DomainDefinition injectedDomainDefinition = getDomainDefinition(injectedType); - if (injectedDomainDefinition == null) { - return; - } - - DomainDefinition domainDefinition = getDomainDefinition(type); - if (domainDefinition == null) { - throwInjectionException(type, null, injectedType, injectedDomainDefinition.getName()); - return; - } - - String domainName = domainDefinition.getName(); - String injectedDomainName = injectedDomainDefinition.getName(); - - boolean isSameDomain = Objects.equals(domainName, injectedDomainName); - boolean isSubdomain = domainName.startsWith(injectedDomainName + "-"); - - if (!isSameDomain && !isSubdomain) { - throwInjectionException(type, domainName, injectedType, injectedDomainName); + public void checkInjectedType(Class type, Class injectedType) { + if (isUnderScanPackage(injectedType)) { + ModuleDefinition moduleDefinition = findModuleDefinition(injectedType); + // 模块定义不存在,则判定为通过 + if (moduleDefinition == null) { + return; + } + // 在公开的包路径下,则判定为通过 + String typeName = injectedType.getName(); + List exportDefinitions = moduleDefinition.getExports(); + for (ExportDefinition exportDefinition : exportDefinitions) { + String path = exportDefinition.getPath(); + if (antPathMatcher.match(path, typeName)) { + return; + } + } + // 模块 + if (isUnderScanPackage(type)) { + ModuleDefinition thisModuleDefinition = findModuleDefinition(type); + if (thisModuleDefinition != null) { + String thisModuleName = thisModuleDefinition.getName(); + String moduleName = moduleDefinition.getName(); + // 相同模块 + if (thisModuleName.equals(moduleName)) { + return; + } + // 子模块允许引用父模块 + if (thisModuleName.startsWith(moduleName + "-") || thisModuleName.startsWith(moduleName + "_")) { + return; + } + } + } + // 抛出异常 + throwInjectionException(type, injectedType); } } - private void throwInjectionException(Class type, String domainName, Class injectedType, String injectedDomainName) { - String message = String.format("Injection of autowired dependencies failed! type: [%s], domain: [%s], injectedType: [%s], injectedDomain: [%s]", - type.getName(), domainName, injectedType.getName(), injectedDomainName); - throw new BeanCreationException(message); + private ModuleDefinition findModuleDefinition(Class typeToMatch) { + return CollUtil.findOne(moduleDefinitions, item -> antPathMatcher.match(item.getPath(), typeToMatch.getName())); } - @Override - public void checkProtection(Class type) { - DomainDefinition domainDefinition = getDomainDefinition(type); - if (domainDefinition == null) { - return; - } - - String protect = domainDefinition.getProtect(); - String typeName = type.getName(); - - if (StringUtils.isNotBlank(protect) && antPathMatcher.match(protect, typeName)) { - String message = String.format("The type with @Root annotation is protected! protect: [%s], type: [%s]", protect, typeName); - throw new BeanCreationException(message); - } + private void throwInjectionException(Class type, Class injectedType) { + String message = String.format("Injection of autowired dependencies failed! type: %s, injectedType: %s", type.getName(), injectedType.getName()); + throw new BeanCreationException(message); } } diff --git a/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedAutowiredBeanPostProcessor.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedAutowiredBeanPostProcessor.java index d28be76e..122384c2 100644 --- a/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedAutowiredBeanPostProcessor.java +++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedAutowiredBeanPostProcessor.java @@ -17,7 +17,7 @@ package com.gitee.dorive.inject.spring; -import com.gitee.dorive.inject.api.TypeDomainResolver; +import com.gitee.dorive.inject.api.ModuleInjectionLimiter; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -39,12 +39,12 @@ import java.util.*; public class LimitedAutowiredBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter implements MergedBeanDefinitionPostProcessor { protected final Log logger = LogFactory.getLog(getClass()); - private final TypeDomainResolver typeDomainResolver; + private final ModuleInjectionLimiter moduleInjectionLimiter; private final Set> autowiredAnnotationTypes = new LinkedHashSet<>(4); @SuppressWarnings("unchecked") - public LimitedAutowiredBeanPostProcessor(TypeDomainResolver typeDomainResolver) { - this.typeDomainResolver = typeDomainResolver; + public LimitedAutowiredBeanPostProcessor(ModuleInjectionLimiter moduleInjectionLimiter) { + this.moduleInjectionLimiter = moduleInjectionLimiter; this.autowiredAnnotationTypes.add(Autowired.class); try { this.autowiredAnnotationTypes.add((Class) @@ -57,7 +57,7 @@ public class LimitedAutowiredBeanPostProcessor extends InstantiationAwareBeanPos @Override public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class beanType, String beanName) { - checkAutowiredFieldDomain(beanType); + checkAutowiredFieldModule(beanType); } @Override @@ -65,7 +65,7 @@ public class LimitedAutowiredBeanPostProcessor extends InstantiationAwareBeanPos // ignore } - private void checkAutowiredFieldDomain(final Class clazz) { + private void checkAutowiredFieldModule(final Class clazz) { ReflectionUtils.doWithLocalFields(clazz, field -> { AnnotationAttributes ann = findAutowiredAnnotation(field); if (ann != null) { @@ -75,7 +75,7 @@ public class LimitedAutowiredBeanPostProcessor extends InstantiationAwareBeanPos } return; } - doCheckAutowiredFieldDomain(clazz, field); + doCheckAutowiredFieldModule(clazz, field); } }); } @@ -93,10 +93,8 @@ public class LimitedAutowiredBeanPostProcessor extends InstantiationAwareBeanPos return null; } - private void doCheckAutowiredFieldDomain(Class clazz, Field field) { - if (typeDomainResolver.isUnderScanPackage(clazz) && typeDomainResolver.isUnderScanPackage(field.getType())) { - typeDomainResolver.checkDomain(clazz, field.getType()); - } + private void doCheckAutowiredFieldModule(Class clazz, Field field) { + moduleInjectionLimiter.checkInjectedType(clazz, field.getType()); } } diff --git a/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedCglibSubclassingInstantiationStrategy.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedCglibSubclassingInstantiationStrategy.java index 50bb20ec..ba27f497 100644 --- a/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedCglibSubclassingInstantiationStrategy.java +++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedCglibSubclassingInstantiationStrategy.java @@ -17,7 +17,7 @@ package com.gitee.dorive.inject.spring; -import com.gitee.dorive.inject.api.TypeDomainResolver; +import com.gitee.dorive.inject.api.ModuleInjectionLimiter; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.support.CglibSubclassingInstantiationStrategy; import org.springframework.beans.factory.support.RootBeanDefinition; @@ -26,17 +26,17 @@ import java.lang.reflect.Constructor; public class LimitedCglibSubclassingInstantiationStrategy extends CglibSubclassingInstantiationStrategy { - private TypeDomainResolver typeDomainResolver; + private ModuleInjectionLimiter moduleInjectionLimiter; @Override public Object instantiate(RootBeanDefinition bd, String beanName, BeanFactory owner, Constructor ctor, Object... args) { tryGetResolverFromContext(owner); - if (typeDomainResolver != null) { + if (moduleInjectionLimiter != null) { Class resolvableType = (Class) bd.getResolvableType().getType(); - if (isNotSpringInternalType(resolvableType) && typeDomainResolver.isUnderScanPackage(resolvableType)) { + if (isNotSpringInternalType(resolvableType) && moduleInjectionLimiter.isUnderScanPackage(resolvableType)) { for (Class parameterType : ctor.getParameterTypes()) { - if (isNotSpringInternalType(parameterType) && typeDomainResolver.isUnderScanPackage(parameterType)) { - typeDomainResolver.checkDomain(resolvableType, parameterType); + if (isNotSpringInternalType(parameterType) && moduleInjectionLimiter.isUnderScanPackage(parameterType)) { + moduleInjectionLimiter.checkInjectedType(resolvableType, parameterType); } } } @@ -45,10 +45,10 @@ public class LimitedCglibSubclassingInstantiationStrategy extends CglibSubclassi } private void tryGetResolverFromContext(BeanFactory owner) { - if (typeDomainResolver == null) { + if (moduleInjectionLimiter == null) { synchronized (this) { - if (typeDomainResolver == null) { - typeDomainResolver = owner.getBean(TypeDomainResolver.class); + if (moduleInjectionLimiter == null) { + moduleInjectionLimiter = owner.getBean(ModuleInjectionLimiter.class); } } } diff --git a/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedRootInitializingBean.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedRootInitializingBean.java deleted file mode 100644 index be189da0..00000000 --- a/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedRootInitializingBean.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * 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 com.gitee.dorive.inject.spring; - -import com.gitee.dorive.inject.annotation.Root; -import com.gitee.dorive.inject.api.TypeDomainResolver; -import com.gitee.dorive.inject.util.AopUtils; -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; - -import java.util.Map; - -public class LimitedRootInitializingBean implements ApplicationContextAware, InitializingBean { - - private final TypeDomainResolver typeDomainResolver; - private ApplicationContext applicationContext; - - public LimitedRootInitializingBean(TypeDomainResolver typeDomainResolver) { - this.typeDomainResolver = typeDomainResolver; - } - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - this.applicationContext = applicationContext; - } - - @Override - public void afterPropertiesSet() { - Map beansWithAnnotation = applicationContext.getBeansWithAnnotation(Root.class); - beansWithAnnotation.forEach((name, bean) -> { - Class targetClass = AopUtils.getAnnotatedClass(bean, Root.class); - typeDomainResolver.checkProtection(targetClass); - }); - } - -} diff --git a/dorive-inject/src/main/java/com/gitee/dorive/inject/util/AopUtils.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/util/AopUtils.java deleted file mode 100644 index ba2e194b..00000000 --- a/dorive-inject/src/main/java/com/gitee/dorive/inject/util/AopUtils.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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 com.gitee.dorive.inject.util; - -import java.lang.annotation.Annotation; - -public class AopUtils { - - public static Class getAnnotatedClass(Object instance, Class annotationType) { - Class targetClass = org.springframework.aop.support.AopUtils.getTargetClass(instance); - if (targetClass.isAnnotationPresent(annotationType)) { - return targetClass; - } else { - Class superClass = targetClass.getSuperclass(); - if (superClass.isAnnotationPresent(annotationType)) { - return superClass; - } - Class[] interfaceClasses = targetClass.getInterfaces(); - for (Class interfaceClass : interfaceClasses) { - if (interfaceClass.isAnnotationPresent(annotationType)) { - return interfaceClass; - } - } - } - return targetClass; - } - -} diff --git a/dorive-inject/src/main/resources/META-INF/spring-configuration-metadata.json b/dorive-inject/src/main/resources/META-INF/spring-configuration-metadata.json index b4633a74..706e46d3 100644 --- a/dorive-inject/src/main/resources/META-INF/spring-configuration-metadata.json +++ b/dorive-inject/src/main/resources/META-INF/spring-configuration-metadata.json @@ -11,9 +11,9 @@ "description": "Global scan path." }, { - "name": "dorive.domains", - "type": "com.gitee.dorive.inject.entity.DomainDefinition", - "description": "Definition of domain." + "name": "dorive.modules", + "type": "com.gitee.dorive.inject.entity.ModuleDefinition", + "description": "Definition of module." } ] } \ No newline at end of file -- Gitee From 5d2b84d5057e16517818d8bb1a489237d9b8834b Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Tue, 7 Jan 2025 21:02:43 +0800 Subject: [PATCH 02/21] =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...njectionLimiter.java => ModuleChecker.java} | 4 ++-- .../config/DoriveInjectionConfiguration.java | 14 +++++++------- ...nLimiter.java => DefaultModuleChecker.java} | 8 ++++---- .../LimitedAutowiredBeanPostProcessor.java | 10 +++++----- ...dCglibSubclassingInstantiationStrategy.java | 18 +++++++++--------- 5 files changed, 27 insertions(+), 27 deletions(-) rename dorive-inject/src/main/java/com/gitee/dorive/inject/api/{ModuleInjectionLimiter.java => ModuleChecker.java} (89%) rename dorive-inject/src/main/java/com/gitee/dorive/inject/impl/{DefaultModuleInjectionLimiter.java => DefaultModuleChecker.java} (92%) diff --git a/dorive-inject/src/main/java/com/gitee/dorive/inject/api/ModuleInjectionLimiter.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/api/ModuleChecker.java similarity index 89% rename from dorive-inject/src/main/java/com/gitee/dorive/inject/api/ModuleInjectionLimiter.java rename to dorive-inject/src/main/java/com/gitee/dorive/inject/api/ModuleChecker.java index 77ee93ed..718f52d0 100644 --- a/dorive-inject/src/main/java/com/gitee/dorive/inject/api/ModuleInjectionLimiter.java +++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/api/ModuleChecker.java @@ -17,10 +17,10 @@ package com.gitee.dorive.inject.api; -public interface ModuleInjectionLimiter { +public interface ModuleChecker { boolean isUnderScanPackage(Class typeToMatch); - void checkInjectedType(Class type, Class injectedType); + void checkInjection(Class type, Class injectedType); } diff --git a/dorive-inject/src/main/java/com/gitee/dorive/inject/config/DoriveInjectionConfiguration.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/config/DoriveInjectionConfiguration.java index 3f9a1616..6fda3bae 100644 --- a/dorive-inject/src/main/java/com/gitee/dorive/inject/config/DoriveInjectionConfiguration.java +++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/config/DoriveInjectionConfiguration.java @@ -18,10 +18,10 @@ package com.gitee.dorive.inject.config; import cn.hutool.core.lang.Assert; -import com.gitee.dorive.inject.impl.DefaultModuleInjectionLimiter; +import com.gitee.dorive.inject.impl.DefaultModuleChecker; import com.gitee.dorive.inject.spring.LimitedAutowiredBeanPostProcessor; import com.gitee.dorive.inject.spring.LimitedCglibSubclassingInstantiationStrategy; -import com.gitee.dorive.inject.api.ModuleInjectionLimiter; +import com.gitee.dorive.inject.api.ModuleChecker; import com.gitee.dorive.inject.entity.ModuleDefinition; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; @@ -54,20 +54,20 @@ public class DoriveInjectionConfiguration implements BeanFactoryPostProcessor { } } - @Bean("moduleInjectionLimiterV3") + @Bean("moduleCheckerV3") @ConditionalOnMissingClass - public ModuleInjectionLimiter moduleInjectionLimiter(Environment environment) { + public ModuleChecker moduleChecker(Environment environment) { String scanPackage = environment.getProperty(DORIVE_SCAN_KEY); Assert.notBlank(scanPackage, "The configuration item could not be found! name: {}", DORIVE_SCAN_KEY); List moduleDefinitions = Binder.get(environment).bind(DORIVE_MODULES_KEY, Bindable.listOf(ModuleDefinition.class)).get(); moduleDefinitions.sort((o1, o2) -> o2.getName().compareTo(o1.getName())); - return new DefaultModuleInjectionLimiter(scanPackage, moduleDefinitions); + return new DefaultModuleChecker(scanPackage, moduleDefinitions); } @Bean("limitedAnnotationBeanPostProcessorV3") @ConditionalOnMissingClass - public LimitedAutowiredBeanPostProcessor limitedAnnotationBeanPostProcessor(ModuleInjectionLimiter moduleInjectionLimiter) { - return new LimitedAutowiredBeanPostProcessor(moduleInjectionLimiter); + public LimitedAutowiredBeanPostProcessor limitedAnnotationBeanPostProcessor(ModuleChecker moduleChecker) { + return new LimitedAutowiredBeanPostProcessor(moduleChecker); } } diff --git a/dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultModuleInjectionLimiter.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultModuleChecker.java similarity index 92% rename from dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultModuleInjectionLimiter.java rename to dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultModuleChecker.java index 50ce955e..9a6a4950 100644 --- a/dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultModuleInjectionLimiter.java +++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultModuleChecker.java @@ -18,7 +18,7 @@ package com.gitee.dorive.inject.impl; import cn.hutool.core.collection.CollUtil; -import com.gitee.dorive.inject.api.ModuleInjectionLimiter; +import com.gitee.dorive.inject.api.ModuleChecker; import com.gitee.dorive.inject.entity.ExportDefinition; import com.gitee.dorive.inject.entity.ModuleDefinition; import org.springframework.beans.factory.BeanCreationException; @@ -26,13 +26,13 @@ import org.springframework.util.AntPathMatcher; import java.util.List; -public class DefaultModuleInjectionLimiter implements ModuleInjectionLimiter { +public class DefaultModuleChecker implements ModuleChecker { private final AntPathMatcher antPathMatcher = new AntPathMatcher("."); private final String scanPackage; private final List moduleDefinitions; - public DefaultModuleInjectionLimiter(String scanPackage, List moduleDefinitions) { + public DefaultModuleChecker(String scanPackage, List moduleDefinitions) { this.scanPackage = scanPackage; this.moduleDefinitions = moduleDefinitions; } @@ -43,7 +43,7 @@ public class DefaultModuleInjectionLimiter implements ModuleInjectionLimiter { } @Override - public void checkInjectedType(Class type, Class injectedType) { + public void checkInjection(Class type, Class injectedType) { if (isUnderScanPackage(injectedType)) { ModuleDefinition moduleDefinition = findModuleDefinition(injectedType); // 模块定义不存在,则判定为通过 diff --git a/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedAutowiredBeanPostProcessor.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedAutowiredBeanPostProcessor.java index 122384c2..c2c9953f 100644 --- a/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedAutowiredBeanPostProcessor.java +++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedAutowiredBeanPostProcessor.java @@ -17,7 +17,7 @@ package com.gitee.dorive.inject.spring; -import com.gitee.dorive.inject.api.ModuleInjectionLimiter; +import com.gitee.dorive.inject.api.ModuleChecker; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -39,12 +39,12 @@ import java.util.*; public class LimitedAutowiredBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter implements MergedBeanDefinitionPostProcessor { protected final Log logger = LogFactory.getLog(getClass()); - private final ModuleInjectionLimiter moduleInjectionLimiter; + private final ModuleChecker moduleChecker; private final Set> autowiredAnnotationTypes = new LinkedHashSet<>(4); @SuppressWarnings("unchecked") - public LimitedAutowiredBeanPostProcessor(ModuleInjectionLimiter moduleInjectionLimiter) { - this.moduleInjectionLimiter = moduleInjectionLimiter; + public LimitedAutowiredBeanPostProcessor(ModuleChecker moduleChecker) { + this.moduleChecker = moduleChecker; this.autowiredAnnotationTypes.add(Autowired.class); try { this.autowiredAnnotationTypes.add((Class) @@ -94,7 +94,7 @@ public class LimitedAutowiredBeanPostProcessor extends InstantiationAwareBeanPos } private void doCheckAutowiredFieldModule(Class clazz, Field field) { - moduleInjectionLimiter.checkInjectedType(clazz, field.getType()); + moduleChecker.checkInjection(clazz, field.getType()); } } diff --git a/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedCglibSubclassingInstantiationStrategy.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedCglibSubclassingInstantiationStrategy.java index ba27f497..572b0504 100644 --- a/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedCglibSubclassingInstantiationStrategy.java +++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedCglibSubclassingInstantiationStrategy.java @@ -17,7 +17,7 @@ package com.gitee.dorive.inject.spring; -import com.gitee.dorive.inject.api.ModuleInjectionLimiter; +import com.gitee.dorive.inject.api.ModuleChecker; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.support.CglibSubclassingInstantiationStrategy; import org.springframework.beans.factory.support.RootBeanDefinition; @@ -26,17 +26,17 @@ import java.lang.reflect.Constructor; public class LimitedCglibSubclassingInstantiationStrategy extends CglibSubclassingInstantiationStrategy { - private ModuleInjectionLimiter moduleInjectionLimiter; + private ModuleChecker moduleChecker; @Override public Object instantiate(RootBeanDefinition bd, String beanName, BeanFactory owner, Constructor ctor, Object... args) { tryGetResolverFromContext(owner); - if (moduleInjectionLimiter != null) { + if (moduleChecker != null) { Class resolvableType = (Class) bd.getResolvableType().getType(); - if (isNotSpringInternalType(resolvableType) && moduleInjectionLimiter.isUnderScanPackage(resolvableType)) { + if (isNotSpringInternalType(resolvableType) && moduleChecker.isUnderScanPackage(resolvableType)) { for (Class parameterType : ctor.getParameterTypes()) { - if (isNotSpringInternalType(parameterType) && moduleInjectionLimiter.isUnderScanPackage(parameterType)) { - moduleInjectionLimiter.checkInjectedType(resolvableType, parameterType); + if (isNotSpringInternalType(parameterType) && moduleChecker.isUnderScanPackage(parameterType)) { + moduleChecker.checkInjection(resolvableType, parameterType); } } } @@ -45,10 +45,10 @@ public class LimitedCglibSubclassingInstantiationStrategy extends CglibSubclassi } private void tryGetResolverFromContext(BeanFactory owner) { - if (moduleInjectionLimiter == null) { + if (moduleChecker == null) { synchronized (this) { - if (moduleInjectionLimiter == null) { - moduleInjectionLimiter = owner.getBean(ModuleInjectionLimiter.class); + if (moduleChecker == null) { + moduleChecker = owner.getBean(ModuleChecker.class); } } } -- Gitee From d92ca2a8304ae50497aa15e252e8cffef396eda2 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Tue, 7 Jan 2025 21:38:48 +0800 Subject: [PATCH 03/21] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/DoriveInjectionConfiguration.java | 35 ++++++++++--------- ...CglibSubclassingInstantiationStrategy.java | 27 +++++--------- 2 files changed, 27 insertions(+), 35 deletions(-) diff --git a/dorive-inject/src/main/java/com/gitee/dorive/inject/config/DoriveInjectionConfiguration.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/config/DoriveInjectionConfiguration.java index 6fda3bae..cc3a67b3 100644 --- a/dorive-inject/src/main/java/com/gitee/dorive/inject/config/DoriveInjectionConfiguration.java +++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/config/DoriveInjectionConfiguration.java @@ -18,11 +18,11 @@ package com.gitee.dorive.inject.config; import cn.hutool.core.lang.Assert; +import com.gitee.dorive.inject.api.ModuleChecker; +import com.gitee.dorive.inject.entity.ModuleDefinition; import com.gitee.dorive.inject.impl.DefaultModuleChecker; import com.gitee.dorive.inject.spring.LimitedAutowiredBeanPostProcessor; import com.gitee.dorive.inject.spring.LimitedCglibSubclassingInstantiationStrategy; -import com.gitee.dorive.inject.api.ModuleChecker; -import com.gitee.dorive.inject.entity.ModuleDefinition; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; @@ -31,42 +31,45 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClas import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.bind.Bindable; import org.springframework.boot.context.properties.bind.Binder; +import org.springframework.context.EnvironmentAware; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; import org.springframework.core.env.Environment; +import java.util.Comparator; import java.util.List; @Order(-100) @Configuration @ConditionalOnProperty(prefix = "dorive", name = "enable", havingValue = "true") -public class DoriveInjectionConfiguration implements BeanFactoryPostProcessor { +public class DoriveInjectionConfiguration implements EnvironmentAware, BeanFactoryPostProcessor { public static final String DORIVE_SCAN_KEY = "dorive.scan"; public static final String DORIVE_MODULES_KEY = "dorive.modules"; - @Override - public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { - if (beanFactory instanceof AbstractAutowireCapableBeanFactory) { - AbstractAutowireCapableBeanFactory abstractAutowireCapableBeanFactory = (AbstractAutowireCapableBeanFactory) beanFactory; - abstractAutowireCapableBeanFactory.setInstantiationStrategy(new LimitedCglibSubclassingInstantiationStrategy()); - } - } + public static ModuleChecker moduleChecker; - @Bean("moduleCheckerV3") - @ConditionalOnMissingClass - public ModuleChecker moduleChecker(Environment environment) { + @Override + public void setEnvironment(Environment environment) { String scanPackage = environment.getProperty(DORIVE_SCAN_KEY); Assert.notBlank(scanPackage, "The configuration item could not be found! name: {}", DORIVE_SCAN_KEY); List moduleDefinitions = Binder.get(environment).bind(DORIVE_MODULES_KEY, Bindable.listOf(ModuleDefinition.class)).get(); - moduleDefinitions.sort((o1, o2) -> o2.getName().compareTo(o1.getName())); - return new DefaultModuleChecker(scanPackage, moduleDefinitions); + moduleDefinitions.sort(Comparator.comparing(ModuleDefinition::getName)); + moduleChecker = new DefaultModuleChecker(scanPackage, moduleDefinitions); + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + if (moduleChecker != null && beanFactory instanceof AbstractAutowireCapableBeanFactory) { + AbstractAutowireCapableBeanFactory abstractBeanFactory = (AbstractAutowireCapableBeanFactory) beanFactory; + abstractBeanFactory.setInstantiationStrategy(new LimitedCglibSubclassingInstantiationStrategy(moduleChecker)); + } } @Bean("limitedAnnotationBeanPostProcessorV3") @ConditionalOnMissingClass - public LimitedAutowiredBeanPostProcessor limitedAnnotationBeanPostProcessor(ModuleChecker moduleChecker) { + public LimitedAutowiredBeanPostProcessor limitedAnnotationBeanPostProcessor() { return new LimitedAutowiredBeanPostProcessor(moduleChecker); } diff --git a/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedCglibSubclassingInstantiationStrategy.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedCglibSubclassingInstantiationStrategy.java index 572b0504..a15501e0 100644 --- a/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedCglibSubclassingInstantiationStrategy.java +++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedCglibSubclassingInstantiationStrategy.java @@ -18,42 +18,31 @@ package com.gitee.dorive.inject.spring; import com.gitee.dorive.inject.api.ModuleChecker; +import lombok.AllArgsConstructor; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.support.CglibSubclassingInstantiationStrategy; import org.springframework.beans.factory.support.RootBeanDefinition; import java.lang.reflect.Constructor; +@AllArgsConstructor public class LimitedCglibSubclassingInstantiationStrategy extends CglibSubclassingInstantiationStrategy { - private ModuleChecker moduleChecker; + private final ModuleChecker moduleChecker; @Override public Object instantiate(RootBeanDefinition bd, String beanName, BeanFactory owner, Constructor ctor, Object... args) { - tryGetResolverFromContext(owner); - if (moduleChecker != null) { - Class resolvableType = (Class) bd.getResolvableType().getType(); - if (isNotSpringInternalType(resolvableType) && moduleChecker.isUnderScanPackage(resolvableType)) { - for (Class parameterType : ctor.getParameterTypes()) { - if (isNotSpringInternalType(parameterType) && moduleChecker.isUnderScanPackage(parameterType)) { - moduleChecker.checkInjection(resolvableType, parameterType); - } + Class resolvableType = (Class) bd.getResolvableType().getType(); + if (isNotSpringInternalType(resolvableType) && moduleChecker.isUnderScanPackage(resolvableType)) { + for (Class parameterType : ctor.getParameterTypes()) { + if (isNotSpringInternalType(parameterType) && moduleChecker.isUnderScanPackage(parameterType)) { + moduleChecker.checkInjection(resolvableType, parameterType); } } } return super.instantiate(bd, beanName, owner, ctor, args); } - private void tryGetResolverFromContext(BeanFactory owner) { - if (moduleChecker == null) { - synchronized (this) { - if (moduleChecker == null) { - moduleChecker = owner.getBean(ModuleChecker.class); - } - } - } - } - private boolean isNotSpringInternalType(Class typeToMatch) { return !typeToMatch.getName().startsWith("org.springframework."); } -- Gitee From cfee99c3779c24382f9a52fe74f0110f2a6da0c2 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Tue, 7 Jan 2025 21:39:15 +0800 Subject: [PATCH 04/21] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/inject/config/DoriveInjectionConfiguration.java | 1 - 1 file changed, 1 deletion(-) diff --git a/dorive-inject/src/main/java/com/gitee/dorive/inject/config/DoriveInjectionConfiguration.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/config/DoriveInjectionConfiguration.java index cc3a67b3..a382ec49 100644 --- a/dorive-inject/src/main/java/com/gitee/dorive/inject/config/DoriveInjectionConfiguration.java +++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/config/DoriveInjectionConfiguration.java @@ -47,7 +47,6 @@ public class DoriveInjectionConfiguration implements EnvironmentAware, BeanFacto public static final String DORIVE_SCAN_KEY = "dorive.scan"; public static final String DORIVE_MODULES_KEY = "dorive.modules"; - public static ModuleChecker moduleChecker; @Override -- Gitee From 5f501ef7faa0a77eae8d69269fd4c9aebfd2741d Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Tue, 7 Jan 2025 21:59:23 +0800 Subject: [PATCH 05/21] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/inject/impl/DefaultModuleChecker.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultModuleChecker.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultModuleChecker.java index 9a6a4950..25740905 100644 --- a/dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultModuleChecker.java +++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultModuleChecker.java @@ -53,10 +53,12 @@ public class DefaultModuleChecker implements ModuleChecker { // 在公开的包路径下,则判定为通过 String typeName = injectedType.getName(); List exportDefinitions = moduleDefinition.getExports(); - for (ExportDefinition exportDefinition : exportDefinitions) { - String path = exportDefinition.getPath(); - if (antPathMatcher.match(path, typeName)) { - return; + if (exportDefinitions != null && !exportDefinitions.isEmpty()) { + for (ExportDefinition exportDefinition : exportDefinitions) { + String path = exportDefinition.getPath(); + if (antPathMatcher.match(path, typeName)) { + return; + } } } // 模块 -- Gitee From 7ef65c709bc20156a5ff0802ecdd50a3d5bc7526 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Tue, 7 Jan 2025 22:38:34 +0800 Subject: [PATCH 06/21] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inject/impl/DefaultModuleChecker.java | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultModuleChecker.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultModuleChecker.java index 25740905..6d4ee49b 100644 --- a/dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultModuleChecker.java +++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultModuleChecker.java @@ -45,21 +45,15 @@ public class DefaultModuleChecker implements ModuleChecker { @Override public void checkInjection(Class type, Class injectedType) { if (isUnderScanPackage(injectedType)) { - ModuleDefinition moduleDefinition = findModuleDefinition(injectedType); // 模块定义不存在,则判定为通过 + ModuleDefinition moduleDefinition = findModuleDefinition(injectedType); if (moduleDefinition == null) { return; } // 在公开的包路径下,则判定为通过 - String typeName = injectedType.getName(); - List exportDefinitions = moduleDefinition.getExports(); - if (exportDefinitions != null && !exportDefinitions.isEmpty()) { - for (ExportDefinition exportDefinition : exportDefinitions) { - String path = exportDefinition.getPath(); - if (antPathMatcher.match(path, typeName)) { - return; - } - } + ExportDefinition exportDefinition = findExportDefinition(injectedType, moduleDefinition); + if (exportDefinition != null) { + return; } // 模块 if (isUnderScanPackage(type)) { @@ -86,6 +80,10 @@ public class DefaultModuleChecker implements ModuleChecker { return CollUtil.findOne(moduleDefinitions, item -> antPathMatcher.match(item.getPath(), typeToMatch.getName())); } + private ExportDefinition findExportDefinition(Class typeToMatch, ModuleDefinition moduleDefinition) { + return CollUtil.findOne(moduleDefinition.getExports(), item -> antPathMatcher.match(item.getPath(), typeToMatch.getName())); + } + private void throwInjectionException(Class type, Class injectedType) { String message = String.format("Injection of autowired dependencies failed! type: %s, injectedType: %s", type.getName(), injectedType.getName()); throw new BeanCreationException(message); -- Gitee From e76a67a79e2d1adc1cdf5089bb9b82a3e3a8c20a Mon Sep 17 00:00:00 2001 From: chenT <609580885@qq.com> Date: Wed, 8 Jan 2025 18:13:28 +0800 Subject: [PATCH 07/21] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=B8=BA3.5.0.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dorive-spring-boot-starter/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/dorive-spring-boot-starter/pom.xml b/dorive-spring-boot-starter/pom.xml index d2b4521d..b3bd4ed4 100644 --- a/dorive-spring-boot-starter/pom.xml +++ b/dorive-spring-boot-starter/pom.xml @@ -8,6 +8,7 @@ dorive 3.5.0.5 + pom dorive-spring-boot-starter -- Gitee From 2e21e4b72766f6ce91334991cfd3016e3822687e Mon Sep 17 00:00:00 2001 From: chenT <609580885@qq.com> Date: Wed, 8 Jan 2025 18:15:08 +0800 Subject: [PATCH 08/21] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=89=93=E5=8C=85?= =?UTF-8?q?=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dorive-spring-boot-starter/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dorive-spring-boot-starter/pom.xml b/dorive-spring-boot-starter/pom.xml index b3bd4ed4..8b098e3f 100644 --- a/dorive-spring-boot-starter/pom.xml +++ b/dorive-spring-boot-starter/pom.xml @@ -8,8 +8,8 @@ dorive 3.5.0.5 - pom dorive-spring-boot-starter + pom com.gitee.digital-engine -- Gitee From 3a97bf4c4ab68a0009882151d6786b7c862665ea Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Wed, 8 Jan 2025 22:55:01 +0800 Subject: [PATCH 09/21] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/context/AbstractProxyContext.java | 74 ------------------- .../dorive/query/entity/QueryContext.java | 6 +- .../impl/handler/AdaptiveQueryHandler.java | 4 +- .../sql/impl/querier/SqlCountQuerier.java | 2 +- 4 files changed, 7 insertions(+), 79 deletions(-) delete mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractProxyContext.java diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractProxyContext.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractProxyContext.java deleted file mode 100644 index 35e1c81f..00000000 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractProxyContext.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * 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 com.gitee.dorive.core.entity.context; - -import com.gitee.dorive.core.api.context.Context; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; - -import java.util.Map; - -@Getter -@Setter -@AllArgsConstructor -public abstract class AbstractProxyContext implements Context { - - protected Context context; - - @Override - public Map, Object> getOptions() { - return context.getOptions(); - } - - @Override - public void setOption(Class type, T value) { - context.setOption(type, value); - } - - @Override - public T getOption(Class type) { - return context.getOption(type); - } - - @Override - public void removeOption(Class type) { - context.removeOption(type); - } - - @Override - public Map getAttachments() { - return context.getAttachments(); - } - - @Override - public void setAttachment(String name, Object value) { - context.setAttachment(name, value); - } - - @Override - public Object getAttachment(String name) { - return context.getAttachment(name); - } - - @Override - public void removeAttachment(String name) { - context.removeAttachment(name); - } - -} diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java index 8e83efd2..c03df9ce 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java @@ -18,7 +18,6 @@ package com.gitee.dorive.query.entity; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.context.AbstractProxyContext; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.query.entity.enums.ResultType; @@ -32,7 +31,8 @@ import java.util.Map; @Getter @Setter -public class QueryContext extends AbstractProxyContext { +public class QueryContext { + private Context context; private Class queryType; private ResultType resultType; private boolean abandoned; @@ -49,7 +49,7 @@ public class QueryContext extends AbstractProxyContext { private Result result; public QueryContext(Context context, Class queryType, ResultType resultType) { - super(context); + this.context = context; this.queryType = queryType; this.resultType = resultType; } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/AdaptiveQueryHandler.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/AdaptiveQueryHandler.java index 3e60eef6..73e53d40 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/AdaptiveQueryHandler.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/AdaptiveQueryHandler.java @@ -17,6 +17,7 @@ package com.gitee.dorive.query.impl.handler; +import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.query.api.QueryHandler; import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.enums.QueryMethod; @@ -31,7 +32,8 @@ public class AdaptiveQueryHandler implements QueryHandler { @Override public void handle(QueryContext queryContext, Object query) { - QueryMethod queryMethod = queryContext.getOption(QueryMethod.class); + Context context = queryContext.getContext(); + QueryMethod queryMethod = context.getOption(QueryMethod.class); if (queryMethod == null) { queryMethod = QueryMethod.SQL_EXECUTE; } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/querier/SqlCountQuerier.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/querier/SqlCountQuerier.java index e402fa5c..c97c06cf 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/querier/SqlCountQuerier.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/querier/SqlCountQuerier.java @@ -54,7 +54,7 @@ public class SqlCountQuerier implements CountQuerier { Object query = countQuery.getQuery(); QueryContext queryContext = new QueryContext(context, query.getClass(), ResultType.COUNT); - queryContext.setOption(QueryMethod.class, QueryMethod.SQL_BUILD); + context.setOption(QueryMethod.class, QueryMethod.SQL_BUILD); queryHandler.handle(queryContext, query); SegmentUnit segmentUnit = (SegmentUnit) queryContext.getQueryUnit(); -- Gitee From be3b78357d1be17993b994a91c9b56ab43a19f47 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Thu, 9 Jan 2025 00:54:20 +0800 Subject: [PATCH 10/21] =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=8C=87=E5=AE=9A?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/entity/common/EntityStoreInfo.java | 2 + .../plus/impl/SqlCustomQueryHandler.java | 65 +++++++++++++++++++ .../repository/MybatisPlusRepository.java | 14 +++- .../query/entity/enums/QueryMethod.java | 1 + .../impl/handler/AdaptiveQueryHandler.java | 10 ++- 5 files changed, 87 insertions(+), 5 deletions(-) create mode 100644 dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/SqlCustomQueryHandler.java diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java index 4942b0ab..3b7ee6c6 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java @@ -20,6 +20,7 @@ package com.gitee.dorive.core.entity.common; import lombok.AllArgsConstructor; import lombok.Data; +import java.lang.reflect.Method; import java.util.Map; @Data @@ -35,4 +36,5 @@ public class EntityStoreInfo { private Map propAliasMapping; private Map aliasPropMapping; private String selectColumns; + private Method selectByQueryMethod; } diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/SqlCustomQueryHandler.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/SqlCustomQueryHandler.java new file mode 100644 index 00000000..c47d428e --- /dev/null +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/SqlCustomQueryHandler.java @@ -0,0 +1,65 @@ +/* + * 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 com.gitee.dorive.mybatis.plus.impl; + +import cn.hutool.core.util.ReflectUtil; +import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.entity.common.EntityStoreInfo; +import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.query.api.QueryHandler; +import com.gitee.dorive.query.entity.QueryContext; +import com.gitee.dorive.query.entity.QueryUnit; +import com.gitee.dorive.query.impl.handler.QueryUnitQueryHandler; +import com.gitee.dorive.query.repository.AbstractQueryRepository; +import lombok.Getter; +import lombok.Setter; + +import java.lang.reflect.Method; +import java.util.List; +import java.util.Map; + +@Getter +@Setter +public class SqlCustomQueryHandler extends QueryUnitQueryHandler { + + private final EntityStoreInfo entityStoreInfo; + + public SqlCustomQueryHandler(AbstractQueryRepository repository, QueryHandler queryHandler, EntityStoreInfo entityStoreInfo) { + super(repository, queryHandler); + this.entityStoreInfo = entityStoreInfo; + } + + @Override + public void handle(QueryContext queryContext, Object query) { + super.handle(queryContext, query); + Object mapper = entityStoreInfo.getMapper(); + Method selectByQueryMethod = entityStoreInfo.getSelectByQueryMethod(); + Context context = queryContext.getContext(); + Map attachments = context.getAttachments(); + List ids = ReflectUtil.invoke(mapper, selectByQueryMethod, attachments, query); + if (!ids.isEmpty()) { + Example example = queryContext.getExample(); + QueryUnit queryUnit = queryContext.getQueryUnit(); + String primaryKey = queryUnit.getPrimaryKey(); + example.in(primaryKey, ids); + } else { + queryContext.setAbandoned(true); + } + } + +} diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java index 7c06e743..881d986a 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java @@ -19,6 +19,7 @@ package com.gitee.dorive.mybatis.plus.repository; import cn.hutool.core.lang.Assert; import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo; @@ -30,6 +31,7 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.mybatis.plus.executor.MybatisPlusExecutor; +import com.gitee.dorive.mybatis.plus.impl.SqlCustomQueryHandler; import com.gitee.dorive.query.api.QueryHandler; import com.gitee.dorive.query.entity.enums.QueryMethod; import com.gitee.dorive.ref.repository.AbstractRefRepository; @@ -44,6 +46,7 @@ import lombok.Getter; import lombok.Setter; import org.apache.commons.lang3.StringUtils; +import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.ArrayList; @@ -56,6 +59,7 @@ import java.util.Map; public class MybatisPlusRepository extends AbstractRefRepository implements CountQuerier { private SqlRunner sqlRunner; + private EntityStoreInfo entityStoreInfo; private CountQuerier countQuerier; @Override @@ -89,7 +93,8 @@ public class MybatisPlusRepository extends AbstractRefRepository i TableInfo tableInfo = TableInfoHelper.getTableInfo(pojoClass); Assert.notNull(tableInfo, "The table info cannot be null! data source: {}", mapperClass); assert tableInfo != null; - return newEntityStoreInfo(mapperClass, mapper, pojoClass, tableInfo); + this.entityStoreInfo = newEntityStoreInfo(mapperClass, mapper, pojoClass, tableInfo); + return entityStoreInfo; } private EntityStoreInfo newEntityStoreInfo(Class mapperClass, Object mapper, Class pojoClass, TableInfo tableInfo) { @@ -115,7 +120,8 @@ public class MybatisPlusRepository extends AbstractRefRepository i List columns = new ArrayList<>(propAliasMapping.values()); String selectColumns = StrUtil.join(",", columns); - return new EntityStoreInfo(mapperClass, mapper, pojoClass, tableName, keyProperty, keyColumn, propAliasMappingWithoutPk, propAliasMapping, aliasPropMapping, selectColumns); + Method selectByQueryMethod = ReflectUtil.getMethodByName(mapperClass, "selectByQuery"); + return new EntityStoreInfo(mapperClass, mapper, pojoClass, tableName, keyProperty, keyColumn, propAliasMappingWithoutPk, propAliasMapping, aliasPropMapping, selectColumns, selectByQueryMethod); } @Override @@ -129,6 +135,10 @@ public class MybatisPlusRepository extends AbstractRefRepository i super.registryQueryHandlers(queryHandlerMap); queryHandlerMap.put(QueryMethod.SQL_BUILD, new SqlBuildQueryHandler(this, null)); queryHandlerMap.put(QueryMethod.SQL_EXECUTE, new SqlExecuteQueryHandler(this, null, sqlRunner)); + Method selectByQueryMethod = entityStoreInfo.getSelectByQueryMethod(); + if (selectByQueryMethod != null) { + queryHandlerMap.put(QueryMethod.SQL_CUSTOM, new SqlCustomQueryHandler(this, null, entityStoreInfo)); + } } @Override diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/enums/QueryMethod.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/enums/QueryMethod.java index 07c51200..6102bf11 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/enums/QueryMethod.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/enums/QueryMethod.java @@ -21,4 +21,5 @@ public enum QueryMethod { STEPWISE, SQL_BUILD, SQL_EXECUTE, + SQL_CUSTOM, } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/AdaptiveQueryHandler.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/AdaptiveQueryHandler.java index 73e53d40..aee13af0 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/AdaptiveQueryHandler.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/AdaptiveQueryHandler.java @@ -21,21 +21,25 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.query.api.QueryHandler; import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.enums.QueryMethod; -import lombok.AllArgsConstructor; import java.util.Map; -@AllArgsConstructor public class AdaptiveQueryHandler implements QueryHandler { private final Map queryHandlerMap; + private final QueryMethod defaultQueryMethod; + + public AdaptiveQueryHandler(Map queryHandlerMap) { + this.queryHandlerMap = queryHandlerMap; + this.defaultQueryMethod = queryHandlerMap.containsKey(QueryMethod.SQL_CUSTOM) ? QueryMethod.SQL_CUSTOM : QueryMethod.SQL_EXECUTE; + } @Override public void handle(QueryContext queryContext, Object query) { Context context = queryContext.getContext(); QueryMethod queryMethod = context.getOption(QueryMethod.class); if (queryMethod == null) { - queryMethod = QueryMethod.SQL_EXECUTE; + queryMethod = defaultQueryMethod; } QueryHandler queryHandler = queryHandlerMap.get(queryMethod); if (queryHandler != null) { -- Gitee From 965eae5f59a43dafbf0cae3c3ca1379953398c8b Mon Sep 17 00:00:00 2001 From: chenT <609580885@qq.com> Date: Thu, 9 Jan 2025 13:00:25 +0800 Subject: [PATCH 11/21] =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=8C=87=E5=AE=9AQuery?= =?UTF-8?q?=E5=AF=B9=E5=BA=94=E7=9A=84=E6=9F=A5=E8=AF=A2=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/api/annotation/query/Query.java | 2 ++ .../dorive/api/entity/query/QueryDefinition.java | 2 ++ .../dorive/api/entity/query/def/QueryDef.java | 2 ++ .../api/impl/query/QueryDefinitionResolver.java | 12 +++++++----- .../core/entity/common/EntityStoreInfo.java | 2 +- .../mybatis/plus/impl/SqlCustomQueryHandler.java | 11 ++++++++--- .../plus/repository/MybatisPlusRepository.java | 16 ++++++++++------ .../gitee/dorive/query/entity/QueryContext.java | 1 + .../query/impl/handler/AdaptiveQueryHandler.java | 11 ++++++++--- .../query/impl/handler/ExampleQueryHandler.java | 1 + .../impl/resolver/QueryExampleResolver.java | 5 ++++- 11 files changed, 46 insertions(+), 19 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/query/Query.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/query/Query.java index 18f7bdec..e0130ccc 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/query/Query.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/query/Query.java @@ -25,6 +25,8 @@ import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) public @interface Query { + String method() default ""; + String[] ignoreFields() default {}; String sortByField() default "sortBy"; diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/query/QueryDefinition.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/query/QueryDefinition.java index 7a98b703..43fc31f6 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/query/QueryDefinition.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/query/QueryDefinition.java @@ -18,12 +18,14 @@ package com.gitee.dorive.api.entity.query; import com.gitee.dorive.api.entity.core.Field; +import com.gitee.dorive.api.entity.query.def.QueryDef; import lombok.Data; import java.util.List; @Data public class QueryDefinition { + private QueryDef queryDef; private Class genericType; private List queryFieldDefinitions; private List ignoreFields; diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/query/def/QueryDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/query/def/QueryDef.java index bd6a37c3..7596ee61 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/query/def/QueryDef.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/query/def/QueryDef.java @@ -25,6 +25,7 @@ import java.lang.reflect.AnnotatedElement; @Data public class QueryDef { + private String method; private String[] ignoreFields; private String sortByField; private String orderField; @@ -35,6 +36,7 @@ public class QueryDef { Query query = AnnotatedElementUtils.getMergedAnnotation(element, Query.class); if (query != null) { QueryDef queryDef = new QueryDef(); + queryDef.setMethod(query.method()); queryDef.setIgnoreFields(query.ignoreFields()); queryDef.setSortByField(query.sortByField()); queryDef.setOrderField(query.orderField()); diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/query/QueryDefinitionResolver.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/query/QueryDefinitionResolver.java index f147c771..d47641b0 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/query/QueryDefinitionResolver.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/query/QueryDefinitionResolver.java @@ -36,16 +36,18 @@ import java.util.Map; public class QueryDefinitionResolver { public QueryDefinition resolve(Class queryType) { + QueryDef queryDef = QueryDef.fromElement(queryType); + Assert.notNull(queryDef, "The @Query does not exist!"); + assert queryDef != null; + QueryDefinition queryDefinition = new QueryDefinition(); + queryDefinition.setQueryDef(queryDef); queryDefinition.setGenericType(queryType); - readFields(queryType, queryDefinition); + readFields(queryType, queryDef, queryDefinition); return queryDefinition; } - private void readFields(Class queryType, QueryDefinition queryDefinition) { - QueryDef queryDef = QueryDef.fromElement(queryType); - Assert.notNull(queryDef, "The @Query does not exist!"); - assert queryDef != null; + private void readFields(Class queryType, QueryDef queryDef, QueryDefinition queryDefinition) { String[] ignoreFieldNames = queryDef.getIgnoreFields(); String sortByField = queryDef.getSortByField(); String orderField = queryDef.getOrderField(); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java index 3b7ee6c6..0311af50 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java @@ -36,5 +36,5 @@ public class EntityStoreInfo { private Map propAliasMapping; private Map aliasPropMapping; private String selectColumns; - private Method selectByQueryMethod; + private Map selectMethodMap; } diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/SqlCustomQueryHandler.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/SqlCustomQueryHandler.java index c47d428e..f9159715 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/SqlCustomQueryHandler.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/SqlCustomQueryHandler.java @@ -47,11 +47,16 @@ public class SqlCustomQueryHandler extends QueryUnitQueryHandler { @Override public void handle(QueryContext queryContext, Object query) { super.handle(queryContext, query); - Object mapper = entityStoreInfo.getMapper(); - Method selectByQueryMethod = entityStoreInfo.getSelectByQueryMethod(); + Context context = queryContext.getContext(); + String method = queryContext.getMethod(); + + Object mapper = entityStoreInfo.getMapper(); + Map selectMethodMap = entityStoreInfo.getSelectMethodMap(); + Method selectMethod = selectMethodMap.get(method); Map attachments = context.getAttachments(); - List ids = ReflectUtil.invoke(mapper, selectByQueryMethod, attachments, query); + + List ids = ReflectUtil.invoke(mapper, selectMethod, attachments, query); if (!ids.isEmpty()) { Example example = queryContext.getExample(); QueryUnit queryUnit = queryContext.getQueryUnit(); diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java index 881d986a..dd6bacd5 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java @@ -53,6 +53,7 @@ import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; @Getter @Setter @@ -120,8 +121,14 @@ public class MybatisPlusRepository extends AbstractRefRepository i List columns = new ArrayList<>(propAliasMapping.values()); String selectColumns = StrUtil.join(",", columns); - Method selectByQueryMethod = ReflectUtil.getMethodByName(mapperClass, "selectByQuery"); - return new EntityStoreInfo(mapperClass, mapper, pojoClass, tableName, keyProperty, keyColumn, propAliasMappingWithoutPk, propAliasMapping, aliasPropMapping, selectColumns, selectByQueryMethod); + Map selectMethodMap = new ConcurrentHashMap<>(8); + for (Method method : ReflectUtil.getMethodsDirectly(mapperClass, false, false)) { + String name = method.getName(); + if (name.startsWith("select")) { + selectMethodMap.putIfAbsent(name, method); + } + } + return new EntityStoreInfo(mapperClass, mapper, pojoClass, tableName, keyProperty, keyColumn, propAliasMappingWithoutPk, propAliasMapping, aliasPropMapping, selectColumns, selectMethodMap); } @Override @@ -135,10 +142,7 @@ public class MybatisPlusRepository extends AbstractRefRepository i super.registryQueryHandlers(queryHandlerMap); queryHandlerMap.put(QueryMethod.SQL_BUILD, new SqlBuildQueryHandler(this, null)); queryHandlerMap.put(QueryMethod.SQL_EXECUTE, new SqlExecuteQueryHandler(this, null, sqlRunner)); - Method selectByQueryMethod = entityStoreInfo.getSelectByQueryMethod(); - if (selectByQueryMethod != null) { - queryHandlerMap.put(QueryMethod.SQL_CUSTOM, new SqlCustomQueryHandler(this, null, entityStoreInfo)); - } + queryHandlerMap.put(QueryMethod.SQL_CUSTOM, new SqlCustomQueryHandler(this, null, entityStoreInfo)); } @Override diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java index c03df9ce..d0a33f5a 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java @@ -38,6 +38,7 @@ public class QueryContext { private boolean abandoned; private QueryExampleResolver queryExampleResolver; + private String method; private Map exampleMap; private Example example; diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/AdaptiveQueryHandler.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/AdaptiveQueryHandler.java index aee13af0..dcb4eec1 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/AdaptiveQueryHandler.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/AdaptiveQueryHandler.java @@ -21,25 +21,30 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.query.api.QueryHandler; import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.enums.QueryMethod; +import org.apache.commons.lang3.StringUtils; import java.util.Map; public class AdaptiveQueryHandler implements QueryHandler { private final Map queryHandlerMap; - private final QueryMethod defaultQueryMethod; public AdaptiveQueryHandler(Map queryHandlerMap) { this.queryHandlerMap = queryHandlerMap; - this.defaultQueryMethod = queryHandlerMap.containsKey(QueryMethod.SQL_CUSTOM) ? QueryMethod.SQL_CUSTOM : QueryMethod.SQL_EXECUTE; } @Override public void handle(QueryContext queryContext, Object query) { Context context = queryContext.getContext(); QueryMethod queryMethod = context.getOption(QueryMethod.class); + // 如果开发者没有指定 if (queryMethod == null) { - queryMethod = defaultQueryMethod; + String method = queryContext.getMethod(); + if (StringUtils.isNotBlank(method)) { + queryMethod = QueryMethod.SQL_CUSTOM; + } else { + queryMethod = QueryMethod.SQL_EXECUTE; + } } QueryHandler queryHandler = queryHandlerMap.get(queryMethod); if (queryHandler != null) { diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/ExampleQueryHandler.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/ExampleQueryHandler.java index 1813f580..a2d55296 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/ExampleQueryHandler.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/ExampleQueryHandler.java @@ -44,6 +44,7 @@ public class ExampleQueryHandler implements QueryHandler { Assert.notNull(queryExampleResolver, "No query resolver found!"); queryContext.setQueryExampleResolver(queryExampleResolver); + queryContext.setMethod(queryExampleResolver.getMethod()); Map exampleMap = queryExampleResolver.resolve(query); queryContext.setExampleMap(exampleMap); diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryExampleResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryExampleResolver.java index 35392f46..beb315fc 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryExampleResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryExampleResolver.java @@ -40,6 +40,10 @@ public class QueryExampleResolver { private QueryDefinition queryDefinition; + public String getMethod() { + return queryDefinition.getQueryDef().getMethod(); + } + public Map resolve(Object query) { Map exampleMap = newExampleMap(query); Example example = exampleMap.computeIfAbsent("/", key -> new InnerExample()); @@ -99,5 +103,4 @@ public class QueryExampleResolver { } return null; } - } -- Gitee From 73dac6b395db898dba8a8e5d6ba682ff4d532ae5 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Fri, 10 Jan 2025 00:16:31 +0800 Subject: [PATCH 12/21] =?UTF-8?q?=E5=A4=A7=E5=B9=85=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plus/impl/SqlCustomQueryHandler.java | 7 +-- .../repository/MybatisPlusRepository.java | 6 +-- .../dorive/query/entity/QueryConfig.java | 23 +++++----- .../dorive/query/entity/QueryContext.java | 5 +-- .../gitee/dorive/query/entity/QueryUnit.java | 3 +- .../impl/handler/ExampleQueryHandler.java | 16 ++++--- .../impl/handler/QueryUnitQueryHandler.java | 45 ++++++------------- .../impl/handler/StepwiseQueryHandler.java | 16 ++----- .../impl/resolver/QueryExampleResolver.java | 4 -- .../impl/resolver/QueryTypeResolver.java | 15 ++++--- .../repository/AbstractQueryRepository.java | 2 +- .../impl/handler/SqlBuildQueryHandler.java | 24 +++++----- .../impl/handler/SqlExecuteQueryHandler.java | 12 ++--- .../sql/impl/querier/SqlCountQuerier.java | 23 +++++----- ...UnitResolver.java => SegmentResolver.java} | 38 ++++++++-------- .../impl/segment/SelectSegmentBuilder.java | 17 +++---- 16 files changed, 111 insertions(+), 145 deletions(-) rename dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/SegmentUnit.java => dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryConfig.java (63%) rename dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/{SegmentUnitResolver.java => SegmentResolver.java} (89%) diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/SqlCustomQueryHandler.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/SqlCustomQueryHandler.java index f9159715..2a343b08 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/SqlCustomQueryHandler.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/SqlCustomQueryHandler.java @@ -21,11 +21,9 @@ import cn.hutool.core.util.ReflectUtil; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.query.api.QueryHandler; import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.QueryUnit; import com.gitee.dorive.query.impl.handler.QueryUnitQueryHandler; -import com.gitee.dorive.query.repository.AbstractQueryRepository; import lombok.Getter; import lombok.Setter; @@ -39,13 +37,12 @@ public class SqlCustomQueryHandler extends QueryUnitQueryHandler { private final EntityStoreInfo entityStoreInfo; - public SqlCustomQueryHandler(AbstractQueryRepository repository, QueryHandler queryHandler, EntityStoreInfo entityStoreInfo) { - super(repository, queryHandler); + public SqlCustomQueryHandler(EntityStoreInfo entityStoreInfo) { this.entityStoreInfo = entityStoreInfo; } @Override - public void handle(QueryContext queryContext, Object query) { + protected void doHandle(QueryContext queryContext, Object query) { super.handle(queryContext, query); Context context = queryContext.getContext(); diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java index dd6bacd5..930fc1d9 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java @@ -140,9 +140,9 @@ public class MybatisPlusRepository extends AbstractRefRepository i @Override protected void registryQueryHandlers(Map queryHandlerMap) { super.registryQueryHandlers(queryHandlerMap); - queryHandlerMap.put(QueryMethod.SQL_BUILD, new SqlBuildQueryHandler(this, null)); - queryHandlerMap.put(QueryMethod.SQL_EXECUTE, new SqlExecuteQueryHandler(this, null, sqlRunner)); - queryHandlerMap.put(QueryMethod.SQL_CUSTOM, new SqlCustomQueryHandler(this, null, entityStoreInfo)); + queryHandlerMap.put(QueryMethod.SQL_BUILD, new SqlBuildQueryHandler(this)); + queryHandlerMap.put(QueryMethod.SQL_EXECUTE, new SqlExecuteQueryHandler(this, sqlRunner)); + queryHandlerMap.put(QueryMethod.SQL_CUSTOM, new SqlCustomQueryHandler(entityStoreInfo)); } @Override diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/SegmentUnit.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryConfig.java similarity index 63% rename from dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/SegmentUnit.java rename to dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryConfig.java index 549975d8..e328bb79 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/SegmentUnit.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryConfig.java @@ -15,21 +15,20 @@ * limitations under the License. */ -package com.gitee.dorive.sql.entity.common; +package com.gitee.dorive.query.entity; -import com.gitee.dorive.query.entity.QueryUnit; -import com.gitee.dorive.sql.entity.segment.TableSegment; -import lombok.Getter; -import lombok.Setter; +import com.gitee.dorive.query.impl.resolver.QueryExampleResolver; +import lombok.Data; -@Getter -@Setter -public class SegmentUnit extends QueryUnit { +import java.util.List; - private TableSegment tableSegment; +@Data +public class QueryConfig { + private QueryExampleResolver queryExampleResolver; + private List mergedRepositories; + private List reversedMergedRepositories; - public String getTableAlias() { - return tableSegment.getTableAlias(); + public String getMethod() { + return queryExampleResolver.getQueryDefinition().getQueryDef().getMethod(); } - } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java index d0a33f5a..725d5929 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java @@ -21,7 +21,6 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.query.entity.enums.ResultType; -import com.gitee.dorive.query.impl.resolver.QueryExampleResolver; import lombok.Getter; import lombok.Setter; @@ -37,12 +36,12 @@ public class QueryContext { private ResultType resultType; private boolean abandoned; - private QueryExampleResolver queryExampleResolver; + private QueryConfig queryConfig; private String method; + private Map exampleMap; private Example example; - private List mergedRepositories; private Map queryUnitMap; private QueryUnit queryUnit; diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java index f1aa8f41..edb1d8bd 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java @@ -30,10 +30,10 @@ import java.util.Map; @NoArgsConstructor @AllArgsConstructor public class QueryUnit { - protected MergedRepository mergedRepository; protected Example example; protected boolean abandoned; + protected Object segment; public boolean isRoot() { return "/".equals(mergedRepository.getAbsoluteAccessPath()); @@ -52,5 +52,4 @@ public class QueryUnit { EntityStoreInfo entityStoreInfo = (EntityStoreInfo) attributes.get(EntityStoreInfo.class.getName()); return entityStoreInfo.getIdColumn(); } - } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/ExampleQueryHandler.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/ExampleQueryHandler.java index a2d55296..99e821b1 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/ExampleQueryHandler.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/ExampleQueryHandler.java @@ -20,6 +20,7 @@ package com.gitee.dorive.query.impl.handler; import cn.hutool.core.lang.Assert; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.query.api.QueryHandler; +import com.gitee.dorive.query.entity.QueryConfig; import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.impl.resolver.QueryExampleResolver; import com.gitee.dorive.query.impl.resolver.QueryTypeResolver; @@ -36,16 +37,17 @@ public class ExampleQueryHandler implements QueryHandler { @Override public void handle(QueryContext queryContext, Object query) { - QueryTypeResolver queryTypeResolver = repository.getQueryTypeResolver(); - Map, QueryExampleResolver> classQueryExampleResolverMap = queryTypeResolver.getClassQueryExampleResolverMap(); - Class queryType = queryContext.getQueryType(); - QueryExampleResolver queryExampleResolver = classQueryExampleResolverMap.get(queryType); - Assert.notNull(queryExampleResolver, "No query resolver found!"); - queryContext.setQueryExampleResolver(queryExampleResolver); - queryContext.setMethod(queryExampleResolver.getMethod()); + QueryTypeResolver queryTypeResolver = repository.getQueryTypeResolver(); + Map, QueryConfig> classQueryConfigMap = queryTypeResolver.getClassQueryConfigMap(); + QueryConfig queryConfig = classQueryConfigMap.get(queryType); + Assert.notNull(queryConfig, "No query config found!"); + + queryContext.setQueryConfig(queryConfig); + queryContext.setMethod(queryConfig.getMethod()); + QueryExampleResolver queryExampleResolver = queryConfig.getQueryExampleResolver(); Map exampleMap = queryExampleResolver.resolve(query); queryContext.setExampleMap(exampleMap); queryContext.setExample(exampleMap.get("/")); diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/QueryUnitQueryHandler.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/QueryUnitQueryHandler.java index e8b2a02f..431b07cc 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/QueryUnitQueryHandler.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/QueryUnitQueryHandler.java @@ -17,15 +17,12 @@ package com.gitee.dorive.query.impl.handler; -import cn.hutool.core.lang.Assert; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.query.api.QueryHandler; import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.QueryUnit; -import com.gitee.dorive.query.impl.resolver.QueryTypeResolver; -import com.gitee.dorive.query.repository.AbstractQueryRepository; import lombok.AllArgsConstructor; import java.util.LinkedHashMap; @@ -33,51 +30,37 @@ import java.util.List; import java.util.Map; @AllArgsConstructor -public class QueryUnitQueryHandler implements QueryHandler { - - protected final AbstractQueryRepository repository; - protected final QueryHandler queryHandler; +public abstract class QueryUnitQueryHandler implements QueryHandler { @Override public void handle(QueryContext queryContext, Object query) { - QueryTypeResolver queryTypeResolver = repository.getQueryTypeResolver(); - Map, List> classMergedRepositoriesMap = getClassMergedRepositoriesMap(queryTypeResolver); - - Class queryType = queryContext.getQueryType(); - List mergedRepositories = classMergedRepositoriesMap.get(queryType); - - Assert.notEmpty(mergedRepositories, "The merged repositories cannot be empty!"); - queryContext.setMergedRepositories(mergedRepositories); - Map queryUnitMap = newQueryUnitMap(queryContext); + queryContext.setQueryUnitMap(queryUnitMap); queryContext.setQueryUnit(queryUnitMap.get("/")); - - if (queryHandler != null) { - queryHandler.handle(queryContext, query); - } - } - - protected Map, List> getClassMergedRepositoriesMap(QueryTypeResolver queryTypeResolver) { - return queryTypeResolver.getClassMergedRepositoriesMap(); + doHandle(queryContext, query); } private Map newQueryUnitMap(QueryContext queryContext) { - List mergedRepositories = queryContext.getMergedRepositories(); Map exampleMap = queryContext.getExampleMap(); - Map queryUnitMap = new LinkedHashMap<>(); - // 后续可能用到 - queryContext.setQueryUnitMap(queryUnitMap); + List mergedRepositories = getMergedRepositories(queryContext); + Map queryUnitMap = new LinkedHashMap<>(mergedRepositories.size() * 4 / 3 + 1); for (MergedRepository mergedRepository : mergedRepositories) { String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); Example example = exampleMap.computeIfAbsent(absoluteAccessPath, key -> new InnerExample()); - QueryUnit queryUnit = newQueryUnit(queryContext, mergedRepository, example); + QueryUnit queryUnit = new QueryUnit(mergedRepository, example, false, null); + queryUnit = processQueryUnit(queryContext, queryUnitMap, queryUnit); queryUnitMap.put(absoluteAccessPath, queryUnit); } return queryUnitMap; } - protected QueryUnit newQueryUnit(QueryContext queryContext, MergedRepository mergedRepository, Example example) { - return new QueryUnit(mergedRepository, example, false); + protected List getMergedRepositories(QueryContext queryContext) { + return queryContext.getQueryConfig().getMergedRepositories(); + } + + protected QueryUnit processQueryUnit(QueryContext queryContext, Map queryUnitMap, QueryUnit queryUnit) { + return queryUnit; } + protected abstract void doHandle(QueryContext queryContext, Object query); } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/StepwiseQueryHandler.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/StepwiseQueryHandler.java index 7589c51a..48674a3a 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/StepwiseQueryHandler.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/StepwiseQueryHandler.java @@ -25,34 +25,24 @@ import com.gitee.dorive.core.impl.binder.ValueRouteBinder; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.repository.CommonRepository; import com.gitee.dorive.core.util.MultiInBuilder; -import com.gitee.dorive.query.api.QueryHandler; import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.QueryUnit; -import com.gitee.dorive.query.impl.resolver.QueryTypeResolver; -import com.gitee.dorive.query.repository.AbstractQueryRepository; import java.util.*; import java.util.stream.Collectors; public class StepwiseQueryHandler extends QueryUnitQueryHandler { - public StepwiseQueryHandler(AbstractQueryRepository repository, QueryHandler queryHandler) { - super(repository, queryHandler); - } - @Override - protected Map, List> getClassMergedRepositoriesMap(QueryTypeResolver queryTypeResolver) { - return queryTypeResolver.getClassReversedMergedRepositoriesMap(); + protected List getMergedRepositories(QueryContext queryContext) { + return queryContext.getQueryConfig().getReversedMergedRepositories(); } @Override - public void handle(QueryContext queryContext, Object query) { - super.handle(queryContext, query); - + protected void doHandle(QueryContext queryContext, Object query) { Context context = queryContext.getContext(); Map queryUnitMap = queryContext.getQueryUnitMap(); - queryUnitMap.forEach((accessPath, queryUnit) -> { if ("/".equals(accessPath)) return; diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryExampleResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryExampleResolver.java index beb315fc..141fe5ea 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryExampleResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryExampleResolver.java @@ -40,10 +40,6 @@ public class QueryExampleResolver { private QueryDefinition queryDefinition; - public String getMethod() { - return queryDefinition.getQueryDef().getMethod(); - } - public Map resolve(Object query) { Map exampleMap = newExampleMap(query); Example example = exampleMap.computeIfAbsent("/", key -> new InnerExample()); diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java index 8ebcc75b..117d7d60 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java @@ -25,6 +25,7 @@ import com.gitee.dorive.api.entity.query.def.QueryFieldDef; import com.gitee.dorive.api.impl.query.QueryDefinitionResolver; import com.gitee.dorive.core.repository.CommonRepository; import com.gitee.dorive.query.entity.MergedRepository; +import com.gitee.dorive.query.entity.QueryConfig; import com.gitee.dorive.query.repository.AbstractQueryRepository; import lombok.Data; @@ -35,9 +36,7 @@ import java.util.concurrent.ConcurrentHashMap; public class QueryTypeResolver { private AbstractQueryRepository repository; - private Map, QueryExampleResolver> classQueryExampleResolverMap = new ConcurrentHashMap<>(); - private Map, List> classMergedRepositoriesMap = new ConcurrentHashMap<>(); - private Map, List> classReversedMergedRepositoriesMap = new ConcurrentHashMap<>(); + private Map, QueryConfig> classQueryConfigMap = new ConcurrentHashMap<>(); public QueryTypeResolver(AbstractQueryRepository repository) { this.repository = repository; @@ -54,6 +53,7 @@ public class QueryTypeResolver { private void resolveQueryClass(Class queryClass) { QueryDefinitionResolver queryDefinitionResolver = new QueryDefinitionResolver(); QueryDefinition queryDefinition = queryDefinitionResolver.resolve(queryClass); + QueryExampleResolver queryExampleResolver = new QueryExampleResolver(queryDefinition); Set accessPaths = new HashSet<>(); List mergedRepositories = new ArrayList<>(); @@ -79,10 +79,11 @@ public class QueryTypeResolver { List reversedMergedRepositories = new ArrayList<>(mergedRepositories); Collections.reverse(reversedMergedRepositories); - QueryExampleResolver queryExampleResolver = new QueryExampleResolver(queryDefinition); - classQueryExampleResolverMap.put(queryClass, queryExampleResolver); - classMergedRepositoriesMap.put(queryClass, mergedRepositories); - classReversedMergedRepositoriesMap.put(queryClass, reversedMergedRepositories); + QueryConfig queryConfig = new QueryConfig(); + queryConfig.setQueryExampleResolver(queryExampleResolver); + queryConfig.setMergedRepositories(mergedRepositories); + queryConfig.setReversedMergedRepositories(reversedMergedRepositories); + classQueryConfigMap.put(queryClass, queryConfig); } private MergedRepository resetQueryField(QueryFieldDefinition queryFieldDefinition) { diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java index 8ee24e4f..d59e306c 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java @@ -72,7 +72,7 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi } protected void registryQueryHandlers(Map queryHandlerMap) { - queryHandlerMap.put(QueryMethod.STEPWISE, new StepwiseQueryHandler(this, null)); + queryHandlerMap.put(QueryMethod.STEPWISE, new StepwiseQueryHandler()); } @Override diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlBuildQueryHandler.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlBuildQueryHandler.java index d3553f8d..79e2fe88 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlBuildQueryHandler.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlBuildQueryHandler.java @@ -17,29 +17,33 @@ package com.gitee.dorive.sql.impl.handler; -import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.query.api.QueryHandler; -import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.QueryUnit; import com.gitee.dorive.query.impl.handler.QueryUnitQueryHandler; import com.gitee.dorive.query.repository.AbstractQueryRepository; -import com.gitee.dorive.sql.impl.segment.SegmentUnitResolver; +import com.gitee.dorive.sql.impl.segment.SegmentResolver; +import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; +import java.util.Map; + @Getter @Setter +@AllArgsConstructor public class SqlBuildQueryHandler extends QueryUnitQueryHandler { - public SqlBuildQueryHandler(AbstractQueryRepository repository, QueryHandler queryHandler) { - super(repository, queryHandler); - } + private final AbstractQueryRepository repository; @Override - protected QueryUnit newQueryUnit(QueryContext queryContext, MergedRepository mergedRepository, Example example) { - SegmentUnitResolver segmentUnitResolver = new SegmentUnitResolver(repository, queryContext, mergedRepository, example); - return segmentUnitResolver.resolve(); + protected QueryUnit processQueryUnit(QueryContext queryContext, Map queryUnitMap, QueryUnit queryUnit) { + SegmentResolver segmentResolver = new SegmentResolver(repository, queryContext, queryUnitMap, queryUnit); + queryUnit.setSegment(segmentResolver.resolve()); + return queryUnit; } + @Override + protected void doHandle(QueryContext queryContext, Object query) { + // ignore + } } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlExecuteQueryHandler.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlExecuteQueryHandler.java index 549d814d..7e7d74ea 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlExecuteQueryHandler.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlExecuteQueryHandler.java @@ -22,7 +22,6 @@ import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.entity.executor.Result; -import com.gitee.dorive.query.api.QueryHandler; import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.QueryUnit; import com.gitee.dorive.query.entity.enums.ResultType; @@ -45,18 +44,13 @@ public class SqlExecuteQueryHandler extends SqlBuildQueryHandler { private final SqlRunner sqlRunner; - public SqlExecuteQueryHandler(AbstractQueryRepository repository, QueryHandler queryHandler, SqlRunner sqlRunner) { - super(repository, queryHandler); + public SqlExecuteQueryHandler(AbstractQueryRepository repository, SqlRunner sqlRunner) { + super(repository); this.sqlRunner = sqlRunner; } @Override - public void handle(QueryContext queryContext, Object query) { - super.handle(queryContext, query); - doHandle(queryContext); - } - - protected void doHandle(QueryContext queryContext) { + protected void doHandle(QueryContext queryContext, Object query) { ResultType resultType = queryContext.getResultType(); Example example = queryContext.getExample(); QueryUnit queryUnit = queryContext.getQueryUnit(); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/querier/SqlCountQuerier.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/querier/SqlCountQuerier.java index c97c06cf..922ba6fc 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/querier/SqlCountQuerier.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/querier/SqlCountQuerier.java @@ -22,14 +22,15 @@ import com.gitee.dorive.api.entity.core.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.query.api.QueryHandler; import com.gitee.dorive.query.entity.QueryContext; +import com.gitee.dorive.query.entity.QueryUnit; import com.gitee.dorive.query.entity.enums.QueryMethod; import com.gitee.dorive.query.entity.enums.ResultType; import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.sql.api.CountQuerier; import com.gitee.dorive.sql.api.SqlRunner; import com.gitee.dorive.sql.entity.common.CountQuery; -import com.gitee.dorive.sql.entity.common.SegmentUnit; import com.gitee.dorive.sql.entity.segment.SelectSegment; +import com.gitee.dorive.sql.entity.segment.TableSegment; import com.gitee.dorive.sql.impl.segment.SelectSegmentBuilder; import lombok.AllArgsConstructor; import lombok.Getter; @@ -57,12 +58,13 @@ public class SqlCountQuerier implements CountQuerier { context.setOption(QueryMethod.class, QueryMethod.SQL_BUILD); queryHandler.handle(queryContext, query); - SegmentUnit segmentUnit = (SegmentUnit) queryContext.getQueryUnit(); - EntityElement entityElement = segmentUnit.getEntityElement(); - String tableAlias = segmentUnit.getTableAlias(); + QueryUnit queryUnit = queryContext.getQueryUnit(); + EntityElement entityElement = queryUnit.getEntityElement(); + TableSegment tableSegment = (TableSegment) queryUnit.getSegment(); + String tableAlias = tableSegment.getTableAlias(); SelectSegmentBuilder selectSegmentBuilder = new SelectSegmentBuilder(queryContext); - List segmentUnits = selectSegmentBuilder.select(countQuery.getSelector()); + List queryUnits = selectSegmentBuilder.select(countQuery.getSelector()); SelectSegment selectSegment = selectSegmentBuilder.build(); List args = selectSegment.getArgs(); @@ -72,8 +74,8 @@ public class SqlCountQuerier implements CountQuerier { selectSegment.setGroupBy("GROUP BY " + groupByColumns); // count by - SegmentUnit selectSegmentUnit = segmentUnits != null && !segmentUnits.isEmpty() ? segmentUnits.get(0) : segmentUnit; - String countByExp = buildCountByExp(countQuery, selectSegmentUnit); + QueryUnit selectQueryUnit = queryUnits != null && !queryUnits.isEmpty() ? queryUnits.get(0) : queryUnit; + String countByExp = buildCountByExp(countQuery, selectQueryUnit); // select columns List selectColumns = new ArrayList<>(2); @@ -87,9 +89,10 @@ public class SqlCountQuerier implements CountQuerier { return countMap; } - private String buildCountByExp(CountQuery countQuery, SegmentUnit segmentUnit) { - EntityElement entityElement = segmentUnit.getEntityElement(); - String tableAlias = segmentUnit.getTableAlias(); + private String buildCountByExp(CountQuery countQuery, QueryUnit queryUnit) { + EntityElement entityElement = queryUnit.getEntityElement(); + TableSegment tableSegment = (TableSegment) queryUnit.getSegment(); + String tableAlias = tableSegment.getTableAlias(); List countBy = entityElement.toAliases(countQuery.getCountBy()); String countByStr = CollUtil.join(countBy, ",',',", tableAlias + ".", null); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentUnitResolver.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentResolver.java similarity index 89% rename from dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentUnitResolver.java rename to dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentResolver.java index 4791da7a..23454413 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentUnitResolver.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentResolver.java @@ -34,7 +34,7 @@ import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.QueryUnit; import com.gitee.dorive.query.impl.resolver.MergedRepositoryResolver; import com.gitee.dorive.query.repository.AbstractQueryRepository; -import com.gitee.dorive.sql.entity.common.SegmentUnit; +import com.gitee.dorive.sql.api.Segment; import com.gitee.dorive.sql.entity.segment.*; import lombok.AllArgsConstructor; import lombok.Getter; @@ -48,15 +48,17 @@ import java.util.Set; @Getter @Setter @AllArgsConstructor -public class SegmentUnitResolver { +public class SegmentResolver { private AbstractQueryRepository repository; private QueryContext queryContext; - private MergedRepository mergedRepository; - private Example example; + private Map queryUnitMap; + private QueryUnit queryUnit; - public SegmentUnit resolve() { + public Segment resolve() { Context context = queryContext.getContext(); + MergedRepository mergedRepository = queryUnit.getMergedRepository(); + Example example = queryUnit.getExample(); Map attributes = mergedRepository.getAttributes(); EntityStoreInfo entityStoreInfo = (EntityStoreInfo) attributes.get(EntityStoreInfo.class.getName()); @@ -65,15 +67,13 @@ public class SegmentUnitResolver { String tableName = entityStoreInfo.getTableName(); exampleExecutor.convert(context, example); - SegmentUnit segmentUnit = new SegmentUnit(); - segmentUnit.setMergedRepository(mergedRepository); - segmentUnit.setExample(example); - segmentUnit.setAbandoned(false); - segmentUnit.setTableSegment(newTableSegment(tableName)); - return segmentUnit; + return newTableSegment(tableName); } private TableSegment newTableSegment(String tableName) { + MergedRepository mergedRepository = queryUnit.getMergedRepository(); + Example example = queryUnit.getExample(); + String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); TableSegment tableSegment = "/".equals(absoluteAccessPath) ? new TableSegment() : new TableJoinSegment(newOnSegments()); tableSegment.setTableName(tableName); @@ -88,9 +88,10 @@ public class SegmentUnitResolver { private List newOnSegments() { MergedRepositoryResolver mergedRepositoryResolver = repository.getMergedRepositoryResolver(); - Map mergedRepositoryMap = mergedRepositoryResolver.getMergedRepositoryMap(); - Context context = queryContext.getContext(); + MergedRepository mergedRepository = queryUnit.getMergedRepository(); + + Map mergedRepositoryMap = mergedRepositoryResolver.getMergedRepositoryMap(); CommonRepository definedRepository = mergedRepository.getDefinedRepository(); Map> mergedStrongBindersMap = mergedRepository.getMergedStrongBindersMap(); @@ -132,6 +133,9 @@ public class SegmentUnitResolver { private List newArgSegments() { List args = queryContext.getArgs(); + MergedRepository mergedRepository = queryUnit.getMergedRepository(); + Example example = queryUnit.getExample(); + String tableAlias = mergedRepository.getAlias(); List argSegments = new ArrayList<>(example.getCriteria().size()); for (Criterion criterion : example.getCriteria()) { @@ -153,14 +157,12 @@ public class SegmentUnitResolver { } private void setJoinForBound(MergedRepository mergedRepository) { - Map queryUnitMap = queryContext.getQueryUnitMap(); Set boundAccessPaths = mergedRepository.getBoundAccessPaths(); for (String boundAccessPath : boundAccessPaths) { - SegmentUnit segmentUnit = (SegmentUnit) queryUnitMap.get(boundAccessPath); - TableSegment tableSegment = segmentUnit.getTableSegment(); + QueryUnit queryUnit = queryUnitMap.get(boundAccessPath); + TableSegment tableSegment = (TableSegment) queryUnit.getSegment(); tableSegment.setJoin(true); - setJoinForBound(segmentUnit.getMergedRepository()); + setJoinForBound(queryUnit.getMergedRepository()); } } - } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java index 7974696d..820bd3e4 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java @@ -22,7 +22,6 @@ import com.gitee.dorive.core.repository.CommonRepository; import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.QueryUnit; -import com.gitee.dorive.sql.entity.common.SegmentUnit; import com.gitee.dorive.sql.entity.segment.ArgSegment; import com.gitee.dorive.sql.entity.segment.SelectSegment; import com.gitee.dorive.sql.entity.segment.TableJoinSegment; @@ -42,21 +41,20 @@ public class SelectSegmentBuilder { this.queryContext = queryContext; } - public List select(Selector selector) { - List segmentUnits = new ArrayList<>(4); + public List select(Selector selector) { + List queryUnits = new ArrayList<>(4); Map queryUnitMap = queryContext.getQueryUnitMap(); for (QueryUnit queryUnit : queryUnitMap.values()) { MergedRepository mergedRepository = queryUnit.getMergedRepository(); CommonRepository definedRepository = mergedRepository.getDefinedRepository(); boolean isMatch = definedRepository.matches(selector); if (isMatch) { - SegmentUnit segmentUnit = (SegmentUnit) queryUnit; - TableSegment tableSegment = segmentUnit.getTableSegment(); + TableSegment tableSegment = (TableSegment) queryUnit.getSegment(); tableSegment.setJoin(true); - segmentUnits.add(segmentUnit); + queryUnits.add(queryUnit); } } - return segmentUnits; + return queryUnits; } public SelectSegment build() { @@ -66,9 +64,8 @@ public class SelectSegmentBuilder { Map queryUnitMap = queryContext.getQueryUnitMap(); for (QueryUnit queryUnit : queryUnitMap.values()) { - SegmentUnit segmentUnit = (SegmentUnit) queryUnit; - TableSegment tableSegment = segmentUnit.getTableSegment(); - if (segmentUnit.isRoot()) { + TableSegment tableSegment = (TableSegment) queryUnit.getSegment(); + if (queryUnit.isRoot()) { selectSegment.setTableSegment(tableSegment); } else if (tableSegment.isJoin()) { -- Gitee From 9043ece209f116c325fc9685ca3a8947aecda3b5 Mon Sep 17 00:00:00 2001 From: chenT <609580885@qq.com> Date: Fri, 10 Jan 2025 09:45:35 +0800 Subject: [PATCH 13/21] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/mybatis/plus/impl/SqlCustomQueryHandler.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/SqlCustomQueryHandler.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/SqlCustomQueryHandler.java index 2a343b08..25712127 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/SqlCustomQueryHandler.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/SqlCustomQueryHandler.java @@ -43,8 +43,6 @@ public class SqlCustomQueryHandler extends QueryUnitQueryHandler { @Override protected void doHandle(QueryContext queryContext, Object query) { - super.handle(queryContext, query); - Context context = queryContext.getContext(); String method = queryContext.getMethod(); -- Gitee From 62dcf9c1d28e76a7d59e9930662a7733fb7b9fd8 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Sat, 11 Jan 2025 15:34:49 +0800 Subject: [PATCH 14/21] =?UTF-8?q?=E6=8B=86=E5=88=86=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plus/impl/SqlCustomQueryHandler.java | 4 +- .../gitee/dorive/query/entity/QueryUnit.java | 2 +- ...ava => AbstractQueryUnitQueryHandler.java} | 2 +- .../impl/handler/ConfigQueryHandler.java | 52 +++++++++++++++++++ .../impl/handler/ExampleQueryHandler.java | 17 +----- .../impl/handler/StepwiseQueryHandler.java | 2 +- .../repository/AbstractQueryRepository.java | 3 +- .../impl/handler/SqlBuildQueryHandler.java | 6 +-- .../sql/impl/querier/SqlCountQuerier.java | 4 +- .../sql/impl/segment/SegmentResolver.java | 2 +- .../impl/segment/SelectSegmentBuilder.java | 4 +- 11 files changed, 68 insertions(+), 30 deletions(-) rename dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/{QueryUnitQueryHandler.java => AbstractQueryUnitQueryHandler.java} (97%) create mode 100644 dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/ConfigQueryHandler.java diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/SqlCustomQueryHandler.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/SqlCustomQueryHandler.java index 25712127..95c13e68 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/SqlCustomQueryHandler.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/SqlCustomQueryHandler.java @@ -23,7 +23,7 @@ import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.QueryUnit; -import com.gitee.dorive.query.impl.handler.QueryUnitQueryHandler; +import com.gitee.dorive.query.impl.handler.AbstractQueryUnitQueryHandler; import lombok.Getter; import lombok.Setter; @@ -33,7 +33,7 @@ import java.util.Map; @Getter @Setter -public class SqlCustomQueryHandler extends QueryUnitQueryHandler { +public class SqlCustomQueryHandler extends AbstractQueryUnitQueryHandler { private final EntityStoreInfo entityStoreInfo; diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java index edb1d8bd..9962caef 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java @@ -33,7 +33,7 @@ public class QueryUnit { protected MergedRepository mergedRepository; protected Example example; protected boolean abandoned; - protected Object segment; + protected Object attachment; public boolean isRoot() { return "/".equals(mergedRepository.getAbsoluteAccessPath()); diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/QueryUnitQueryHandler.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/AbstractQueryUnitQueryHandler.java similarity index 97% rename from dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/QueryUnitQueryHandler.java rename to dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/AbstractQueryUnitQueryHandler.java index 431b07cc..11cce331 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/QueryUnitQueryHandler.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/AbstractQueryUnitQueryHandler.java @@ -30,7 +30,7 @@ import java.util.List; import java.util.Map; @AllArgsConstructor -public abstract class QueryUnitQueryHandler implements QueryHandler { +public abstract class AbstractQueryUnitQueryHandler implements QueryHandler { @Override public void handle(QueryContext queryContext, Object query) { diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/ConfigQueryHandler.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/ConfigQueryHandler.java new file mode 100644 index 00000000..21cdadb9 --- /dev/null +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/ConfigQueryHandler.java @@ -0,0 +1,52 @@ +/* + * 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 com.gitee.dorive.query.impl.handler; + +import cn.hutool.core.lang.Assert; +import com.gitee.dorive.query.api.QueryHandler; +import com.gitee.dorive.query.entity.QueryConfig; +import com.gitee.dorive.query.entity.QueryContext; +import com.gitee.dorive.query.impl.resolver.QueryTypeResolver; +import com.gitee.dorive.query.repository.AbstractQueryRepository; +import lombok.AllArgsConstructor; + +import java.util.Map; + +@AllArgsConstructor +public class ConfigQueryHandler implements QueryHandler { + + private final AbstractQueryRepository repository; + private final QueryHandler queryHandler; + + @Override + public void handle(QueryContext queryContext, Object query) { + Class queryType = queryContext.getQueryType(); + + QueryTypeResolver queryTypeResolver = repository.getQueryTypeResolver(); + Map, QueryConfig> classQueryConfigMap = queryTypeResolver.getClassQueryConfigMap(); + QueryConfig queryConfig = classQueryConfigMap.get(queryType); + Assert.notNull(queryConfig, "No query config found!"); + + queryContext.setQueryConfig(queryConfig); + queryContext.setMethod(queryConfig.getMethod()); + + if (queryHandler != null) { + queryHandler.handle(queryContext, query); + } + } +} diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/ExampleQueryHandler.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/ExampleQueryHandler.java index 99e821b1..303587c6 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/ExampleQueryHandler.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/ExampleQueryHandler.java @@ -17,14 +17,11 @@ package com.gitee.dorive.query.impl.handler; -import cn.hutool.core.lang.Assert; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.query.api.QueryHandler; import com.gitee.dorive.query.entity.QueryConfig; import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.impl.resolver.QueryExampleResolver; -import com.gitee.dorive.query.impl.resolver.QueryTypeResolver; -import com.gitee.dorive.query.repository.AbstractQueryRepository; import lombok.AllArgsConstructor; import java.util.Map; @@ -32,29 +29,17 @@ import java.util.Map; @AllArgsConstructor public class ExampleQueryHandler implements QueryHandler { - private final AbstractQueryRepository repository; private final QueryHandler queryHandler; @Override public void handle(QueryContext queryContext, Object query) { - Class queryType = queryContext.getQueryType(); - - QueryTypeResolver queryTypeResolver = repository.getQueryTypeResolver(); - Map, QueryConfig> classQueryConfigMap = queryTypeResolver.getClassQueryConfigMap(); - QueryConfig queryConfig = classQueryConfigMap.get(queryType); - Assert.notNull(queryConfig, "No query config found!"); - - queryContext.setQueryConfig(queryConfig); - queryContext.setMethod(queryConfig.getMethod()); - + QueryConfig queryConfig = queryContext.getQueryConfig(); QueryExampleResolver queryExampleResolver = queryConfig.getQueryExampleResolver(); Map exampleMap = queryExampleResolver.resolve(query); queryContext.setExampleMap(exampleMap); queryContext.setExample(exampleMap.get("/")); - if (queryHandler != null) { queryHandler.handle(queryContext, query); } } - } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/StepwiseQueryHandler.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/StepwiseQueryHandler.java index 48674a3a..8b0d0156 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/StepwiseQueryHandler.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/StepwiseQueryHandler.java @@ -32,7 +32,7 @@ import com.gitee.dorive.query.entity.QueryUnit; import java.util.*; import java.util.stream.Collectors; -public class StepwiseQueryHandler extends QueryUnitQueryHandler { +public class StepwiseQueryHandler extends AbstractQueryUnitQueryHandler { @Override protected List getMergedRepositories(QueryContext queryContext) { diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java index d59e306c..cd2a5516 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java @@ -67,7 +67,8 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi QueryHandler queryHandler = new AdaptiveQueryHandler(queryHandlerMap); queryHandler = new SimpleQueryHandler(queryHandler); queryHandler = new ContextMatchQueryHandler(this, queryHandler); - queryHandler = new ExampleQueryHandler(this, queryHandler); + queryHandler = new ExampleQueryHandler(queryHandler); + queryHandler = new ConfigQueryHandler(this, queryHandler); this.queryHandler = queryHandler; } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlBuildQueryHandler.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlBuildQueryHandler.java index 79e2fe88..8a20ed24 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlBuildQueryHandler.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlBuildQueryHandler.java @@ -19,7 +19,7 @@ package com.gitee.dorive.sql.impl.handler; import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.QueryUnit; -import com.gitee.dorive.query.impl.handler.QueryUnitQueryHandler; +import com.gitee.dorive.query.impl.handler.AbstractQueryUnitQueryHandler; import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.sql.impl.segment.SegmentResolver; import lombok.AllArgsConstructor; @@ -31,14 +31,14 @@ import java.util.Map; @Getter @Setter @AllArgsConstructor -public class SqlBuildQueryHandler extends QueryUnitQueryHandler { +public class SqlBuildQueryHandler extends AbstractQueryUnitQueryHandler { private final AbstractQueryRepository repository; @Override protected QueryUnit processQueryUnit(QueryContext queryContext, Map queryUnitMap, QueryUnit queryUnit) { SegmentResolver segmentResolver = new SegmentResolver(repository, queryContext, queryUnitMap, queryUnit); - queryUnit.setSegment(segmentResolver.resolve()); + queryUnit.setAttachment(segmentResolver.resolve()); return queryUnit; } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/querier/SqlCountQuerier.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/querier/SqlCountQuerier.java index 922ba6fc..eb9ed452 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/querier/SqlCountQuerier.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/querier/SqlCountQuerier.java @@ -60,7 +60,7 @@ public class SqlCountQuerier implements CountQuerier { QueryUnit queryUnit = queryContext.getQueryUnit(); EntityElement entityElement = queryUnit.getEntityElement(); - TableSegment tableSegment = (TableSegment) queryUnit.getSegment(); + TableSegment tableSegment = (TableSegment) queryUnit.getAttachment(); String tableAlias = tableSegment.getTableAlias(); SelectSegmentBuilder selectSegmentBuilder = new SelectSegmentBuilder(queryContext); @@ -91,7 +91,7 @@ public class SqlCountQuerier implements CountQuerier { private String buildCountByExp(CountQuery countQuery, QueryUnit queryUnit) { EntityElement entityElement = queryUnit.getEntityElement(); - TableSegment tableSegment = (TableSegment) queryUnit.getSegment(); + TableSegment tableSegment = (TableSegment) queryUnit.getAttachment(); String tableAlias = tableSegment.getTableAlias(); List countBy = entityElement.toAliases(countQuery.getCountBy()); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentResolver.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentResolver.java index 23454413..171d0c77 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentResolver.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentResolver.java @@ -160,7 +160,7 @@ public class SegmentResolver { Set boundAccessPaths = mergedRepository.getBoundAccessPaths(); for (String boundAccessPath : boundAccessPaths) { QueryUnit queryUnit = queryUnitMap.get(boundAccessPath); - TableSegment tableSegment = (TableSegment) queryUnit.getSegment(); + TableSegment tableSegment = (TableSegment) queryUnit.getAttachment(); tableSegment.setJoin(true); setJoinForBound(queryUnit.getMergedRepository()); } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java index 820bd3e4..c7b9b7eb 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java @@ -49,7 +49,7 @@ public class SelectSegmentBuilder { CommonRepository definedRepository = mergedRepository.getDefinedRepository(); boolean isMatch = definedRepository.matches(selector); if (isMatch) { - TableSegment tableSegment = (TableSegment) queryUnit.getSegment(); + TableSegment tableSegment = (TableSegment) queryUnit.getAttachment(); tableSegment.setJoin(true); queryUnits.add(queryUnit); } @@ -64,7 +64,7 @@ public class SelectSegmentBuilder { Map queryUnitMap = queryContext.getQueryUnitMap(); for (QueryUnit queryUnit : queryUnitMap.values()) { - TableSegment tableSegment = (TableSegment) queryUnit.getSegment(); + TableSegment tableSegment = (TableSegment) queryUnit.getAttachment(); if (queryUnit.isRoot()) { selectSegment.setTableSegment(tableSegment); -- Gitee From 1446d0ea64e8de0d93626212ec0d2c57f4b95dd5 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Sat, 11 Jan 2025 18:54:39 +0800 Subject: [PATCH 15/21] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatis/plus/impl/SqlCustomQueryHandler.java | 6 ++---- .../gitee/dorive/query/entity/QueryConfig.java | 16 ++++++++++++++++ .../gitee/dorive/query/entity/QueryContext.java | 2 ++ .../com/gitee/dorive/query/entity/QueryUnit.java | 13 ------------- .../query/impl/handler/ConfigQueryHandler.java | 2 ++ .../query/impl/resolver/QueryTypeResolver.java | 1 + .../sql/impl/handler/SqlExecuteQueryHandler.java | 5 ++--- 7 files changed, 25 insertions(+), 20 deletions(-) diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/SqlCustomQueryHandler.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/SqlCustomQueryHandler.java index 95c13e68..6c538cd0 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/SqlCustomQueryHandler.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/SqlCustomQueryHandler.java @@ -22,7 +22,6 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.query.entity.QueryContext; -import com.gitee.dorive.query.entity.QueryUnit; import com.gitee.dorive.query.impl.handler.AbstractQueryUnitQueryHandler; import lombok.Getter; import lombok.Setter; @@ -44,7 +43,9 @@ public class SqlCustomQueryHandler extends AbstractQueryUnitQueryHandler { @Override protected void doHandle(QueryContext queryContext, Object query) { Context context = queryContext.getContext(); + String primaryKey = queryContext.getPrimaryKey(); String method = queryContext.getMethod(); + Example example = queryContext.getExample(); Object mapper = entityStoreInfo.getMapper(); Map selectMethodMap = entityStoreInfo.getSelectMethodMap(); @@ -53,9 +54,6 @@ public class SqlCustomQueryHandler extends AbstractQueryUnitQueryHandler { List ids = ReflectUtil.invoke(mapper, selectMethod, attachments, query); if (!ids.isEmpty()) { - Example example = queryContext.getExample(); - QueryUnit queryUnit = queryContext.getQueryUnit(); - String primaryKey = queryUnit.getPrimaryKey(); example.in(primaryKey, ids); } else { queryContext.setAbandoned(true); diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryConfig.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryConfig.java index e328bb79..29aa2276 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryConfig.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryConfig.java @@ -17,17 +17,33 @@ package com.gitee.dorive.query.entity; +import com.gitee.dorive.api.entity.core.EntityElement; import com.gitee.dorive.query.impl.resolver.QueryExampleResolver; +import com.gitee.dorive.query.repository.AbstractQueryRepository; import lombok.Data; import java.util.List; @Data public class QueryConfig { + private AbstractQueryRepository repository; private QueryExampleResolver queryExampleResolver; private List mergedRepositories; private List reversedMergedRepositories; + public EntityElement getEntityElement() { + return repository.getEntityElement(); + } + + public String getPrimaryKey() { + return getEntityElement().getPrimaryKey(); + } + + public String getPrimaryKeyAlias() { + EntityElement entityElement = getEntityElement(); + return entityElement.toAlias(entityElement.getPrimaryKey()); + } + public String getMethod() { return queryExampleResolver.getQueryDefinition().getQueryDef().getMethod(); } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java index 725d5929..a19b3c36 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java @@ -37,6 +37,8 @@ public class QueryContext { private boolean abandoned; private QueryConfig queryConfig; + private String primaryKey; + private String primaryKeyAlias; private String method; private Map exampleMap; diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java index 9962caef..0a42c181 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java @@ -18,14 +18,11 @@ package com.gitee.dorive.query.entity; import com.gitee.dorive.api.entity.core.EntityElement; -import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.Example; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import java.util.Map; - @Data @NoArgsConstructor @AllArgsConstructor @@ -42,14 +39,4 @@ public class QueryUnit { public EntityElement getEntityElement() { return mergedRepository.getExecutedRepository().getEntityElement(); } - - public String getPrimaryKey() { - return getEntityElement().getPrimaryKey(); - } - - public String getPrimaryKeyAlias() { - Map attributes = mergedRepository.getAttributes(); - EntityStoreInfo entityStoreInfo = (EntityStoreInfo) attributes.get(EntityStoreInfo.class.getName()); - return entityStoreInfo.getIdColumn(); - } } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/ConfigQueryHandler.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/ConfigQueryHandler.java index 21cdadb9..40b34a59 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/ConfigQueryHandler.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/ConfigQueryHandler.java @@ -43,6 +43,8 @@ public class ConfigQueryHandler implements QueryHandler { Assert.notNull(queryConfig, "No query config found!"); queryContext.setQueryConfig(queryConfig); + queryContext.setPrimaryKey(queryConfig.getPrimaryKey()); + queryContext.setPrimaryKeyAlias(queryConfig.getPrimaryKeyAlias()); queryContext.setMethod(queryConfig.getMethod()); if (queryHandler != null) { diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java index 117d7d60..29717702 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java @@ -80,6 +80,7 @@ public class QueryTypeResolver { Collections.reverse(reversedMergedRepositories); QueryConfig queryConfig = new QueryConfig(); + queryConfig.setRepository(repository); queryConfig.setQueryExampleResolver(queryExampleResolver); queryConfig.setMergedRepositories(mergedRepositories); queryConfig.setReversedMergedRepositories(reversedMergedRepositories); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlExecuteQueryHandler.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlExecuteQueryHandler.java index 7e7d74ea..afb353da 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlExecuteQueryHandler.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlExecuteQueryHandler.java @@ -52,6 +52,8 @@ public class SqlExecuteQueryHandler extends SqlBuildQueryHandler { @Override protected void doHandle(QueryContext queryContext, Object query) { ResultType resultType = queryContext.getResultType(); + String primaryKey = queryContext.getPrimaryKey(); + String primaryKeyAlias = queryContext.getPrimaryKeyAlias(); Example example = queryContext.getExample(); QueryUnit queryUnit = queryContext.getQueryUnit(); @@ -60,9 +62,6 @@ public class SqlExecuteQueryHandler extends SqlBuildQueryHandler { OrderBy orderBy = example.getOrderBy(); Page page = example.getPage(); - String primaryKey = queryUnit.getPrimaryKey(); - String primaryKeyAlias = queryUnit.getPrimaryKeyAlias(); - SelectSegmentBuilder selectSegmentBuilder = new SelectSegmentBuilder(queryContext); SelectSegment selectSegment = selectSegmentBuilder.build(); -- Gitee From cef59815b1e8641a6698527ea0e5ae6ac57f64ec Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Sat, 11 Jan 2025 19:11:02 +0800 Subject: [PATCH 16/21] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/mybatis/plus/repository/MybatisPlusRepository.java | 2 +- .../gitee/dorive/sql/impl/handler}/SqlCustomQueryHandler.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename {dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl => dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler}/SqlCustomQueryHandler.java (98%) diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java index 930fc1d9..8f7dd8a4 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java @@ -31,7 +31,7 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.mybatis.plus.executor.MybatisPlusExecutor; -import com.gitee.dorive.mybatis.plus.impl.SqlCustomQueryHandler; +import com.gitee.dorive.sql.impl.handler.SqlCustomQueryHandler; import com.gitee.dorive.query.api.QueryHandler; import com.gitee.dorive.query.entity.enums.QueryMethod; import com.gitee.dorive.ref.repository.AbstractRefRepository; diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/SqlCustomQueryHandler.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlCustomQueryHandler.java similarity index 98% rename from dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/SqlCustomQueryHandler.java rename to dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlCustomQueryHandler.java index 6c538cd0..5db23a0d 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/SqlCustomQueryHandler.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlCustomQueryHandler.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.mybatis.plus.impl; +package com.gitee.dorive.sql.impl.handler; import cn.hutool.core.util.ReflectUtil; import com.gitee.dorive.core.api.context.Context; -- Gitee From a08f950297f61d68514c50808c2dd74c0265deb3 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Sat, 11 Jan 2025 19:18:10 +0800 Subject: [PATCH 17/21] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/sql/impl/handler/SqlCustomQueryHandler.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlCustomQueryHandler.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlCustomQueryHandler.java index 5db23a0d..f480249a 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlCustomQueryHandler.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlCustomQueryHandler.java @@ -21,8 +21,8 @@ import cn.hutool.core.util.ReflectUtil; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.query.api.QueryHandler; import com.gitee.dorive.query.entity.QueryContext; -import com.gitee.dorive.query.impl.handler.AbstractQueryUnitQueryHandler; import lombok.Getter; import lombok.Setter; @@ -32,7 +32,7 @@ import java.util.Map; @Getter @Setter -public class SqlCustomQueryHandler extends AbstractQueryUnitQueryHandler { +public class SqlCustomQueryHandler implements QueryHandler { private final EntityStoreInfo entityStoreInfo; @@ -41,7 +41,7 @@ public class SqlCustomQueryHandler extends AbstractQueryUnitQueryHandler { } @Override - protected void doHandle(QueryContext queryContext, Object query) { + public void handle(QueryContext queryContext, Object query) { Context context = queryContext.getContext(); String primaryKey = queryContext.getPrimaryKey(); String method = queryContext.getMethod(); @@ -59,5 +59,4 @@ public class SqlCustomQueryHandler extends AbstractQueryUnitQueryHandler { queryContext.setAbandoned(true); } } - } -- Gitee From ad37602e6e6a1622524cb454eed1910eb8742c36 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Sat, 11 Jan 2025 21:38:50 +0800 Subject: [PATCH 18/21] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sql/impl/handler/SqlCustomQueryHandler.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlCustomQueryHandler.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlCustomQueryHandler.java index f480249a..f5d64963 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlCustomQueryHandler.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlCustomQueryHandler.java @@ -27,6 +27,7 @@ import lombok.Getter; import lombok.Setter; import java.lang.reflect.Method; +import java.util.Collections; import java.util.List; import java.util.Map; @@ -52,9 +53,16 @@ public class SqlCustomQueryHandler implements QueryHandler { Method selectMethod = selectMethodMap.get(method); Map attachments = context.getAttachments(); - List ids = ReflectUtil.invoke(mapper, selectMethod, attachments, query); - if (!ids.isEmpty()) { - example.in(primaryKey, ids); + int parameterCount = selectMethod.getParameterCount(); + List primaryKeys = Collections.emptyList(); + if (parameterCount == 1) { + primaryKeys = ReflectUtil.invoke(mapper, selectMethod, query); + + } else if (parameterCount == 2) { + primaryKeys = ReflectUtil.invoke(mapper, selectMethod, attachments, query); + } + if (!primaryKeys.isEmpty()) { + example.in(primaryKey, primaryKeys); } else { queryContext.setAbandoned(true); } -- Gitee From e13cf976622463fcece43cc609addb0a02a7e653 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Sat, 11 Jan 2025 21:41:26 +0800 Subject: [PATCH 19/21] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/mybatis/plus/repository/MybatisPlusRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java index 8f7dd8a4..19a920e5 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java @@ -124,7 +124,7 @@ public class MybatisPlusRepository extends AbstractRefRepository i Map selectMethodMap = new ConcurrentHashMap<>(8); for (Method method : ReflectUtil.getMethodsDirectly(mapperClass, false, false)) { String name = method.getName(); - if (name.startsWith("select")) { + if (name.startsWith("select") || name.startsWith("query")) { selectMethodMap.putIfAbsent(name, method); } } -- Gitee From f023fdd2e4c74d69af27bbae0d42d2a63a54cdd7 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Sat, 11 Jan 2025 22:19:43 +0800 Subject: [PATCH 20/21] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/sql/impl/handler/SqlCustomQueryHandler.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlCustomQueryHandler.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlCustomQueryHandler.java index f5d64963..d0467117 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlCustomQueryHandler.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlCustomQueryHandler.java @@ -54,15 +54,15 @@ public class SqlCustomQueryHandler implements QueryHandler { Map attachments = context.getAttachments(); int parameterCount = selectMethod.getParameterCount(); - List primaryKeys = Collections.emptyList(); + List ids = Collections.emptyList(); if (parameterCount == 1) { - primaryKeys = ReflectUtil.invoke(mapper, selectMethod, query); + ids = ReflectUtil.invoke(mapper, selectMethod, query); } else if (parameterCount == 2) { - primaryKeys = ReflectUtil.invoke(mapper, selectMethod, attachments, query); + ids = ReflectUtil.invoke(mapper, selectMethod, attachments, query); } - if (!primaryKeys.isEmpty()) { - example.in(primaryKey, primaryKeys); + if (!ids.isEmpty()) { + example.in(primaryKey, ids); } else { queryContext.setAbandoned(true); } -- Gitee From f0688cb6b8cd721f09576d5a1e8eac61ba5eb5d3 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Sat, 11 Jan 2025 22:38:14 +0800 Subject: [PATCH 21/21] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dorive-api/pom.xml | 2 +- dorive-core/pom.xml | 2 +- dorive-env/pom.xml | 2 +- dorive-event/pom.xml | 2 +- dorive-inject/pom.xml | 2 +- dorive-mybatis-plus/pom.xml | 2 +- dorive-query/pom.xml | 2 +- dorive-ref/pom.xml | 2 +- dorive-spring-boot-starter/pom.xml | 2 +- dorive-sql/pom.xml | 2 +- dorive-web/pom.xml | 2 +- pom.xml | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/dorive-api/pom.xml b/dorive-api/pom.xml index 690528bb..9ab13060 100644 --- a/dorive-api/pom.xml +++ b/dorive-api/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.5 + 3.5.0.6 dorive-api diff --git a/dorive-core/pom.xml b/dorive-core/pom.xml index 0d72afd7..b693efee 100644 --- a/dorive-core/pom.xml +++ b/dorive-core/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.5 + 3.5.0.6 dorive-core diff --git a/dorive-env/pom.xml b/dorive-env/pom.xml index d31d3c83..af7c9372 100644 --- a/dorive-env/pom.xml +++ b/dorive-env/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.5 + 3.5.0.6 dorive-env diff --git a/dorive-event/pom.xml b/dorive-event/pom.xml index db06c50c..fb344b3e 100644 --- a/dorive-event/pom.xml +++ b/dorive-event/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.5 + 3.5.0.6 dorive-event diff --git a/dorive-inject/pom.xml b/dorive-inject/pom.xml index 1366595f..5dea9ba4 100644 --- a/dorive-inject/pom.xml +++ b/dorive-inject/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.5 + 3.5.0.6 dorive-inject diff --git a/dorive-mybatis-plus/pom.xml b/dorive-mybatis-plus/pom.xml index b9e886ec..da60b395 100644 --- a/dorive-mybatis-plus/pom.xml +++ b/dorive-mybatis-plus/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.5 + 3.5.0.6 dorive-mybatis-plus diff --git a/dorive-query/pom.xml b/dorive-query/pom.xml index b9d05910..4c8d4e91 100644 --- a/dorive-query/pom.xml +++ b/dorive-query/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.5 + 3.5.0.6 dorive-query diff --git a/dorive-ref/pom.xml b/dorive-ref/pom.xml index 4e8cc32d..c19fcf30 100644 --- a/dorive-ref/pom.xml +++ b/dorive-ref/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.5 + 3.5.0.6 dorive-ref diff --git a/dorive-spring-boot-starter/pom.xml b/dorive-spring-boot-starter/pom.xml index 8b098e3f..b8f1c33e 100644 --- a/dorive-spring-boot-starter/pom.xml +++ b/dorive-spring-boot-starter/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.5 + 3.5.0.6 dorive-spring-boot-starter pom diff --git a/dorive-sql/pom.xml b/dorive-sql/pom.xml index 43bffe79..eda6cebd 100644 --- a/dorive-sql/pom.xml +++ b/dorive-sql/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.5 + 3.5.0.6 dorive-sql diff --git a/dorive-web/pom.xml b/dorive-web/pom.xml index 13b4cd7f..e8a994d0 100644 --- a/dorive-web/pom.xml +++ b/dorive-web/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.5 + 3.5.0.6 dorive-web diff --git a/pom.xml b/pom.xml index 53e6cccc..0d12ef57 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.gitee.digital-engine dorive - 3.5.0.5 + 3.5.0.6 pom -- Gitee