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)