/* * 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.jsr223; import org.apache.tinkerpop.gremlin.process.traversal.Traverser; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.TranslationStrategy; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory; import org.apache.tinkerpop.gremlin.util.function.Lambda; import org.junit.Test; import java.util.ArrayList; import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ public class JythonTranslatorTest { /*@Test public void shouldHandleStrategies() throws Exception { GraphTraversalSource g = TinkerFactory.createModern().traversal(); g = g.withStrategies(new HashMap<String, Object>() {{ put(SubgraphStrategy.STRATEGY, SubgraphStrategy.class.getCanonicalName()); put(SubgraphStrategy.VERTICES, __.has("name", "marko")); }}); final Bindings bindings = new SimpleBindings(); bindings.put("g", g); //System.out.println(JythonTranslator.of("g").translate(g.V().values("name").asAdmin().getBytecode())); Traversal.Admin<Vertex, String> traversal = ((GremlinScriptEngine) ScriptEngineCache.get("gremlin-jython")).eval(g.V().values("name").asAdmin().getBytecode(), bindings); assertEquals("marko", traversal.next()); assertFalse(traversal.hasNext()); // g = g.withStrategies(new HashMap<String, Object>() {{ put(SubgraphStrategy.STRATEGY, SubgraphStrategy.class.getCanonicalName()); put(SubgraphStrategy.VERTICES, __.has("name", "marko")); }}, Collections.singletonMap(ReadOnlyStrategy.STRATEGY, ReadOnlyStrategy.class.getCanonicalName())); //System.out.println(JythonTranslator.of("g").translate(g.V().values("name").asAdmin().getBytecode())); traversal = ((GremlinScriptEngine) ScriptEngineCache.get("gremlin-jython")).eval(g.V().values("name").asAdmin().getBytecode(), bindings); assertEquals("marko", traversal.next()); assertFalse(traversal.hasNext()); }*/ @Test public void shouldSupportStringSupplierLambdas() throws Exception { GraphTraversalSource g = TinkerFactory.createModern().traversal(); g = g.withStrategies(new TranslationStrategy(g, JythonTranslator.of("g"))); GraphTraversal.Admin<Vertex, Integer> t = g.withSideEffect("lengthSum", 0).withSack(1) .V() .filter(Lambda.predicate("x : x.get().label() == 'person'")) .flatMap(Lambda.function("lambda x : x.get().vertices(Direction.OUT)")) .map(Lambda.<Traverser<Object>, Integer>function("lambda x : len(x.get().value('name'))")) .sideEffect(Lambda.consumer(" x : x.sideEffects(\"lengthSum\", x.sideEffects('lengthSum') + x.get()) ")) .order().by(Lambda.comparator(" lambda a,b : 0 if a == b else 1 if a > b else -1")) .sack(Lambda.biFunction("lambda a,b : a + b")) .asAdmin(); final List<Integer> sacks = new ArrayList<>(); final List<Integer> lengths = new ArrayList<>(); while (t.hasNext()) { final Traverser.Admin<Integer> traverser = t.nextTraverser(); sacks.add(traverser.sack()); lengths.add(traverser.get()); } assertFalse(t.hasNext()); // assertEquals(6, lengths.size()); assertEquals(3, lengths.get(0).intValue()); assertEquals(3, lengths.get(1).intValue()); assertEquals(3, lengths.get(2).intValue()); assertEquals(4, lengths.get(3).intValue()); assertEquals(5, lengths.get(4).intValue()); assertEquals(6, lengths.get(5).intValue()); /// assertEquals(6, sacks.size()); assertEquals(4, sacks.get(0).intValue()); assertEquals(4, sacks.get(1).intValue()); assertEquals(4, sacks.get(2).intValue()); assertEquals(5, sacks.get(3).intValue()); assertEquals(6, sacks.get(4).intValue()); assertEquals(7, sacks.get(5).intValue()); // assertEquals(24, t.getSideEffects().<Number>get("lengthSum").intValue()); } @Test public void shouldHaveValidToString() { assertEquals("translator[h:gremlin-jython]", JythonTranslator.of("h").toString()); } }