aiogremlin.driver.client   A
last analyzed

Complexity

Total Complexity 11

Size/Duplication

Total Lines 85
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 11
eloc 44
dl 0
loc 85
rs 10
c 0
b 0
f 0

7 Methods

Rating   Name   Duplication   Size   Complexity  
A Client.aliases() 0 4 1
A Client.close() 0 2 1
A Client.alias() 0 4 1
A Client.submit() 0 28 4
A Client.__init__() 0 7 2
A Client.message_serializer() 0 4 1
A Client.cluster() 0 10 1
1
"""Client for the Tinkerpop 3 Gremlin Server."""
2
3
from aiogremlin import exception
4
5
from gremlin_python.driver import request
6
from gremlin_python.process import traversal
7
8
9
class Client:
10
    """
11
    Client that utilizes a :py:class:`Cluster<aiogremlin.driver.cluster.Cluster>`
12
    to access a cluster of Gremlin Server hosts. Issues requests to hosts using
13
    a round robin strategy.
14
15
    :param aiogremlin.driver.cluster.Cluster cluster: Cluster used by
16
        client
17
    :param asyncio.BaseEventLoop loop:
18
    :param dict aliases: Optional mapping for aliases. Default is `None`
19
    """
20
    def __init__(self, cluster, loop, *, hostname=None, aliases=None):
21
        self._cluster = cluster
22
        self._loop = loop
23
        if aliases is None:
24
            aliases = {}
25
        self._hostname = hostname
26
        self._aliases = aliases
27
28
    @property
29
    def aliases(self):
30
        """Read-only property"""
31
        return self._aliases
32
33
    @property
34
    def message_serializer(self):
35
        """Read-only property"""
36
        return self.cluster.config['message_serializer']
37
38
    @property
39
    def cluster(self):
40
        """
41
        Read-only property.
42
43
        :returns: The instance of
44
            :py:class:`Cluster<aiogremlin.driver.cluster.Cluster>` associated with
45
            client.
46
        """
47
        return self._cluster
48
49
    async def close(self):
50
        await self._cluster.close()
51
52
    def alias(self, aliases):
53
        client = Client(self._cluster, self._loop,
54
                        aliases=aliases)
55
        return client
56
57
    async def submit(self, message, bindings=None):
58
        """
59
        **coroutine** Submit a script and bindings to the Gremlin Server.
60
61
        :param message: Can be an instance of
62
            `RequestMessage<gremlin_python.driver.request.RequestMessage>` or
63
            `Bytecode<gremlin_python.process.traversal.Bytecode>`
64
            or a `str` representing a raw Gremlin script
65
        :param dict bindings: Optional bindings used with raw Grelmin
66
        :returns: :py:class:`ResultSet<aiogremlin.driver.resultset.ResultSet>`
67
            object
68
        """
69
        if isinstance(message, traversal.Bytecode):
70
            message = request.RequestMessage(
71
                processor='traversal', op='bytecode',
72
                args={'gremlin': message,
73
                      'aliases': self._aliases})
74
        elif isinstance(message, str):
75
            message = request.RequestMessage(
76
                processor='', op='eval',
77
                args={'gremlin': message,
78
                      'aliases': self._aliases})
79
            if bindings:
80
                message.args.update({'bindings': bindings})
81
        conn = await self.cluster.get_connection(hostname=self._hostname)
82
        resp = await conn.write(message)
83
        self._loop.create_task(conn.release_task(resp))
84
        return resp
85