diff --git a/README.md b/README.md index 99395aa76938e3c99be8647798d2f930bfda8988..43b8e82c3475aa85b835a096b763bc6234bdd9d5 100644 --- a/README.md +++ b/README.md @@ -106,7 +106,7 @@ Maven引入: com.gitee.digital-engine dorive-spring-boot-starter - 3.5.2 + 3.5.3 ``` diff --git a/dorive-api/pom.xml b/dorive-api/pom.xml index ed5c73c13cac2684652b64e22681bdb38f08159f..b4eb514997d163c56345575f1badfdcea9c52c04 100644 --- a/dorive-api/pom.xml +++ b/dorive-api/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.2 + 3.5.3 dorive-api diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/common/BoundedContext.java b/dorive-api/src/main/java/com/gitee/dorive/api/api/common/BoundedContext.java similarity index 78% rename from dorive-api/src/main/java/com/gitee/dorive/api/entity/common/BoundedContext.java rename to dorive-api/src/main/java/com/gitee/dorive/api/api/common/BoundedContext.java index 7530e928036279b944e9beaf3cb8cee7ae08816e..fcb2e6eec645c7e12b8a0d955fa473431dcf58d3 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/common/BoundedContext.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/api/common/BoundedContext.java @@ -15,9 +15,14 @@ * limitations under the License. */ -package com.gitee.dorive.api.entity.common; +package com.gitee.dorive.api.api.common; -import java.util.Properties; +import java.util.Map; -public class BoundedContext extends Properties { -} +public interface BoundedContext extends Map { + + Object setProperty(String key, String value); + + String getProperty(String key); + +} \ No newline at end of file diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/api/common/BoundedContextAware.java b/dorive-api/src/main/java/com/gitee/dorive/api/api/common/BoundedContextAware.java index e985c176d3330119f73c5ed2e6b368552bcaf14f..ca6f3da6a13222e6bad355840dc5383dd07f73e9 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/api/common/BoundedContextAware.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/api/common/BoundedContextAware.java @@ -17,8 +17,6 @@ package com.gitee.dorive.api.api.common; -import com.gitee.dorive.api.entity.common.BoundedContext; - public interface BoundedContextAware { void setBoundedContext(BoundedContext boundedContext); diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/common/DefaultBoundedContext.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/common/DefaultBoundedContext.java new file mode 100644 index 0000000000000000000000000000000000000000..a0745173c334f3101819026ec3482edf9dc7e5ad --- /dev/null +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/common/DefaultBoundedContext.java @@ -0,0 +1,25 @@ +/* + * 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.api.entity.common; + +import com.gitee.dorive.api.api.common.BoundedContext; + +import java.util.Properties; + +public class DefaultBoundedContext extends Properties implements BoundedContext { +} diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/EntityElement.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/EntityElement.java index 4fdddd7cf5fdb65e536b5f9932aba202feaeb863..3f551607658c6065cf7d3a2ab2f70e890bdd5d29 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/EntityElement.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/EntityElement.java @@ -49,32 +49,4 @@ public class EntityElement extends FieldEntityDefinition { public void setPrimaryKey(Object entity, Object value) { ReflectUtil.setFieldValue(entity, getPrimaryKey(), value); } - - public String toAlias(String field) { - return fieldAliasMapping.getOrDefault(field, field); - } - - public List toAliases(List fields) { - if (fields != null && !fields.isEmpty()) { - List aliases = new ArrayList<>(fields.size()); - for (String field : fields) { - String alias = toAlias(field); - aliases.add(alias); - } - return aliases; - } - return fields; - } - - public Set toAliases(Set fields) { - if (fields != null && !fields.isEmpty()) { - Set aliases = new LinkedHashSet<>(fields.size() * 4 / 3 + 1); - for (String field : fields) { - String alias = toAlias(field); - aliases.add(alias); - } - return aliases; - } - return fields; - } } diff --git a/dorive-autoconfigure/pom.xml b/dorive-autoconfigure/pom.xml index e0d4462b5b0bb033cb3c60807b0803351ec66283..00a52ddf950fc0ad225a8653df49350b20913cbd 100644 --- a/dorive-autoconfigure/pom.xml +++ b/dorive-autoconfigure/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.2 + 3.5.3 dorive-autoconfigure diff --git a/dorive-autoconfigure/src/main/java/com/gitee/dorive/autoconfigure/module/DoriveModuleConfiguration.java b/dorive-autoconfigure/src/main/java/com/gitee/dorive/autoconfigure/module/DoriveModuleConfiguration.java index 2d50540a2b6699f7ed42c0dde17adbac410c44e3..6e23b3dfbca6b0cd59eba18de2038c7bf0eadcbe 100644 --- a/dorive-autoconfigure/src/main/java/com/gitee/dorive/autoconfigure/module/DoriveModuleConfiguration.java +++ b/dorive-autoconfigure/src/main/java/com/gitee/dorive/autoconfigure/module/DoriveModuleConfiguration.java @@ -17,10 +17,10 @@ package com.gitee.dorive.autoconfigure.module; +import com.gitee.dorive.module.impl.environment.ModuleRequestMappingHandlerMapping; import com.gitee.dorive.module.impl.filter.BoundedContextExposedBeanFilter; import com.gitee.dorive.module.impl.inject.BoundedContextBeanPostProcessor; import com.gitee.dorive.module.impl.inject.ModuleAutowiredBeanPostProcessor; -import com.gitee.dorive.module.impl.environment.ModuleRequestMappingHandlerMapping; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.web.servlet.WebMvcRegistrations; diff --git a/dorive-core/pom.xml b/dorive-core/pom.xml index c401baa54b1f4134e1ce7b6bbff571e801030904..8d878d3f5e23eeac76c814e176b5e7e3fbfb89ac 100644 --- a/dorive-core/pom.xml +++ b/dorive-core/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.2 + 3.5.3 dorive-core diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/common/ExampleConverter.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/common/ExampleConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..851bdeee1f2458a4e1504c4f11965a76f2b23693 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/common/ExampleConverter.java @@ -0,0 +1,27 @@ +/* + * 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.api.common; + +import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.entity.executor.Example; + +public interface ExampleConverter { + + void convert(Context context, Example example); + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/EntityJoiner.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/EntityJoiner.java new file mode 100644 index 0000000000000000000000000000000000000000..5fa51b00b2d1616a0de408d487a3ae28f3bfa280 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/EntityJoiner.java @@ -0,0 +1,34 @@ +/* + * 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.api.executor; + +import java.util.List; + +public interface EntityJoiner { + + void addLeft(Object entity, String key); + + boolean containsKey(String key); + + void addRight(String key, Object entity); + + void setCollectionSize(int size); + + void join(List entities); + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/Converter.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/mapper/Converter.java similarity index 95% rename from dorive-core/src/main/java/com/gitee/dorive/core/api/factory/Converter.java rename to dorive-core/src/main/java/com/gitee/dorive/core/api/mapper/Converter.java index d539e91ed6b668d61333b4e38a764894ed67b914..87a7be63e255766ae44e5bb50124397be5041c69 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/Converter.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/mapper/Converter.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.core.api.factory; +package com.gitee.dorive.core.api.mapper; public interface Converter { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/mapper/EntityMapper.java similarity index 69% rename from dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java rename to dorive-core/src/main/java/com/gitee/dorive/core/api/mapper/EntityMapper.java index 5c7b4a875373c6fd44d30a1b5318d9e27d3c4bde..3ac49511b0cf74c768f5dfc853f1c4c79cb87a18 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/mapper/EntityMapper.java @@ -15,23 +15,21 @@ * limitations under the License. */ -package com.gitee.dorive.core.api.factory; +package com.gitee.dorive.core.api.mapper; -import com.gitee.dorive.core.entity.factory.FieldConverter; - -import java.lang.reflect.Type; import java.util.List; +import java.util.Set; public interface EntityMapper { - FieldConverter getField(String domain, String name); + String toAlias(String field); - List getValueObjFields(); + List toAliases(List fields); - List getMatchedValueObjFields(); + Set toAliases(Set fields); - List getUnmatchedValueObjFields(); + FieldMapper getFieldMapperByField(String field); - boolean isValueObjType(Type type); + FieldMapper getFieldMapperByAlias(String alias); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/mapper/EntityMappers.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/mapper/EntityMappers.java new file mode 100644 index 0000000000000000000000000000000000000000..0e09118175ff0cb03d77c425f0e039a342383509 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/mapper/EntityMappers.java @@ -0,0 +1,35 @@ +/* + * 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.api.mapper; + +import java.lang.reflect.Type; +import java.util.List; + +public interface EntityMappers { + + EntityMapper getEntityMapper(String mapper); + + List getValueObjFields(); + + List getMatchedValueObjFields(); + + List getUnmatchedValueObjFields(); + + boolean isValueObjType(Type type); + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/mapper/FieldMapper.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/mapper/FieldMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..847c4822b9b9b0b7c4f7e84a7e118f42535124f9 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/mapper/FieldMapper.java @@ -0,0 +1,26 @@ +/* + * 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.api.mapper; + +public interface FieldMapper extends Converter { + + String getField(); + + String getAlias(); + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/AbstractBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/AbstractBinder.java index a64f8d255a8231849c2d6e1cf6e1b65625e48b60..8e8116c0a6e63652392dae7d80ec4cd265e7b417 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/AbstractBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/AbstractBinder.java @@ -75,10 +75,6 @@ public abstract class AbstractBinder implements Binder { return bindingDef.getBindField(); } - public String getFieldAlias() { - return fieldEndpoint.getAlias(); - } - public boolean isBindCollection() { return bindEndpoint.getFieldDefinition().isCollection(); } @@ -87,10 +83,6 @@ public abstract class AbstractBinder implements Binder { return bindEndpoint.getBelongAccessPath(); } - public String getBindFieldAlias() { - return bindEndpoint.getBindFieldAlias(); - } - public boolean isSameType() { return fieldEndpoint.getFieldDefinition().isSameType(bindEndpoint.getFieldDefinition()); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/AdaptiveMatcher.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/AdaptiveMatcher.java index 0d8cb89ead102a65fde124a33d3173d47383f8fe..85e7de3a36d04d68c3909107383b2b3dc5375a5e 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/AdaptiveMatcher.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/AdaptiveMatcher.java @@ -21,7 +21,7 @@ import com.gitee.dorive.core.api.context.Matcher; import com.gitee.dorive.core.api.context.Options; import com.gitee.dorive.core.api.context.Selector; import com.gitee.dorive.core.entity.enums.MatcherType; -import com.gitee.dorive.core.impl.repository.CommonRepository; +import com.gitee.dorive.core.impl.repository.ProxyRepository; import lombok.Getter; import lombok.Setter; @@ -36,10 +36,10 @@ import java.util.Set; @Setter public class AdaptiveMatcher implements Matcher { - private CommonRepository repository; + private ProxyRepository repository; private Map matcherTypeMatcherMap = new LinkedHashMap<>(6); - public AdaptiveMatcher(CommonRepository repository) { + public AdaptiveMatcher(ProxyRepository repository) { this.repository = repository; this.matcherTypeMatcherMap.put(MatcherType.NONE, options -> false); this.matcherTypeMatcherMap.put(MatcherType.ROOT, options -> repository.isRoot()); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/AbstractEndpoint.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/AbstractEndpoint.java index 941ab7c7c2ff3951c14dbe8ac406e58f5bbbe980..c91021eef32b44a9e489d92361f7cac21dbaf493 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/AbstractEndpoint.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/AbstractEndpoint.java @@ -27,11 +27,5 @@ import lombok.Setter; @Setter @AllArgsConstructor public abstract class AbstractEndpoint implements Endpoint { - private FieldDefinition fieldDefinition; - - public String getAlias() { - return fieldDefinition.getAlias(); - } - } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/BindEndpoint.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/BindEndpoint.java index 51cf00746a7b9c9a2c4813d5322456c76589656e..b39cd5855acccee41969da485f51c1b4d3137caf 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/BindEndpoint.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/BindEndpoint.java @@ -18,20 +18,17 @@ package com.gitee.dorive.core.impl.endpoint; import com.gitee.dorive.api.entity.core.FieldDefinition; -import com.gitee.dorive.core.impl.repository.CommonRepository; +import com.gitee.dorive.core.impl.repository.ProxyRepository; import lombok.Getter; import lombok.Setter; @Getter @Setter public class BindEndpoint extends SpELEndpoint { - private String belongAccessPath; - private CommonRepository belongRepository; - private String bindFieldAlias; + private ProxyRepository belongRepository; public BindEndpoint(FieldDefinition fieldDefinition, String expression) { super(fieldDefinition, expression); } - } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java index fbea3dd20412cbac739e06dc5b384b3c93663d19..da5943d1920a03092db7acbd0dafe0792f252e79 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java @@ -26,7 +26,7 @@ import com.gitee.dorive.core.entity.operation.EntityOp; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.cop.Query; import com.gitee.dorive.core.impl.repository.AbstractContextRepository; -import com.gitee.dorive.core.impl.repository.CommonRepository; +import com.gitee.dorive.core.impl.repository.ProxyRepository; import lombok.Getter; import lombok.Setter; @@ -49,7 +49,7 @@ public class ContextExecutor extends AbstractExecutor implements EntityHandler, @Override public Result executeQuery(Context context, Query query) { Assert.isTrue(!query.isEmpty(), "The query cannot be empty!"); - CommonRepository rootRepository = repository.getRootRepository(); + ProxyRepository rootRepository = repository.getRootRepository(); if (rootRepository.matches(context) || query.isIncludeRoot()) { Result result = rootRepository.executeQuery(context, query); List entities = result.getRecords(); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractProxyExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/unit/AbstractProxyExecutor.java similarity index 94% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractProxyExecutor.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/unit/AbstractProxyExecutor.java index 43d99ae8c415836077c27f3d19d923a93a39147d..8cdcf728aa9d0c3a9e11c83b1bfe9a8d63ece1a8 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractProxyExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/unit/AbstractProxyExecutor.java @@ -15,13 +15,14 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.executor; +package com.gitee.dorive.core.impl.executor.unit; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.cop.Query; +import com.gitee.dorive.core.impl.executor.AbstractExecutor; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/unit/ExampleExecutor.java similarity index 76% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/unit/ExampleExecutor.java index 79b243d96152c3100735c389d3e39a0cdf9b3cc2..b80f833d27771bd7614824f2a2d6c369a89f9441 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/unit/ExampleExecutor.java @@ -15,25 +15,22 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.executor; +package com.gitee.dorive.core.impl.executor.unit; import com.gitee.dorive.api.constant.core.Operator; import com.gitee.dorive.api.entity.core.EntityElement; +import com.gitee.dorive.core.api.common.ExampleConverter; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.factory.EntityMapper; import com.gitee.dorive.core.api.executor.Executor; -import com.gitee.dorive.core.entity.enums.Domain; -import com.gitee.dorive.core.entity.executor.Criterion; -import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.core.entity.executor.OrderBy; -import com.gitee.dorive.core.entity.executor.Result; -import com.gitee.dorive.core.entity.executor.UnionExample; -import com.gitee.dorive.core.entity.factory.FieldConverter; +import com.gitee.dorive.core.api.mapper.EntityMapper; +import com.gitee.dorive.core.api.mapper.FieldMapper; +import com.gitee.dorive.core.entity.executor.*; import com.gitee.dorive.core.entity.operation.Condition; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.cop.ConditionUpdate; import com.gitee.dorive.core.entity.operation.cop.Query; import com.gitee.dorive.core.entity.operation.eop.Update; +import com.gitee.dorive.core.impl.util.MultiInBuilder; import lombok.Getter; import lombok.Setter; @@ -42,7 +39,7 @@ import java.util.Set; @Getter @Setter -public class ExampleExecutor extends AbstractProxyExecutor { +public class ExampleExecutor extends AbstractProxyExecutor implements ExampleConverter { private EntityElement entityElement; private EntityMapper entityMapper; @@ -92,6 +89,7 @@ public class ExampleExecutor extends AbstractProxyExecutor { return super.execute(context, operation); } + @Override public void convert(Context context, Example example) { convertSelectProps(example); convertCriteria(context, example); @@ -108,7 +106,7 @@ public class ExampleExecutor extends AbstractProxyExecutor { private void convertUpdate(Update update) { Set nullableProps = update.getNullableProps(); if (nullableProps != null && !nullableProps.isEmpty()) { - nullableProps = entityElement.toAliases(nullableProps); + nullableProps = entityMapper.toAliases(nullableProps); update.setNullableProps(nullableProps); } } @@ -116,7 +114,7 @@ public class ExampleExecutor extends AbstractProxyExecutor { private void convertConditionUpdate(ConditionUpdate conditionUpdate) { Set nullableProps = conditionUpdate.getNullableProps(); if (nullableProps != null && !nullableProps.isEmpty()) { - nullableProps = entityElement.toAliases(nullableProps); + nullableProps = entityMapper.toAliases(nullableProps); conditionUpdate.setNullableProps(nullableProps); } } @@ -124,7 +122,7 @@ public class ExampleExecutor extends AbstractProxyExecutor { private void convertSelectProps(Example example) { List properties = example.getSelectProps(); if (properties != null && !properties.isEmpty()) { - properties = entityElement.toAliases(properties); + properties = entityMapper.toAliases(properties); example.setSelectProps(properties); } } @@ -139,6 +137,16 @@ public class ExampleExecutor extends AbstractProxyExecutor { if (value instanceof Example) { convert(context, (Example) value); } + } else if (Operator.MULTI_IN.equals(operator)) { + Object value = criterion.getValue(); + if (value instanceof MultiInBuilder) { + MultiInBuilder builder = (MultiInBuilder) value; + List properties = builder.getProperties(); + properties = entityMapper.toAliases(properties); + builder.setProperties(properties); + criterion.setProperty(builder.buildPropertiesStr()); + criterion.setValue(builder.buildValuesStr()); + } } else { doConvertCriteria(criterion); } @@ -150,13 +158,13 @@ public class ExampleExecutor extends AbstractProxyExecutor { String property = criterion.getProperty(); Object value = criterion.getValue(); - FieldConverter fieldConverter = entityMapper.getField(Domain.ENTITY.name(), property); - if (fieldConverter == null) { - fieldConverter = entityMapper.getField(Domain.DATABASE.name(), property); + FieldMapper fieldMapper = entityMapper.getFieldMapperByField(property); + if (fieldMapper == null) { + fieldMapper = entityMapper.getFieldMapperByAlias(property); } - if (fieldConverter != null) { - property = fieldConverter.getName(Domain.DATABASE.name()); - value = fieldConverter.deconstruct(value); + if (fieldMapper != null) { + property = fieldMapper.getAlias(); + value = fieldMapper.deconstruct(value); criterion.setProperty(property); criterion.setValue(value); } @@ -166,7 +174,7 @@ public class ExampleExecutor extends AbstractProxyExecutor { OrderBy orderBy = example.getOrderBy(); if (orderBy != null) { List properties = orderBy.getProperties(); - properties = entityElement.toAliases(properties); + properties = entityMapper.toAliases(properties); orderBy.setProperties(properties); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/unit/FactoryExecutor.java similarity index 91% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/unit/FactoryExecutor.java index 21fd660a1638b0a518535e58f83f2e710b8d9e32..16b981f17938cfd7ed88604636114d4640496ad0 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/unit/FactoryExecutor.java @@ -15,14 +15,13 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.executor; +package com.gitee.dorive.core.impl.executor.unit; import cn.hutool.core.bean.BeanUtil; import com.gitee.dorive.api.entity.core.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.api.factory.EntityFactory; -import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.operation.EntityOp; @@ -42,13 +41,13 @@ import java.util.Map; public class FactoryExecutor extends AbstractProxyExecutor { private EntityElement entityElement; - private EntityStoreInfo entityStoreInfo; + private String pkOfPersistentObj; private EntityFactory entityFactory; - public FactoryExecutor(Executor executor, EntityElement entityElement, EntityStoreInfo entityStoreInfo, EntityFactory entityFactory) { + public FactoryExecutor(Executor executor, EntityElement entityElement, String pkOfPersistentObj, EntityFactory entityFactory) { super(executor); this.entityElement = entityElement; - this.entityStoreInfo = entityStoreInfo; + this.pkOfPersistentObj = pkOfPersistentObj; this.entityFactory = entityFactory; } @@ -85,8 +84,8 @@ public class FactoryExecutor extends AbstractProxyExecutor { if (operation instanceof Insert) { for (int index = 0; index < entities.size(); index++) { Object entity = entities.get(index); - Object persistent = persistentObjs.get(index); - Object primaryKey = BeanUtil.getFieldValue(persistent, entityStoreInfo.getIdProperty()); + Object persistentObj = persistentObjs.get(index); + Object primaryKey = BeanUtil.getFieldValue(persistentObj, pkOfPersistentObj); if (primaryKey != null) { entityElement.setPrimaryKey(entity, primaryKey); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/OrderByFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/OrderByFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..a8fd8c3d706223a32f3ece28f18abba4df62ead2 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/OrderByFactory.java @@ -0,0 +1,60 @@ +/* + * 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.impl.factory; + +import cn.hutool.core.util.StrUtil; +import com.gitee.dorive.api.constant.core.Sort; +import com.gitee.dorive.api.entity.core.def.OrderByDef; +import com.gitee.dorive.core.entity.executor.OrderBy; +import com.gitee.dorive.core.impl.util.ExampleUtils; +import lombok.Data; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; + +@Data +public class OrderByFactory { + + private final OrderByDef orderByDef; + private final OrderBy orderBy; + + public OrderByFactory(OrderByDef orderByDef) { + this.orderByDef = orderByDef; + this.orderBy = newOrderBy(orderByDef); + } + + private OrderBy newOrderBy(OrderByDef orderByDef) { + if (orderByDef != null) { + String field = orderByDef.getField(); + String sort = orderByDef.getSort(); + if (StringUtils.isNotBlank(field) && StringUtils.isNotBlank(sort)) { + sort = sort.toUpperCase(); + if (Sort.ASC.equals(sort) || Sort.DESC.equals(sort)) { + List properties = StrUtil.splitTrim(field, ","); + return new OrderBy(properties, sort); + } + } + } + return null; + } + + public OrderBy newOrderBy() { + return orderBy != null ? ExampleUtils.clone(orderBy) : null; + } + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/AdaptiveEntityAdapter.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/entity/AdaptiveEntityAdapter.java similarity index 82% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/AdaptiveEntityAdapter.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/entity/AdaptiveEntityAdapter.java index e89fcf6a03b788b56565962ed9c16804a53cce9b..1d1e0104d051e59c9d40830aaca6607de99ec3fe 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/AdaptiveEntityAdapter.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/entity/AdaptiveEntityAdapter.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.factory; +package com.gitee.dorive.core.impl.factory.entity; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.lang.Assert; @@ -23,6 +23,7 @@ import cn.hutool.core.lang.func.Func1; import cn.hutool.core.lang.func.LambdaUtil; import com.gitee.dorive.api.entity.core.EntityElement; import com.gitee.dorive.core.api.factory.EntityAdapter; +import com.gitee.dorive.core.api.mapper.EntityMapper; import lombok.Getter; import lombok.Setter; @@ -32,21 +33,25 @@ import java.util.Map; @Setter public class AdaptiveEntityAdapter implements EntityAdapter { - private EntityElement entityElement; private String field; - private String alias; private Map> valueEntityTypeMap; + private EntityElement entityElement; + private EntityMapper entityMapper; + private String alias; - public AdaptiveEntityAdapter(EntityElement entityElement, Func1 func, Map> valueEntityTypeMap) { - Assert.notNull(entityElement, "The entityElement cannot be null!"); + public AdaptiveEntityAdapter(Func1 func, Map> valueEntityTypeMap) { Assert.notNull(func, "The func cannot be null!"); Assert.notEmpty(valueEntityTypeMap, "The valueEntityTypeMap cannot be empty!"); - this.entityElement = entityElement; this.field = LambdaUtil.getFieldName(func); - this.alias = entityElement.toAlias(field); this.valueEntityTypeMap = valueEntityTypeMap; } + public void initialize(EntityElement entityElement, EntityMapper entityMapper) { + this.entityElement = entityElement; + this.entityMapper = entityMapper; + this.alias = entityMapper.toAlias(field); + } + @Override public Class adaptEntityType(Object persistent) { Object fieldValue = BeanUtil.getFieldValue(persistent, alias); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/entity/DefaultEntityFactory.java similarity index 71% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/entity/DefaultEntityFactory.java index fd88667fbaa9d8b1f2fe28b917afbec468bc60ff..ad70175dddb57adec15927b60553cebae3e8bbe2 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/entity/DefaultEntityFactory.java @@ -15,21 +15,20 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.factory; +package com.gitee.dorive.core.impl.factory.entity; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; +import com.gitee.dorive.api.api.common.BoundedContext; import com.gitee.dorive.api.entity.core.EntityElement; import com.gitee.dorive.api.entity.core.PropertyDefinition; import com.gitee.dorive.api.entity.core.def.PropertyDef; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.factory.EntityAdapter; import com.gitee.dorive.core.api.factory.EntityFactory; -import com.gitee.dorive.core.api.factory.EntityMapper; -import com.gitee.dorive.api.entity.common.BoundedContext; -import com.gitee.dorive.core.entity.common.EntityStoreInfo; -import com.gitee.dorive.core.entity.enums.Domain; -import com.gitee.dorive.core.entity.factory.FieldConverter; +import com.gitee.dorive.core.api.mapper.EntityMapper; +import com.gitee.dorive.core.api.mapper.EntityMappers; +import com.gitee.dorive.core.api.mapper.FieldMapper; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -47,9 +46,12 @@ import java.util.concurrent.ConcurrentHashMap; public class DefaultEntityFactory implements EntityFactory { private EntityElement entityElement; - private EntityStoreInfo entityStoreInfo; + private Class reType; + private Class deType; // 序列化 - private EntityMapper entityMapper; + private EntityMappers entityMappers; + private EntityMapper reEntityMapper; + private EntityMapper deEntityMapper; private CopyOptions reCopyOptions; private CopyOptions deCopyOptions; // 边界上下文 @@ -62,7 +64,6 @@ public class DefaultEntityFactory implements EntityFactory { public void setEntityElement(EntityElement entityElement) { this.entityElement = entityElement; initCtxCopyOptions(); - initEntityAdapter(); } private void initCtxCopyOptions() { @@ -79,38 +80,48 @@ public class DefaultEntityFactory implements EntityFactory { } } - protected void initEntityAdapter() { - this.entityAdapter = (persistent) -> entityElement.getGenericType(); - } - - public void setEntityMapper(EntityMapper entityMapper) { - this.entityMapper = entityMapper; + public void setEntityMappers(EntityMappers entityMappers, EntityMapper reEntityMapper, EntityMapper deEntityMapper) { + this.entityMappers = entityMappers; + this.reEntityMapper = reEntityMapper; + this.deEntityMapper = deEntityMapper; initReCopyOptions(); initDeCopyOptions(); + initEntityAdapter(); + processEntityAdapter(); } private void initReCopyOptions() { - this.reCopyOptions = CopyOptions.create().ignoreNullValue().setFieldNameEditor(name -> { - FieldConverter fieldConverter = entityMapper.getField(Domain.DATABASE.name(), name); - return fieldConverter != null ? fieldConverter.getName() : name; + this.reCopyOptions = CopyOptions.create().ignoreNullValue().setFieldNameEditor(alias -> { + FieldMapper fieldMapperByAlias = reEntityMapper.getFieldMapperByAlias(alias); + return fieldMapperByAlias != null ? fieldMapperByAlias.getField() : alias; - }).setFieldValueEditor((name, value) -> { - FieldConverter fieldConverter = entityMapper.getField(Domain.ENTITY.name(), name); - return fieldConverter != null ? fieldConverter.reconstitute(value) : value; + }).setFieldValueEditor((field, value) -> { + FieldMapper fieldMapperByField = reEntityMapper.getFieldMapperByField(field); + return fieldMapperByField != null ? fieldMapperByField.reconstitute(value) : value; }); } private void initDeCopyOptions() { - this.deCopyOptions = CopyOptions.create().ignoreNullValue().setFieldNameEditor(name -> { - FieldConverter fieldConverter = entityMapper.getField(Domain.ENTITY.name(), name); - return fieldConverter != null ? fieldConverter.getName(Domain.POJO.name()) : name; + this.deCopyOptions = CopyOptions.create().ignoreNullValue().setFieldNameEditor(field -> { + FieldMapper fieldMapperByField = deEntityMapper.getFieldMapperByField(field); + return fieldMapperByField != null ? fieldMapperByField.getAlias() : field; - }).setFieldValueEditor((name, value) -> { - FieldConverter fieldConverter = entityMapper.getField(Domain.POJO.name(), name); - return fieldConverter != null ? fieldConverter.deconstruct(value) : value; + }).setFieldValueEditor((alias, value) -> { + FieldMapper fieldMapperByAlias = deEntityMapper.getFieldMapperByAlias(alias); + return fieldMapperByAlias != null ? fieldMapperByAlias.deconstruct(value) : value; }); } + protected void initEntityAdapter() { + this.entityAdapter = (persistent) -> reType; + } + + protected void processEntityAdapter() { + if (entityAdapter instanceof AdaptiveEntityAdapter) { + ((AdaptiveEntityAdapter) entityAdapter).initialize(entityElement, reEntityMapper); + } + } + @Override public List reconstitute(Context context, List persistentObjs) { BoundedContext boundedContext = null; @@ -154,7 +165,7 @@ public class DefaultEntityFactory implements EntityFactory { } public Object deconstruct(Context context, Object entity) { - return BeanUtil.toBean(entity, entityStoreInfo.getPojoClass(), deCopyOptions); + return BeanUtil.toBean(entity, deType, deCopyOptions); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/entity/ValueObjEntityFactory.java similarity index 73% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/entity/ValueObjEntityFactory.java index eab468163854b49c675a9c78a69a016b2215dcc4..b5390a0c5c9c50e2be3c4dbe3334803a3397f678 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/entity/ValueObjEntityFactory.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.factory; +package com.gitee.dorive.core.impl.factory.entity; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; @@ -26,8 +26,9 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReflectUtil; import cn.hutool.json.JSONUtil; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.factory.EntityMapper; -import com.gitee.dorive.core.entity.factory.FieldConverter; +import com.gitee.dorive.core.api.mapper.EntityMapper; +import com.gitee.dorive.core.api.mapper.EntityMappers; +import com.gitee.dorive.core.api.mapper.FieldMapper; import java.lang.reflect.ParameterizedType; import java.util.Collection; @@ -49,9 +50,9 @@ public class ValueObjEntityFactory extends DefaultEntityFactory { }; @Override - public void setEntityMapper(EntityMapper entityMapper) { - super.setEntityMapper(entityMapper); - List matchedValueObjFields = entityMapper.getMatchedValueObjFields(); + public void setEntityMappers(EntityMappers entityMappers, EntityMapper reEntityMapper, EntityMapper deEntityMapper) { + super.setEntityMappers(entityMappers, reEntityMapper, deEntityMapper); + List matchedValueObjFields = entityMappers.getMatchedValueObjFields(); if (!matchedValueObjFields.isEmpty()) { setReCopyOptions(); setDeCopyOptions(); @@ -60,7 +61,7 @@ public class ValueObjEntityFactory extends DefaultEntityFactory { private void setReCopyOptions() { // 如果是值对象,则跳过hutool的类型转换 - EntityMapper entityMapper = getEntityMapper(); + EntityMappers entityMappers = getEntityMappers(); getReCopyOptions().setConverter(((targetType, value) -> { if (value == null) { return null; @@ -69,7 +70,7 @@ public class ValueObjEntityFactory extends DefaultEntityFactory { if (targetType instanceof ParameterizedType) { targetType = ((ParameterizedType) targetType).getActualTypeArguments()[0]; } - if (entityMapper.isValueObjType(targetType)) { + if (entityMappers.isValueObjType(targetType)) { return value; } } @@ -79,7 +80,7 @@ public class ValueObjEntityFactory extends DefaultEntityFactory { private void setDeCopyOptions() { // 如果是值对象,则跳过hutool的类型转换 - EntityMapper entityMapper = getEntityMapper(); + EntityMappers entityMappers = getEntityMappers(); getDeCopyOptions().setConverter(((targetType, value) -> { if (value == null) { return null; @@ -89,7 +90,7 @@ public class ValueObjEntityFactory extends DefaultEntityFactory { if (value instanceof Collection) { return JSONUtil.toJsonStr(value); } - if (entityMapper.isValueObjType(value.getClass())) { + if (entityMappers.isValueObjType(value.getClass())) { return value; } } @@ -102,12 +103,12 @@ public class ValueObjEntityFactory extends DefaultEntityFactory { public Object reconstitute(Context context, Object persistent) { Object entity = super.reconstitute(context, persistent); Map resultMap = (Map) persistent; - EntityMapper entityMapper = getEntityMapper(); - List unmatchedValueObjFields = entityMapper.getUnmatchedValueObjFields(); - for (FieldConverter fieldConverter : unmatchedValueObjFields) { - Object valueObj = fieldConverter.reconstitute(resultMap); + EntityMappers entityMappers = getEntityMappers(); + List unmatchedValueObjFields = entityMappers.getUnmatchedValueObjFields(); + for (FieldMapper fieldMapper : unmatchedValueObjFields) { + Object valueObj = fieldMapper.reconstitute(resultMap); if (valueObj != null) { - BeanUtil.setFieldValue(entity, fieldConverter.getName(), valueObj); + BeanUtil.setFieldValue(entity, fieldMapper.getField(), valueObj); } } return entity; @@ -116,11 +117,11 @@ public class ValueObjEntityFactory extends DefaultEntityFactory { @Override public Object deconstruct(Context context, Object entity) { Object pojo = super.deconstruct(context, entity); - EntityMapper entityMapper = getEntityMapper(); - List unmatchedValueObjFields = entityMapper.getUnmatchedValueObjFields(); - for (FieldConverter fieldConverter : unmatchedValueObjFields) { - Object valueObj = BeanUtil.getFieldValue(entity, fieldConverter.getName()); - valueObj = valueObj != null ? fieldConverter.deconstruct(valueObj) : null; + EntityMappers entityMappers = getEntityMappers(); + List unmatchedValueObjFields = entityMappers.getUnmatchedValueObjFields(); + for (FieldMapper fieldMapper : unmatchedValueObjFields) { + Object valueObj = BeanUtil.getFieldValue(entity, fieldMapper.getField()); + valueObj = valueObj != null ? fieldMapper.deconstruct(valueObj) : null; if (valueObj != null) { BeanUtil.copyProperties(valueObj, pojo, CopyOptions.create().ignoreNullValue()); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/AdaptiveEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/AdaptiveEntityHandler.java index bc9e363b6a98b22d1ac5d957108956c5e649520a..b06f913f7d4e09d1ff8683f9c0d08ccd88a9a6a6 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/AdaptiveEntityHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/AdaptiveEntityHandler.java @@ -19,11 +19,13 @@ package com.gitee.dorive.core.impl.handler; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.EntityHandler; +import com.gitee.dorive.core.api.executor.EntityJoiner; import com.gitee.dorive.core.entity.enums.JoinType; -import com.gitee.dorive.core.impl.handler.joiner.MultiEntityHandler; -import com.gitee.dorive.core.impl.handler.joiner.SingleEntityHandler; -import com.gitee.dorive.core.impl.handler.joiner.UnionEntityHandler; -import com.gitee.dorive.core.impl.repository.CommonRepository; +import com.gitee.dorive.core.impl.handler.executor.MultiEntityHandler; +import com.gitee.dorive.core.impl.handler.executor.SingleEntityHandler; +import com.gitee.dorive.core.impl.handler.executor.UnionEntityHandler; +import com.gitee.dorive.core.impl.joiner.DefaultEntityJoiner; +import com.gitee.dorive.core.impl.repository.ProxyRepository; import lombok.AllArgsConstructor; import lombok.Data; @@ -33,24 +35,25 @@ import java.util.List; @AllArgsConstructor public class AdaptiveEntityHandler implements EntityHandler { - private CommonRepository repository; + private ProxyRepository repository; @Override public long handle(Context context, List entities) { - EntityHandler entityHandler = newEntityHandler(entities); + EntityJoiner entityJoiner = new DefaultEntityJoiner(repository, entities); + EntityHandler entityHandler = newEntityHandler(entityJoiner); return entityHandler != null ? entityHandler.handle(context, entities) : 0L; } - private EntityHandler newEntityHandler(List entities) { + private EntityHandler newEntityHandler(EntityJoiner entityJoiner) { JoinType joinType = repository.getJoinType(); if (joinType == JoinType.SINGLE) { - return new SingleEntityHandler(entities, repository); + return new SingleEntityHandler(repository, entityJoiner); } else if (joinType == JoinType.MULTI) { - return new MultiEntityHandler(entities, repository); + return new MultiEntityHandler(repository, entityJoiner); } else if (joinType == JoinType.UNION) { - return new UnionEntityHandler(entities, repository); + return new UnionEntityHandler(repository, entityJoiner); } return null; } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java index 78973cc9429f12800b0a9cc07c8af1a05df74fcd..c23b9c38bb1142dea2fa1e977e2f78c4fc8e6dfd 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java @@ -20,7 +20,7 @@ package com.gitee.dorive.core.impl.handler; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.impl.repository.AbstractContextRepository; -import com.gitee.dorive.core.impl.repository.CommonRepository; +import com.gitee.dorive.core.impl.repository.ProxyRepository; import lombok.Data; import java.util.ArrayList; @@ -34,9 +34,9 @@ public class BatchEntityHandler implements EntityHandler { public BatchEntityHandler(AbstractContextRepository repository) { this.repository = repository; - List subRepositories = repository.getSubRepositories(); + List subRepositories = repository.getSubRepositories(); this.entityHandlers = new ArrayList<>(subRepositories.size()); - for (CommonRepository subRepository : subRepositories) { + for (ProxyRepository subRepository : subRepositories) { EntityHandler entityHandler = new AdaptiveEntityHandler(subRepository); if (subRepository.hasValueRouteBinders()) { entityHandler = new ValueFilterEntityHandler(subRepository, entityHandler); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/ContextMatchEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/ContextMatchEntityHandler.java index e1b4d6ca27a98774dc74003ebfe11573800876e1..ada44d92b71f0329f55cc9373ed15f10f512846d 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/ContextMatchEntityHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/ContextMatchEntityHandler.java @@ -19,7 +19,7 @@ package com.gitee.dorive.core.impl.handler; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.EntityHandler; -import com.gitee.dorive.core.impl.repository.CommonRepository; +import com.gitee.dorive.core.impl.repository.ProxyRepository; import lombok.AllArgsConstructor; import lombok.Data; @@ -29,7 +29,7 @@ import java.util.List; @AllArgsConstructor public class ContextMatchEntityHandler implements EntityHandler { - private CommonRepository repository; + private ProxyRepository repository; private EntityHandler entityHandler; @Override diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/ValueFilterEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/ValueFilterEntityHandler.java index 082362688fafaff6c76433301649f2b43fff9957..680a379900528b0089aaca88d87cfedd2971782f 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/ValueFilterEntityHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/ValueFilterEntityHandler.java @@ -21,7 +21,7 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.impl.binder.ValueRouteBinder; import com.gitee.dorive.core.impl.resolver.BinderResolver; -import com.gitee.dorive.core.impl.repository.CommonRepository; +import com.gitee.dorive.core.impl.repository.ProxyRepository; import lombok.AllArgsConstructor; import lombok.Data; @@ -32,7 +32,7 @@ import java.util.List; @AllArgsConstructor public class ValueFilterEntityHandler implements EntityHandler { - private CommonRepository repository; + private ProxyRepository repository; private EntityHandler entityHandler; @Override diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/eo/BatchEntityOpHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/eo/BatchEntityOpHandler.java index 9e33012f821527b96f2bde0253b83725c83adaf4..2cec69ebc352d57a3508f47afa724ad84a051f9b 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/eo/BatchEntityOpHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/eo/BatchEntityOpHandler.java @@ -28,7 +28,7 @@ import com.gitee.dorive.core.entity.operation.eop.InsertOrUpdate; import com.gitee.dorive.core.entity.operation.eop.Update; import com.gitee.dorive.core.impl.factory.OperationFactory; import com.gitee.dorive.core.impl.repository.AbstractContextRepository; -import com.gitee.dorive.core.impl.repository.CommonRepository; +import com.gitee.dorive.core.impl.repository.ProxyRepository; import com.gitee.dorive.core.impl.util.CollectionUtils; import lombok.AllArgsConstructor; import lombok.Data; @@ -61,7 +61,7 @@ public class BatchEntityOpHandler implements EntityOpHandler { private int executeInsert(Context context, EntityOp entityOp) { int totalCount = 0; - for (CommonRepository repository : this.repository.getOrderedRepositories()) { + for (ProxyRepository repository : this.repository.getOrderedRepositories()) { boolean isRoot = repository.isRoot(); if (isRoot) { totalCount += executeRoot(repository, context, entityOp); @@ -92,7 +92,7 @@ public class BatchEntityOpHandler implements EntityOpHandler { private int executeUpdateOrDelete(Context context, EntityOp entityOp) { int totalCount = 0; - for (CommonRepository repository : this.repository.getOrderedRepositories()) { + for (ProxyRepository repository : this.repository.getOrderedRepositories()) { boolean isRoot = repository.isRoot(); if (isRoot) { totalCount += executeRoot(repository, context, entityOp); @@ -117,7 +117,7 @@ public class BatchEntityOpHandler implements EntityOpHandler { private int executeInsertOrUpdate(Context context, EntityOp entityOp) { int totalCount = 0; - for (CommonRepository repository : this.repository.getOrderedRepositories()) { + for (ProxyRepository repository : this.repository.getOrderedRepositories()) { boolean isRoot = repository.isRoot(); if (isRoot) { totalCount += executeRoot(repository, context, entityOp); @@ -147,7 +147,7 @@ public class BatchEntityOpHandler implements EntityOpHandler { return totalCount; } - private int executeRoot(CommonRepository repository, Context context, EntityOp entityOp) { + private int executeRoot(ProxyRepository repository, Context context, EntityOp entityOp) { if (entityOp.isNotIgnoreRoot()) { if (repository.matches(context) || entityOp.isIncludeRoot()) { return repository.execute(context, entityOp); @@ -156,7 +156,7 @@ public class BatchEntityOpHandler implements EntityOpHandler { return 0; } - private List getEntities(CommonRepository repository, Object rootEntity) { + private List getEntities(ProxyRepository repository, Object rootEntity) { EntityElement entityElement = repository.getEntityElement(); Object targetEntity = entityElement.getValue(rootEntity); if (targetEntity != null) { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/joiner/AbstractEntityJoiner.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/executor/AbstractEntityHandler.java similarity index 75% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/joiner/AbstractEntityJoiner.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/executor/AbstractEntityHandler.java index 871b32de076a7646770225e679c89d7bfb437a97..1dad1a64b075571bb727b86e6c6d94666baf9b4a 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/joiner/AbstractEntityJoiner.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/executor/AbstractEntityHandler.java @@ -15,18 +15,19 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.handler.joiner; +package com.gitee.dorive.core.impl.handler.executor; -import com.gitee.dorive.api.entity.core.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.EntityHandler; +import com.gitee.dorive.core.api.executor.EntityJoiner; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.operation.cop.Query; import com.gitee.dorive.core.impl.binder.WeakBinder; import com.gitee.dorive.core.impl.factory.OperationFactory; +import com.gitee.dorive.core.impl.repository.ProxyRepository; import com.gitee.dorive.core.impl.resolver.BinderResolver; -import com.gitee.dorive.core.impl.repository.CommonRepository; +import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; @@ -34,14 +35,11 @@ import java.util.List; @Getter @Setter -public abstract class AbstractEntityJoiner extends ObjectsJoiner implements EntityHandler { +@AllArgsConstructor +public abstract class AbstractEntityHandler implements EntityHandler { - protected CommonRepository repository; - - public AbstractEntityJoiner(List entities, CommonRepository repository) { - super(entities, repository.isCollection()); - this.repository = repository; - } + protected final ProxyRepository repository; + protected final EntityJoiner entityJoiner; @Override public long handle(Context context, List entities) { @@ -51,9 +49,9 @@ public abstract class AbstractEntityJoiner extends ObjectsJoiner implements Enti Query query = operationFactory.buildQueryByExample(example); query.includeRoot(); Result result = repository.executeQuery(context, query); - setAverageSize(result.getRecords().size() / entities.size() + 1); + entityJoiner.setCollectionSize(result.getRecords().size() / entities.size() + 1); handleResult(context, result); - join(); + entityJoiner.join(entities); return result.getCount(); } return 0L; @@ -74,15 +72,6 @@ public abstract class AbstractEntityJoiner extends ObjectsJoiner implements Enti } } - @Override - protected void doJoin(Object entity, Object object) { - EntityElement entityElement = repository.getEntityElement(); - Object value = entityElement.getValue(entity); - if (value == null) { - entityElement.setValue(entity, object); - } - } - protected abstract Example newExample(Context context, List entities); protected abstract void handleResult(Context context, Result result); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/joiner/MultiEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/executor/MultiEntityHandler.java similarity index 84% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/joiner/MultiEntityHandler.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/executor/MultiEntityHandler.java index e6ff738622e28483c5df2f1760cd44dbd92666c9..e049608ae7b0f59e8cd5c0270915db0d1550f852 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/joiner/MultiEntityHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/executor/MultiEntityHandler.java @@ -15,15 +15,16 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.handler.joiner; +package com.gitee.dorive.core.impl.handler.executor; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.executor.EntityJoiner; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.impl.binder.AbstractBinder; import com.gitee.dorive.core.impl.binder.StrongBinder; -import com.gitee.dorive.core.impl.repository.CommonRepository; +import com.gitee.dorive.core.impl.repository.ProxyRepository; import com.gitee.dorive.core.impl.util.MultiInBuilder; import lombok.Getter; import lombok.Setter; @@ -33,12 +34,12 @@ import java.util.stream.Collectors; @Getter @Setter -public class MultiEntityHandler extends AbstractEntityJoiner { +public class MultiEntityHandler extends AbstractEntityHandler { private List binders; - public MultiEntityHandler(List entities, CommonRepository repository) { - super(entities, repository); + public MultiEntityHandler(ProxyRepository repository, EntityJoiner entityJoiner) { + super(repository, entityJoiner); this.binders = repository.getRootStrongBinders(); } @@ -54,8 +55,8 @@ public class MultiEntityHandler extends AbstractEntityJoiner { } private MultiInBuilder newMultiInBuilder(Context context, List entities) { - List aliases = binders.stream().map(AbstractBinder::getFieldAlias).collect(Collectors.toList()); - MultiInBuilder multiInBuilder = new MultiInBuilder(aliases, entities.size()); + List properties = binders.stream().map(AbstractBinder::getFieldName).collect(Collectors.toList()); + MultiInBuilder multiInBuilder = new MultiInBuilder(properties, entities.size()); for (Object entity : entities) { StringBuilder keyBuilder = new StringBuilder(); @@ -75,10 +76,10 @@ public class MultiEntityHandler extends AbstractEntityJoiner { if (keyBuilder != null && keyBuilder.length() > 0) { keyBuilder.deleteCharAt(keyBuilder.length() - 1); String key = keyBuilder.toString(); - if (containsKey(key)) { + if (entityJoiner.containsKey(key)) { multiInBuilder.clearLast(); } - addLeft(entity, key); + entityJoiner.addLeft(entity, key); } } @@ -103,7 +104,7 @@ public class MultiEntityHandler extends AbstractEntityJoiner { if (keyBuilder != null && keyBuilder.length() > 0) { keyBuilder.deleteCharAt(keyBuilder.length() - 1); String key = keyBuilder.toString(); - addRight(key, entity); + entityJoiner.addRight(key, entity); } } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/joiner/SingleEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/executor/SingleEntityHandler.java similarity index 84% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/joiner/SingleEntityHandler.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/executor/SingleEntityHandler.java index 4a1a6e6b00620cdea6e566e948e2a721bdd5f320..465d4c0ea14c194648ce73acf869ba27bdb5d8b0 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/joiner/SingleEntityHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/executor/SingleEntityHandler.java @@ -15,14 +15,15 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.handler.joiner; +package com.gitee.dorive.core.impl.handler.executor; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.executor.EntityJoiner; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.impl.binder.StrongBinder; -import com.gitee.dorive.core.impl.repository.CommonRepository; +import com.gitee.dorive.core.impl.repository.ProxyRepository; import lombok.Getter; import lombok.Setter; @@ -31,12 +32,12 @@ import java.util.List; @Getter @Setter -public class SingleEntityHandler extends AbstractEntityJoiner { +public class SingleEntityHandler extends AbstractEntityHandler { private StrongBinder binder; - public SingleEntityHandler(List entities, CommonRepository repository) { - super(entities, repository); + public SingleEntityHandler(ProxyRepository repository, EntityJoiner entityJoiner) { + super(repository, entityJoiner); this.binder = repository.getRootStrongBinders().get(0); } @@ -63,10 +64,10 @@ public class SingleEntityHandler extends AbstractEntityJoiner { boundValue = binder.input(context, boundValue); if (boundValue != null) { String key = boundValue.toString(); - if (!containsKey(key)) { + if (!entityJoiner.containsKey(key)) { boundValues.add(boundValue); } - addLeft(entity, key); + entityJoiner.addLeft(entity, key); } } return boundValues; @@ -79,7 +80,7 @@ public class SingleEntityHandler extends AbstractEntityJoiner { Object fieldValue = binder.getFieldValue(context, entity); if (fieldValue != null) { String key = fieldValue.toString(); - addRight(key, entity); + entityJoiner.addRight(key, entity); } } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/joiner/UnionEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/executor/UnionEntityHandler.java similarity index 87% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/joiner/UnionEntityHandler.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/executor/UnionEntityHandler.java index 34fd525cce44b20abdf910773f358b6060a7fe1f..447d4c6786aedd6f43159a64cfc9257adc64632d 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/joiner/UnionEntityHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/executor/UnionEntityHandler.java @@ -15,16 +15,17 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.handler.joiner; +package com.gitee.dorive.core.impl.handler.executor; import cn.hutool.core.lang.Assert; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.executor.EntityJoiner; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.executor.UnionExample; import com.gitee.dorive.core.impl.binder.StrongBinder; -import com.gitee.dorive.core.impl.repository.CommonRepository; +import com.gitee.dorive.core.impl.repository.ProxyRepository; import lombok.Getter; import lombok.Setter; @@ -34,10 +35,10 @@ import java.util.Map; @Getter @Setter -public class UnionEntityHandler extends AbstractEntityJoiner { +public class UnionEntityHandler extends AbstractEntityHandler { - public UnionEntityHandler(List entities, CommonRepository repository) { - super(entities, repository); + public UnionEntityHandler(ProxyRepository repository, EntityJoiner entityJoiner) { + super(repository, entityJoiner); } @Override @@ -52,7 +53,7 @@ public class UnionEntityHandler extends AbstractEntityJoiner { String row = Integer.toString(index + 1); example.setSelectSuffix(row + " as $row"); unionExample.addExample(example); - addLeft(entity, row); + entityJoiner.addLeft(entity, row); } return unionExample; } @@ -94,10 +95,10 @@ public class UnionEntityHandler extends AbstractEntityJoiner { List rows = (List) resultMap.get("$rows"); if (rows != null) { for (String eachRow : rows) { - addRight(eachRow, entity); + entityJoiner.addRight(eachRow, entity); } } else if (row != null) { - addRight(row.toString(), entity); + entityJoiner.addRight(row.toString(), entity); } } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/DefaultEntityJoiner.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/DefaultEntityJoiner.java new file mode 100644 index 0000000000000000000000000000000000000000..88f9ed3e97d3b3920982b96cca1946eaba55f590 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/DefaultEntityJoiner.java @@ -0,0 +1,42 @@ +/* + * 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.impl.joiner; + +import com.gitee.dorive.api.entity.core.EntityElement; +import com.gitee.dorive.core.impl.repository.ProxyRepository; + +import java.util.List; + +public class DefaultEntityJoiner extends HashMapEntityJoiner { + + protected final ProxyRepository repository; + + public DefaultEntityJoiner(ProxyRepository repository, List entities) { + super(repository.isCollection(), entities); + this.repository = repository; + } + + @Override + protected void doJoin(Object entity, Object object) { + EntityElement entityElement = repository.getEntityElement(); + Object value = entityElement.getValue(entity); + if (value == null) { + entityElement.setValue(entity, object); + } + } +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/joiner/ObjectsJoiner.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/HashMapEntityJoiner.java similarity index 76% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/joiner/ObjectsJoiner.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/HashMapEntityJoiner.java index d2e2d0b28c58808138839963efe11e151339990b..f001e2390246b226af65c53b2e438e49b028ce69 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/joiner/ObjectsJoiner.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/HashMapEntityJoiner.java @@ -15,33 +15,36 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.handler.joiner; +package com.gitee.dorive.core.impl.joiner; +import com.gitee.dorive.core.api.executor.EntityJoiner; import lombok.Data; import org.apache.commons.lang3.StringUtils; import java.util.*; @Data -public abstract class ObjectsJoiner { +public abstract class HashMapEntityJoiner implements EntityJoiner { + + private boolean collection; private List entities; private int initialCapacity; private Map hashCodeKeyMap; private Set keys; private Map keyObjectMap; - private boolean collection; - private int averageSize; + private int collectionSize; - public ObjectsJoiner(List entities, boolean collection) { + public HashMapEntityJoiner(boolean collection, List entities) { + this.collection = collection; this.entities = entities; this.initialCapacity = entities.size() * 4 / 3 + 1; this.hashCodeKeyMap = new HashMap<>(initialCapacity); this.keys = new HashSet<>(initialCapacity); this.keyObjectMap = new HashMap<>(initialCapacity); - this.collection = collection; - this.averageSize = 10; + this.collectionSize = 10; } + @Override public void addLeft(Object entity, String key) { if (entity != null && StringUtils.isNotBlank(key)) { hashCodeKeyMap.put(System.identityHashCode(entity), key); @@ -49,11 +52,21 @@ public abstract class ObjectsJoiner { } } + public String getLeftKey(Object entity) { + return entity != null ? hashCodeKeyMap.get(System.identityHashCode(entity)) : null; + } + + @Override + public boolean containsKey(String key) { + return keys.contains(key); + } + + @Override @SuppressWarnings("unchecked") public void addRight(String key, Object entity) { if (StringUtils.isNotBlank(key) && entity != null) { if (collection) { - Collection collection = (Collection) keyObjectMap.computeIfAbsent(key, k -> new ArrayList<>(averageSize)); + Collection collection = (Collection) keyObjectMap.computeIfAbsent(key, k -> new ArrayList<>(collectionSize)); collection.add(entity); } else { keyObjectMap.putIfAbsent(key, entity); @@ -61,14 +74,6 @@ public abstract class ObjectsJoiner { } } - public String getLeftKey(Object entity) { - return entity != null ? hashCodeKeyMap.get(System.identityHashCode(entity)) : null; - } - - public boolean containsKey(String key) { - return keys.contains(key); - } - public Object getRight(String key) { return key != null ? keyObjectMap.get(key) : null; } @@ -77,15 +82,20 @@ public abstract class ObjectsJoiner { return hashCodeKeyMap == null || hashCodeKeyMap.isEmpty() || keyObjectMap == null || keyObjectMap.isEmpty(); } - public void join() { - if (!isEmpty()) { - for (Object entity : entities) { - String key = getLeftKey(entity); - if (key != null) { - Object object = getRight(key); - if (entity != null || object != null) { - doJoin(entity, object); - } + @Override + public void join(List entities) { + if (entities == null || entities.isEmpty()) { + return; + } + if (isEmpty()) { + return; + } + for (Object entity : entities) { + String key = getLeftKey(entity); + if (key != null) { + Object object = getRight(key); + if (entity != null || object != null) { + doJoin(entity, object); } } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/mapper/DefaultEntityMapper.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/mapper/DefaultEntityMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..3c0aa186168c5c5c2153c43b2012fb191bcb4d3d --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/mapper/DefaultEntityMapper.java @@ -0,0 +1,78 @@ +/* + * 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.impl.mapper; + +import com.gitee.dorive.core.api.mapper.EntityMapper; +import com.gitee.dorive.core.api.mapper.FieldMapper; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.*; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class DefaultEntityMapper implements EntityMapper { + private Map fieldAliasMapping; + private Map fieldFieldMapperMap; + private Map aliasFieldMapperMap; + + @Override + public String toAlias(String field) { + return fieldAliasMapping.getOrDefault(field, field); + } + + @Override + public List toAliases(List fields) { + if (fields != null && !fields.isEmpty()) { + List aliases = new ArrayList<>(fields.size()); + for (String field : fields) { + String alias = toAlias(field); + aliases.add(alias); + } + return aliases; + } + return fields; + } + + @Override + public Set toAliases(Set fields) { + if (fields != null && !fields.isEmpty()) { + Set aliases = new LinkedHashSet<>(fields.size() * 4 / 3 + 1); + for (String field : fields) { + String alias = toAlias(field); + aliases.add(alias); + } + return aliases; + } + return fields; + } + + @Override + public FieldMapper getFieldMapperByField(String field) { + return fieldFieldMapperMap.get(field); + } + + @Override + public FieldMapper getFieldMapperByAlias(String alias) { + return aliasFieldMapperMap.get(alias); + } +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/mapper/DefaultEntityMappers.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/mapper/DefaultEntityMappers.java new file mode 100644 index 0000000000000000000000000000000000000000..a188c6e8aff7b8c1aa8f273c94a177a7e9db6193 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/mapper/DefaultEntityMappers.java @@ -0,0 +1,47 @@ +/* + * 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.impl.mapper; + +import com.gitee.dorive.core.api.mapper.EntityMapper; +import com.gitee.dorive.core.api.mapper.EntityMappers; +import com.gitee.dorive.core.api.mapper.FieldMapper; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.lang.reflect.Type; +import java.util.*; + +@Getter +@AllArgsConstructor +public class DefaultEntityMappers implements EntityMappers { + private final Map mapperEntityMapperMap; + private final List valueObjFields; + private final List matchedValueObjFields; + private final List unmatchedValueObjFields; + private final Set valueObjTypes; + + @Override + public EntityMapper getEntityMapper(String mapper) { + return mapperEntityMapperMap.get(mapper); + } + + @Override + public boolean isValueObjType(Type type) { + return valueObjTypes.contains(type); + } +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/factory/FieldConverter.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/mapper/DefaultFieldMapper.java similarity index 76% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/factory/FieldConverter.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/mapper/DefaultFieldMapper.java index c2ef233c0c0e5182d0e249698042e89e01f1d580..027b64b0bd9f5c26d3be5d3fdd65a517a4f1c72b 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/factory/FieldConverter.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/mapper/DefaultFieldMapper.java @@ -15,30 +15,22 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.factory; +package com.gitee.dorive.core.impl.mapper; -import com.gitee.dorive.core.api.factory.Converter; +import com.gitee.dorive.core.api.mapper.FieldMapper; +import com.gitee.dorive.core.api.mapper.Converter; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; -import java.util.Map; - @Getter @Setter @AllArgsConstructor -public class FieldConverter implements Converter { - - private String domain; - private String name; - private boolean match; - private Map names; +public class DefaultFieldMapper implements FieldMapper { + private String field; + private String alias; private Converter converter; - public String getName(String domain) { - return names.get(domain); - } - @Override public Object reconstitute(Object value) { return converter == null ? value : converter.reconstitute(value); @@ -48,5 +40,4 @@ public class FieldConverter implements Converter { public Object deconstruct(Object value) { return converter == null ? value : converter.deconstruct(value); } - } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/JsonArrayConverter.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/mapper/value/JsonArrayConverter.java similarity index 92% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/JsonArrayConverter.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/mapper/value/JsonArrayConverter.java index 9c01603bf23619960f7c31518bce0a0cd4f1660f..6b4d6380e46f25eb80b34a9dd445dae88f551549 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/JsonArrayConverter.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/mapper/value/JsonArrayConverter.java @@ -15,10 +15,10 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.converter; +package com.gitee.dorive.core.impl.mapper.value; import cn.hutool.json.JSONUtil; -import com.gitee.dorive.core.api.factory.Converter; +import com.gitee.dorive.core.api.mapper.Converter; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/JsonConverter.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/mapper/value/JsonConverter.java similarity index 92% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/JsonConverter.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/mapper/value/JsonConverter.java index 9384249304dd614662d436625d856ca2efda83bd..deebf2490dd88d8a84bc5f53b0af648a00e6e4f4 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/JsonConverter.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/mapper/value/JsonConverter.java @@ -15,10 +15,10 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.converter; +package com.gitee.dorive.core.impl.mapper.value; import cn.hutool.json.JSONUtil; -import com.gitee.dorive.core.api.factory.Converter; +import com.gitee.dorive.core.api.mapper.Converter; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapConverter.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/mapper/value/MapConverter.java similarity index 92% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapConverter.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/mapper/value/MapConverter.java index 81b78e98a11fa9a693277fb7d037c62175d9282c..4ff9e37df0692fb7efb7d91bb7377ffe7d8f1509 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapConverter.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/mapper/value/MapConverter.java @@ -15,10 +15,10 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.converter; +package com.gitee.dorive.core.impl.mapper.value; import cn.hutool.core.bean.BeanUtil; -import com.gitee.dorive.core.api.factory.Converter; +import com.gitee.dorive.core.api.mapper.Converter; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapExpConverter.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/mapper/value/MapExpConverter.java similarity index 97% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapExpConverter.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/mapper/value/MapExpConverter.java index ac090895afd83b2d407a543922dba9d0306563b9..343cd16a4002cd215dd8b3d7f98c856848f09725 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapExpConverter.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/mapper/value/MapExpConverter.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.converter; +package com.gitee.dorive.core.impl.mapper.value; import cn.hutool.core.util.StrUtil; import com.gitee.dorive.api.entity.core.FieldDefinition; import com.gitee.dorive.api.entity.core.def.FieldDef; -import com.gitee.dorive.core.api.factory.Converter; +import com.gitee.dorive.core.api.mapper.Converter; import lombok.Getter; import lombok.Setter; import org.apache.commons.lang3.StringUtils; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/repository/AbstractContextRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/repository/AbstractContextRepository.java index a647e654a23ddbf2e89a727edaac0ec06b4b0332..bb1665b6ab0cb5f56e55435cdb38bf5aaa28c1b8 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/repository/AbstractContextRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/repository/AbstractContextRepository.java @@ -18,9 +18,8 @@ package com.gitee.dorive.core.impl.repository; import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.StrUtil; import com.gitee.dorive.api.api.common.BoundedContextAware; -import com.gitee.dorive.api.constant.core.Sort; +import com.gitee.dorive.api.api.common.BoundedContext; import com.gitee.dorive.api.entity.core.EntityDefinition; import com.gitee.dorive.api.entity.core.EntityElement; import com.gitee.dorive.api.entity.core.def.EntityDef; @@ -33,27 +32,17 @@ import com.gitee.dorive.core.api.common.RepositoryPostProcessor; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.api.executor.EntityOpHandler; import com.gitee.dorive.core.api.executor.Executor; -import com.gitee.dorive.core.api.factory.EntityFactory; -import com.gitee.dorive.core.api.factory.EntityMapper; import com.gitee.dorive.core.config.RepositoryContext; -import com.gitee.dorive.api.entity.common.BoundedContext; -import com.gitee.dorive.core.entity.common.EntityStoreInfo; -import com.gitee.dorive.core.entity.executor.OrderBy; -import com.gitee.dorive.core.entity.factory.FieldConverter; import com.gitee.dorive.core.impl.context.AdaptiveMatcher; import com.gitee.dorive.core.impl.executor.ContextExecutor; -import com.gitee.dorive.core.impl.executor.ExampleExecutor; -import com.gitee.dorive.core.impl.executor.FactoryExecutor; -import com.gitee.dorive.core.impl.factory.DefaultEntityFactory; import com.gitee.dorive.core.impl.factory.OperationFactory; -import com.gitee.dorive.core.impl.factory.ValueObjEntityFactory; +import com.gitee.dorive.core.impl.factory.OrderByFactory; import com.gitee.dorive.core.impl.handler.BatchEntityHandler; import com.gitee.dorive.core.impl.handler.DelegatedEntityHandler; import com.gitee.dorive.core.impl.handler.eo.BatchEntityOpHandler; import com.gitee.dorive.core.impl.handler.eo.DelegatedEntityOpHandler; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.impl.resolver.DerivedRepositoryResolver; -import com.gitee.dorive.core.impl.resolver.EntityMapperResolver; import lombok.Getter; import lombok.Setter; import org.apache.commons.lang3.StringUtils; @@ -63,7 +52,6 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import java.util.*; -import java.util.concurrent.ConcurrentHashMap; @Getter @Setter @@ -73,10 +61,10 @@ public abstract class AbstractContextRepository extends AbstractRepositor private BoundedContext boundedContext; private RepositoryDef repositoryDef; - private Map repositoryMap = new LinkedHashMap<>(); - private CommonRepository rootRepository; - private List subRepositories = new ArrayList<>(); - private List orderedRepositories = new ArrayList<>(); + private Map repositoryMap = new LinkedHashMap<>(); + private ProxyRepository rootRepository; + private List subRepositories = new ArrayList<>(); + private List orderedRepositories = new ArrayList<>(); private DerivedRepositoryResolver derivedRepositoryResolver; @Override @@ -106,7 +94,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor for (EntityElement entityElement : entityElements) { String accessPath = entityElement.getAccessPath(); - CommonRepository repository = newRepository(entityElement); + ProxyRepository repository = newRepository(entityElement); repositoryMap.put(accessPath, repository); if (repository.isRoot()) { rootRepository = repository; @@ -138,30 +126,28 @@ public abstract class AbstractContextRepository extends AbstractRepositor } } - private CommonRepository newRepository(EntityElement entityElement) { + private ProxyRepository newRepository(EntityElement entityElement) { resetEntityDef(entityElement); - EntityDef entityDef = entityElement.getEntityDef(); OrderByDef orderByDef = entityElement.getOrderByDef(); String accessPath = entityElement.getAccessPath(); + boolean isRoot = entityElement.isRoot(); - OperationFactory operationFactory = new OperationFactory(entityElement); - - Class repositoryClass = entityDef.getRepository(); AbstractRepository repository; - if (repositoryClass == DefaultRepository.class) { - repository = doNewRepository(entityElement, operationFactory); + if (isRoot) { + repository = doNewRepository(entityElement); + repository = processRepository(repository); } else { repository = doGetRepository(entityElement); } - boolean isRoot = "/".equals(accessPath); + OperationFactory operationFactory = repository.getOperationFactory(); boolean isAggregated = repository instanceof AbstractContextRepository; BinderResolver binderResolver = new BinderResolver(this); binderResolver.resolve(entityElement); - OrderBy defaultOrderBy = newDefaultOrderBy(orderByDef); + OrderByFactory orderByFactory = orderByDef == null ? null : new OrderByFactory(orderByDef); - CommonRepository repositoryWrapper = new CommonRepository(); + ProxyRepository repositoryWrapper = new ProxyRepository(); repositoryWrapper.setEntityElement(entityElement); repositoryWrapper.setOperationFactory(operationFactory); repositoryWrapper.setProxyRepository(repository); @@ -169,7 +155,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor repositoryWrapper.setRoot(isRoot); repositoryWrapper.setAggregated(isAggregated); repositoryWrapper.setBinderResolver(binderResolver); - repositoryWrapper.setDefaultOrderBy(defaultOrderBy); + repositoryWrapper.setOrderByFactory(orderByFactory); repositoryWrapper.setBound(false); repositoryWrapper.setMatcher(new AdaptiveMatcher(repositoryWrapper)); return repositoryWrapper; @@ -194,49 +180,10 @@ public abstract class AbstractContextRepository extends AbstractRepositor entityDef.setRepository(newRepositoryClass); } - protected AbstractRepository doNewRepository(EntityElement entityElement, OperationFactory operationFactory) { - Map attributes = new ConcurrentHashMap<>(4); - - EntityStoreInfo entityStoreInfo = resolveEntityStoreInfo(repositoryDef); - attributes.put(EntityStoreInfo.class.getName(), entityStoreInfo); - - EntityMapperResolver entityMapperResolver = new EntityMapperResolver(entityElement, entityStoreInfo); - EntityMapper entityMapper = entityMapperResolver.newEntityMapper(); - EntityFactory entityFactory = newEntityFactory(entityElement, entityStoreInfo, entityMapper); - - Executor executor = newExecutor(entityElement, entityStoreInfo); - executor = new FactoryExecutor(executor, entityElement, entityStoreInfo, entityFactory); - executor = new ExampleExecutor(executor, entityElement, entityMapper); - attributes.put(ExampleExecutor.class.getName(), executor); - - DefaultRepository repository = new DefaultRepository(); - repository.setEntityElement(entityElement); - repository.setOperationFactory(operationFactory); - repository.setExecutor(executor); - repository.setAttributes(attributes); + protected AbstractRepository processRepository(AbstractRepository repository) { return repository; } - private EntityFactory newEntityFactory(EntityElement entityElement, EntityStoreInfo entityStoreInfo, EntityMapper entityMapper) { - Class factoryClass = repositoryDef.getFactory(); - EntityFactory entityFactory; - if (factoryClass == Object.class) { - List valueObjFields = entityMapper.getValueObjFields(); - entityFactory = valueObjFields.isEmpty() ? new DefaultEntityFactory() : new ValueObjEntityFactory(); - } else { - entityFactory = (EntityFactory) applicationContext.getBean(factoryClass); - } - if (entityFactory instanceof DefaultEntityFactory) { - DefaultEntityFactory defaultEntityFactory = (DefaultEntityFactory) entityFactory; - defaultEntityFactory.setEntityElement(entityElement); - defaultEntityFactory.setEntityStoreInfo(entityStoreInfo); - defaultEntityFactory.setEntityMapper(entityMapper); - defaultEntityFactory.setBoundedContextName(repositoryDef.getBoundedContext()); - defaultEntityFactory.setBoundedContext(boundedContext); - } - return entityFactory; - } - @SuppressWarnings("unchecked") private AbstractRepository doGetRepository(EntityElement entityElement) { EntityDef entityDef = entityElement.getEntityDef(); @@ -249,30 +196,17 @@ public abstract class AbstractContextRepository extends AbstractRepositor return repository; } - private OrderBy newDefaultOrderBy(OrderByDef orderByDef) { - if (orderByDef != null) { - String field = orderByDef.getField(); - String sort = orderByDef.getSort(); - if (StringUtils.isNotBlank(field) && StringUtils.isNotBlank(sort)) { - sort = sort.toUpperCase(); - if (Sort.ASC.equals(sort) || Sort.DESC.equals(sort)) { - List properties = StrUtil.splitTrim(field, ","); - return new OrderBy(properties, sort); - } - } - } - return null; - } - protected Executor newExecutor() { EntityHandler entityHandler = newEntityHandler(); EntityOpHandler entityOpHandler = newEntityOpHandler(); + derivedRepositoryResolver = new DerivedRepositoryResolver(this); derivedRepositoryResolver.resolve(); if (derivedRepositoryResolver.hasDerived()) { entityHandler = new DelegatedEntityHandler(this, derivedRepositoryResolver.getEntityHandlerMap(entityHandler)); entityOpHandler = new DelegatedEntityOpHandler(this, derivedRepositoryResolver.getEntityOpHandlerMap(entityOpHandler)); } + return new ContextExecutor(this, entityHandler, entityOpHandler); } @@ -284,8 +218,6 @@ public abstract class AbstractContextRepository extends AbstractRepositor return new BatchEntityOpHandler(this); } - protected abstract EntityStoreInfo resolveEntityStoreInfo(RepositoryDef repositoryDef); - - protected abstract Executor newExecutor(EntityElement entityElement, EntityStoreInfo entityStoreInfo); + protected abstract DefaultRepository doNewRepository(EntityElement entityElement); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/repository/AbstractGenericRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/repository/AbstractGenericRepository.java index 858174babdba496b764d22fb176f4f35a86f0dae..69601cd52fa9d8ccbb7dcac71113e305660747d4 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/repository/AbstractGenericRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/repository/AbstractGenericRepository.java @@ -36,7 +36,7 @@ public abstract class AbstractGenericRepository extends AbstractContextRe @Override public long selectCountByExample(Options options, Example example) { Assert.notNull(example, "The example cannot be null!"); - CommonRepository repository = getRootRepository(); + ProxyRepository repository = getRootRepository(); return repository.selectCountByExample(options, example); } @@ -45,7 +45,7 @@ public abstract class AbstractGenericRepository extends AbstractContextRe Assert.notNull(entity, "The entity cannot be null!"); Assert.notNull(example, "The example cannot be null!"); int totalCount = 0; - for (CommonRepository repository : getOrderedRepositories()) { + for (ProxyRepository repository : getOrderedRepositories()) { if (repository.matches(options)) { totalCount += repository.updateByExample(options, entity, ExampleUtils.clone(example)); } @@ -64,7 +64,7 @@ public abstract class AbstractGenericRepository extends AbstractContextRe public int deleteByExample(Options options, Example example) { Assert.notNull(example, "The example cannot be null!"); int totalCount = 0; - for (CommonRepository repository : getOrderedRepositories()) { + for (ProxyRepository repository : getOrderedRepositories()) { if (repository.matches(options)) { totalCount += repository.deleteByExample(options, ExampleUtils.clone(example)); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/repository/DefaultRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/repository/DefaultRepository.java index b95091ad0e891f0b2d39718ecec8ddc39e5283f1..be806a81205e5cdb0803defbf28746d772f1cc96 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/repository/DefaultRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/repository/DefaultRepository.java @@ -17,15 +17,16 @@ package com.gitee.dorive.core.impl.repository; +import com.gitee.dorive.core.api.common.ExampleConverter; +import com.gitee.dorive.core.api.mapper.EntityMappers; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import java.util.Map; - @Getter @Setter @NoArgsConstructor public class DefaultRepository extends AbstractRepository { - private Map attributes; + private EntityMappers entityMappers; + private ExampleConverter exampleConverter; } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/repository/CommonRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/repository/ProxyRepository.java similarity index 93% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/repository/CommonRepository.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/repository/ProxyRepository.java index 11f463df1d23e8191a6998072ef77dc6a4ec95d6..e9fed46843ccbb10e83c958f35c92a6dc6df167e 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/repository/CommonRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/repository/ProxyRepository.java @@ -24,7 +24,6 @@ import com.gitee.dorive.core.api.context.Selector; import com.gitee.dorive.core.entity.enums.JoinType; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; -import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.cop.Query; @@ -32,8 +31,8 @@ import com.gitee.dorive.core.entity.operation.eop.Insert; import com.gitee.dorive.core.entity.operation.eop.InsertOrUpdate; import com.gitee.dorive.core.entity.operation.eop.Update; import com.gitee.dorive.core.impl.binder.StrongBinder; +import com.gitee.dorive.core.impl.factory.OrderByFactory; import com.gitee.dorive.core.impl.resolver.BinderResolver; -import com.gitee.dorive.core.impl.util.ExampleUtils; import lombok.Getter; import lombok.Setter; @@ -42,13 +41,13 @@ import java.util.List; @Getter @Setter -public class CommonRepository extends AbstractProxyRepository implements Matcher { +public class ProxyRepository extends AbstractProxyRepository implements Matcher { private String accessPath; private boolean root; private boolean aggregated; private BinderResolver binderResolver; - private OrderBy defaultOrderBy; + private OrderByFactory orderByFactory; private boolean bound; private Matcher matcher; @@ -101,8 +100,8 @@ public class CommonRepository extends AbstractProxyRepository implements Matcher } Example example = query.getExample(); if (example != null) { - if (example.getOrderBy() == null && defaultOrderBy != null) { - example.setOrderBy(ExampleUtils.clone(defaultOrderBy)); + if (example.getOrderBy() == null && orderByFactory != null) { + example.setOrderBy(orderByFactory.newOrderBy()); } } return super.executeQuery(context, query); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/BinderResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/BinderResolver.java index ad0b9bdcbbfcb4b95310a18bcf89cd60e7f61098..5280c3894adc65dadc7a59af8f7eb7ad94663b1d 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/BinderResolver.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/BinderResolver.java @@ -37,7 +37,7 @@ import com.gitee.dorive.core.impl.endpoint.BindEndpoint; import com.gitee.dorive.core.impl.endpoint.FieldEndpoint; import com.gitee.dorive.core.impl.processor.SpELProcessor; import com.gitee.dorive.core.impl.repository.AbstractContextRepository; -import com.gitee.dorive.core.impl.repository.CommonRepository; +import com.gitee.dorive.core.impl.repository.ProxyRepository; import lombok.Data; import org.apache.commons.lang3.StringUtils; import org.springframework.context.ApplicationContext; @@ -223,23 +223,19 @@ public class BinderResolver { private BindEndpoint newBindEndpoint(BindingDef bindingDef) { String bind = bindingDef.getBind(); - String bindField = bindingDef.getBindField(); - CommonRepository rootRepository = repository.getRootRepository(); + ProxyRepository rootRepository = repository.getRootRepository(); EntityElement entityElement = rootRepository.getEntityElement(); FieldDefinition fieldDefinition = entityElement.getFieldDefinition(bind); Assert.notNull(fieldDefinition, "The bound property chain cannot be null! bind: {}", bind); BindEndpoint bindEndpoint = new BindEndpoint(fieldDefinition, "#entity." + bind); - Map repositoryMap = repository.getRepositoryMap(); - CommonRepository belongRepository = repositoryMap.getOrDefault("/" + bind, rootRepository); + Map repositoryMap = repository.getRepositoryMap(); + ProxyRepository belongRepository = repositoryMap.getOrDefault("/" + bind, rootRepository); belongRepository.setBound(true); - EntityElement belongEntityElement = belongRepository.getEntityElement(); - String bindFieldAlias = belongEntityElement.toAlias(bindField); bindEndpoint.setBelongAccessPath(belongRepository.getAccessPath()); bindEndpoint.setBelongRepository(belongRepository); - bindEndpoint.setBindFieldAlias(bindFieldAlias); return bindEndpoint; } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityFactoryResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityFactoryResolver.java new file mode 100644 index 0000000000000000000000000000000000000000..1c9072a4af121435a210d7b6835308433adcdcf2 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityFactoryResolver.java @@ -0,0 +1,70 @@ +/* + * 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.impl.resolver; + +import com.gitee.dorive.api.entity.core.EntityElement; +import com.gitee.dorive.api.entity.core.def.RepositoryDef; +import com.gitee.dorive.core.api.factory.EntityFactory; +import com.gitee.dorive.core.api.mapper.EntityMapper; +import com.gitee.dorive.core.api.mapper.EntityMappers; +import com.gitee.dorive.core.api.mapper.FieldMapper; +import com.gitee.dorive.core.impl.factory.entity.DefaultEntityFactory; +import com.gitee.dorive.core.impl.factory.entity.ValueObjEntityFactory; +import com.gitee.dorive.core.impl.repository.AbstractContextRepository; +import lombok.AllArgsConstructor; +import lombok.Data; +import org.springframework.context.ApplicationContext; + +import java.util.List; + +@Data +@AllArgsConstructor +public class EntityFactoryResolver { + + private AbstractContextRepository repository; + private EntityElement entityElement; + private Class reType; + private Class deType; + private EntityMappers entityMappers; + private EntityMapper reEntityMapper; + private EntityMapper deEntityMapper; + + public EntityFactory newEntityFactory() { + RepositoryDef repositoryDef = repository.getRepositoryDef(); + Class factoryClass = repositoryDef.getFactory(); + EntityFactory entityFactory; + if (factoryClass == Object.class) { + List valueObjFields = entityMappers.getValueObjFields(); + entityFactory = valueObjFields.isEmpty() ? new DefaultEntityFactory() : new ValueObjEntityFactory(); + } else { + ApplicationContext applicationContext = repository.getApplicationContext(); + entityFactory = (EntityFactory) applicationContext.getBean(factoryClass); + } + if (entityFactory instanceof DefaultEntityFactory) { + DefaultEntityFactory defaultEntityFactory = (DefaultEntityFactory) entityFactory; + defaultEntityFactory.setEntityElement(entityElement); + defaultEntityFactory.setReType(entityElement.getGenericType()); + defaultEntityFactory.setDeType(deType); + defaultEntityFactory.setEntityMappers(entityMappers, reEntityMapper, deEntityMapper); + defaultEntityFactory.setBoundedContextName(repositoryDef.getBoundedContext()); + defaultEntityFactory.setBoundedContext(repository.getBoundedContext()); + } + return entityFactory; + } + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMappersResolver.java similarity index 50% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMappersResolver.java index 0d50c98db5629ad635f56f95d86f950c9aa1cfcb..3d35c36e7639f0b5e0b46d195114b9bf03e28e7f 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMappersResolver.java @@ -18,83 +18,81 @@ package com.gitee.dorive.core.impl.resolver; import cn.hutool.core.util.ReflectUtil; -import com.gitee.dorive.api.entity.core.def.FieldDef; import com.gitee.dorive.api.entity.core.EntityElement; import com.gitee.dorive.api.entity.core.FieldDefinition; -import com.gitee.dorive.core.api.factory.Converter; -import com.gitee.dorive.core.api.factory.EntityMapper; -import com.gitee.dorive.core.entity.common.EntityStoreInfo; -import com.gitee.dorive.core.entity.enums.Domain; -import com.gitee.dorive.core.entity.factory.FieldConverter; -import com.gitee.dorive.core.impl.converter.JsonArrayConverter; -import com.gitee.dorive.core.impl.converter.JsonConverter; -import com.gitee.dorive.core.impl.converter.MapConverter; -import com.gitee.dorive.core.impl.converter.MapExpConverter; +import com.gitee.dorive.api.entity.core.def.FieldDef; +import com.gitee.dorive.core.api.mapper.EntityMapper; +import com.gitee.dorive.core.api.mapper.EntityMappers; +import com.gitee.dorive.core.api.mapper.FieldMapper; +import com.gitee.dorive.core.api.mapper.Converter; +import com.gitee.dorive.core.impl.mapper.DefaultEntityMapper; +import com.gitee.dorive.core.impl.mapper.DefaultEntityMappers; +import com.gitee.dorive.core.impl.mapper.DefaultFieldMapper; +import com.gitee.dorive.core.impl.mapper.value.JsonArrayConverter; +import com.gitee.dorive.core.impl.mapper.value.JsonConverter; +import com.gitee.dorive.core.impl.mapper.value.MapConverter; +import com.gitee.dorive.core.impl.mapper.value.MapExpConverter; import lombok.AllArgsConstructor; import lombok.Data; -import lombok.Getter; import org.apache.commons.lang3.StringUtils; import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; @Data @AllArgsConstructor -public class EntityMapperResolver { +public class EntityMappersResolver { private EntityElement entityElement; - private EntityStoreInfo entityStoreInfo; + private Map aliasPropMapping; + private String reMapper; + private String deMapper; - public EntityMapper newEntityMapper() { + public EntityMappers newEntityMappers() { List fieldDefinitions = entityElement.getFieldDefinitions(); - Map aliasPropMapping = entityStoreInfo.getAliasPropMapping(); + Map fieldAliasMapping = entityElement.getFieldAliasMapping(); - Map fieldConverterMap = new LinkedHashMap<>(fieldDefinitions.size() * 4 / 3 + 1); - List valueObjFields = new ArrayList<>(4); - List matchedValueObjFields = new ArrayList<>(4); - List unmatchedValueObjFields = new ArrayList<>(4); + Map mapperEntityMapperMap = new LinkedHashMap<>(4); + List valueObjFields = new ArrayList<>(4); + List matchedValueObjFields = new ArrayList<>(4); + List unmatchedValueObjFields = new ArrayList<>(4); Set valueObjTypes = new HashSet<>(6); + int size = fieldDefinitions.size() * 4 / 3 + 1; + DefaultEntityMapper entityMapper1 = new DefaultEntityMapper(new LinkedHashMap<>(size), new LinkedHashMap<>(size), new LinkedHashMap<>(size)); + DefaultEntityMapper entityMapper2 = new DefaultEntityMapper(new LinkedHashMap<>(size), new LinkedHashMap<>(size), new LinkedHashMap<>(size)); + for (FieldDefinition fieldDefinition : fieldDefinitions) { - String fieldName = fieldDefinition.getFieldName(); + String field = fieldDefinition.getFieldName(); + String expected = fieldAliasMapping.getOrDefault(field, field); - String expected = entityElement.toAlias(fieldName); boolean isMatch = aliasPropMapping.containsKey(expected); String alias = isMatch ? expected : null; String prop = isMatch ? aliasPropMapping.get(alias) : null; - Map names = new LinkedHashMap<>(5); - names.put(Domain.ENTITY.name(), fieldName); - if (alias != null) { - names.put(Domain.DATABASE.name(), alias); - } - if (prop != null) { - names.put(Domain.POJO.name(), prop); - } - FieldDef fieldDef = fieldDefinition.getFieldDef(); boolean isValueObj = fieldDef != null && fieldDef.isValueObj(); Converter converter = newConverter(fieldDefinition, isMatch, isValueObj); - FieldConverter fieldConverter = new FieldConverter(Domain.ENTITY.name(), fieldName, isMatch, names, converter); - names.forEach((domain, eachName) -> fieldConverterMap.put(getKey(domain, eachName), fieldConverter)); + addToEntityMapper(entityMapper1, field, alias, converter); + addToEntityMapper(entityMapper2, field, prop, converter); + + FieldMapper fieldMapper = new DefaultFieldMapper(field, alias, converter); if (isValueObj) { - valueObjFields.add(fieldConverter); + valueObjFields.add(fieldMapper); if (isMatch) { - matchedValueObjFields.add(fieldConverter); + matchedValueObjFields.add(fieldMapper); } else { - unmatchedValueObjFields.add(fieldConverter); + unmatchedValueObjFields.add(fieldMapper); } valueObjTypes.add(fieldDefinition.getGenericType()); } } - return new DefaultEntityMapper(fieldConverterMap, valueObjFields, matchedValueObjFields, unmatchedValueObjFields, valueObjTypes); + mapperEntityMapperMap.put(reMapper, entityMapper1); + mapperEntityMapperMap.put(deMapper, entityMapper2); + + return new DefaultEntityMappers(mapperEntityMapperMap, valueObjFields, matchedValueObjFields, unmatchedValueObjFields, valueObjTypes); } private Converter newConverter(FieldDefinition fieldDefinition, boolean isMatch, boolean isValueObj) { @@ -119,28 +117,11 @@ public class EntityMapperResolver { return null; } - private String getKey(String domain, String name) { - return domain + ":" + name; - } - - @Getter - @AllArgsConstructor - private class DefaultEntityMapper implements EntityMapper { - private final Map fieldConverterMap; - private final List valueObjFields; - private final List matchedValueObjFields; - private final List unmatchedValueObjFields; - private final Set valueObjTypes; - - @Override - public FieldConverter getField(String domain, String name) { - return fieldConverterMap.get(getKey(domain, name)); - } - - @Override - public boolean isValueObjType(Type type) { - return valueObjTypes.contains(type); - } + private void addToEntityMapper(DefaultEntityMapper entityMapper, String field, String alias, Converter converter) { + entityMapper.getFieldAliasMapping().put(field, alias); + FieldMapper fieldMapper = new DefaultFieldMapper(field, alias, converter); + entityMapper.getFieldFieldMapperMap().put(field, fieldMapper); + entityMapper.getAliasFieldMapperMap().put(alias, fieldMapper); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/util/MultiInBuilder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/util/MultiInBuilder.java index 888369d47e597daae6733dcaf5c2c2d5843e7b23..3519823252e92999338ae838f08b2363f11d67ab 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/util/MultiInBuilder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/util/MultiInBuilder.java @@ -31,14 +31,14 @@ import java.util.stream.Collectors; @EqualsAndHashCode(callSuper = false) public class MultiInBuilder { - private List aliases; + private List properties; private int size; private int count; private List values; - public MultiInBuilder(List aliases, int count) { - this.aliases = aliases; - this.size = aliases.size(); + public MultiInBuilder(List properties, int count) { + this.properties = properties; + this.size = properties.size(); this.count = count; this.values = new ArrayList<>(count * size); } @@ -68,18 +68,25 @@ public class MultiInBuilder { } public Criterion toCriterion() { - String property = StrUtil.join(",", aliases); + String propertiesStr = StrUtil.join(",", properties); + return new Criterion(propertiesStr, Operator.MULTI_IN, this); + } + + public String buildPropertiesStr() { + return StrUtil.join(",", properties); + } + + public String buildValuesStr() { StringBuilder builder = new StringBuilder(); int page = values.size() / size; for (int current = 1; current <= page; current++) { List subValues = values.subList((current - 1) * size, current * size); builder.append(buildValuesStr(subValues)); } - String valuesStr = StrUtil.removeSuffix(builder, ","); - return new Criterion(property, Operator.MULTI_IN, valuesStr); + return StrUtil.removeSuffix(builder, ","); } - public String buildValuesStr(List values) { + private String buildValuesStr(List values) { return values.stream() .map(value -> CriterionUtils.doGetValue(null, value)) .collect(Collectors.joining(",", "(", "),")); diff --git a/dorive-event/pom.xml b/dorive-event/pom.xml index 12869573de5e7a5f11eda39b6ecbdb6831e361e1..b36d17ad80ce330995d83fe74489e365c46e9eb5 100644 --- a/dorive-event/pom.xml +++ b/dorive-event/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.2 + 3.5.3 dorive-event diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/executor/EventExecutor.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/executor/EventExecutor.java index 156c1ae522380d5613e8e79579b3ce05aeaf63eb..1a61358209f6e4bba696fe0a0fd4d4a648f596a6 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/executor/EventExecutor.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/executor/EventExecutor.java @@ -22,7 +22,7 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.operation.EntityOp; import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.impl.executor.AbstractProxyExecutor; +import com.gitee.dorive.core.impl.executor.unit.AbstractProxyExecutor; import com.gitee.dorive.event.entity.BaseEvent; import com.gitee.dorive.event.impl.factory.EventFactory; import lombok.Getter; diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/repository/AbstractEventRepository.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/repository/AbstractEventRepository.java index f93d374f2306efadad7460b0318cb20b7736fadc..924cb57e7d1dc1c1f75304cd3dd0ec7902ffe5a4 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/repository/AbstractEventRepository.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/repository/AbstractEventRepository.java @@ -18,7 +18,6 @@ package com.gitee.dorive.event.impl.repository; import cn.hutool.core.util.ArrayUtil; -import com.gitee.dorive.api.entity.core.EntityElement; import com.gitee.dorive.api.entity.core.def.RepositoryDef; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; @@ -27,7 +26,6 @@ import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.eop.Insert; import com.gitee.dorive.core.entity.operation.eop.InsertOrUpdate; import com.gitee.dorive.core.entity.operation.eop.Update; -import com.gitee.dorive.core.impl.factory.OperationFactory; import com.gitee.dorive.core.impl.repository.AbstractGenericRepository; import com.gitee.dorive.core.impl.repository.AbstractRepository; import com.gitee.dorive.core.impl.repository.DefaultRepository; @@ -52,11 +50,10 @@ public abstract class AbstractEventRepository extends AbstractGenericRepo } @Override - protected AbstractRepository doNewRepository(EntityElement entityElement, OperationFactory operationFactory) { - AbstractRepository repository = super.doNewRepository(entityElement, operationFactory); + protected AbstractRepository processRepository(AbstractRepository repository) { if (enableExecutorEvent && repository instanceof DefaultRepository) { Executor executor = repository.getExecutor(); - executor = new EventExecutor(executor, getApplicationContext(), entityElement); + executor = new EventExecutor(executor, getApplicationContext(), repository.getEntityElement()); repository.setExecutor(executor); } return repository; diff --git a/dorive-module/pom.xml b/dorive-module/pom.xml index 2bddf35fa313cdec3c2cbcf5db9cb42893efaeb7..178d2d93ec51170ad3afa1f230840998664b5d5c 100644 --- a/dorive-module/pom.xml +++ b/dorive-module/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.2 + 3.5.3 dorive-module diff --git a/dorive-module/src/main/java/com/gitee/dorive/module/entity/ModuleDefinition.java b/dorive-module/src/main/java/com/gitee/dorive/module/entity/ModuleDefinition.java index fa61c38e1c2a8cbb09bceba7973da5aeba06339d..fab6683b845daec06c1387184b37c9cf47ea3da3 100644 --- a/dorive-module/src/main/java/com/gitee/dorive/module/entity/ModuleDefinition.java +++ b/dorive-module/src/main/java/com/gitee/dorive/module/entity/ModuleDefinition.java @@ -24,7 +24,6 @@ import cn.hutool.core.util.StrUtil; import com.gitee.dorive.module.impl.util.NameUtils; import lombok.Data; import org.apache.commons.lang3.StringUtils; -import org.springframework.core.io.Resource; import java.util.ArrayList; import java.util.Collections; @@ -36,7 +35,6 @@ import static com.gitee.dorive.module.impl.parser.AbstractModuleParser.PATH_MATC @Data public class ModuleDefinition { - private Resource resource; private String originId; private String organization; private String project; @@ -56,13 +54,10 @@ public class ModuleDefinition { private String tablePrefix; private String requestPrefix; - public ModuleDefinition(Resource resource, Manifest manifest) { - Assert.notNull(resource, "The resource can not be null!"); + public ModuleDefinition(Manifest manifest) { Assert.notNull(manifest, "The manifest can not be null!"); - this.resource = resource; Attributes mainAttributes = manifest.getMainAttributes(); - String originId = mainAttributes.getValue("Dorive-Origin-Id"); String organization = mainAttributes.getValue("Dorive-Organization"); String project = mainAttributes.getValue("Dorive-Project"); diff --git a/dorive-module/src/main/java/com/gitee/dorive/module/impl/ModuleLauncher.java b/dorive-module/src/main/java/com/gitee/dorive/module/impl/ModuleLauncher.java index 242b15e317dc6224f2a2da695e1378aff7a19db1..253c7e22fa5a751c0171f7baa4b6f687a189f4ab 100644 --- a/dorive-module/src/main/java/com/gitee/dorive/module/impl/ModuleLauncher.java +++ b/dorive-module/src/main/java/com/gitee/dorive/module/impl/ModuleLauncher.java @@ -47,14 +47,24 @@ public class ModuleLauncher { } private String findMavenRepositoryPath() { + String mavenRepositoryPath = null; + String mavenHome = System.getenv("MAVEN_HOME"); if (StringUtils.isNotBlank(mavenHome)) { - return mavenHome + File.separator + "repository"; + mavenRepositoryPath = mavenHome + File.separator + "repository"; + } + if (FileUtil.exist(mavenRepositoryPath)) { + return mavenRepositoryPath; } + String userHome = System.getProperty("user.home"); if (StringUtils.isNotBlank(userHome)) { - return userHome + File.separator + ".m2" + File.separator + "repository"; + mavenRepositoryPath = userHome + File.separator + ".m2" + File.separator + "repository"; } + if (FileUtil.exist(mavenRepositoryPath)) { + return mavenRepositoryPath; + } + return null; } diff --git a/dorive-module/src/main/java/com/gitee/dorive/module/impl/filter/BoundedContextExposedBeanFilter.java b/dorive-module/src/main/java/com/gitee/dorive/module/impl/filter/BoundedContextExposedBeanFilter.java index c50f2534a2c4bbb1dce0cc03d3392e50e554d540..b0121c052ba54d363132cf89fd46be3a72fd8c25 100644 --- a/dorive-module/src/main/java/com/gitee/dorive/module/impl/filter/BoundedContextExposedBeanFilter.java +++ b/dorive-module/src/main/java/com/gitee/dorive/module/impl/filter/BoundedContextExposedBeanFilter.java @@ -17,7 +17,7 @@ package com.gitee.dorive.module.impl.filter; -import com.gitee.dorive.api.entity.common.BoundedContext; +import com.gitee.dorive.api.api.common.BoundedContext; import com.gitee.dorive.module.api.ExposedBeanFilter; import com.gitee.dorive.module.entity.ModuleBeanDescriptor; import com.gitee.dorive.module.entity.ModuleDefinition; diff --git a/dorive-module/src/main/java/com/gitee/dorive/module/impl/inject/BoundedContextBeanPostProcessor.java b/dorive-module/src/main/java/com/gitee/dorive/module/impl/inject/BoundedContextBeanPostProcessor.java index f0a300f27050c54210511427dddd3201c6e0e9d9..6f4f8153280880ac78ec71fc7fb6b3ccc69e66b0 100644 --- a/dorive-module/src/main/java/com/gitee/dorive/module/impl/inject/BoundedContextBeanPostProcessor.java +++ b/dorive-module/src/main/java/com/gitee/dorive/module/impl/inject/BoundedContextBeanPostProcessor.java @@ -18,7 +18,7 @@ package com.gitee.dorive.module.impl.inject; import com.gitee.dorive.api.api.common.BoundedContextAware; -import com.gitee.dorive.api.entity.common.BoundedContext; +import com.gitee.dorive.api.api.common.BoundedContext; import com.gitee.dorive.module.api.ModuleParser; import com.gitee.dorive.module.entity.ModuleDefinition; import com.gitee.dorive.module.impl.parser.DefaultModuleParser; diff --git a/dorive-module/src/main/java/com/gitee/dorive/module/impl/parser/AbstractModuleParser.java b/dorive-module/src/main/java/com/gitee/dorive/module/impl/parser/AbstractModuleParser.java index 1c0d7ed54b594f4f509e80ef5156e714b4dd82bc..0ab0026923eebbe1abf5c003cfb427d574f79826 100644 --- a/dorive-module/src/main/java/com/gitee/dorive/module/impl/parser/AbstractModuleParser.java +++ b/dorive-module/src/main/java/com/gitee/dorive/module/impl/parser/AbstractModuleParser.java @@ -84,7 +84,7 @@ public abstract class AbstractModuleParser implements ModuleParser { Attributes mainAttributes = manifest.getMainAttributes(); String moduleName = mainAttributes.getValue("Dorive-Module"); if (moduleName != null) { - ModuleDefinition moduleDefinition = new ModuleDefinition(resource, manifest); + ModuleDefinition moduleDefinition = new ModuleDefinition(manifest); nameModuleDefinitionMap.put(moduleName, moduleDefinition); uriModuleDefinitionMap.put(uriForMatch, moduleDefinition); // For test. diff --git a/dorive-module/src/main/java/com/gitee/dorive/module/impl/util/PlaceholderUtils.java b/dorive-module/src/main/java/com/gitee/dorive/module/impl/util/PlaceholderUtils.java index f345eb616bbad78c80b193c3088e154cd9858a04..f6fde6a334b12bb9df6cd2448c4ad295504a13e0 100644 --- a/dorive-module/src/main/java/com/gitee/dorive/module/impl/util/PlaceholderUtils.java +++ b/dorive-module/src/main/java/com/gitee/dorive/module/impl/util/PlaceholderUtils.java @@ -1,3 +1,20 @@ +/* + * 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.module.impl.util; import org.springframework.util.PropertyPlaceholderHelper; diff --git a/dorive-mybatis-plus/pom.xml b/dorive-mybatis-plus/pom.xml index 4dca5421171e32d978b673f0b2e4ea773db145bf..06712562137f38395f899aec222f8f69f30cbd1b 100644 --- a/dorive-mybatis-plus/pom.xml +++ b/dorive-mybatis-plus/pom.xml @@ -6,13 +6,13 @@ com.gitee.digital-engine dorive - 3.5.2 + 3.5.3 dorive-mybatis-plus com.gitee.digital-engine - dorive-sql + dorive-mybatis ${project.version} diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/DefaultImplFactory.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/DefaultImplFactory.java index 73f84de3d53f8adce8acb19b67d82767f1cf7b0c..d265d7e317804ca658f420d5e74e188a2f3f93da 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/DefaultImplFactory.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/DefaultImplFactory.java @@ -19,7 +19,7 @@ package com.gitee.dorive.mybatis.plus.impl; import com.gitee.dorive.core.api.common.ImplFactory; import com.gitee.dorive.core.api.format.SqlFormat; -import com.gitee.dorive.sql.api.SqlRunner; +import com.gitee.dorive.mybatis.api.sql.SqlRunner; public class DefaultImplFactory implements ImplFactory { diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/DefaultSqlHelper.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/DefaultSqlHelper.java index 0a2b22111ddbf470fb124da7a7f68014223cdb14..18a4f8a55facb5c9ad56a4384a4ed0036b58aa5f 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/DefaultSqlHelper.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/DefaultSqlHelper.java @@ -21,7 +21,7 @@ import cn.hutool.db.sql.Condition; import cn.hutool.db.sql.SqlUtil; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.gitee.dorive.core.api.format.SqlFormat; -import com.gitee.dorive.sql.api.SqlRunner; +import com.gitee.dorive.mybatis.api.sql.SqlRunner; import java.util.List; import java.util.Map; diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/executor/MybatisPlusExecutor.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/executor/MybatisPlusExecutor.java index a364dd43461e5af935805551844351455b48ca50..e0777bd149876f273e221a5c8dd34856ce1c968f 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/executor/MybatisPlusExecutor.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/executor/MybatisPlusExecutor.java @@ -27,7 +27,7 @@ import com.gitee.dorive.api.constant.core.Sort; import com.gitee.dorive.api.entity.core.def.EntityDef; import com.gitee.dorive.api.entity.core.EntityElement; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.common.EntityStoreInfo; +import com.gitee.dorive.mybatis.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Result; diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/repository/MybatisPlusRepository.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/repository/MybatisPlusRepository.java index a267ae1b5387a0d7e85951217a10f98d8f9f631c..f077a5a0a5f54fa240d0a1e35f13753ba7b32f6a 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/repository/MybatisPlusRepository.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/repository/MybatisPlusRepository.java @@ -26,24 +26,12 @@ import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.gitee.dorive.api.entity.core.EntityElement; import com.gitee.dorive.api.entity.core.def.RepositoryDef; -import com.gitee.dorive.core.api.common.ImplFactory; import com.gitee.dorive.core.api.common.MethodInvoker; -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.impl.executor.MybatisPlusExecutor; +import com.gitee.dorive.mybatis.entity.common.EntityStoreInfo; +import com.gitee.dorive.mybatis.impl.repository.AbstractMybatisRepository; import com.gitee.dorive.mybatis.plus.impl.DefaultMethodInvoker; -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.impl.repository.AbstractRefRepository; -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.impl.executor.UnionExecutor; -import com.gitee.dorive.sql.impl.handler.SqlBuildQueryHandler; -import com.gitee.dorive.sql.impl.handler.SqlExecuteQueryHandler; -import com.gitee.dorive.sql.impl.querier.SqlCountQuerier; +import com.gitee.dorive.mybatis.plus.impl.executor.MybatisPlusExecutor; import lombok.Getter; import lombok.Setter; import org.apache.commons.lang3.StringUtils; @@ -59,19 +47,7 @@ import java.util.concurrent.ConcurrentHashMap; @Getter @Setter -public class MybatisPlusRepository extends AbstractRefRepository implements CountQuerier { - - private SqlRunner sqlRunner; - private EntityStoreInfo entityStoreInfo; - private CountQuerier countQuerier; - - @Override - public void afterPropertiesSet() throws Exception { - ImplFactory implFactory = getApplicationContext().getBean(ImplFactory.class); - this.sqlRunner = implFactory.getInstance(SqlRunner.class); - super.afterPropertiesSet(); - this.countQuerier = new SqlCountQuerier(this, getQueryHandler(), this.sqlRunner); - } +public class MybatisPlusRepository extends AbstractMybatisRepository { @Override protected EntityStoreInfo resolveEntityStoreInfo(RepositoryDef repositoryDef) { @@ -96,11 +72,10 @@ 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; - this.entityStoreInfo = newEntityStoreInfo(mapperClass, mapper, pojoClass, tableInfo); - return entityStoreInfo; + return newEntityStoreInfo(mapperClass, mapper, pojoClass, tableInfo); } - private EntityStoreInfo newEntityStoreInfo(Class mapperClass, Object mapper, Class pojoClass, TableInfo tableInfo) { + protected EntityStoreInfo newEntityStoreInfo(Class mapperClass, Object mapper, Class pojoClass, TableInfo tableInfo) { String tableName = tableInfo.getTableName(); String keyProperty = tableInfo.getKeyProperty(); String keyColumn = tableInfo.getKeyColumn(); @@ -136,21 +111,7 @@ public class MybatisPlusRepository extends AbstractRefRepository i @Override protected Executor newExecutor(EntityElement entityElement, EntityStoreInfo entityStoreInfo) { - Executor executor = new MybatisPlusExecutor(entityElement.getEntityDef(), entityElement, entityStoreInfo); - return new UnionExecutor(executor, sqlRunner, entityStoreInfo); - } - - @Override - protected void registryQueryHandlers(Map queryHandlerMap) { - super.registryQueryHandlers(queryHandlerMap); - queryHandlerMap.put(QueryMethod.SQL_BUILD, new SqlBuildQueryHandler(this)); - queryHandlerMap.put(QueryMethod.SQL_EXECUTE, new SqlExecuteQueryHandler(this, sqlRunner)); - queryHandlerMap.put(QueryMethod.SQL_CUSTOM, new SqlCustomQueryHandler(this, entityStoreInfo)); - } - - @Override - public Map selectCountMap(Context context, CountQuery countQuery) { - return countQuerier.selectCountMap(context, countQuery); + return new MybatisPlusExecutor(entityElement.getEntityDef(), entityElement, entityStoreInfo); } } diff --git a/dorive-sql/pom.xml b/dorive-mybatis/pom.xml similarity index 89% rename from dorive-sql/pom.xml rename to dorive-mybatis/pom.xml index eea1c97820994df0cdec41d5cd8ad6b2fad8d988..12f6b427c13deec5c17f29b34f46b22c93b291e6 100644 --- a/dorive-sql/pom.xml +++ b/dorive-mybatis/pom.xml @@ -6,9 +6,9 @@ com.gitee.digital-engine dorive - 3.5.2 + 3.5.3 - dorive-sql + dorive-mybatis com.gitee.digital-engine diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/api/CountQuerier.java b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/api/sql/CountQuerier.java similarity index 91% rename from dorive-sql/src/main/java/com/gitee/dorive/sql/api/CountQuerier.java rename to dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/api/sql/CountQuerier.java index 9317f540a84e195f78f8b6c2ca7f6b0f63c6c9e8..2f752ec6be8537755ebc9df5e318b50f7e32aa9f 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/api/CountQuerier.java +++ b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/api/sql/CountQuerier.java @@ -15,10 +15,10 @@ * limitations under the License. */ -package com.gitee.dorive.sql.api; +package com.gitee.dorive.mybatis.api.sql; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.sql.entity.common.CountQuery; +import com.gitee.dorive.mybatis.entity.sql.CountQuery; import java.util.Map; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/api/Segment.java b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/api/sql/Segment.java similarity index 95% rename from dorive-sql/src/main/java/com/gitee/dorive/sql/api/Segment.java rename to dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/api/sql/Segment.java index f28043936a3bbb7019cf9fb71eab6550bd06ab1f..96e0dea3838bbad934a93b514bdc23bdff29ef1b 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/api/Segment.java +++ b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/api/sql/Segment.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.sql.api; +package com.gitee.dorive.mybatis.api.sql; public interface Segment { } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/api/SqlRunner.java b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/api/sql/SqlRunner.java similarity index 95% rename from dorive-sql/src/main/java/com/gitee/dorive/sql/api/SqlRunner.java rename to dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/api/sql/SqlRunner.java index e825b81990bd775c11b28d4c517eba369355830e..06d4142642fe37ec7505f296a8404746e71dc235 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/api/SqlRunner.java +++ b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/api/sql/SqlRunner.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.sql.api; +package com.gitee.dorive.mybatis.api.sql; import java.util.List; import java.util.Map; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/common/EntityStoreInfo.java similarity index 96% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java rename to dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/common/EntityStoreInfo.java index 9ece243998c876ec5955cfb27f3a4ce6a5b112e0..6cb67f3dfdc31920751e684f62f9270b8f4166e5 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java +++ b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/common/EntityStoreInfo.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.common; +package com.gitee.dorive.mybatis.entity.common; import com.gitee.dorive.core.api.common.MethodInvoker; import lombok.AllArgsConstructor; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/Domain.java b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/enums/Mapper.java similarity index 88% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/Domain.java rename to dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/enums/Mapper.java index 06295ff31182c1db9a8fa582d31420ff78712160..2a0011d7bb3c4af5ee6c14aa2392afcffce9d038 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/Domain.java +++ b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/enums/Mapper.java @@ -15,10 +15,9 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.enums; +package com.gitee.dorive.mybatis.entity.enums; -public enum Domain { - ENTITY, - DATABASE, - POJO +public enum Mapper { + ENTITY_DATABASE, + ENTITY_POJO } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/ArgSegment.java b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/segment/ArgSegment.java similarity index 95% rename from dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/ArgSegment.java rename to dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/segment/ArgSegment.java index 45e4a084f081d9197df81a7fa32ab47e14dd588f..04d8806f8c85f0f95c19eb15e015707888e2721e 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/ArgSegment.java +++ b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/segment/ArgSegment.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.sql.entity.segment; +package com.gitee.dorive.mybatis.entity.segment; import lombok.Getter; import lombok.Setter; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/ExprSegment.java b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/segment/ExprSegment.java similarity index 92% rename from dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/ExprSegment.java rename to dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/segment/ExprSegment.java index 2f2df3529d4bdea8cdaa5af5b0b69d74def1db0c..a61ec7888eaec58b310d46d5de51db20010147dc 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/ExprSegment.java +++ b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/segment/ExprSegment.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package com.gitee.dorive.sql.entity.segment; +package com.gitee.dorive.mybatis.entity.segment; -import com.gitee.dorive.sql.api.Segment; +import com.gitee.dorive.mybatis.api.sql.Segment; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/OnSegment.java b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/segment/OnSegment.java similarity index 95% rename from dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/OnSegment.java rename to dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/segment/OnSegment.java index defaa0c9e4f8c5cb58fd3b0ec536036333216433..ba53a1edfe49fe50ef4c4874f04e435948fdbf39 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/OnSegment.java +++ b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/segment/OnSegment.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.sql.entity.segment; +package com.gitee.dorive.mybatis.entity.segment; import lombok.Getter; import lombok.Setter; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/OnValueSegment.java b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/segment/OnValueSegment.java similarity index 95% rename from dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/OnValueSegment.java rename to dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/segment/OnValueSegment.java index f5a7541b4bc221bcb90d8f6aeb7c408c81c19b29..8ad0810d2323e9970ef7c7ae517886a9b237601c 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/OnValueSegment.java +++ b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/segment/OnValueSegment.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.sql.entity.segment; +package com.gitee.dorive.mybatis.entity.segment; import lombok.Getter; import lombok.Setter; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/SelectSegment.java b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/segment/SelectSegment.java similarity index 96% rename from dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/SelectSegment.java rename to dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/segment/SelectSegment.java index 5330fd1d3522f12a9c86af9abc26e2d384095dc0..a3ed15861a289ac49da795471f9c282aa2534b5b 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/SelectSegment.java +++ b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/segment/SelectSegment.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package com.gitee.dorive.sql.entity.segment; +package com.gitee.dorive.mybatis.entity.segment; import cn.hutool.core.util.StrUtil; import cn.hutool.db.sql.SqlBuilder; -import com.gitee.dorive.sql.api.Segment; +import com.gitee.dorive.mybatis.api.sql.Segment; import lombok.Data; import java.util.ArrayList; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/TableJoinSegment.java b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/segment/TableJoinSegment.java similarity index 95% rename from dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/TableJoinSegment.java rename to dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/segment/TableJoinSegment.java index 03a91693afe6c28fe4a65dd675cfa626f5e5014f..f72d0d72ede4033e77a5e871084ad52302b7be73 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/TableJoinSegment.java +++ b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/segment/TableJoinSegment.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.sql.entity.segment; +package com.gitee.dorive.mybatis.entity.segment; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/TableSegment.java b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/segment/TableSegment.java similarity index 92% rename from dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/TableSegment.java rename to dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/segment/TableSegment.java index 420e52c079bb53d8cbbd2ca2866c9a17ebd61089..2bb7628b22618de19950caeeed89e7821fb81e15 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/TableSegment.java +++ b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/segment/TableSegment.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package com.gitee.dorive.sql.entity.segment; +package com.gitee.dorive.mybatis.entity.segment; -import com.gitee.dorive.sql.api.Segment; +import com.gitee.dorive.mybatis.api.sql.Segment; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/CountQuery.java b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/sql/CountQuery.java similarity index 97% rename from dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/CountQuery.java rename to dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/sql/CountQuery.java index 20a5c468d23b44b64d630945a0bb8ac991cd0204..2004e691775aa040a93209cc086e938d44616854 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/CountQuery.java +++ b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/entity/sql/CountQuery.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.sql.entity.common; +package com.gitee.dorive.mybatis.entity.sql; import com.gitee.dorive.core.api.context.Selector; import lombok.AllArgsConstructor; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/UnionExecutor.java b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/impl/executor/UnionExecutor.java similarity index 96% rename from dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/UnionExecutor.java rename to dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/impl/executor/UnionExecutor.java index 26f4ef3bacd82c4eff00a3af3a5a6f06a40f21aa..e1a9d8547d5ae2edfed4b4d921e9fcce3385df83 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/UnionExecutor.java +++ b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/impl/executor/UnionExecutor.java @@ -15,13 +15,13 @@ * limitations under the License. */ -package com.gitee.dorive.sql.impl.executor; +package com.gitee.dorive.mybatis.impl.executor; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; 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.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.OrderBy; @@ -29,8 +29,8 @@ import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.executor.UnionExample; import com.gitee.dorive.core.entity.operation.cop.Query; -import com.gitee.dorive.core.impl.executor.AbstractProxyExecutor; -import com.gitee.dorive.sql.api.SqlRunner; +import com.gitee.dorive.core.impl.executor.unit.AbstractProxyExecutor; +import com.gitee.dorive.mybatis.api.sql.SqlRunner; import lombok.Getter; import lombok.Setter; import org.apache.commons.lang3.StringUtils; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlBuildQueryHandler.java b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/impl/handler/SqlBuildQueryHandler.java similarity index 88% rename from dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlBuildQueryHandler.java rename to dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/impl/handler/SqlBuildQueryHandler.java index 168a01f071ea90a2b2049f3e8c8cc987250dad93..03ac7612137e7aa60f327c2197708361ca911395 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlBuildQueryHandler.java +++ b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/impl/handler/SqlBuildQueryHandler.java @@ -15,18 +15,18 @@ * limitations under the License. */ -package com.gitee.dorive.sql.impl.handler; +package com.gitee.dorive.mybatis.impl.handler; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.entity.executor.Result; +import com.gitee.dorive.mybatis.impl.segment.SegmentResolver; import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.QueryUnit; -import com.gitee.dorive.query.impl.handler.AbstractQueryUnitQueryHandler; +import com.gitee.dorive.query.impl.handler.executor.AbstractQueryUnitQueryHandler; import com.gitee.dorive.query.impl.repository.AbstractQueryRepository; -import com.gitee.dorive.sql.impl.segment.SegmentResolver; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; @@ -42,7 +42,7 @@ public class SqlBuildQueryHandler extends AbstractQueryUnitQueryHandler { private final AbstractQueryRepository repository; @Override - protected QueryUnit processQueryUnit(QueryContext queryContext, Map queryUnitMap, QueryUnit queryUnit) { + public QueryUnit processQueryUnit(QueryContext queryContext, Map queryUnitMap, QueryUnit queryUnit) { processExample(queryContext, queryUnit); processAttachment(queryContext, queryUnitMap, queryUnit); return queryUnit; @@ -58,7 +58,7 @@ public class SqlBuildQueryHandler extends AbstractQueryUnitQueryHandler { } @Override - protected void doHandle(QueryContext queryContext, Object query) { + public void doHandle(QueryContext queryContext, Object query) { // ignore } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlCustomQueryHandler.java b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/impl/handler/SqlCustomQueryHandler.java similarity index 94% rename from dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlCustomQueryHandler.java rename to dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/impl/handler/SqlCustomQueryHandler.java index 046a3546f75deae6b5c33d971af5b6bec4eeb041..65f05742912180e3e32b4d1e3eefb79aad410c5d 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlCustomQueryHandler.java +++ b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/impl/handler/SqlCustomQueryHandler.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package com.gitee.dorive.sql.impl.handler; +package com.gitee.dorive.mybatis.impl.handler; import cn.hutool.core.lang.Assert; import com.gitee.dorive.core.api.common.MethodInvoker; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.common.EntityStoreInfo; +import com.gitee.dorive.mybatis.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.*; import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.QueryUnit; @@ -50,7 +50,7 @@ public class SqlCustomQueryHandler extends SqlBuildQueryHandler { @Override @SuppressWarnings("unchecked") - protected void doHandle(QueryContext queryContext, Object query) { + public void doHandle(QueryContext queryContext, Object query) { Context context = queryContext.getContext(); String primaryKey = queryContext.getPrimaryKey(); String method = queryContext.getMethod(); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlExecuteQueryHandler.java b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/impl/handler/SqlExecuteQueryHandler.java similarity index 86% rename from dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlExecuteQueryHandler.java rename to dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/impl/handler/SqlExecuteQueryHandler.java index d1f8be6c4b6e25fa0f2261d9e3c58302d18a5bda..fcb08bff782a4c2c9c634ef64f911744409d5ee7 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/handler/SqlExecuteQueryHandler.java +++ b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/impl/handler/SqlExecuteQueryHandler.java @@ -15,9 +15,10 @@ * limitations under the License. */ -package com.gitee.dorive.sql.impl.handler; +package com.gitee.dorive.mybatis.impl.handler; import cn.hutool.core.collection.CollUtil; +import com.gitee.dorive.core.api.mapper.EntityMapper; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Page; @@ -26,11 +27,11 @@ import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.QueryUnit; import com.gitee.dorive.query.entity.enums.ResultType; import com.gitee.dorive.query.impl.repository.AbstractQueryRepository; -import com.gitee.dorive.sql.api.SqlRunner; -import com.gitee.dorive.sql.entity.segment.ArgSegment; -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 com.gitee.dorive.mybatis.api.sql.SqlRunner; +import com.gitee.dorive.mybatis.entity.segment.ArgSegment; +import com.gitee.dorive.mybatis.entity.segment.SelectSegment; +import com.gitee.dorive.mybatis.entity.segment.TableSegment; +import com.gitee.dorive.mybatis.impl.segment.SelectSegmentBuilder; import lombok.Getter; import lombok.Setter; @@ -43,22 +44,24 @@ import java.util.Map; public class SqlExecuteQueryHandler extends SqlBuildQueryHandler { private final SqlRunner sqlRunner; + private final EntityMapper entityMapper; - public SqlExecuteQueryHandler(AbstractQueryRepository repository, SqlRunner sqlRunner) { + public SqlExecuteQueryHandler(AbstractQueryRepository repository, SqlRunner sqlRunner, EntityMapper entityMapper) { super(repository); this.sqlRunner = sqlRunner; + this.entityMapper = entityMapper; } @Override - protected void doHandle(QueryContext queryContext, Object query) { + public 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(); - boolean needCount = queryContext.isNeedCount(); + String primaryKeyAlias = entityMapper.toAlias(primaryKey); + OrderBy orderBy = example.getOrderBy(); Page page = example.getPage(); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/querier/SqlCountQuerier.java b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/impl/querier/SqlCountQuerier.java similarity index 73% rename from dorive-sql/src/main/java/com/gitee/dorive/sql/impl/querier/SqlCountQuerier.java rename to dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/impl/querier/SqlCountQuerier.java index 194011afe6372d6d5e2f14e1ac68a07821380e2e..47a8af43d1ca45e14850444d8bb65e21441eccc5 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/querier/SqlCountQuerier.java +++ b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/impl/querier/SqlCountQuerier.java @@ -15,23 +15,27 @@ * limitations under the License. */ -package com.gitee.dorive.sql.impl.querier; +package com.gitee.dorive.mybatis.impl.querier; import cn.hutool.core.collection.CollUtil; -import com.gitee.dorive.api.entity.core.EntityElement; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.mapper.EntityMapper; +import com.gitee.dorive.core.api.mapper.EntityMappers; +import com.gitee.dorive.mybatis.entity.enums.Mapper; +import com.gitee.dorive.core.impl.repository.DefaultRepository; +import com.gitee.dorive.mybatis.api.sql.CountQuerier; +import com.gitee.dorive.mybatis.api.sql.SqlRunner; +import com.gitee.dorive.mybatis.entity.sql.CountQuery; +import com.gitee.dorive.mybatis.entity.segment.SelectSegment; +import com.gitee.dorive.mybatis.entity.segment.TableSegment; +import com.gitee.dorive.mybatis.impl.repository.AbstractMybatisRepository; +import com.gitee.dorive.mybatis.impl.segment.SelectSegmentBuilder; 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.entity.enums.QueryMethod; +import com.gitee.dorive.query.entity.enums.QueryMode; import com.gitee.dorive.query.entity.enums.ResultType; -import com.gitee.dorive.query.impl.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.segment.SelectSegment; -import com.gitee.dorive.sql.entity.segment.TableSegment; -import com.gitee.dorive.sql.impl.segment.SelectSegmentBuilder; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; @@ -46,7 +50,7 @@ import java.util.Map; @AllArgsConstructor public class SqlCountQuerier implements CountQuerier { - private final AbstractQueryRepository repository; + private final AbstractMybatisRepository repository; private final QueryHandler queryHandler; private final SqlRunner sqlRunner; @@ -55,11 +59,10 @@ public class SqlCountQuerier implements CountQuerier { Object query = countQuery.getQuery(); QueryContext queryContext = new QueryContext(context, query.getClass(), ResultType.COUNT); - context.setOption(QueryMethod.class, QueryMethod.SQL_BUILD); + context.setOption(QueryMode.class, QueryMode.SQL_BUILD); queryHandler.handle(queryContext, query); QueryUnit queryUnit = queryContext.getQueryUnit(); - EntityElement entityElement = queryUnit.getEntityElement(); TableSegment tableSegment = (TableSegment) queryUnit.getAttachment(); String tableAlias = tableSegment.getTableAlias(); @@ -69,7 +72,7 @@ public class SqlCountQuerier implements CountQuerier { List args = selectSegment.getArgs(); // group by - List groupBy = entityElement.toAliases(countQuery.getGroupBy()); + List groupBy = toAliases(queryUnit, countQuery.getGroupBy()); String groupByColumns = CollUtil.join(groupBy, ",", tableAlias + ".", null); selectSegment.setGroupBy("GROUP BY " + groupByColumns); @@ -89,12 +92,19 @@ public class SqlCountQuerier implements CountQuerier { return countMap; } + private List toAliases(QueryUnit queryUnit, List properties) { + MergedRepository mergedRepository = queryUnit.getMergedRepository(); + DefaultRepository defaultRepository = mergedRepository.getDefaultRepository(); + EntityMappers entityMappers = defaultRepository.getEntityMappers(); + EntityMapper entityMapper = entityMappers.getEntityMapper(Mapper.ENTITY_DATABASE.name()); + return entityMapper.toAliases(properties); + } + 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()); + List countBy = toAliases(queryUnit, countQuery.getCountBy()); String countByStr = CollUtil.join(countBy, ",',',", tableAlias + ".", null); StringBuilder countByExp = new StringBuilder(); diff --git a/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/impl/repository/AbstractMybatisRepository.java b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/impl/repository/AbstractMybatisRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..8c6a13c9ec658c33b14a39beb9fc8b94373bafee --- /dev/null +++ b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/impl/repository/AbstractMybatisRepository.java @@ -0,0 +1,121 @@ +/* + * 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.impl.repository; + +import com.gitee.dorive.api.entity.core.EntityElement; +import com.gitee.dorive.api.entity.core.def.RepositoryDef; +import com.gitee.dorive.core.api.common.ExampleConverter; +import com.gitee.dorive.core.api.common.ImplFactory; +import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.executor.Executor; +import com.gitee.dorive.core.api.factory.EntityFactory; +import com.gitee.dorive.core.api.mapper.EntityMapper; +import com.gitee.dorive.core.api.mapper.EntityMappers; +import com.gitee.dorive.core.impl.executor.unit.ExampleExecutor; +import com.gitee.dorive.core.impl.executor.unit.FactoryExecutor; +import com.gitee.dorive.core.impl.factory.OperationFactory; +import com.gitee.dorive.core.impl.repository.DefaultRepository; +import com.gitee.dorive.core.impl.resolver.EntityFactoryResolver; +import com.gitee.dorive.core.impl.resolver.EntityMappersResolver; +import com.gitee.dorive.mybatis.api.sql.CountQuerier; +import com.gitee.dorive.mybatis.api.sql.SqlRunner; +import com.gitee.dorive.mybatis.entity.common.EntityStoreInfo; +import com.gitee.dorive.mybatis.entity.enums.Mapper; +import com.gitee.dorive.mybatis.entity.sql.CountQuery; +import com.gitee.dorive.mybatis.impl.executor.UnionExecutor; +import com.gitee.dorive.mybatis.impl.handler.SqlBuildQueryHandler; +import com.gitee.dorive.mybatis.impl.handler.SqlCustomQueryHandler; +import com.gitee.dorive.mybatis.impl.handler.SqlExecuteQueryHandler; +import com.gitee.dorive.mybatis.impl.querier.SqlCountQuerier; +import com.gitee.dorive.query.api.QueryHandler; +import com.gitee.dorive.query.entity.enums.QueryMode; +import com.gitee.dorive.ref.impl.repository.AbstractRefRepository; +import lombok.Getter; +import lombok.Setter; + +import java.util.Map; + +@Getter +@Setter +public abstract class AbstractMybatisRepository extends AbstractRefRepository implements CountQuerier { + + private SqlRunner sqlRunner; + private EntityStoreInfo entityStoreInfo; + private EntityMappers entityMappers; + private CountQuerier countQuerier; + + @Override + public void afterPropertiesSet() throws Exception { + ImplFactory implFactory = getApplicationContext().getBean(ImplFactory.class); + this.sqlRunner = implFactory.getInstance(SqlRunner.class); + super.afterPropertiesSet(); + this.countQuerier = new SqlCountQuerier(this, getQueryHandler(), sqlRunner); + } + + @Override + protected DefaultRepository doNewRepository(EntityElement entityElement) { + OperationFactory operationFactory = new OperationFactory(entityElement); + this.entityStoreInfo = resolveEntityStoreInfo(getRepositoryDef()); + + String reMapper = Mapper.ENTITY_DATABASE.name(); + String deMapper = Mapper.ENTITY_POJO.name(); + + EntityMappersResolver entityMappersResolver = new EntityMappersResolver(entityElement, entityStoreInfo.getAliasPropMapping(), reMapper, deMapper); + this.entityMappers = entityMappersResolver.newEntityMappers(); + + EntityMapper reEntityMapper = entityMappers.getEntityMapper(reMapper); + EntityMapper deEntityMapper = entityMappers.getEntityMapper(deMapper); + + EntityFactoryResolver entityFactoryResolver = new EntityFactoryResolver( + this, entityElement, entityElement.getGenericType(), entityStoreInfo.getPojoClass(), entityMappers, reEntityMapper, deEntityMapper); + EntityFactory entityFactory = entityFactoryResolver.newEntityFactory(); + + Executor executor = newExecutor(entityElement, entityStoreInfo); + executor = new UnionExecutor(executor, sqlRunner, entityStoreInfo); + executor = new FactoryExecutor(executor, entityElement, entityStoreInfo.getIdProperty(), entityFactory); + executor = new ExampleExecutor(executor, entityElement, reEntityMapper); + + DefaultStoreRepository repository = new DefaultStoreRepository(); + repository.setEntityElement(entityElement); + repository.setOperationFactory(operationFactory); + repository.setExecutor(executor); + repository.setEntityMappers(entityMappers); + repository.setExampleConverter((ExampleConverter) executor); + repository.setEntityStoreInfo(entityStoreInfo); + return repository; + } + + @Override + protected void registryQueryHandlers(Map queryHandlerMap) { + super.registryQueryHandlers(queryHandlerMap); + EntityMapper entityMapper = entityMappers.getEntityMapper(Mapper.ENTITY_DATABASE.name()); + queryHandlerMap.put(QueryMode.SQL_BUILD, new SqlBuildQueryHandler(this)); + queryHandlerMap.put(QueryMode.SQL_EXECUTE, new SqlExecuteQueryHandler(this, sqlRunner, entityMapper)); + queryHandlerMap.put(QueryMode.SQL_CUSTOM, new SqlCustomQueryHandler(this, entityStoreInfo)); + } + + @Override + public Map selectCountMap(Context context, CountQuery countQuery) { + return countQuerier.selectCountMap(context, countQuery); + } + + protected abstract EntityStoreInfo resolveEntityStoreInfo(RepositoryDef repositoryDef); + + protected abstract Executor newExecutor(EntityElement entityElement, EntityStoreInfo entityStoreInfo); + +} diff --git a/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/impl/repository/DefaultStoreRepository.java b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/impl/repository/DefaultStoreRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..0a569875d86d687e87f98df202ebda3d46ec4d2b --- /dev/null +++ b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/impl/repository/DefaultStoreRepository.java @@ -0,0 +1,31 @@ +/* + * 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.impl.repository; + +import com.gitee.dorive.mybatis.entity.common.EntityStoreInfo; +import com.gitee.dorive.core.impl.repository.DefaultRepository; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +public class DefaultStoreRepository extends DefaultRepository { + private EntityStoreInfo entityStoreInfo; +} diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentResolver.java b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/impl/segment/SegmentResolver.java similarity index 81% rename from dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentResolver.java rename to dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/impl/segment/SegmentResolver.java index aae9745e024f5971e2ec7762054e5940ad523d0b..d53586a453b1c200e33d79eb850d3f8388df8a3a 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentResolver.java +++ b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/impl/segment/SegmentResolver.java @@ -15,26 +15,31 @@ * limitations under the License. */ -package com.gitee.dorive.sql.impl.segment; +package com.gitee.dorive.mybatis.impl.segment; import com.gitee.dorive.api.constant.core.Operator; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.common.EntityStoreInfo; +import com.gitee.dorive.core.api.mapper.EntityMapper; +import com.gitee.dorive.core.api.mapper.EntityMappers; +import com.gitee.dorive.core.impl.repository.DefaultRepository; +import com.gitee.dorive.mybatis.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.impl.binder.StrongBinder; import com.gitee.dorive.core.impl.binder.ValueFilterBinder; import com.gitee.dorive.core.impl.binder.ValueRouteBinder; +import com.gitee.dorive.core.impl.repository.ProxyRepository; import com.gitee.dorive.core.impl.resolver.BinderResolver; -import com.gitee.dorive.core.impl.repository.CommonRepository; import com.gitee.dorive.core.impl.util.CriterionUtils; +import com.gitee.dorive.mybatis.api.sql.Segment; +import com.gitee.dorive.mybatis.entity.enums.Mapper; +import com.gitee.dorive.mybatis.entity.segment.*; +import com.gitee.dorive.mybatis.impl.repository.DefaultStoreRepository; 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.MergedRepositoryResolver; import com.gitee.dorive.query.impl.repository.AbstractQueryRepository; -import com.gitee.dorive.sql.api.Segment; -import com.gitee.dorive.sql.entity.segment.*; +import com.gitee.dorive.query.impl.resolver.MergedRepositoryResolver; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; @@ -56,8 +61,8 @@ public class SegmentResolver { public Segment resolve() { MergedRepository mergedRepository = queryUnit.getMergedRepository(); - Map attributes = mergedRepository.getAttributes(); - EntityStoreInfo entityStoreInfo = (EntityStoreInfo) attributes.get(EntityStoreInfo.class.getName()); + DefaultStoreRepository defaultStoreRepository = (DefaultStoreRepository) mergedRepository.getDefaultRepository(); + EntityStoreInfo entityStoreInfo = defaultStoreRepository.getEntityStoreInfo(); String tableName = entityStoreInfo.getTableName(); return newTableSegment(tableName); } @@ -85,9 +90,10 @@ public class SegmentResolver { Map mergedRepositoryMap = mergedRepositoryResolver.getMergedRepositoryMap(); - CommonRepository definedRepository = mergedRepository.getDefinedRepository(); + ProxyRepository definedRepository = mergedRepository.getDefinedRepository(); Map> mergedStrongBindersMap = mergedRepository.getMergedStrongBindersMap(); Map> mergedValueRouteBindersMap = mergedRepository.getMergedValueRouteBindersMap(); + EntityMapper entityMapper = getEntityMapper(mergedRepository); BinderResolver binderResolver = definedRepository.getBinderResolver(); List valueFilterBinders = binderResolver.getValueFilterBinders(); @@ -95,18 +101,20 @@ public class SegmentResolver { List onSegments = new ArrayList<>(mergedStrongBindersMap.size() + mergedValueRouteBindersMap.size() + valueFilterBinders.size()); mergedStrongBindersMap.forEach((absoluteAccessPath, strongBinders) -> { MergedRepository targetMergedRepository = mergedRepositoryMap.get(absoluteAccessPath); + EntityMapper targetEntityMapper = getEntityMapper(targetMergedRepository); for (StrongBinder strongBinder : strongBinders) { - String leftExpr = mergedRepository.getAlias() + "." + strongBinder.getFieldAlias(); + String leftExpr = mergedRepository.getAlias() + "." + entityMapper.toAlias(strongBinder.getFieldName()); String operator = "="; - String rightExpr = targetMergedRepository.getAlias() + "." + strongBinder.getBindFieldAlias(); + String rightExpr = targetMergedRepository.getAlias() + "." + targetEntityMapper.toAlias(strongBinder.getBindField()); OnSegment onSegment = new OnSegment(leftExpr, operator, rightExpr); onSegments.add(onSegment); } }); mergedValueRouteBindersMap.forEach((absoluteAccessPath, valueRouteBinders) -> { MergedRepository targetMergedRepository = mergedRepositoryMap.get(absoluteAccessPath); + EntityMapper targetEntityMapper = getEntityMapper(targetMergedRepository); for (ValueRouteBinder valueRouteBinder : valueRouteBinders) { - String leftExpr = targetMergedRepository.getAlias() + "." + valueRouteBinder.getBindFieldAlias(); + String leftExpr = targetMergedRepository.getAlias() + "." + targetEntityMapper.toAlias(valueRouteBinder.getBindField()); String operator = "="; String rightExpr = CriterionUtils.sqlParam(valueRouteBinder.getFieldValue(context, null)); OnValueSegment onValueSegment = new OnValueSegment(leftExpr, operator, rightExpr); @@ -114,7 +122,7 @@ public class SegmentResolver { } }); for (ValueFilterBinder valueFilterBinder : valueFilterBinders) { - String leftExpr = mergedRepository.getAlias() + "." + valueFilterBinder.getFieldAlias(); + String leftExpr = mergedRepository.getAlias() + "." + entityMapper.toAlias(valueFilterBinder.getFieldName()); String operator = "="; String rightExpr = CriterionUtils.sqlParam(valueFilterBinder.getBoundValue(context, null)); OnValueSegment onValueSegment = new OnValueSegment(leftExpr, operator, rightExpr); @@ -123,6 +131,12 @@ public class SegmentResolver { return onSegments; } + private EntityMapper getEntityMapper(MergedRepository mergedRepository) { + DefaultRepository defaultRepository = mergedRepository.getDefaultRepository(); + EntityMappers entityMappers = defaultRepository.getEntityMappers(); + return entityMappers.getEntityMapper(Mapper.ENTITY_DATABASE.name()); + } + private List newArgSegments() { List args = queryContext.getArgs(); MergedRepository mergedRepository = queryUnit.getMergedRepository(); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/impl/segment/SelectSegmentBuilder.java similarity index 86% rename from dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java rename to dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/impl/segment/SelectSegmentBuilder.java index 9c1dc55500b9d01b1fc54da8cfccbe75321d133f..cc7a415270551a64261aef8985a89b0939e26e23 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java +++ b/dorive-mybatis/src/main/java/com/gitee/dorive/mybatis/impl/segment/SelectSegmentBuilder.java @@ -15,17 +15,17 @@ * limitations under the License. */ -package com.gitee.dorive.sql.impl.segment; +package com.gitee.dorive.mybatis.impl.segment; import com.gitee.dorive.core.api.context.Selector; -import com.gitee.dorive.core.impl.repository.CommonRepository; +import com.gitee.dorive.core.impl.repository.ProxyRepository; 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.segment.ArgSegment; -import com.gitee.dorive.sql.entity.segment.SelectSegment; -import com.gitee.dorive.sql.entity.segment.TableJoinSegment; -import com.gitee.dorive.sql.entity.segment.TableSegment; +import com.gitee.dorive.mybatis.entity.segment.ArgSegment; +import com.gitee.dorive.mybatis.entity.segment.SelectSegment; +import com.gitee.dorive.mybatis.entity.segment.TableJoinSegment; +import com.gitee.dorive.mybatis.entity.segment.TableSegment; import lombok.Data; import java.util.ArrayList; @@ -46,7 +46,7 @@ public class SelectSegmentBuilder { Map queryUnitMap = queryContext.getQueryUnitMap(); for (QueryUnit queryUnit : queryUnitMap.values()) { MergedRepository mergedRepository = queryUnit.getMergedRepository(); - CommonRepository definedRepository = mergedRepository.getDefinedRepository(); + ProxyRepository definedRepository = mergedRepository.getDefinedRepository(); boolean isMatch = definedRepository.matches(selector); if (isMatch) { TableSegment tableSegment = (TableSegment) queryUnit.getAttachment(); diff --git a/dorive-query/pom.xml b/dorive-query/pom.xml index 994e3e4cb669b5bab954256ba097f8f6cd95fa30..f6798880b3746df9d90f1da8a3c81803733dba02 100644 --- a/dorive-query/pom.xml +++ b/dorive-query/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.2 + 3.5.3 dorive-query diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java index 68f6056e65e4de5bfc6ad57d7620fd7460c2d713..32e9a147bb0e146b660ad170708055b68f03e033 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java @@ -19,7 +19,7 @@ package com.gitee.dorive.query.entity; import com.gitee.dorive.core.impl.binder.StrongBinder; import com.gitee.dorive.core.impl.binder.ValueRouteBinder; -import com.gitee.dorive.core.impl.repository.CommonRepository; +import com.gitee.dorive.core.impl.repository.ProxyRepository; import com.gitee.dorive.core.impl.repository.DefaultRepository; import lombok.AllArgsConstructor; import lombok.Data; @@ -38,7 +38,7 @@ public class MergedRepository { // 绝对路径 private String absoluteAccessPath; // 定义仓储 - private CommonRepository definedRepository; + private ProxyRepository definedRepository; // absoluteAccessPath ==> StrongBinder private Map> mergedStrongBindersMap; // absoluteAccessPath ==> ValueRouteBinder @@ -46,7 +46,7 @@ public class MergedRepository { // 绑定路径 private Set boundAccessPaths; // 执行仓储 - private CommonRepository executedRepository; + private ProxyRepository executedRepository; // 真正执行仓储 private DefaultRepository defaultRepository; // 序列号 @@ -57,8 +57,4 @@ public class MergedRepository { public String getName() { return definedRepository.getEntityElement().getEntityDef().getName(); } - - public Map getAttributes() { - return defaultRepository.getAttributes(); - } } 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 4eb22cd1c18ec415dd70ddf49d6bbbefb3ebf3f1..e95e16a47b7f289a117e4b8f4435f9ef2af8cea7 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 @@ -39,11 +39,6 @@ public class QueryConfig { 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 a19b3c361b0f23c6d6974fdd1c048f8264e1284b..64f2f8642c34e4523b35ddd603390b7fff309ae1 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,7 +38,6 @@ public class QueryContext { 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 cf87a2af877e389b34d25bfc43788430b982a4fa..31fe5bd920ebb39f19ef5877e01ababaf134c14a 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 @@ -17,16 +17,14 @@ package com.gitee.dorive.query.entity; -import com.gitee.dorive.api.entity.core.EntityElement; +import com.gitee.dorive.core.api.common.ExampleConverter; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.core.impl.executor.ExampleExecutor; +import com.gitee.dorive.core.impl.repository.DefaultRepository; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import java.util.Map; - @Data @NoArgsConstructor @AllArgsConstructor @@ -40,14 +38,10 @@ public class QueryUnit { return "/".equals(mergedRepository.getAbsoluteAccessPath()); } - public EntityElement getEntityElement() { - return mergedRepository.getExecutedRepository().getEntityElement(); - } - public void convertExample(QueryContext queryContext) { Context context = queryContext.getContext(); - Map attributes = mergedRepository.getAttributes(); - ExampleExecutor exampleExecutor = (ExampleExecutor) attributes.get(ExampleExecutor.class.getName()); - exampleExecutor.convert(context, example); + DefaultRepository defaultRepository = mergedRepository.getDefaultRepository(); + ExampleConverter exampleConverter = defaultRepository.getExampleConverter(); + exampleConverter.convert(context, example); } } 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/QueryMode.java similarity index 97% rename from dorive-query/src/main/java/com/gitee/dorive/query/entity/enums/QueryMethod.java rename to dorive-query/src/main/java/com/gitee/dorive/query/entity/enums/QueryMode.java index 6102bf110c7a7b033915cd2f55276278572f85ab..a9492cd790da4c0f646e95448557c3a2a7810bc7 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/QueryMode.java @@ -17,7 +17,7 @@ package com.gitee.dorive.query.entity.enums; -public enum QueryMethod { +public enum QueryMode { STEPWISE, SQL_BUILD, SQL_EXECUTE, 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 dcb4eec182000aa077296bb0981c06dd310e1502..e4927dc08f48e73079761eb1fe9e91d6dd34c773 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 @@ -20,33 +20,33 @@ 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 com.gitee.dorive.query.entity.enums.QueryMode; import org.apache.commons.lang3.StringUtils; import java.util.Map; public class AdaptiveQueryHandler implements QueryHandler { - private final Map queryHandlerMap; + private final Map queryHandlerMap; - public AdaptiveQueryHandler(Map queryHandlerMap) { + public AdaptiveQueryHandler(Map queryHandlerMap) { this.queryHandlerMap = queryHandlerMap; } @Override public void handle(QueryContext queryContext, Object query) { Context context = queryContext.getContext(); - QueryMethod queryMethod = context.getOption(QueryMethod.class); + QueryMode queryMode = context.getOption(QueryMode.class); // 如果开发者没有指定 - if (queryMethod == null) { + if (queryMode == null) { String method = queryContext.getMethod(); if (StringUtils.isNotBlank(method)) { - queryMethod = QueryMethod.SQL_CUSTOM; + queryMode = QueryMode.SQL_CUSTOM; } else { - queryMethod = QueryMethod.SQL_EXECUTE; + queryMode = QueryMode.SQL_EXECUTE; } } - QueryHandler queryHandler = queryHandlerMap.get(queryMethod); + QueryHandler queryHandler = queryHandlerMap.get(queryMode); if (queryHandler != null) { queryHandler.handle(queryContext, 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 index b30154b1150477284936fe351bf49db74962792a..afad8bd5bf2aae0820a0cd08da2970d5d35ea709 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 @@ -44,7 +44,6 @@ public class ConfigQueryHandler implements QueryHandler { 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/handler/AbstractQueryUnitQueryHandler.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/executor/AbstractQueryUnitQueryHandler.java similarity index 91% rename from dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/AbstractQueryUnitQueryHandler.java rename to dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/executor/AbstractQueryUnitQueryHandler.java index 11cce331f880e265f19d7a0db532b14289180e1c..887660f2f1674bd1344e0db23082e4d0f0800965 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/AbstractQueryUnitQueryHandler.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/executor/AbstractQueryUnitQueryHandler.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.query.impl.handler; +package com.gitee.dorive.query.impl.handler.executor; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; @@ -23,13 +23,11 @@ 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 lombok.AllArgsConstructor; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -@AllArgsConstructor public abstract class AbstractQueryUnitQueryHandler implements QueryHandler { @Override @@ -40,7 +38,7 @@ public abstract class AbstractQueryUnitQueryHandler implements QueryHandler { doHandle(queryContext, query); } - private Map newQueryUnitMap(QueryContext queryContext) { + protected Map newQueryUnitMap(QueryContext queryContext) { Map exampleMap = queryContext.getExampleMap(); List mergedRepositories = getMergedRepositories(queryContext); Map queryUnitMap = new LinkedHashMap<>(mergedRepositories.size() * 4 / 3 + 1); @@ -62,5 +60,6 @@ public abstract class AbstractQueryUnitQueryHandler implements QueryHandler { return queryUnit; } - protected abstract void doHandle(QueryContext queryContext, Object query); + public 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/executor/StepwiseQueryHandler.java similarity index 92% rename from dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/StepwiseQueryHandler.java rename to dorive-query/src/main/java/com/gitee/dorive/query/impl/handler/executor/StepwiseQueryHandler.java index 0eb49465590e8a3203a7ebb7f3f4235dd7ade058..5b0537f2da08ec907f43f09618e23d66f0815ca3 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/executor/StepwiseQueryHandler.java @@ -15,15 +15,15 @@ * limitations under the License. */ -package com.gitee.dorive.query.impl.handler; +package com.gitee.dorive.query.impl.handler.executor; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.impl.binder.AbstractBinder; import com.gitee.dorive.core.impl.binder.StrongBinder; import com.gitee.dorive.core.impl.binder.ValueRouteBinder; +import com.gitee.dorive.core.impl.repository.ProxyRepository; import com.gitee.dorive.core.impl.resolver.BinderResolver; -import com.gitee.dorive.core.impl.repository.CommonRepository; import com.gitee.dorive.core.impl.util.MultiInBuilder; import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.entity.QueryContext; @@ -35,12 +35,12 @@ import java.util.stream.Collectors; public class StepwiseQueryHandler extends AbstractQueryUnitQueryHandler { @Override - protected List getMergedRepositories(QueryContext queryContext) { + public List getMergedRepositories(QueryContext queryContext) { return queryContext.getQueryConfig().getReversedMergedRepositories(); } @Override - protected void doHandle(QueryContext queryContext, Object query) { + public void doHandle(QueryContext queryContext, Object query) { Context context = queryContext.getContext(); Map queryUnitMap = queryContext.getQueryUnitMap(); queryUnitMap.forEach((accessPath, queryUnit) -> { @@ -50,10 +50,10 @@ public class StepwiseQueryHandler extends AbstractQueryUnitQueryHandler { Example example = queryUnit.getExample(); boolean abandoned = queryUnit.isAbandoned(); - CommonRepository definedRepository = mergedRepository.getDefinedRepository(); + ProxyRepository definedRepository = mergedRepository.getDefinedRepository(); Map> mergedStrongBindersMap = mergedRepository.getMergedStrongBindersMap(); Map> mergedValueRouteBindersMap = mergedRepository.getMergedValueRouteBindersMap(); - CommonRepository executedRepository = mergedRepository.getExecutedRepository(); + ProxyRepository executedRepository = mergedRepository.getExecutedRepository(); BinderResolver binderResolver = definedRepository.getBinderResolver(); @@ -114,8 +114,8 @@ public class StepwiseQueryHandler extends AbstractQueryUnitQueryHandler { } } else { - List aliases = strongBinders.stream().map(AbstractBinder::getBindFieldAlias).collect(Collectors.toList()); - MultiInBuilder builder = new MultiInBuilder(aliases, entities.size()); + List properties = strongBinders.stream().map(AbstractBinder::getBindField).collect(Collectors.toList()); + MultiInBuilder builder = new MultiInBuilder(properties, entities.size()); collectFieldValues(context, entities, strongBinders, builder); if (!builder.isEmpty()) { targetExample.getCriteria().add(builder.toCriterion()); diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/repository/AbstractQueryRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/repository/AbstractQueryRepository.java index 86aa8a7484bb4e57162500b61cbac5757a42ce4d..9816f6777501e2881538ae2ce4e4e76145f175b4 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/repository/AbstractQueryRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/repository/AbstractQueryRepository.java @@ -27,9 +27,10 @@ import com.gitee.dorive.event.impl.repository.AbstractEventRepository; import com.gitee.dorive.query.api.QueryHandler; import com.gitee.dorive.query.api.QueryRepository; import com.gitee.dorive.query.entity.QueryContext; -import com.gitee.dorive.query.entity.enums.QueryMethod; +import com.gitee.dorive.query.entity.enums.QueryMode; import com.gitee.dorive.query.entity.enums.ResultType; import com.gitee.dorive.query.impl.handler.*; +import com.gitee.dorive.query.impl.handler.executor.StepwiseQueryHandler; import com.gitee.dorive.query.impl.resolver.MergedRepositoryResolver; import com.gitee.dorive.query.impl.resolver.QueryTypeResolver; import lombok.Getter; @@ -62,7 +63,7 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi this.queryTypeResolver.resolve(); } - Map queryHandlerMap = new LinkedHashMap<>(4 * 4 / 3 + 1); + Map queryHandlerMap = new LinkedHashMap<>(4 * 4 / 3 + 1); registryQueryHandlers(queryHandlerMap); QueryHandler queryHandler = new AdaptiveQueryHandler(queryHandlerMap); queryHandler = new SimpleQueryHandler(queryHandler); @@ -72,8 +73,8 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi this.queryHandler = queryHandler; } - protected void registryQueryHandlers(Map queryHandlerMap) { - queryHandlerMap.put(QueryMethod.STEPWISE, new StepwiseQueryHandler()); + protected void registryQueryHandlers(Map queryHandlerMap) { + queryHandlerMap.put(QueryMode.STEPWISE, new StepwiseQueryHandler()); } @Override diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java index 33ded1f87e217351d25f87d4c9ccbf15ebd09552..7c7c055e0990dd8622da0f6a4b7dd8fecd22f9ea 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java @@ -22,7 +22,7 @@ import com.gitee.dorive.core.impl.binder.ValueRouteBinder; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.impl.repository.AbstractContextRepository; import com.gitee.dorive.core.impl.repository.AbstractRepository; -import com.gitee.dorive.core.impl.repository.CommonRepository; +import com.gitee.dorive.core.impl.repository.ProxyRepository; import com.gitee.dorive.core.impl.repository.DefaultRepository; import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.impl.repository.AbstractQueryRepository; @@ -45,11 +45,11 @@ public class MergedRepositoryResolver { } public void resolve() { - for (CommonRepository repository : repository.getRepositoryMap().values()) { + for (ProxyRepository repository : repository.getRepositoryMap().values()) { String accessPath = repository.getAccessPath(); BinderResolver binderResolver = repository.getBinderResolver(); - CommonRepository executedRepository = repository; + ProxyRepository executedRepository = repository; AbstractRepository abstractRepository = repository.getProxyRepository(); AbstractQueryRepository abstractQueryRepository = null; if (abstractRepository instanceof AbstractQueryRepository) { @@ -80,7 +80,7 @@ public class MergedRepositoryResolver { } private void addMergedRepository(MergedRepository mergedRepository) { - CommonRepository executedRepository = mergedRepository.getExecutedRepository(); + ProxyRepository executedRepository = mergedRepository.getExecutedRepository(); mergedRepository.setDefaultRepository((DefaultRepository) executedRepository.getProxyRepository()); mergedRepository.setSequence(mergedRepositoryMap.size() + 1); mergedRepository.setAlias("t" + mergedRepository.getSequence()); 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 1b60634c36c2901473b265dd0aa6204673f893bc..1a54f7938c2556d0a830057a4254be86653ded2c 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 @@ -23,7 +23,7 @@ import com.gitee.dorive.api.entity.query.QueryDefinition; import com.gitee.dorive.api.entity.query.QueryFieldDefinition; import com.gitee.dorive.api.entity.query.def.QueryFieldDef; import com.gitee.dorive.api.impl.query.QueryDefinitionResolver; -import com.gitee.dorive.core.impl.repository.CommonRepository; +import com.gitee.dorive.core.impl.repository.ProxyRepository; import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.entity.QueryConfig; import com.gitee.dorive.query.impl.repository.AbstractQueryRepository; @@ -68,7 +68,7 @@ public class QueryTypeResolver { MergedRepositoryResolver mergedRepositoryResolver = repository.getMergedRepositoryResolver(); Map mergedRepositoryMap = mergedRepositoryResolver.getMergedRepositoryMap(); for (MergedRepository mergedRepository : mergedRepositoryMap.values()) { - CommonRepository repository = mergedRepository.getExecutedRepository(); + ProxyRepository repository = mergedRepository.getExecutedRepository(); if (repository.isBound() && accessPaths.add(mergedRepository.getAbsoluteAccessPath())) { mergedRepositories.add(mergedRepository); } @@ -106,7 +106,7 @@ public class QueryTypeResolver { MergedRepository mergedRepository = mergedRepositoryMap.get(belongTo); Assert.notNull(mergedRepository, "No merged repository found! belongTo: {}", belongTo); - CommonRepository repository = mergedRepository.getExecutedRepository(); + ProxyRepository repository = mergedRepository.getExecutedRepository(); Assert.isTrue(repository.hasField(field), "The field of @Criterion does not exist in the entity! query field: {}, entity: {}, field: {}", queryFieldDefinition.getField(), repository.getEntityClass(), field); diff --git a/dorive-ref/pom.xml b/dorive-ref/pom.xml index c7f6b7c9ceb4b100a4cb6e5fc44e1b8ca3a5dad2..1c82a8d0a37371ee79fa5d9b5bb77a057dd782fb 100644 --- a/dorive-ref/pom.xml +++ b/dorive-ref/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.2 + 3.5.3 dorive-ref diff --git a/dorive-spring-boot-starter/pom.xml b/dorive-spring-boot-starter/pom.xml index dcbd2f53280f13610ad33551023e509c050329b9..50279f6f9c91d302450d40228789f05c9fc1a950 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.2 + 3.5.3 dorive-spring-boot-starter diff --git a/dorive-test/pom.xml b/dorive-test/pom.xml index 0d0e18fe1740ec72c04215352176dbfc4313e808..898ffb59f467552fa97ac9386c1b75a9be5bc6d9 100644 --- a/dorive-test/pom.xml +++ b/dorive-test/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.2 + 3.5.3 dorive-test diff --git a/dorive-web/pom.xml b/dorive-web/pom.xml index fd377bf7d270d576e9148d0b08117eda95ce14d2..e312fd8c91c5d5e1078067a99b01de441e5038fb 100644 --- a/dorive-web/pom.xml +++ b/dorive-web/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.2 + 3.5.3 dorive-web diff --git a/pom.xml b/pom.xml index 2bf7caecd213fd9688d761f8b0df1c134d157422..cd2cd5cd1621d88243fe89164c3b6c2d25c50bc7 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.gitee.digital-engine dorive - 3.5.2 + 3.5.3 pom @@ -36,7 +36,7 @@ dorive-event dorive-query dorive-ref - dorive-sql + dorive-mybatis dorive-mybatis-plus dorive-web dorive-autoconfigure