Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add LoadJobConfig.projection_fields to select DATASTORE_BACKUP fields #736

Merged
merged 5 commits into from Jul 15, 2021
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
24 changes: 23 additions & 1 deletion google/cloud/bigquery/job/load.py
Expand Up @@ -14,6 +14,8 @@

"""Classes for load jobs."""

from typing import Optional, List

from google.cloud.bigquery.encryption_configuration import EncryptionConfiguration
from google.cloud.bigquery.external_config import HivePartitioningOptions
from google.cloud.bigquery.format_options import ParquetOptions
Expand All @@ -23,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
Expand Down Expand Up @@ -277,6 +278,27 @@ def null_marker(self):
def null_marker(self, value):
self._set_sub_prop("nullMarker", value)

@property
def projection_fields(self) -> Optional[List[str]]:
tswast marked this conversation as resolved.
Show resolved Hide resolved
"""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):
self._set_sub_prop("projectionFields", value)
plamut marked this conversation as resolved.
Show resolved Hide resolved

@property
def quote_character(self):
"""Optional[str]: Character used to quote data sections (CSV only).
Expand Down
11 changes: 11 additions & 0 deletions tests/unit/job/test_load_config.py
Expand Up @@ -385,6 +385,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)
Expand Down