From 19f572f53be001976ac9f805c494c204aa638a94 Mon Sep 17 00:00:00 2001 From: berry120 Date: Mon, 2 Sep 2019 17:19:39 +0100 Subject: [PATCH] #166 - Add the ability to define dialect-specific converters in R2dbcDialect for MySQL. Add a MySql specific dialect converter for converting from byte to boolean. Original pull request: #168. --- .../config/AbstractR2dbcConfiguration.java | 2 +- .../data/r2dbc/dialect/MySqlDialect.java | 46 +++++++++++++++++++ .../data/r2dbc/dialect/R2dbcDialect.java | 9 ++++ 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/data/r2dbc/config/AbstractR2dbcConfiguration.java b/src/main/java/org/springframework/data/r2dbc/config/AbstractR2dbcConfiguration.java index 6b1d1bbb..8e1ea709 100644 --- a/src/main/java/org/springframework/data/r2dbc/config/AbstractR2dbcConfiguration.java +++ b/src/main/java/org/springframework/data/r2dbc/config/AbstractR2dbcConfiguration.java @@ -174,7 +174,7 @@ public abstract class AbstractR2dbcConfiguration implements ApplicationContextAw protected StoreConversions getStoreConversions() { R2dbcDialect dialect = getDialect(lookupConnectionFactory()); - return StoreConversions.of(dialect.getSimpleTypeHolder(), R2dbcCustomConversions.STORE_CONVERTERS); + return StoreConversions.of(dialect.getSimpleTypeHolder(), dialect.getConverters(), R2dbcCustomConversions.STORE_CONVERTERS); } /** diff --git a/src/main/java/org/springframework/data/r2dbc/dialect/MySqlDialect.java b/src/main/java/org/springframework/data/r2dbc/dialect/MySqlDialect.java index 78f2c015..3259e9ea 100644 --- a/src/main/java/org/springframework/data/r2dbc/dialect/MySqlDialect.java +++ b/src/main/java/org/springframework/data/r2dbc/dialect/MySqlDialect.java @@ -18,11 +18,15 @@ package org.springframework.data.r2dbc.dialect; import java.net.InetAddress; import java.net.URI; import java.net.URL; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.HashSet; +import java.util.List; import java.util.Set; import java.util.UUID; +import org.springframework.core.convert.converter.Converter; /** * An SQL dialect for MySQL. @@ -41,6 +45,19 @@ public class MySqlDialect extends org.springframework.data.relational.core.diale public static final MySqlDialect INSTANCE = new MySqlDialect(); private static final BindMarkersFactory ANONYMOUS = BindMarkersFactory.anonymous("?"); + + /** + * MySql specific converters. + */ + public static final List CONVERTERS; + + static { + List converters = new ArrayList<>(); + + converters.add(ByteToBooleanConverter.INSTANCE); + + CONVERTERS = Collections.unmodifiableList(converters); + } /* * (non-Javadoc) @@ -59,4 +76,33 @@ public class MySqlDialect extends org.springframework.data.relational.core.diale public Collection> getSimpleTypes() { return SIMPLE_TYPES; } + + /* + * (non-Javadoc) + * @see org.springframework.data.r2dbc.dialect.R2dbcDialect#getConverters() + */ + @Override + public Collection getConverters() { + return CONVERTERS; + } + + /** + * Simple singleton to convert {@link Byte}s to their {@link Boolean} + * representation. MySQL does not have a built in boolean type by default, + * so relies on using a byte instead. Non-zero values represent true. + * + * @author Michael Berry + */ + public enum ByteToBooleanConverter implements Converter { + + INSTANCE; + + @Override + public Boolean convert(Byte s) { + if (s == null) { + return null; + } + return s != 0; + } + } } diff --git a/src/main/java/org/springframework/data/r2dbc/dialect/R2dbcDialect.java b/src/main/java/org/springframework/data/r2dbc/dialect/R2dbcDialect.java index 510fb7fa..b1b420d3 100644 --- a/src/main/java/org/springframework/data/r2dbc/dialect/R2dbcDialect.java +++ b/src/main/java/org/springframework/data/r2dbc/dialect/R2dbcDialect.java @@ -48,4 +48,13 @@ public interface R2dbcDialect extends Dialect { return new SimpleTypeHolder(simpleTypes, true); } + + /** + * Return a collection of converters for this dialect. + * + * @return a collection of converters for this dialect. + */ + default Collection getConverters() { + return Collections.emptySet(); + } }