Skip to content

Commit cd14a87

Browse files
committed
Merge branch 'save-250903'
2 parents dd7767e + 424d723 commit cd14a87

File tree

96 files changed

+4143
-192
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

96 files changed

+4143
-192
lines changed

sql-core/src/main/java/com/easy/query/core/annotation/Navigate.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.easy.query.core.basic.extension.navigate.DefaultNavigateExtraFilterStrategy;
44
import com.easy.query.core.basic.extension.navigate.NavigateExtraFilterStrategy;
5+
import com.easy.query.core.enums.MappingClassSaveModeEnum;
56
import com.easy.query.core.enums.PartitionOrderEnum;
67
import com.easy.query.core.enums.RelationTypeEnum;
78

@@ -47,6 +48,12 @@
4748
*/
4849
Class<?> mappingClass() default Object.class;
4950

51+
/**
52+
* 仅多对多生效
53+
* 中间表保存模式 默认报错需要用户指定,自动模式则认为中间表是简单表 手动模式则认为中间表是人为会去处理的
54+
* @return
55+
*/
56+
MappingClassSaveModeEnum mappingClassSaveMode() default MappingClassSaveModeEnum.THROW;
5057
/**
5158
* 多对多填写
5259
* 当前对象的{@param selfProperty}属性对应中间表的哪个属性,多对多不能为空
@@ -164,4 +171,6 @@
164171
*/
165172
boolean ignoreAutoInclude() default false;
166173

174+
175+
167176
}

sql-core/src/main/java/com/easy/query/core/annotation/UpdateIgnore.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
/**
1010
* 更新对象时会自动忽略该列,任何时候都不会更新set这个
11-
* 除非你手动指定更新使用expression update,或者track update在追踪模式下update变更了
11+
* 除非你手动指定更新使用expression update,或者track update在追踪模式下update变更了({@link #updateSetInTrackDiff()}为true才会在track下加入否则也不加入更新)
1212
*
1313
* @author xuejiaming
1414
*/

sql-core/src/main/java/com/easy/query/core/api/client/DefaultEasyQueryClient.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,16 @@ public <T> void loadInclude(List<T> entities, String navigateProperty, SQLAction
273273
IncludeProcessor includeProcess = includeProcessorFactory.createIncludeProcess(includeParserResult, runtimeContext);
274274
includeProcess.process();
275275
}
276+
TrackManager trackManager = runtimeContext.getTrackManager();
277+
TrackContext currentTrackContext = trackManager.getCurrentTrackContext();
278+
if(currentTrackContext!=null){
279+
for (T entity : entities) {
280+
EntityState trackEntityState = currentTrackContext.getTrackEntityState(entity);
281+
if(trackEntityState!=null){
282+
trackEntityState.addInclude(navigateMetadata);
283+
}
284+
}
285+
}
276286
}
277287

278288
@Override

sql-core/src/main/java/com/easy/query/core/basic/api/delete/ClientEntityDeletable.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
import com.easy.query.core.basic.api.internal.ConfigureVersionable;
44
import com.easy.query.core.basic.api.internal.SQLBatchExecute;
5+
import com.easy.query.core.basic.api.update.ClientEntityUpdatable;
6+
import com.easy.query.core.expression.lambda.SQLActionExpression1;
7+
import com.easy.query.core.expression.parser.core.base.ColumnOnlySelector;
58

69
import java.util.List;
710

@@ -14,4 +17,20 @@
1417
public interface ClientEntityDeletable<T> extends Deletable<T, ClientEntityDeletable<T>>
1518
, ConfigureVersionable<ClientEntityDeletable<T>>, SQLBatchExecute<ClientEntityDeletable<T>> {
1619
List<T> getEntities();
20+
/**
21+
* 自定义条件当做where
22+
* @param columnSelectorExpression
23+
* @return
24+
*/
25+
default ClientEntityDeletable<T> whereColumns(SQLActionExpression1<ColumnOnlySelector<T>> columnSelectorExpression) {
26+
return whereColumns(true, columnSelectorExpression);
27+
}
28+
29+
/**
30+
* 自定义条件当做where
31+
* @param condition
32+
* @param columnSelectorExpression
33+
* @return
34+
*/
35+
ClientEntityDeletable<T> whereColumns(boolean condition, SQLActionExpression1<ColumnOnlySelector<T>> columnSelectorExpression);
1736
}

sql-core/src/main/java/com/easy/query/core/basic/api/delete/abstraction/AbstractClientEntityDeletable.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@
1111
import com.easy.query.core.enums.ExecuteMethodEnum;
1212
import com.easy.query.core.enums.MultiTableTypeEnum;
1313
import com.easy.query.core.exception.EasyQueryException;
14+
import com.easy.query.core.expression.builder.impl.OnlySelectorImpl;
1415
import com.easy.query.core.expression.lambda.SQLActionExpression1;
16+
import com.easy.query.core.expression.parser.core.base.ColumnOnlySelector;
17+
import com.easy.query.core.expression.parser.core.base.impl.ColumnOnlySelectorImpl;
1518
import com.easy.query.core.expression.sql.builder.EntityDeleteExpressionBuilder;
1619
import com.easy.query.core.expression.sql.builder.EntityTableExpressionBuilder;
1720
import com.easy.query.core.expression.sql.builder.ExpressionContext;
@@ -61,6 +64,15 @@ public EntityDeleteExpressionBuilder getDeleteExpressionBuilder() {
6164
return entityDeleteExpressionBuilder;
6265
}
6366

67+
@Override
68+
public ClientEntityDeletable<T> whereColumns(boolean condition, SQLActionExpression1<ColumnOnlySelector<T>> columnSelectorExpression) {
69+
if (condition) {
70+
ColumnOnlySelectorImpl<T> columnSelector = new ColumnOnlySelectorImpl<>(table.getEntityTable(), new OnlySelectorImpl(entityDeleteExpressionBuilder.getRuntimeContext(), entityDeleteExpressionBuilder.getExpressionContext(), entityDeleteExpressionBuilder.getWhereColumns()));
71+
columnSelectorExpression.apply(columnSelector);
72+
}
73+
return this;
74+
}
75+
6476
@Override
6577
public long executeRows() {
6678

sql-core/src/main/java/com/easy/query/core/basic/api/delete/impl/EasyEmptyClientEntityDeletable.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.easy.query.core.basic.api.delete.impl;
22

33
import com.easy.query.core.basic.api.delete.ClientEntityDeletable;
4+
import com.easy.query.core.basic.api.update.ClientEntityUpdatable;
45
import com.easy.query.core.basic.jdbc.parameter.ToSQLContext;
56
import com.easy.query.core.exception.AssertExceptionFactory;
67
import com.easy.query.core.expression.lambda.SQLActionExpression1;
8+
import com.easy.query.core.expression.parser.core.base.ColumnOnlySelector;
79
import com.easy.query.core.expression.sql.builder.EntityDeleteExpressionBuilder;
810
import com.easy.query.core.expression.sql.builder.ExpressionContext;
911
import com.easy.query.core.expression.sql.builder.internal.ContextConfigurer;
@@ -32,6 +34,11 @@ public List<T> getEntities() {
3234
return EasyCollectionUtil.emptyList();
3335
}
3436

37+
@Override
38+
public ClientEntityDeletable<T> whereColumns(boolean condition, SQLActionExpression1<ColumnOnlySelector<T>> columnSelectorExpression) {
39+
return this;
40+
}
41+
3542
@Override
3643
public ExpressionContext getExpressionContext() {
3744
return null;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.easy.query.core.basic.api.save;
2+
3+
import com.easy.query.core.basic.api.internal.SQLExecuteExpectRows;
4+
import com.easy.query.core.basic.api.internal.TableReNameable;
5+
import com.easy.query.core.expression.sql.builder.EntityDeleteExpressionBuilder;
6+
import com.easy.query.core.expression.sql.builder.ExpressionContext;
7+
8+
/**
9+
* create time 2025/9/3 11:22
10+
* 文件说明
11+
*
12+
* @author xuejiaming
13+
*/
14+
public interface Savable {
15+
/**
16+
* 执行命令
17+
* @return
18+
*/
19+
void executeCommand();
20+
}

sql-core/src/main/java/com/easy/query/core/basic/api/select/abstraction/AbstractClientQueryable.java

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -457,17 +457,17 @@ public <TR> TR singleOrNull(@NotNull Class<TR> resultClass) {
457457
boolean printSQL = EasyJdbcExecutorUtil.isPrintSQL(jdbcStreamResult.getExecutorContext());
458458
Iterator<TR> iterator = streamResult.iterator();
459459

460-
int i = 0;
461-
while (iterator.hasNext()) {
462-
if (i >= 1) {
460+
int total = 0;
461+
if (iterator.hasNext()) {
462+
next = iterator.next();
463+
total = 1;
464+
if (iterator.hasNext()) {
463465
throw runtimeContext.getAssertExceptionFactory().createSingleMoreElementException(this);
464466
}
465-
466-
next = iterator.next();
467-
i++;
468467
}
468+
469469
if (printSQL) {
470-
log.info("<== Total: " + i);
470+
log.info("<== Total: " + total);
471471
}
472472

473473
} catch (SQLException e) {
@@ -537,10 +537,14 @@ public List<T1> toTreeList(boolean ignore) {
537537
}
538538
return list;
539539
}
540-
List<TreeDeepItem> deepItems = this.expressionContext.getDeepItems();
541540
TreeCTEOption treeCTEOption = this.expressionContext.getTreeCTEOption();
542-
TreeSelfTargetItem treeSelfTargetItem = getTreeSelfTargetItem(treeNavigateMetadata);
543-
return EasyTreeUtil.generateTrees(list, entityMetadata, treeNavigateMetadata, treeSelfTargetItem, runtimeContext, treeCTEOption, deepItems);
541+
if (treeCTEOption == null) {//非cte递归的情况下走原本的树组合
542+
return EasyTreeUtil.generateTrees(list, entityMetadata, treeNavigateMetadata, runtimeContext);
543+
} else {
544+
List<TreeDeepItem> deepItems = this.expressionContext.getDeepItems();
545+
TreeSelfTargetItem treeSelfTargetItem = getTreeSelfTargetItem(treeNavigateMetadata);
546+
return EasyTreeUtil.generateTrees(list, entityMetadata, treeNavigateMetadata, treeSelfTargetItem, runtimeContext, treeCTEOption, deepItems);
547+
}
544548
}
545549

546550
private TreeSelfTargetItem getTreeSelfTargetItem(NavigateMetadata resultTreeNavigateMetadata) {
@@ -572,12 +576,12 @@ private TreeSelfTargetItem getTreeSelfTargetItem(NavigateMetadata resultTreeNavi
572576
}
573577
}
574578
String[] selfProperties = resultTreeNavigateMetadata.getSelfProperties();
575-
if(EasyArrayUtil.isEmpty(selfProperties)){
576-
throw new EasyQueryInvalidOperationException(EasyClassUtil.getSimpleName(this.entityMetadata.getEntityClass())+" is unable to access selfProperty during tree structure retrieval.");
579+
if (EasyArrayUtil.isEmpty(selfProperties)) {
580+
throw new EasyQueryInvalidOperationException(EasyClassUtil.getSimpleName(this.entityMetadata.getEntityClass()) + " is unable to access selfProperty during tree structure retrieval.");
577581
}
578582
String[] targetProperties = resultTreeNavigateMetadata.getTargetProperties();
579-
if(EasyArrayUtil.isEmpty(targetProperties)){
580-
throw new EasyQueryInvalidOperationException(EasyClassUtil.getSimpleName(this.entityMetadata.getEntityClass())+" is unable to access targetProperty during tree structure retrieval.");
583+
if (EasyArrayUtil.isEmpty(targetProperties)) {
584+
throw new EasyQueryInvalidOperationException(EasyClassUtil.getSimpleName(this.entityMetadata.getEntityClass()) + " is unable to access targetProperty during tree structure retrieval.");
581585
}
582586
return new TreeSelfTargetItem(selfProperties, targetProperties);
583587
}

sql-core/src/main/java/com/easy/query/core/basic/extension/track/DefaultTrackContext.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,19 @@ public EntityState getTrackEntityState(Object entity) {
5858
return entityStateTrackMap.get(trackKey);
5959
}
6060

61+
@Override
62+
public EntityState getTrackEntityState(Class<?> entityClass, String trackKey) {
63+
64+
if (trackKey == null) {
65+
return null;
66+
}
67+
ConcurrentHashMap<String, EntityState> entityStateTrackMap = trackEntityMap.get(entityClass);
68+
if (entityStateTrackMap == null || entityStateTrackMap.isEmpty()) {
69+
return null;
70+
}
71+
return entityStateTrackMap.get(trackKey);
72+
}
73+
6174
@Override
6275
public boolean addTracking(@NotNull Object entity) {
6376
EntityState entityState = addInternalTracking(entity, false);
@@ -149,7 +162,8 @@ public boolean hasTracked(Class<?> entityClass) {
149162
* @param entityMetadata
150163
* @return
151164
*/
152-
private Object createAndCopyValue(Object entity, EntityMetadata entityMetadata) {
165+
@Override
166+
public Object createAndCopyValue(Object entity, EntityMetadata entityMetadata) {
153167

154168
// Class<?> entityClass = entity.getClass();
155169
Object original = entityMetadata.getBeanConstructorCreator().get();

sql-core/src/main/java/com/easy/query/core/basic/extension/track/EntityState.java

Lines changed: 60 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,31 @@
22

33
import com.easy.query.core.metadata.ColumnMetadata;
44
import com.easy.query.core.metadata.EntityMetadata;
5-
import com.easy.query.core.metadata.EntityMetadataManager;
5+
import com.easy.query.core.metadata.NavigateMetadata;
66
import com.easy.query.core.util.EasyBeanUtil;
77

8+
import java.util.ArrayList;
9+
import java.util.HashMap;
10+
import java.util.LinkedHashSet;
11+
import java.util.List;
12+
import java.util.Map;
13+
import java.util.Set;
14+
815
/**
16+
* @author xuejiaming
917
* @FileName: EntryState.java
1018
* @Description: 文件说明
1119
* create time 2023/3/18 21:22
12-
* @author xuejiaming
1320
*/
1421
public class EntityState {
1522
private final EntityMetadata entityMetadata;
1623
private final Object originalValue;
1724
private final Object currentValue;
1825
private final String trackKey;
1926

27+
private List<NavigateMetadata> includes;
28+
private Map<NavigateMetadata, Set<String>> includeWithTrackKeyMap;
29+
2030
public EntityState(EntityMetadata entityMetadata, String trackKey, Object originalValue, Object currentValue) {
2131
this.trackKey = trackKey;
2232
assert entityMetadata != null;
@@ -47,13 +57,59 @@ public Object getCurrentValue() {
4757
return currentValue;
4858
}
4959

60+
public List<NavigateMetadata> getIncludes() {
61+
return includes;
62+
}
63+
64+
public void setAppendIncludes(List<NavigateMetadata> includes) {
65+
if (this.includes != null) {
66+
if (includes != null) {
67+
for (NavigateMetadata include : includes) {
68+
addInclude(include);
69+
}
70+
}
71+
} else {
72+
this.includes = includes;
73+
}
74+
}
75+
76+
public boolean addInclude(NavigateMetadata navigateMetadata) {
77+
if (includes == null) {
78+
includes = new ArrayList<>();
79+
}
80+
if (!includes.contains(navigateMetadata)) {
81+
includes.add(navigateMetadata);
82+
return true;
83+
}
84+
return false;
85+
}
86+
87+
public void addTrackKey(NavigateMetadata navigateMetadata, String trackKey) {
88+
if (includeWithTrackKeyMap == null) {
89+
includeWithTrackKeyMap = new HashMap<>();
90+
}
91+
Set<String> trackKeys = includeWithTrackKeyMap.computeIfAbsent(navigateMetadata, o -> new LinkedHashSet<>());
92+
if (trackKey != null) {
93+
trackKeys.add(trackKey);
94+
}
95+
}
96+
97+
public Set<String> getTrackKeys(NavigateMetadata navigateMetadata) {
98+
if (includeWithTrackKeyMap == null) {
99+
return null;
100+
}
101+
return includeWithTrackKeyMap.get(navigateMetadata);
102+
}
103+
50104
public EntityValueState getEntityValueState(String propertyName) {
51105
ColumnMetadata columnMetadata = entityMetadata.getColumnNotNull(propertyName);
52106
return getEntityValueState(columnMetadata);
53107
}
108+
54109
public EntityValueState getEntityValueState(ColumnMetadata columnMetadata) {
55-
Object originalPropertyValue = EasyBeanUtil.getPropertyValue(originalValue,entityMetadata,columnMetadata);
56-
Object currentPropertyValue = EasyBeanUtil.getPropertyValue(currentValue,entityMetadata,columnMetadata);
110+
Object originalPropertyValue = EasyBeanUtil.getPropertyValue(originalValue, entityMetadata, columnMetadata);
111+
Object currentPropertyValue = EasyBeanUtil.getPropertyValue(currentValue, entityMetadata, columnMetadata);
57112
return new EntityValueState(columnMetadata, originalPropertyValue, currentPropertyValue);
58113
}
114+
59115
}

0 commit comments

Comments
 (0)