Source code for aiogremlin.driver.client
"""Client for the Tinkerpop 3 Gremlin Server."""
from aiogremlin import exception
from gremlin_python.driver import request
from gremlin_python.process import traversal
[docs]class Client:
"""
Client that utilizes a :py:class:`Cluster<aiogremlin.driver.cluster.Cluster>`
to access a cluster of Gremlin Server hosts. Issues requests to hosts using
a round robin strategy.
:param aiogremlin.driver.cluster.Cluster cluster: Cluster used by
client
:param asyncio.BaseEventLoop loop:
:param dict aliases: Optional mapping for aliases. Default is `None`
"""
def __init__(self, cluster, loop, *, hostname=None, aliases=None):
self._cluster = cluster
self._loop = loop
if aliases is None:
aliases = {}
self._hostname = hostname
self._aliases = aliases
@property
def aliases(self):
"""Read-only property"""
return self._aliases
@property
def message_serializer(self):
"""Read-only property"""
return self.cluster.config['message_serializer']
@property
def cluster(self):
"""
Read-only property.
:returns: The instance of
:py:class:`Cluster<aiogremlin.driver.cluster.Cluster>` associated with
client.
"""
return self._cluster
[docs] async def close(self):
await self._cluster.close()
[docs] def alias(self, aliases):
client = Client(self._cluster, self._loop,
aliases=aliases)
return client
[docs] async def submit(self, message, bindings=None):
"""
**coroutine** Submit a script and bindings to the Gremlin Server.
:param message: Can be an instance of
`RequestMessage<gremlin_python.driver.request.RequestMessage>` or
`Bytecode<gremlin_python.process.traversal.Bytecode>`
or a `str` representing a raw Gremlin script
:param dict bindings: Optional bindings used with raw Grelmin
:returns: :py:class:`ResultSet<aiogremlin.driver.resultset.ResultSet>`
object
"""
if isinstance(message, traversal.Bytecode):
message = request.RequestMessage(
processor='traversal', op='bytecode',
args={'gremlin': message,
'aliases': self._aliases})
elif isinstance(message, str):
message = request.RequestMessage(
processor='', op='eval',
args={'gremlin': message,
'aliases': self._aliases})
if bindings:
message.args.update({'bindings': bindings})
conn = await self.cluster.get_connection(hostname=self._hostname)
resp = await conn.write(message)
self._loop.create_task(conn.release_task(resp))
return resp