Skip to content

Commit c6334f8

Browse files
committed
Fix DataFrameClient empty tag processing
Empty or None tags should be left out, otherwise it would break line protocol.
1 parent 898c4b6 commit c6334f8

File tree

2 files changed

+29
-12
lines changed

2 files changed

+29
-12
lines changed

influxdb/_dataframe_client.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -279,13 +279,21 @@ def _convert_dataframe_to_lines(self,
279279
# If tag columns exist, make an array of formatted tag keys and values
280280
if tag_columns:
281281
tag_df = dataframe[tag_columns]
282+
tag_df = tag_df.fillna('') # replace NA with empty string
282283
tag_df = tag_df.sort_index(axis=1)
283284
tag_df = self._stringify_dataframe(
284285
tag_df, numeric_precision, datatype='tag')
285-
tags = (',' + (
286-
(tag_df.columns.values + '=').tolist() + tag_df)).sum(axis=1)
287-
del tag_df
288286

287+
# prepend tag keys
288+
tag_df = tag_df.apply(
289+
lambda s: s.apply(
290+
lambda v, l: l + '=' + v if v else None, l=s.name))
291+
292+
# join tags, but leave out None values
293+
tags = tag_df.apply(
294+
lambda r: ',' + ','.join(r.dropna()), axis=1)
295+
296+
del tag_df
289297
else:
290298
tags = ''
291299

influxdb/tests/dataframe_client_test.py

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -201,20 +201,29 @@ def test_write_points_from_dataframe_with_tag_cols_and_defaults(self):
201201
def test_write_points_from_dataframe_with_tag_escaped(self):
202202
now = pd.Timestamp('1970-01-01 00:00+00:00')
203203
dataframe = pd.DataFrame(
204-
data=[['blue', 1, "1", 1, 1.0, 'hot'],
205-
['red,green=orange', 0, "2", 2, 2.0, 'cold']],
206-
index=[now, now + timedelta(hours=1)],
207-
columns=["tag_one", "tag_two", "column_one",
208-
"column_two", "column_three",
209-
"tag_three"])
204+
data=[
205+
['blue orange', "1", 1, 'hot=cold'], # space, equal
206+
['red,green', "2", 2, r'cold\fire'], # comma, backslash
207+
['some', "2", 2, ''], # skip empty
208+
['some', "2", 2, None], # skip None
209+
],
210+
index=pd.period_range(now, freq='H', periods=4),
211+
columns=["tag_one", "column_one", "column_two", "tag_three"]
212+
)
210213

211214
expected_escaped_tags = (
212-
b"foo,tag_one=blue "
215+
b"foo,tag_one=blue\\ orange,tag_three=hot\\=cold "
213216
b"column_one=\"1\",column_two=1i "
214217
b"0\n"
215-
b"foo,tag_one=red\\,green\\=orange "
218+
b"foo,tag_one=red\\,green,tag_three=cold\\\\fire "
216219
b"column_one=\"2\",column_two=2i "
217220
b"3600000000000\n"
221+
b"foo,tag_one=some "
222+
b"column_one=\"2\",column_two=2i "
223+
b"7200000000000\n"
224+
b"foo,tag_one=some "
225+
b"column_one=\"2\",column_two=2i "
226+
b"10800000000000\n"
218227
)
219228

220229
with requests_mock.Mocker() as m:
@@ -224,7 +233,7 @@ def test_write_points_from_dataframe_with_tag_escaped(self):
224233
cli = DataFrameClient(database='db')
225234
cli.write_points(dataframe, 'foo',
226235
field_columns=['column_one', 'column_two'],
227-
tag_columns=['tag_one'])
236+
tag_columns=['tag_one', 'tag_three'])
228237
self.assertEqual(m.last_request.body, expected_escaped_tags)
229238

230239
def test_write_points_from_dataframe_with_numeric_column_names(self):

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