Skip to content

Commit

Permalink
[#277] 添加mapping strategy映射策略选择支持column和property和column+property
Browse files Browse the repository at this point in the history
  • Loading branch information
xuejmnet committed Jan 6, 2025
1 parent 9bda6ac commit 02a19ec
Show file tree
Hide file tree
Showing 25 changed files with 292 additions and 27 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.easy.query.core.basic.entity;

import com.easy.query.core.expression.parser.core.available.TableAvailable;
import com.easy.query.core.expression.segment.SQLEntityAliasSegment;
import com.easy.query.core.metadata.ColumnMetadata;
import com.easy.query.core.metadata.EntityMetadata;
import com.easy.query.core.util.EasyUtil;

/**
* create time 2025/1/6 19:49
* 文件说明
*
* @author xuejiaming
*/
public class ColumnEntityMappingRule implements EntityMappingRule{
@Override
public ColumnMetadata getColumnMetadataBySourcColumnMetadata(EntityMetadata sourceEntityMetadata, ColumnMetadata sourceColumnMetadata, EntityMetadata targetEntityMetadata) {
String sourceColumnName = sourceColumnMetadata.getName();
return targetEntityMetadata.getColumnMetadataOrNull(sourceColumnName);
}

@Override
public String getAnonymousPropertyNameFromSQLSegment(SQLEntityAliasSegment sqlEntityAliasSegment, TableAvailable aliasTable) {
return EasyUtil.getAnonymousPropertyNameByAlias(sqlEntityAliasSegment, aliasTable);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.easy.query.core.basic.entity;

import com.easy.query.core.expression.parser.core.available.TableAvailable;
import com.easy.query.core.expression.segment.SQLEntityAliasSegment;
import com.easy.query.core.metadata.ColumnMetadata;
import com.easy.query.core.metadata.EntityMetadata;

/**
* create time 2025/1/6 17:18
* 文件说明
*
* @author xuejiaming
*/
public interface EntityMappingRule {
/**
* 获取class表别名属性
* @param sourceEntityMetadata
* @param sourceColumnMetadata
* @param targetEntityMetadata
* @return
*/
ColumnMetadata getColumnMetadataBySourcColumnMetadata(EntityMetadata sourceEntityMetadata, ColumnMetadata sourceColumnMetadata, EntityMetadata targetEntityMetadata);

/**
* 获取别名表达式表属性名
* @param sqlEntityAliasSegment
* @param aliasTable
* @return
*/
String getAnonymousPropertyNameFromSQLSegment(SQLEntityAliasSegment sqlEntityAliasSegment, TableAvailable aliasTable);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.easy.query.core.basic.entity;

import com.easy.query.core.expression.parser.core.available.TableAvailable;
import com.easy.query.core.expression.segment.SQLEntityAliasSegment;
import com.easy.query.core.metadata.ColumnMetadata;
import com.easy.query.core.metadata.EntityMetadata;
import com.easy.query.core.util.EasyUtil;

/**
* create time 2025/1/6 19:49
* 文件说明
*
* @author xuejiaming
*/
public class PropertyEntityMappingRule implements EntityMappingRule{
@Override
public ColumnMetadata getColumnMetadataBySourcColumnMetadata(EntityMetadata sourceEntityMetadata, ColumnMetadata sourceColumnMetadata, EntityMetadata targetEntityMetadata) {

ColumnMetadata columnMetadata = targetEntityMetadata.getProperty2ColumnMap().get(sourceColumnMetadata.getPropertyName());
if (columnMetadata != null && !columnMetadata.isValueObject()) {
return columnMetadata;
}
return null;
}

@Override
public String getAnonymousPropertyNameFromSQLSegment(SQLEntityAliasSegment sqlEntityAliasSegment, TableAvailable aliasTable) {
return EasyUtil.getAnonymousPropertyNameByProperty(sqlEntityAliasSegment, aliasTable);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.easy.query.core.basic.entity;

import com.easy.query.core.expression.parser.core.available.TableAvailable;
import com.easy.query.core.expression.segment.SQLEntityAliasSegment;
import com.easy.query.core.metadata.ColumnMetadata;
import com.easy.query.core.metadata.EntityMetadata;
import com.easy.query.core.util.EasyUtil;

/**
* create time 2025/1/6 17:21
* 文件说明
*
* @author xuejiaming
*/
public class TryColumnAndPropertyEntityMappingRule implements EntityMappingRule {
@Override
public ColumnMetadata getColumnMetadataBySourcColumnMetadata(EntityMetadata sourceEntityMetadata, ColumnMetadata sourceColumnMetadata, EntityMetadata targetEntityMetadata) {
String sourceColumnName = sourceColumnMetadata.getName();
ColumnMetadata targetColumnMetadata = targetEntityMetadata.getColumnMetadataOrNull(sourceColumnName);
if (targetColumnMetadata == null) {
ColumnMetadata columnMetadata = targetEntityMetadata.getProperty2ColumnMap().get(sourceColumnMetadata.getPropertyName());
if (columnMetadata != null && !columnMetadata.isValueObject()) {
targetColumnMetadata = columnMetadata;
}
}
return targetColumnMetadata;
}

@Override
public String getAnonymousPropertyNameFromSQLSegment(SQLEntityAliasSegment sqlEntityAliasSegment, TableAvailable aliasTable) {
String propertyName = EasyUtil.getAnonymousPropertyNameByAlias(sqlEntityAliasSegment, aliasTable);
if (propertyName == null) {
return EasyUtil.getAnonymousPropertyNameByProperty(sqlEntityAliasSegment, aliasTable);
}
return propertyName;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
import com.easy.query.core.api.dynamic.executor.query.WhereObjectQueryExecutor;
import com.easy.query.core.api.dynamic.executor.sort.DefaultObjectSortQueryExecutor;
import com.easy.query.core.api.dynamic.executor.sort.ObjectSortQueryExecutor;
import com.easy.query.core.basic.entity.ColumnEntityMappingRule;
import com.easy.query.core.basic.entity.TryColumnAndPropertyEntityMappingRule;
import com.easy.query.core.basic.entity.EntityMappingRule;
import com.easy.query.core.basic.extension.formater.DefaultSQLParameterPrintFormat;
import com.easy.query.core.basic.extension.formater.SQLParameterPrintFormat;
import com.easy.query.core.basic.extension.listener.EmptyJdbcExecutorListener;
Expand Down Expand Up @@ -194,6 +197,7 @@ private void defaultConfiguration() {
.replaceService(RelationValueFactory.class, DefaultRelationValueFactory.class)
.replaceService(PropertyDescriptorMatcher.class, DefaultPropertyDescriptorMatcher.class)
.replaceService(ValueFilterFactory.class, AnyValueFilterFactory.class)
.replaceService(EntityMappingRule.class, ColumnEntityMappingRule.class)
// .replaceService(NavigateNamedGuess.class, DefaultNavigateNamedGuess.class)
.replaceService(EasyQueryClient.class, DefaultEasyQueryClient.class);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.easy.query.core.api.SQLClientApiFactory;
import com.easy.query.core.api.dynamic.executor.query.WhereObjectQueryExecutor;
import com.easy.query.core.api.dynamic.executor.sort.ObjectSortQueryExecutor;
import com.easy.query.core.basic.entity.EntityMappingRule;
import com.easy.query.core.basic.extension.formater.SQLParameterPrintFormat;
import com.easy.query.core.basic.extension.listener.JdbcExecutorListener;
import com.easy.query.core.basic.extension.print.JdbcSQLPrinter;
Expand Down Expand Up @@ -86,6 +87,7 @@ public class DefaultEasyQueryRuntimeContext implements QueryRuntimeContext {
private final MapColumnNameChecker mapColumnNameChecker;
private final PropertyDescriptorMatcher propertyDescriptorMatcher;
private final ValueFilterFactory valueFilterFactory;
private final EntityMappingRule entityMappingRule;

public DefaultEasyQueryRuntimeContext(ServiceProvider serviceProvider,
EasyQueryDataSource easyQueryDataSource,
Expand Down Expand Up @@ -124,7 +126,8 @@ public DefaultEasyQueryRuntimeContext(ServiceProvider serviceProvider,
RelationValueFactory relationValueFactory,
MapColumnNameChecker mapColumnNameChecker,
PropertyDescriptorMatcher propertyDescriptorMatcher,
ValueFilterFactory valueFilterFactory) {
ValueFilterFactory valueFilterFactory,
EntityMappingRule entityMappingRule) {
this.serviceProvider = serviceProvider;
this.easyQueryDataSource = easyQueryDataSource;
this.easyQueryConfiguration = easyQueryConfiguration;
Expand Down Expand Up @@ -163,6 +166,7 @@ public DefaultEasyQueryRuntimeContext(ServiceProvider serviceProvider,
this.mapColumnNameChecker = mapColumnNameChecker;
this.propertyDescriptorMatcher = propertyDescriptorMatcher;
this.valueFilterFactory = valueFilterFactory;
this.entityMappingRule = entityMappingRule;
}

@Override
Expand Down Expand Up @@ -355,4 +359,9 @@ public PropertyDescriptorMatcher getPropertyDescriptorMatcher() {
public ValueFilterFactory getValueFilterFactory() {
return valueFilterFactory;
}

@Override
public EntityMappingRule getEntityMappingRule() {
return entityMappingRule;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.easy.query.core.api.SQLClientApiFactory;
import com.easy.query.core.api.dynamic.executor.query.WhereObjectQueryExecutor;
import com.easy.query.core.api.dynamic.executor.sort.ObjectSortQueryExecutor;
import com.easy.query.core.basic.entity.EntityMappingRule;
import com.easy.query.core.basic.extension.formater.SQLParameterPrintFormat;
import com.easy.query.core.basic.extension.listener.JdbcExecutorListener;
import com.easy.query.core.basic.extension.print.JdbcSQLPrinter;
Expand Down Expand Up @@ -229,4 +230,9 @@ public PropertyDescriptorMatcher getPropertyDescriptorMatcher() {
public ValueFilterFactory getValueFilterFactory() {
return null;
}

@Override
public EntityMappingRule getEntityMappingRule() {
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.easy.query.core.api.SQLClientApiFactory;
import com.easy.query.core.api.dynamic.executor.query.WhereObjectQueryExecutor;
import com.easy.query.core.api.dynamic.executor.sort.ObjectSortQueryExecutor;
import com.easy.query.core.basic.entity.EntityMappingRule;
import com.easy.query.core.basic.extension.formater.SQLParameterPrintFormat;
import com.easy.query.core.basic.extension.listener.JdbcExecutorListener;
import com.easy.query.core.basic.extension.print.JdbcSQLPrinter;
Expand Down Expand Up @@ -88,4 +89,5 @@ public interface QueryRuntimeContext {
MapColumnNameChecker getMapColumnNameChecker();
PropertyDescriptorMatcher getPropertyDescriptorMatcher();
ValueFilterFactory getValueFilterFactory();
EntityMappingRule getEntityMappingRule();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.easy.query.core.enums;

/**
* create time 2025/1/6 19:51
* 对象映射策略
*
* @author xuejiaming
*/
public enum EntityMappingStrategyEnum {
COLUMN_ONLY,
PROPERTY_ONLY,
COLUMN_AND_PROPERTY;
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.easy.query.core.expression.builder.impl;

import com.easy.query.core.basic.entity.EntityMappingRule;
import com.easy.query.core.basic.jdbc.executor.internal.enumerable.PartitionResult;
import com.easy.query.core.enums.EntityMetadataTypeEnum;
import com.easy.query.core.exception.EasyQueryException;
import com.easy.query.core.expression.segment.ColumnSegment;
import com.easy.query.core.expression.segment.SQLEntityAliasSegment;
Expand All @@ -11,7 +13,6 @@
import com.easy.query.core.metadata.EntityMetadata;
import com.easy.query.core.util.EasyClassUtil;
import com.easy.query.core.util.EasySQLSegmentUtil;
import com.easy.query.core.util.EasyUtil;

import java.util.List;

Expand All @@ -33,25 +34,29 @@ public AbstractAsSelector(EntityQueryExpressionBuilder entityQueryExpressionBuil

@Override
protected TChain columnAnonymousAll(AnonymousEntityTableExpressionBuilder table) {
if(PartitionResult.class.isAssignableFrom(resultEntityMetadata.getEntityClass())){
if (PartitionResult.class.isAssignableFrom(resultEntityMetadata.getEntityClass())) {
return super.columnAnonymousAll(table);
}else{
} else {

EntityQueryExpressionBuilder queryExpressionBuilder = getAnonymousTableQueryExpressionBuilder(table);
if (EasySQLSegmentUtil.isNotEmpty(queryExpressionBuilder.getProjects())) {

List<SQLSegment> sqlSegments = queryExpressionBuilder.getProjects().getSQLSegments();
EntityMappingRule entityMappingRule = runtimeContext.getEntityMappingRule();
//匿名表内部设定的不查询
for (SQLSegment sqlSegment : sqlSegments) {

if (sqlSegment instanceof SQLEntityAliasSegment) {
SQLEntityAliasSegment sqlEntityAliasSegment = (SQLEntityAliasSegment) sqlSegment;

String propertyName = EasyUtil.getAnonymousPropertyName(sqlEntityAliasSegment, table.getEntityTable());
String propertyName = entityMappingRule.getAnonymousPropertyNameFromSQLSegment(sqlEntityAliasSegment, table.getEntityTable());
if (propertyName != null) {
if(resultEntityMetadata.getColumnOrNull(propertyName)!=null){
if (resultEntityMetadata.getColumnOrNull(propertyName) != null) {
ColumnSegment columnSegment = sqlSegmentFactory.createSelectColumnSegment(table.getEntityTable(), propertyName, expressionContext, sqlEntityAliasSegment.getAlias());
sqlBuilderSegment.append(columnSegment);
} else if (resultEntityMetadata.getEntityMetadataType() == EntityMetadataTypeEnum.MAP) {
ColumnSegment columnSegment = sqlSegmentFactory.createAnonymousColumnSegment(table.getEntityTable(), expressionContext, sqlEntityAliasSegment.getAlias());
sqlBuilderSegment.append(columnSegment);
}
} else {
ColumnSegment columnSegment = sqlSegmentFactory.createAnonymousColumnSegment(table.getEntityTable(), expressionContext, sqlEntityAliasSegment.getAlias());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.easy.query.core.expression.builder.impl;

import com.easy.query.core.basic.entity.EntityMappingRule;
import com.easy.query.core.context.QueryRuntimeContext;
import com.easy.query.core.enums.EasyBehaviorEnum;
import com.easy.query.core.exception.EasyQueryException;
Expand Down Expand Up @@ -32,15 +33,12 @@
import com.easy.query.core.util.EasyCollectionUtil;
import com.easy.query.core.util.EasyRelationalUtil;
import com.easy.query.core.util.EasySQLSegmentUtil;
import com.easy.query.core.util.EasyUtil;

import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;

/**
* create time 2023/6/22 21:14
Expand Down Expand Up @@ -310,20 +308,23 @@ protected TChain columnAnonymousAll(AnonymousEntityTableExpressionBuilder table)
if (EasySQLSegmentUtil.isNotEmpty(queryExpressionBuilder.getProjects())) {

List<SQLSegment> sqlSegments = queryExpressionBuilder.getProjects().getSQLSegments();

EntityMappingRule entityMappingRule = runtimeContext.getEntityMappingRule();
//匿名表内部设定的不查询
for (SQLSegment sqlSegment : sqlSegments) {

if (sqlSegment instanceof SQLEntityAliasSegment) {
SQLEntityAliasSegment sqlEntityAliasSegment = (SQLEntityAliasSegment) sqlSegment;

String propertyName = EasyUtil.getAnonymousPropertyName(sqlEntityAliasSegment, table.getEntityTable());
String propertyName = entityMappingRule.getAnonymousPropertyNameFromSQLSegment(sqlEntityAliasSegment, table.getEntityTable());
if (propertyName != null) {
ColumnSegment columnSegment = sqlSegmentFactory.createSelectColumnSegment(table.getEntityTable(), propertyName, expressionContext, sqlEntityAliasSegment.getAlias());
sqlBuilderSegment.append(columnSegment);
} else {
ColumnSegment columnSegment = sqlSegmentFactory.createAnonymousColumnSegment(table.getEntityTable(), expressionContext, sqlEntityAliasSegment.getAlias());
sqlBuilderSegment.append(columnSegment);
}

} else {
throw new EasyQueryException("columnAnonymousAll not found column:" + EasyClassUtil.getInstanceSimpleName(sqlSegment));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.easy.query.core.expression.builder.impl;

import com.easy.query.core.basic.api.select.Query;
import com.easy.query.core.basic.entity.EntityMappingRule;
import com.easy.query.core.context.QueryRuntimeContext;
import com.easy.query.core.enums.EasyBehaviorEnum;
import com.easy.query.core.expression.builder.AsSelector;
Expand Down Expand Up @@ -32,12 +33,12 @@
*
* @author xuejiaming
*/
public class AutoAsSelectorImpl extends AbstractAsSelector<AsSelector> implements AsSelector {
public class AutoAsSelectorImpl extends AbstractAsSelector<AsSelector> implements AsSelector {

private final EntityQueryExpressionBuilder entityQueryExpressionBuilder;

public AutoAsSelectorImpl(EntityQueryExpressionBuilder entityQueryExpressionBuilder, SQLBuilderSegment sqlBuilderSegment, EntityMetadata resultEntityMetadata) {
super(entityQueryExpressionBuilder, sqlBuilderSegment,resultEntityMetadata);
super(entityQueryExpressionBuilder, sqlBuilderSegment, resultEntityMetadata);
this.entityQueryExpressionBuilder = entityQueryExpressionBuilder;
}

Expand Down Expand Up @@ -125,32 +126,32 @@ private AsSelector columnAll0(EntityTableExpressionBuilder tableExpressionBuilde
EntityMetadata sourceEntityMetadata = tableExpressionBuilder.getEntityMetadata();

Collection<String> sourceProperties = sourceEntityMetadata.getProperties();
EntityMappingRule entityMappingRule = runtimeContext.getEntityMappingRule();
for (String property : sourceProperties) {

ColumnMetadata sourceColumnMetadata = sourceEntityMetadata.getColumnNotNull(property);
// if(!sourceColumnMetadata.isAutoSelect()){
// continue;
// }

if(ignoreColumnIfLargeNotQuery(queryLargeColumn,sourceColumnMetadata)){
if (ignoreColumnIfLargeNotQuery(queryLargeColumn, sourceColumnMetadata)) {
continue;
}
String sourceColumnName = sourceColumnMetadata.getName();
ColumnMetadata targetColumnMetadata = targetEntityMetadata.getColumnMetadataOrNull(sourceColumnName);
ColumnMetadata targetColumnMetadata = entityMappingRule.getColumnMetadataBySourcColumnMetadata(sourceEntityMetadata, sourceColumnMetadata, targetEntityMetadata);
if (targetColumnMetadata != null) {

if(ignoreColumnIfLargeNotQuery(queryLargeColumn,targetColumnMetadata)){
if (ignoreColumnIfLargeNotQuery(queryLargeColumn, targetColumnMetadata)) {
continue;
}
String targetColumnName = targetColumnMetadata.getName();
//如果当前属性和查询对象属性一致那么就返回对应的列名,对应的列名如果不一样就返回对应返回结果对象的属性上的列名
String alias = Objects.equals(sourceColumnName, targetColumnName) ? null : targetColumnName;
String alias = Objects.equals(sourceColumnMetadata.getName(), targetColumnName) ? null : targetColumnName;
ColumnSegment columnSegment = sqlSegmentFactory.createSelectColumnSegment(tableExpressionBuilder.getEntityTable(), sourceColumnMetadata, entityQueryExpressionBuilder.getExpressionContext(), alias);
sqlBuilderSegment.append(columnSegment);
}

}
autoColumnInclude(tableExpressionBuilder.getEntityTable(),targetEntityMetadata);
autoColumnInclude(tableExpressionBuilder.getEntityTable(), targetEntityMetadata);
}
return this;
}
Expand Down
Loading

0 comments on commit 02a19ec

Please sign in to comment.