Coverage Summary for Class: SqlgGraphServiceTest (org.umlg.sqlg.test.services)
Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
SqlgGraphServiceTest |
0%
(0/1)
|
0%
(0/6)
|
0%
(0/2)
|
0%
(0/24)
|
/*
* 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.umlg.sqlg.test.services;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
import org.apache.tinkerpop.gremlin.structure.Direction;
import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
import org.junit.Before;
import org.junit.Test;
import org.umlg.sqlg.services.SqlgDegreeCentralityFactory;
import org.umlg.sqlg.test.BaseTest;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
/**
* Demonstration of Service API.
*
* @author Mike Personick (http://github.com/mikepersonick)
*/
public class SqlgGraphServiceTest extends BaseTest {
GraphTraversalSource g;
@Before
public void registerServices() throws Exception {
super.before();
sqlgGraph.getServiceRegistry().registerService(new SqlgDegreeCentralityFactory(sqlgGraph));
loadModern();
g = sqlgGraph.traversal();
}
// /**
// * List all available service calls.
// */
// @Test
// public void g_call() throws Exception {
// /*
// * Tinkergraph has one registered service by default ("tinker.search").
// */
// assertArrayEquals(new String[] {
// "sqlg.degree.centrality"
// }, toResultStrings(
//
// g.call()
//
// ));
// assertArrayEquals(new String[] {
// "sqlg.degree.centrality"
// }, toResultStrings(
//
// g.call("--list")
//
// ));
//
// }
@Test
public void g_V_call_degree_centrality() {
List<Object> result = g.V().as("v").call("sqlg.degree.centrality").toList();
for (Object o : result) {
System.out.println(o.toString());
}
assertArrayEquals(new String[] {
"{vertex=v[1], degree=0}",
"{vertex=v[2], degree=1}",
"{vertex=v[3], degree=3}",
"{vertex=v[4], degree=1}",
"{vertex=v[5], degree=1}",
"{vertex=v[6], degree=0}",
}, toResultStrings(
g.V().as("v").call("sqlg.degree.centrality")
.project("vertex", "degree").by(__.select("v")).by()
));
assertArrayEquals(new String[] {
"{vertex=marko, degree=3}",
"{vertex=vadas, degree=0}",
"{vertex=lop, degree=0}",
"{vertex=josh, degree=2}",
"{vertex=ripple, degree=0}",
"{vertex=peter, degree=1}",
}, toResultStrings(
g.V().as("v").call("tinker.degree.centrality").with("direction", Direction.OUT)
.project("vertex", "degree").by(__.select("v").values("name")).by()
));
checkResult("lop", g.V().where(__.call("tinker.degree.centrality").is(3)).values("name"));
checkResults(Arrays.asList("vadas","josh","ripple"), g.V().where(__.call("tinker.degree.centrality").is(1)).values("name"));
checkResult(0l, g.V().where(__.call("tinker.degree.centrality").is(100)).count());
}
// /**
// * Demonstrates registration and usage of a Starting lambda service. Start services take no input and are run
// * via GraphTraversalSource. Text search above is another example of a Start service.
// */
// @Test
// public void g_call_start_lambda() {
// final String serviceName = "tinker.random";
//
// final BiFunction<ServiceCallContext, Map, Iterator<Integer>> lambda = (ctx, map) -> {
// final int numValues = (int) map.getOrDefault("numValues", 5);
// final boolean random = (boolean) map.getOrDefault("random", false);
// final Long seed = (Long) map.get("seed");
// final List<Integer> values = new ArrayList<>(numValues);
// final Random r = seed != null ? new Random(seed) : new Random();
// for (int i = 0; i < numValues; i++) {
// if (random)
// values.add(r.nextInt(1000));
// else
// // use fixed values for testing
// values.add(i);
// }
// return values.iterator();
// };
//
// sqlgGraph.getServiceRegistry().<Object,Integer>registerLambdaService(serviceName).addStartLambda(lambda);
//
// /*
// * Use defaults.
// */
// assertEquals("[0,1,2,3,4]", toResultString(
//
// g.call(serviceName)
//
// ));
//
// /*
// * Invoke via Map (static parameters).
// */
// assertEquals("[0,1,2,3,4,5,6,7,8,9]", toResultString(
//
// g.call(serviceName, asMap("numValues", 10))
//
// ));
//
// /*
// * Invoke via Traversal<Map> (dynamic parameters).
// */
// assertEquals("[0,1,2,3,4,5,6,7]", toResultString(
//
// g.withSideEffect("x", asMap("numValues", 8))
// .call(serviceName, __.select("x"))
//
// ));
//
// /*
// * Invoke via .with(String, Traversal) (dynamic parameters).
// */
// checkResult(100l,
//
// g.call(serviceName)
// .with("random", true)
// .with("numValues", 100)
// .with("seed", __.V().constant(17537423l))
// .count()
//
// );
// }
//
// /**
// * Demonstrates registration and usage of a Streaming lambda service. Streaming services produce an iterator
// * of results for each upstream input.
// */
// @Test
// public void g_V_call_streaming_lambda() {
// final String serviceName = "tinker.xerox";
//
// final TriFunction<ServiceCallContext, Traverser.Admin<Object>,Map,Iterator<Object>> lambda = (ctx, traverser, map) -> {
// final int numCopies = (int) map.getOrDefault("numCopies", 2);
// if (ctx.getTraversal().getTraverserRequirements().contains(TraverserRequirement.BULK)) {
// traverser.setBulk(traverser.bulk() * numCopies);
// return IteratorUtils.of(traverser);
// } else {
// return IntStream.range(0, numCopies).mapToObj(i -> traverser.get()).iterator();
// }
// };
//
// sqlgGraph.getServiceRegistry().registerLambdaService(serviceName).addStreamingLambda(lambda);
//
// checkResult(6l,
// g.V().count());
//
// checkResult(12l,
// g.V().call(serviceName).count());
//
// checkResult(18l,
// g.V().call(serviceName).with("numCopies", 3).count());
// }
//
// /**
// * Demonstrates registration and usage of a Barrier lambda service. Barrier services collect all upstream input
// * and produce an iterator of results. Barrier services can reduce, expand or pass-through their input.
// */
// @Test
// public void g_V_call_barrier_lambda() {
// final String serviceName = "tinker.order";
//
// final Comparator defaultComparator = Comparator.comparing(Object::toString);
//
// final TriFunction<ServiceCallContext, TraverserSet<Object>, Map, Iterator<Traverser.Admin<Object>>> lambda =
// (ctx, traverserSet, map) -> {
// final Comparator comparator = (Comparator) map.getOrDefault("comparator", defaultComparator);
// traverserSet.sort(comparator);
// return traverserSet.iterator();
// };
//
// sqlgGraph.getServiceRegistry().<Object,Traverser.Admin<Object>>registerLambdaService(serviceName).addBarrierLambda(lambda);
//
// assertArrayEquals(new String[] {
// "vp[age->27]",
// "vp[age->29]",
// "vp[age->32]",
// "vp[age->35]",
// "vp[lang->java]",
// "vp[lang->java]",
// "vp[name->josh]",
// "vp[name->lop]",
// "vp[name->marko]",
// "vp[name->peter]",
// "vp[name->ripple]",
// "vp[name->vadas]",
// }, toResultStrings(
//
// g.V().properties().call(serviceName)
//
// ));
//
// assertArrayEquals(new String[] {
// "vp[name->vadas]",
// "vp[name->ripple]",
// "vp[name->peter]",
// "vp[name->marko]",
// "vp[name->lop]",
// "vp[name->josh]",
// "vp[lang->java]",
// "vp[lang->java]",
// "vp[age->35]",
// "vp[age->32]",
// "vp[age->29]",
// "vp[age->27]",
// }, toResultStrings(
//
// g.V().properties().call(serviceName, asMap("comparator", defaultComparator.reversed()))
//
// ));
// }
//
// /**
// * Services may need to specify traverser requirements.
// */
// @Test
// public void g_V_call_lambda_with_requirements() throws Exception {
// final String serviceName = "tinker.paths";
//
// final Map describeParams = asMap(
// "shortest", "Boolean parameter, if true, calculate shortest path",
// "longest", "Boolean parameter, if true, calculate longest path (default)");
//
// final TriFunction<ServiceCallContext, TraverserSet<Vertex>, Map, Iterator<Traverser.Admin<Vertex>>> lambda =
// (ctx, traverserSet, map) -> {
// final boolean shortest = (boolean) map.getOrDefault("shortest", false);
// final boolean longest = (boolean) map.getOrDefault("longest", !shortest);
//
// int min = Integer.MAX_VALUE;
// int max = 0;
// for (Traverser.Admin t : traverserSet) {
// final int length = t.path().size();
// min = Math.min(min, length);
// max = Math.max(max, length);
// }
// final Iterator<Traverser.Admin<Vertex>> it = traverserSet.iterator();
// while (it.hasNext()) {
// final int length = it.next().path().size();
// if (shortest && length == min || longest && length == max) {
// // keep
// } else {
// it.remove();
// }
// }
// return traverserSet.iterator();
// };
//
// sqlgGraph.getServiceRegistry().registerLambdaService(serviceName)
// .addDescribeParams(describeParams)
// .addBarrierLambda(lambda)
// .addRequirements(TraverserRequirement.PATH);
//
// checkResult("{\"name\":\"tinker.paths\",\"type:[requirements]:\":{\"Barrier\":[\"PATH\"]},\"params\":"+new ObjectMapper().writeValueAsString(describeParams)+"}",
// g.call("--list").with("service", serviceName).with("verbose"));
//
// checkResult(2l, g.V().repeat(out()).until(outE().count().is(0)).call(serviceName).count());
// checkResult(5l, g.V().repeat(out()).until(outE().count().is(0)).call(serviceName).with("shortest").count());
// checkResult(7l, g.V().repeat(out()).until(outE().count().is(0)).call(serviceName).with("shortest").with("longest").count());
//
// assertArrayEquals(new String[] {
// "path[v[1], v[4], v[5]]",
// "path[v[1], v[4], v[3]]"
// }, toResultStrings(
//
// g.V().repeat(out()).until(outE().count().is(0)).call(serviceName).path()
//
// ));
// }
//
// @Test
// public void testMultiTypeService() {
// final String serviceName = "tinker.multi-type";
//
// final TriFunction<ServiceCallContext, TraverserSet<Object>, Map, Iterator<Integer>> barrier =
// (ctx, traverserSet, map) -> IteratorUtils.of(traverserSet.size());
//
// final TriFunction<ServiceCallContext, Traverser.Admin<Object>,Map,Iterator<Object>> streaming =
// (ctx, traverser, map) -> IteratorUtils.of(1);
//
// final BiFunction<ServiceCallContext, Map, Iterator<Integer>> start =
// (ctx, map) -> IteratorUtils.of(0);
//
// final SqlgServiceRegistry.LambdaServiceFactory factory = sqlgGraph.getServiceRegistry().registerLambdaService(serviceName);
// factory.addStartLambda(start);
// factory.addStreamingLambda(streaming);
// factory.addBarrierLambda(barrier);
//
// checkResult("{\"name\":\"tinker.multi-type\",\"type:[requirements]:\":{\"Start\":[],\"Streaming\":[],\"Barrier\":[]},\"params\":{}}",
// g.call("--list").with("service", serviceName).with("verbose"));
//
// // start
// checkResult(0, g.call(serviceName));
// // streaming
// checkResults(Arrays.asList(1, 1, 1, 1, 1, 1), g.V().call(serviceName, asMap(SqlgServiceRegistry.LambdaServiceFactory.Options.TYPE, Type.Streaming)));
// // all at once
// checkResults(Arrays.asList(6), g.V().call(serviceName, asMap(SqlgServiceRegistry.LambdaServiceFactory.Options.TYPE, Type.Barrier)));
// // chunk size 2
// checkResults(Arrays.asList(2, 2, 2), g.V().call(serviceName, asMap(SqlgServiceRegistry.LambdaServiceFactory.Options.TYPE, Type.Barrier, SqlgServiceRegistry.LambdaServiceFactory.Options.CHUNK_SIZE, 2)));
// // chunk size 4
// checkResults(Arrays.asList(4, 2), g.V().call(serviceName, asMap(SqlgServiceRegistry.LambdaServiceFactory.Options.TYPE, Type.Barrier, SqlgServiceRegistry.LambdaServiceFactory.Options.CHUNK_SIZE, 4)));
// }
//
private String toResultString(final Traversal traversal) {
return (String) IteratorUtils.stream(traversal).map(Object::toString).collect(Collectors.joining(",", "[", "]"));
}
private String[] toResultStrings(final Traversal traversal) {
return (String[]) ((List) IteratorUtils.stream(traversal).map(Object::toString).collect(Collectors.toList())).toArray(new String[0]);
}
private void checkResult(final Object expected, final Traversal traversal) {
final List result = traversal.toList();
assertEquals("Did not produce exactly one result", 1, result.size());
assertEquals(expected, result.get(0));
}
}