Skip to content

Commit 6f966c7

Browse files
authored
Fix bugs in upsert search attribs (#440)
Fixed some bugs in search attrib upsert that occur if the workflow has no initial search attribs
1 parent c47e3f1 commit 6f966c7

File tree

2 files changed

+37
-5
lines changed

2 files changed

+37
-5
lines changed

temporalio/worker/_workflow_instance.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1243,7 +1243,7 @@ def workflow_upsert_search_attributes(
12431243
# To apply to typed search attributes we remove, replace, or add. We
12441244
# don't know any of the key types, so we do our best.
12451245
index = next(
1246-
i for i, a in enumerate(mut_typed_attrs) if a.key.name == k
1246+
(i for i, a in enumerate(mut_typed_attrs) if a.key.name == k), None
12471247
)
12481248
if not vals:
12491249
if index is not None:
@@ -1285,9 +1285,12 @@ def workflow_upsert_search_attributes(
12851285

12861286
# Update typed and untyped in info
12871287
index = next(
1288-
i
1289-
for i, a in enumerate(mut_typed_attrs)
1290-
if a.key.name == update.key.name
1288+
(
1289+
i
1290+
for i, a in enumerate(mut_typed_attrs)
1291+
if a.key.name == update.key.name
1292+
),
1293+
None,
12911294
)
12921295
if update.value is None:
12931296
# Delete
@@ -1301,7 +1304,7 @@ def workflow_upsert_search_attributes(
13011304
update.key, update.value
13021305
)
13031306
if index is None:
1304-
mut_typed_attrs.append()
1307+
mut_typed_attrs.append(pair)
13051308
else:
13061309
mut_typed_attrs[index] = pair
13071310
# Single-item list if not already a sequence for untyped

tests/worker/test_workflow.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1824,6 +1824,35 @@ async def describe_attributes_typed(
18241824
assert updated_attrs_typed == await describe_attributes_typed(handle)
18251825

18261826

1827+
@workflow.defn
1828+
class NoSearchAttributesWorkflow:
1829+
@workflow.run
1830+
async def run(self) -> None:
1831+
workflow.upsert_search_attributes(
1832+
[
1833+
SearchAttributeWorkflow.text_attribute.value_set("text2"),
1834+
]
1835+
)
1836+
# All we need to do is complete
1837+
1838+
1839+
async def test_workflow_no_initial_search_attributes(client: Client, env_type: str):
1840+
if env_type != "local":
1841+
pytest.skip("Only testing search attributes on local which disables cache")
1842+
await ensure_search_attributes_present(
1843+
client,
1844+
SearchAttributeWorkflow.text_attribute,
1845+
)
1846+
async with new_worker(client, NoSearchAttributesWorkflow) as worker:
1847+
handle = await client.start_workflow(
1848+
NoSearchAttributesWorkflow.run,
1849+
id=f"workflow-{uuid.uuid4()}",
1850+
task_queue=worker.task_queue,
1851+
# importantly, no initial search attributes
1852+
)
1853+
await handle.result()
1854+
1855+
18271856
@workflow.defn
18281857
class LoggingWorkflow:
18291858
def __init__(self) -> None:

0 commit comments

Comments
 (0)