Dar.

>>> g.V().name.toList()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File 
"/Users/marko/software/tinkerpop/gremlin-variant/src/main/jython/gremlin_python/gremlin_python.py",
 line 107, in toList
    return list(iter(self))
  File 
"/Users/marko/software/tinkerpop/gremlin-variant/src/main/jython/gremlin_python/gremlin_python.py",
 line 110, in next
    self.results = self.remote_connection.submit(self.translator.script_engine, 
self.translator.traversal_script, self.bindings)
  File 
"/Library/Python/2.7/site-packages/gremlinclient/tornado_client/remote_connection.py",
 line 20, in submit
    results = self._loop.run_sync(lambda:
  File "/Library/Python/2.7/site-packages/tornado/ioloop.py", line 453, in 
run_sync
    return future_cell[0].result()
  File "/Library/Python/2.7/site-packages/tornado/concurrent.py", line 232, in 
result
    raise_exc_info(self._exc_info)
  File "/Library/Python/2.7/site-packages/tornado/gen.py", line 1014, in run
    yielded = self.gen.throw(*exc_info)
  File 
"/Library/Python/2.7/site-packages/gremlinclient/tornado_client/remote_connection.py",
 line 27, in _execute
    conn = yield self._pool.acquire()
  File "/Library/Python/2.7/site-packages/tornado/gen.py", line 1008, in run
    value = future.result()
  File "/Library/Python/2.7/site-packages/tornado/concurrent.py", line 232, in 
result
    raise_exc_info(self._exc_info)
  File "<string>", line 3, in raise_exc_info
tornado.httpclient.HTTPError: HTTP 400: Bad Request




> On Jun 15, 2016, at 5:36 PM, David Brown <[email protected]> wrote:
> 
> Nice Leif!
> 
> I just added very basic support for the RemoteConnection interface in
> gremlinclient:
> 
> http://gremlinclient.readthedocs.io/en/latest/usage.html#the-remoteconnection-object
> 
> It needs more tests etc., but it seems to be working well. If you want
> to try it out, you can pip install gremlinclient from github:
> 
> pip install git+https://github.com/davebshow/gremlinclient.git
> 
> More tomorrow...
> 
> On Wed, Jun 15, 2016 at 7:17 PM, Leifur Halldor Asgeirsson
> <[email protected]> wrote:
>> Thanks! I'll submit my PR in the morning.
>> 
>> ________________________________________
>> From: Marko Rodriguez <[email protected]>
>> Sent: June 15, 2016 6:13 PM
>> To: [email protected]
>> Subject: Re: gremlin_python GLV
>> 
>> Hi,
>> 
>> That is a really good idea.
>> 
>> Want to do a PR to the branch or do you want me to just take your notes/gist 
>> and make it happen?
>> 
>> Marko.
>> 
>> http://markorodriguez.com
>> 
>> 
>> 
>>> On Jun 15, 2016, at 3:55 PM, Leifur Halldor Asgeirsson 
>>> <[email protected]> wrote:
>>> 
>>> Hi all,
>>> I have a couple of suggestions for the GLV.
>>> 
>>> Firstly, it would be useful to be able to inject arbitrary expressions, 
>>> such as static constructors. For example, in an application that I'm 
>>> currently working on, I use Titan's Geoshape property type. I would like to 
>>> be able to call one of the static constructors on the Geoshape class in a 
>>> script, passing it bound parameters. Something like
>>> 
>>> "g.V().has('location', geoWithin(Geoshape.circle(lat, lon, radius)))"
>>> with bound parameters {'lat': 45, 'lon': 45, 'radius': '10'}
>>> 
>>> I took an initial stab at this today, and this is what I came up with:
>>> https://gist.github.com/leifurhauks/5a843379183123dbed1134a92691a335
>>> 
>>> With those changes, I can use that static constructor in a traversal as 
>>> follows:
>>> 
>>>>>> translator = GroovyTranslator('g')
>>>>>> g = PythonGraphTraversalSource(translator)
>>>>>> t = g.V().has('location', RawExpression('Geoshape.point(', B('lat', 45), 
>>>>>> ', ', B('lon', 45), ')'))
>>>>>> str(t)
>>> 'g.V().has("location", Geoshape.point(lat, lon))'
>>>>>> t.bindings
>>> {'lon': 45, 'lat': 45}
>>> 
>>> That raw expression isn't very readable, but a simple helper class can fix 
>>> that:
>>> 
>>> class Geoshape(object):
>>>   @staticmethod
>>>   def point(latitude, longitude, symbols=('lat', 'lon')):
>>>       return RawExpression(
>>>           'Geoshape.point(', B(symbols[0], latitude), ', ', B(symbols[1], 
>>> longitude), ')')
>>> 
>>> Now I can rewrite the previous traversal to be much clearer:
>>> 
>>> t = g.V().has('location', Geoshape.point(45, 45))
>>> 
>>> 
>>> If this seems like a reasonable approach, I would be happy to submit a PR.
>>> 
>>> 
>>> I have one other suggestion, but this one is tiny. Because most of the 
>>> steps on PythonGraphTraversal have the same implementation, it would be 
>>> possible to specify that implementation once in a function factory, like 
>>> this:
>>> 
>>> def simple_step(name):
>>>   def step_method(self, *args):
>>>       self.translator.addStep(self, name, *args)
>>>       for arg in args:
>>>           if type(arg) is B:
>>>               self.bindings[arg.symbol] = arg.value
>>>       return self
>>> return step_method
>>> 
>>> Then, on PythonGraphTraversal, all the step methods that use that 
>>> implementation could be declared like this:
>>> 
>>> class PythonGraphTraversal(object):
>>>   def __init__(self, translator, remote_connection=None):
>>>       # elided ...
>>>   # top methods elided
>>>   has = simple_step('has')
>>>   hasId = simple_step('hasId')
>>>   hasKey = smple_step('hasKey')
>>>   # and so on...
>>> 
>>> 
>>> ________________________________________
>>> From: David Brown <[email protected]>
>>> Sent: June 15, 2016 3:23 PM
>>> To: [email protected]
>>> Subject: Re: gremlin_python GLV
>>> 
>>> Ok Stephen I will. I can't claim to be an expert (especially when it
>>> comes to the Java ecosystem), but I will definitely take a look.
>>> 
>>> Also, Marko, Python doesn't really have primitives as such. The built
>>> in function isinstance should work for everything in gremlin_python
>>> e.g. ``isinstance(var, bool)``. I can take a look at this when I make
>>> a PR if you'd like, but it really isn't a huge deal anyway.
>>> 
>>> On Wed, Jun 15, 2016 at 3:16 PM, Stephen Mallette <[email protected]> 
>>> wrote:
>>>> David, it would also be great to get your feedback on the
>>>> packaging/deployment approach we have so far. I have some basic figured out
>>>> for deployment to pypi over maven via twine, but it could use an experts
>>>> eye. You probably don't need to check that part out now as you are already
>>>> have some other stuff to look at, but I just wanted to mention that so that
>>>> it was in your mind for later. Thanks for your help on this.
>>>> 
>>>> On Wed, Jun 15, 2016 at 3:02 PM, Marko Rodriguez <[email protected]>
>>>> wrote:
>>>> 
>>>>> Hello,
>>>>> 
>>>>>> I was reading through the gremlin_python GLV code this morning, and
>>>>>> overall it looks like it should work pretty smoothly. Thanks for doing
>>>>>> this Marko, really cool work! I just wanted to comment on a few things
>>>>>> that popped out at me on my first reading.The major issue I see is
>>>>>> that it is not currently Python 2/3 compatible. This is due to two
>>>>>> things:
>>>>> 
>>>>> Cool! Thank you for taking your time to review the work.
>>>>> 
>>>>>> 1. The way iterators are implemented in Python 2/3 is different. This
>>>>>> problem could be remedied by adding a method to
>>>>>> ``PythonGraphTraversal``, something like:
>>>>>> 
>>>>>> def __next__(self):
>>>>>>  return self.next()
>>>>>> 
>>>>>> then, in the ``next`` method, changing line 113 to
>>>>>> ``next(self.results)``, should take care of this problem.
>>>>> 
>>>>> Updated.
>>>>> 
>>>>>> 2. The ``GroovyTranslator`` class checks for type ``long``, this no
>>>>>> longer exists in Python 3. Determining what to submit as a Long might
>>>>>> require some discussion, but this could be easily fixed by adding
>>>>>> something like:
>>>>>> 
>>>>>> import sys
>>>>>> if sys.version_info.major > 2:
>>>>>>  long = int
>>>>>> 
>>>>>> to the top of the file.
>>>>> 
>>>>> Updated.
>>>>> 
>>>>>> 
>>>>>> Other than this, there are some minor details that could be cleaned
>>>>>> up. Particularly:
>>>>>> 
>>>>>> 1. Using ``isinstance`` instead of ``type`` to perform type checking.
>>>>>> This will recognize subclasses and is the most Pythonic way to do
>>>>>> this.
>>>>> 
>>>>> Seems isinstance() isn’t a method on primitives — only objects. Thus, the
>>>>> code got complex. Left it with type().
>>>>> 
>>>>>> 
>>>>>> 2. Formatting - indents, and line spacing. Typically, Python methods
>>>>>> are separated by a single line, and indents use four spaces. This is
>>>>>> really just cosmetic for readability.
>>>>> 
>>>>> Uh. The problem is that the source code is auto-generated from
>>>>> GremlinPythonGenerator. If you want to tweak, please do so:
>>>>> 
>>>>> 
>>>>> https://github.com/apache/tinkerpop/blob/TINKERPOP-1278/gremlin-variant/src/main/groovy/org/apache/tinkerpop/gremlin/python/GremlinPythonGenerator.groovy
>>>>> <
>>>>> https://github.com/apache/tinkerpop/blob/TINKERPOP-1278/gremlin-variant/src/main/groovy/org/apache/tinkerpop/gremlin/python/GremlinPythonGenerator.groovy
>>>>>> 
>>>>> 
>>>>> 
>>>>>> 3. CamelCase vs. underscores. I understand that to emulate Gremlin,
>>>>>> the traversal methods etc. should use CamelCase. But I wonder if the
>>>>>> helper classes (Translators) should use the Python convention of using
>>>>>> underscores to name methods. Python class names use camel case by
>>>>>> convention.
>>>>> 
>>>>> 
>>>>> I haven’t changed it. If you feel we should, please do. And yes, I think
>>>>> its good to keep the Gremlin step names camelCase. For Gremlin-Ruby, we
>>>>> will do out_e() style.
>>>>> 
>>>>>> Finally, the implementation of the B class may need some work, but
>>>>>> we'll have to play around with it a bit to figure out how the best
>>>>>> approach to doing this.
>>>>> 
>>>>> 
>>>>> Yea, thats all wrong. I overdosed on the introspection and then Kuppitz
>>>>> was like “Why not just have it as….” (something much simpler — which I
>>>>> forget what it was now).
>>>>> 
>>>>>> I'm sure there are more improvements, but I just wanted to get a
>>>>>> conversation going. I would be happy to make a PR with some of these
>>>>>> changes.
>>>>> 
>>>>> That’d be awesome. Its in TINKERPOP-1278 branch. In gremlin-variant/test
>>>>> you will see PythonProcessStandardTest and PythonProcessComputerTest. 
>>>>> Those
>>>>> verify that the compilation is valid for all the standard and computer
>>>>> tests.
>>>>> 
>>>>>> Also, gremlinclient will soon support the RemoteConnection interface,
>>>>>> I'll send out a link to the docs once I get everything up and running.
>>>>> 
>>>>> So cool. Please do review the Python RemoteConnection class as again, I
>>>>> just improv’d it.
>>>>> 
>>>>> Thanks again David,
>>>>> Marko.
>>>>> 
>>>>> http://markorodriguez.com
>>> 
>>> 
>>> 
>>> --
>>> David M. Brown
>>> R.A. CulturePlex Lab, Western University
>> 
> 
> 
> 
> -- 
> David M. Brown
> R.A. CulturePlex Lab, Western University

Reply via email to