/*
* 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.parsing;
import static org.fest.assertions.Assertions.assertThat;
import java.util.Arrays;
import java.util.List;
import org.hibernate.ogm.datastore.neo4j.query.parsing.impl.Neo4jAliasResolver;
import org.hibernate.ogm.datastore.neo4j.query.parsing.impl.RelationshipAliasTree;
import org.junit.Test;
/**
* @author Davide D'Alto
*/
public class Neo4jAliasResolverTest {
@Test
public void testEmbeddedAliasCreation() throws Exception {
Neo4jAliasResolver aliasResolver = new Neo4jAliasResolver();
createAliasForEmbedded( aliasResolver, "n", "embedded" );
String aliasForEmbedded1 = createAliasForEmbedded( aliasResolver, "n", "embedded.anotherEmbedded" );
assertThat( aliasForEmbedded1 ).isEqualTo( "_n2" );
createAliasForEmbedded( aliasResolver, "n", "yetAnotherEmbedded" );
String aliasForEmbedded2 = createAliasForEmbedded( aliasResolver, "n", "yetAnotherEmbedded.anotherEmbedded" );
assertThat( aliasForEmbedded2 ).isEqualTo( "_n4" );
}
@Test
public void testCreationOfSameAliasForTwoPropertiesOfTheSameEmbedded() throws Exception {
Neo4jAliasResolver aliasResolver = new Neo4jAliasResolver();
createAliasForEmbedded( aliasResolver, "n", "embedded" );
String aliasForEmbedded1 = createAliasForEmbedded( aliasResolver, "n", "embedded.anotherEmbedded" );
assertThat( aliasForEmbedded1 ).isEqualTo( "_n2" );
String aliasForEmbedded2 = createAliasForEmbedded( aliasResolver, "n", "embedded.anotherEmbedded" );
assertThat( aliasForEmbedded2 ).isEqualTo( aliasForEmbedded1 );
}
@Test
public void testEmbeddedTreeCreation() throws Exception {
Neo4jAliasResolver aliasResolver = new Neo4jAliasResolver();
createAliasForEmbedded( aliasResolver, "n", "embedded" );
createAliasForEmbedded( aliasResolver, "n", "embedded.anotherEmbedded" );
createAliasForEmbedded( aliasResolver, "n", "yetAnotherEmbedded" );
createAliasForEmbedded( aliasResolver, "n", "yetAnotherEmbedded.anotherEmbedded" );
// Root node: the entity alias
RelationshipAliasTree aliasTree = aliasResolver.getRelationshipAliasTree( "n" );
assertThat( aliasTree.getAlias() ).isEqualTo( "n" );
assertThat( aliasTree.getRelationshipName() ).isEqualTo( "n" );
assertThat( aliasTree.getChildren() ).onProperty( "alias" ).containsOnly( "_n1", "_n3" );
// Level one: the "n.embedded" node
RelationshipAliasTree embeddedNode = aliasTree.findChild( "embedded" );
assertThat( embeddedNode.getChildren() ).onProperty( "alias" ).containsExactly( "_n2" );
// Level two: the "n.embedded.anotherEmbedded" node
RelationshipAliasTree embeddedAnotherEmbeddedNode = embeddedNode.findChild( "anotherEmbedded" );
assertThat( embeddedAnotherEmbeddedNode.getChildren() ).isEmpty();
// Level one: the "n.yetAnotherEmbedded" node
RelationshipAliasTree yetAnotherEmbeddedNode = aliasTree.findChild( "yetAnotherEmbedded" );
assertThat( yetAnotherEmbeddedNode.getChildren() ).onProperty( "alias" ).containsExactly( "_n4" );
// Level one: the "n.yetAnotherEmbedded.anotherEmbedded" node
RelationshipAliasTree yetAnotherEmbeddedAnotherEmbeddedNode = yetAnotherEmbeddedNode.findChild( "anotherEmbedded" );
assertThat( yetAnotherEmbeddedAnotherEmbeddedNode.getChildren() ).isEmpty();
}
private String createAliasForEmbedded(Neo4jAliasResolver resolverDelegate, String entityAlias, String propertyPath) {
List<String> embeddedProperty1 = Arrays.asList( propertyPath.split( "\\." ) );
return resolverDelegate.createAliasForEmbedded( entityAlias, embeddedProperty1, true );
}
}