From 25c4f4469dd3dcd20582fd991d26aeddb9f6bde0 Mon Sep 17 00:00:00 2001 From: Gunnar Morling Date: Wed, 13 May 2015 10:59:54 +0200 Subject: [PATCH] OGM-717 Adding support for @Type(type = "numeric_boolean") --- .../impl/IntegerMappedGridTypeDescriptor.java | 36 +++++++++++++++++++ .../ogm/type/impl/NumericBooleanType.java | 35 ++++++++++++++++++ .../ogm/type/impl/TypeTranslatorImpl.java | 1 + .../ogm/backendtck/type/Bookmark.java | 11 ++++++ .../ogm/backendtck/type/BuiltInTypeTest.java | 8 +++++ .../test/mapping/BuiltinTypeMappingTest.java | 25 +++++++++++++ 6 files changed, 116 insertions(+) create mode 100644 core/src/main/java/org/hibernate/ogm/type/descriptor/impl/IntegerMappedGridTypeDescriptor.java create mode 100644 core/src/main/java/org/hibernate/ogm/type/impl/NumericBooleanType.java diff --git a/core/src/main/java/org/hibernate/ogm/type/descriptor/impl/IntegerMappedGridTypeDescriptor.java b/core/src/main/java/org/hibernate/ogm/type/descriptor/impl/IntegerMappedGridTypeDescriptor.java new file mode 100644 index 0000000000..fd4224671a --- /dev/null +++ b/core/src/main/java/org/hibernate/ogm/type/descriptor/impl/IntegerMappedGridTypeDescriptor.java @@ -0,0 +1,36 @@ +/* + * 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.descriptor.impl; + +import org.hibernate.ogm.model.spi.Tuple; +import org.hibernate.type.descriptor.WrapperOptions; +import org.hibernate.type.descriptor.java.JavaTypeDescriptor; + +/** + * Maps a field to an {@link Integer} value. + * + * @author Gunnar Morling + */ +public class IntegerMappedGridTypeDescriptor implements GridTypeDescriptor { + + public static final IntegerMappedGridTypeDescriptor INSTANCE = new IntegerMappedGridTypeDescriptor(); + + @Override + public GridValueBinder getBinder(final JavaTypeDescriptor javaTypeDescriptor) { + return new BasicGridBinder(javaTypeDescriptor, this) { + @Override + protected void doBind(Tuple resultset, X value, String[] names, WrapperOptions options) { + resultset.put( names[0], javaTypeDescriptor.unwrap( value, Integer.class, options ) ); + } + }; + } + + @Override + public GridValueExtractor getExtractor(JavaTypeDescriptor javaTypeDescriptor) { + return new BasicGridExtractor( javaTypeDescriptor, true ); + } +} diff --git a/core/src/main/java/org/hibernate/ogm/type/impl/NumericBooleanType.java b/core/src/main/java/org/hibernate/ogm/type/impl/NumericBooleanType.java new file mode 100644 index 0000000000..8fee0bf273 --- /dev/null +++ b/core/src/main/java/org/hibernate/ogm/type/impl/NumericBooleanType.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.IntegerMappedGridTypeDescriptor; + +/** + * Maps {@link Boolean} to ints {@code 1} or {@code 0}. + * + * @author Gunnar Morling + */ +public class NumericBooleanType extends AbstractGenericBasicType { + + public static final NumericBooleanType INSTANCE = new NumericBooleanType(); + + public NumericBooleanType() { + super( IntegerMappedGridTypeDescriptor.INSTANCE, org.hibernate.type.NumericBooleanType.INSTANCE.getJavaTypeDescriptor() ); + } + + @Override + public int getColumnSpan(Mapping mapping) throws MappingException { + return 1; + } + + @Override + public String getName() { + return "numeric_boolean"; + } +} 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 d8f7123c69..0cc6d75642 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 @@ -51,6 +51,7 @@ public TypeTranslatorImpl(GridDialect dialect) { 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.NumericBooleanType.INSTANCE, NumericBooleanType.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 ); 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 b9a1f756a7..e0f4c1ae9e 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 @@ -60,6 +60,9 @@ public enum Classifier { @Type(type = "yes_no") private boolean isRead; + @Type(type = "numeric_boolean") + private boolean isShared; + // byte arrays @Lob private byte[] lob; @@ -178,6 +181,14 @@ public boolean isRead() { return isRead; } + public void setShared(boolean isShared) { + this.isShared = isShared; + } + + public boolean isShared() { + return isShared; + } + 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 8518705d69..110ca96925 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 @@ -141,6 +141,14 @@ public void testYesNoMappedBooleanSupport() throws Exception { assertEquals( "Boolean value does not match", bookmark.isRead(), loadedBookmark.isRead() ); } + @Test + public void testNumericallyMappedBooleanSupport() throws Exception { + bookmark.setShared( true ); + + Bookmark loadedBookmark = saveAndGet( bookmark ); + assertEquals( "Boolean value does not match", bookmark.isShared(), loadedBookmark.isShared() ); + } + @Test public void testByteSupport() throws Exception { bookmark.setDisplayMask( (byte) '8' ); 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 f57ac1f3c7..5bc1899717 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 @@ -34,6 +34,7 @@ public void setUpTestData() { bookmark.setFavourite( Boolean.TRUE ); bookmark.setPrivate( true ); bookmark.setRead( true ); + bookmark.setShared( true ); session.persist( bookmark ); transaction.commit(); @@ -125,6 +126,30 @@ public void yesNoTypeMapping() { session.close(); } + @Test + public void numericBooleanMapping() { + OgmSession session = openSession(); + Transaction transaction = session.beginTransaction(); + + assertDbObject( + session.getSessionFactory(), + // collection + "Bookmark", + // query + "{ '_id' : '" + bookmarkId + "' }", + // fields + "{ 'isShared' : '1' }", + // expected + "{ " + + "'_id' : '" + bookmarkId + "', " + + "'isShared' : 1" + + "}" + ); + + transaction.commit(); + session.close(); + } + @Override protected Class[] getAnnotatedClasses() { return new Class[] { Bookmark.class };