Coverage Summary for Class: TestIo (org.umlg.sqlg.test.io)
Class |
Method, %
|
Branch, %
|
Line, %
|
TestIo |
100%
(12/12)
|
56.2%
(18/32)
|
77.1%
(135/175)
|
TestIo$1 |
100%
(1/1)
|
100%
(4/4)
|
TestIo$2 |
100%
(1/1)
|
100%
(4/4)
|
Total |
100%
(14/14)
|
56.2%
(18/32)
|
78.1%
(143/183)
|
package org.umlg.sqlg.test.io;
import org.umlg.sqlg.structure.PropertyType;
import org.apache.commons.collections4.set.ListOrderedSet;
import org.apache.tinkerpop.gremlin.TestHelper;
import org.apache.tinkerpop.gremlin.process.traversal.IO;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.WriteTest;
import org.apache.tinkerpop.gremlin.structure.*;
import org.apache.tinkerpop.gremlin.structure.io.GraphReader;
import org.apache.tinkerpop.gremlin.structure.io.GraphWriter;
import org.apache.tinkerpop.gremlin.structure.io.IoCore;
import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
import org.hamcrest.MatcherAssert;
import org.hamcrest.core.Is;
import org.junit.Assert;
import org.junit.Assume;
import org.junit.Test;
import org.umlg.sqlg.structure.PropertyDefinition;
import org.umlg.sqlg.structure.SqlgIoRegistryV3;
import org.umlg.sqlg.structure.topology.VertexLabel;
import org.umlg.sqlg.test.BaseTest;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Function;
import java.util.function.Predicate;
/**
* @author <a href="https://github.com/pietermartin">Pieter Martin</a>
* Date: 2017/06/13
*/
public class TestIo extends BaseTest {
private String ioType;
private boolean assertViaDirectEquality;
private boolean assertEdgesAtSameTimeAsVertex;
private Function<Graph, GraphReader> readerMaker;
private Function<Graph, GraphWriter> writerMaker;
@Test
public void testLoadClassic() {
Assume.assumeTrue(sqlgGraph.getSqlDialect().supportsFloatValues());
loadClassic();
}
//Test are copied from ProcessStandardSuite. They fail there as the registery is not registered.
@Test
public void g_io_write_withXwrite_gryoX() throws IOException {
loadModern();
final String fileToWrite = TestHelper.generateTempFile(WriteTest.class, "tinkerpop-modern-v3d0", ".kryo").getAbsolutePath().replace('\\', '/');
final File f = new File(fileToWrite);
MatcherAssert.assertThat(f.length() == 0, Is.is(true));
final Traversal<Object, Object> traversal = this.sqlgGraph.traversal().io(fileToWrite)
.with(IO.writer, IO.gryo)
.with(IO.registry, SqlgIoRegistryV3.instance())
.write();
printTraversalForm(traversal);
traversal.iterate();
MatcherAssert.assertThat(f.length() > 0, Is.is(true));
}
@Test
public void g_io_write_withXwriter_graphsonX() throws IOException {
loadModern();
final String fileToWrite = TestHelper.generateTempFile(WriteTest.class, "tinkerpop-modern-v3d0", ".json").getAbsolutePath().replace('\\', '/');
final File f = new File(fileToWrite);
MatcherAssert.assertThat(f.length() == 0, Is.is(true));
final Traversal<Object, Object> traversal = this.sqlgGraph.traversal().io(fileToWrite)
.with(IO.writer, IO.graphson)
.with(IO.registry, SqlgIoRegistryV3.instance())
.write();
printTraversalForm(traversal);
traversal.iterate();
MatcherAssert.assertThat(f.length() > 0, Is.is(true));
}
@Test
public void g_io_writeXjsonX() throws IOException {
loadModern();
final String fileToWrite = TestHelper.generateTempFile(WriteTest.class,"tinkerpop-modern-v3d0", ".json").getAbsolutePath().replace('\\', '/');
final File f = new File(fileToWrite);
MatcherAssert.assertThat(f.length() == 0, Is.is(true));
final Traversal<Object,Object> traversal = this.sqlgGraph.traversal()
.io(fileToWrite)
.with(IO.writer, IO.graphson)
.with(IO.registry, SqlgIoRegistryV3.instance())
.write();
printTraversalForm(traversal);
traversal.iterate();
MatcherAssert.assertThat(f.length() > 0, Is.is(true));
}
@Test
public void g_io_writeXkryoX() throws IOException {
loadModern();
final String fileToWrite = TestHelper.generateTempFile(WriteTest.class, "tinkerpop-modern-v3d0", ".kryo").getAbsolutePath().replace('\\', '/');
final File f = new File(fileToWrite);
MatcherAssert.assertThat(f.length() == 0, Is.is(true));
final Traversal<Object,Object> traversal = this.sqlgGraph.traversal()
.io(fileToWrite)
.with(IO.writer, IO.gryo)
.with(IO.registry, SqlgIoRegistryV3.instance())
.write();
printTraversalForm(traversal);
traversal.iterate();
MatcherAssert.assertThat(f.length() > 0, Is.is(true));
}
@Test
public void shouldReadWriteVertexWithBOTHEdges() throws Exception {
this.ioType = "graphson-v1-embedded";
this.assertViaDirectEquality = true;
this.assertEdgesAtSameTimeAsVertex = false;
this.readerMaker = g -> g.io(IoCore.graphson()).reader().mapper(g.io(IoCore.graphson()).mapper().create()).create();
this.writerMaker = g -> g.io(IoCore.graphson()).writer().mapper(g.io(IoCore.graphson()).mapper().create()).create();
Graph graph = this.sqlgGraph;
final Vertex v1 = graph.addVertex("name", "marko", T.label, "person");
final Vertex v2 = graph.addVertex(T.label, "person");
final Edge e1 = v2.addEdge("friends", v1, "weight", 0.5d);
final Edge e2 = v1.addEdge("friends", v2, "weight", 1.0d);
try (final ByteArrayOutputStream os = new ByteArrayOutputStream()) {
final GraphWriter writer = writerMaker.apply(graph);
writer.writeVertex(os, v1, Direction.BOTH);
final AtomicBoolean calledVertex = new AtomicBoolean(false);
final AtomicBoolean calledEdge1 = new AtomicBoolean(false);
final AtomicBoolean calledEdge2 = new AtomicBoolean(false);
final GraphReader reader = readerMaker.apply(graph);
try (final ByteArrayInputStream bais = new ByteArrayInputStream(os.toByteArray())) {
reader.readVertex(bais, attachable -> {
final Vertex detachedVertex = attachable.get();
if (assertViaDirectEquality) {
TestHelper.validateVertexEquality(v1, detachedVertex, assertEdgesAtSameTimeAsVertex);
} else {
Assert.assertEquals(v1.id(), graph.vertices(detachedVertex.id().toString()).next().id());
Assert.assertEquals(v1.label(), detachedVertex.label());
Assert.assertEquals(1, IteratorUtils.count(detachedVertex.properties()));
Assert.assertEquals("marko", detachedVertex.value("name"));
}
calledVertex.set(true);
return detachedVertex;
}, attachable -> {
final Edge detachedEdge = attachable.get();
final Predicate<Edge> matcher = assertViaDirectEquality ? e -> detachedEdge.id().equals(e.id()) :
e -> graph.edges(detachedEdge.id().toString()).next().id().equals(e.id());
if (matcher.test(e1)) {
if (assertViaDirectEquality) {
TestHelper.validateEdgeEquality(e1, detachedEdge);
} else {
Assert.assertEquals(e1.id(), graph.edges(detachedEdge.id().toString()).next().id());
Assert.assertEquals(v1.id(), graph.vertices(detachedEdge.inVertex().id().toString()).next().id());
Assert.assertEquals(v2.id(), graph.vertices(detachedEdge.outVertex().id().toString()).next().id());
Assert.assertEquals(v2.label(), detachedEdge.inVertex().label());
Assert.assertEquals(e1.label(), detachedEdge.label());
Assert.assertEquals(1, IteratorUtils.count(detachedEdge.properties()));
Assert.assertEquals(0.5d, detachedEdge.value("weight"), 0.000001d);
}
calledEdge1.set(true);
} else if (matcher.test(e2)) {
if (assertViaDirectEquality) {
TestHelper.validateEdgeEquality(e2, detachedEdge);
} else {
Assert.assertEquals(e2.id(), graph.edges(detachedEdge.id().toString()).next().id());
Assert.assertEquals(v2.id(), graph.vertices(detachedEdge.inVertex().id().toString()).next().id());
Assert.assertEquals(v1.id(), graph.vertices(detachedEdge.outVertex().id().toString()).next().id());
Assert.assertEquals(v1.label(), detachedEdge.outVertex().label());
Assert.assertEquals(e2.label(), detachedEdge.label());
Assert.assertEquals(1, IteratorUtils.count(detachedEdge.properties()));
Assert.assertEquals(1.0d, detachedEdge.value("weight"), 0.000001d);
}
calledEdge2.set(true);
} else {
Assert.fail("An edge id generated that does not exist");
}
return null;
}, Direction.BOTH);
}
Assert.assertTrue(calledVertex.get());
Assert.assertTrue(calledEdge1.get());
Assert.assertTrue(calledEdge2.get());
}
}
@Test
public void shouldReadWriteVertexWithBOTHEdgesUserSuppliedPK() throws Exception {
this.ioType = "graphson-v1-embedded";
this.assertViaDirectEquality = true;
this.assertEdgesAtSameTimeAsVertex = false;
this.readerMaker = g -> g.io(IoCore.graphson()).reader().mapper(g.io(IoCore.graphson()).mapper().create()).create();
this.writerMaker = g -> g.io(IoCore.graphson()).writer().mapper(g.io(IoCore.graphson()).mapper().create()).create();
Graph graph = this.sqlgGraph;
VertexLabel personVertexLabel = this.sqlgGraph.getTopology().getPublicSchema()
.ensureVertexLabelExist(
"person",
new HashMap<>() {{
put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
put("name", PropertyDefinition.of(PropertyType.STRING));
}},
ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
);
personVertexLabel.ensureEdgeLabelExist(
"friends",
personVertexLabel,
new HashMap<>() {{
put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
put("weight", PropertyDefinition.of(PropertyType.DOUBLE));
}},
ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
);
this.sqlgGraph.tx().commit();
final Vertex v1 = graph.addVertex("name", "marko", T.label, "person", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
final Vertex v2 = graph.addVertex(T.label, "person", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
final Edge e1 = v2.addEdge("friends", v1, "weight", 0.5d, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
final Edge e2 = v1.addEdge("friends", v2, "weight", 1.0d, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
try (final ByteArrayOutputStream os = new ByteArrayOutputStream()) {
final GraphWriter writer = writerMaker.apply(graph);
writer.writeVertex(os, v1, Direction.BOTH);
final AtomicBoolean calledVertex = new AtomicBoolean(false);
final AtomicBoolean calledEdge1 = new AtomicBoolean(false);
final AtomicBoolean calledEdge2 = new AtomicBoolean(false);
final GraphReader reader = readerMaker.apply(graph);
try (final ByteArrayInputStream bais = new ByteArrayInputStream(os.toByteArray())) {
reader.readVertex(bais, attachable -> {
final Vertex detachedVertex = attachable.get();
if (assertViaDirectEquality) {
TestHelper.validateVertexEquality(v1, detachedVertex, assertEdgesAtSameTimeAsVertex);
} else {
Assert.assertEquals(v1.id(), graph.vertices(detachedVertex.id().toString()).next().id());
Assert.assertEquals(v1.label(), detachedVertex.label());
Assert.assertEquals(1, IteratorUtils.count(detachedVertex.properties()));
Assert.assertEquals("marko", detachedVertex.value("name"));
}
calledVertex.set(true);
return detachedVertex;
}, attachable -> {
final Edge detachedEdge = attachable.get();
final Predicate<Edge> matcher = assertViaDirectEquality ? e -> detachedEdge.id().equals(e.id()) :
e -> graph.edges(detachedEdge.id().toString()).next().id().equals(e.id());
if (matcher.test(e1)) {
if (assertViaDirectEquality) {
TestHelper.validateEdgeEquality(e1, detachedEdge);
} else {
Assert.assertEquals(e1.id(), graph.edges(detachedEdge.id().toString()).next().id());
Assert.assertEquals(v1.id(), graph.vertices(detachedEdge.inVertex().id().toString()).next().id());
Assert.assertEquals(v2.id(), graph.vertices(detachedEdge.outVertex().id().toString()).next().id());
Assert.assertEquals(v2.label(), detachedEdge.inVertex().label());
Assert.assertEquals(e1.label(), detachedEdge.label());
Assert.assertEquals(1, IteratorUtils.count(detachedEdge.properties()));
Assert.assertEquals(0.5d, detachedEdge.value("weight"), 0.000001d);
}
calledEdge1.set(true);
} else if (matcher.test(e2)) {
if (assertViaDirectEquality) {
TestHelper.validateEdgeEquality(e2, detachedEdge);
} else {
Assert.assertEquals(e2.id(), graph.edges(detachedEdge.id().toString()).next().id());
Assert.assertEquals(v2.id(), graph.vertices(detachedEdge.inVertex().id().toString()).next().id());
Assert.assertEquals(v1.id(), graph.vertices(detachedEdge.outVertex().id().toString()).next().id());
Assert.assertEquals(v1.label(), detachedEdge.outVertex().label());
Assert.assertEquals(e2.label(), detachedEdge.label());
Assert.assertEquals(1, IteratorUtils.count(detachedEdge.properties()));
Assert.assertEquals(1.0d, detachedEdge.value("weight"), 0.000001d);
}
calledEdge2.set(true);
} else {
Assert.fail("An edge id generated that does not exist");
}
return null;
}, Direction.BOTH);
}
Assert.assertTrue(calledVertex.get());
Assert.assertTrue(calledEdge1.get());
Assert.assertTrue(calledEdge2.get());
}
}
}