Skip to content

Commit 84056a7

Browse files
shoyerXarray-Beam authors
authored andcommitted
Remove children from xarray_beam.Key
We're not going to use this for DataTree, after all. PiperOrigin-RevId: 820455141
1 parent df53dc1 commit 84056a7

2 files changed

Lines changed: 7 additions & 71 deletions

File tree

xarray_beam/_src/core.py

Lines changed: 6 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -29,20 +29,15 @@
2929

3030

3131
class Key:
32-
"""Key for keeping track of chunks of a distributed Dataset or DataTree.
32+
"""Key for keeping track of chunks of a distributed Dataset.
3333
34-
Key object in Xarray-Beam include three components:
34+
Key object in Xarray-Beam include two components:
3535
3636
- "offsets": an immutable dict indicating integer offsets (total number of
37-
array elements) from the origin along each dimension for this chunk. For
38-
DataTree chunks, offsets also apply to all child nodes, similar to how
39-
DataTree dimensions are shared with child nodes.
37+
array elements) from the origin along each dimension for this chunk.
4038
- "vars": either an frozenset or None, indicating the subset of Dataset
4139
variables included in this chunk. The default value of None means that all
4240
variables are included.
43-
- "children": either an immutabledict of Key objects or None, indicating
44-
subset of DataTree node descendents included in this chunk. The default
45-
value of None means that all child nodes are included.
4641
4742
Key objects are "deterministically encoded" by Beam, which makes them suitable
4843
for use as keys in Beam pipelines, i.e., with beam.GroupByKey. They are also
@@ -81,11 +76,6 @@ class Key:
8176
>>> key.replace(vars=None)
8277
Key(offsets={'x': 10})
8378
84-
Children are defined using nested `Key` objects::
85-
86-
>>> xarray_beam.Key(children={'first_child': xarray_beam.Key({'x': 10})})
87-
Key(children={'first_child': Key(offsets={'x': 10})})
88-
8979
"""
9080

9181
# pylint: disable=redefined-builtin
@@ -94,32 +84,25 @@ def __init__(
9484
self,
9585
offsets: Mapping[str, int] | None = None,
9686
vars: Set[str] | None = None,
97-
children: Mapping[str, Key] | None = None,
9887
):
9988
if offsets is None:
10089
offsets = {}
10190
if isinstance(vars, str):
10291
raise TypeError(f"vars must be a set or None, but is {vars!r}")
10392
self.offsets = immutabledict.immutabledict(offsets)
10493
self.vars = None if vars is None else frozenset(vars)
105-
self.children = (
106-
None if children is None else immutabledict.immutabledict(children)
107-
)
10894

10995
def replace(
11096
self,
11197
offsets: Mapping[str, int] | object = _DEFAULT,
11298
vars: Set[str] | None | object = _DEFAULT,
113-
children: Mapping[str, Key] | None | object = _DEFAULT,
11499
) -> Key:
115100
"""Replace one or more components of this Key with new values."""
116101
if offsets is _DEFAULT:
117102
offsets = self.offsets
118103
if vars is _DEFAULT:
119104
vars = self.vars
120-
if children is _DEFAULT:
121-
children = self.children
122-
return type(self)(offsets, vars, children)
105+
return type(self)(offsets, vars)
123106

124107
def with_offsets(self, **offsets: int | None) -> Key:
125108
"""Replace some offsets with new values.
@@ -145,20 +128,17 @@ def __repr__(self) -> str:
145128
components.append(f"offsets={dict(self.offsets)}")
146129
if self.vars is not None:
147130
components.append(f"vars={set(self.vars)}")
148-
if self.children is not None:
149-
components.append(f"children={dict(self.children)}")
150131
return f"{type(self).__name__}({', '.join(components)})"
151132

152133
def __hash__(self) -> int:
153-
return hash((self.offsets, self.vars, self.children))
134+
return hash((self.offsets, self.vars))
154135

155136
def __eq__(self, other) -> bool:
156137
if not isinstance(other, Key):
157138
return NotImplemented
158139
return (
159140
self.offsets == other.offsets
160141
and self.vars == other.vars
161-
and self.children == other.children
162142
)
163143

164144
def __ne__(self, other) -> bool:
@@ -169,10 +149,7 @@ def __ne__(self, other) -> bool:
169149
def __getstate__(self):
170150
offsets_state = sorted(self.offsets.items())
171151
vars_state = None if self.vars is None else sorted(self.vars)
172-
children_state = (
173-
None if self.children is None else sorted(self.children.items())
174-
)
175-
return offsets_state, vars_state, children_state
152+
return offsets_state, vars_state
176153

177154
def __setstate__(self, state):
178155
self.__init__(*state)

xarray_beam/_src/core_test.py

Lines changed: 1 addition & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -37,20 +37,11 @@ def test_constructor(self):
3737
self.assertIsInstance(key.offsets, immutabledict.immutabledict)
3838
self.assertEqual(dict(key.offsets), {'x': 0, 'y': 10})
3939
self.assertIsNone(key.vars)
40-
self.assertIsNone(key.children)
4140

4241
key = xbeam.Key(vars={'foo'})
4342
self.assertEqual(dict(key.offsets), {})
4443
self.assertIsInstance(key.vars, frozenset)
4544
self.assertEqual(set(key.vars), {'foo'})
46-
self.assertIsNone(key.children)
47-
48-
child_key = xbeam.Key({'x': 0})
49-
key = xbeam.Key(children={'sub': child_key})
50-
self.assertEqual(dict(key.offsets), {})
51-
self.assertIsNone(key.vars)
52-
self.assertIsInstance(key.children, immutabledict.immutabledict)
53-
self.assertEqual(dict(key.children), {'sub': child_key})
5445

5546
with self.assertRaisesRegex(TypeError, 'vars must be a set or None'):
5647
xbeam.Key(vars='foo')
@@ -82,16 +73,6 @@ def test_replace(self):
8273
actual = key.replace({'y': 1}, {'bar'})
8374
self.assertEqual(expected, actual)
8475

85-
child = xbeam.Key()
86-
expected = xbeam.Key({'x': 0}, {'foo'}, children={'sub': child})
87-
actual = key.replace(children={'sub': child})
88-
self.assertEqual(expected, actual)
89-
90-
key2 = xbeam.Key(children={'sub': child})
91-
expected = xbeam.Key()
92-
actual = key2.replace(children=None)
93-
self.assertEqual(expected, actual)
94-
9576
def test_with_offsets(self):
9677
key = xbeam.Key({'x': 0})
9778

@@ -125,10 +106,6 @@ def test_repr(self):
125106
expected = "Key(vars={'foo'})"
126107
self.assertEqual(repr(key), expected)
127108

128-
key = xbeam.Key(children={'sub': xbeam.Key()})
129-
expected = "Key(children={'sub': Key()})"
130-
self.assertEqual(repr(key), expected)
131-
132109
def test_dict_key(self):
133110
first = {xbeam.Key({'x': 0, 'y': 10}): 1}
134111
second = {xbeam.Key({'x': 0, 'y': 10}): 1}
@@ -144,11 +121,6 @@ def test_equality(self):
144121
self.assertNotEqual(key, key2)
145122
self.assertNotEqual(key2, key)
146123

147-
key3 = xbeam.Key({'x': 0, 'y': 10}, children={'sub': xbeam.Key()})
148-
self.assertEqual(key3, key3)
149-
self.assertNotEqual(key, key3)
150-
self.assertNotEqual(key3, key)
151-
152124
def test_offsets_as_beam_key(self):
153125
inputs = [
154126
(xbeam.Key({'x': 0, 'y': 1}), 1),
@@ -175,22 +147,9 @@ def test_vars_as_beam_key(self):
175147
actual = inputs | beam.GroupByKey()
176148
self.assertEqual(actual, expected)
177149

178-
def test_children_as_beam_key(self):
179-
inputs = [
180-
(xbeam.Key(children={'sub': xbeam.Key()}), 1),
181-
(xbeam.Key(children={}), 2),
182-
(xbeam.Key(children={'sub': xbeam.Key()}), 3),
183-
]
184-
expected = [
185-
(xbeam.Key(children={'sub': xbeam.Key()}), [1, 3]),
186-
(xbeam.Key(children={}), [2]),
187-
]
188-
actual = inputs | beam.GroupByKey()
189-
self.assertEqual(actual, expected)
190-
191150
def test_pickle(self):
192151
key = xbeam.Key(
193-
{'x': 0, 'y': 10}, vars={'foo'}, children={'sub': xbeam.Key({'z': 0})}
152+
{'x': 0, 'y': 10}, vars={'foo'}
194153
)
195154
unpickled = pickle.loads(pickle.dumps(key))
196155
self.assertEqual(key, unpickled)

0 commit comments

Comments
 (0)