Skip to content

Commit

Permalink
OGM-717 Adding support for @type(type = "yes_no");
Browse files Browse the repository at this point in the history
* Using types instead of descriptors as key in type translator in order to allow for one descriptor being used by different types (which is the case for BooleanTypeDescriptor which is used by the different boolean types)
  • Loading branch information
gunnarmorling authored and DavideD committed May 14, 2015
1 parent a2b310e commit a69174c
Show file tree
Hide file tree
Showing 9 changed files with 117 additions and 48 deletions.
Expand Up @@ -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 );
}
}
}
Expand Up @@ -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;

/**
Expand All @@ -51,34 +30,38 @@ public class TypeTranslatorImpl implements TypeTranslator {

private static final Log log = LoggerFactory.make();

private final Map<JavaTypeDescriptor<?>, GridType> typeConverter;
private final Map<Type, GridType> typeConverter;
private final GridDialect dialect;

public TypeTranslatorImpl(GridDialect dialect) {
this.dialect = dialect;

Map<JavaTypeDescriptor<?>, 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<Type, GridType> 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 );
}
Expand All @@ -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;
}
Expand Down
35 changes: 35 additions & 0 deletions 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 <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.CharMappedGridTypeDescriptor;

/**
* Maps {@link Boolean} to {@code Y} or {@code N} characters.
*
* @author Gunnar Morling
*/
public class YesNoType extends AbstractGenericBasicType<Boolean> {

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";
}
}
11 changes: 11 additions & 0 deletions core/src/test/java/org/hibernate/ogm/backendtck/type/Bookmark.java
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down
Expand Up @@ -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' );
Expand Down
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down
Expand Up @@ -21,6 +21,8 @@
*/
public class CouchDBStringType extends StringType implements VersionType<String> {

public static final CouchDBStringType INSTANCE = new CouchDBStringType();

@Override
public String seed(SessionImplementor session) {
return null;
Expand Down
Expand Up @@ -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 );
}
}
Expand Up @@ -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();
Expand Down Expand Up @@ -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 };
Expand Down

0 comments on commit a69174c

Please sign in to comment.