Skip to content

Commit 22b66a5

Browse files
committed
feat: add query statistics package support
1 parent 83adb1e commit 22b66a5

File tree

4 files changed

+59
-19
lines changed

4 files changed

+59
-19
lines changed

google/cloud/spanner_v1/_helpers.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,15 +74,19 @@ def _merge_query_options(base, merge):
7474
combined = base or ExecuteSqlRequest.QueryOptions()
7575
if type(combined) == dict:
7676
combined = ExecuteSqlRequest.QueryOptions(
77-
optimizer_version=combined.get("optimizer_version", "")
77+
optimizer_version=combined.get("optimizer_version", ""),
78+
optimizer_statistics_package=combined.get(
79+
"optimizer_statistics_package", ""
80+
),
7881
)
7982
merge = merge or ExecuteSqlRequest.QueryOptions()
8083
if type(merge) == dict:
8184
merge = ExecuteSqlRequest.QueryOptions(
82-
optimizer_version=merge.get("optimizer_version", "")
85+
optimizer_version=merge.get("optimizer_version", ""),
86+
optimizer_statistics_package=merge.get("optimizer_statistics_package", ""),
8387
)
8488
type(combined).pb(combined).MergeFrom(type(merge).pb(merge))
85-
if not combined.optimizer_version:
89+
if not combined.optimizer_version and not combined.optimizer_statistics_package:
8690
return None
8791
return combined
8892

google/cloud/spanner_v1/client.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
) % ((EMULATOR_ENV_VAR,) * 3)
6565
SPANNER_ADMIN_SCOPE = "https://www.googleapis.com/auth/spanner.admin"
6666
OPTIMIZER_VERSION_ENV_VAR = "SPANNER_OPTIMIZER_VERSION"
67+
OPTIMIZER_STATISITCS_PACKAGE_ENV_VAR = "SPANNER_OPTIMIZER_STATISTICS_PACKAGE"
6768

6869

6970
def _get_spanner_emulator_host():
@@ -74,6 +75,10 @@ def _get_spanner_optimizer_version():
7475
return os.getenv(OPTIMIZER_VERSION_ENV_VAR, "")
7576

7677

78+
def _get_spanner_optimizer_statistics_package():
79+
return os.getenv(OPTIMIZER_STATISITCS_PACKAGE_ENV_VAR, "")
80+
81+
7782
class Client(ClientWithProject):
7883
"""Client for interacting with Cloud Spanner API.
7984
@@ -160,7 +165,8 @@ def __init__(
160165
self._client_info = client_info
161166

162167
env_query_options = ExecuteSqlRequest.QueryOptions(
163-
optimizer_version=_get_spanner_optimizer_version()
168+
optimizer_version=_get_spanner_optimizer_version(),
169+
optimizer_statistics_package=_get_spanner_optimizer_statistics_package()
164170
)
165171

166172
# Environment flag config has higher precedence than application config.

tests/unit/test__helpers.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,15 @@ def test_base_none_and_merge_none(self):
3030
def test_base_dict_and_merge_none(self):
3131
from google.cloud.spanner_v1 import ExecuteSqlRequest
3232

33-
base = {"optimizer_version": "2"}
33+
base = {
34+
"optimizer_version": "2",
35+
"optimizer_statistics_package": "auto_20191128_14_47_22UTC",
36+
}
3437
merge = None
35-
expected = ExecuteSqlRequest.QueryOptions(optimizer_version="2")
38+
expected = ExecuteSqlRequest.QueryOptions(
39+
optimizer_version="2",
40+
optimizer_statistics_package="auto_20191128_14_47_22UTC",
41+
)
3642
result = self._callFUT(base, merge)
3743
self.assertEqual(result, expected)
3844

@@ -48,7 +54,10 @@ def test_base_none_merge_object(self):
4854
from google.cloud.spanner_v1 import ExecuteSqlRequest
4955

5056
base = None
51-
merge = ExecuteSqlRequest.QueryOptions(optimizer_version="3")
57+
merge = ExecuteSqlRequest.QueryOptions(
58+
optimizer_version="3",
59+
optimizer_statistics_package="auto_20191128_14_47_22UTC",
60+
)
5261
result = self._callFUT(base, merge)
5362
self.assertEqual(result, merge)
5463

@@ -64,9 +73,15 @@ def test_base_none_merge_dict(self):
6473
def test_base_object_merge_dict(self):
6574
from google.cloud.spanner_v1 import ExecuteSqlRequest
6675

67-
base = ExecuteSqlRequest.QueryOptions(optimizer_version="1")
76+
base = ExecuteSqlRequest.QueryOptions(
77+
optimizer_version="1",
78+
optimizer_statistics_package="auto_20191128_14_47_22UTC",
79+
)
6880
merge = {"optimizer_version": "3"}
69-
expected = ExecuteSqlRequest.QueryOptions(optimizer_version="3")
81+
expected = ExecuteSqlRequest.QueryOptions(
82+
optimizer_version="3",
83+
optimizer_statistics_package="auto_20191128_14_47_22UTC",
84+
)
7085
result = self._callFUT(base, merge)
7186
self.assertEqual(result, expected)
7287

tests/unit/test_client.py

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,10 @@ def _constructor_test_helper(
103103
expected_client_options.api_endpoint,
104104
)
105105
if expected_query_options is not None:
106-
self.assertEqual(client._query_options, expected_query_options)
106+
self.assertEqual(
107+
client._query_options,
108+
expected_query_options
109+
)
107110

108111
@mock.patch("google.cloud.spanner_v1.client._get_spanner_emulator_host")
109112
@mock.patch("warnings.warn")
@@ -179,30 +182,42 @@ def test_constructor_custom_query_options_client_config(self):
179182

180183
expected_scopes = (MUT.SPANNER_ADMIN_SCOPE,)
181184
creds = _make_credentials()
185+
query_options = expected_query_options = ExecuteSqlRequest.QueryOptions(
186+
optimizer_version="1",
187+
optimizer_statistics_package="auto_20191128_14_47_22UTC",
188+
)
182189
self._constructor_test_helper(
183190
expected_scopes,
184191
creds,
185-
query_options=ExecuteSqlRequest.QueryOptions(optimizer_version="1"),
186-
expected_query_options=ExecuteSqlRequest.QueryOptions(
187-
optimizer_version="1"
188-
),
192+
query_options=query_options,
193+
expected_query_options=expected_query_options,
189194
)
190195

191196
@mock.patch("google.cloud.spanner_v1.client._get_spanner_optimizer_version")
192-
def test_constructor_custom_query_options_env_config(self, mock_ver):
197+
@mock.patch(
198+
"google.cloud.spanner_v1.client._get_spanner_optimizer_statistics_package"
199+
)
200+
def test_constructor_custom_query_options_env_config(self, mock_ver, mock_stats):
193201
from google.cloud.spanner_v1 import ExecuteSqlRequest
194202
from google.cloud.spanner_v1 import client as MUT
195203

196204
expected_scopes = (MUT.SPANNER_ADMIN_SCOPE,)
197205
creds = _make_credentials()
198206
mock_ver.return_value = "2"
207+
mock_stats.return_value = "auto_20191128_14_47_22UTC"
208+
query_options = ExecuteSqlRequest.QueryOptions(
209+
optimizer_version="1",
210+
optimizer_statistics_package="auto_20191128_10_47_22UTC",
211+
)
212+
expected_query_options = ExecuteSqlRequest.QueryOptions(
213+
optimizer_version="2",
214+
optimizer_statistics_package="auto_20191128_14_47_22UTC",
215+
)
199216
self._constructor_test_helper(
200217
expected_scopes,
201218
creds,
202-
query_options=ExecuteSqlRequest.QueryOptions(optimizer_version="1"),
203-
expected_query_options=ExecuteSqlRequest.QueryOptions(
204-
optimizer_version="2"
205-
),
219+
query_options=query_options,
220+
expected_query_options=expected_query_options,
206221
)
207222

208223
@mock.patch("google.cloud.spanner_v1.client._get_spanner_emulator_host")

0 commit comments

Comments
 (0)