blob: be2f06e2dbcfa5c4c326d25e474b3e8a9704f48d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.usergrid.persistence;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.usergrid.AbstractCoreIT;
import org.apache.usergrid.persistence.entities.User;
import org.apache.usergrid.persistence.Query.Level;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
public class EntityConnectionsIT extends AbstractCoreIT {
private static final Logger logger = LoggerFactory.getLogger( EntityConnectionsIT.class );
public EntityConnectionsIT() {
super();
}
@Test
public void testEntityConnectionsSimple() throws Exception {
EntityManager em = app.getEntityManager();
assertNotNull( em );
User first = new User();
first.setUsername( "first" );
first.setEmail( "first@usergrid.com" );
Entity firstUserEntity = em.create( first );
assertNotNull( firstUserEntity );
User second = new User();
second.setUsername( "second" );
second.setEmail( "second@usergrid.com" );
Entity secondUserEntity = em.create( second );
assertNotNull( secondUserEntity );
em.createConnection( firstUserEntity, "likes", secondUserEntity );
app.refreshIndex();
Results r = em.getTargetEntities(firstUserEntity, "likes", null, Level.IDS);
List<ConnectionRef> connections = r.getConnections();
assertNotNull( connections );
assertEquals(1, connections.size());
assertEquals( secondUserEntity.getUuid(), connections.get( 0 ).getTargetRefs().getUuid() );
assertEquals( firstUserEntity.getUuid(), connections.get( 0 ).getSourceRefs().getUuid() );
}
@Test
public void testEntityConnections() throws Exception {
EntityManager em = app.getEntityManager();
final UUID applicationId = app.getId();
assertNotNull( em );
logger.info( "\n\nCreating Cat entity A with name of Dylan\n" );
Map<String, Object> properties = new LinkedHashMap<String, Object>();
properties.put( "name", "Dylan" );
Entity catA = em.create( "cat", properties );
assertNotNull( catA );
logger.info( "\n\nEntity A created with id " + catA.getUuid() + "\n" );
// Do entity get by id for id of cat entity A
logger.info( "\n\nLooking up cat with id " + catA.getUuid() + "\n" );
Entity cat = em.get( catA );
assertNotNull( cat );
logger.info( "\n\nFound entity " + cat.getUuid() + " of type " + cat.getType() + " with name " + cat
.getProperty( "name" ) + "\n" );
// Create cat entity B
logger.info( "\n\nCreating cat entity B with name of Nico\n" );
properties = new LinkedHashMap<String, Object>();
properties.put( "name", "Nico" );
Entity catB = em.create( "cat", properties );
assertNotNull( catB );
logger.info( "\n\nEntity B created with id " + catB.getUuid() + "\n" );
// Create award entity A
logger.info( "\n\nCreating award entity with name of 'best cat'\n" );
properties = new LinkedHashMap<String, Object>();
properties.put( "name", "Best Cat Ever" );
Entity awardA = em.create( "award", properties );
assertNotNull( awardA );
logger.info( "\n\nEntity created with id " + awardA.getUuid() + "\n" );
// Establish connection from cat A to cat B
logger.info( "\n\nConnecting " + catA.getUuid() + " \"likes\" " + catB.getUuid() + "\n" );
em.createConnection( catA, "likes", catB );
// Establish connection from award A to cat B
logger.info( "\n\nConnecting " + awardA.getUuid() + " \"awarded\" " + catB.getUuid() + "\n" );
em.createConnection( awardA, "awarded", catB );
app.refreshIndex();
// List forward connections for cat A
// Thread.sleep(5000);
logger.info( "Find all connections for cat A: " + catA.getUuid() );
testEntityConnections( applicationId, catA.getUuid(), "likes", "cat", 1 );
// List forward connections for award A
logger.info( "Find all connections for award A: " + awardA.getUuid() );
testEntityConnections( applicationId, awardA.getUuid(),"awarded", "award", 1 );
// Establish connection from award A to cat A
logger.info( "\n\nConnecting " + awardA.getUuid() + " \"awarded\" " + catA.getUuid() + "\n" );
em.createConnection( awardA, "awarded", catA );
app.refreshIndex();
// List forward connections for cat A
// Not valid with current usages
// testEntityConnections( applicationId, catA.getUuid(), "cat", 1 );
//
// // List forward connections for award A
//
// testEntityConnections( applicationId, awardA.getUuid(), "award", 2 );
// List all cats in application's cats collection
testApplicationCollections( applicationId, "cats", 2 );
// List all groups in application's cats collection
testApplicationCollections( applicationId, "awards", 1 );
logger.info( "\n\nSearching Award A for recipients with the name Dylan\n" );
}
public Map<String, Map<String, List<UUID>>> testEntityConnections(
UUID applicationId, UUID entityId, String connectionType, String entityType, int expectedCount ) throws Exception {
logger.info( "----------------------------------------------------" );
logger.info( "Checking connections for " + entityId.toString() );
EntityManager em = setup.getEmf().getEntityManager( applicationId );
Entity en = em.get( new SimpleEntityRef( entityType, entityId));
Results results = em.getTargetEntities(en, connectionType, null, Level.REFS);
logger.info( "----------------------------------------------------" );
assertEquals( "Expected " + expectedCount + " connections",
expectedCount, results.getConnections().size() );
// return connections;
return null;
}
public List<UUID> testApplicationCollections(
UUID applicationId, String collectionName, int expectedCount ) throws Exception {
return testEntityCollections(
applicationId, applicationId, "application", collectionName, expectedCount );
}
public List<UUID> testEntityCollections( UUID applicationId, UUID entityId, String entityType,
String collectionName, int expectedCount ) throws Exception {
logger.info( "----------------------------------------------------" );
logger.info( "Checking collection " + collectionName + " for " + entityId.toString() );
EntityManager em = setup.getEmf().getEntityManager( applicationId );
Entity en = em.get( new SimpleEntityRef( entityType, entityId ));
int i = 0;
Results entities = em.getCollection( en, collectionName, null, 100, Level.IDS, false );
for ( UUID id : entities.getIds() ) {
logger.info( ( i++ ) + " " + id.toString() );
}
logger.info( "----------------------------------------------------" );
assertEquals( "Expected " + expectedCount + " connections", expectedCount,
entities.getIds() != null ? entities.getIds().size() : 0 );
// return connections;
return entities.getIds();
}
@Test
public void testEntityConnectionsMembership() throws Exception {
EntityManager em = app.getEntityManager();
assertNotNull( em );
User first = new User();
first.setUsername( "first" );
first.setEmail( "first@usergrid.com" );
Entity firstUserEntity = em.create( first );
assertNotNull( firstUserEntity );
User second = new User();
second.setUsername( "second" );
second.setEmail( "second@usergrid.com" );
Entity secondUserEntity = em.create( second );
assertNotNull( secondUserEntity );
Map<String, Object> data = new HashMap<String, Object>();
data.put( "name", "4peaks" );
Entity fourpeaks = em.create( "restaurant", data );
em.createConnection( firstUserEntity, "likes", fourpeaks );
data = new HashMap<String, Object>();
data.put( "name", "arrogantbutcher" );
Entity arrogantbutcher = em.create( "restaurant", data );
em.createConnection( secondUserEntity, "likes", arrogantbutcher );
app.refreshIndex();
Results r = em.getTargetEntities(firstUserEntity, "likes", "restaurant", Level.IDS);
List<ConnectionRef> connections = r.getConnections();
assertNotNull(connections);
assertEquals(1, connections.size());
assertEquals(fourpeaks.getUuid(), connections.get(0).getTargetRefs().getUuid());
assertEquals(firstUserEntity.getUuid(), connections.get(0).getSourceRefs().getUuid());
// now check membership
assertTrue( em.isConnectionMember( firstUserEntity, "likes", fourpeaks ) );
assertFalse( em.isConnectionMember( firstUserEntity, "likes", arrogantbutcher ) );
// check we don't get the restaurant from the second user
r = em.getTargetEntities(secondUserEntity, "likes", "restaurant", Level.IDS);
connections = r.getConnections();
assertNotNull( connections );
assertEquals(1, connections.size());
assertEquals( arrogantbutcher.getUuid(), connections.get( 0 ).getTargetRefs().getUuid() );
assertEquals( secondUserEntity.getUuid(), connections.get( 0 ).getSourceRefs().getUuid() );
// now check membership
assertTrue( em.isConnectionMember( secondUserEntity, "likes", arrogantbutcher ) );
assertFalse( em.isConnectionMember( secondUserEntity, "likes", fourpeaks ) );
}
@Test
public void testGetConnectingEntities() throws Exception {
UUID applicationId = app.getId( );
assertNotNull( applicationId );
EntityManager em = app.getEntityManager();
assertNotNull( em );
User fred = new User();
fred.setUsername( "fred" );
fred.setEmail( "fred@flintstones.com" );
Entity fredEntity = em.create( fred );
assertNotNull( fredEntity );
User wilma = new User();
wilma.setUsername( "wilma" );
wilma.setEmail( "wilma@flintstones.com" );
Entity wilmaEntity = em.create( wilma );
assertNotNull( wilmaEntity );
em.createConnection( fredEntity, "likes", wilmaEntity );
app.refreshIndex();
// // search for "likes" edges from fred
// assertEquals( 1,
// em.getTargetEntities( fredEntity, "likes", null, Level.IDS ).size());
//
// // search for any type of edges from fred
// assertEquals( 1,
// em.getTargetEntities( fredEntity, null, null, Level.IDS ).size());
// search for "likes" edges to wilman from any type of object
Results res = em.getSourceEntities(wilmaEntity, "likes", null, Level.ALL_PROPERTIES);
assertEquals( 1, res.size() );
assertEquals( "user", res.getEntity().getType() ); // fred is a user
// search for "likes" edges to wilman from user type object
res = em.getSourceEntities(wilmaEntity, "likes", "user", Level.ALL_PROPERTIES);
assertEquals( 1, res.size() );
assertEquals( "user", res.getEntity().getType() );
}
@Test
public void testConnectionsIterable() throws Exception {
EntityManager em = app.getEntityManager();
assertNotNull( em );
User first = new User();
first.setUsername( "first" );
first.setEmail( "first@usergrid.com" );
Entity firstUserEntity = em.create( first );
assertNotNull( firstUserEntity );
final int connectionCount = 100;
final Map<UUID, Entity> things = new HashMap<>();
for(int i = 0; i < connectionCount; i ++){
Map<String, Object> data = new HashMap<String, Object>();
data.put( "ordinal", i );
Entity entity = em.create( "thing", data );
em.createConnection( firstUserEntity, "likes", entity );
things.put( entity.getUuid(), entity );
}
app.refreshIndex();
Results r = em.getTargetEntities(firstUserEntity, "likes", null, Level.ALL_PROPERTIES) ;
PagingResultsIterator itr = new PagingResultsIterator( r );
int checkedIndex = 0;
for(; checkedIndex < connectionCount && itr.hasNext(); checkedIndex ++){
final Entity returned = ( Entity ) itr.next();
final Entity expected = things.get( returned.getUuid() );
assertEquals("Entity expected", expected, returned);
}
assertEquals("Checked all entities", connectionCount, checkedIndex );
}
//
//
// @Test
// public void testGetConnectingEntities() throws Exception {
//
// UUID applicationId = app.getId( );
// assertNotNull( applicationId );
//
// EntityManager em = app.getEntityManager();
// assertNotNull( em );
//
// User fred = new User();
// fred.setUsername( "fred" );
// fred.setEmail( "fred@flintstones.com" );
// Entity fredEntity = em.create( fred );
// assertNotNull( fredEntity );
//
// User wilma = new User();
// wilma.setUsername( "wilma" );
// wilma.setEmail( "wilma@flintstones.com" );
// Entity wilmaEntity = em.create( wilma );
// assertNotNull( wilmaEntity );
//
// em.createConnection( fredEntity, "likes", wilmaEntity );
//
// app.refreshIndex();
//
//// // search for "likes" edges from fred
//// assertEquals( 1,
//// em.getTargetEntities( fredEntity, "likes", null, Level.IDS ).size());
////
//// // search for any type of edges from fred
//// assertEquals( 1,
//// em.getTargetEntities( fredEntity, null, null, Level.IDS ).size());
//
// // search for "likes" edges to wilman from any type of object
// Results res = em.getSourceEntities( wilmaEntity, "likes", null, Level.ALL_PROPERTIES);
// assertEquals( 1, res.size() );
// assertEquals( "user", res.getEntity().getType() ); // fred is a user
//
// // search for "likes" edges to wilman from user type object
// res = em.getSourceEntities( wilmaEntity, "likes", "user", Level.ALL_PROPERTIES);
// assertEquals( 1, res.size() );
// assertEquals( "user", res.getEntity().getType() );
// }
}