blob: d1e37b6b52d7c070be2bb9250b77491f3446fadc [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.tinkerpop.gremlin.python.structure.io.graphson;
import org.apache.tinkerpop.gremlin.process.remote.traversal.DefaultRemoteTraverser;
import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.python.jsr223.JythonScriptEngineSetup;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Property;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.apache.tinkerpop.gremlin.structure.VertexProperty;
import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONMapper;
import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONVersion;
import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory;
import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper;
import org.junit.Ignore;
import org.junit.Test;
import org.python.jsr223.PyScriptEngine;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
@Ignore
public class GraphSONReaderTest {
private static final Set<GraphSONVersion> VERSIONS = new HashSet<>(Arrays.asList(GraphSONVersion.V2_0, GraphSONVersion.V3_0));
private static final GraphTraversalSource g = TinkerFactory.createModern().traversal();
@Test
public void shouldDeserializeGraphObjects() throws Exception {
for (final GraphSONVersion version : VERSIONS) {
final ScriptEngine jythonEngine = JythonScriptEngineSetup.setup((PyScriptEngine) new ScriptEngineManager().getEngineByName("jython"));
jythonEngine.eval("graphson_reader = " + (version.equals(GraphSONVersion.V2_0) ? "graphsonV2d0_reader" : "graphsonV3d0_reader"));
final ObjectMapper mapper = GraphSONMapper.build().version(version).create().createMapper();
//
final Vertex vertex = g.V(1).next();
jythonEngine.getBindings(ScriptContext.ENGINE_SCOPE).put("x", mapper.writeValueAsString(vertex));
assertEquals(vertex.toString(), jythonEngine.eval("str(graphson_reader.readObject(x))"));
assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.readObject(x),Vertex)"));
assertEquals("person", jythonEngine.eval("graphson_reader.readObject(x).label"));
assertEquals(1, jythonEngine.eval("graphson_reader.readObject(x).id"));
//
final Edge edge = g.V(1).outE("created").next();
jythonEngine.getBindings(ScriptContext.ENGINE_SCOPE).put("x", mapper.writeValueAsString(edge));
assertEquals(edge.toString(), jythonEngine.eval("str(graphson_reader.readObject(x))"));
assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.readObject(x),Edge)"));
assertEquals("created", jythonEngine.eval("graphson_reader.readObject(x).label"));
//
final VertexProperty vertexProperty = (VertexProperty) g.V(1).properties("name").next();
jythonEngine.getBindings(ScriptContext.ENGINE_SCOPE).put("x", mapper.writeValueAsString(vertexProperty));
assertEquals(vertexProperty.toString(), jythonEngine.eval("str(graphson_reader.readObject(x))"));
assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.readObject(x),VertexProperty)"));
//
final Property property = g.V(1).outE("created").properties("weight").next();
jythonEngine.getBindings(ScriptContext.ENGINE_SCOPE).put("x", mapper.writeValueAsString(property));
assertEquals(property.toString(), jythonEngine.eval("str(graphson_reader.readObject(x))"));
assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.readObject(x),Property)"));
//
final Traverser<Vertex> traverser = new DefaultRemoteTraverser<>(vertex, 3L);
jythonEngine.getBindings(ScriptContext.ENGINE_SCOPE).put("x", mapper.writeValueAsString(traverser));
assertEquals(traverser.toString(), jythonEngine.eval("str(graphson_reader.readObject(x))"));
assertEquals(BigInteger.valueOf(3L), jythonEngine.eval("graphson_reader.readObject(x).bulk")); // jython uses big integer in Java
assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.readObject(x).object,Vertex)"));
assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.readObject(x),Traverser)"));
}
}
@Test
public void shouldDeserializeNumbers() throws Exception {
for (final GraphSONVersion version : VERSIONS) {
final ScriptEngine jythonEngine = JythonScriptEngineSetup.setup((PyScriptEngine) new ScriptEngineManager().getEngineByName("jython"));
jythonEngine.eval("graphson_reader = " + (version.equals(GraphSONVersion.V2_0) ? "graphsonV2d0_reader" : "graphsonV3d0_reader"));
final ObjectMapper mapper = GraphSONMapper.build().version(version).create().createMapper();
//
jythonEngine.getBindings(ScriptContext.ENGINE_SCOPE).put("x", mapper.writeValueAsString(1));
assertEquals("1", jythonEngine.eval("str(graphson_reader.readObject(x))"));
assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.readObject(x),int)"));
//
jythonEngine.getBindings(ScriptContext.ENGINE_SCOPE).put("x", mapper.writeValueAsString(1L));
assertEquals("1", jythonEngine.eval("str(graphson_reader.readObject(x))"));
assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.readObject(x),long)"));
//
jythonEngine.getBindings(ScriptContext.ENGINE_SCOPE).put("x", mapper.writeValueAsString(1.2f));
assertEquals("1.2", jythonEngine.eval("str(graphson_reader.readObject(x))"));
assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.readObject(x),float)"));
//
jythonEngine.getBindings(ScriptContext.ENGINE_SCOPE).put("x", mapper.writeValueAsString(1.3d));
assertEquals("1.3", jythonEngine.eval("str(graphson_reader.readObject(x))"));
assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.readObject(x),float)"));
}
}
@Test
public void shouldDeserializeCollections() throws Exception {
for (final GraphSONVersion version : VERSIONS) {
final ScriptEngine jythonEngine = JythonScriptEngineSetup.setup((PyScriptEngine) new ScriptEngineManager().getEngineByName("jython"));
jythonEngine.eval("graphson_reader = " + (version.equals(GraphSONVersion.V2_0) ? "graphsonV2d0_reader" : "graphsonV3d0_reader"));
final ObjectMapper mapper = GraphSONMapper.build().version(version).create().createMapper();
//
final Map<String, Number> map = new LinkedHashMap<>();
map.put("a", 2);
map.put("b", 2.3d);
jythonEngine.getBindings(ScriptContext.ENGINE_SCOPE).put("x", mapper.writeValueAsString(map));
assertEquals("{u'a': 2, u'b': 2.3}", jythonEngine.eval("str(graphson_reader.readObject(x))"));
assertEquals(2, jythonEngine.eval("graphson_reader.readObject(x)['a']"));
assertEquals(2.3d, jythonEngine.eval("graphson_reader.readObject(x)['b']")); // jython is smart about double
assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.readObject(x)['a'],int)"));
assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.readObject(x)['b'],float)"));
//
final List<Object> list = Arrays.asList(g.V(1).next(), "hello", map, true);
jythonEngine.getBindings(ScriptContext.ENGINE_SCOPE).put("x", mapper.writeValueAsString(list));
assertEquals("[v[1], u'hello', {u'a': 2, u'b': 2.3}, True]", jythonEngine.eval("str(graphson_reader.readObject(x))"));
assertEquals(g.V(1).next().toString(), jythonEngine.eval("str(graphson_reader.readObject(x)[0])"));
assertEquals("hello", jythonEngine.eval("graphson_reader.readObject(x)[1]"));
assertEquals("{u'a': 2, u'b': 2.3}", jythonEngine.eval("str(graphson_reader.readObject(x)[2])"));
assertTrue((Boolean) jythonEngine.eval("graphson_reader.readObject(x)[3]"));
assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.readObject(x)[0],Vertex)"));
// assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.readObject(x)[1],str)")); // its python unicode jython object
assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.readObject(x)[2],dict)"));
assertTrue((Boolean) jythonEngine.eval("isinstance(graphson_reader.readObject(x)[3],bool)"));
}
}
}