Skip to content

Commit

Permalink
OGM-717 Adding support for @type(type = "numeric_boolean")
Browse files Browse the repository at this point in the history
  • Loading branch information
gunnarmorling authored and DavideD committed May 14, 2015
1 parent a69174c commit 25c4f44
Show file tree
Hide file tree
Showing 6 changed files with 116 additions and 0 deletions.
@@ -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 <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
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 <X> GridValueBinder<X> getBinder(final JavaTypeDescriptor<X> javaTypeDescriptor) {
return new BasicGridBinder<X>(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 <X> GridValueExtractor<X> getExtractor(JavaTypeDescriptor<X> javaTypeDescriptor) {
return new BasicGridExtractor<X>( javaTypeDescriptor, true );
}
}
@@ -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 <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
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<Boolean> {

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";
}
}
Expand Up @@ -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 );
Expand Down
11 changes: 11 additions & 0 deletions core/src/test/java/org/hibernate/ogm/backendtck/type/Bookmark.java
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down
Expand Up @@ -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' );
Expand Down
Expand Up @@ -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();
Expand Down Expand Up @@ -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 };
Expand Down

0 comments on commit 25c4f44

Please sign in to comment.