From 9a6fbb6c1a5c384844261b7dd5ef6a26c350fca0 Mon Sep 17 00:00:00 2001 From: wangyu <727842003@qq.com> Date: Thu, 4 Jul 2024 00:45:20 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapping/FullReactiveDataAccessStrategy.java | 9 ++++++--- .../r2dbc/core/PredefinedStatementMapper.java | 7 ------- .../data/r2dbc/query/FullUpdateMapper.java | 9 ++++++--- .../relational/core/sql/FunctionCondition.java | 17 +++++++++++------ .../core/sql/render/FunctionVisitor.java | 9 +++++++-- 5 files changed, 30 insertions(+), 21 deletions(-) rename flyfish-data/{flyfish-data-r2dbc => flyfish-data-relational}/src/main/java/org/springframework/data/relational/core/sql/FunctionCondition.java (57%) rename flyfish-data/{flyfish-data-r2dbc => flyfish-data-relational}/src/main/java/org/springframework/data/relational/core/sql/render/FunctionVisitor.java (89%) diff --git a/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/config/mapping/FullReactiveDataAccessStrategy.java b/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/config/mapping/FullReactiveDataAccessStrategy.java index f4d13db..ff4c3cd 100644 --- a/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/config/mapping/FullReactiveDataAccessStrategy.java +++ b/flyfish-data/flyfish-data-r2dbc/src/main/java/com/flyfish/framework/r2dbc/config/mapping/FullReactiveDataAccessStrategy.java @@ -18,6 +18,7 @@ import org.springframework.data.relational.core.dialect.RenderContextFactory; import org.springframework.data.relational.core.mapping.RelationalPersistentEntity; import org.springframework.data.relational.core.mapping.RelationalPersistentProperty; import org.springframework.data.relational.core.sql.SqlIdentifier; +import org.springframework.data.relational.core.sql.render.RenderContext; import org.springframework.data.relational.domain.RowDocument; import org.springframework.lang.NonNull; import org.springframework.r2dbc.core.Parameter; @@ -55,11 +56,13 @@ public class FullReactiveDataAccessStrategy implements ReactiveDataAccessStrateg Assert.notNull(dialect, "Dialect must not be null"); Assert.notNull(converter, "RelationalConverter must not be null"); this.delegated = new DefaultReactiveDataAccessStrategy(dialect, converter); + RenderContextFactory factory = new RenderContextFactory(dialect); + RenderContext renderContext = factory.createRenderContext(); this.converter = converter; - this.updateMapper = new FullUpdateMapper(dialect, converter); - RenderContextFactory factory = new RenderContextFactory(dialect); - this.statementMapper = new PredefinedStatementMapper(dialect, factory.createRenderContext(), this.updateMapper, + this.updateMapper = new FullUpdateMapper(dialect, converter, renderContext); + + this.statementMapper = new PredefinedStatementMapper(dialect, renderContext, this.updateMapper, delegated.getMappingContext()); } diff --git a/flyfish-data/flyfish-data-r2dbc/src/main/java/org/springframework/data/r2dbc/core/PredefinedStatementMapper.java b/flyfish-data/flyfish-data-r2dbc/src/main/java/org/springframework/data/r2dbc/core/PredefinedStatementMapper.java index 41ada28..94d551e 100644 --- a/flyfish-data/flyfish-data-r2dbc/src/main/java/org/springframework/data/r2dbc/core/PredefinedStatementMapper.java +++ b/flyfish-data/flyfish-data-r2dbc/src/main/java/org/springframework/data/r2dbc/core/PredefinedStatementMapper.java @@ -14,15 +14,8 @@ import org.springframework.data.relational.core.sql.render.RenderContext; */ public class PredefinedStatementMapper extends DefaultStatementMapper { - private static RenderContext RENDER_CONTEXT; - public PredefinedStatementMapper(R2dbcDialect dialect, RenderContext renderContext, UpdateMapper updateMapper, MappingContext, ? extends RelationalPersistentProperty> mappingContext) { super(dialect, renderContext, updateMapper, mappingContext); - RENDER_CONTEXT = renderContext; - } - - public static RenderContext sharedRenderContext() { - return RENDER_CONTEXT; } } diff --git a/flyfish-data/flyfish-data-r2dbc/src/main/java/org/springframework/data/r2dbc/query/FullUpdateMapper.java b/flyfish-data/flyfish-data-r2dbc/src/main/java/org/springframework/data/r2dbc/query/FullUpdateMapper.java index 04b0c27..b71b3f8 100644 --- a/flyfish-data/flyfish-data-r2dbc/src/main/java/org/springframework/data/r2dbc/query/FullUpdateMapper.java +++ b/flyfish-data/flyfish-data-r2dbc/src/main/java/org/springframework/data/r2dbc/query/FullUpdateMapper.java @@ -10,6 +10,7 @@ import org.springframework.data.relational.core.mapping.RelationalPersistentProp import org.springframework.data.relational.core.query.CriteriaDefinition; import org.springframework.data.relational.core.query.ValueFunction; import org.springframework.data.relational.core.sql.*; +import org.springframework.data.relational.core.sql.render.RenderContext; import org.springframework.data.util.Pair; import org.springframework.data.util.TypeInformation; import org.springframework.lang.NonNull; @@ -32,12 +33,14 @@ import java.util.*; public class FullUpdateMapper extends UpdateMapper { private final R2dbcDialect dialect; + private final RenderContext renderContext; private final MappingContext, RelationalPersistentProperty> mappingContext; - public FullUpdateMapper(R2dbcDialect dialect, R2dbcConverter converter) { + public FullUpdateMapper(R2dbcDialect dialect, R2dbcConverter converter, RenderContext renderContext) { super(dialect, converter); this.dialect = dialect; this.mappingContext = (MappingContext) converter.getMappingContext(); + this.renderContext = renderContext; } /** @@ -246,13 +249,13 @@ public class FullUpdateMapper extends UpdateMapper { BindMarker bindMarker = bindings.nextMarker(column.getName().getReference()); expressions.add(bind(o, valueType, bindings, bindMarker)); } - return FunctionCondition.of(criteria.getFunctionName(), expressions); + return FunctionCondition.of(renderContext, criteria.getFunctionName(), expressions); } else { // 单值绑定 BindMarker bindMarker = bindings.nextMarker(column.getName().getReference()); Expression expression = bind(mappedValue, valueType, bindings, bindMarker); - return FunctionCondition.of(criteria.getFunctionName(), column, expression); + return FunctionCondition.of(renderContext, criteria.getFunctionName(), column, expression); } } diff --git a/flyfish-data/flyfish-data-r2dbc/src/main/java/org/springframework/data/relational/core/sql/FunctionCondition.java b/flyfish-data/flyfish-data-relational/src/main/java/org/springframework/data/relational/core/sql/FunctionCondition.java similarity index 57% rename from flyfish-data/flyfish-data-r2dbc/src/main/java/org/springframework/data/relational/core/sql/FunctionCondition.java rename to flyfish-data/flyfish-data-relational/src/main/java/org/springframework/data/relational/core/sql/FunctionCondition.java index 9c01135..ada0f6c 100644 --- a/flyfish-data/flyfish-data-r2dbc/src/main/java/org/springframework/data/relational/core/sql/FunctionCondition.java +++ b/flyfish-data/flyfish-data-relational/src/main/java/org/springframework/data/relational/core/sql/FunctionCondition.java @@ -2,6 +2,7 @@ package org.springframework.data.relational.core.sql; import lombok.Getter; import org.springframework.data.relational.core.sql.render.FunctionVisitor; +import org.springframework.data.relational.core.sql.render.RenderContext; import org.springframework.util.Assert; import java.util.Arrays; @@ -14,22 +15,26 @@ import java.util.List; */ public class FunctionCondition extends ConstantCondition implements Condition { + @Getter + private final RenderContext renderContext; + @Getter private final SimpleFunction function; private final StringBuilder builder = new StringBuilder(); - private FunctionCondition(SimpleFunction function) { + private FunctionCondition(RenderContext context, SimpleFunction function) { super(""); + this.renderContext = context; this.function = function; } - public static Condition of(String functionName, List args) { - return new FunctionCondition(SimpleFunction.create(functionName, args)); + public static Condition of(RenderContext context, String functionName, List args) { + return new FunctionCondition(context, SimpleFunction.create(functionName, args)); } - public static Condition of(String functionName, Expression... args) { - return of(functionName, Arrays.asList(args)); + public static Condition of(RenderContext context, String functionName, Expression... args) { + return of(context, functionName, Arrays.asList(args)); } @Override @@ -43,7 +48,7 @@ public class FunctionCondition extends ConstantCondition implements Condition { @Override public String toString() { - FunctionVisitor visitor = new FunctionVisitor(this, builder::append); + FunctionVisitor visitor = new FunctionVisitor(this, builder::append); this.visit(visitor); return builder.toString(); } diff --git a/flyfish-data/flyfish-data-r2dbc/src/main/java/org/springframework/data/relational/core/sql/render/FunctionVisitor.java b/flyfish-data/flyfish-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/FunctionVisitor.java similarity index 89% rename from flyfish-data/flyfish-data-r2dbc/src/main/java/org/springframework/data/relational/core/sql/render/FunctionVisitor.java rename to flyfish-data/flyfish-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/FunctionVisitor.java index 3fb1e13..a56a0bd 100644 --- a/flyfish-data/flyfish-data-r2dbc/src/main/java/org/springframework/data/relational/core/sql/render/FunctionVisitor.java +++ b/flyfish-data/flyfish-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/FunctionVisitor.java @@ -1,6 +1,5 @@ package org.springframework.data.relational.core.sql.render; -import org.springframework.data.r2dbc.core.PredefinedStatementMapper; import org.springframework.data.relational.core.sql.FunctionCondition; import org.springframework.data.relational.core.sql.SimpleFunction; import org.springframework.data.relational.core.sql.Visitable; @@ -8,6 +7,12 @@ import org.springframework.lang.Nullable; import java.util.function.Consumer; +/** + * 很高级的自定义函数访问器 + * + * @author wangyu + * 完全使用官方行为渲染,准确无误 + */ public class FunctionVisitor extends FilteredSubtreeVisitor { private final RenderContext context; @@ -17,7 +22,7 @@ public class FunctionVisitor extends FilteredSubtreeVisitor { public FunctionVisitor(FunctionCondition condition, Consumer target) { super(it -> it == condition); - this.context = PredefinedStatementMapper.sharedRenderContext(); + this.context = condition.getRenderContext(); this.target = target::accept; }