Skip to content

Commit 2ea0832

Browse files
committed
Remove extract_field_paths
1 parent c6d1b1c commit 2ea0832

File tree

3 files changed

+39
-43
lines changed

3 files changed

+39
-43
lines changed

firestore/google/cloud/firestore_v1beta1/_helpers.py

Lines changed: 12 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -819,54 +819,35 @@ def process_server_timestamp(document_data, split_on_dots=True):
819819
* The remaining keys in ``document_data`` after removing the
820820
server timestamp sentinels
821821
"""
822+
field_paths = []
822823
transform_paths = []
823824
actual_data = {}
824825
for field_name, value in six.iteritems(document_data):
825826
if isinstance(value, dict):
826-
sub_field_paths, sub_data = process_server_timestamp(value, False)
827-
for sub_path in sub_field_paths:
827+
sub_transform_paths, sub_data, sub_field_paths = process_server_timestamp(value, False)
828+
for sub_path in sub_transform_paths:
828829
field_path = FieldPath.from_string(field_name)
829830
field_path.parts = field_path.parts + sub_path.parts
830831
transform_paths.extend([field_path])
831832
if sub_data:
832833
# Only add a key to ``actual_data`` if there is data.
834+
833835
actual_data[field_name] = sub_data
836+
for sub_field_path in sub_field_paths:
837+
field_path = FieldPath.from_string(field_name)
838+
field_path.parts = field_path.parts + sub_field_path.parts
839+
field_paths.append(field_path)
834840
elif value is constants.SERVER_TIMESTAMP:
835841
if split_on_dots:
836842
transform_paths.append(FieldPath(*field_name.split(".")))
837843
else:
838844
transform_paths.append(FieldPath.from_string(field_name))
839845
else:
840846
actual_data[field_name] = value
847+
field_paths.append(FieldPath(field_name))
841848
if not transform_paths:
842849
actual_data = document_data
843-
return transform_paths, actual_data
844-
845-
846-
def extract_field_paths(document_data):
847-
"""Extract field paths from document data
848-
849-
Args:
850-
document_data (dict): The dictionary of the actual set data.
851-
852-
Returns:
853-
List[~.firestore_v1beta1._helpers.FieldPath]:
854-
A list of `FieldPath` instances from the actual data.
855-
"""
856-
field_paths = []
857-
for field_name, value in six.iteritems(document_data):
858-
if isinstance(value, dict):
859-
sub_field_paths = extract_field_paths(value)
860-
for sub_path in sub_field_paths:
861-
paths = [field_name]
862-
paths.extend(sub_path.parts)
863-
field_path = FieldPath(*paths)
864-
field_paths.append(field_path)
865-
else:
866-
path = FieldPath(field_name)
867-
field_paths.append(path)
868-
return field_paths
869-
850+
return transform_paths, actual_data, field_paths
870851

871852

872853
def get_transform_pb(document_path, transform_paths):
@@ -913,7 +894,7 @@ def pbs_for_set(document_path, document_data, merge=False, exists=None):
913894
List[google.cloud.firestore_v1beta1.types.Write]: One
914895
or two ``Write`` protobuf instances for ``set()``.
915896
"""
916-
transform_paths, actual_data = process_server_timestamp(
897+
transform_paths, actual_data, field_paths = process_server_timestamp(
917898
document_data, False)
918899
update_pb = write_pb2.Write(
919900
update=document_pb2.Document(
@@ -926,7 +907,6 @@ def pbs_for_set(document_path, document_data, merge=False, exists=None):
926907
common_pb2.Precondition(exists=exists))
927908

928909
if merge:
929-
field_paths = extract_field_paths(document_data)
930910
field_paths = canonicalize_field_paths(field_paths)
931911
mask = common_pb2.DocumentMask(field_paths=sorted(field_paths))
932912
update_pb.update_mask.CopyFrom(mask)
@@ -985,7 +965,7 @@ def pbs_for_update(client, document_path, field_updates, option):
985965
# Default uses ``exists=True``.
986966
option = client.write_option(exists=True)
987967

988-
transform_paths, actual_updates = process_server_timestamp(field_updates)
968+
transform_paths, actual_updates, field_paths = process_server_timestamp(field_updates)
989969
if not (transform_paths or actual_updates):
990970
raise ValueError('There are only ServerTimeStamp objects or is empty.')
991971
update_values, field_paths = FieldPathHelper.to_field_paths(actual_updates)

firestore/tests/unit/test__helpers.py

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1284,14 +1284,21 @@ def _call_fut(document_data):
12841284

12851285
def test_no_fields(self):
12861286
import collections
1287+
from google.cloud.firestore_v1beta1 import _helpers
12871288

12881289
data = collections.OrderedDict((
12891290
('one', 1),
12901291
('two', 2.25),
12911292
('three', [False, True, True]),
12921293
))
1293-
field_paths, actual_data = self._call_fut(data)
1294-
self.assertEqual(field_paths, [])
1294+
expected_field_paths = [
1295+
_helpers.FieldPath('one'),
1296+
_helpers.FieldPath('two'),
1297+
_helpers.FieldPath('three')
1298+
]
1299+
transform_paths, actual_data, field_paths = self._call_fut(data)
1300+
self.assertEqual(transform_paths, [])
1301+
self.assertEqual(field_paths, expected_field_paths)
12951302
self.assertIs(actual_data, data)
12961303

12971304
def test_simple_fields(self):
@@ -1313,17 +1320,26 @@ def test_simple_fields(self):
13131320
('top5', 200),
13141321
('top6', nested2),
13151322
))
1316-
field_paths, actual_data = self._call_fut(data)
1317-
self.assertEqual(
1318-
field_paths, [_helpers.FieldPath('top1', 'bottom2'),
1319-
_helpers.FieldPath('top4'),
1320-
_helpers.FieldPath('top6', 'bottom7')])
1323+
expected_transform_paths = [
1324+
_helpers.FieldPath('top1', 'bottom2'),
1325+
_helpers.FieldPath('top4'),
1326+
_helpers.FieldPath('top6', 'bottom7')
1327+
]
1328+
expected_field_paths = [
1329+
_helpers.FieldPath('top1', 'bottom3'),
1330+
_helpers.FieldPath('top5')]
13211331
expected_data = {
13221332
'top1': {
13231333
'bottom3': data['top1']['bottom3'],
13241334
},
13251335
'top5': data['top5'],
13261336
}
1337+
transform_paths, actual_data, field_paths = self._call_fut(data)
1338+
self.assertEqual(
1339+
transform_paths,
1340+
expected_transform_paths
1341+
)
1342+
self.assertEqual(field_paths, expected_field_paths)
13271343
self.assertEqual(actual_data, expected_data)
13281344

13291345
def test_field_updates(self):
@@ -1337,9 +1353,9 @@ def test_field_updates(self):
13371353
('c.d', {'e': SERVER_TIMESTAMP}),
13381354
('f.g', SERVER_TIMESTAMP),
13391355
))
1340-
field_paths, actual_data = self._call_fut(data)
1341-
self.assertEqual(field_paths, [_helpers.FieldPath('c', 'd', 'e'),
1342-
_helpers.FieldPath('f', 'g')])
1356+
transform_paths, actual_data, field_paths = self._call_fut(data)
1357+
self.assertEqual(transform_paths, [_helpers.FieldPath('c', 'd', 'e'),
1358+
_helpers.FieldPath('f', 'g')])
13431359

13441360
expected_data = {'a': {'b': data['a']['b']}}
13451361
self.assertEqual(actual_data, expected_data)

firestore/tests/unit/test_document.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ def _write_pb_for_set(document_path, document_data, merge):
277277
),
278278
)
279279
if merge:
280-
field_paths = _helpers.extract_field_paths(document_data)
280+
_, _, field_paths = _helpers.process_server_timestamp(document_data)
281281
field_paths = _helpers.canonicalize_field_paths(field_paths)
282282
mask = common_pb2.DocumentMask(field_paths=sorted(field_paths))
283283
write_pbs.update_mask.CopyFrom(mask)

0 commit comments

Comments
 (0)