Skip to content

Commit cd0aaa1

Browse files
authored
feat: add connection_properties and create_session to LoadJobConfig (#1509)
* feat: added `connection_properties` and `create_session` in load job
1 parent 3885fc5 commit cd0aaa1

File tree

4 files changed

+83
-0
lines changed

4 files changed

+83
-0
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ docs.metadata
5151

5252
# Virtual environment
5353
env/
54+
venv/
5455

5556
# Test logs
5657
coverage.xml

google/cloud/bigquery/job/load.py

+59
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
from google.cloud.bigquery.job.base import _AsyncJob
2929
from google.cloud.bigquery.job.base import _JobConfig
3030
from google.cloud.bigquery.job.base import _JobReference
31+
from google.cloud.bigquery.query import ConnectionProperty
3132

3233

3334
class LoadJobConfig(_JobConfig):
@@ -120,6 +121,25 @@ def clustering_fields(self, value):
120121
else:
121122
self._del_sub_prop("clustering")
122123

124+
@property
125+
def connection_properties(self) -> List[ConnectionProperty]:
126+
"""Connection properties.
127+
128+
See
129+
https://cloud.google.com/bigquery/docs/reference/rest/v2/Job#JobConfigurationLoad.FIELDS.connection_properties
130+
131+
.. versionadded:: 3.7.0
132+
"""
133+
resource = self._get_sub_prop("connectionProperties", [])
134+
return [ConnectionProperty.from_api_repr(prop) for prop in resource]
135+
136+
@connection_properties.setter
137+
def connection_properties(self, value: Iterable[ConnectionProperty]):
138+
self._set_sub_prop(
139+
"connectionProperties",
140+
[prop.to_api_repr() for prop in value],
141+
)
142+
123143
@property
124144
def create_disposition(self):
125145
"""Optional[google.cloud.bigquery.job.CreateDisposition]: Specifies behavior
@@ -134,6 +154,27 @@ def create_disposition(self):
134154
def create_disposition(self, value):
135155
self._set_sub_prop("createDisposition", value)
136156

157+
@property
158+
def create_session(self) -> Optional[bool]:
159+
"""[Preview] If :data:`True`, creates a new session, where
160+
:attr:`~google.cloud.bigquery.job.LoadJob.session_info` will contain a
161+
random server generated session id.
162+
163+
If :data:`False`, runs load job with an existing ``session_id`` passed in
164+
:attr:`~google.cloud.bigquery.job.LoadJobConfig.connection_properties`,
165+
otherwise runs load job in non-session mode.
166+
167+
See
168+
https://cloud.google.com/bigquery/docs/reference/rest/v2/Job#JobConfigurationLoad.FIELDS.create_session
169+
170+
.. versionadded:: 3.7.0
171+
"""
172+
return self._get_sub_prop("createSession")
173+
174+
@create_session.setter
175+
def create_session(self, value: Optional[bool]):
176+
self._set_sub_prop("createSession", value)
177+
137178
@property
138179
def decimal_target_types(self) -> Optional[FrozenSet[str]]:
139180
"""Possible SQL data types to which the source decimal values are converted.
@@ -629,13 +670,31 @@ def autodetect(self):
629670
"""
630671
return self._configuration.autodetect
631672

673+
@property
674+
def connection_properties(self) -> List[ConnectionProperty]:
675+
"""See
676+
:attr:`google.cloud.bigquery.job.LoadJobConfig.connection_properties`.
677+
678+
.. versionadded:: 3.7.0
679+
"""
680+
return self._configuration.connection_properties
681+
632682
@property
633683
def create_disposition(self):
634684
"""See
635685
:attr:`google.cloud.bigquery.job.LoadJobConfig.create_disposition`.
636686
"""
637687
return self._configuration.create_disposition
638688

689+
@property
690+
def create_session(self) -> Optional[bool]:
691+
"""See
692+
:attr:`google.cloud.bigquery.job.LoadJobConfig.create_session`.
693+
694+
.. versionadded:: 3.7.0
695+
"""
696+
return self._configuration.create_session
697+
639698
@property
640699
def encoding(self):
641700
"""See

tests/unit/job/test_load.py

+2
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,8 @@ def test_from_api_repr_bare(self):
392392
job = klass.from_api_repr(RESOURCE, client=client)
393393
self.assertIs(job._client, client)
394394
self._verifyResourceProperties(job, RESOURCE)
395+
self.assertEqual(len(job.connection_properties), 0)
396+
self.assertIsNone(job.create_session)
395397

396398
def test_from_api_with_encryption(self):
397399
self._setUpConstants()

tests/unit/job/test_load_config.py

+21
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,27 @@ def test_create_disposition_setter(self):
122122
config.create_disposition = disposition
123123
self.assertEqual(config._properties["load"]["createDisposition"], disposition)
124124

125+
def test_connection_properties(self):
126+
from google.cloud.bigquery.query import ConnectionProperty
127+
128+
config = self._get_target_class()()
129+
self.assertEqual(len(config.connection_properties), 0)
130+
131+
session_id = ConnectionProperty("session_id", "abcd")
132+
time_zone = ConnectionProperty("time_zone", "America/Chicago")
133+
config.connection_properties = [session_id, time_zone]
134+
self.assertEqual(len(config.connection_properties), 2)
135+
self.assertEqual(config.connection_properties[0].key, "session_id")
136+
self.assertEqual(config.connection_properties[0].value, "abcd")
137+
self.assertEqual(config.connection_properties[1].key, "time_zone")
138+
self.assertEqual(config.connection_properties[1].value, "America/Chicago")
139+
140+
def test_create_session(self):
141+
config = self._get_target_class()()
142+
self.assertIsNone(config.create_session)
143+
config.create_session = True
144+
self.assertTrue(config.create_session)
145+
125146
def test_decimal_target_types_miss(self):
126147
config = self._get_target_class()()
127148
self.assertIsNone(config.decimal_target_types)

0 commit comments

Comments
 (0)