diff --git a/dorive-api/pom.xml b/dorive-api/pom.xml index 690528bbf1ca278957f766edf02d09f6d16e210f..9ab13060240994ebcd6ea4a0ed5c04228a2d69dc 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-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 18f7bdecb53fd0dabf47730f70ac0cdb29f89c92..e0130ccced1bc34ee4c17e17ad2fa9a6424b43de 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 7a98b703f9ab62db1ee814b6409f54995e51d6ee..43fc31f6744828dc295192ca2abd76f8d2201a24 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 bd6a37c31b3512271a5aa85fe1f05e033ec9f424..7596ee6197dfb9ef08d7672e952af7cc5087c3f9 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 f147c77188fb2d213d3712a3b59e95c169e2d777..d47641b0447e0bd0f090990635c0d9d94e13c4ac 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/pom.xml b/dorive-core/pom.xml index 0d72afd776d0190ee6b6ccaadb816e0f67a89fd5..b693efee801e2bb963404dba3433e506a4f8f0c6 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-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 4942b0ab607e2b3403dbdf005f4cabfdf3ea7b1c..0311af50e62ccfd9472a7e5847e83200ca0141e7 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 Map selectMethodMap; } diff --git a/dorive-env/pom.xml b/dorive-env/pom.xml index d31d3c83b0cdddde96ca49d25346aab74480fe6e..af7c9372b9e1ce7360cb44baa35034e1b07a6e6a 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 db06c50c7cd9e61e8ee0ef52201376ad65adc77e..fb344b3ecf84f20718a7ddb89b8159863da66dab 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 1366595f6f7d8e46bf185dfffef109354a3dbe92..5dea9ba47f48145a5789dc8504a1b8b110d90e49 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-inject/src/main/java/com/gitee/dorive/inject/annotation/Root.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/api/ModuleChecker.java similarity index 81% 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/ModuleChecker.java index 00531fef57d8bc9aefb682bca91192199d40ed24..718f52d0d9ef6edb9d1f1c731b9648b9e36cdebb 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/ModuleChecker.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 ModuleChecker { + + boolean isUnderScanPackage(Class typeToMatch); + + void checkInjection(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 3fd6e0b823b7458d1b5a11db9795764f5d96590d..a382ec493c38034250417866cfadd429e8dac2b1 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.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.spring.LimitedRootInitializingBean; -import com.gitee.dorive.inject.api.TypeDomainResolver; -import com.gitee.dorive.inject.entity.DomainDefinition; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; @@ -32,49 +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 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"; + public static ModuleChecker moduleChecker; @Override - public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { - if (beanFactory instanceof AbstractAutowireCapableBeanFactory) { - AbstractAutowireCapableBeanFactory abstractAutowireCapableBeanFactory = (AbstractAutowireCapableBeanFactory) beanFactory; - abstractAutowireCapableBeanFactory.setInstantiationStrategy(new LimitedCglibSubclassingInstantiationStrategy()); - } + 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(Comparator.comparing(ModuleDefinition::getName)); + moduleChecker = new DefaultModuleChecker(scanPackage, moduleDefinitions); } - @Bean("typeDomainResolverV3") - @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); + @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(TypeDomainResolver typeDomainResolver) { - return new LimitedAutowiredBeanPostProcessor(typeDomainResolver); - } - - @Bean("limitedRootInitializingBeanV3") - @ConditionalOnMissingClass - public LimitedRootInitializingBean limitedRootInitializingBean(TypeDomainResolver typeDomainResolver) { - return new LimitedRootInitializingBean(typeDomainResolver); + public LimitedAutowiredBeanPostProcessor limitedAnnotationBeanPostProcessor() { + return new LimitedAutowiredBeanPostProcessor(moduleChecker); } } 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 afc5e0d17040e2d79e984bd65e0ca9c81fbe6819..702e14cebdc3367c57777bcee459f5f2d7766b3a 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 1ea67118bd84d97c3dc4b380fbf794c5dff5f469..38c7561af17c978c4805ae67ad6a28ab4aebb4cd 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/DefaultModuleChecker.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/DefaultModuleChecker.java index 39015df173f3260573d39343c0c64a6ba1e9aaad..6d4ee49bda0ec6f63b9a149974ff861789cb1858 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/DefaultModuleChecker.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.ModuleChecker; +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 DefaultModuleChecker implements ModuleChecker { 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 DefaultModuleChecker(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 checkInjection(Class type, Class injectedType) { + if (isUnderScanPackage(injectedType)) { + // 模块定义不存在,则判定为通过 + ModuleDefinition moduleDefinition = findModuleDefinition(injectedType); + if (moduleDefinition == null) { + return; + } + // 在公开的包路径下,则判定为通过 + ExportDefinition exportDefinition = findExportDefinition(injectedType, moduleDefinition); + if (exportDefinition != null) { + 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(); + private ExportDefinition findExportDefinition(Class typeToMatch, ModuleDefinition moduleDefinition) { + return CollUtil.findOne(moduleDefinition.getExports(), item -> antPathMatcher.match(item.getPath(), typeToMatch.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 d28be76eed1cd4ad0bf6614bedca532f2b8d8731..c2c9953f9ca919416d9040c7246e2fa7431d1b0c 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.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 TypeDomainResolver typeDomainResolver; + private final ModuleChecker moduleChecker; private final Set> autowiredAnnotationTypes = new LinkedHashSet<>(4); @SuppressWarnings("unchecked") - public LimitedAutowiredBeanPostProcessor(TypeDomainResolver typeDomainResolver) { - this.typeDomainResolver = typeDomainResolver; + public LimitedAutowiredBeanPostProcessor(ModuleChecker moduleChecker) { + this.moduleChecker = moduleChecker; 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) { + 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 50bb20ec9b38f9018a13de72c192ca7b2ac70625..a15501e0d861963703f13d3990da204515a368cb 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,43 +17,32 @@ package com.gitee.dorive.inject.spring; -import com.gitee.dorive.inject.api.TypeDomainResolver; +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 TypeDomainResolver typeDomainResolver; + private final ModuleChecker moduleChecker; @Override public Object instantiate(RootBeanDefinition bd, String beanName, BeanFactory owner, Constructor ctor, Object... args) { - tryGetResolverFromContext(owner); - if (typeDomainResolver != null) { - Class resolvableType = (Class) bd.getResolvableType().getType(); - if (isNotSpringInternalType(resolvableType) && typeDomainResolver.isUnderScanPackage(resolvableType)) { - for (Class parameterType : ctor.getParameterTypes()) { - if (isNotSpringInternalType(parameterType) && typeDomainResolver.isUnderScanPackage(parameterType)) { - typeDomainResolver.checkDomain(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 (typeDomainResolver == null) { - synchronized (this) { - if (typeDomainResolver == null) { - typeDomainResolver = owner.getBean(TypeDomainResolver.class); - } - } - } - } - private boolean isNotSpringInternalType(Class typeToMatch) { return !typeToMatch.getName().startsWith("org.springframework."); } 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 ba2e194beb721d9144fbadeab980e7804873677b..0000000000000000000000000000000000000000 --- 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 b4633a7447f4b5e68a2f573064e5e67c0274b380..706e46d3727a04e5772108d68b777b69a4af539e 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 diff --git a/dorive-mybatis-plus/pom.xml b/dorive-mybatis-plus/pom.xml index b9e886ec26d7eb2b9fe8ce146ece2759105f57a1..da60b395a627a75878551f227d87895c91582086 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-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 7c06e7433295b516cf1e0495560a69e1fc83fe5b..19a920e5262fc9b724cbf7df8707fb5e4239afcf 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.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; @@ -44,18 +46,21 @@ 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; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; @Getter @Setter public class MybatisPlusRepository extends AbstractRefRepository implements CountQuerier { private SqlRunner sqlRunner; + private EntityStoreInfo entityStoreInfo; private CountQuerier countQuerier; @Override @@ -89,7 +94,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 +121,14 @@ 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); + Map selectMethodMap = new ConcurrentHashMap<>(8); + for (Method method : ReflectUtil.getMethodsDirectly(mapperClass, false, false)) { + String name = method.getName(); + if (name.startsWith("select") || name.startsWith("query")) { + selectMethodMap.putIfAbsent(name, method); + } + } + return new EntityStoreInfo(mapperClass, mapper, pojoClass, tableName, keyProperty, keyColumn, propAliasMappingWithoutPk, propAliasMapping, aliasPropMapping, selectColumns, selectMethodMap); } @Override @@ -127,8 +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_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-query/pom.xml b/dorive-query/pom.xml index b9d05910ab702913905664a90d837c9cd9e0f0a0..4c8d4e919cc6cbcec87673720b421ce33e012787 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-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 44% 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 549975d834ea5ee4b97c9abde102bc6bdf5f0adc..29aa2276bba92bd2dcc417f0bc3f977b4d31f0b5 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,36 @@ * 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.api.entity.core.EntityElement; +import com.gitee.dorive.query.impl.resolver.QueryExampleResolver; +import com.gitee.dorive.query.repository.AbstractQueryRepository; +import lombok.Data; -@Getter -@Setter -public class SegmentUnit extends QueryUnit { +import java.util.List; - private TableSegment tableSegment; +@Data +public class QueryConfig { + private AbstractQueryRepository repository; + private QueryExampleResolver queryExampleResolver; + private List mergedRepositories; + private List reversedMergedRepositories; - public String getTableAlias() { - return tableSegment.getTableAlias(); + 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 8e83efd2b4d4d6e4c9f64a5a6d0c63b54969b749..a19b3c361b0f23c6d6974fdd1c048f8264e1284b 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,11 +18,9 @@ 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; -import com.gitee.dorive.query.impl.resolver.QueryExampleResolver; import lombok.Getter; import lombok.Setter; @@ -32,16 +30,20 @@ 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; - private QueryExampleResolver queryExampleResolver; + private QueryConfig queryConfig; + private String primaryKey; + private String primaryKeyAlias; + private String method; + private Map exampleMap; private Example example; - private List mergedRepositories; private Map queryUnitMap; private QueryUnit queryUnit; @@ -49,7 +51,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/entity/QueryUnit.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java index f1aa8f418b4b90f1f98f6b31e867a5d8cec91273..0a42c181ae361e280ca07b0fee4d9ad7a3d91070 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,22 +18,19 @@ 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 public class QueryUnit { - protected MergedRepository mergedRepository; protected Example example; protected boolean abandoned; + protected Object attachment; public boolean isRoot() { return "/".equals(mergedRepository.getAbsoluteAccessPath()); @@ -42,15 +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/entity/enums/QueryMethod.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/enums/QueryMethod.java index 07c51200b93f37b92f3ca35051124bd37916e058..6102bf110c7a7b033915cd2f55276278572f85ab 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/QueryUnitQueryHandler.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/AbstractQueryUnitQueryHandler.java similarity index 58% 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 e8b2a02f994d4057045a0e8706735e105fb85cef..11cce331f880e265f19d7a0db532b14289180e1c 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 @@ -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 AbstractQueryUnitQueryHandler 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/AdaptiveQueryHandler.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/AdaptiveQueryHandler.java index 3e60eef667f5917fd8d2da7c6fd23ec62ab9ba3a..dcb4eec182000aa077296bb0981c06dd310e1502 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,23 +17,34 @@ 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; -import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; import java.util.Map; -@AllArgsConstructor public class AdaptiveQueryHandler implements QueryHandler { private final Map queryHandlerMap; + public AdaptiveQueryHandler(Map queryHandlerMap) { + this.queryHandlerMap = queryHandlerMap; + } + @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; + 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-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractProxyContext.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/ConfigQueryHandler.java similarity index 41% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractProxyContext.java rename to dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/ConfigQueryHandler.java index 35e1c81f706b3a1f0f2da4ff881514c420a6b82b..40b34a5982d40f7c7b0d913fce63e95ac1d90e95 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractProxyContext.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/ConfigQueryHandler.java @@ -15,60 +15,40 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.context; - -import com.gitee.dorive.core.api.context.Context; +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 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); - } +public class ConfigQueryHandler implements QueryHandler { - @Override - public void removeOption(Class type) { - context.removeOption(type); - } + private final AbstractQueryRepository repository; + private final QueryHandler queryHandler; @Override - public Map getAttachments() { - return context.getAttachments(); - } + public void handle(QueryContext queryContext, Object query) { + Class queryType = queryContext.getQueryType(); - @Override - public void setAttachment(String name, Object value) { - context.setAttachment(name, value); - } + QueryTypeResolver queryTypeResolver = repository.getQueryTypeResolver(); + Map, QueryConfig> classQueryConfigMap = queryTypeResolver.getClassQueryConfigMap(); + QueryConfig queryConfig = classQueryConfigMap.get(queryType); + Assert.notNull(queryConfig, "No query config found!"); - @Override - public Object getAttachment(String name) { - return context.getAttachment(name); - } + queryContext.setQueryConfig(queryConfig); + queryContext.setPrimaryKey(queryConfig.getPrimaryKey()); + queryContext.setPrimaryKeyAlias(queryConfig.getPrimaryKeyAlias()); + queryContext.setMethod(queryConfig.getMethod()); - @Override - public void removeAttachment(String name) { - context.removeAttachment(name); + 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 1813f580f857ae95c5c0a3422301df97905c1beb..303587c6f7a69248c144823f837838059d5f0575 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,13 +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; @@ -31,27 +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) { - 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); - + 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 7589c51a80ea3771ac2e36a2c18c23143980cb75..8b0d01564b845cfeb4304ebc05b1417d67c59e8b 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); - } +public class StepwiseQueryHandler extends AbstractQueryUnitQueryHandler { @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 35392f461e0de5003ac0175b5d136dccb24ae750..141fe5eae04540dfb77cd9e8dc3759c86d22ba8c 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 @@ -99,5 +99,4 @@ public class QueryExampleResolver { } return 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 8ebcc75b25fcc172ac2b8377afd15372c15146e3..2971770222d9e7ccb3ea5768e804be30e9b549ab 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,12 @@ 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.setRepository(repository); + 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 8ee24e4fed3939d7709c5316b5af00a68aa1c5e8..cd2a5516c7fc127324a58220042a13fb948fc50e 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,12 +67,13 @@ 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; } protected void registryQueryHandlers(Map queryHandlerMap) { - queryHandlerMap.put(QueryMethod.STEPWISE, new StepwiseQueryHandler(this, null)); + queryHandlerMap.put(QueryMethod.STEPWISE, new StepwiseQueryHandler()); } @Override diff --git a/dorive-ref/pom.xml b/dorive-ref/pom.xml index 4e8cc32dc9adaa62f70f78b3263a1f467f85d5f5..c19fcf30ee4f3163f6030bd26d29cf1e272f1327 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 d2b4521d7aa196d3fc55f01c3d65f652b31d50e2..b8f1c33eb6810e93fbee6cb12011226c8eb0aea5 100644 --- a/dorive-spring-boot-starter/pom.xml +++ b/dorive-spring-boot-starter/pom.xml @@ -6,9 +6,10 @@ com.gitee.digital-engine dorive - 3.5.0.5 + 3.5.0.6 dorive-spring-boot-starter + pom com.gitee.digital-engine diff --git a/dorive-sql/pom.xml b/dorive-sql/pom.xml index 43bffe79476f692ac633448c421416c196fd5a83..eda6cebd3d9b4e6e2bbd61aa7e00d8068c791610 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-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 d3553f8d6ac17272c05df25f1b7d10de2fd559bf..8a20ed24c9b539ee07426462b5ca1d9d394784a6 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.impl.handler.AbstractQueryUnitQueryHandler; 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 -public class SqlBuildQueryHandler extends QueryUnitQueryHandler { +@AllArgsConstructor +public class SqlBuildQueryHandler extends AbstractQueryUnitQueryHandler { - 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.setAttachment(segmentResolver.resolve()); + return queryUnit; } + @Override + protected void doHandle(QueryContext queryContext, Object query) { + // ignore + } } diff --git a/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedRootInitializingBean.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlCustomQueryHandler.java similarity index 32% rename from dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedRootInitializingBean.java rename to dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlCustomQueryHandler.java index be189da01cd1275f04d9fc707a47c0eacafa5b05..d046711708dfe08fe6cb8ccef48df69814faa17b 100644 --- a/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedRootInitializingBean.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlCustomQueryHandler.java @@ -15,39 +15,56 @@ * limitations under the License. */ -package com.gitee.dorive.inject.spring; +package com.gitee.dorive.sql.impl.handler; -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 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 lombok.Getter; +import lombok.Setter; +import java.lang.reflect.Method; +import java.util.Collections; +import java.util.List; import java.util.Map; -public class LimitedRootInitializingBean implements ApplicationContextAware, InitializingBean { +@Getter +@Setter +public class SqlCustomQueryHandler implements QueryHandler { - private final TypeDomainResolver typeDomainResolver; - private ApplicationContext applicationContext; + private final EntityStoreInfo entityStoreInfo; - public LimitedRootInitializingBean(TypeDomainResolver typeDomainResolver) { - this.typeDomainResolver = typeDomainResolver; + public SqlCustomQueryHandler(EntityStoreInfo entityStoreInfo) { + this.entityStoreInfo = entityStoreInfo; } @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - this.applicationContext = applicationContext; - } + public void handle(QueryContext queryContext, Object query) { + Context context = queryContext.getContext(); + String primaryKey = queryContext.getPrimaryKey(); + String method = queryContext.getMethod(); + Example example = queryContext.getExample(); - @Override - public void afterPropertiesSet() { - Map beansWithAnnotation = applicationContext.getBeansWithAnnotation(Root.class); - beansWithAnnotation.forEach((name, bean) -> { - Class targetClass = AopUtils.getAnnotatedClass(bean, Root.class); - typeDomainResolver.checkProtection(targetClass); - }); - } + Object mapper = entityStoreInfo.getMapper(); + Map selectMethodMap = entityStoreInfo.getSelectMethodMap(); + Method selectMethod = selectMethodMap.get(method); + Map attachments = context.getAttachments(); + int parameterCount = selectMethod.getParameterCount(); + List ids = Collections.emptyList(); + if (parameterCount == 1) { + ids = ReflectUtil.invoke(mapper, selectMethod, query); + + } else if (parameterCount == 2) { + ids = ReflectUtil.invoke(mapper, selectMethod, attachments, query); + } + if (!ids.isEmpty()) { + example.in(primaryKey, ids); + } else { + queryContext.setAbandoned(true); + } + } } 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 549d814d98f9474fa7790cdbf2327d8e15bf2cb9..afb353daf737758cec89f3e8e9ab83ed25a7ebb0 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,19 +44,16 @@ 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(); + String primaryKey = queryContext.getPrimaryKey(); + String primaryKeyAlias = queryContext.getPrimaryKeyAlias(); Example example = queryContext.getExample(); QueryUnit queryUnit = queryContext.getQueryUnit(); @@ -66,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(); 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 e402fa5cb44f1517217b8461ee0837b98bf671a2..eb9ed45203994fbd265b711042fa02a09f54ab4d 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; @@ -54,15 +55,16 @@ 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(); - EntityElement entityElement = segmentUnit.getEntityElement(); - String tableAlias = segmentUnit.getTableAlias(); + QueryUnit queryUnit = queryContext.getQueryUnit(); + EntityElement entityElement = queryUnit.getEntityElement(); + TableSegment tableSegment = (TableSegment) queryUnit.getAttachment(); + 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.getAttachment(); + 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 4791da7a80b5881761070028633ea7e3b8ab9987..171d0c77ff3d5876c87165f7f9680021a8974c1e 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.getAttachment(); 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 7974696dfbeb026c7a7da39db6a10fd30caca6b0..c7b9b7eb6c5359b4a724fe8bd0510a1d88e7d67f 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.getAttachment(); 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.getAttachment(); + if (queryUnit.isRoot()) { selectSegment.setTableSegment(tableSegment); } else if (tableSegment.isJoin()) { diff --git a/dorive-web/pom.xml b/dorive-web/pom.xml index 13b4cd7fcc383619bf135e31865de3bdce9615ca..e8a994d0e108ee1e7a0914ab56148351445eebed 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 53e6ccccab1ee12b6b18aa5ad7b1e692dc04c149..0d12ef571a995b1d771ca2ff7861eb86958a2c3b 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