/** * CloudGraph Community Edition (CE) License * * This is a community release of CloudGraph, a dual-license suite of * Service Data Object (SDO) 2.1 services designed for relational and * big-table style "cloud" databases, such as HBase and others. * This particular copy of the software is released under the * version 2 of the GNU General Public License. CloudGraph was developed by * TerraMeta Software, Inc. * * Copyright (c) 2013, TerraMeta Software, Inc. All rights reserved. * * General License information can be found below. * * This distribution may include materials developed by third * parties. For license and attribution notices for these * materials, please refer to the documentation that accompanies * this distribution (see the "Licenses for Third-Party Components" * appendix) or view the online documentation at * <http://cloudgraph.org/licenses/>. */ package org.cloudgraph.hbase.social; import java.io.IOException; import junit.framework.Test; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.cloudgraph.hbase.test.SocialGraphModelTest; import org.cloudgraph.test.socialgraph.actor.Actor; import org.cloudgraph.test.socialgraph.actor.Photo; import org.cloudgraph.test.socialgraph.actor.Topic; import org.cloudgraph.test.socialgraph.story.Blog; import org.plasma.common.test.PlasmaTestSetup; /** * Tests operations on a distributed graph. * @author Scott Cinnamond * @since 0.5.1 */ public class SocialGraphDistributedTest extends SocialGraphModelTest { private static Log log = LogFactory.getLog(SocialGraphDistributedTest.class); public static Test suite() { return PlasmaTestSetup.newTestSetup(SocialGraphDistributedTest.class); } public void setUp() throws Exception { super.setUp(); } public void testInsert() throws IOException { GraphInfo info = createGraph(); String xml = this.serializeGraph(info.actor.getDataGraph()); log.debug("inserting initial graph:"); log.debug(xml); this.service.commit(info.actor.getDataGraph(), "test1"); log.debug("fetching initial graph"); Actor fetchedActor = fetchGraph( createGraphQuery(info.actor.getName())); xml = this.serializeGraph(fetchedActor.getDataGraph()); log.debug(xml); assertTrue(fetchedActor.getTargetEdgeCount() == 1); Actor fetchedFollower = (Actor)fetchedActor.getTargetEdge(0).getSource(); assertTrue(fetchedFollower.getName() != null); assertTrue(info.follower.getName().equals(fetchedFollower.getName())); assertTrue(fetchedActor.getBlogCount() == 2); Blog fetchedBlog = (Blog)fetchedActor.get("blog[@name='"+info.electionBlog.getName()+"']"); assertTrue(fetchedBlog != null); assertTrue(fetchedBlog.getTopicCount() == 1); Topic fetchedTopic = fetchedBlog.getTopic(0); assertTrue(fetchedTopic.getName() != null); assertTrue(fetchedTopic.getName().equals(info.politics.getName())); log.debug("fetching follower graph"); Actor fetchedFollowerRoot = fetchGraph( createFollowerGraphQuery(info.follower.getName())); xml = this.serializeGraph(fetchedFollowerRoot.getDataGraph()); log.debug(xml); //Since actor is a "bound" root type, there are always // two actor rows, and the edge between // actor and follower is created in the first/parent row. // Because edge and its derivatives are not "bound" // we cannot traverse from the follower back through the edge to // the actor. If the edge becomes a bound root, we could. assertTrue(fetchedFollowerRoot != null); assertTrue(fetchedFollowerRoot.getSourceEdgeCount() == 0); log.debug("fetching blog slice"); Actor fetchedActorSliceRoot = fetchGraph( createBlogPredicateQuery(info.actor.getName(), info.electionBlog.getName())); xml = this.serializeGraph(fetchedActorSliceRoot.getDataGraph()); log.debug(xml); assertTrue(fetchedActorSliceRoot.getBlogCount() == 1); fetchedBlog = (Blog)fetchedActorSliceRoot.get("blog[@name='"+info.electionBlog.getName()+"']"); assertTrue(fetchedBlog != null); assertTrue(fetchedActor.getTargetEdgeCount() == 1); fetchedFollower = (Actor)fetchedActor.getTargetEdge(0).getSource(); assertTrue(fetchedFollower.getName() != null); assertTrue(info.follower.getName().equals(fetchedFollower.getName())); log.debug("fetching photo slice"); fetchedActorSliceRoot = fetchGraph( createPhotoPredicateQuery(info.actor.getName(), info.photo2.getName())); xml = this.serializeGraph(fetchedActorSliceRoot.getDataGraph()); log.debug(xml); assertTrue(fetchedActorSliceRoot.getPhotoCount() == 1); Photo fetchedPhoto = (Photo)fetchedActorSliceRoot.get("photo[@name='"+info.photo2.getName()+"']"); assertTrue(fetchedPhoto != null); assertTrue(fetchedActor.getTargetEdgeCount() == 1); fetchedFollower = (Actor)fetchedActor.getTargetEdge(0).getSource(); assertTrue(fetchedFollower.getName() != null); assertTrue(info.follower.getName().equals(fetchedFollower.getName())); } public void testUpdate() throws IOException { GraphInfo info = createGraph(); String xml = this.serializeGraph(info.actor.getDataGraph()); log.debug("inserting initial graph:"); log.debug(xml); this.service.commit(info.actor.getDataGraph(), "test1"); Blog blog = info.follower.createBlog(); blog.setName("Fiscal Cliff"); blog.setDescription("A blog about the fiscal \"cliff\" scenario post election"); blog.addTopic(info.politics); log.debug("comitting blog update"); this.service.commit(info.actor.getDataGraph(), "test2"); log.debug("fetching follower graph"); Actor fetchedFollowerRoot = fetchGraph( createGraphQuery(info.follower.getName())); xml = this.serializeGraph(fetchedFollowerRoot.getDataGraph()); log.debug(xml); assertTrue(fetchedFollowerRoot.getBlogCount() == 1); Blog fetchedBlog = (Blog)fetchedFollowerRoot.get("blog[@name='"+blog.getName()+"']"); assertTrue(fetchedBlog != null); assertTrue(fetchedBlog.getTopicCount() == 1); Topic fetchedTopic = fetchedBlog.getTopic(0); assertTrue(fetchedTopic.getName() != null); assertTrue(fetchedTopic.getName().equals(info.politics.getName())); //fetchedFollowerRoot.unsetBlog(); FIXME: isSet="true" in change summary fetchedBlog.delete(); // note deletes topics fetched in containment graph with blog log.debug("comitting blog remove update"); this.service.commit(fetchedFollowerRoot.getDataGraph(), "test2"); log.debug("fetching follower graph again"); fetchedFollowerRoot = fetchGraph( createGraphQuery(info.follower.getName())); xml = this.serializeGraph(fetchedFollowerRoot.getDataGraph()); log.debug(xml); assertTrue(fetchedFollowerRoot.getBlogCount() == 0); log.debug("comitting follower graph delete"); fetchedFollowerRoot.delete(); this.service.commit(fetchedFollowerRoot.getDataGraph(), "test2"); log.debug("fetching deleted follower graph"); fetchedFollowerRoot = findGraph( createGraphQuery(info.follower.getName())); assertTrue(fetchedFollowerRoot == null); log.debug("fetching actor graph"); Actor fetchedRoot = fetchGraph( createGraphQuery(info.actor.getName())); xml = this.serializeGraph(fetchedRoot.getDataGraph()); log.debug(xml); assertTrue(fetchedRoot.getTargetEdgeCount() == 1); assertFalse(fetchedRoot.getTargetEdge(0).isSetSource()); Actor fetchedFollower = (Actor)fetchedRoot.getTargetEdge(0).getSource(); assertTrue(fetchedFollower == null); } public void testTopicInsertAndLink() throws IOException { Topic physics = createRootTopic("Physics"); Topic plasmaPhysics = physics.createChild(); plasmaPhysics.setName("Plasma Physics"); Topic ionization = plasmaPhysics.createChild(); ionization.setName("Plasma Ionization"); Topic magnetization = plasmaPhysics.createChild(); magnetization.setName("Plasma Magnetization"); Topic darkEnergy = physics.createChild(); darkEnergy.setName("Dark Energy"); Topic darkMatter = physics.createChild(); darkMatter.setName("Dark Matter"); this.service.commit(physics.getDataGraph(), "test1"); String name = USERNAME_BASE + String.valueOf(System.currentTimeMillis()) + "_example.com"; Actor actor = createRootActor(name); actor.setName(name); actor.setDescription("Guy who likes plasma physics..."); Blog physicsBlog = actor.createBlog(); physicsBlog.setName("Thoughts on Plasma Magnetization"); physicsBlog.setDescription("Magnetization parameters and temperature..."); // separate it from its graph so we can // add to another graph magnetization.detach(); physicsBlog.addTopic(magnetization); this.service.commit(actor.getDataGraph(), "test2"); Actor fetchedActor = fetchGraph( createGraphQuery(name)); String xml = this.serializeGraph(fetchedActor.getDataGraph()); log.debug(xml); assertTrue(fetchedActor.getBlogCount() == 1); Blog fetchedBlog = (Blog)fetchedActor.get("blog[@name='"+physicsBlog.getName()+"']"); assertTrue(fetchedBlog != null); assertTrue(fetchedBlog.getTopicCount() == 1); Topic fetchedTopic = fetchedBlog.getTopic(0); assertTrue(fetchedTopic.getName() != null); assertTrue(fetchedTopic.getName().equals(magnetization.getName())); } public void testBlogAdd() throws IOException { Topic rocks = createRootTopic("Rocks"); Topic igneousRocks = rocks.createChild(); igneousRocks.setName("Igneous Rocks"); Topic metamorphicRocks = rocks.createChild(); metamorphicRocks.setName("Metamorphic Rocks"); Topic sedementaryRocks = rocks.createChild(); sedementaryRocks.setName("Sedementary Rocks"); // commit some topics we can use this.service.commit(rocks.getDataGraph(), "test1"); String name = USERNAME_BASE + String.valueOf(System.currentTimeMillis()) + "@example.com"; Actor actor = createRootActor(name); actor.setName(name); actor.setDescription("Guy who likes rocks..."); Blog igneousRocksBlog = actor.createBlog(); igneousRocksBlog.setName("Thoughts on Igneous Rocks"); igneousRocksBlog.setDescription("Igneous rocks are cool because..."); // separate it from its graph so we can // add to another graph //igneousRocks.detach(); //igneousRocksBlog.addTopic(igneousRocks); // commit the actor and his first blog this.service.commit(actor.getDataGraph(), "test2"); // re-fetch the actor w/o his new blog and see if // adding blogs works as expected Actor simpleActor = fetchGraph( createSimpleActorQuery(name)); // Blog metamorphicRocksBlog = simpleActor.createBlog(); metamorphicRocksBlog.setName("Thoughts on Metamorphic Rocks"); metamorphicRocksBlog.setDescription("Metamorphic rocks are cool because..."); //metamorphicRocks.detach(); //metamorphicRocksBlog.addTopic(metamorphicRocks); this.service.commit(simpleActor.getDataGraph(), "test2"); Actor fetchedActor = fetchGraph( createActorBlogGraphQuery(name)); String xml = this.serializeGraph(fetchedActor.getDataGraph()); log.debug(xml); // FIXME: pending graph writer fix assertTrue(fetchedActor.getBlogCount() == 2); Blog sedementaryRocksBlog = simpleActor.createBlog(); sedementaryRocksBlog.setName("Thoughts on Sedementary Rocks"); sedementaryRocksBlog.setDescription("Sedementary rocks are cool because..."); //sedementaryRocks.detach(); //sedementaryRocksBlog.addTopic(sedementaryRocks); this.service.commit(simpleActor.getDataGraph(), "test2"); fetchedActor = fetchGraph( createActorBlogGraphQuery(name)); xml = this.serializeGraph(fetchedActor.getDataGraph()); log.debug(xml); // FIXME: pending graph writer fix assertTrue(fetchedActor.getBlogCount() == 3); } }