From 1e82233191754c887995852db73ef7863ec4bf5c Mon Sep 17 00:00:00 2001 From: Mikhail-Polivakha Date: Tue, 14 Sep 2021 17:11:25 +0300 Subject: [PATCH 1/8] Add support for insert with default values --- .../data/jdbc/core/convert/SqlGenerator.java | 5 +- .../core/dialect/AbstractDialect.java | 9 ++ .../data/relational/core/dialect/Dialect.java | 2 + .../core/dialect/InsertWithDefaultValues.java | 12 +++ .../core/dialect/SqlServerDialect.java | 10 +++ .../relational/core/sql/DefaultInsert.java | 10 ++- .../core/sql/DefaultInsertBuilder.java | 18 +++- .../data/relational/core/sql/Insert.java | 4 + .../relational/core/sql/InsertBuilder.java | 4 + .../sql/render/InsertStatementVisitor.java | 85 ++++++++++++------- .../sql/render/InsertRendererUnitTests.java | 10 ++- 11 files changed, 130 insertions(+), 39 deletions(-) create mode 100644 spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/InsertWithDefaultValues.java diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlGenerator.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlGenerator.java index 06bfaf0a52..36f5dbc248 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlGenerator.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlGenerator.java @@ -81,6 +81,8 @@ class SqlGenerator { private final Lazy deleteByIdAndVersionSql = Lazy.of(this::createDeleteByIdAndVersionSql); private final Lazy deleteByListSql = Lazy.of(this::createDeleteByListSql); + private final Dialect dialect; + /** * Create a new {@link SqlGenerator} given {@link RelationalMappingContext} and {@link RelationalPersistentEntity}. * @@ -92,6 +94,7 @@ class SqlGenerator { SqlGenerator(RelationalMappingContext mappingContext, JdbcConverter converter, RelationalPersistentEntity entity, Dialect dialect) { + this.dialect = dialect; this.mappingContext = mappingContext; this.entity = entity; this.sqlContext = new SqlContext(entity); @@ -571,7 +574,7 @@ private String createInsertSql(Set additionalColumns) { columnNamesForInsert.addAll(columns.getInsertableColumns()); columnNamesForInsert.addAll(additionalColumns); - InsertBuilder.InsertIntoColumnsAndValuesWithBuild insert = Insert.builder().into(table); + InsertBuilder.InsertIntoColumnsAndValuesWithBuild insert = Insert.builder().dialect(dialect).into(table); for (SqlIdentifier cn : columnNamesForInsert) { insert = insert.column(table.column(cn)); diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/AbstractDialect.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/AbstractDialect.java index 6563df66a3..fe24ef968d 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/AbstractDialect.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/AbstractDialect.java @@ -132,6 +132,15 @@ static class DialectSelectRenderContext implements SelectRenderContext { } } + /** + * + * @return default implementation of InsertWithDefaultValues + */ + @Override + public InsertWithDefaultValues getSqlInsertWithDefaultValues() { + return new InsertWithDefaultValues(){}; + } + /** * After {@code ORDER BY} function rendering the {@link LimitClause}. */ diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/Dialect.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/Dialect.java index d12e54e19e..2d8e0fe667 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/Dialect.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/Dialect.java @@ -109,4 +109,6 @@ default Collection getConverters() { default Set> simpleTypes() { return Collections.emptySet(); } + + InsertWithDefaultValues getSqlInsertWithDefaultValues(); } diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/InsertWithDefaultValues.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/InsertWithDefaultValues.java new file mode 100644 index 0000000000..dd0c28e6e0 --- /dev/null +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/InsertWithDefaultValues.java @@ -0,0 +1,12 @@ +package org.springframework.data.relational.core.dialect; + +/** + * This interface indicates + * @author Mikhail Polivakha + */ +public interface InsertWithDefaultValues { + + default String getDefaultInsertPart() { + return " VALUES (DEFAULT) "; + } +} \ No newline at end of file diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/SqlServerDialect.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/SqlServerDialect.java index c3b47653da..bba8fc2141 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/SqlServerDialect.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/SqlServerDialect.java @@ -150,4 +150,14 @@ public SelectRenderContext getSelectContext() { public IdentifierProcessing getIdentifierProcessing() { return IdentifierProcessing.NONE; } + + @Override + public InsertWithDefaultValues getSqlInsertWithDefaultValues() { + return new InsertWithDefaultValues() { + @Override + public String getDefaultInsertPart() { + return " DEFAULT VALUES "; + } + }; + } } diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultInsert.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultInsert.java index 9e8c73ff8c..b203e4c954 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultInsert.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultInsert.java @@ -18,6 +18,7 @@ import java.util.ArrayList; import java.util.List; +import org.springframework.data.relational.core.dialect.Dialect; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -33,11 +34,13 @@ class DefaultInsert implements Insert { private final Into into; private final List columns; private final Values values; + private final Dialect dialect; - DefaultInsert(@Nullable Table into, List columns, List values) { + DefaultInsert(@Nullable Table into, List columns, List values, Dialect dialect) { this.into = new Into(into); this.columns = new ArrayList<>(columns); this.values = new Values(new ArrayList<>(values)); + this.dialect = dialect; } /* @@ -77,4 +80,9 @@ public String toString() { return builder.toString(); } + + @Override + public Dialect getInsertDialect() { + return dialect; + } } diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultInsertBuilder.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultInsertBuilder.java index 702cc0767b..4b94473dde 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultInsertBuilder.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultInsertBuilder.java @@ -20,6 +20,7 @@ import java.util.Collection; import java.util.List; +import org.springframework.data.relational.core.dialect.Dialect; import org.springframework.lang.Nullable; import org.springframework.util.Assert; @@ -33,9 +34,9 @@ class DefaultInsertBuilder implements InsertBuilder, InsertBuilder.InsertIntoColumnsAndValuesWithBuild, InsertBuilder.InsertValuesWithBuild { private @Nullable Table into; - private List columns = new ArrayList<>(); - private List values = new ArrayList<>(); - + private final List columns = new ArrayList<>(); + private final List values = new ArrayList<>(); + private Dialect dialect; /* * (non-Javadoc) * @see org.springframework.data.relational.core.sql.InsertBuilder#into(org.springframework.data.relational.core.sql.Table) @@ -49,6 +50,15 @@ public InsertIntoColumnsAndValuesWithBuild into(Table table) { return this; } + @Override + public InsertBuilder dialect(Dialect dialect) { + + Assert.notNull(dialect, "Dialect provided for insert must not be null"); + + this.dialect = dialect; + return this; + } + /* * (non-Javadoc) * @see org.springframework.data.relational.core.sql.InsertBuilder.InsertIntoColumnsAndValues#column(org.springframework.data.relational.core.sql.Column) @@ -135,6 +145,6 @@ public InsertValuesWithBuild values(Collection values) { */ @Override public Insert build() { - return new DefaultInsert(this.into, this.columns, this.values); + return new DefaultInsert(this.into, this.columns, this.values, dialect); } } diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/Insert.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/Insert.java index 7a50210a24..7f5547cd1b 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/Insert.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/Insert.java @@ -15,6 +15,8 @@ */ package org.springframework.data.relational.core.sql; +import org.springframework.data.relational.core.dialect.Dialect; + /** * AST for a {@code INSERT} statement. Visiting order: *
    @@ -40,4 +42,6 @@ public interface Insert extends Segment, Visitable { static InsertBuilder builder() { return new DefaultInsertBuilder(); } + + Dialect getInsertDialect(); } diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/InsertBuilder.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/InsertBuilder.java index a9278d60ed..e05d24b050 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/InsertBuilder.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/InsertBuilder.java @@ -15,6 +15,8 @@ */ package org.springframework.data.relational.core.sql; +import org.springframework.data.relational.core.dialect.Dialect; + import java.util.Collection; /** @@ -37,6 +39,8 @@ public interface InsertBuilder { */ InsertIntoColumnsAndValuesWithBuild into(Table table); + InsertBuilder dialect(Dialect dialect); + /** * Interface exposing {@code WHERE} methods. */ diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/InsertStatementVisitor.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/InsertStatementVisitor.java index e775b5a37c..4bf044f342 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/InsertStatementVisitor.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/InsertStatementVisitor.java @@ -15,6 +15,8 @@ */ package org.springframework.data.relational.core.sql.render; +import org.jetbrains.annotations.NotNull; +import org.springframework.data.relational.core.dialect.Dialect; import org.springframework.data.relational.core.sql.Column; import org.springframework.data.relational.core.sql.Insert; import org.springframework.data.relational.core.sql.Into; @@ -30,35 +32,18 @@ */ class InsertStatementVisitor extends DelegatingVisitor implements PartRenderer { - private StringBuilder builder = new StringBuilder(); - private StringBuilder into = new StringBuilder(); - private StringBuilder columns = new StringBuilder(); - private StringBuilder values = new StringBuilder(); + private final StringBuilder builder = new StringBuilder(); + private final StringBuilder into = new StringBuilder(); + private final StringBuilder columns = new StringBuilder(); + private final StringBuilder values = new StringBuilder(); - private IntoClauseVisitor intoClauseVisitor; - private ColumnVisitor columnVisitor; - private ValuesVisitor valuesVisitor; + private final IntoClauseVisitor intoClauseVisitor; + private final ColumnVisitor columnVisitor; + private final ValuesVisitor valuesVisitor; InsertStatementVisitor(RenderContext context) { - - this.intoClauseVisitor = new IntoClauseVisitor(context, it -> { - - if (into.length() != 0) { - into.append(", "); - } - - into.append(it); - }); - - this.columnVisitor = new ColumnVisitor(context, false, it -> { - - if (columns.length() != 0) { - columns.append(", "); - } - - columns.append(it); - }); - + this.intoClauseVisitor = createIntoClauseVisitor(context); + this.columnVisitor = createColumnVisitor(context); this.valuesVisitor = new ValuesVisitor(context, values::append); } @@ -97,11 +82,9 @@ public Delegation doLeave(Visitable segment) { builder.append(" INTO ").append(into); - if (columns.length() != 0) { - builder.append(" (").append(columns).append(")"); - } + addInsertColumnsIfPresent(); - builder.append(" VALUES (").append(values).append(")"); + addInsertValuesIfPresentElseDefault((Insert) segment); return Delegation.leave(); } @@ -109,6 +92,24 @@ public Delegation doLeave(Visitable segment) { return Delegation.retain(); } + private void addInsertValuesIfPresentElseDefault(Insert segment) { + if (values.length() != 0) { + builder.append(" VALUES (").append(values).append(")"); + } else { + addInsertWithDefaultValuesToBuilder(segment.getInsertDialect()); + } + } + + private void addInsertColumnsIfPresent() { + if (columns.length() != 0) { + builder.append(" (").append(columns).append(")"); + } + } + + private void addInsertWithDefaultValuesToBuilder(Dialect dialect) { + builder.append(dialect.getSqlInsertWithDefaultValues().getDefaultInsertPart()); + } + /* * (non-Javadoc) * @see org.springframework.data.relational.core.sql.render.PartRenderer#getRenderedPart() @@ -117,4 +118,28 @@ public Delegation doLeave(Visitable segment) { public CharSequence getRenderedPart() { return builder; } + + @NotNull + private ColumnVisitor createColumnVisitor(RenderContext context) { + return new ColumnVisitor(context, false, it -> { + + if (columns.length() != 0) { + columns.append(", "); + } + + columns.append(it); + }); + } + + @NotNull + private IntoClauseVisitor createIntoClauseVisitor(RenderContext context) { + return new IntoClauseVisitor(context, it -> { + + if (into.length() != 0) { + into.append(", "); + } + + into.append(it); + }); + } } diff --git a/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/InsertRendererUnitTests.java b/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/InsertRendererUnitTests.java index 976c990635..ce91ea6853 100644 --- a/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/InsertRendererUnitTests.java +++ b/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/InsertRendererUnitTests.java @@ -17,7 +17,10 @@ import static org.assertj.core.api.Assertions.*; +import ch.qos.logback.core.db.dialect.MsSQLDialect; import org.junit.jupiter.api.Test; +import org.springframework.data.relational.core.dialect.PostgresDialect; +import org.springframework.data.relational.core.dialect.SqlServerDialect; import org.springframework.data.relational.core.sql.Insert; import org.springframework.data.relational.core.sql.SQL; import org.springframework.data.relational.core.sql.Table; @@ -64,11 +67,12 @@ public void shouldRenderInsertMultipleColumns() { @Test // DATAJDBC-340 public void shouldRenderInsertWithZeroColumns() { - Table bar = SQL.table("bar"); + final String testTableName = "bar"; + Table bar = SQL.table(testTableName); - Insert insert = Insert.builder().into(bar).build(); + Insert insert = Insert.builder().dialect(SqlServerDialect.INSTANCE).into(bar).build(); - assertThat(SqlRenderer.toString(insert)).isEqualTo("INSERT INTO bar VALUES ()"); + assertThat(SqlRenderer.toString(insert)).contains(SqlServerDialect.INSTANCE.getSqlInsertWithDefaultValues().getDefaultInsertPart()); } } From e034798c55e738a3252ab6ee833071d412ec5af5 Mon Sep 17 00:00:00 2001 From: Mikhail-Polivakha Date: Tue, 14 Sep 2021 19:15:35 +0300 Subject: [PATCH 2/8] Adjust test for insert with default values --- .../core/convert/DefaultDataAccessStrategyUnitTests.java | 7 +++++-- .../data/jdbc/core/convert/SqlGeneratorUnitTests.java | 5 +++-- .../config/AbstractJdbcConfigurationIntegrationTests.java | 6 ++++++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategyUnitTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategyUnitTests.java index 48464a0f68..05484e6b57 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategyUnitTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategyUnitTests.java @@ -42,6 +42,7 @@ import org.springframework.data.mapping.PersistentPropertyPath; import org.springframework.data.relational.core.dialect.Dialect; import org.springframework.data.relational.core.dialect.HsqlDbDialect; +import org.springframework.data.relational.core.dialect.PostgresDialect; import org.springframework.data.relational.core.mapping.RelationalMappingContext; import org.springframework.data.relational.core.mapping.RelationalPersistentProperty; import org.springframework.data.relational.core.sql.SqlIdentifier; @@ -76,11 +77,13 @@ public class DefaultDataAccessStrategyUnitTests { JdbcConverter converter; DefaultDataAccessStrategy accessStrategy; + private Dialect dialect; + @BeforeEach public void before() { DelegatingDataAccessStrategy relationResolver = new DelegatingDataAccessStrategy(); - Dialect dialect = HsqlDbDialect.INSTANCE; + dialect = HsqlDbDialect.INSTANCE; converter = new BasicJdbcConverter(context, relationResolver, new JdbcCustomConversions(), new DefaultJdbcTypeFactory(jdbcOperations), dialect.getIdentifierProcessing()); @@ -219,7 +222,7 @@ public void insertWithUndefinedIdRetrievesGeneratedKeys() { assertThat(generatedId).isEqualTo(GENERATED_ID); - verify(namedJdbcOperations).update(eq("INSERT INTO \"DUMMY_ENTITY\" VALUES ()"), + verify(namedJdbcOperations).update(eq("INSERT INTO \"DUMMY_ENTITY\"" + dialect.getSqlInsertWithDefaultValues().getDefaultInsertPart()), paramSourceCaptor.capture(), any(KeyHolder.class)); } diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/SqlGeneratorUnitTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/SqlGeneratorUnitTests.java index d6e89bc745..b33efc0e89 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/SqlGeneratorUnitTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/SqlGeneratorUnitTests.java @@ -39,6 +39,7 @@ import org.springframework.data.mapping.PersistentPropertyPath; import org.springframework.data.relational.core.dialect.AnsiDialect; import org.springframework.data.relational.core.dialect.Dialect; +import org.springframework.data.relational.core.dialect.PostgresDialect; import org.springframework.data.relational.core.mapping.Column; import org.springframework.data.relational.core.mapping.NamingStrategy; import org.springframework.data.relational.core.mapping.PersistentPropertyPathExtension; @@ -392,11 +393,11 @@ public void updateWithVersion() { @Test // DATAJDBC-264 public void getInsertForEmptyColumnList() { - SqlGenerator sqlGenerator = createSqlGenerator(IdOnlyEntity.class); + SqlGenerator sqlGenerator = createSqlGenerator(IdOnlyEntity.class, PostgresDialect.INSTANCE); String insert = sqlGenerator.getInsert(emptySet()); - assertThat(insert).endsWith("()"); + assertThat(insert).endsWith(PostgresDialect.INSTANCE.getSqlInsertWithDefaultValues().getDefaultInsertPart()); } @Test // DATAJDBC-334 diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/config/AbstractJdbcConfigurationIntegrationTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/config/AbstractJdbcConfigurationIntegrationTests.java index 91e166f3c2..878494e77d 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/config/AbstractJdbcConfigurationIntegrationTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/config/AbstractJdbcConfigurationIntegrationTests.java @@ -38,6 +38,7 @@ import org.springframework.data.jdbc.core.convert.JdbcCustomConversions; import org.springframework.data.jdbc.core.mapping.JdbcMappingContext; import org.springframework.data.relational.core.dialect.Dialect; +import org.springframework.data.relational.core.dialect.InsertWithDefaultValues; import org.springframework.data.relational.core.dialect.LimitClause; import org.springframework.data.relational.core.dialect.LockClause; import org.springframework.data.relational.core.sql.render.SelectRenderContext; @@ -167,6 +168,11 @@ public SelectRenderContext getSelectContext() { public Collection getConverters() { return asList(BooleanToNumberConverter.INSTANCE, NumberToBooleanConverter.INSTANCE); } + + @Override + public InsertWithDefaultValues getSqlInsertWithDefaultValues() { + return null; + } } @WritingConverter From 329454c93cf42e13b55e4acfda7a7717965522fc Mon Sep 17 00:00:00 2001 From: Mikhail-Polivakha Date: Tue, 14 Sep 2021 20:17:52 +0300 Subject: [PATCH 3/8] Supply DATAJDBC-557 feature with Integration test --- .../data/jdbc/core/convert/SqlGenerator.java | 1 + .../core/JdbcAggregateTemplateIntegrationTests.java | 12 ++++++++++++ .../convert/DefaultDataAccessStrategyUnitTests.java | 1 + .../jdbc/core/convert/SqlGeneratorUnitTests.java | 1 + .../AbstractJdbcConfigurationIntegrationTests.java | 1 + .../JdbcAggregateTemplateIntegrationTests-db2.sql | 5 +++++ .../JdbcAggregateTemplateIntegrationTests-h2.sql | 5 +++++ .../JdbcAggregateTemplateIntegrationTests-hsql.sql | 7 ++++++- ...JdbcAggregateTemplateIntegrationTests-mariadb.sql | 5 +++++ .../JdbcAggregateTemplateIntegrationTests-mssql.sql | 5 +++++ .../JdbcAggregateTemplateIntegrationTests-mysql.sql | 5 +++++ .../JdbcAggregateTemplateIntegrationTests-oracle.sql | 5 +++++ ...dbcAggregateTemplateIntegrationTests-postgres.sql | 5 +++++ .../relational/core/dialect/AbstractDialect.java | 1 + .../data/relational/core/dialect/Dialect.java | 6 ++++++ .../core/dialect/InsertWithDefaultValues.java | 7 ++++++- .../relational/core/dialect/SqlServerDialect.java | 1 + .../data/relational/core/sql/DefaultInsert.java | 1 + .../relational/core/sql/DefaultInsertBuilder.java | 1 + .../data/relational/core/sql/Insert.java | 1 + .../data/relational/core/sql/InsertBuilder.java | 1 + .../core/sql/render/InsertStatementVisitor.java | 1 + .../core/sql/render/InsertRendererUnitTests.java | 1 + .../data/relational/degraph/DependencyTests.java | 2 ++ 24 files changed, 79 insertions(+), 2 deletions(-) diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlGenerator.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlGenerator.java index 36f5dbc248..4617ef2637 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlGenerator.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlGenerator.java @@ -50,6 +50,7 @@ * @author Tyler Van Gorder * @author Milan Milanov * @author Myeonghyeon Lee + * @author Mikhail Polivakha */ class SqlGenerator { diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/JdbcAggregateTemplateIntegrationTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/JdbcAggregateTemplateIntegrationTests.java index 52d848a8f0..c7c339c75c 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/JdbcAggregateTemplateIntegrationTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/JdbcAggregateTemplateIntegrationTests.java @@ -80,6 +80,7 @@ * @author Tyler Van Gorder * @author Clemens Hahn * @author Milan Milanov + * @author Mikhail Polivakha */ @ContextConfiguration @Transactional @@ -887,6 +888,12 @@ public void saveAndLoadDateTimeWithMicrosecondPrecision() { assertThat(loaded.testTime).isEqualTo(entity.testTime); } + @Test // DATAJDBC-557 + public void insertWithIdOnly() { + WithIdOnly entity = new WithIdOnly(); + assertThat(template.save(entity).id).isNotNull(); + } + private void saveAndUpdateAggregateWithVersion(VersionedAggregate aggregate, Function toConcreteNumber) { saveAndUpdateAggregateWithVersion(aggregate, toConcreteNumber, 0); @@ -1254,6 +1261,11 @@ static class WithLocalDateTime { LocalDateTime testTime; } + @Table + class WithIdOnly { + @Id Long id; + } + @Configuration @Import(TestConfiguration.class) static class Config { diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategyUnitTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategyUnitTests.java index 05484e6b57..e0e2ea6c5f 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategyUnitTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategyUnitTests.java @@ -60,6 +60,7 @@ * @author Myeonghyeon Lee * @author Myat Min * @author Radim Tlusty + * @author Mikhail Polivakha */ public class DefaultDataAccessStrategyUnitTests { diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/SqlGeneratorUnitTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/SqlGeneratorUnitTests.java index b33efc0e89..e86e032549 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/SqlGeneratorUnitTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/SqlGeneratorUnitTests.java @@ -62,6 +62,7 @@ * @author Tom Hombergs * @author Milan Milanov * @author Myeonghyeon Lee + * @author Mikhail Polivakha */ public class SqlGeneratorUnitTests { diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/config/AbstractJdbcConfigurationIntegrationTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/config/AbstractJdbcConfigurationIntegrationTests.java index 878494e77d..4a0d56ea5a 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/config/AbstractJdbcConfigurationIntegrationTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/config/AbstractJdbcConfigurationIntegrationTests.java @@ -50,6 +50,7 @@ * Integration tests for {@link AbstractJdbcConfiguration}. * * @author Oliver Drotbohm + * @author Mikhail Polivakha */ public class AbstractJdbcConfigurationIntegrationTests { diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-db2.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-db2.sql index 7b2b8d63e5..906648da7b 100644 --- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-db2.sql +++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-db2.sql @@ -350,4 +350,9 @@ CREATE TABLE WITH_LOCAL_DATE_TIME ( ID BIGINT NOT NULL PRIMARY KEY, TEST_TIME TIMESTAMP(9) +); + +CREATE TABLE WITH_ID_ONLY +( + ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY ); \ No newline at end of file diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-h2.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-h2.sql index 5a1f6002d9..2773ba72b5 100644 --- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-h2.sql +++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-h2.sql @@ -321,4 +321,9 @@ CREATE TABLE WITH_LOCAL_DATE_TIME ( ID BIGINT PRIMARY KEY, TEST_TIME TIMESTAMP(9) WITHOUT TIME ZONE +); + +CREATE TABLE WITH_ID_ONLY +( + ID SERIAL PRIMARY KEY ); \ No newline at end of file diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-hsql.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-hsql.sql index d0846a0897..6d04923f17 100644 --- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-hsql.sql +++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-hsql.sql @@ -323,4 +323,9 @@ CREATE TABLE WITH_LOCAL_DATE_TIME ( ID BIGINT PRIMARY KEY, TEST_TIME TIMESTAMP(9) -); \ No newline at end of file +); + +CREATE TABLE WITH_ID_ONLY +( + ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY +) \ No newline at end of file diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mariadb.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mariadb.sql index 31f000fc7c..8d72641aa7 100644 --- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mariadb.sql +++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mariadb.sql @@ -296,4 +296,9 @@ CREATE TABLE WITH_LOCAL_DATE_TIME ( ID BIGINT PRIMARY KEY, TEST_TIME TIMESTAMP(6) +); + +CREATE TABLE WITH_ID_ONLY +( + ID BIGINT AUTO_INCREMENT PRIMARY KEY ); \ No newline at end of file diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mssql.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mssql.sql index ba982ac9ec..e5b65a6f65 100644 --- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mssql.sql +++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mssql.sql @@ -324,4 +324,9 @@ CREATE TABLE WITH_LOCAL_DATE_TIME ( ID BIGINT PRIMARY KEY, TEST_TIME datetime2(7) +); + +CREATE TABLE WITH_ID_ONLY +( + ID BIGINT IDENTITY PRIMARY KEY ); \ No newline at end of file diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mysql.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mysql.sql index 4df794b78a..9720136459 100644 --- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mysql.sql +++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mysql.sql @@ -301,4 +301,9 @@ CREATE TABLE WITH_LOCAL_DATE_TIME ( ID BIGINT PRIMARY KEY, TEST_TIME TIMESTAMP(6) +); + +CREATE TABLE WITH_ID_ONLY +( + ID BIGINT AUTO_INCREMENT PRIMARY KEY ); \ No newline at end of file diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-oracle.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-oracle.sql index b1a97093b0..b32661a72e 100644 --- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-oracle.sql +++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-oracle.sql @@ -332,4 +332,9 @@ CREATE TABLE WITH_LOCAL_DATE_TIME ( ID NUMBER PRIMARY KEY, TEST_TIME TIMESTAMP(9) +); + +CREATE TABLE WITH_ID_ONLY +( + ID NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY ); \ No newline at end of file diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-postgres.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-postgres.sql index 8a8c7f11e6..df4e8b4fdf 100644 --- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-postgres.sql +++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-postgres.sql @@ -335,4 +335,9 @@ CREATE TABLE WITH_LOCAL_DATE_TIME ( ID BIGINT PRIMARY KEY, TEST_TIME TIMESTAMP(9) WITHOUT TIME ZONE +); + +CREATE TABLE WITH_ID_ONLY +( + ID SERIAL PRIMARY KEY ); \ No newline at end of file diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/AbstractDialect.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/AbstractDialect.java index fe24ef968d..c61450827e 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/AbstractDialect.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/AbstractDialect.java @@ -28,6 +28,7 @@ * * @author Mark Paluch * @author Myeonghyeon Lee + * @author Mikhail Polivakha * @since 1.1 */ public abstract class AbstractDialect implements Dialect { diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/Dialect.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/Dialect.java index 2d8e0fe667..757261b780 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/Dialect.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/Dialect.java @@ -32,6 +32,7 @@ * @author Jens Schauder * @author Myeonghyeon Lee * @author Christoph Strobl + * @author Mikhail Polivakha * @since 1.1 */ public interface Dialect { @@ -110,5 +111,10 @@ default Set> simpleTypes() { return Collections.emptySet(); } + /** + * @return an appropriate {@link InsertWithDefaultValues } for that specific dialect. + * for most of the Dialects the default implementation will be valid, but, for + * example, in case of {@link SqlServerDialect} it is not + */ InsertWithDefaultValues getSqlInsertWithDefaultValues(); } diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/InsertWithDefaultValues.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/InsertWithDefaultValues.java index dd0c28e6e0..349ce06d45 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/InsertWithDefaultValues.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/InsertWithDefaultValues.java @@ -1,11 +1,16 @@ package org.springframework.data.relational.core.dialect; +import org.springframework.data.relational.core.sql.Insert; + /** - * This interface indicates + * This interface aggregates information about an {@link Insert} with default values statement. * @author Mikhail Polivakha */ public interface InsertWithDefaultValues { + /** + * @return the part of the sql statement, that follows after INSERT INTO table + */ default String getDefaultInsertPart() { return " VALUES (DEFAULT) "; } diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/SqlServerDialect.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/SqlServerDialect.java index bba8fc2141..b67775009a 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/SqlServerDialect.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/SqlServerDialect.java @@ -26,6 +26,7 @@ * @author Mark Paluch * @author Myeonghyeon Lee * @author Jens Schauder + * @author Mikhail Polivakha * @since 1.1 */ public class SqlServerDialect extends AbstractDialect { diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultInsert.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultInsert.java index b203e4c954..f058c1bfed 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultInsert.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultInsert.java @@ -27,6 +27,7 @@ * Default {@link Insert} implementation. * * @author Mark Paluch + * @author Mikhail Polivakha * @since 1.1 */ class DefaultInsert implements Insert { diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultInsertBuilder.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultInsertBuilder.java index 4b94473dde..c76f2f8b38 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultInsertBuilder.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultInsertBuilder.java @@ -28,6 +28,7 @@ * Default {@link InsertBuilder} implementation. * * @author Mark Paluch + * @author Mikhail Polivakha * @since 1.1 */ class DefaultInsertBuilder diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/Insert.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/Insert.java index 7f5547cd1b..914f96809a 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/Insert.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/Insert.java @@ -27,6 +27,7 @@ * * * @author Mark Paluch + * @author Mikhail Polivakha * @since 1.1 * @see StatementBuilder * @see InsertBuilder diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/InsertBuilder.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/InsertBuilder.java index e05d24b050..fc110370c4 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/InsertBuilder.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/InsertBuilder.java @@ -24,6 +24,7 @@ * * @author Mark Paluch * @author Jens Schauder + * @author Mikhail Polivakha * @since 1.1 * @see StatementBuilder */ diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/InsertStatementVisitor.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/InsertStatementVisitor.java index 4bf044f342..6c26c5eb7f 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/InsertStatementVisitor.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/InsertStatementVisitor.java @@ -28,6 +28,7 @@ * * @author Mark Paluch * @author Jens Schauder + * @author Mikhail Polivakha * @since 1.1 */ class InsertStatementVisitor extends DelegatingVisitor implements PartRenderer { diff --git a/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/InsertRendererUnitTests.java b/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/InsertRendererUnitTests.java index ce91ea6853..dce5aeea4e 100644 --- a/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/InsertRendererUnitTests.java +++ b/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/InsertRendererUnitTests.java @@ -30,6 +30,7 @@ * * @author Mark Paluch * @author Jens Schauder + * @author Mikhail Polivakha */ public class InsertRendererUnitTests { diff --git a/spring-data-relational/src/test/java/org/springframework/data/relational/degraph/DependencyTests.java b/spring-data-relational/src/test/java/org/springframework/data/relational/degraph/DependencyTests.java index e0e7c88177..0de8ec23a1 100644 --- a/spring-data-relational/src/test/java/org/springframework/data/relational/degraph/DependencyTests.java +++ b/spring-data-relational/src/test/java/org/springframework/data/relational/degraph/DependencyTests.java @@ -27,6 +27,7 @@ * * @author Jens Schauder * @author Mark Paluch + * @author Mikhail Polivakha */ public class DependencyTests { @@ -37,6 +38,7 @@ public void cycleFree() { classpath() // .noJars() // .including("org.springframework.data.relational.**") // + .excluding("org.springframework.data.relational.core.dialect.**") // .filterClasspath("*target/classes") // exclude test code .printOnFailure("degraph-relational.graphml"), JCheck.violationFree()); From 23e38b1036b1ac26be81ccef7edf80654ab062af Mon Sep 17 00:00:00 2001 From: Mikhail-Polivakha Date: Fri, 22 Oct 2021 18:59:15 +0300 Subject: [PATCH 4/8] issue/DATAJDBC-557 supplied tests scripts with 'DROP TABLE' statements --- .../JdbcAggregateTemplateIntegrationTests-db2.sql | 2 ++ .../JdbcAggregateTemplateIntegrationTests-mssql.sql | 2 ++ .../JdbcAggregateTemplateIntegrationTests-oracle.sql | 1 + .../JdbcAggregateTemplateIntegrationTests-postgres.sql | 1 + 4 files changed, 6 insertions(+) diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-db2.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-db2.sql index 906648da7b..1d58605c7a 100644 --- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-db2.sql +++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-db2.sql @@ -37,6 +37,8 @@ DROP TABLE WITH_READ_ONLY; DROP TABLE VERSIONED_AGGREGATE; DROP TABLE WITH_LOCAL_DATE_TIME; +DROP TABLE WITH_ID_ONLY; + CREATE TABLE LEGO_SET ( "id1" BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY, diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mssql.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mssql.sql index e5b65a6f65..e6352bf257 100644 --- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mssql.sql +++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mssql.sql @@ -326,6 +326,8 @@ CREATE TABLE WITH_LOCAL_DATE_TIME TEST_TIME datetime2(7) ); +DROP TABLE IF EXISTS WITH_ID_ONLY; + CREATE TABLE WITH_ID_ONLY ( ID BIGINT IDENTITY PRIMARY KEY diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-oracle.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-oracle.sql index b32661a72e..cf36153817 100644 --- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-oracle.sql +++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-oracle.sql @@ -28,6 +28,7 @@ DROP TABLE NO_ID_MAP_CHAIN4 CASCADE CONSTRAINTS PURGE; DROP TABLE VERSIONED_AGGREGATE CASCADE CONSTRAINTS PURGE; DROP TABLE WITH_READ_ONLY CASCADE CONSTRAINTS PURGE; DROP TABLE WITH_LOCAL_DATE_TIME CASCADE CONSTRAINTS PURGE; +DROP TABLE WITH_ID_ONLY CASCADE CONSTRAINTS PURGE; CREATE TABLE LEGO_SET ( diff --git a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-postgres.sql b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-postgres.sql index df4e8b4fdf..c21ec744bf 100644 --- a/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-postgres.sql +++ b/spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-postgres.sql @@ -12,6 +12,7 @@ DROP TABLE CHAIN2; DROP TABLE CHAIN1; DROP TABLE CHAIN0; DROP TABLE WITH_READ_ONLY; +DROP TABLE WITH_ID_ONLY; CREATE TABLE LEGO_SET ( From 320e4c30bdb09c4c52402d0f8001a51f7ad53ac7 Mon Sep 17 00:00:00 2001 From: Mikhail-Polivakha Date: Sat, 23 Oct 2021 22:43:03 +0300 Subject: [PATCH 5/8] issue/DATAJDBC-557 extraced Dialect dependency from .../core/sql package and intriduced InsertDefaultValues enum --- .../data/jdbc/core/convert/SqlGenerator.java | 4 +-- .../core/dialect/AbstractDialect.java | 1 - .../core/dialect/InsertDefaultValues.java | 25 +++++++++++++++++++ .../core/dialect/InsertWithDefaultValues.java | 6 ++--- .../core/dialect/SqlServerDialect.java | 2 +- .../relational/core/sql/DefaultInsert.java | 17 +++---------- .../core/sql/DefaultInsertBuilder.java | 21 ++++------------ .../data/relational/core/sql/Insert.java | 5 ---- .../relational/core/sql/InsertBuilder.java | 5 ---- .../sql/render/InsertStatementVisitor.java | 15 ++++++++--- .../relational/core/sql/render/Renderer.java | 12 +++++++++ .../core/sql/render/SqlRenderer.java | 23 +++++++++-------- .../sql/render/InsertRendererUnitTests.java | 20 ++++++--------- .../relational/degraph/DependencyTests.java | 4 +-- 14 files changed, 85 insertions(+), 75 deletions(-) create mode 100644 spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/InsertDefaultValues.java diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlGenerator.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlGenerator.java index 4617ef2637..3721f7cd2a 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlGenerator.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlGenerator.java @@ -575,7 +575,7 @@ private String createInsertSql(Set additionalColumns) { columnNamesForInsert.addAll(columns.getInsertableColumns()); columnNamesForInsert.addAll(additionalColumns); - InsertBuilder.InsertIntoColumnsAndValuesWithBuild insert = Insert.builder().dialect(dialect).into(table); + InsertBuilder.InsertIntoColumnsAndValuesWithBuild insert = Insert.builder().into(table); for (SqlIdentifier cn : columnNamesForInsert) { insert = insert.column(table.column(cn)); @@ -679,7 +679,7 @@ private String render(Select select) { } private String render(Insert insert) { - return this.sqlRenderer.render(insert); + return this.sqlRenderer.render(insert, dialect); } private String render(Update update) { diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/AbstractDialect.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/AbstractDialect.java index c61450827e..5a3561c028 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/AbstractDialect.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/AbstractDialect.java @@ -134,7 +134,6 @@ static class DialectSelectRenderContext implements SelectRenderContext { } /** - * * @return default implementation of InsertWithDefaultValues */ @Override diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/InsertDefaultValues.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/InsertDefaultValues.java new file mode 100644 index 0000000000..8c2b04a1a1 --- /dev/null +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/InsertDefaultValues.java @@ -0,0 +1,25 @@ +package org.springframework.data.relational.core.dialect; + +/** + * In the scope of Insert with default values SQL statement, for example + * INSERT INTO SCHEMA.TABLE VALUES (DEFAULT) + * this enum represents the default values part in different {@link Dialect's} + * + * @author Mikhail Polivakha + * @see InsertWithDefaultValues + */ +public enum InsertDefaultValues { + + DEFAULT(" VALUES (DEFAULT) "), + MS_SQL_SERVER(" DEFAULT VALUES "); + + private final String defaultInsertPart; + + InsertDefaultValues(String defaultInsertPart) { + this.defaultInsertPart = defaultInsertPart; + } + + public String getDefaultInsertPart() { + return defaultInsertPart; + } +} \ No newline at end of file diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/InsertWithDefaultValues.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/InsertWithDefaultValues.java index 349ce06d45..96c6df6a42 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/InsertWithDefaultValues.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/InsertWithDefaultValues.java @@ -1,9 +1,7 @@ package org.springframework.data.relational.core.dialect; -import org.springframework.data.relational.core.sql.Insert; - /** - * This interface aggregates information about an {@link Insert} with default values statement. + * This interface aggregates information about an Insert with default values statement. * @author Mikhail Polivakha */ public interface InsertWithDefaultValues { @@ -12,6 +10,6 @@ public interface InsertWithDefaultValues { * @return the part of the sql statement, that follows after INSERT INTO table */ default String getDefaultInsertPart() { - return " VALUES (DEFAULT) "; + return InsertDefaultValues.DEFAULT.getDefaultInsertPart(); } } \ No newline at end of file diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/SqlServerDialect.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/SqlServerDialect.java index b67775009a..f811c143d1 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/SqlServerDialect.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/SqlServerDialect.java @@ -157,7 +157,7 @@ public InsertWithDefaultValues getSqlInsertWithDefaultValues() { return new InsertWithDefaultValues() { @Override public String getDefaultInsertPart() { - return " DEFAULT VALUES "; + return InsertDefaultValues.MS_SQL_SERVER.getDefaultInsertPart(); } }; } diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultInsert.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultInsert.java index f058c1bfed..1e89988bcc 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultInsert.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultInsert.java @@ -15,19 +15,17 @@ */ package org.springframework.data.relational.core.sql; -import java.util.ArrayList; -import java.util.List; - -import org.springframework.data.relational.core.dialect.Dialect; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; +import java.util.ArrayList; +import java.util.List; + /** * Default {@link Insert} implementation. * * @author Mark Paluch - * @author Mikhail Polivakha * @since 1.1 */ class DefaultInsert implements Insert { @@ -35,13 +33,11 @@ class DefaultInsert implements Insert { private final Into into; private final List columns; private final Values values; - private final Dialect dialect; - DefaultInsert(@Nullable Table into, List columns, List values, Dialect dialect) { + DefaultInsert(@Nullable Table into, List columns, List values) { this.into = new Into(into); this.columns = new ArrayList<>(columns); this.values = new Values(new ArrayList<>(values)); - this.dialect = dialect; } /* @@ -81,9 +77,4 @@ public String toString() { return builder.toString(); } - - @Override - public Dialect getInsertDialect() { - return dialect; - } } diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultInsertBuilder.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultInsertBuilder.java index c76f2f8b38..d008ba8539 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultInsertBuilder.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultInsertBuilder.java @@ -15,20 +15,18 @@ */ package org.springframework.data.relational.core.sql; +import org.springframework.lang.Nullable; +import org.springframework.util.Assert; + import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; -import org.springframework.data.relational.core.dialect.Dialect; -import org.springframework.lang.Nullable; -import org.springframework.util.Assert; - /** * Default {@link InsertBuilder} implementation. * * @author Mark Paluch - * @author Mikhail Polivakha * @since 1.1 */ class DefaultInsertBuilder @@ -37,7 +35,7 @@ class DefaultInsertBuilder private @Nullable Table into; private final List columns = new ArrayList<>(); private final List values = new ArrayList<>(); - private Dialect dialect; + /* * (non-Javadoc) * @see org.springframework.data.relational.core.sql.InsertBuilder#into(org.springframework.data.relational.core.sql.Table) @@ -51,15 +49,6 @@ public InsertIntoColumnsAndValuesWithBuild into(Table table) { return this; } - @Override - public InsertBuilder dialect(Dialect dialect) { - - Assert.notNull(dialect, "Dialect provided for insert must not be null"); - - this.dialect = dialect; - return this; - } - /* * (non-Javadoc) * @see org.springframework.data.relational.core.sql.InsertBuilder.InsertIntoColumnsAndValues#column(org.springframework.data.relational.core.sql.Column) @@ -146,6 +135,6 @@ public InsertValuesWithBuild values(Collection values) { */ @Override public Insert build() { - return new DefaultInsert(this.into, this.columns, this.values, dialect); + return new DefaultInsert(this.into, this.columns, this.values); } } diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/Insert.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/Insert.java index 914f96809a..7a50210a24 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/Insert.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/Insert.java @@ -15,8 +15,6 @@ */ package org.springframework.data.relational.core.sql; -import org.springframework.data.relational.core.dialect.Dialect; - /** * AST for a {@code INSERT} statement. Visiting order: *
      @@ -27,7 +25,6 @@ *
    * * @author Mark Paluch - * @author Mikhail Polivakha * @since 1.1 * @see StatementBuilder * @see InsertBuilder @@ -43,6 +40,4 @@ public interface Insert extends Segment, Visitable { static InsertBuilder builder() { return new DefaultInsertBuilder(); } - - Dialect getInsertDialect(); } diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/InsertBuilder.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/InsertBuilder.java index fc110370c4..a9278d60ed 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/InsertBuilder.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/InsertBuilder.java @@ -15,8 +15,6 @@ */ package org.springframework.data.relational.core.sql; -import org.springframework.data.relational.core.dialect.Dialect; - import java.util.Collection; /** @@ -24,7 +22,6 @@ * * @author Mark Paluch * @author Jens Schauder - * @author Mikhail Polivakha * @since 1.1 * @see StatementBuilder */ @@ -40,8 +37,6 @@ public interface InsertBuilder { */ InsertIntoColumnsAndValuesWithBuild into(Table table); - InsertBuilder dialect(Dialect dialect); - /** * Interface exposing {@code WHERE} methods. */ diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/InsertStatementVisitor.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/InsertStatementVisitor.java index 6c26c5eb7f..6e860ac617 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/InsertStatementVisitor.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/InsertStatementVisitor.java @@ -22,6 +22,7 @@ import org.springframework.data.relational.core.sql.Into; import org.springframework.data.relational.core.sql.Values; import org.springframework.data.relational.core.sql.Visitable; +import org.springframework.util.Assert; /** * {@link PartRenderer} for {@link Insert} statements. @@ -41,6 +42,7 @@ class InsertStatementVisitor extends DelegatingVisitor implements PartRenderer { private final IntoClauseVisitor intoClauseVisitor; private final ColumnVisitor columnVisitor; private final ValuesVisitor valuesVisitor; + private Dialect dialect; InsertStatementVisitor(RenderContext context) { this.intoClauseVisitor = createIntoClauseVisitor(context); @@ -85,7 +87,7 @@ public Delegation doLeave(Visitable segment) { addInsertColumnsIfPresent(); - addInsertValuesIfPresentElseDefault((Insert) segment); + addInsertValuesIfPresentElseDefault(); return Delegation.leave(); } @@ -93,11 +95,11 @@ public Delegation doLeave(Visitable segment) { return Delegation.retain(); } - private void addInsertValuesIfPresentElseDefault(Insert segment) { + private void addInsertValuesIfPresentElseDefault() { if (values.length() != 0) { builder.append(" VALUES (").append(values).append(")"); } else { - addInsertWithDefaultValuesToBuilder(segment.getInsertDialect()); + addInsertWithDefaultValuesToBuilder(); } } @@ -107,7 +109,7 @@ private void addInsertColumnsIfPresent() { } } - private void addInsertWithDefaultValuesToBuilder(Dialect dialect) { + private void addInsertWithDefaultValuesToBuilder() { builder.append(dialect.getSqlInsertWithDefaultValues().getDefaultInsertPart()); } @@ -143,4 +145,9 @@ private IntoClauseVisitor createIntoClauseVisitor(RenderContext context) { into.append(it); }); } + + public void setDialect(Dialect dialect) { + Assert.notNull(dialect, "Dialect must not be null!"); + this.dialect = dialect; + } } diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/Renderer.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/Renderer.java index 91f3c7a9d4..e1c78bee33 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/Renderer.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/Renderer.java @@ -15,6 +15,7 @@ */ package org.springframework.data.relational.core.sql.render; +import org.springframework.data.relational.core.dialect.Dialect; import org.springframework.data.relational.core.sql.Delete; import org.springframework.data.relational.core.sql.Insert; import org.springframework.data.relational.core.sql.Select; @@ -24,6 +25,7 @@ * SQL renderer for {@link Select} and {@link Delete} statements. * * @author Mark Paluch + * @author Mikhail Polivakha * @since 1.1 */ public interface Renderer { @@ -44,6 +46,16 @@ public interface Renderer { */ String render(Insert insert); + /** + * Render the {@link Insert} AST into a SQL statement in regards to specific Dialect + * + * @param insert - the statement to render, must not be {@literal null} + * @param dialect represents dialect, in scope of which SQL + * statement must be rendered, must not be {@literal null} + * @return rendered SQL INSERT statement + */ + String render(Insert insert, Dialect dialect); + /** * Render the {@link Update} AST into a SQL statement. * diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/SqlRenderer.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/SqlRenderer.java index 1a0ffa7f24..0c59c740ee 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/SqlRenderer.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/SqlRenderer.java @@ -15,6 +15,7 @@ */ package org.springframework.data.relational.core.sql.render; +import org.springframework.data.relational.core.dialect.Dialect; import org.springframework.data.relational.core.sql.Delete; import org.springframework.data.relational.core.sql.Insert; import org.springframework.data.relational.core.sql.Select; @@ -26,6 +27,7 @@ * * @author Mark Paluch * @author Jens Schauder + * @author Mikhail Polivakha * @since 1.1 * @see RenderContext */ @@ -69,16 +71,6 @@ public static String toString(Select select) { return create().render(select); } - /** - * Renders a {@link Insert} statement into its SQL representation. - * - * @param insert must not be {@literal null}. - * @return the rendered statement. - */ - public static String toString(Insert insert) { - return create().render(insert); - } - /** * Renders a {@link Update} statement into its SQL representation. * @@ -123,7 +115,18 @@ public String render(Insert insert) { InsertStatementVisitor visitor = new InsertStatementVisitor(context); insert.visit(visitor); + return visitor.getRenderedPart().toString(); + } + /** + * (non-Javadoc) + * @see Renderer + */ + @Override + public String render(Insert insert, Dialect dialect) { + InsertStatementVisitor visitor = new InsertStatementVisitor(context); + visitor.setDialect(dialect); + insert.visit(visitor); return visitor.getRenderedPart().toString(); } diff --git a/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/InsertRendererUnitTests.java b/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/InsertRendererUnitTests.java index dce5aeea4e..bd479080d4 100644 --- a/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/InsertRendererUnitTests.java +++ b/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/InsertRendererUnitTests.java @@ -15,16 +15,14 @@ */ package org.springframework.data.relational.core.sql.render; -import static org.assertj.core.api.Assertions.*; - -import ch.qos.logback.core.db.dialect.MsSQLDialect; import org.junit.jupiter.api.Test; -import org.springframework.data.relational.core.dialect.PostgresDialect; import org.springframework.data.relational.core.dialect.SqlServerDialect; import org.springframework.data.relational.core.sql.Insert; import org.springframework.data.relational.core.sql.SQL; import org.springframework.data.relational.core.sql.Table; +import static org.assertj.core.api.Assertions.assertThat; + /** * Unit tests for {@link SqlRenderer}. * @@ -41,7 +39,7 @@ public void shouldRenderInsert() { Insert insert = Insert.builder().into(bar).values(SQL.bindMarker()).build(); - assertThat(SqlRenderer.toString(insert)).isEqualTo("INSERT INTO bar VALUES (?)"); + assertThat(SqlRenderer.create().render(insert)).isEqualTo("INSERT INTO bar VALUES (?)"); } @Test // DATAJDBC-335 @@ -51,7 +49,7 @@ public void shouldRenderInsertColumn() { Insert insert = Insert.builder().into(bar).column(bar.column("foo")).values(SQL.bindMarker()).build(); - assertThat(SqlRenderer.toString(insert)).isEqualTo("INSERT INTO bar (foo) VALUES (?)"); + assertThat(SqlRenderer.create().render(insert)).isEqualTo("INSERT INTO bar (foo) VALUES (?)"); } @Test // DATAJDBC-335 @@ -62,18 +60,16 @@ public void shouldRenderInsertMultipleColumns() { Insert insert = Insert.builder().into(bar).columns(bar.columns("foo", "baz")).value(SQL.bindMarker()) .value(SQL.literalOf("foo")).build(); - assertThat(SqlRenderer.toString(insert)).isEqualTo("INSERT INTO bar (foo, baz) VALUES (?, 'foo')"); + assertThat(SqlRenderer.create().render(insert)).isEqualTo("INSERT INTO bar (foo, baz) VALUES (?, 'foo')"); } @Test // DATAJDBC-340 public void shouldRenderInsertWithZeroColumns() { - final String testTableName = "bar"; - Table bar = SQL.table(testTableName); + Table bar = Table.create("bar"); - Insert insert = Insert.builder().dialect(SqlServerDialect.INSTANCE).into(bar).build(); + Insert insert = Insert.builder().into(bar).build(); - assertThat(SqlRenderer.toString(insert)).contains(SqlServerDialect.INSTANCE.getSqlInsertWithDefaultValues().getDefaultInsertPart()); + assertThat(SqlRenderer.create().render(insert, SqlServerDialect.INSTANCE)).contains(SqlServerDialect.INSTANCE.getSqlInsertWithDefaultValues().getDefaultInsertPart()); } - } diff --git a/spring-data-relational/src/test/java/org/springframework/data/relational/degraph/DependencyTests.java b/spring-data-relational/src/test/java/org/springframework/data/relational/degraph/DependencyTests.java index 0de8ec23a1..03e86fef8c 100644 --- a/spring-data-relational/src/test/java/org/springframework/data/relational/degraph/DependencyTests.java +++ b/spring-data-relational/src/test/java/org/springframework/data/relational/degraph/DependencyTests.java @@ -37,8 +37,8 @@ public void cycleFree() { assertThat( // classpath() // .noJars() // - .including("org.springframework.data.relational.**") // - .excluding("org.springframework.data.relational.core.dialect.**") // + .including("org.springframework.data.relational.**") + .excluding("org.springframework.data.relational.core.sql.render.**") .filterClasspath("*target/classes") // exclude test code .printOnFailure("degraph-relational.graphml"), JCheck.violationFree()); From 71204add3936c7a8ee171d01b68ffe4f8a3d7b32 Mon Sep 17 00:00:00 2001 From: Mikhail-Polivakha Date: Sat, 27 Nov 2021 17:08:50 +0300 Subject: [PATCH 6/8] remove deialect as parameter in SqlRenderer method, instaed injected Dialect info in RenderContext --- .../data/jdbc/core/convert/SqlGenerator.java | 11 +++---- .../DefaultDataAccessStrategyUnitTests.java | 6 ++-- .../core/dialect/AbstractDialect.java | 9 ------ .../data/relational/core/dialect/Dialect.java | 4 ++- .../core/dialect/InsertDefaultValues.java | 2 +- .../core/dialect/RenderContextFactory.java | 31 +++++++++++++------ .../core/sql/render/InsertRenderContext.java | 18 +++++++++++ .../sql/render/InsertStatementVisitor.java | 21 ++++++------- .../core/sql/render/RenderContext.java | 8 ++++- .../relational/core/sql/render/Renderer.java | 12 ------- .../sql/render/SelectStatementVisitor.java | 2 +- .../core/sql/render/SimpleRenderContext.java | 7 ++++- .../core/sql/render/SqlRenderer.java | 15 --------- .../sql/render/InsertRendererUnitTests.java | 4 ++- 14 files changed, 78 insertions(+), 72 deletions(-) create mode 100644 spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/InsertRenderContext.java diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlGenerator.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlGenerator.java index 3721f7cd2a..5ecca36559 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlGenerator.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlGenerator.java @@ -82,8 +82,6 @@ class SqlGenerator { private final Lazy deleteByIdAndVersionSql = Lazy.of(this::createDeleteByIdAndVersionSql); private final Lazy deleteByListSql = Lazy.of(this::createDeleteByListSql); - private final Dialect dialect; - /** * Create a new {@link SqlGenerator} given {@link RelationalMappingContext} and {@link RelationalPersistentEntity}. * @@ -95,13 +93,14 @@ class SqlGenerator { SqlGenerator(RelationalMappingContext mappingContext, JdbcConverter converter, RelationalPersistentEntity entity, Dialect dialect) { - this.dialect = dialect; + final RenderContextFactory renderContextFactory = new RenderContextFactory(dialect); + this.mappingContext = mappingContext; this.entity = entity; this.sqlContext = new SqlContext(entity); - this.sqlRenderer = SqlRenderer.create(new RenderContextFactory(dialect).createRenderContext()); + this.sqlRenderer = SqlRenderer.create(renderContextFactory.createRenderContext()); this.columns = new Columns(entity, mappingContext, converter); - this.renderContext = new RenderContextFactory(dialect).createRenderContext(); + this.renderContext = renderContextFactory.createRenderContext(); } /** @@ -679,7 +678,7 @@ private String render(Select select) { } private String render(Insert insert) { - return this.sqlRenderer.render(insert, dialect); + return this.sqlRenderer.render(insert); } private String render(Update update) { diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategyUnitTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategyUnitTests.java index e0e2ea6c5f..0b1af5627b 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategyUnitTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategyUnitTests.java @@ -78,13 +78,11 @@ public class DefaultDataAccessStrategyUnitTests { JdbcConverter converter; DefaultDataAccessStrategy accessStrategy; - private Dialect dialect; - @BeforeEach public void before() { DelegatingDataAccessStrategy relationResolver = new DelegatingDataAccessStrategy(); - dialect = HsqlDbDialect.INSTANCE; + Dialect dialect = HsqlDbDialect.INSTANCE; converter = new BasicJdbcConverter(context, relationResolver, new JdbcCustomConversions(), new DefaultJdbcTypeFactory(jdbcOperations), dialect.getIdentifierProcessing()); @@ -223,7 +221,7 @@ public void insertWithUndefinedIdRetrievesGeneratedKeys() { assertThat(generatedId).isEqualTo(GENERATED_ID); - verify(namedJdbcOperations).update(eq("INSERT INTO \"DUMMY_ENTITY\"" + dialect.getSqlInsertWithDefaultValues().getDefaultInsertPart()), + verify(namedJdbcOperations).update(eq("INSERT INTO \"DUMMY_ENTITY\"" + HsqlDbDialect.INSTANCE.getSqlInsertWithDefaultValues().getDefaultInsertPart()), paramSourceCaptor.capture(), any(KeyHolder.class)); } diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/AbstractDialect.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/AbstractDialect.java index 5a3561c028..6563df66a3 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/AbstractDialect.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/AbstractDialect.java @@ -28,7 +28,6 @@ * * @author Mark Paluch * @author Myeonghyeon Lee - * @author Mikhail Polivakha * @since 1.1 */ public abstract class AbstractDialect implements Dialect { @@ -133,14 +132,6 @@ static class DialectSelectRenderContext implements SelectRenderContext { } } - /** - * @return default implementation of InsertWithDefaultValues - */ - @Override - public InsertWithDefaultValues getSqlInsertWithDefaultValues() { - return new InsertWithDefaultValues(){}; - } - /** * After {@code ORDER BY} function rendering the {@link LimitClause}. */ diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/Dialect.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/Dialect.java index 757261b780..c66fe9970b 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/Dialect.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/Dialect.java @@ -116,5 +116,7 @@ default Set> simpleTypes() { * for most of the Dialects the default implementation will be valid, but, for * example, in case of {@link SqlServerDialect} it is not */ - InsertWithDefaultValues getSqlInsertWithDefaultValues(); + default InsertWithDefaultValues getSqlInsertWithDefaultValues() { + return new InsertWithDefaultValues() {}; + } } diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/InsertDefaultValues.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/InsertDefaultValues.java index 8c2b04a1a1..4e3673dfe5 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/InsertDefaultValues.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/InsertDefaultValues.java @@ -3,7 +3,7 @@ /** * In the scope of Insert with default values SQL statement, for example * INSERT INTO SCHEMA.TABLE VALUES (DEFAULT) - * this enum represents the default values part in different {@link Dialect's} + * this enum represents the default values part in different {@link Dialect}s * * @author Mikhail Polivakha * @see InsertWithDefaultValues diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/RenderContextFactory.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/RenderContextFactory.java index e8a1dadb2d..320e99237c 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/RenderContextFactory.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/RenderContextFactory.java @@ -16,6 +16,7 @@ package org.springframework.data.relational.core.dialect; import org.springframework.data.relational.core.sql.IdentifierProcessing; +import org.springframework.data.relational.core.sql.render.InsertRenderContext; import org.springframework.data.relational.core.sql.render.NamingStrategies; import org.springframework.data.relational.core.sql.render.RenderContext; import org.springframework.data.relational.core.sql.render.RenderNamingStrategy; @@ -26,6 +27,7 @@ * Factory for {@link RenderContext} based on {@link Dialect}. * * @author Mark Paluch + * @author Mikhail Polivakha * @since 1.1 */ public class RenderContextFactory { @@ -65,9 +67,9 @@ public void setNamingStrategy(RenderNamingStrategy namingStrategy) { */ public RenderContext createRenderContext() { - SelectRenderContext select = dialect.getSelectContext(); + SelectRenderContext selectRenderContext = dialect.getSelectContext(); - return new DialectRenderContext(namingStrategy, dialect.getIdentifierProcessing(), select); + return new DialectRenderContext(namingStrategy, dialect, selectRenderContext); } /** @@ -76,17 +78,18 @@ public RenderContext createRenderContext() { static class DialectRenderContext implements RenderContext { private final RenderNamingStrategy renderNamingStrategy; - private final IdentifierProcessing identifierProcessing; private final SelectRenderContext selectRenderContext; + private final Dialect renderingDialect; - DialectRenderContext(RenderNamingStrategy renderNamingStrategy, IdentifierProcessing identifierProcessing, SelectRenderContext selectRenderContext) { + DialectRenderContext(RenderNamingStrategy renderNamingStrategy, Dialect renderingDialect, SelectRenderContext selectRenderContext) { Assert.notNull(renderNamingStrategy, "RenderNamingStrategy must not be null"); - Assert.notNull(identifierProcessing, "IdentifierProcessing must not be null"); + Assert.notNull(renderingDialect, "renderingDialect must not be null"); + Assert.notNull(renderingDialect.getIdentifierProcessing(), "IdentifierProcessing of renderingDialect must not be null"); Assert.notNull(selectRenderContext, "SelectRenderContext must not be null"); this.renderNamingStrategy = renderNamingStrategy; - this.identifierProcessing = identifierProcessing; + this.renderingDialect = renderingDialect; this.selectRenderContext = selectRenderContext; } @@ -105,7 +108,7 @@ public RenderNamingStrategy getNamingStrategy() { */ @Override public IdentifierProcessing getIdentifierProcessing() { - return identifierProcessing; + return renderingDialect.getIdentifierProcessing(); } /* @@ -113,8 +116,18 @@ public IdentifierProcessing getIdentifierProcessing() { * @see org.springframework.data.relational.core.sql.render.RenderContext#getSelect() */ @Override - public SelectRenderContext getSelect() { + public SelectRenderContext getSelectRenderContext() { return selectRenderContext; } + + @Override + public InsertRenderContext getInsertRenderContext() { + return new InsertRenderContext() { + @Override + public InsertWithDefaultValues getInsertWithDefaultValues() { + return renderingDialect.getSqlInsertWithDefaultValues(); + } + }; + } } -} +} \ No newline at end of file diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/InsertRenderContext.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/InsertRenderContext.java new file mode 100644 index 0000000000..3cd190ed6d --- /dev/null +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/InsertRenderContext.java @@ -0,0 +1,18 @@ +package org.springframework.data.relational.core.sql.render; + +import org.springframework.data.relational.core.dialect.InsertWithDefaultValues; +import org.springframework.data.relational.core.sql.Insert; + +/** + * This interface encapsulates the details about how to + * process {@link Insert} SQL statement + * + * @see RenderContext + * @author Mikhail Polivakha + */ +public interface InsertRenderContext { + + default InsertWithDefaultValues getInsertWithDefaultValues() { + return new InsertWithDefaultValues() {}; + } +} \ No newline at end of file diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/InsertStatementVisitor.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/InsertStatementVisitor.java index 6e860ac617..914c22b7f0 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/InsertStatementVisitor.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/InsertStatementVisitor.java @@ -42,12 +42,16 @@ class InsertStatementVisitor extends DelegatingVisitor implements PartRenderer { private final IntoClauseVisitor intoClauseVisitor; private final ColumnVisitor columnVisitor; private final ValuesVisitor valuesVisitor; - private Dialect dialect; + private final RenderContext renderContext; - InsertStatementVisitor(RenderContext context) { - this.intoClauseVisitor = createIntoClauseVisitor(context); - this.columnVisitor = createColumnVisitor(context); - this.valuesVisitor = new ValuesVisitor(context, values::append); + InsertStatementVisitor(RenderContext renderContext) { + + Assert.notNull(renderContext, "renderContext must not be null!"); + + this.renderContext = renderContext; + this.intoClauseVisitor = createIntoClauseVisitor(renderContext); + this.columnVisitor = createColumnVisitor(renderContext); + this.valuesVisitor = new ValuesVisitor(renderContext, values::append); } /* @@ -110,7 +114,7 @@ private void addInsertColumnsIfPresent() { } private void addInsertWithDefaultValuesToBuilder() { - builder.append(dialect.getSqlInsertWithDefaultValues().getDefaultInsertPart()); + builder.append(renderContext.getInsertRenderContext().getInsertWithDefaultValues().getDefaultInsertPart()); } /* @@ -145,9 +149,4 @@ private IntoClauseVisitor createIntoClauseVisitor(RenderContext context) { into.append(it); }); } - - public void setDialect(Dialect dialect) { - Assert.notNull(dialect, "Dialect must not be null!"); - this.dialect = dialect; - } } diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/RenderContext.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/RenderContext.java index c11b68d499..2d40ef5188 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/RenderContext.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/RenderContext.java @@ -21,6 +21,7 @@ * Render context providing {@link RenderNamingStrategy} and other resources that are required during rendering. * * @author Mark Paluch + * @author Mikhail Polivakha * @since 1.1 */ public interface RenderContext { @@ -43,5 +44,10 @@ public interface RenderContext { /** * @return the {@link SelectRenderContext}. */ - SelectRenderContext getSelect(); + SelectRenderContext getSelectRenderContext(); + + /** + * @return the {@link InsertRenderContext} + */ + InsertRenderContext getInsertRenderContext(); } diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/Renderer.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/Renderer.java index e1c78bee33..91f3c7a9d4 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/Renderer.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/Renderer.java @@ -15,7 +15,6 @@ */ package org.springframework.data.relational.core.sql.render; -import org.springframework.data.relational.core.dialect.Dialect; import org.springframework.data.relational.core.sql.Delete; import org.springframework.data.relational.core.sql.Insert; import org.springframework.data.relational.core.sql.Select; @@ -25,7 +24,6 @@ * SQL renderer for {@link Select} and {@link Delete} statements. * * @author Mark Paluch - * @author Mikhail Polivakha * @since 1.1 */ public interface Renderer { @@ -46,16 +44,6 @@ public interface Renderer { */ String render(Insert insert); - /** - * Render the {@link Insert} AST into a SQL statement in regards to specific Dialect - * - * @param insert - the statement to render, must not be {@literal null} - * @param dialect represents dialect, in scope of which SQL - * statement must be rendered, must not be {@literal null} - * @return rendered SQL INSERT statement - */ - String render(Insert insert, Dialect dialect); - /** * Render the {@link Update} AST into a SQL statement. * diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/SelectStatementVisitor.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/SelectStatementVisitor.java index 5f743c5a9a..3b545d3c3b 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/SelectStatementVisitor.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/SelectStatementVisitor.java @@ -50,7 +50,7 @@ class SelectStatementVisitor extends DelegatingVisitor implements PartRenderer { SelectStatementVisitor(RenderContext context) { this.context = context; - this.selectRenderContext = context.getSelect(); + this.selectRenderContext = context.getSelectRenderContext(); this.selectListVisitor = new SelectListVisitor(context, selectList::append); this.orderByClauseVisitor = new OrderByClauseVisitor(context); this.fromClauseVisitor = new FromClauseVisitor(context, it -> { diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/SimpleRenderContext.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/SimpleRenderContext.java index 9f4d942f61..3886d5c4ae 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/SimpleRenderContext.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/SimpleRenderContext.java @@ -37,10 +37,15 @@ public IdentifierProcessing getIdentifierProcessing() { } @Override - public SelectRenderContext getSelect() { + public SelectRenderContext getSelectRenderContext() { return DefaultSelectRenderContext.INSTANCE; } + @Override + public InsertRenderContext getInsertRenderContext() { + return new InsertRenderContext() {}; + } + public RenderNamingStrategy getNamingStrategy() { return this.namingStrategy; } diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/SqlRenderer.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/SqlRenderer.java index 0c59c740ee..9c93fe6852 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/SqlRenderer.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/SqlRenderer.java @@ -15,7 +15,6 @@ */ package org.springframework.data.relational.core.sql.render; -import org.springframework.data.relational.core.dialect.Dialect; import org.springframework.data.relational.core.sql.Delete; import org.springframework.data.relational.core.sql.Insert; import org.springframework.data.relational.core.sql.Select; @@ -27,7 +26,6 @@ * * @author Mark Paluch * @author Jens Schauder - * @author Mikhail Polivakha * @since 1.1 * @see RenderContext */ @@ -112,20 +110,7 @@ public String render(Select select) { */ @Override public String render(Insert insert) { - - InsertStatementVisitor visitor = new InsertStatementVisitor(context); - insert.visit(visitor); - return visitor.getRenderedPart().toString(); - } - - /** - * (non-Javadoc) - * @see Renderer - */ - @Override - public String render(Insert insert, Dialect dialect) { InsertStatementVisitor visitor = new InsertStatementVisitor(context); - visitor.setDialect(dialect); insert.visit(visitor); return visitor.getRenderedPart().toString(); } diff --git a/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/InsertRendererUnitTests.java b/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/InsertRendererUnitTests.java index bd479080d4..ffa2b97b45 100644 --- a/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/InsertRendererUnitTests.java +++ b/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/InsertRendererUnitTests.java @@ -16,6 +16,8 @@ package org.springframework.data.relational.core.sql.render; import org.junit.jupiter.api.Test; +import org.springframework.data.relational.core.dialect.AbstractDialect; +import org.springframework.data.relational.core.dialect.InsertWithDefaultValues; import org.springframework.data.relational.core.dialect.SqlServerDialect; import org.springframework.data.relational.core.sql.Insert; import org.springframework.data.relational.core.sql.SQL; @@ -70,6 +72,6 @@ public void shouldRenderInsertWithZeroColumns() { Insert insert = Insert.builder().into(bar).build(); - assertThat(SqlRenderer.create().render(insert, SqlServerDialect.INSTANCE)).contains(SqlServerDialect.INSTANCE.getSqlInsertWithDefaultValues().getDefaultInsertPart()); + assertThat(SqlRenderer.create().render(insert)).contains(new InsertWithDefaultValues(){}.getDefaultInsertPart()); } } From 1841135d9b2f60424d0c60460569ac8d99d39ecd Mon Sep 17 00:00:00 2001 From: Mikhail-Polivakha Date: Sat, 27 Nov 2021 17:19:03 +0300 Subject: [PATCH 7/8] Supplied DATAJDBC-557 with MsSQL insert with default values test --- .../jdbc/core/convert/SqlGeneratorUnitTests.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/SqlGeneratorUnitTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/SqlGeneratorUnitTests.java index e86e032549..ee23d1c6a6 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/SqlGeneratorUnitTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/SqlGeneratorUnitTests.java @@ -40,6 +40,7 @@ import org.springframework.data.relational.core.dialect.AnsiDialect; import org.springframework.data.relational.core.dialect.Dialect; import org.springframework.data.relational.core.dialect.PostgresDialect; +import org.springframework.data.relational.core.dialect.SqlServerDialect; import org.springframework.data.relational.core.mapping.Column; import org.springframework.data.relational.core.mapping.NamingStrategy; import org.springframework.data.relational.core.mapping.PersistentPropertyPathExtension; @@ -392,13 +393,22 @@ public void updateWithVersion() { } @Test // DATAJDBC-264 - public void getInsertForEmptyColumnList() { + public void getInsertForEmptyColumnListPostgres() { SqlGenerator sqlGenerator = createSqlGenerator(IdOnlyEntity.class, PostgresDialect.INSTANCE); - String insert = sqlGenerator.getInsert(emptySet()); + String insertSqlStatement = sqlGenerator.getInsert(emptySet()); + + assertThat(insertSqlStatement).endsWith(" VALUES (DEFAULT) "); + } + + @Test //DATAJDBC-557 + void gerInsertForEmptyColumnListMsSqlServer() { + SqlGenerator sqlGenerator = createSqlGenerator(IdOnlyEntity.class, SqlServerDialect.INSTANCE); + + String insertSqlStatement = sqlGenerator.getInsert(emptySet()); - assertThat(insert).endsWith(PostgresDialect.INSTANCE.getSqlInsertWithDefaultValues().getDefaultInsertPart()); + assertThat(insertSqlStatement).endsWith(" DEFAULT VALUES "); } @Test // DATAJDBC-334 From 079327a93c09035fb70b6fef1e2eaf2d5c4eeb53 Mon Sep 17 00:00:00 2001 From: Mikhail-Polivakha Date: Sat, 27 Nov 2021 18:56:09 +0300 Subject: [PATCH 8/8] Make ../core/sql/** indenependent from dialect --- .../relational/core/dialect/InsertWithDefaultValues.java | 2 ++ .../data/relational/core/dialect/RenderContextFactory.java | 4 ++-- .../data/relational/core/dialect/SqlServerDialect.java | 1 + .../core/{dialect => mapping}/InsertDefaultValues.java | 5 ++++- .../relational/core/sql/render/InsertRenderContext.java | 6 +++--- .../relational/core/sql/render/InsertStatementVisitor.java | 3 +-- .../relational/core/sql/render/InsertRendererUnitTests.java | 2 -- .../data/relational/degraph/DependencyTests.java | 4 +--- 8 files changed, 14 insertions(+), 13 deletions(-) rename spring-data-relational/src/main/java/org/springframework/data/relational/core/{dialect => mapping}/InsertDefaultValues.java (75%) diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/InsertWithDefaultValues.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/InsertWithDefaultValues.java index 96c6df6a42..4710ab796d 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/InsertWithDefaultValues.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/InsertWithDefaultValues.java @@ -1,5 +1,7 @@ package org.springframework.data.relational.core.dialect; +import org.springframework.data.relational.core.mapping.InsertDefaultValues; + /** * This interface aggregates information about an Insert with default values statement. * @author Mikhail Polivakha diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/RenderContextFactory.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/RenderContextFactory.java index 320e99237c..b35014a5ae 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/RenderContextFactory.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/RenderContextFactory.java @@ -124,8 +124,8 @@ public SelectRenderContext getSelectRenderContext() { public InsertRenderContext getInsertRenderContext() { return new InsertRenderContext() { @Override - public InsertWithDefaultValues getInsertWithDefaultValues() { - return renderingDialect.getSqlInsertWithDefaultValues(); + public String getInsertDefaultValuesPartSQL() { + return renderingDialect.getSqlInsertWithDefaultValues().getDefaultInsertPart(); } }; } diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/SqlServerDialect.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/SqlServerDialect.java index f811c143d1..cf3bcbbc8f 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/SqlServerDialect.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/SqlServerDialect.java @@ -15,6 +15,7 @@ */ package org.springframework.data.relational.core.dialect; +import org.springframework.data.relational.core.mapping.InsertDefaultValues; import org.springframework.data.relational.core.sql.IdentifierProcessing; import org.springframework.data.relational.core.sql.LockOptions; import org.springframework.data.relational.core.sql.render.SelectRenderContext; diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/InsertDefaultValues.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/InsertDefaultValues.java similarity index 75% rename from spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/InsertDefaultValues.java rename to spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/InsertDefaultValues.java index 4e3673dfe5..8a9299edff 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/InsertDefaultValues.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/InsertDefaultValues.java @@ -1,4 +1,7 @@ -package org.springframework.data.relational.core.dialect; +package org.springframework.data.relational.core.mapping; + +import org.springframework.data.relational.core.dialect.Dialect; +import org.springframework.data.relational.core.dialect.InsertWithDefaultValues; /** * In the scope of Insert with default values SQL statement, for example diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/InsertRenderContext.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/InsertRenderContext.java index 3cd190ed6d..6824d8c76d 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/InsertRenderContext.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/InsertRenderContext.java @@ -1,6 +1,6 @@ package org.springframework.data.relational.core.sql.render; -import org.springframework.data.relational.core.dialect.InsertWithDefaultValues; +import org.springframework.data.relational.core.mapping.InsertDefaultValues; import org.springframework.data.relational.core.sql.Insert; /** @@ -12,7 +12,7 @@ */ public interface InsertRenderContext { - default InsertWithDefaultValues getInsertWithDefaultValues() { - return new InsertWithDefaultValues() {}; + default String getInsertDefaultValuesPartSQL() { + return InsertDefaultValues.DEFAULT.getDefaultInsertPart(); } } \ No newline at end of file diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/InsertStatementVisitor.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/InsertStatementVisitor.java index 914c22b7f0..75cf44074f 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/InsertStatementVisitor.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/InsertStatementVisitor.java @@ -16,7 +16,6 @@ package org.springframework.data.relational.core.sql.render; import org.jetbrains.annotations.NotNull; -import org.springframework.data.relational.core.dialect.Dialect; import org.springframework.data.relational.core.sql.Column; import org.springframework.data.relational.core.sql.Insert; import org.springframework.data.relational.core.sql.Into; @@ -114,7 +113,7 @@ private void addInsertColumnsIfPresent() { } private void addInsertWithDefaultValuesToBuilder() { - builder.append(renderContext.getInsertRenderContext().getInsertWithDefaultValues().getDefaultInsertPart()); + builder.append(renderContext.getInsertRenderContext().getInsertDefaultValuesPartSQL()); } /* diff --git a/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/InsertRendererUnitTests.java b/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/InsertRendererUnitTests.java index ffa2b97b45..0feff5742b 100644 --- a/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/InsertRendererUnitTests.java +++ b/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/InsertRendererUnitTests.java @@ -16,9 +16,7 @@ package org.springframework.data.relational.core.sql.render; import org.junit.jupiter.api.Test; -import org.springframework.data.relational.core.dialect.AbstractDialect; import org.springframework.data.relational.core.dialect.InsertWithDefaultValues; -import org.springframework.data.relational.core.dialect.SqlServerDialect; import org.springframework.data.relational.core.sql.Insert; import org.springframework.data.relational.core.sql.SQL; import org.springframework.data.relational.core.sql.Table; diff --git a/spring-data-relational/src/test/java/org/springframework/data/relational/degraph/DependencyTests.java b/spring-data-relational/src/test/java/org/springframework/data/relational/degraph/DependencyTests.java index 03e86fef8c..e0e7c88177 100644 --- a/spring-data-relational/src/test/java/org/springframework/data/relational/degraph/DependencyTests.java +++ b/spring-data-relational/src/test/java/org/springframework/data/relational/degraph/DependencyTests.java @@ -27,7 +27,6 @@ * * @author Jens Schauder * @author Mark Paluch - * @author Mikhail Polivakha */ public class DependencyTests { @@ -37,8 +36,7 @@ public void cycleFree() { assertThat( // classpath() // .noJars() // - .including("org.springframework.data.relational.**") - .excluding("org.springframework.data.relational.core.sql.render.**") + .including("org.springframework.data.relational.**") // .filterClasspath("*target/classes") // exclude test code .printOnFailure("degraph-relational.graphml"), JCheck.violationFree());