Skip to content

Commit 7e43bc6

Browse files
committed
Rebase for pull request.
2 parents a1c0abe + d1aa81a commit 7e43bc6

File tree

3 files changed

+72
-1
lines changed

3 files changed

+72
-1
lines changed

.travis.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ addons:
66
- wget
77

88
matrix:
9+
allow_failures:
10+
- python: 3.4
11+
env: TOX_ENV=docs
912
include:
1013
- python: 2.7
1114
env: TOX_ENV=py27

influxdb/client.py

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,13 +293,27 @@ def write(self, data, params=None, expected_response_code=204,
293293
)
294294
return True
295295

296+
def _read_chunked_response(self, response, raise_errors=True):
297+
result_set = {}
298+
for line in response.iter_lines():
299+
if isinstance(line, bytes):
300+
line = line.decode('utf-8')
301+
data = json.loads(line)
302+
for result in data.get('results', []):
303+
for _key in result:
304+
if type(result[_key]) == list:
305+
result_set.setdefault(_key, []).extend(result[_key])
306+
return ResultSet(result_set, raise_errors=raise_errors)
307+
296308
def query(self,
297309
query,
298310
params=None,
299311
epoch=None,
300312
expected_response_code=200,
301313
database=None,
302-
raise_errors=True):
314+
raise_errors=True,
315+
chunked=False,
316+
chunk_size=0):
303317
"""Send a query to InfluxDB.
304318
305319
:param query: the actual query string
@@ -319,6 +333,14 @@ def query(self,
319333
returns errors, defaults to True
320334
:type raise_errors: bool
321335
336+
:param chunked: Enable to use chunked responses from InfluxDB.
337+
With ``chunked`` enabled, one ResultSet is returned per chunk
338+
containing all results within that chunk
339+
:type chunked: bool
340+
341+
:param chunk_size: Size of each chunk to tell InfluxDB to use.
342+
:type chunk_size: int
343+
322344
:returns: the queried data
323345
:rtype: :class:`~.ResultSet`
324346
"""
@@ -331,6 +353,11 @@ def query(self,
331353
if epoch is not None:
332354
params['epoch'] = epoch
333355

356+
if chunked:
357+
params['chunked'] = 'true'
358+
if chunk_size > 0:
359+
params['chunk_size'] = chunk_size
360+
334361
response = self.request(
335362
url="query",
336363
method='GET',
@@ -339,6 +366,9 @@ def query(self,
339366
expected_response_code=expected_response_code
340367
)
341368

369+
if chunked:
370+
return self._read_chunked_response(response)
371+
342372
data = response.json()
343373

344374
results = [

influxdb/tests/client_test.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import unittest
3333

3434
from influxdb import InfluxDBClient
35+
from influxdb.resultset import ResultSet
3536

3637

3738
def _build_response_object(status_code=200, content=""):
@@ -792,6 +793,43 @@ def test_invalid_port_fails(self):
792793
with self.assertRaises(ValueError):
793794
InfluxDBClient('host', '80/redir', 'username', 'password')
794795

796+
def test_chunked_response(self):
797+
example_response = \
798+
u'{"results":[{"statement_id":0,"series":' \
799+
'[{"name":"cpu","columns":["fieldKey","fieldType"],"values":' \
800+
'[["value","integer"]]}],"partial":true}]}\n{"results":' \
801+
'[{"statement_id":0,"series":[{"name":"iops","columns":' \
802+
'["fieldKey","fieldType"],"values":[["value","integer"]]}],' \
803+
'"partial":true}]}\n{"results":[{"statement_id":0,"series":' \
804+
'[{"name":"load","columns":["fieldKey","fieldType"],"values":' \
805+
'[["value","integer"]]}],"partial":true}]}\n{"results":' \
806+
'[{"statement_id":0,"series":[{"name":"memory","columns":' \
807+
'["fieldKey","fieldType"],"values":[["value","integer"]]}]}]}\n'
808+
809+
with requests_mock.Mocker() as m:
810+
m.register_uri(
811+
requests_mock.GET,
812+
"http://localhost:8086/query",
813+
text=example_response
814+
)
815+
response = self.cli.query('show series limit 4 offset 0',
816+
chunked=True, chunk_size=4)
817+
self.assertTrue(len(response) == 4)
818+
self.assertEqual(response.__repr__(), ResultSet(
819+
{'series': [{'values': [['value', 'integer']],
820+
'name': 'cpu',
821+
'columns': ['fieldKey', 'fieldType']},
822+
{'values': [['value', 'integer']],
823+
'name': 'iops',
824+
'columns': ['fieldKey', 'fieldType']},
825+
{'values': [['value', 'integer']],
826+
'name': 'load',
827+
'columns': ['fieldKey', 'fieldType']},
828+
{'values': [['value', 'integer']],
829+
'name': 'memory',
830+
'columns': ['fieldKey', 'fieldType']}]}
831+
).__repr__())
832+
795833

796834
class FakeClient(InfluxDBClient):
797835

0 commit comments

Comments
 (0)