Commit Graph

122 Commits

Author SHA1 Message Date
Mark Paluch
0d5f5089be #135 - Adapt to renamed TransactionSynchronizationManager.forCurrentTransaction(). 2019-06-05 14:35:16 +02:00
Mark Paluch
bedc18bc69 #105 - Move named parameter resolution to ReactiveDataAccessStrategy.
Named parameter resolution is now provided as part of ReactiveDataAccessStrategy. This allows us to hide implementation internals (bind markers). DatabaseClient allows configuration whether to use named parameter expansion.

Detailed configuration of named parameter support is now moved to DefaultReactiveDataAccessStrategy.

Original pull request: #105.
2019-06-04 14:34:35 +02:00
Jens Schauder
7372efe3e6 #98 - Polishing.
Formatting.
Changed generics to avoid unchecked casting.
Avoided abbreviated variable name.
Simplified handling of absent keys at ConnectionFactory lookup.

Original pull request: #132.
2019-06-04 11:53:06 +02:00
Mark Paluch
e3aae619f4 #98 - Add support for AbstractRoutingConnectionFactory.
We now provide an abstract base class for ConnectionFactory routing. Routing keys are typically obtained from a subscriber context. AbstractRoutingConnectionFactory is backed by either a map of string identifiers or connection factories. When using string identifiers, these can map agains e.g. Spring bean names that can be resolved using BeanFactoryConnectionFactoryLookup.

class MyRoutingConnectionFactory extends AbstractRoutingConnectionFactory {

		@Override
		protected Mono<Object> determineCurrentLookupKey() {
			return Mono.subscriberContext().filter(it -> it.hasKey(ROUTING_KEY)).map(it -> it.get(ROUTING_KEY));
		}
}

@Bean
public void routingConnectionFactory() {

		MyRoutingConnectionFactory router = new MyRoutingConnectionFactory();

		Map<String, ConnectionFactory> factories = new HashMap<>();
		ConnectionFactory myDefault = …;
		ConnectionFactory primary = …;
		ConnectionFactory secondary = …;

		factories.put("primary", primary);
		factories.put("secondary", secondary);

		router.setTargetConnectionFactories(factories);
		router.setDefaultTargetConnectionFactory(myDefault);

		return router;
}

Original pull request: #132.
2019-06-04 11:52:32 +02:00
Mark Paluch
d6c812a4eb #104 - Incorporate review feedback.
Original pull request: #127.
2019-05-27 17:11:30 +02:00
Mark Paluch
9f6cf4061c #104 - Polishing.
Fix documentation links. Use variables for links to Spring Framework reference docs.

Original pull request: #127.
2019-05-27 17:11:30 +02:00
Mark Paluch
043e8a6855 #104 - Provide extension mechanism for R2dbcDialect resolution.
We now use Spring's spring.factories mechanism to register and lookup R2dbcDialectProvider implementations.
This allows a pluggable model for third party implementations to ship R2dbcDialect support that can be auto-discovered.

Original pull request: #127.
2019-05-27 17:11:29 +02:00
Toshiaki Maki
85dcf6b71d #130 - Fix scheme name in sample code.
Fix scheme name.
2019-05-24 16:10:41 +02:00
Mark Paluch
376bfef387 #128 - Fix NullPointerException calling bindNull() with enabled named parameter support. 2019-05-23 10:09:31 +02:00
Mark Paluch
67c71fd584 #87 - Polishing.
Qualify field access with this.
2019-05-22 15:50:28 +02:00
Mark Paluch
d4a06a781c #87 - Consistently use RowMetadata.
We now apply row metadata checks also for property population.
2019-05-22 15:50:02 +02:00
Jens Schauder
ac4e84dc81 #55 - Polishing.
Minor changes to documentation in order to avoid <literal code>``s constructs as recommended by our style guide.

Original pull request: #125.
2019-05-22 14:22:07 +02:00
Mark Paluch
1b63fb634d #55 - Update documentation.
Original pull request: #125.
2019-05-22 14:21:58 +02:00
Mark Paluch
e03d1dc8ee #55 - Polishing.
Original pull request: #125.
2019-05-22 14:21:52 +02:00
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
972bc09606 #122 - Polishing.
Add extension for UpdateTableSpec.table. Add tests. Formatting.

Original pull request: #123.
2019-05-21 15:53:18 +02:00
Jonas Bark
9bcaa24707 #122 - Improve Kotlin extensions for CriteriaStep and DatabaseClient.
Original pull request: #123.
2019-05-21 15:53:08 +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
Ohad Shai
36c4c1d062 #120 - Fix link text for jasync-sql.
Original pull request: #120.
2019-05-19 13:44:58 +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
cbead6ea19 #37 - Prepare 1.0 M2. 2019-05-14 10:31:50 +02:00
Mark Paluch
55a6ae0a2a #37 - Updated changelog. 2019-05-14 10:31:49 +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
ff69a41162 #64 - Split documentation for R2DBC core into parts.
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
c9435c8797 #75 - Polishing.
Unify connection creation by providing JDBC URL. Obtain R2DBC ConnectionFactory using connection factory discovery.

Original pull request: #84.
2019-04-17 16:23:40 +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
cca38b4480 #90 - Add additional subclasses to test against H2.
We now run all of our integration test also against H2.

Original pull request: #90.
2019-04-17 13:00:19 +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
Sebastien Deleuze
30fb4d57b9 #91 - Add RowsFetchSpec<T>.flow() extension.
Original pull request: #91.
2019-04-09 15:37:15 +02:00
Mark Paluch
591072f93c #86 - Polishing
Remove unused imports.

Original pull request: #86.
2019-04-03 09:43:02 +02:00
Sebastien Deleuze
372f5f02d4 #86 - Polishing.
Convert idents to tabs. Fix Kotlin extensions formatting.

Original pull request: #86.
2019-04-03 09:42:48 +02:00
Sebastien Deleuze
43a74cae31 #86 - Add non-nullable variant to RowsFetchSpec extensions.
This commit is a follow-up of gh-63.

Original pull request: #86.
2019-04-03 09:42:36 +02:00