Skip to content

Commit 0017ca7

Browse files
committed
#410 - Make it possible to write delete/update operations without using matching.
Fluent operations now allow statement execution without the need to specify a Query object allowing for shorter statements.
1 parent adb878e commit 0017ca7

File tree

4 files changed

+80
-6
lines changed

4 files changed

+80
-6
lines changed

src/main/java/org/springframework/data/r2dbc/core/ReactiveDeleteOperation.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public interface ReactiveDeleteOperation {
5656
/**
5757
* Table override (optional).
5858
*/
59-
interface DeleteWithTable {
59+
interface DeleteWithTable extends TerminatingDelete {
6060

6161
/**
6262
* Explicitly set the {@link String name} of the table on which to perform the delete.
@@ -88,7 +88,7 @@ default DeleteWithQuery from(String table) {
8888
/**
8989
* Required {@link Query filter}.
9090
*/
91-
interface DeleteWithQuery {
91+
interface DeleteWithQuery extends TerminatingDelete {
9292

9393
/**
9494
* Define the {@link Query} used to filter elements in the delete.

src/main/java/org/springframework/data/r2dbc/core/ReactiveUpdateOperation.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public interface ReactiveUpdateOperation {
6060
/**
6161
* Table override (optional).
6262
*/
63-
interface UpdateWithTable {
63+
interface UpdateWithTable extends TerminatingUpdate {
6464

6565
/**
6666
* Explicitly set the {@link String name} of the table on which to perform the update.
@@ -92,7 +92,7 @@ default UpdateWithQuery inTable(String table) {
9292
/**
9393
* Define a {@link Query} used as the filter for the {@link Update}.
9494
*/
95-
interface UpdateWithQuery {
95+
interface UpdateWithQuery extends TerminatingUpdate {
9696

9797
/**
9898
* Filter rows to update by the given {@link Query}.

src/test/java/org/springframework/data/r2dbc/core/ReactiveDeleteOperationUnitTests.java

+37-1
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,49 @@ public void before() {
5151
entityTemplate = new R2dbcEntityTemplate(client);
5252
}
5353

54-
@Test // gh-220
54+
@Test // gh-410
5555
public void shouldDelete() {
5656

5757
MockResult result = MockResult.builder().rowsUpdated(1).build();
5858

5959
recorder.addStubbing(s -> s.startsWith("DELETE"), result);
6060

61+
entityTemplate.delete(Person.class) //
62+
.all() //
63+
.as(StepVerifier::create) //
64+
.expectNext(1) //
65+
.verifyComplete();
66+
67+
StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("DELETE"));
68+
69+
assertThat(statement.getSql()).isEqualTo("DELETE FROM person");
70+
}
71+
72+
@Test // gh-410
73+
public void shouldDeleteWithTable() {
74+
75+
MockResult result = MockResult.builder().rowsUpdated(1).build();
76+
77+
recorder.addStubbing(s -> s.startsWith("DELETE"), result);
78+
79+
entityTemplate.delete(Person.class) //
80+
.from("table").all() //
81+
.as(StepVerifier::create) //
82+
.expectNext(1) //
83+
.verifyComplete();
84+
85+
StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("DELETE"));
86+
87+
assertThat(statement.getSql()).isEqualTo("DELETE FROM table");
88+
}
89+
90+
@Test // gh-220
91+
public void shouldDeleteWithQuery() {
92+
93+
MockResult result = MockResult.builder().rowsUpdated(1).build();
94+
95+
recorder.addStubbing(s -> s.startsWith("DELETE"), result);
96+
6197
entityTemplate.delete(Person.class) //
6298
.matching(query(where("name").is("Walter"))) //
6399
.all() //

src/test/java/org/springframework/data/r2dbc/core/ReactiveUpdateOperationUnitTests.java

+39-1
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,51 @@ public void before() {
5252
entityTemplate = new R2dbcEntityTemplate(client);
5353
}
5454

55-
@Test // gh-220
55+
@Test // gh-410
5656
public void shouldUpdate() {
5757

5858
MockResult result = MockResult.builder().rowsUpdated(1).build();
5959

6060
recorder.addStubbing(s -> s.startsWith("UPDATE"), result);
6161

62+
entityTemplate.update(Person.class) //
63+
.apply(Update.update("name", "Heisenberg")) //
64+
.as(StepVerifier::create) //
65+
.expectNext(1) //
66+
.verifyComplete();
67+
68+
StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("UPDATE"));
69+
70+
assertThat(statement.getSql()).isEqualTo("UPDATE person SET THE_NAME = $1");
71+
assertThat(statement.getBindings()).hasSize(1).containsEntry(0, SettableValue.from("Heisenberg"));
72+
}
73+
74+
@Test // gh-410
75+
public void shouldUpdateWithTable() {
76+
77+
MockResult result = MockResult.builder().rowsUpdated(1).build();
78+
79+
recorder.addStubbing(s -> s.startsWith("UPDATE"), result);
80+
81+
entityTemplate.update(Person.class) //
82+
.inTable("table").apply(Update.update("name", "Heisenberg")) //
83+
.as(StepVerifier::create) //
84+
.expectNext(1) //
85+
.verifyComplete();
86+
87+
StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("UPDATE"));
88+
89+
assertThat(statement.getSql()).isEqualTo("UPDATE table SET THE_NAME = $1");
90+
assertThat(statement.getBindings()).hasSize(1).containsEntry(0, SettableValue.from("Heisenberg"));
91+
}
92+
93+
@Test // gh-220
94+
public void shouldUpdateWithQuery() {
95+
96+
MockResult result = MockResult.builder().rowsUpdated(1).build();
97+
98+
recorder.addStubbing(s -> s.startsWith("UPDATE"), result);
99+
62100
entityTemplate.update(Person.class) //
63101
.matching(query(where("name").is("Walter"))) //
64102
.apply(Update.update("name", "Heisenberg")) //

0 commit comments

Comments
 (0)