| # 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. |
| # |
| |
| """ |
| Unit tests for the Translator Class. |
| """ |
| __author__ = 'Kelvin R. Lawrence (gfxman)' |
| |
| from gremlin_python.structure.graph import Graph, Vertex, Edge, VertexProperty |
| from gremlin_python.process.anonymous_traversal import traversal |
| from gremlin_python.process.graph_traversal import __ |
| from gremlin_python.process.translator import * |
| from datetime import datetime |
| |
| |
| class TestTranslator(object): |
| |
| def test_translations(self): |
| g = traversal().with_(None) |
| |
| tests = list() |
| # 0 |
| tests.append([g.V(), |
| "g.V()"]) |
| # 1 |
| tests.append([g.V('1', '2', '3', '4'), |
| "g.V('1','2','3','4')"]) |
| # 2 |
| tests.append([g.V('3').valueMap(True), |
| "g.V('3').valueMap(true)"]) |
| # 3 |
| tests.append([g.V().constant(5), |
| "g.V().constant(5)"]) |
| # 4 |
| tests.append([g.V().constant(1.5), |
| "g.V().constant(1.5d)"]) |
| # 5 |
| tests.append([g.V().constant('Hello'), |
| "g.V().constant('Hello')"]) |
| # 6 |
| tests.append([g.V().hasLabel('airport').limit(5), |
| "g.V().hasLabel('airport').limit(5)"]) |
| # 7 |
| tests.append([g.V().hasLabel(within('a', 'b', 'c')), |
| "g.V().hasLabel(within(['a','b','c']))"]) |
| # 8 |
| tests.append([g.V().hasLabel('airport', 'continent').out().limit(5), |
| "g.V().hasLabel('airport','continent').out().limit(5)"]) |
| # 9 |
| tests.append([g.V().hasLabel('airport').out().values('code').limit(5), |
| "g.V().hasLabel('airport').out().values('code').limit(5)"]) |
| # 10 |
| tests.append([g.V('3').as_('a').out('route').limit(10).where(eq('a')).by('region'), |
| "g.V('3').as('a').out('route').limit(10).where(eq('a')).by('region')"]) |
| # 11 |
| tests.append([g.V('3').repeat(__.out('route').simplePath()).times(2).path().by('code'), |
| "g.V('3').repeat(__.out('route').simplePath()).times(2).path().by('code')"]) |
| # 12 |
| tests.append([g.V().hasLabel('airport').out().has('region', 'US-TX').values('code').limit(5), |
| "g.V().hasLabel('airport').out().has('region','US-TX').values('code').limit(5)"]) |
| # 13 |
| tests.append([g.V().hasLabel('airport').union(__.values('city'), __.values('region')).limit(5), |
| "g.V().hasLabel('airport').union(__.values('city'),__.values('region')).limit(5)"]) |
| # 14 |
| tests.append([g.V('3').as_('a').out('route', 'routes'), |
| "g.V('3').as('a').out('route','routes')"]) |
| # 15 |
| tests.append([g.V().where(__.values('runways').is_(5)), |
| "g.V().where(__.values('runways').is(5))"]) |
| # 16 |
| tests.append([g.V('3').repeat(__.out().simplePath()).until(__.has('code', 'AGR')).path().by('code').limit(5), |
| "g.V('3').repeat(__.out().simplePath()).until(__.has('code','AGR')).path().by('code').limit(5)"]) |
| # 17 |
| tests.append([g.V().hasLabel('airport').order().by(__.id_()), |
| "g.V().hasLabel('airport').order().by(__.id())"]) |
| # 18 |
| tests.append([g.V().hasLabel('airport').order().by(T.id), |
| "g.V().hasLabel('airport').order().by(T.id)"]) |
| # 19 |
| tests.append([g.V().hasLabel('airport').order().by(__.id_(), Order.desc), |
| "g.V().hasLabel('airport').order().by(__.id(),Order.desc)"]) |
| # 20 |
| tests.append([g.V().hasLabel('airport').order().by('code', Order.desc), |
| "g.V().hasLabel('airport').order().by('code',Order.desc)"]) |
| # 21 |
| tests.append([g.V('1', '2', '3').local(__.out().out().dedup().fold()), |
| "g.V('1','2','3').local(__.out().out().dedup().fold())"]) |
| # 22 |
| tests.append([g.V('3').out().path().count(Scope.local), |
| "g.V('3').out().path().count(Scope.local)"]) |
| # 23 |
| tests.append([g.E().count(), |
| "g.E().count()"]) |
| # 24 |
| tests.append([g.V('5').outE('route').inV().path().limit(10), |
| "g.V('5').outE('route').inV().path().limit(10)"]) |
| # 25 |
| tests.append([g.V('5').propertyMap().select(Column.keys), |
| "g.V('5').propertyMap().select(Column.keys)"]) |
| # 26 |
| tests.append([g.V('5').propertyMap().select(Column.values), |
| "g.V('5').propertyMap().select(Column.values)"]) |
| # 27 |
| tests.append([g.V('3').values('runways').math('_ + 1'), |
| "g.V('3').values('runways').math('_ + 1')"]) |
| # 28 |
| tests.append([g.V('3').emit().repeat(__.out().simplePath()).times(3).limit(5).path(), |
| "g.V('3').emit().repeat(__.out().simplePath()).times(3).limit(5).path()"]) |
| # 29 |
| tests.append([g.V().match(__.as_('a').has('code', 'LHR').as_('b')).select('b').by('code'), |
| "g.V().match(__.as('a').has('code','LHR').as('b')).select('b').by('code')"]) |
| # 30 |
| tests.append([g.V().has('test-using-keyword-as-property', 'repeat'), |
| "g.V().has('test-using-keyword-as-property','repeat')"]) |
| # 31 |
| tests.append([g.V('1').addE('test').to(__.V('4')), |
| "g.V('1').addE('test').to(__.V('4'))"]) |
| # 32 |
| tests.append([g.V().values('runways').max_(), |
| "g.V().values('runways').max()"]) |
| # 33 |
| tests.append([g.V().values('runways').min_(), |
| "g.V().values('runways').min()"]) |
| # 34 |
| tests.append([g.V().values('runways').sum_(), |
| "g.V().values('runways').sum()"]) |
| # 35 |
| tests.append([g.V().values('runways').mean(), |
| "g.V().values('runways').mean()"]) |
| # 36 |
| tests.append([g.withSack(0).V('3', '5').sack(Operator.sum_).by('runways').sack(), |
| "g.withSack(0).V('3','5').sack(Operator.sum).by('runways').sack()"]) |
| # 37 - removed as store() was deprecated and removed in 3.8.0 |
| # 38 |
| tests.append([g.inject(3, 4, 5), |
| "g.inject(3,4,5)"]) |
| # 39 |
| tests.append([g.inject([3, 4, 5]), |
| "g.inject([3,4,5])"]) |
| # 40 |
| tests.append([g.inject(3, 4, 5).count(), |
| "g.inject(3,4,5).count()"]) |
| # 41 |
| tests.append([g.V().has('runways', gt(5)).count(), |
| "g.V().has('runways',gt(5)).count()"]) |
| # 42 |
| tests.append([g.V().has('runways', lte(5.3)).count(), |
| "g.V().has('runways',lte(5.3d)).count()"]) |
| # 43 |
| tests.append([g.V().has('code', within(123, 124)), |
| "g.V().has('code',within([123,124]))"]) |
| # 44 |
| tests.append([g.V().has('code', within(123, 'abc')), |
| "g.V().has('code',within([123,'abc']))"]) |
| # 45 |
| tests.append([g.V().has('code', within('abc', 123)), |
| "g.V().has('code',within(['abc',123]))"]) |
| # 46 |
| tests.append([g.V().has('code', within('abc', 'xyz')), |
| "g.V().has('code',within(['abc','xyz']))"]) |
| # 47 |
| tests.append([g.V('1', '2').has('region', P.within('US-TX', 'US-GA')), |
| "g.V('1','2').has('region',within(['US-TX','US-GA']))"]) |
| # 48 |
| tests.append([g.V().and_(__.has('runways', P.gt(5)), __.has('region', 'US-TX')), |
| "g.V().and(__.has('runways',gt(5)),__.has('region','US-TX'))"]) |
| # 49 |
| tests.append([g.V().union(__.has('runways', gt(5)), __.has('region', 'US-TX')), |
| "g.V().union(__.has('runways',gt(5)),__.has('region','US-TX'))"]) |
| # 50 |
| tests.append([g.V('3').choose(__.values('runways').is_(3), __.constant('three'), __.constant('not three')), |
| "g.V('3').choose(__.values('runways').is(3),__.constant('three'),__.constant('not three'))"]) |
| # 51 |
| tests.append( |
| [g.V('3').choose(__.values('runways')).option(1, __.constant('three')).option(2, __.constant('not three')), |
| "g.V('3').choose(__.values('runways')).option(1,__.constant('three')).option(2,__.constant('not three'))"]) |
| # 52 |
| tests.append([g.V('3').choose(__.values('runways')).option(1.5, __.constant('one and a half')).option(2, |
| __.constant( |
| 'not three')), |
| "g.V('3').choose(__.values('runways')).option(1.5d,__.constant('one and a half')).option(2,__.constant('not three'))"]) |
| # 53 |
| tests.append([g.V('3').repeat(__.out().simplePath()).until(__.loops().is_(1)).count(), |
| "g.V('3').repeat(__.out().simplePath()).until(__.loops().is(1)).count()"]) |
| # 54 |
| tests.append( |
| [g.V().hasLabel('airport').limit(20).group().by('region').by('code').order(Scope.local).by(Column.keys), |
| "g.V().hasLabel('airport').limit(20).group().by('region').by('code').order(Scope.local).by(Column.keys)"]) |
| # 55 |
| tests.append([g.V('1').as_('a').V('2').as_('a').select(Pop.all_, 'a'), |
| "g.V('1').as('a').V('2').as('a').select(Pop.all,'a')"]) |
| # 56 |
| tests.append([g.addV('test').property(Cardinality.set_, 'p1', 10), |
| "g.addV('test').property(Cardinality.set,'p1',10)"]) |
| # 57 |
| tests.append([g.addV('test').property(Cardinality.list_, 'p1', 10), |
| "g.addV('test').property(Cardinality.list,'p1',10)"]) |
| |
| # 58 |
| tests.append([g.addV('test').property(Cardinality.single, 'p1', 10), |
| "g.addV('test').property(Cardinality.single,'p1',10)"]) |
| # 59 |
| tests.append([g.V().limit(5).order().by(T.label), |
| "g.V().limit(5).order().by(T.label)"]) |
| |
| # 60 |
| tests.append([g.V().range_(1, 5), |
| "g.V().range(1,5)"]) |
| |
| # 61 |
| tests.append([g.addV('test').property('p1', 123), |
| "g.addV('test').property('p1',123)"]) |
| |
| # 62 |
| tests.append([g.addV('test').property('date', datetime(2021, 2, 1, 9, 30)), |
| "g.addV('test').property('date',new Date(121,2,1,9,30,0))"]) |
| # 63 |
| tests.append([g.addV('test').property('date', datetime(2021, 2, 1)), |
| "g.addV('test').property('date',new Date(121,2,1,0,0,0))"]) |
| # 64 |
| tests.append([g.addE('route').from_(__.V('1')).to(__.V('2')), |
| "g.addE('route').from(__.V('1')).to(__.V('2'))"]) |
| # 65 |
| tests.append([g.withSideEffect('a', [1, 2]).V('3').select('a'), |
| "g.withSideEffect('a',[1,2]).V('3').select('a')"]) |
| # 66 |
| tests.append([g.withSideEffect('a', 1).V('3').select('a'), |
| "g.withSideEffect('a',1).V('3').select('a')"]) |
| # 67 |
| tests.append([g.withSideEffect('a', 'abc').V('3').select('a'), |
| "g.withSideEffect('a','abc').V('3').select('a')"]) |
| # 68 |
| tests.append([g.V().has('airport', 'region', 'US-NM').limit(3).values('elev').fold().index(), |
| "g.V().has('airport','region','US-NM').limit(3).values('elev').fold().index()"]) |
| # 69 |
| tests.append([g.V('3').repeat(__.timeLimit(1000).out().simplePath()).until(__.has('code', 'AGR')).path(), |
| "g.V('3').repeat(__.timeLimit(1000).out().simplePath()).until(__.has('code','AGR')).path()"]) |
| |
| # 70 |
| tests.append([g.V().hasLabel('airport').where(__.values('elev').is_(gt(14000))), |
| "g.V().hasLabel('airport').where(__.values('elev').is(gt(14000)))"]) |
| |
| # 71 |
| tests.append([g.V().hasLabel('airport').where(__.out().count().is_(gt(250))).values('code'), |
| "g.V().hasLabel('airport').where(__.out().count().is(gt(250))).values('code')"]) |
| |
| # 72 |
| tests.append([g.V().hasLabel('airport').filter_(__.out().count().is_(gt(250))).values('code'), |
| "g.V().hasLabel('airport').filter(__.out().count().is(gt(250))).values('code')"]) |
| # 73 |
| tests.append([g.withSack(0). |
| V('3'). |
| repeat(__.outE('route').sack(Operator.sum_).by('dist').inV()). |
| until(__.has('code', 'AGR').or_().loops().is_(4)). |
| has('code', 'AGR'). |
| local(__.union(__.path().by('code').by('dist'), __.sack()).fold()). |
| limit(10), |
| "g.withSack(0).V('3').repeat(__.outE('route').sack(Operator.sum).by('dist').inV()).until(__.has('code','AGR').or().loops().is(4)).has('code','AGR').local(__.union(__.path().by('code').by('dist'),__.sack()).fold()).limit(10)"]) |
| |
| # 74 |
| tests.append([g.addV().as_('a').addV().as_('b').addE('knows').from_('a').to('b'), |
| "g.addV().as('a').addV().as('b').addE('knows').from('a').to('b')"]) |
| |
| # 75 |
| tests.append([g.addV('Person').as_('a').addV('Person').as_('b').addE('knows').from_('a').to('b'), |
| "g.addV('Person').as('a').addV('Person').as('b').addE('knows').from('a').to('b')"]) |
| # 76 |
| tests.append([g.V('3').project('Out', 'In').by(__.out().count()).by(__.in_().count()), |
| "g.V('3').project('Out','In').by(__.out().count()).by(__.in().count())"]) |
| # 77 |
| tests.append([g.V('44').out().aggregate('a').out().where(within('a')).path(), |
| "g.V('44').out().aggregate('a').out().where(within(['a'])).path()"]) |
| # 78 |
| tests.append([g.V().has('date', datetime(2021, 2, 22)), |
| "g.V().has('date',new Date(121,2,22,0,0,0))"]) |
| # 79 |
| tests.append([g.V().has('date', within(datetime(2021, 2, 22), datetime(2021, 1, 1))), |
| "g.V().has('date',within([new Date(121,2,22,0,0,0),new Date(121,1,1,0,0,0)]))"]) |
| # 80 |
| tests.append([g.V().has('date', between(datetime(2021, 1, 1), datetime(2021, 2, 22))), |
| "g.V().has('date',between(new Date(121,1,1,0,0,0),new Date(121,2,22,0,0,0)))"]) |
| # 81 |
| tests.append([g.V().has('date', inside(datetime(2021, 1, 1), datetime(2021, 2, 22))), |
| "g.V().has('date',inside(new Date(121,1,1,0,0,0),new Date(121,2,22,0,0,0)))"]) |
| # 82 |
| tests.append([g.V().has('date', P.gt(datetime(2021, 1, 1, 9, 30))), |
| "g.V().has('date',gt(new Date(121,1,1,9,30,0)))"]) |
| # 83 |
| tests.append([g.V().has('runways', between(3, 5)), |
| "g.V().has('runways',between(3,5))"]) |
| # 84 |
| tests.append([g.V().has('runways', inside(3, 5)), |
| "g.V().has('runways',inside(3,5))"]) |
| # 85 |
| tests.append([g.V('44').outE().elementMap(), |
| "g.V('44').outE().elementMap()"]) |
| # 86 |
| tests.append([g.V('44').valueMap().by(__.unfold()), |
| "g.V('44').valueMap().by(__.unfold())"]) |
| # 87 |
| tests.append([g.V('44').valueMap().with_(WithOptions.tokens, WithOptions.labels), |
| "g.V('44').valueMap().with(WithOptions.tokens,WithOptions.labels)"]) |
| # 88 |
| tests.append([g.V('44').valueMap().with_(WithOptions.tokens), |
| "g.V('44').valueMap().with(WithOptions.tokens)"]) |
| # 89 |
| tests.append([g.withStrategies(ReadOnlyStrategy()).addV('test'), |
| "g.withStrategies(ReadOnlyStrategy).addV('test')"]) |
| # 90 |
| strategy = SubgraphStrategy(vertices=__.has('region', 'US-TX'), edges=__.hasLabel('route')) |
| tests.append([g.withStrategies(strategy).V().count(), |
| "g.withStrategies(new SubgraphStrategy(vertices:__.has('region','US-TX'),edges:__.hasLabel('route'))).V().count()"]) |
| # 91 |
| strategy = SubgraphStrategy(vertex_properties=__.hasNot('runways')) |
| tests.append([g.withStrategies(strategy).V().count(), |
| "g.withStrategies(new SubgraphStrategy(vertexProperties:__.hasNot('runways'))).V().count()"]) |
| # 92 |
| strategy = SubgraphStrategy(vertices=__.has('region', 'US-TX'), vertex_properties=__.hasNot('runways')) |
| tests.append([g.withStrategies(strategy).V().count(), |
| "g.withStrategies(new SubgraphStrategy(vertices:__.has('region','US-TX'),vertexProperties:__.hasNot('runways'))).V().count()"]) |
| # 93 |
| strategy = SubgraphStrategy(vertices=__.has('region', 'US-TX'), edges=__.hasLabel('route')) |
| tests.append([g.withStrategies(ReadOnlyStrategy(), strategy).V().count(), |
| "g.withStrategies(ReadOnlyStrategy,new SubgraphStrategy(vertices:__.has('region','US-TX'),edges:__.hasLabel('route'))).V().count()"]) |
| # 94 |
| strategy = SubgraphStrategy(vertices=__.has('region', 'US-TX')) |
| tests.append([g.withStrategies(ReadOnlyStrategy(), strategy).V().count(), |
| "g.withStrategies(ReadOnlyStrategy,new SubgraphStrategy(vertices:__.has('region','US-TX'))).V().count()"]) |
| # 95 |
| tests.append([g.with_('evaluationTimeout', 500).V().count(), |
| "g.withStrategies(new OptionsStrategy(evaluationTimeout:500)).V().count()"]) |
| # 96 |
| tests.append([g.withStrategies(OptionsStrategy(evaluationTimeout=500)).V().count(), |
| "g.withStrategies(new OptionsStrategy(evaluationTimeout:500)).V().count()"]) |
| # 97 |
| tests.append([g.withStrategies( |
| PartitionStrategy(partition_key="partition", write_partition="a", read_partitions=["a"])).addV('test'), |
| "g.withStrategies(new PartitionStrategy(partitionKey:'partition',writePartition:'a',readPartitions:['a'])).addV('test')"]) |
| # 98 |
| tests.append([g.withComputer().V().shortestPath().with_(ShortestPath.target, __.has('name', 'peter')), |
| "g.withStrategies(VertexProgramStrategy).V().shortestPath().with('~tinkerpop.shortestPath.target',__.has('name','peter'))"]) |
| |
| # 99 |
| tests.append([g.V().coalesce(__.E(),__.addE('person')), |
| "g.V().coalesce(__.E(),__.addE('person'))"]) |
| # 100 |
| tests.append([g.inject(1).E(), |
| "g.inject(1).E()"]) |
| |
| # 99 |
| tests.append([g.V().has("p1", starting_with("foo")), |
| "g.V().has('p1',startingWith('foo'))"]) |
| |
| # 100 |
| tests.append([g.V().has("p1", ending_with("foo")), |
| "g.V().has('p1',endingWith('foo'))"]) |
| |
| # 101 |
| class SuperStr(str): |
| pass |
| |
| tests.append([g.V(SuperStr("foo_id")), |
| "g.V('foo_id')"]) |
| |
| # 102 |
| tests.append([g.V().has("p1", containing(SuperStr("foo"))), |
| "g.V().has('p1',containing('foo'))"]) |
| |
| # 103 |
| tests.append([g.V().has("p1", None), |
| "g.V().has('p1',null)"]) |
| |
| # 104 |
| vertex = Vertex(0, "person") |
| tests.append([g.V(vertex), |
| "g.V(new ReferenceVertex(0,'person'))"]) |
| |
| # 105 |
| outVertex = Vertex(0, "person") |
| inVertex = Vertex(1, "person") |
| edge = Edge(2, outVertex, "knows", inVertex) |
| tests.append([g.inject(edge), |
| "g.inject(new ReferenceEdge(2,'knows',new ReferenceVertex(1,'person'),new ReferenceVertex(0,'person')))"]) |
| |
| # 106 |
| vp = VertexProperty(3, "time", "18:00", None) |
| tests.append([g.inject(vp), |
| "g.inject(new ReferenceVertexProperty(3,'time','18:00'))"]) |
| |
| # 107 |
| tests.append([g.V().has('person', 'name', 'marko').map(lambda: ("it.get().value('name')", "gremlin-groovy")), |
| "g.V().has('person','name','marko').map({it.get().value('name')})"]) |
| |
| # 108 |
| tests.append([g.V().has('person', 'age', Bindings.of('x', P.lt(30))).count(), |
| "g.V().has('person','age',Bindings.instance().of('x', lt(30))).count()"]) |
| |
| # 109 |
| tests.append([g.inject({'name': 'java'}, {T.id: 0}, {}, |
| {'age': float(10), 'pos_inf': float("inf"), 'neg_inf': float("-inf"), 'nan': float("nan")}), |
| "g.inject(['name':'java'],[(T.id):0],[:],['age':10.0d,'pos_inf':Double.POSITIVE_INFINITY,'neg_inf':Double.NEGATIVE_INFINITY,'nan':Double.NaN])"]) |
| |
| # 110 |
| tests.append([g.inject(float(1)).is_(P.eq(1).or_(P.gt(2)).or_(P.lte(3)).or_(P.gte(4))), |
| "g.inject(1.0d).is(eq(1).or(gt(2)).or(lte(3)).or(gte(4)))"]) |
| |
| # 111 |
| tests.append([g.V().hasLabel('person').has('age',P.gt(10).or_(P.gte(11).and_(P.lt(20))).and_(P.lt(29).or_(P.eq(35)))).name, |
| "g.V().hasLabel('person').has('age',gt(10).or(gte(11).and(lt(20))).and(lt(29).or(eq(35)))).values('name')"]) |
| |
| # 112 |
| tests.append([g.inject(set(('a'))), |
| "g.inject(['a'] as Set)"]) |
| |
| # 113 |
| tests.append([g.merge_v(None), |
| "g.mergeV((Traversal) null)"]) |
| |
| # 114 |
| tests.append([g.merge_e(None), |
| "g.mergeE((Traversal) null)"]) |
| |
| tlr = Translator().of('g') |
| |
| for t in range(len(tests)): |
| a = tlr.translate(tests[t][0].bytecode) |
| assert a == tests[t][1] |
| |
| def test_target_language(self): |
| tlr = Translator().of('g') |
| assert tlr.get_target_language() == 'gremlin-groovy' |
| |
| def test_constructor(self): |
| tlr = Translator().of('g') |
| g = traversal().with_(None) |
| assert tlr.translate(g.V().bytecode) == "g.V()" |
| |
| def test_source_name(self): |
| tlr = Translator().of('g') |
| assert tlr.get_traversal_source() == 'g' |