Commit Graph

81 Commits

Author SHA1 Message Date
Mark Paluch
32f1770529 #55 - Reuse Dialect support provided by Spring Data Relational.
We now reuse the existing Dialect infrastructure provided by Spring Data Relational to enhance it for R2DBC specifics such as bind markers.

Original pull request: #125.
2019-05-22 14:21:43 +02:00
Mark Paluch
46082147d3 #69 - Allow object creation with a subset of columns.
We now allow object creation when not all columns are present by leveraging R2DBC RowMetadata. A column subset is necessary for projections.
2019-05-22 09:41:23 +02:00
Mark Paluch
8b77aa9431 #89 - Accept SQL directly in DatabaseClient.execute(…) stage.
We compressed client.execute().sql(…) to client.execute(…) to not require the intermediate execute() step but rather accept the SQL to execute directly.

Original pull request: #112.
2019-05-21 14:02:45 +02:00
Mark Paluch
5714709d71 #30 - Polishing.
Fix custom converter documentation. Accept custom converters in DefaultReactiveDataAccessStrategy constructor.
2019-05-17 23:28:03 +02:00
Mark Paluch
430d984503 #109 - Fix simple type conversion for projection queries.
We now correctly consider built-in converters for simple types that are read through DatabaseClient. Simple type projections typically select a single column and expect a result stream of simple values such as selecting a count and retrieving a Mono<Long>.
2019-05-14 09:35:46 +02:00
Oliver Drotbohm
c456af0d2a #111 - Package and type renames.
Package renames:

- `….domain` -> `….mapping`
- `….function.connectionfactory` -> `connectionfactory`
- `….function.convert` -> `convert`
- `….function.query` -> `query`
- `….function` -> `….core`

Type moves:

- `….dialect.R2dbcSimpleTypeHolder` -> `….mapping.R2dbcSimpleTypeHolder`
- `….mapping.BindTarget` -> `….dialect.BindTarget`
- `….mapping.PreparedOperation` -> `….core.PreparedOperation`
- `….mapping.QueryOperation` -> `….core.QueryOperation`
- `….mapping.BindOperation` -> `….core.BindOperation`
- `….connectionfactory.ConnectionFactoryTransactionManager` -> `….connectionfactory.R2dbcTransactionManager`

That makes us end up with:

- `connectionfactory`
- `core` -> `connectionfactory`, `convert`, `dialect`, `mapping`, `query`
- `query` -> `convert`, `dialect`, `mapping`
- `convert` -> `dialect`, `mapping`
- `dialect` -> `mapping`
- `mapping` -> Spring Data Commons mapping

Reflect type renames in reference documentation.
2019-05-09 18:11:55 +02:00
Christoph Strobl
988b31b33a #107 - Polishing.
Extract method references for better readability. Add missing tests and update documentation.
Add delay for transactional MySql tests to avoid failures due to potentially delayed transaction id storage within the database.

Original Pull Request: #107
2019-05-09 08:26:07 +02:00
Mark Paluch
79e32941b5 #107 - Add support for ConnectionFactoryTransactionManager.ConnectionFactoryTransactionManager.
We now support R2DBC transaction management through ConnectionFactoryTransactionManager which is a ReactiveTransactionManager implementation to be used with TransactionalOperator and Spring's declarative transaction management.

ConnectionFactoryTransactionManager tm = new ConnectionFactoryTransactionManager(connectionFactory);
TransactionalOperator operator = TransactionalOperator.create(tm);
DatabaseClient db = DatabaseClient.create(connectionFactory);

Mono<Void> atomicOperation = db.execute().sql("INSERT INTO person (id, name, age) VALUES(:id, :name, :age)")
            .bind("id", "joe")
            .bind("name", "Joe")
            .bind("age", 34)
            .fetch().rowsUpdated()
            .then(db.execute().sql("INSERT INTO contacts (id, name) VALUES(:id, :name)")
                    .bind("id", "joe")
                    .bind("name", "Joe")
                    .fetch().rowsUpdated())
            .then()
            .as(operator::transactional);

Original Pull Request: #107
2019-05-09 07:56:23 +02:00
Oliver Drotbohm
da53a9a934 #64 - Polishing.
Incorporated feedback from review. Polished documentation and Javadoc. Minor code improvements restructuring for better readability. Removed unused methods types. Some polishing for compiler warnings.

Original pull request: #106.
2019-05-08 10:45:30 +02:00
Jens Schauder
361d801b14 #64 - Polishing.
Fixed typos, formatting and minor errors in documentation.

Original pull request: #106.
2019-05-08 10:45:30 +02:00
Mark Paluch
774d2e8b09 #64 - API polishing.
Document fluent API. Add fluent API for update. Introduce StatementMapper. Migrate Insert to StatementMapper. Refactoring and cleanup. Migrate Select to StatementMapper.

Original pull request: #106.
2019-05-08 10:45:30 +02:00
Mark Paluch
fd4472aaaa #64 - Add Criteria API.
We now support Criteria creation and mapping to express where conditions with a fluent API.

databaseClient.select().from("legoset")
  .where(Criteria.of("name").like("John%").and("id").lessThanOrEquals(42055));

databaseClient.delete()
  .from(LegoSet.class)
  .where(Criteria.of("id").is(42055))
  .then()

databaseClient.delete()
  .from(LegoSet.class)
  .where(Criteria.of("id").is(42055))
  .fetch()
  .rowsUpdated()

Original pull request: #106.
2019-05-08 10:45:30 +02:00
Mark Paluch
88945d7d71 #73 - Introduce BindTarget.
We now apply bindings to a BindTarget that can be overridden without the need to implement all Statement methods.

PreparedOperation no longer has a direct dependency on R2DBC Statement.

Original pull request: #82.
2019-05-06 13:50:36 +02:00
Jens Schauder
02e0cb5026 #73 - Polishing.
Original pull request: #82.
2019-05-06 13:50:33 +02:00
Mark Paluch
ef2d885b1e #73 - Introduce PreparedOperation.
We now encapsulate prepared operations from the StatementFactory within PreparedOperation that renders SQL and provides binding values.

StatementFactory supports SELECT/INSERT/UPDATE/DELETE statement creation considering Dialect-specific rendering.
StatementFactory replaces String-based statement methods in ReactiveDataAccessStrategy.

PreparedOperation<Update> operation = accessStrategy.getStatements().update(entity.getTableName(), binder -> {
	binder.bind("name", "updated value");
	binder.filterBy("id", SettableValue.from(42));
});

databaseClient.execute().sql(operation).then();

Original pull request: #82.
2019-05-06 13:50:20 +02:00
Mark Paluch
72ffccbfbc #100 - Remove Spring JDBC as mandatory dependency.
We now ship our own SqlProvider variant to not require Spring JDBC as mandatory dependency. Spring JDBC can be provided optionally to use SQL-code based exception translation.
2019-04-24 14:40:54 +02:00
Jens Schauder
f7d3124c63 #57 - Added tests for the exception message.
Original pull request: #97.
2019-04-24 08:20:11 +02:00
Mark Paluch
e161476d1c #57 - Add support for R2DBC subclass exception translation.
We now use R2DBC's exception hierarchy to translate exceptions into Spring's DataAccessException hierarchy.

Original pull request: #97.
2019-04-24 08:19:34 +02:00
Mark Paluch
9c6142f941 #95 - Use customized ConnectionFactory lookup to avoid AbstractR2dbcConfiguration proxying.
We now attempt to lookup ConnectionFactory from ApplicationContext and fall back to a local
method call if ConnectionFactory is not exposed as bean.

Original pull request: #96.
2019-04-18 08:58:21 +02:00
Jens Schauder
6227d96341 #75 - Polishing.
Clarified code a little.

Added a warning to `AnonymousBindMarkers`:

 Anonymous bind markers are problematic because the have to appear in generated SQL in the same order they get generated.
 This might cause challenges in the future with complex generate statements.
 For example those containing subselects which limit the freedom of arranging bind markers.

Original pull request: #84.
2019-04-17 16:23:50 +02:00
Mark Paluch
3ca32b89b7 #75 - Add support for MySQL using jasync-mysql.
We now support MySQL through the jasync-mysql driver that exposes its asynchronous functionality through a R2DBC wrapper implementation.

Jasync uses for now its own exceptions.

Original pull request: #84.
2019-04-17 16:23:30 +02:00
Mark Paluch
08d91bdf84 #75 - Add anonymous indexed bind markers.
Anonymous indexed bind markers come with a static placeholder symbol for all parameter occurrences and they are bound by index.

Original pull request: #84.
2019-04-17 16:23:19 +02:00
Jens Schauder
2f5d11bd56 #90 - Polishing.
Original pull request: #90.
2019-04-17 13:00:40 +02:00
Mark Paluch
652facb14a #90 - Emit inserted object through SimpleR2dbcRepository.save(…) with given Id.
SimpleR2dbcRepository.save(…) now falls back to the saved object as emitted result if the INSERT statement does not return generated keys.

Adding H2 database engine for tests to simulate such behavior.

Original pull request: #90.
2019-04-17 12:59:51 +02:00
Mark Paluch
7c9e777d00 #85 - Consider BigDecimal and BigInteger as simple types.
We now consider BigDecimal and BigInteger as simple types and no longer as entities.

We also no longer set properties whose value is null.
2019-04-02 16:03:59 +02:00
Spring Operator
7e3bcceeda #79 - URL Cleanup.
This commit updates URLs to prefer the https protocol. Redirects are not followed to avoid accidentally expanding intentionally shortened URLs (i.e. if using a URL shortener).

# Fixed URLs

## Fixed Success
These URLs were switched to an https URL with a 2xx status. While the status was successful, your review is still recommended.

* [ ] http://www.apache.org/licenses/ with 1 occurrences migrated to:
  https://www.apache.org/licenses/ ([https](https://www.apache.org/licenses/) result 200).
* [ ] http://www.apache.org/licenses/LICENSE-2.0 with 93 occurrences migrated to:
  https://www.apache.org/licenses/LICENSE-2.0 ([https](https://www.apache.org/licenses/LICENSE-2.0) result 200).

Original pull request: #79.
2019-03-22 10:14:40 +01:00
Mark Paluch
6654db34c4 #59 - Consider custom conversion in MappingR2dbcConverter.
MappingR2dbcConverter now considers custom conversions for inbound and outbound conversion of top-level types (Row to Entity, Entity to OutboundRow) and on property level (e.g. convert an object to String and vice versa).

Original pull request: #70.
2019-03-18 15:24:48 +01:00
Mark Paluch
39936c67fa #59 - Simplify CustomConversions bean construction.
Original pull request: #70.
2019-03-18 15:24:18 +01:00
Mark Paluch
369522231f #41 - Polishing.
Rename RowDataConverter to R2dbcConverters. Introduce R2dbcSimpleTypeHolder. Apply custom conversions check in MappingR2dbcConverter. Extend tests.

Original pull request: #65.
2019-03-10 11:34:59 +01:00
Hebert Coelho
455e9a59de #41 - Add R2DBC converters.
Original pull request: #65.
2019-03-10 11:34:37 +01:00
Mark Paluch
feabe477a7 #61 - Move Conversion-related functionality to MappingR2dbcConverter.
All conversion functionality is now pulled together into MappingR2dbcConverter.

Introduce OutboundRow to provide mapping between column names and settable values. Remove identifier from SettableValue.

Original pull request: #62.
2019-03-05 14:03:43 +01:00
Jens Schauder
169de9df0a #56 - Polishing.
Replaced calls to `SqlRenderer.render(.)` with `SqlRenderer.toString(.)`.
And code formatting.

Original pull request: #66.
2019-03-05 13:48:31 +01:00
Mark Paluch
c241cd982e #56 - Use Statement Builder API for SELECT statements.
Original pull request: #66.
2019-03-05 13:36:27 +01:00
Mark Paluch
432b885853 #54 - Build against R2DBC 1.0 snapshots. 2019-02-01 09:43:51 +01:00
Mark Paluch
3d1041c0c8 #23 - Address review comments.
Original pull request: #47.
2019-01-18 14:00:30 +01:00
Jens Schauder
29f1edce0e #23 - Polishing.
Formatting.
Made Tests simpler and stricter by using `containsExactly`.
Added @Test annotation to ignored database specific tests so they actually show up as ignored.

Original pull request: #47.
2019-01-18 14:00:15 +01:00
Mark Paluch
b43b11936f #23 - Add support for named parameters.
DatabaseClient now supports named parameters prefixed with a colon such as :name in addition to database-native bind markers. Named parameters thus are supported in annotated repository query methods which also increases portability of queries across database vendors.

Named parameter support unrolls collection arguments to reduce the need for argument-specific SQL statements:

db.execute()
    .sql("SELECT id, name, state FROM table WHERE age IN (:ages)")
    .bind("ages", Arrays.asList(35, 50));

Results in a query: SELECT id, name, state FROM table WHERE age IN (35, 50)

Collection arguments containing nested object arrays can be used to use select lists:

List<Object[]> tuples = new ArrayList<>();
tuples.add(new Object[] {"John", 35});
tuples.add(new Object[] {"Ann",  50});

db.execute()
    .sql("SELECT id, name, state FROM table WHERE (name, age) IN (:tuples)")
    .bind("tuples", tuples);

translates to: SELECT id, name, state FROM table WHERE (name, age) IN (('John', 35), ('Ann', 50))

Original pull request: #47.
2019-01-18 14:00:08 +01:00
Mark Paluch
3a1085e244 #48 - Polishing.
Formatting.
2019-01-11 10:27:30 +01:00
Mark Paluch
836c5b4ec8 #48 - Atomically close connections.
We now make sure to close connections only once by tracking the cleanup state. Flux.usingWhen/Mono.usingWhen do not ensure atomic cleanup in situations where the subscription completes and then the subscription is terminated.

This behavior has lead to closing a connection multiple times.

Related ticket: reactor/reactor-core#1486
2019-01-11 10:25:55 +01:00
Mark Paluch
2dfb1ff20e #45 - Update copyright years to 2019. 2019-01-02 12:04:47 +01:00
Mark Paluch
9f68352ac7 #30 - Address review feedback.
Introduce ArrayColumns type to encapsulate Dialect-specific array support.
Apply array conversion for properties that do not match the native array type.
Add integration tests for Postgres array columns.

Original pull request: #31.
2018-12-07 11:50:42 +01:00
Jens Schauder
be5383abed #30 - Polishing.
Minor formatting. Add suggestions.

Update src/test/java/org/springframework/data/r2dbc/dialect/PostgresDialectUnitTests.java

Co-Authored-By: mp911de <mpaluch@paluch.biz>

Original pull request: #31.
2018-12-07 11:50:22 +01:00
Mark Paluch
c357e5b543 #30 - Add custom conversion support.
We now support custom conversions via R2dbcCustomConversions.
Custom conversions introduces simple types that depend on the used dialect.
Custom conversions and simple types are held in RelationalConverter and MappingContext.

Simple types and conversions are used by DatabaseClient and repository support to properly apply registered converters and support native types such as array-columns.

Related tickets: #22, #26.
Original pull request: #31.
2018-12-07 11:49:47 +01:00
Mark Paluch
06c2a3a246 #22 - Polishing.
Add author tag. Add unit test for EntityRowMapper.

Original pull request: #31.
2018-12-07 11:49:15 +01:00
Ryland Degnan
f325f45fb6 #22 - Remove restriction on CollectionLike types.
EntityRowMapper now passes-thru values for Collection-like types such as array.
Arrays are supported by Postgres.

Original pull request: #22.
2018-12-07 11:48:26 +01:00
Mark Paluch
9e3601a06d #8 - Reduce API surface for mapped tabular results.
Move retrieval methods from FetchSpec into RowsFetchSpec and UpdatedRowsFetchSpec.

map(…) now returns RowsFetchSpec to not expose updated rows count as mapped results are consumed as objects.

Original pull request: #33.
2018-12-07 11:39:16 +01:00
Mark Paluch
6ad31abd79 #8 - Address review feedback.
Remove unused code from AbstractDatabaseClientIntegrationTests.
Use literal null instead of code null for consistency.

Original pull request: #33.
2018-12-07 11:39:03 +01:00
Jens Schauder
7db8e64393 #8 - Polishing.
Formatting, JavaDoc, issue comments on `@Test` annotations.
Removed some dead code.

Original pull request: #33.
2018-12-07 11:38:52 +01:00
Mark Paluch
5a5310af4d #8 - Replace exchange() method with map(…) and then() methods.
DatabaseClient now no longer exposes the exchange() method but rather provides map(…) and then(…) methods.
Calling map(…) extracts values from tabular results by propagating the mapping function to Result.map(…).
then() allows statement execution without returning the result propagating only completion and error signals.

Original pull request: #33.
2018-12-07 11:38:03 +01:00
Jens Schauder
0aa623280f #20 - Polishing.
Rename Database.latestDialect() to defaultDialect(). Rename Dialect.returnGeneratedKeys() to Dialect.generatedKeysClause(). Simplify IndexBindMarkers. Create BindableOperation.bind(Statement, SettableValue) to reduce code duplicates. Rename BindSpecWrapper to BindSpecAdapter.

Original pull request: #24.
2018-12-03 16:01:39 +01:00