Skip to content

Commit 645f0fd

Browse files
authored
fix: allow partial streaming_buffer statistics (#37)
* fix: allow partial streaming_buffer statistics. Previously, the BQ backend would supply all fields of the streamingBuffer statistics or none. This is no longer the case, so we relax construction to not depend on all values being present. Related: internal issue b/148720220
1 parent 3d77a75 commit 645f0fd

File tree

2 files changed

+34
-6
lines changed

2 files changed

+34
-6
lines changed

google/cloud/bigquery/table.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1139,12 +1139,17 @@ class StreamingBuffer(object):
11391139
"""
11401140

11411141
def __init__(self, resource):
1142-
self.estimated_bytes = int(resource["estimatedBytes"])
1143-
self.estimated_rows = int(resource["estimatedRows"])
1144-
# time is in milliseconds since the epoch.
1145-
self.oldest_entry_time = google.cloud._helpers._datetime_from_microseconds(
1146-
1000.0 * int(resource["oldestEntryTime"])
1147-
)
1142+
self.estimated_bytes = None
1143+
if "estimatedBytes" in resource:
1144+
self.estimated_bytes = int(resource["estimatedBytes"])
1145+
self.estimated_rows = None
1146+
if "estimatedRows" in resource:
1147+
self.estimated_rows = int(resource["estimatedRows"])
1148+
self.oldest_entry_time = None
1149+
if "oldestEntryTime" in resource:
1150+
self.oldest_entry_time = google.cloud._helpers._datetime_from_microseconds(
1151+
1000.0 * int(resource["oldestEntryTime"])
1152+
)
11481153

11491154

11501155
class Row(object):

tests/unit/test_table.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -855,6 +855,29 @@ def test_from_api_repr_w_properties(self):
855855
table = klass.from_api_repr(RESOURCE)
856856
self._verifyResourceProperties(table, RESOURCE)
857857

858+
def test_from_api_repr_w_partial_streamingbuffer(self):
859+
import datetime
860+
from google.cloud._helpers import UTC
861+
from google.cloud._helpers import _millis
862+
863+
RESOURCE = self._make_resource()
864+
self.OLDEST_TIME = datetime.datetime(2015, 8, 1, 23, 59, 59, tzinfo=UTC)
865+
RESOURCE["streamingBuffer"] = {"oldestEntryTime": _millis(self.OLDEST_TIME)}
866+
klass = self._get_target_class()
867+
table = klass.from_api_repr(RESOURCE)
868+
self.assertIsNotNone(table.streaming_buffer)
869+
self.assertIsNone(table.streaming_buffer.estimated_rows)
870+
self.assertIsNone(table.streaming_buffer.estimated_bytes)
871+
self.assertEqual(table.streaming_buffer.oldest_entry_time, self.OLDEST_TIME)
872+
# Another partial construction
873+
RESOURCE["streamingBuffer"] = {"estimatedRows": 1}
874+
klass = self._get_target_class()
875+
table = klass.from_api_repr(RESOURCE)
876+
self.assertIsNotNone(table.streaming_buffer)
877+
self.assertEqual(table.streaming_buffer.estimated_rows, 1)
878+
self.assertIsNone(table.streaming_buffer.estimated_bytes)
879+
self.assertIsNone(table.streaming_buffer.oldest_entry_time)
880+
858881
def test_from_api_with_encryption(self):
859882
self._setUpConstants()
860883
RESOURCE = {

0 commit comments

Comments
 (0)