diff --git a/core/src/main/java/org/hibernate/ogm/id/impl/OgmTableGenerator.java b/core/src/main/java/org/hibernate/ogm/id/impl/OgmTableGenerator.java index 0fb004d6a6..81019699ad 100644 --- a/core/src/main/java/org/hibernate/ogm/id/impl/OgmTableGenerator.java +++ b/core/src/main/java/org/hibernate/ogm/id/impl/OgmTableGenerator.java @@ -284,7 +284,7 @@ private Object nullSafeSet(GridType type, Object value, String columnName, Sessi private void defineGridTypes(SessionImplementor session) { if ( identifierValueGridType == null ) { ServiceRegistryImplementor registry = session.getFactory().getServiceRegistry(); - identifierValueGridType = registry.getService( TypeTranslator.class ).getType( new LongType() ); + identifierValueGridType = registry.getService( TypeTranslator.class ).getType( LongType.INSTANCE ); } } } diff --git a/core/src/main/java/org/hibernate/ogm/type/impl/TypeTranslatorImpl.java b/core/src/main/java/org/hibernate/ogm/type/impl/TypeTranslatorImpl.java index fc1b74eb24..d8f7123c69 100644 --- a/core/src/main/java/org/hibernate/ogm/type/impl/TypeTranslatorImpl.java +++ b/core/src/main/java/org/hibernate/ogm/type/impl/TypeTranslatorImpl.java @@ -20,27 +20,6 @@ import org.hibernate.type.CustomType; import org.hibernate.type.EnumType; import org.hibernate.type.Type; -import org.hibernate.type.descriptor.java.BigDecimalTypeDescriptor; -import org.hibernate.type.descriptor.java.BigIntegerTypeDescriptor; -import org.hibernate.type.descriptor.java.BooleanTypeDescriptor; -import org.hibernate.type.descriptor.java.ByteTypeDescriptor; -import org.hibernate.type.descriptor.java.CalendarDateTypeDescriptor; -import org.hibernate.type.descriptor.java.CalendarTypeDescriptor; -import org.hibernate.type.descriptor.java.CharacterTypeDescriptor; -import org.hibernate.type.descriptor.java.ClassTypeDescriptor; -import org.hibernate.type.descriptor.java.DoubleTypeDescriptor; -import org.hibernate.type.descriptor.java.FloatTypeDescriptor; -import org.hibernate.type.descriptor.java.IntegerTypeDescriptor; -import org.hibernate.type.descriptor.java.JavaTypeDescriptor; -import org.hibernate.type.descriptor.java.JdbcDateTypeDescriptor; -import org.hibernate.type.descriptor.java.JdbcTimeTypeDescriptor; -import org.hibernate.type.descriptor.java.JdbcTimestampTypeDescriptor; -import org.hibernate.type.descriptor.java.LongTypeDescriptor; -import org.hibernate.type.descriptor.java.PrimitiveByteArrayTypeDescriptor; -import org.hibernate.type.descriptor.java.ShortTypeDescriptor; -import org.hibernate.type.descriptor.java.StringTypeDescriptor; -import org.hibernate.type.descriptor.java.UUIDTypeDescriptor; -import org.hibernate.type.descriptor.java.UrlTypeDescriptor; import org.hibernate.usertype.UserType; /** @@ -51,34 +30,38 @@ public class TypeTranslatorImpl implements TypeTranslator { private static final Log log = LoggerFactory.make(); - private final Map, GridType> typeConverter; + private final Map typeConverter; private final GridDialect dialect; public TypeTranslatorImpl(GridDialect dialect) { this.dialect = dialect; - Map, GridType> tmpMap = newHashMap( 20 ); - tmpMap.put( ClassTypeDescriptor.INSTANCE, ClassType.INSTANCE ); - tmpMap.put( LongTypeDescriptor.INSTANCE, LongType.INSTANCE ); - tmpMap.put( IntegerTypeDescriptor.INSTANCE, IntegerType.INSTANCE ); - tmpMap.put( DoubleTypeDescriptor.INSTANCE, DoubleType.INSTANCE ); - tmpMap.put( FloatTypeDescriptor.INSTANCE, FloatType.INSTANCE ); - tmpMap.put( ShortTypeDescriptor.INSTANCE, ShortType.INSTANCE ); - tmpMap.put( CharacterTypeDescriptor.INSTANCE, CharacterType.INSTANCE ); - tmpMap.put( StringTypeDescriptor.INSTANCE, StringType.INSTANCE ); - tmpMap.put( UrlTypeDescriptor.INSTANCE, UrlType.INSTANCE ); - tmpMap.put( BigDecimalTypeDescriptor.INSTANCE, BigDecimalType.INSTANCE ); - tmpMap.put( BigIntegerTypeDescriptor.INSTANCE, BigIntegerType.INSTANCE ); - tmpMap.put( BooleanTypeDescriptor.INSTANCE, BooleanType.INSTANCE ); - tmpMap.put( TrueFalseType.INSTANCE.getJavaTypeDescriptor(), TrueFalseType.INSTANCE ); - tmpMap.put( ByteTypeDescriptor.INSTANCE, ByteType.INSTANCE ); - tmpMap.put( JdbcDateTypeDescriptor.INSTANCE, DateType.INSTANCE ); - tmpMap.put( JdbcTimestampTypeDescriptor.INSTANCE, TimestampType.INSTANCE ); - tmpMap.put( JdbcTimeTypeDescriptor.INSTANCE, TimeType.INSTANCE ); - tmpMap.put( CalendarDateTypeDescriptor.INSTANCE, CalendarDateType.INSTANCE ); - tmpMap.put( CalendarTypeDescriptor.INSTANCE, CalendarType.INSTANCE ); - tmpMap.put( PrimitiveByteArrayTypeDescriptor.INSTANCE, PrimitiveByteArrayType.INSTANCE ); - tmpMap.put( UUIDTypeDescriptor.INSTANCE, UUIDType.INSTANCE ); + Map tmpMap = newHashMap( 20 ); + tmpMap.put( org.hibernate.type.ClassType.INSTANCE, ClassType.INSTANCE ); + tmpMap.put( org.hibernate.type.LongType.INSTANCE, LongType.INSTANCE ); + tmpMap.put( org.hibernate.type.IntegerType.INSTANCE, IntegerType.INSTANCE ); + tmpMap.put( org.hibernate.type.DoubleType.INSTANCE, DoubleType.INSTANCE ); + tmpMap.put( org.hibernate.type.FloatType.INSTANCE, FloatType.INSTANCE ); + tmpMap.put( org.hibernate.type.ShortType.INSTANCE, ShortType.INSTANCE ); + tmpMap.put( org.hibernate.type.CharacterType.INSTANCE, CharacterType.INSTANCE ); + tmpMap.put( org.hibernate.type.StringType.INSTANCE, StringType.INSTANCE ); + tmpMap.put( org.hibernate.type.UrlType.INSTANCE, UrlType.INSTANCE ); + tmpMap.put( org.hibernate.type.BigDecimalType.INSTANCE, BigDecimalType.INSTANCE ); + tmpMap.put( org.hibernate.type.BigIntegerType.INSTANCE, BigIntegerType.INSTANCE ); + tmpMap.put( org.hibernate.type.BooleanType.INSTANCE, BooleanType.INSTANCE ); + tmpMap.put( org.hibernate.type.TrueFalseType.INSTANCE, TrueFalseType.INSTANCE ); + tmpMap.put( org.hibernate.type.YesNoType.INSTANCE, YesNoType.INSTANCE ); + tmpMap.put( org.hibernate.type.ByteType.INSTANCE, ByteType.INSTANCE ); + tmpMap.put( org.hibernate.type.DateType.INSTANCE, DateType.INSTANCE ); + tmpMap.put( org.hibernate.type.TimestampType.INSTANCE, TimestampType.INSTANCE ); + tmpMap.put( org.hibernate.type.TimeType.INSTANCE, TimeType.INSTANCE ); + tmpMap.put( org.hibernate.type.CalendarDateType.INSTANCE, CalendarDateType.INSTANCE ); + tmpMap.put( org.hibernate.type.CalendarType.INSTANCE, CalendarType.INSTANCE ); + tmpMap.put( org.hibernate.type.BinaryType.INSTANCE, PrimitiveByteArrayType.INSTANCE ); + tmpMap.put( org.hibernate.type.MaterializedBlobType.INSTANCE, PrimitiveByteArrayType.INSTANCE ); + tmpMap.put( org.hibernate.type.ImageType.INSTANCE, PrimitiveByteArrayType.INSTANCE ); + tmpMap.put( org.hibernate.type.UUIDBinaryType.INSTANCE, UUIDType.INSTANCE ); + tmpMap.put( org.hibernate.type.UUIDCharType.INSTANCE, UUIDType.INSTANCE ); typeConverter = Collections.unmodifiableMap( tmpMap ); } @@ -96,9 +79,9 @@ public TypeTranslatorImpl(GridDialect dialect) { } else if ( type instanceof AbstractStandardBasicType ) { AbstractStandardBasicType exposedType = (AbstractStandardBasicType) type; - final GridType gridType = typeConverter.get( exposedType.getJavaTypeDescriptor() ); + final GridType gridType = typeConverter.get( exposedType ); if (gridType == null) { - throw log.unableToFindGridType( exposedType.getJavaTypeDescriptor().getJavaTypeClass().getName() ); + throw log.unableToFindGridType( exposedType.getName() ); } return gridType; } diff --git a/core/src/main/java/org/hibernate/ogm/type/impl/YesNoType.java b/core/src/main/java/org/hibernate/ogm/type/impl/YesNoType.java new file mode 100644 index 0000000000..aa68eebf5d --- /dev/null +++ b/core/src/main/java/org/hibernate/ogm/type/impl/YesNoType.java @@ -0,0 +1,35 @@ +/* + * Hibernate OGM, Domain model persistence for NoSQL datastores + * + * 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.ogm.type.impl; + +import org.hibernate.MappingException; +import org.hibernate.engine.spi.Mapping; +import org.hibernate.ogm.type.descriptor.impl.CharMappedGridTypeDescriptor; + +/** + * Maps {@link Boolean} to {@code Y} or {@code N} characters. + * + * @author Gunnar Morling + */ +public class YesNoType extends AbstractGenericBasicType { + + public static final YesNoType INSTANCE = new YesNoType(); + + public YesNoType() { + super( CharMappedGridTypeDescriptor.INSTANCE, org.hibernate.type.YesNoType.INSTANCE.getJavaTypeDescriptor() ); + } + + @Override + public int getColumnSpan(Mapping mapping) throws MappingException { + return 1; + } + + @Override + public String getName() { + return "yes_no"; + } +} diff --git a/core/src/test/java/org/hibernate/ogm/backendtck/type/Bookmark.java b/core/src/test/java/org/hibernate/ogm/backendtck/type/Bookmark.java index eaed754d99..b9a1f756a7 100644 --- a/core/src/test/java/org/hibernate/ogm/backendtck/type/Bookmark.java +++ b/core/src/test/java/org/hibernate/ogm/backendtck/type/Bookmark.java @@ -57,6 +57,9 @@ public enum Classifier { @Type(type = "true_false") private boolean isPrivate; + @Type(type = "yes_no") + private boolean isRead; + // byte arrays @Lob private byte[] lob; @@ -167,6 +170,14 @@ public boolean isPrivate() { return isPrivate; } + public void setRead(boolean isRead) { + this.isRead = isRead; + } + + public boolean isRead() { + return isRead; + } + public Byte getDisplayMask() { return displayMask; } diff --git a/core/src/test/java/org/hibernate/ogm/backendtck/type/BuiltInTypeTest.java b/core/src/test/java/org/hibernate/ogm/backendtck/type/BuiltInTypeTest.java index 8be7366e3c..8518705d69 100644 --- a/core/src/test/java/org/hibernate/ogm/backendtck/type/BuiltInTypeTest.java +++ b/core/src/test/java/org/hibernate/ogm/backendtck/type/BuiltInTypeTest.java @@ -133,6 +133,14 @@ public void testTrueFalseMappedBooleanSupport() throws Exception { assertEquals( "Boolean value does not match", bookmark.isPrivate(), loadedBookmark.isPrivate() ); } + @Test + public void testYesNoMappedBooleanSupport() throws Exception { + bookmark.setRead( true ); + + Bookmark loadedBookmark = saveAndGet( bookmark ); + assertEquals( "Boolean value does not match", bookmark.isRead(), loadedBookmark.isRead() ); + } + @Test public void testByteSupport() throws Exception { bookmark.setDisplayMask( (byte) '8' ); diff --git a/couchdb/src/main/java/org/hibernate/ogm/datastore/couchdb/CouchDBDialect.java b/couchdb/src/main/java/org/hibernate/ogm/datastore/couchdb/CouchDBDialect.java index c675f744a4..aff046b450 100644 --- a/couchdb/src/main/java/org/hibernate/ogm/datastore/couchdb/CouchDBDialect.java +++ b/couchdb/src/main/java/org/hibernate/ogm/datastore/couchdb/CouchDBDialect.java @@ -23,6 +23,7 @@ import org.hibernate.ogm.datastore.couchdb.dialect.type.impl.CouchDBBlobType; import org.hibernate.ogm.datastore.couchdb.dialect.type.impl.CouchDBByteType; import org.hibernate.ogm.datastore.couchdb.dialect.type.impl.CouchDBLongType; +import org.hibernate.ogm.datastore.couchdb.dialect.type.impl.CouchDBStringType; import org.hibernate.ogm.datastore.couchdb.impl.CouchDBDatastoreProvider; import org.hibernate.ogm.datastore.couchdb.util.impl.Identifier; import org.hibernate.ogm.datastore.document.options.AssociationStorageType; @@ -45,6 +46,7 @@ import org.hibernate.ogm.model.spi.Tuple; import org.hibernate.ogm.type.impl.Iso8601StringCalendarType; import org.hibernate.ogm.type.impl.Iso8601StringDateType; +import org.hibernate.ogm.type.impl.StringType; import org.hibernate.ogm.type.spi.GridType; import org.hibernate.type.BinaryType; import org.hibernate.type.StandardBasicTypes; @@ -223,6 +225,9 @@ public Number nextValue(NextValueRequest request) { @Override public GridType overrideType(Type type) { + if ( type == CouchDBStringType.INSTANCE ) { + return StringType.INSTANCE; + } if ( type == StandardBasicTypes.MATERIALIZED_BLOB ) { return CouchDBBlobType.INSTANCE; } diff --git a/couchdb/src/main/java/org/hibernate/ogm/datastore/couchdb/dialect/type/impl/CouchDBStringType.java b/couchdb/src/main/java/org/hibernate/ogm/datastore/couchdb/dialect/type/impl/CouchDBStringType.java index 5677cde404..c1b7166032 100644 --- a/couchdb/src/main/java/org/hibernate/ogm/datastore/couchdb/dialect/type/impl/CouchDBStringType.java +++ b/couchdb/src/main/java/org/hibernate/ogm/datastore/couchdb/dialect/type/impl/CouchDBStringType.java @@ -21,6 +21,8 @@ */ public class CouchDBStringType extends StringType implements VersionType { + public static final CouchDBStringType INSTANCE = new CouchDBStringType(); + @Override public String seed(SessionImplementor session) { return null; diff --git a/couchdb/src/main/java/org/hibernate/ogm/datastore/couchdb/dialect/type/impl/CouchDBTypeContributor.java b/couchdb/src/main/java/org/hibernate/ogm/datastore/couchdb/dialect/type/impl/CouchDBTypeContributor.java index 1b2a62213b..e679689011 100644 --- a/couchdb/src/main/java/org/hibernate/ogm/datastore/couchdb/dialect/type/impl/CouchDBTypeContributor.java +++ b/couchdb/src/main/java/org/hibernate/ogm/datastore/couchdb/dialect/type/impl/CouchDBTypeContributor.java @@ -19,6 +19,6 @@ public class CouchDBTypeContributor implements TypeContributor { @Override public void contribute(TypeContributions typeContributions, ServiceRegistry serviceRegistry) { - typeContributions.contributeType( new CouchDBStringType() ); + typeContributions.contributeType( CouchDBStringType.INSTANCE ); } } diff --git a/mongodb/src/test/java/org/hibernate/ogm/datastore/mongodb/test/mapping/BuiltinTypeMappingTest.java b/mongodb/src/test/java/org/hibernate/ogm/datastore/mongodb/test/mapping/BuiltinTypeMappingTest.java index 35a9080a49..f57ac1f3c7 100644 --- a/mongodb/src/test/java/org/hibernate/ogm/datastore/mongodb/test/mapping/BuiltinTypeMappingTest.java +++ b/mongodb/src/test/java/org/hibernate/ogm/datastore/mongodb/test/mapping/BuiltinTypeMappingTest.java @@ -33,6 +33,7 @@ public void setUpTestData() { Bookmark bookmark = new Bookmark(); bookmark.setFavourite( Boolean.TRUE ); bookmark.setPrivate( true ); + bookmark.setRead( true ); session.persist( bookmark ); transaction.commit(); @@ -100,6 +101,30 @@ public void trueFalseTypeMapping() { session.close(); } + @Test + public void yesNoTypeMapping() { + OgmSession session = openSession(); + Transaction transaction = session.beginTransaction(); + + assertDbObject( + session.getSessionFactory(), + // collection + "Bookmark", + // query + "{ '_id' : '" + bookmarkId + "' }", + // fields + "{ 'isRead' : '1' }", + // expected + "{ " + + "'_id' : '" + bookmarkId + "', " + + "'isRead' : 'Y'" + + "}" + ); + + transaction.commit(); + session.close(); + } + @Override protected Class[] getAnnotatedClasses() { return new Class[] { Bookmark.class };