From 9c6539f05e8595c757b87f2d19a62edc62cc8a9f Mon Sep 17 00:00:00 2001 From: Fabio Massimo Ercoli Date: Thu, 14 Feb 2019 15:29:09 +0100 Subject: [PATCH] HSEARCH-3047 Map UUID to String type at mapping stage --- .../types/UUIDPropertyTypeDescriptor.java | 16 +++-- .../builtin/impl/DefaultUUIDValueBridge.java | 66 +++++++++++++++++++ .../pojo/bridge/impl/BridgeResolver.java | 3 +- 3 files changed, 77 insertions(+), 8 deletions(-) create mode 100644 mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/bridge/builtin/impl/DefaultUUIDValueBridge.java diff --git a/integrationtest/mapper/pojo/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/testsupport/types/UUIDPropertyTypeDescriptor.java b/integrationtest/mapper/pojo/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/testsupport/types/UUIDPropertyTypeDescriptor.java index e56434919e7..8d68a6511de 100644 --- a/integrationtest/mapper/pojo/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/testsupport/types/UUIDPropertyTypeDescriptor.java +++ b/integrationtest/mapper/pojo/src/test/java/org/hibernate/search/integrationtest/mapper/pojo/testsupport/types/UUIDPropertyTypeDescriptor.java @@ -57,15 +57,15 @@ public Class getTypeWithIdentifierBridge2() { @Override public Optional> getDefaultValueBridgeExpectations() { - return Optional.of( new DefaultValueBridgeExpectations() { + return Optional.of( new DefaultValueBridgeExpectations() { @Override public Class getProjectionType() { return UUID.class; } @Override - public Class getIndexFieldJavaType() { - return UUID.class; + public Class getIndexFieldJavaType() { + return String.class; } @Override @@ -74,8 +74,8 @@ public List getEntityPropertyValues() { } @Override - public List getDocumentFieldValues() { - return getEntityPropertyValues(); + public List getDocumentFieldValues() { + return getStrings(); } @Override @@ -157,7 +157,8 @@ public static List getSequence() { new UUID( Long.MIN_VALUE, 0L ), new UUID( Long.MIN_VALUE, 1L ), new UUID( Long.MAX_VALUE, Long.MIN_VALUE ), - new UUID( Long.MAX_VALUE, Long.MAX_VALUE ) + new UUID( Long.MAX_VALUE, Long.MAX_VALUE ), + UUID.fromString( "8cea97f9-9696-4299-9f05-636a208b6c1f" ) ); } @@ -168,7 +169,8 @@ public static List getStrings() { "80000000-0000-0000-0000-000000000000", "80000000-0000-0000-0000-000000000001", "7fffffff-ffff-ffff-8000-000000000000", - "7fffffff-ffff-ffff-7fff-ffffffffffff" + "7fffffff-ffff-ffff-7fff-ffffffffffff", + "8cea97f9-9696-4299-9f05-636a208b6c1f" ); } } diff --git a/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/bridge/builtin/impl/DefaultUUIDValueBridge.java b/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/bridge/builtin/impl/DefaultUUIDValueBridge.java new file mode 100644 index 00000000000..4e688fd640d --- /dev/null +++ b/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/bridge/builtin/impl/DefaultUUIDValueBridge.java @@ -0,0 +1,66 @@ +/* + * Hibernate Search, full-text search for your domain model + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later + * See the lgpl.txt file in the root directory or . + */ +package org.hibernate.search.mapper.pojo.bridge.builtin.impl; + +import java.util.UUID; + +import org.hibernate.search.engine.backend.types.converter.FromDocumentFieldValueConverter; +import org.hibernate.search.engine.backend.types.converter.runtime.FromDocumentFieldValueConvertContext; +import org.hibernate.search.engine.backend.types.dsl.StandardIndexFieldTypeContext; +import org.hibernate.search.mapper.pojo.bridge.ValueBridge; +import org.hibernate.search.mapper.pojo.bridge.binding.ValueBridgeBindingContext; +import org.hibernate.search.mapper.pojo.bridge.runtime.ValueBridgeToIndexedValueContext; + +public final class DefaultUUIDValueBridge implements ValueBridge { + + @Override + public String toString() { + return getClass().getSimpleName(); + } + + @Override + @SuppressWarnings("unchecked") // The bridge resolver performs the checks using reflection + public StandardIndexFieldTypeContext bind(ValueBridgeBindingContext context) { + return context.getTypeFactory().asString() + .projectionConverter( PojoDefaultUUIDFromDocumentFieldValueConverter.INSTANCE ); + } + + @Override + public String toIndexedValue(UUID value, ValueBridgeToIndexedValueContext context) { + return value == null ? null : value.toString(); + } + + @Override + public UUID cast(Object value) { + return (UUID) value; + } + + @Override + public boolean isCompatibleWith(ValueBridge other) { + return getClass().equals( other.getClass() ); + } + + private static class PojoDefaultUUIDFromDocumentFieldValueConverter + implements FromDocumentFieldValueConverter { + private static final PojoDefaultUUIDFromDocumentFieldValueConverter INSTANCE = new PojoDefaultUUIDFromDocumentFieldValueConverter(); + + @Override + public boolean isConvertedTypeAssignableTo(Class superTypeCandidate) { + return superTypeCandidate.isAssignableFrom( UUID.class ); + } + + @Override + public UUID convert(String value, FromDocumentFieldValueConvertContext context) { + return value == null ? null : UUID.fromString( value ); + } + + @Override + public boolean isCompatibleWith(FromDocumentFieldValueConverter other) { + return INSTANCE.equals( other ); + } + } +} diff --git a/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/bridge/impl/BridgeResolver.java b/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/bridge/impl/BridgeResolver.java index 17268bc9437..fec94c05f19 100644 --- a/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/bridge/impl/BridgeResolver.java +++ b/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/bridge/impl/BridgeResolver.java @@ -48,6 +48,7 @@ import org.hibernate.search.mapper.pojo.bridge.builtin.impl.DefaultLongIdentifierBridge; import org.hibernate.search.mapper.pojo.bridge.builtin.impl.DefaultShortIdentifierBridge; import org.hibernate.search.mapper.pojo.bridge.builtin.impl.DefaultUUIDIdentifierBridge; +import org.hibernate.search.mapper.pojo.bridge.builtin.impl.DefaultUUIDValueBridge; import org.hibernate.search.mapper.pojo.bridge.builtin.impl.PassThroughValueBridge; import org.hibernate.search.mapper.pojo.bridge.mapping.BridgeBuilder; import org.hibernate.search.mapper.pojo.logging.impl.Log; @@ -98,7 +99,7 @@ public BridgeResolver(TypePatternMatcherFactory typePatternMatcherFactory) { addValueBridgeForExactRawType( Double.class, ignored -> BeanHolder.of( new PassThroughValueBridge<>( Double.class ) ) ); addValueBridgeForExactRawType( BigDecimal.class, ignored -> BeanHolder.of( new PassThroughValueBridge<>( BigDecimal.class ) ) ); addValueBridgeForExactRawType( BigInteger.class, ignored -> BeanHolder.of( new PassThroughValueBridge<>( BigInteger.class ) ) ); - addValueBridgeForExactRawType( UUID.class, ignored -> BeanHolder.of( new PassThroughValueBridge<>( UUID.class ) ) ); + addValueBridgeForExactRawType( UUID.class, ignored -> BeanHolder.of( new DefaultUUIDValueBridge() ) ); addValueBridgeForExactRawType( LocalDateTime.class, ignored -> BeanHolder.of( new PassThroughValueBridge<>( LocalDateTime.class ) ) ); addValueBridgeForExactRawType( LocalTime.class, ignored -> BeanHolder.of( new PassThroughValueBridge<>( LocalTime.class ) ) ); addValueBridgeForExactRawType( ZonedDateTime.class, ignored -> BeanHolder.of( new PassThroughValueBridge<>( ZonedDateTime.class ) ) );