/*
* 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.neo4j.test.query;
import static org.hibernate.ogm.datastore.neo4j.dialect.impl.BaseNeo4jEntityQueries.ENTITY_ALIAS;
import static org.mockito.Matchers.anyMap;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import org.hibernate.ogm.datastore.neo4j.embedded.dialect.impl.EmbeddedNeo4jEntityQueries;
import org.hibernate.ogm.model.impl.DefaultEntityKeyMetadata;
import org.hibernate.ogm.model.key.spi.EntityKeyMetadata;
import org.junit.Test;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Result;
/**
* @author Davide D'Alto
*/
public class Neo4jEntityQueriesTest {
@Test
@SuppressWarnings("unchecked")
public void testCreationWithCompositeId() throws Exception {
String expected = "CREATE (" + ENTITY_ALIAS + ":ENTITY:Example {`id.name`: {0}, `id.surname`: {1}}) RETURN " + ENTITY_ALIAS;
EntityKeyMetadata metadata = metadata( "Example", "id.name", "id.surname" );
GraphDatabaseService executionEngine = createExecutionEngine();
EmbeddedNeo4jEntityQueries entityQueries = new EmbeddedNeo4jEntityQueries( metadata );
entityQueries.insertEntity( executionEngine, new String[] { "Davide", "D'Alto" } );
verify( executionEngine ).execute( eq( expected ), anyMap() );
}
@Test
@SuppressWarnings("unchecked")
public void testUpdateEmbeddedColumnQuery() throws Exception {
String embeddedColumn = "address.cap";
String expected = "MERGE (owner:ENTITY:Example {id: {0}}) "
+ "MERGE (owner) - [:address] -> (e:EMBEDDED) " + "ON CREATE SET e.cap = {1} "
+ "ON MATCH SET e.cap = {2}";
EntityKeyMetadata metadata = metadata( "Example", "id" );
GraphDatabaseService executionEngine = mock( GraphDatabaseService.class );
EmbeddedNeo4jEntityQueries entityQueries = new EmbeddedNeo4jEntityQueries( metadata );
entityQueries.updateEmbeddedColumn( executionEngine, metadata.getColumnNames(), embeddedColumn, "" );
verify( executionEngine ).execute( eq( expected ), anyMap() );
}
@Test
@SuppressWarnings("unchecked")
public void testUpdateEmbeddedColumnQueryWithCompositeId() throws Exception {
String[] compositeIdColumns = { "id.name", "id.surname" };
String embeddedColumn = "address.cap";
String expected = "MERGE (owner:ENTITY:Example {`id.name`: {0}, `id.surname`: {1}}) "
+ "MERGE (owner) - [:address] -> (e:EMBEDDED) "
+ "ON CREATE SET e.cap = {2} " + "ON MATCH SET e.cap = {3}";
EntityKeyMetadata metadata = metadata( "Example", compositeIdColumns );
GraphDatabaseService executionEngine = mock( GraphDatabaseService.class );
EmbeddedNeo4jEntityQueries entityQueries = new EmbeddedNeo4jEntityQueries( metadata );
entityQueries.updateEmbeddedColumn( executionEngine, metadata.getColumnNames(), embeddedColumn, "" );
verify( executionEngine ).execute( eq( expected ), anyMap() );
}
@Test
@SuppressWarnings("unchecked")
public void testUpdateNestedEmbeddedColumnQuery() throws Exception {
String embeddedColumn = "address.type.name";
String expected = "MERGE (owner:ENTITY:Example {id: {0}}) "
+ "MERGE (owner) - [:address] -> (e0:EMBEDDED) "
+ "MERGE (e0) - [:type] -> (e:EMBEDDED) "
+ "ON CREATE SET e.name = {1} " + "ON MATCH SET e.name = {2}";
GraphDatabaseService executionEngine = createExecutionEngine();
EntityKeyMetadata metadata = metadata( "Example", "id" );
EmbeddedNeo4jEntityQueries entityQueries = new EmbeddedNeo4jEntityQueries( metadata );
entityQueries.updateEmbeddedColumn( executionEngine, metadata.getColumnNames(), embeddedColumn, "" );
verify( executionEngine ).execute( eq( expected ), anyMap() );
}
private EntityKeyMetadata metadata(String tableName, String... columnNames) {
EntityKeyMetadata metadata = new DefaultEntityKeyMetadata( tableName, columnNames );
return metadata;
}
@SuppressWarnings("unchecked")
private GraphDatabaseService createExecutionEngine() {
Result result = mock( Result.class );
GraphDatabaseService executionEngine = mock( GraphDatabaseService.class );
when( executionEngine.execute( anyString() ) ).thenReturn( result );
when( executionEngine.execute( anyString(), anyMap() ) ).thenReturn( result );
return executionEngine;
}
}