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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy