Skip to content

Commit

Permalink
OGM-1519 Test mapping java.time to Infinispan embedded
Browse files Browse the repository at this point in the history
  • Loading branch information
fax4ever committed Aug 31, 2018
1 parent 7962faf commit 5c542fe
Show file tree
Hide file tree
Showing 2 changed files with 103 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
/*
* 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.datastore.infinispan.test.cachemapping;


import static org.hibernate.ogm.datastore.infinispan.utils.InfinispanTestHelper.fetchPropertyMap;
import static org.hibernate.ogm.utils.OgmAssertions.assertThat;

import java.sql.Time;
import java.time.LocalDateTime;
import java.time.Month;

import org.hibernate.ogm.backendtck.type.datetime.LocalDateEntity;
import org.hibernate.ogm.backendtck.type.datetime.LocalTimeEntity;
import org.hibernate.ogm.utils.OgmTestCase;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import org.infinispan.atomic.FineGrainedAtomicMap;

/**
* Tests for the mappings of Date types into Infinispan.
*
* @author Fabio Massimo Ercoli
*/
public class LocalDateTimeMappingTest extends OgmTestCase {

private LocalDateEntity dateEntity;
private LocalTimeEntity timeEntity;

@Before
public void persistEntities() {
LocalDateTime moment = LocalDateTime.of( 2018, Month.AUGUST, 7, 12, 41, 50, 0 );
dateEntity = new LocalDateEntity( 7, "A entity using Java8 local date", moment );
timeEntity = new LocalTimeEntity( 3, "A entity using Java8 local time", moment.toLocalTime() );

inTransaction( session -> {
session.persist( dateEntity );
session.persist( timeEntity );
} );
}

@After
public void deleteEntities() {
inTransaction( session -> {
session.delete( dateEntity );
session.delete( timeEntity );
} );
}

@Test
public void testLocalDateMapping() {
FineGrainedAtomicMap<String, Object> propertyMap = fetchPropertyMap( sessionFactory, "LocalDateEntity", "id", dateEntity.getId() );
assertThat( propertyMap.get( "day" ) ).isEqualTo( dateEntity.getDay() );
}

@Test
public void testLocalDateTimeMapping() {
FineGrainedAtomicMap<String, Object> propertyMap = fetchPropertyMap( sessionFactory, "LocalDateEntity", "id", dateEntity.getId() );
assertThat( propertyMap.get( "moment" ) ).isEqualTo( dateEntity.getMoment() );
}

@Test
public void testLocalTimeMapping() {
FineGrainedAtomicMap<String, Object> propertyMap = fetchPropertyMap( sessionFactory, "LocalTimeEntity", "id", timeEntity.getId() );

// At the time of writing Hibernate ORM convert a LocalTime field into a java.sql.Time
// see org.hibernate.type.LocalTimeType, then compare it with *.LocalDateType and *.LocalDateTimeType.
// In OGM we haven't overridden this behavior.
Time expected = Time.valueOf( timeEntity.getTime() );

assertThat( propertyMap.get( "time" ) ).isEqualTo( expected );
}

@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class[] { LocalDateEntity.class, LocalTimeEntity.class };
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import org.hibernate.ogm.datastore.spi.DatastoreConfiguration;
import org.hibernate.ogm.datastore.spi.DatastoreProvider;
import org.hibernate.ogm.dialect.spi.GridDialect;
import org.hibernate.ogm.model.impl.DefaultEntityKeyMetadata;
import org.hibernate.ogm.model.key.spi.AssociationKeyMetadata;
import org.hibernate.ogm.model.key.spi.EntityKey;
import org.hibernate.ogm.model.key.spi.EntityKeyMetadata;
Expand Down Expand Up @@ -179,4 +180,21 @@ public GridDialect getGridDialect(DatastoreProvider datastoreProvider) {
public Class<? extends DatastoreConfiguration<?>> getDatastoreConfigurationType() {
return InfinispanEmbedded.class;
}

public static FineGrainedAtomicMap<String, Object> fetchPropertyMap(SessionFactory sessionFactory, String cacheName, String keyColumnName, Object keyColumnValue) {
String[] keyColumnNames = { keyColumnName };
Object[] keyColumnValues = { keyColumnValue };

return fetchPropertyMap( sessionFactory, cacheName, keyColumnNames, keyColumnValues );
}

public static FineGrainedAtomicMap<String, Object> fetchPropertyMap(SessionFactory sessionFactory, String cacheName, String[] keyColumnNames, Object[] keyColumnValues) {
EntityKey key = new EntityKey( new DefaultEntityKeyMetadata( cacheName, keyColumnNames ), keyColumnValues );

InfinispanEmbeddedDatastoreProvider provider = getProvider( sessionFactory );
Cache<PersistentEntityKey, Map<String, Object>> entityCache = (Cache<PersistentEntityKey, Map<String, Object>>) getEntityCache( sessionFactory, key.getMetadata() );
PersistentEntityKey entityCacheKey = (PersistentEntityKey) provider.getKeyProvider().getEntityCacheKey( key );

return AtomicMapLookup.getFineGrainedAtomicMap( entityCache, entityCacheKey, false );
}
}

0 comments on commit 5c542fe

Please sign in to comment.