Skip to content
Permalink
Browse files
feat: add LoadJobConfig.projection_fields to select DATASTORE_BACKU…
…P fields (#736)

* feat: add LoadJobConfig.projection_fields to select DATASTORE_BACKUP fields

* add type annotations

* annotate setter too

Co-authored-by: Peter Lamut <plamut@users.noreply.github.com>
  • Loading branch information
tswast and plamut committed Jul 15, 2021
1 parent 87a09fa commit c45a7380871af3dfbd3c45524cb606c60e1a01d1
Showing with 33 additions and 2 deletions.
  1. +22 −2 google/cloud/bigquery/job/load.py
  2. +11 −0 tests/unit/job/test_load_config.py
@@ -14,7 +14,7 @@

"""Classes for load jobs."""

from typing import FrozenSet, Iterable, Optional
from typing import FrozenSet, List, Iterable, Optional

from google.cloud.bigquery.encryption_configuration import EncryptionConfiguration
from google.cloud.bigquery.external_config import HivePartitioningOptions
@@ -25,7 +25,6 @@
from google.cloud.bigquery.table import RangePartitioning
from google.cloud.bigquery.table import TableReference
from google.cloud.bigquery.table import TimePartitioning

from google.cloud.bigquery.job.base import _AsyncJob
from google.cloud.bigquery.job.base import _JobConfig
from google.cloud.bigquery.job.base import _JobReference
@@ -300,6 +299,27 @@ def null_marker(self):
def null_marker(self, value):
self._set_sub_prop("nullMarker", value)

@property
def projection_fields(self) -> Optional[List[str]]:
"""Optional[List[str]]: If
:attr:`google.cloud.bigquery.job.LoadJobConfig.source_format` is set to
"DATASTORE_BACKUP", indicates which entity properties to load into
BigQuery from a Cloud Datastore backup.
Property names are case sensitive and must be top-level properties. If
no properties are specified, BigQuery loads all properties. If any
named property isn't found in the Cloud Datastore backup, an invalid
error is returned in the job result.
See:
https://cloud.google.com/bigquery/docs/reference/rest/v2/Job#JobConfigurationLoad.FIELDS.projection_fields
"""
return self._get_sub_prop("projectionFields")

@projection_fields.setter
def projection_fields(self, value: Optional[List[str]]):
self._set_sub_prop("projectionFields", value)

@property
def quote_character(self):
"""Optional[str]: Character used to quote data sections (CSV only).
@@ -424,6 +424,17 @@ def test_null_marker_setter(self):
config.null_marker = null_marker
self.assertEqual(config._properties["load"]["nullMarker"], null_marker)

def test_projection_fields_miss(self):
config = self._get_target_class()()
self.assertIsNone(config.projection_fields)

def test_projection_fields_hit(self):
config = self._get_target_class()()
fields = ["email", "postal_code"]
config.projection_fields = fields
self.assertEqual(config._properties["load"]["projectionFields"], fields)
self.assertEqual(config.projection_fields, fields)

def test_quote_character_missing(self):
config = self._get_target_class()()
self.assertIsNone(config.quote_character)

0 comments on commit c45a738

Please sign in to comment.