Skip to content

Commit 49e744c

Browse files
garyedhermes
authored andcommitted
Bugfix: Allow Bigtable ReadRows to handle empty string column qualifier (googleapis#4252)
1 parent 65111bc commit 49e744c

3 files changed

Lines changed: 38 additions & 4 deletions

File tree

bigtable/google/cloud/bigtable/row_data.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,10 +283,14 @@ def consume_next(self):
283283
row = self._row = PartialRowData(chunk.row_key)
284284

285285
if cell is None:
286+
qualifier = None
287+
if chunk.HasField('qualifier'):
288+
qualifier = chunk.qualifier.value
289+
286290
cell = self._cell = PartialCellData(
287291
chunk.row_key,
288292
chunk.family_name.value,
289-
chunk.qualifier.value,
293+
qualifier,
290294
chunk.timestamp_micros,
291295
chunk.labels,
292296
chunk.value)
@@ -421,7 +425,8 @@ def _copy_from_previous(self, cell):
421425
cell.row_key = previous.row_key
422426
if not cell.family_name:
423427
cell.family_name = previous.family_name
424-
if not cell.qualifier:
428+
# NOTE: ``cell.qualifier`` **can** be empty string.
429+
if cell.qualifier is None:
425430
cell.qualifier = previous.qualifier
426431

427432
def _save_current_row(self):

bigtable/tests/unit/read-rows-acceptance-test.json

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1173,6 +1173,33 @@
11731173
"error": false
11741174
}
11751175
]
1176+
},
1177+
{
1178+
"name": "empty second qualifier",
1179+
"chunks": [
1180+
"row_key: \"RK\"\nfamily_name: \u003c\n value: \"A\"\n\u003e\nqualifier: \u003c\n value: \"C\"\n\u003e\ntimestamp_micros: 99\nvalue: \"value-VAL_1\"\ncommit_row: false\n",
1181+
"qualifier: \u003c\n value: \"\"\n\u003e\ntimestamp_micros: 98\nvalue: \"value-VAL_2\"\ncommit_row: true\n"
1182+
],
1183+
"results": [
1184+
{
1185+
"rk": "RK",
1186+
"fm": "A",
1187+
"qual": "C",
1188+
"ts": 99,
1189+
"value": "value-VAL_1",
1190+
"label": "",
1191+
"error": false
1192+
},
1193+
{
1194+
"rk": "RK",
1195+
"fm": "A",
1196+
"qual": "",
1197+
"ts": 98,
1198+
"value": "value-VAL_2",
1199+
"label": "",
1200+
"error": false
1201+
}
1202+
]
11761203
}
11771204
]
11781205
}

bigtable/tests/unit/test_row_data.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ def test__copy_from_previous_unset(self):
334334
prd._copy_from_previous(cell)
335335
self.assertEqual(cell.row_key, '')
336336
self.assertEqual(cell.family_name, u'')
337-
self.assertEqual(cell.qualifier, b'')
337+
self.assertIsNone(cell.qualifier)
338338
self.assertEqual(cell.timestamp_micros, 0)
339339
self.assertEqual(cell.labels, [])
340340

@@ -635,6 +635,8 @@ def test_reset_in_between_chunks(self):
635635
def test_empty_cell_chunk(self):
636636
self._match_results('empty cell chunk')
637637

638+
def test_empty_second_qualifier(self):
639+
self._match_results('empty second qualifier')
638640

639641
def _flatten_cells(prd):
640642
# Match results format from JSON testcases.
@@ -678,7 +680,7 @@ class _PartialCellData(object):
678680

679681
row_key = ''
680682
family_name = u''
681-
qualifier = b''
683+
qualifier = None
682684
timestamp_micros = 0
683685

684686
def __init__(self, **kw):

0 commit comments

Comments
 (0)