diff --git a/README.md b/README.md
index 20b78b724acd2d6905c661f73d23e47f2746b0e0..95e1c07172f6a5386352ab7f462d541ab15781d9 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,7 @@
-🔥🔥🔥轻量的级领域驱动式ORM框架,帮助开发者通过建模,快速构建具有可维护性、可拓展性的应用程序。
+🔥🔥🔥轻量的领域驱动的ORM框架,帮助开发者通过建模,快速构建具有可维护性、可拓展性的应用程序。
### 👍推荐理由
diff --git a/dorive-api/pom.xml b/dorive-api/pom.xml
index 9e38d8c6a04627fd4266714f7289af7bf34b75c9..dbc29289910e5e802e58acdb8ea89b676a94689f 100644
--- a/dorive-api/pom.xml
+++ b/dorive-api/pom.xml
@@ -6,7 +6,7 @@
com.gitee.digital-engine
dorive
- 3.4.2
+ 3.4.3.1
dorive-api
diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Alias.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Alias.java
index 88254fa04bcb1e89673342b61a5dd85c6980787b..4a482035af22016fcff5f00275af953284943975 100644
--- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Alias.java
+++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Alias.java
@@ -17,14 +17,23 @@
package com.gitee.dorive.api.annotation;
-import java.lang.annotation.*;
+import org.springframework.core.annotation.AliasFor;
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Field
@Inherited
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Alias {
+ @AliasFor(annotation = Field.class)
String value() default "";
}
diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Field.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Field.java
new file mode 100644
index 0000000000000000000000000000000000000000..ff42c494c8ab2504f78497388a1efa33f899e9af
--- /dev/null
+++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Field.java
@@ -0,0 +1,40 @@
+/*
+ * 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.annotation;
+
+import org.springframework.core.annotation.AliasFor;
+
+import java.lang.annotation.*;
+
+@Inherited
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD})
+public @interface Field {
+
+ @AliasFor("alias")
+ String value() default "";
+
+ @AliasFor("value")
+ String alias() default "";
+
+ Class> converter() default Object.class;
+
+ String mapExp() default "";
+
+}
diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/api/Keys.java b/dorive-api/src/main/java/com/gitee/dorive/api/constant/Keys.java
similarity index 90%
rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/api/Keys.java
rename to dorive-api/src/main/java/com/gitee/dorive/api/constant/Keys.java
index c7b892f29edc8d2d52af698149e8ce66546195c0..75e0b5a498039c6719f78ad1b25624184884ea80 100644
--- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/api/Keys.java
+++ b/dorive-api/src/main/java/com/gitee/dorive/api/constant/Keys.java
@@ -15,10 +15,10 @@
* limitations under the License.
*/
-package com.gitee.dorive.spring.boot.starter.api;
+package com.gitee.dorive.api.constant;
public interface Keys {
+ String FIELD_EXECUTOR = "FIELD_EXECUTOR";
String QUERIER = "QUERIER";
String TABLE_INFO = "TABLE_INFO";
- String ALIAS_EXECUTOR = "ALIAS_EXECUTOR";
}
diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/constant/OperationType.java b/dorive-api/src/main/java/com/gitee/dorive/api/constant/OperationType.java
index c240e48dc059add004286650088fce04b0b72a0b..a0a03fbb5729eea215d0a8b64906c44de488149a 100644
--- a/dorive-api/src/main/java/com/gitee/dorive/api/constant/OperationType.java
+++ b/dorive-api/src/main/java/com/gitee/dorive/api/constant/OperationType.java
@@ -26,8 +26,5 @@ public interface OperationType {
int DELETE = 0x00000008;
int UPDATE_OR_DELETE = UPDATE | DELETE;
int INSERT_OR_UPDATE_OR_DELETE = INSERT | UPDATE | DELETE;
- int FORCE_IGNORE = 0x00000010;
int FORCE_INSERT = 0x00000010 | INSERT;
- int IGNORE_ROOT = 0x00000020;
- int INCLUDE_ROOT = 0x00000040;
}
diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/EntityDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/EntityDef.java
index 9ff30c646e548f5726d5d1307d6fd331255c88c0..d2dac55d01287d15ccc11505d505d06182f5eaae 100644
--- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/EntityDef.java
+++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/EntityDef.java
@@ -58,7 +58,7 @@ public class EntityDef {
}
}
- public boolean isAggregated() {
+ public boolean isRepositoryDef() {
return repository != Object.class;
}
diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/AliasDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/FieldDef.java
similarity index 72%
rename from dorive-api/src/main/java/com/gitee/dorive/api/entity/def/AliasDef.java
rename to dorive-api/src/main/java/com/gitee/dorive/api/entity/def/FieldDef.java
index 10605c486f5e61a8a555598c922b7ccac93d0b6a..0bcde9f33652aabbc0580379641fa7e32286c830 100644
--- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/AliasDef.java
+++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/FieldDef.java
@@ -18,7 +18,7 @@
package com.gitee.dorive.api.entity.def;
import cn.hutool.core.bean.BeanUtil;
-import com.gitee.dorive.api.annotation.Alias;
+import com.gitee.dorive.api.annotation.Field;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@@ -30,16 +30,15 @@ import java.util.Map;
@Data
@NoArgsConstructor
@AllArgsConstructor
-public class AliasDef {
+public class FieldDef {
- private String value;
+ private String alias;
+ private Class> converter;
+ private String mapExp;
- public static AliasDef fromElement(AnnotatedElement element) {
- if (element.isAnnotationPresent(Alias.class)) {
- Map attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(element, Alias.class);
- return BeanUtil.copyProperties(attributes, AliasDef.class);
- }
- return null;
+ public static FieldDef fromElement(AnnotatedElement element) {
+ Map attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(element, Field.class);
+ return attributes != null ? BeanUtil.copyProperties(attributes, FieldDef.class) : null;
}
}
diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityEle.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityEle.java
index 09d257f861f65a1b57b68a6ba9983160c214eb24..3a89c4287ce271908f1d63d08488fe837cb48b47 100644
--- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityEle.java
+++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityEle.java
@@ -38,21 +38,21 @@ public abstract class EntityEle {
private boolean aggregated;
private List bindingDefs;
private PropProxy pkProxy;
- private Map propAliasMap;
+ private Map fieldAliasMap;
public EntityEle(AnnotatedElement element) {
this.element = element;
this.entityDef = EntityDef.fromElement(element);
- this.aggregated = (entityDef != null && entityDef.isAggregated()) || element.isAnnotationPresent(Aggregate.class);
+ this.aggregated = (entityDef != null && entityDef.isRepositoryDef()) || isAggregateDef();
this.bindingDefs = BindingDef.fromElement(element);
}
- public boolean isAnnotatedEntity() {
+ public boolean isEntityDef() {
return entityDef != null;
}
- public boolean isAggregated() {
- return aggregated;
+ public boolean isAggregateDef() {
+ return element.isAnnotationPresent(Aggregate.class);
}
public void initialize() {
@@ -61,20 +61,24 @@ public abstract class EntityEle {
}
}
- public String toAlias(String property) {
- return propAliasMap.getOrDefault(property, property);
+ public boolean hasField(String field) {
+ return fieldAliasMap.containsKey(field);
}
- public List toAliases(List properties) {
- if (properties != null && !properties.isEmpty()) {
- List aliases = new ArrayList<>(properties.size());
- for (String property : properties) {
- String alias = toAlias(property);
+ public String toAlias(String field) {
+ return fieldAliasMap.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 properties;
+ return fields;
}
protected abstract void doInitialize();
@@ -85,4 +89,6 @@ public abstract class EntityEle {
public abstract EntityType getEntityType();
+ public abstract Map getEntityFieldMap();
+
}
diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityField.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityField.java
index 5ee1fee02e5fcc92a690b8ff4ef2301962709efb..03eca7dc683140ec56359a2541762209f4c9d9f8 100644
--- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityField.java
+++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityField.java
@@ -18,7 +18,7 @@
package com.gitee.dorive.api.entity.element;
import cn.hutool.core.util.ReflectUtil;
-import com.gitee.dorive.api.entity.def.AliasDef;
+import com.gitee.dorive.api.entity.def.FieldDef;
import com.gitee.dorive.api.entity.def.EntityDef;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -27,6 +27,7 @@ import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Collection;
+import java.util.Map;
@Data
@EqualsAndHashCode(callSuper = false)
@@ -37,7 +38,7 @@ public class EntityField extends EntityEle {
private boolean collection;
private Class> genericType;
private String name;
- private AliasDef aliasDef;
+ private FieldDef fieldDef;
private EntityType entityType;
public static boolean isComplexType(Class> type) {
@@ -58,11 +59,12 @@ public class EntityField extends EntityEle {
Type actualTypeArgument = parameterizedType.getActualTypeArguments()[0];
this.genericType = (Class>) actualTypeArgument;
}
- resolve(field);
+ this.fieldDef = FieldDef.fromElement(field);
+ resolveGenericType(this.genericType);
initialize();
}
- private void resolve(Field field) {
+ private void resolveGenericType(Class> genericType) {
EntityDef entityDef = getEntityDef();
if (entityDef != null) {
EntityDef genericEntityDef = EntityDef.fromElement(genericType);
@@ -70,7 +72,6 @@ public class EntityField extends EntityEle {
entityDef.merge(genericEntityDef);
}
}
- aliasDef = AliasDef.fromElement(field);
if (isComplexType(genericType)) {
entityType = EntityType.getInstance(genericType);
}
@@ -81,10 +82,15 @@ public class EntityField extends EntityEle {
if (entityType != null) {
entityType.initialize();
setPkProxy(entityType.getPkProxy());
- setPropAliasMap(entityType.getPropAliasMap());
+ setFieldAliasMap(entityType.getFieldAliasMap());
}
}
+ @Override
+ public Map getEntityFieldMap() {
+ return entityType != null ? entityType.getEntityFieldMap() : null;
+ }
+
public boolean isSameType(EntityField entityField) {
return type == entityField.getType() && genericType == entityField.getGenericType();
}
diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityType.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityType.java
index 7aacd48491cd0ac3c4b68c4cce02dbdab16ff72b..e1bdeebe473562cba2609c6af4a150c9ce84d316 100644
--- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityType.java
+++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityType.java
@@ -19,10 +19,9 @@ package com.gitee.dorive.api.entity.element;
import cn.hutool.core.collection.ConcurrentHashSet;
import cn.hutool.core.lang.Assert;
-import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import com.gitee.dorive.api.api.PropProxy;
-import com.gitee.dorive.api.entity.def.AliasDef;
+import com.gitee.dorive.api.entity.def.FieldDef;
import com.gitee.dorive.api.exception.CircularDependencyException;
import com.gitee.dorive.api.impl.factory.PropProxyFactory;
import com.gitee.dorive.api.util.ReflectUtils;
@@ -48,15 +47,15 @@ public class EntityType extends EntityEle {
private Class> type;
private String name;
- private Map entityFields;
+ private Map entityFieldMap;
public static synchronized EntityType getInstance(Class> type) {
EntityType entityType = CACHE.get(type);
if (entityType == null) {
if (LOCK.add(type)) {
entityType = new EntityType(type);
- LOCK.remove(type);
CACHE.put(type, entityType);
+ LOCK.remove(type);
} else {
throw new CircularDependencyException("Circular Dependency! type: " + type.getName());
}
@@ -70,38 +69,43 @@ public class EntityType extends EntityEle {
this.name = type.getName();
List fields = ReflectUtils.getAllFields(type);
- this.entityFields = new LinkedHashMap<>(fields.size() * 4 / 3 + 1);
+ this.entityFieldMap = new LinkedHashMap<>(fields.size() * 4 / 3 + 1);
for (Field field : fields) {
if (!Modifier.isStatic(field.getModifiers())) {
try {
EntityField entityField = new EntityField(field);
- entityFields.put(entityField.getName(), entityField);
+ entityFieldMap.put(entityField.getName(), entityField);
} catch (CircularDependencyException e) {
log.warn(e.getMessage());
}
}
}
+
initialize();
}
@Override
protected void doInitialize() {
Class> genericType = getGenericType();
- boolean hasField = ReflectUtil.hasField(genericType, "id");
- Assert.isTrue(hasField, "The primary key not found! type: {}", genericType.getName());
- PropProxy pkProxy = PropProxyFactory.newPropProxy(genericType, "id");
- setPkProxy(pkProxy);
+ int initialCapacity = entityFieldMap.size() * 4 / 3 + 1;
+ PropProxy pkProxy = null;
+ Map propAliasMap = new LinkedHashMap<>(initialCapacity);
- Map propAliasMap = new LinkedHashMap<>(entityFields.size() * 4 / 3 + 1);
- for (EntityField entityField : entityFields.values()) {
+ for (EntityField entityField : entityFieldMap.values()) {
String name = entityField.getName();
- AliasDef aliasDef = entityField.getAliasDef();
- String alias = aliasDef != null ? aliasDef.getValue() : StrUtil.toUnderlineCase(name);
+ FieldDef fieldDef = entityField.getFieldDef();
+ if ("id".equals(name)) {
+ pkProxy = PropProxyFactory.newPropProxy(genericType, "id");
+ }
+ String alias = fieldDef != null ? fieldDef.getAlias() : StrUtil.toUnderlineCase(name);
propAliasMap.put(name, alias);
}
- setPropAliasMap(propAliasMap);
+
+ Assert.notNull(pkProxy, "The primary key not found! type: {}", genericType.getName());
+ setPkProxy(pkProxy);
+ setFieldAliasMap(propAliasMap);
}
@Override
@@ -119,4 +123,9 @@ public class EntityType extends EntityEle {
return this;
}
+ @Override
+ public Map getEntityFieldMap() {
+ return entityFieldMap;
+ }
+
}
diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/PropChain.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/PropChain.java
index f3dbf6bbc1a496985037cbe700a6a1b2660be930..4f8efb07fcac51d082e53e3838e393003d9cfda5 100644
--- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/PropChain.java
+++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/PropChain.java
@@ -39,7 +39,7 @@ public class PropChain implements PropProxy {
this.entityType = entityType;
this.accessPath = accessPath;
this.entityField = entityField;
- if (entityField.isAnnotatedEntity()) {
+ if (entityField.isEntityDef()) {
newPropProxy();
}
}
@@ -53,8 +53,8 @@ public class PropChain implements PropProxy {
}
}
- public boolean isAnnotatedEntity() {
- return entityField.isAnnotatedEntity();
+ public boolean isEntityDef() {
+ return entityField.isEntityDef();
}
public boolean isSameType(PropChain propChain) {
diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/resolver/EntityResolver.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/resolver/ElementResolver.java
similarity index 94%
rename from dorive-api/src/main/java/com/gitee/dorive/api/impl/resolver/EntityResolver.java
rename to dorive-api/src/main/java/com/gitee/dorive/api/impl/resolver/ElementResolver.java
index 84f9b08d906ef337952c27163adfa6f69dcf5436..c29aa546a3461b93fc3e3f0882ee22998d1ba2c0 100644
--- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/resolver/EntityResolver.java
+++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/resolver/ElementResolver.java
@@ -26,17 +26,17 @@ import java.util.LinkedHashMap;
import java.util.Map;
@Data
-public class EntityResolver {
+public class ElementResolver {
private Map entityEleMap = new LinkedHashMap<>();
- public EntityResolver(EntityType entityType) {
+ public ElementResolver(EntityType entityType) {
this.entityEleMap.put("/", entityType);
resolve("", entityType);
}
private void resolve(String lastAccessPath, EntityType entityType) {
- for (EntityField entityField : entityType.getEntityFields().values()) {
+ for (EntityField entityField : entityType.getEntityFieldMap().values()) {
String accessPath = lastAccessPath + "/" + entityField.getName();
entityEleMap.put(accessPath, entityField);
EntityType fieldEntityType = entityField.getEntityType();
diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/resolver/PropChainResolver.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/resolver/PropChainResolver.java
index 426bcc509c6bcaae2a6c2fe46190a923547bfbbb..d891667baabffa95a06ccfb63924f58dbee36732 100644
--- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/resolver/PropChainResolver.java
+++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/resolver/PropChainResolver.java
@@ -36,11 +36,11 @@ public class PropChainResolver {
private void resolve(String lastAccessPath, EntityType entityType) {
PropChain lastPropChain = propChainMap.get(lastAccessPath);
- for (EntityField entityField : entityType.getEntityFields().values()) {
+ for (EntityField entityField : entityType.getEntityFieldMap().values()) {
String accessPath = lastAccessPath + "/" + entityField.getName();
PropChain propChain = new PropChain(lastPropChain, entityType, accessPath, entityField);
propChainMap.put(accessPath, propChain);
- if (EntityField.isComplexType(entityField.getType()) && !entityField.isAnnotatedEntity()) {
+ if (EntityField.isComplexType(entityField.getType()) && !entityField.isEntityDef()) {
resolve(accessPath, entityField.getEntityType());
}
}
diff --git a/dorive-coating/pom.xml b/dorive-coating/pom.xml
index e5f54ec32f58391898d4cf8c36c4f093336a9ae6..cd0dd2e769284e0f5f64d41cfb825fcd1277adf1 100644
--- a/dorive-coating/pom.xml
+++ b/dorive-coating/pom.xml
@@ -6,7 +6,7 @@
com.gitee.digital-engine
dorive
- 3.4.2
+ 3.4.3.1
dorive-coating
diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/CoatingScan.java b/dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/CoatingScan.java
index 3cd2fa7cbd2f06d1703cc3106f3b535f5962cf41..8c1c8c5a7d43e243ac8b2797f3feb4383501d3e9 100644
--- a/dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/CoatingScan.java
+++ b/dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/CoatingScan.java
@@ -34,4 +34,6 @@ public @interface CoatingScan {
String regex() default "";
+ Class>[] queries() default {};
+
}
diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/api/ExampleBuilder.java b/dorive-coating/src/main/java/com/gitee/dorive/coating/api/ExampleBuilder.java
index f5d11ba773c58bc02c040cd36776ad2558198592..350ebf7233f45dbd08fbfe1b8e66f47075a02065 100644
--- a/dorive-coating/src/main/java/com/gitee/dorive/coating/api/ExampleBuilder.java
+++ b/dorive-coating/src/main/java/com/gitee/dorive/coating/api/ExampleBuilder.java
@@ -17,11 +17,11 @@
package com.gitee.dorive.coating.api;
+import com.gitee.dorive.coating.entity.BuildExample;
import com.gitee.dorive.core.api.context.Context;
-import com.gitee.dorive.core.entity.executor.Example;
public interface ExampleBuilder {
- Example buildExample(Context context, Object coating);
+ BuildExample buildExample(Context context, Object coating);
}
diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/BuildExample.java b/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/BuildExample.java
new file mode 100644
index 0000000000000000000000000000000000000000..1f96fbc1d8a5b189c2faec3d9e1bf0b7d648b4d2
--- /dev/null
+++ b/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/BuildExample.java
@@ -0,0 +1,44 @@
+/*
+ * 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.coating.entity;
+
+import com.gitee.dorive.core.entity.executor.Criterion;
+import com.gitee.dorive.core.entity.executor.InnerExample;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class BuildExample extends InnerExample {
+
+ private boolean abandoned = false;
+ private boolean countQueried = false;
+
+ public BuildExample(List criteria) {
+ super(criteria);
+ }
+
+ public boolean isQueryAll() {
+ return !abandoned && isEmpty();
+ }
+
+}
diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/MergedRepository.java b/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/MergedRepository.java
index 3a15ca0da87925f9339748466e14fd9649a9c26a..05ce86d9503b34ad8482b004d905f774c346a72b 100644
--- a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/MergedRepository.java
+++ b/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/MergedRepository.java
@@ -31,10 +31,10 @@ public class MergedRepository {
private String lastAccessPath;
private String absoluteAccessPath;
- private boolean merged;
- private String relativeAccessPath;
private CommonRepository definedRepository;
private Map> mergedBindersMap;
+ private boolean merged;
+ private String relativeAccessPath;
private CommonRepository executedRepository;
private Integer order;
diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/SpecificFields.java b/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/SpecificFields.java
index 56b581a8e0f4ab181e52e88b73aced9dc8f628eb..2e393137416836376866ccb5665548b1005908a1 100644
--- a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/SpecificFields.java
+++ b/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/SpecificFields.java
@@ -34,7 +34,7 @@ public class SpecificFields {
private CoatingField pageField;
private CoatingField limitField;
- public boolean addProperty(CoatingField coatingField) {
+ public boolean tryAddField(CoatingField coatingField) {
String fieldName = coatingField.getName();
if ("sortBy".equals(fieldName)) {
sortByField = coatingField;
diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/CoatingScanDef.java b/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/CoatingScanDef.java
new file mode 100644
index 0000000000000000000000000000000000000000..05d9ff044109ac14094fe0fdb417e6bede8035c5
--- /dev/null
+++ b/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/CoatingScanDef.java
@@ -0,0 +1,44 @@
+/*
+ * 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.coating.entity.def;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.gitee.dorive.coating.annotation.CoatingScan;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.core.annotation.AnnotatedElementUtils;
+
+import java.lang.reflect.AnnotatedElement;
+import java.util.Map;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class CoatingScanDef {
+
+ private String[] value;
+ private String regex;
+ private Class>[] queries;
+
+ public static CoatingScanDef fromElement(AnnotatedElement element) {
+ Map attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(element, CoatingScan.class);
+ return attributes != null ? BeanUtil.copyProperties(attributes, CoatingScanDef.class) : null;
+ }
+
+}
diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/ExampleDef.java b/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/ExampleDef.java
index c764018641f1923b351a45fac0d79b881cba53f6..6970a7dcd9ce3e6c98ef0299bb01583c7ed81677 100644
--- a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/ExampleDef.java
+++ b/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/ExampleDef.java
@@ -28,7 +28,7 @@ public class ExampleDef {
public static ExampleDef fromElement(AnnotatedElement element) {
Map attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(element, Example.class);
- return BeanUtil.copyProperties(attributes, ExampleDef.class);
+ return attributes != null ? BeanUtil.copyProperties(attributes, ExampleDef.class) : null;
}
}
diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/impl/DefaultExampleBuilder.java b/dorive-coating/src/main/java/com/gitee/dorive/coating/impl/DefaultExampleBuilder.java
index a8bf57e787b377a126fb85fcc4d882f05240956d..76fb485566b43d6af12b84d31216b63e309ca14a 100644
--- a/dorive-coating/src/main/java/com/gitee/dorive/coating/impl/DefaultExampleBuilder.java
+++ b/dorive-coating/src/main/java/com/gitee/dorive/coating/impl/DefaultExampleBuilder.java
@@ -19,13 +19,13 @@ package com.gitee.dorive.coating.impl;
import cn.hutool.core.lang.Assert;
import com.gitee.dorive.coating.api.ExampleBuilder;
+import com.gitee.dorive.coating.entity.BuildExample;
import com.gitee.dorive.coating.entity.CoatingCriteria;
import com.gitee.dorive.coating.entity.CoatingType;
import com.gitee.dorive.coating.entity.MergedRepository;
import com.gitee.dorive.coating.repository.AbstractCoatingRepository;
import com.gitee.dorive.core.api.context.Context;
import com.gitee.dorive.core.entity.executor.Criterion;
-import com.gitee.dorive.core.entity.executor.Example;
import com.gitee.dorive.core.entity.executor.MultiInBuilder;
import com.gitee.dorive.core.entity.executor.OrderBy;
import com.gitee.dorive.core.entity.executor.Page;
@@ -51,7 +51,7 @@ public class DefaultExampleBuilder implements ExampleBuilder {
}
@Override
- public Example buildExample(Context context, Object coating) {
+ public BuildExample buildExample(Context context, Object coating) {
CoatingType coatingType = repository.getCoatingType(coating);
CoatingCriteria coatingCriteria = coatingType.newCriteria(coating);
Map> criteriaMap = coatingCriteria.getCriteriaMap();
@@ -63,8 +63,8 @@ public class DefaultExampleBuilder implements ExampleBuilder {
String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath();
String relativeAccessPath = mergedRepository.getRelativeAccessPath();
List criteria = criteriaMap.computeIfAbsent(absoluteAccessPath, key -> new ArrayList<>(2));
- Example example = new Example(criteria);
- repoExampleMap.put(relativeAccessPath, new RepoExample(mergedRepository, example));
+ BuildExample buildExample = new BuildExample(criteria);
+ repoExampleMap.put(relativeAccessPath, new RepoExample(mergedRepository, buildExample));
}
executeQuery(context, repoExampleMap);
@@ -72,10 +72,10 @@ public class DefaultExampleBuilder implements ExampleBuilder {
RepoExample repoExample = repoExampleMap.get("/");
Assert.notNull(repoExample, "The criterion cannot be null!");
- Example example = repoExample.getExample();
- example.setOrderBy(orderBy);
- example.setPage(page);
- return example;
+ BuildExample buildExample = repoExample.getBuildExample();
+ buildExample.setOrderBy(orderBy);
+ buildExample.setPage(page);
+ return buildExample;
}
private void executeQuery(Context context, Map repoExampleMap) {
@@ -83,7 +83,7 @@ public class DefaultExampleBuilder implements ExampleBuilder {
if ("/".equals(accessPath)) return;
MergedRepository mergedRepository = repoExample.getMergedRepository();
- Example example = repoExample.getExample();
+ BuildExample buildExample = repoExample.getBuildExample();
CommonRepository definedRepository = mergedRepository.getDefinedRepository();
Map> mergedBindersMap = mergedRepository.getMergedBindersMap();
@@ -94,22 +94,22 @@ public class DefaultExampleBuilder implements ExampleBuilder {
for (String relativeAccessPath : mergedBindersMap.keySet()) {
RepoExample targetRepoExample = repoExampleMap.get(relativeAccessPath);
if (targetRepoExample != null) {
- Example targetExample = targetRepoExample.getExample();
- if (targetExample.isEmptyQuery()) {
- example.setEmptyQuery(true);
+ BuildExample targetExample = targetRepoExample.getBuildExample();
+ if (targetExample.isAbandoned()) {
+ buildExample.setAbandoned(true);
break;
}
}
}
- if (example.isQueryAll()) {
+ if (buildExample.isQueryAll()) {
return;
}
List