From ad68fafca014b6356e9b43047dce14ed157e9a5c Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Thu, 12 May 2016 12:39:36 +0200 Subject: [PATCH] OGM-854 Enforce only one EntityKeyMetadata in the forEachTuple contract As we now require a proper TupleContext, we need to only work on a given EntityKeyMetadata at a time. Note that the current usages of the forEachTuple method were already respecting this rule. --- .../datastore/cassandra/CassandraDialect.java | 29 ++++++++--------- .../ogm/datastore/map/impl/MapDialect.java | 8 ++--- .../dialect/impl/ForwardingGridDialect.java | 4 +-- .../ogm/dialect/spi/GridDialect.java | 6 ++-- .../ogm/test/batch/BatchExecutionTest.java | 2 +- .../DatastoreProviderGeneratingSchema.java | 2 +- .../model/SampleDatastoreProvider.java | 2 +- .../ogm/datastore/couchdb/CouchDBDialect.java | 6 ++-- .../ogm/datastore/ehcache/EhcacheDialect.java | 4 +-- .../infinispan/InfinispanDialect.java | 4 +-- .../ogm/datastore/mongodb/MongoDBDialect.java | 10 +++--- .../ogm/datastore/neo4j/Neo4jDialect.java | 26 +++++++--------- .../ogm/datastore/redis/RedisHashDialect.java | 31 +++++++++---------- .../ogm/datastore/redis/RedisJsonDialect.java | 26 +++++++--------- 14 files changed, 72 insertions(+), 88 deletions(-) diff --git a/cassandra/src/main/java/org/hibernate/ogm/datastore/cassandra/CassandraDialect.java b/cassandra/src/main/java/org/hibernate/ogm/datastore/cassandra/CassandraDialect.java index 3d8595dfdf..56cdb5b741 100644 --- a/cassandra/src/main/java/org/hibernate/ogm/datastore/cassandra/CassandraDialect.java +++ b/cassandra/src/main/java/org/hibernate/ogm/datastore/cassandra/CassandraDialect.java @@ -446,23 +446,20 @@ public GridType overrideType(Type type) { } @Override - public void forEachTuple(ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata... entityKeyMetadatas) { - for ( EntityKeyMetadata entityKeyMetadata : entityKeyMetadatas ) { + public void forEachTuple(ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata entityKeyMetadata) { + Select select = queryBuilder.select().all().from( quote( entityKeyMetadata.getTable() ) ); - Select select = queryBuilder.select().all().from( quote( entityKeyMetadata.getTable() ) ); - - ResultSet resultSet; - try { - resultSet = session.execute( select ); - } - catch (DriverException e) { - throw e; - } - Iterator iter = resultSet.iterator(); - while ( iter.hasNext() ) { - Row row = iter.next(); - consumer.consume( new Tuple( new MapTupleSnapshot( tupleFromRow( row ) ) ) ); - } + ResultSet resultSet; + try { + resultSet = session.execute( select ); + } + catch (DriverException e) { + throw e; + } + Iterator iter = resultSet.iterator(); + while ( iter.hasNext() ) { + Row row = iter.next(); + consumer.consume( new Tuple( new MapTupleSnapshot( tupleFromRow( row ) ) ) ); } } diff --git a/core/src/main/java/org/hibernate/ogm/datastore/map/impl/MapDialect.java b/core/src/main/java/org/hibernate/ogm/datastore/map/impl/MapDialect.java index b171cfa42b..841eb145ca 100644 --- a/core/src/main/java/org/hibernate/ogm/datastore/map/impl/MapDialect.java +++ b/core/src/main/java/org/hibernate/ogm/datastore/map/impl/MapDialect.java @@ -140,13 +140,11 @@ public Number nextValue(NextValueRequest request) { } @Override - public void forEachTuple(ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata... metadatas) { + public void forEachTuple(ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata metadata) { Map> entityMap = provider.getEntityMap(); for ( EntityKey key : entityMap.keySet() ) { - for ( EntityKeyMetadata metadata : metadatas ) { - if ( key.getTable().equals( metadata.getTable() ) ) { - consumer.consume( new Tuple( new MapTupleSnapshot( entityMap.get( key ) ) ) ); - } + if ( key.getTable().equals( metadata.getTable() ) ) { + consumer.consume( new Tuple( new MapTupleSnapshot( entityMap.get( key ) ) ) ); } } } diff --git a/core/src/main/java/org/hibernate/ogm/dialect/impl/ForwardingGridDialect.java b/core/src/main/java/org/hibernate/ogm/dialect/impl/ForwardingGridDialect.java index 8143f788ea..b07812c459 100644 --- a/core/src/main/java/org/hibernate/ogm/dialect/impl/ForwardingGridDialect.java +++ b/core/src/main/java/org/hibernate/ogm/dialect/impl/ForwardingGridDialect.java @@ -158,8 +158,8 @@ public GridType overrideType(Type type) { } @Override - public void forEachTuple(ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata... entityKeyMetadatas) { - gridDialect.forEachTuple( consumer, tupleContext, entityKeyMetadatas ); + public void forEachTuple(ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata entityKeyMetadata) { + gridDialect.forEachTuple( consumer, tupleContext, entityKeyMetadata ); } @Override diff --git a/core/src/main/java/org/hibernate/ogm/dialect/spi/GridDialect.java b/core/src/main/java/org/hibernate/ogm/dialect/spi/GridDialect.java index 09322f264f..dd1cc12659 100644 --- a/core/src/main/java/org/hibernate/ogm/dialect/spi/GridDialect.java +++ b/core/src/main/java/org/hibernate/ogm/dialect/spi/GridDialect.java @@ -172,10 +172,10 @@ public interface GridDialect extends Service { * the instance that is going to be called for every {@link Tuple} * @param tupleContext * contains additional information that might be used to build the tuple - * @param entityKeyMetadatas - * the key metadata of the tables for which we want to apply the consumer + * @param entityKeyMetadata + * the key metadata of the table for which we want to apply the consumer */ - void forEachTuple(ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata... entityKeyMetadatas); + void forEachTuple(ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata entityKeyMetadata); /** * Returns this dialect's strategy for detecting the insertion of several entity tuples of the given type with the diff --git a/core/src/test/java/org/hibernate/ogm/test/batch/BatchExecutionTest.java b/core/src/test/java/org/hibernate/ogm/test/batch/BatchExecutionTest.java index 837a710d5e..89ca6d6882 100644 --- a/core/src/test/java/org/hibernate/ogm/test/batch/BatchExecutionTest.java +++ b/core/src/test/java/org/hibernate/ogm/test/batch/BatchExecutionTest.java @@ -146,7 +146,7 @@ public Number nextValue(NextValueRequest request) { } @Override - public void forEachTuple(ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata... entityKeyMetadatas) { + public void forEachTuple(ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata entityKeyMetadata) { } @Override diff --git a/core/src/test/java/org/hibernate/ogm/test/datastore/DatastoreProviderGeneratingSchema.java b/core/src/test/java/org/hibernate/ogm/test/datastore/DatastoreProviderGeneratingSchema.java index 2070ebdee2..e0b2e58295 100644 --- a/core/src/test/java/org/hibernate/ogm/test/datastore/DatastoreProviderGeneratingSchema.java +++ b/core/src/test/java/org/hibernate/ogm/test/datastore/DatastoreProviderGeneratingSchema.java @@ -123,7 +123,7 @@ public Number nextValue(NextValueRequest request) { } @Override - public void forEachTuple(ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata... entityKeyMetadatas) { + public void forEachTuple(ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata entityKeyMetadata) { } } } diff --git a/core/src/test/java/org/hibernate/ogm/test/options/mapping/model/SampleDatastoreProvider.java b/core/src/test/java/org/hibernate/ogm/test/options/mapping/model/SampleDatastoreProvider.java index 4ca318123e..c73018e396 100644 --- a/core/src/test/java/org/hibernate/ogm/test/options/mapping/model/SampleDatastoreProvider.java +++ b/core/src/test/java/org/hibernate/ogm/test/options/mapping/model/SampleDatastoreProvider.java @@ -83,7 +83,7 @@ public Number nextValue(NextValueRequest request) { } @Override - public void forEachTuple(ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata... entityKeyMetadatas) { + public void forEachTuple(ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata entityKeyMetadata) { } } } 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 b8117fff17..50f740f824 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 @@ -311,10 +311,8 @@ else if ( type instanceof SerializableToBlobType ) { } @Override - public void forEachTuple(ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata... entityKeyMetadatas) { - for ( EntityKeyMetadata entityKeyMetadata : entityKeyMetadatas ) { - forTuple( consumer, entityKeyMetadata ); - } + public void forEachTuple(ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata entityKeyMetadata) { + forTuple( consumer, entityKeyMetadata ); } @Override diff --git a/ehcache/src/main/java/org/hibernate/ogm/datastore/ehcache/EhcacheDialect.java b/ehcache/src/main/java/org/hibernate/ogm/datastore/ehcache/EhcacheDialect.java index bb037f89f2..e385165a5b 100644 --- a/ehcache/src/main/java/org/hibernate/ogm/datastore/ehcache/EhcacheDialect.java +++ b/ehcache/src/main/java/org/hibernate/ogm/datastore/ehcache/EhcacheDialect.java @@ -205,8 +205,8 @@ public boolean isStoredInEntityStructure(AssociationKeyMetadata associationKeyMe } @Override - public void forEachTuple(ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata... entityKeyMetadatas) { - getCacheManager().forEachTuple( new EntityKeyProcessor( consumer ), entityKeyMetadatas ); + public void forEachTuple(ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata entityKeyMetadata) { + getCacheManager().forEachTuple( new EntityKeyProcessor( consumer ), entityKeyMetadata ); } @Override diff --git a/infinispan/src/main/java/org/hibernate/ogm/datastore/infinispan/InfinispanDialect.java b/infinispan/src/main/java/org/hibernate/ogm/datastore/infinispan/InfinispanDialect.java index ab78e06363..bd01ab7197 100644 --- a/infinispan/src/main/java/org/hibernate/ogm/datastore/infinispan/InfinispanDialect.java +++ b/infinispan/src/main/java/org/hibernate/ogm/datastore/infinispan/InfinispanDialect.java @@ -209,9 +209,9 @@ public Number nextValue(NextValueRequest request) { } @Override - public void forEachTuple(ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata... entityKeyMetadatas) { + public void forEachTuple(ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata entityKeyMetadata) { Set> buckets = getCacheManager().getWorkBucketsFor( - entityKeyMetadatas + entityKeyMetadata ); for ( Bucket bucket : buckets ) { Map> queryResult = retrieveKeys( bucket.getCache(), bucket.getEntityKeyMetadata() ); diff --git a/mongodb/src/main/java/org/hibernate/ogm/datastore/mongodb/MongoDBDialect.java b/mongodb/src/main/java/org/hibernate/ogm/datastore/mongodb/MongoDBDialect.java index a4814d1108..19d6674702 100644 --- a/mongodb/src/main/java/org/hibernate/ogm/datastore/mongodb/MongoDBDialect.java +++ b/mongodb/src/main/java/org/hibernate/ogm/datastore/mongodb/MongoDBDialect.java @@ -782,13 +782,11 @@ else if ( type instanceof StringAsObjectIdType ) { } @Override - public void forEachTuple(ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata... entityKeyMetadatas) { + public void forEachTuple(ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata entityKeyMetadata) { DB db = provider.getDatabase(); - for ( EntityKeyMetadata entityKeyMetadata : entityKeyMetadatas ) { - DBCollection collection = db.getCollection( entityKeyMetadata.getTable() ); - for ( DBObject dbObject : collection.find() ) { - consumer.consume( new Tuple( new MongoDBTupleSnapshot( dbObject, entityKeyMetadata, UPDATE ) ) ); - } + DBCollection collection = db.getCollection( entityKeyMetadata.getTable() ); + for ( DBObject dbObject : collection.find() ) { + consumer.consume( new Tuple( new MongoDBTupleSnapshot( dbObject, entityKeyMetadata, UPDATE ) ) ); } } diff --git a/neo4j/src/main/java/org/hibernate/ogm/datastore/neo4j/Neo4jDialect.java b/neo4j/src/main/java/org/hibernate/ogm/datastore/neo4j/Neo4jDialect.java index 48c4cce224..45176182c0 100644 --- a/neo4j/src/main/java/org/hibernate/ogm/datastore/neo4j/Neo4jDialect.java +++ b/neo4j/src/main/java/org/hibernate/ogm/datastore/neo4j/Neo4jDialect.java @@ -615,22 +615,20 @@ private void putOneToOneAssociation(Tuple tuple, Node node, TupleOperation opera } @Override - public void forEachTuple(ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata... entityKeyMetadatas) { - for ( EntityKeyMetadata entityKeyMetadata : entityKeyMetadatas ) { - ResourceIterator queryNodes = entityQueries.get( entityKeyMetadata ).findEntities( dataBase ); - try { - while ( queryNodes.hasNext() ) { - Node next = queryNodes.next(); - Tuple tuple = new Tuple( Neo4jTupleSnapshot.fromNode( next, - tupleContext.getAllAssociatedEntityKeyMetadata(), tupleContext.getAllRoles(), - entityKeyMetadata ) ); - consumer.consume( tuple ); - } - } - finally { - queryNodes.close(); + public void forEachTuple(ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata entityKeyMetadata) { + ResourceIterator queryNodes = entityQueries.get( entityKeyMetadata ).findEntities( dataBase ); + try { + while ( queryNodes.hasNext() ) { + Node next = queryNodes.next(); + Tuple tuple = new Tuple( Neo4jTupleSnapshot.fromNode( next, + tupleContext.getAllAssociatedEntityKeyMetadata(), tupleContext.getAllRoles(), + entityKeyMetadata ) ); + consumer.consume( tuple ); } } + finally { + queryNodes.close(); + } } @Override diff --git a/redis/src/main/java/org/hibernate/ogm/datastore/redis/RedisHashDialect.java b/redis/src/main/java/org/hibernate/ogm/datastore/redis/RedisHashDialect.java index e8a1a5d557..ffcd2f768d 100644 --- a/redis/src/main/java/org/hibernate/ogm/datastore/redis/RedisHashDialect.java +++ b/redis/src/main/java/org/hibernate/ogm/datastore/redis/RedisHashDialect.java @@ -264,27 +264,24 @@ public boolean isStoredInEntityStructure( } @Override - public void forEachTuple(ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata... entityKeyMetadatas) { + public void forEachTuple(ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata entityKeyMetadata) { + KeyScanCursor cursor = null; + String prefix = entityKeyMetadata.getTable() + ":"; - for ( EntityKeyMetadata entityKeyMetadata : entityKeyMetadatas ) { - KeyScanCursor cursor = null; - String prefix = entityKeyMetadata.getTable() + ":"; + ScanArgs scanArgs = ScanArgs.Builder.matches( prefix + "*" ); + do { + cursor = scan( cursor, scanArgs ); - ScanArgs scanArgs = ScanArgs.Builder.matches( prefix + "*" ); - do { - cursor = scan( cursor, scanArgs ); + for ( String key : cursor.getKeys() ) { + Map hgetall = connection.hgetall( key ); + Map entity = new HashMap<>(); - for ( String key : cursor.getKeys() ) { - Map hgetall = connection.hgetall( key ); - Map entity = new HashMap<>(); - - entity.putAll( hgetall ); - addKeyValuesFromKeyName( entityKeyMetadata, prefix, key, entity ); - consumer.consume( new Tuple( new RedisTupleSnapshot( entity ) ) ); - } + entity.putAll( hgetall ); + addKeyValuesFromKeyName( entityKeyMetadata, prefix, key, entity ); + consumer.consume( new Tuple( new RedisTupleSnapshot( entity ) ) ); + } - } while ( !cursor.isFinished() ); - } + } while ( !cursor.isFinished() ); } protected void addKeyValuesFromKeyName( diff --git a/redis/src/main/java/org/hibernate/ogm/datastore/redis/RedisJsonDialect.java b/redis/src/main/java/org/hibernate/ogm/datastore/redis/RedisJsonDialect.java index ab2ccbef20..d11c5c3a70 100644 --- a/redis/src/main/java/org/hibernate/ogm/datastore/redis/RedisJsonDialect.java +++ b/redis/src/main/java/org/hibernate/ogm/datastore/redis/RedisJsonDialect.java @@ -271,25 +271,23 @@ public void removeAssociation(AssociationKey key, AssociationContext association } @Override - public void forEachTuple(final ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata... entityKeyMetadatas) { - for ( EntityKeyMetadata entityKeyMetadata : entityKeyMetadatas ) { - KeyScanCursor cursor = null; - String prefix = entityKeyMetadata.getTable() + ":"; + public void forEachTuple(final ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata entityKeyMetadata) { + KeyScanCursor cursor = null; + String prefix = entityKeyMetadata.getTable() + ":"; - ScanArgs scanArgs = ScanArgs.Builder.matches( prefix + "*" ); - do { - cursor = scan( cursor, scanArgs ); + ScanArgs scanArgs = ScanArgs.Builder.matches( prefix + "*" ); + do { + cursor = scan( cursor, scanArgs ); - for ( String key : cursor.getKeys() ) { - Entity document = entityStorageStrategy.getEntity( key ); + for ( String key : cursor.getKeys() ) { + Entity document = entityStorageStrategy.getEntity( key ); - addKeyValuesFromKeyName( entityKeyMetadata, prefix, key, document ); + addKeyValuesFromKeyName( entityKeyMetadata, prefix, key, document ); - consumer.consume( new Tuple( new RedisTupleSnapshot( document.getProperties() ) ) ); - } + consumer.consume( new Tuple( new RedisTupleSnapshot( document.getProperties() ) ) ); + } - } while ( !cursor.isFinished() ); - } + } while ( !cursor.isFinished() ); } private void storeEntity(