Skip to content

Commit d2a8101

Browse files
authored
refactor: align target multi-part primary key representation with source (#949)
* refactor: s/`KeyValue`/`KeyPart`/, s/`FullKeyValue`/`KeyValue`/ * refactor: align target multi-part primary key representation with source
1 parent 52f9e71 commit d2a8101

File tree

25 files changed

+313
-368
lines changed

25 files changed

+313
-368
lines changed

python/cocoindex/convert.py

Lines changed: 37 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import inspect
1010
import warnings
1111
from enum import Enum
12-
from typing import Any, Callable, Mapping, Type, get_origin
12+
from typing import Any, Callable, Mapping, Sequence, Type, get_origin
1313

1414
import numpy as np
1515

@@ -170,6 +170,37 @@ def encode_basic_value(value: Any) -> Any:
170170
return encode_basic_value
171171

172172

173+
def make_engine_key_decoder(
174+
field_path: list[str],
175+
key_fields_schema: list[dict[str, Any]],
176+
dst_type_info: AnalyzedTypeInfo,
177+
) -> Callable[[Any], Any]:
178+
"""
179+
Create an encoder closure for a key type.
180+
"""
181+
if len(key_fields_schema) == 1 and isinstance(
182+
dst_type_info.variant, (AnalyzedBasicType, AnalyzedAnyType)
183+
):
184+
single_key_decoder = make_engine_value_decoder(
185+
field_path,
186+
key_fields_schema[0]["type"],
187+
dst_type_info,
188+
for_key=True,
189+
)
190+
191+
def key_decoder(value: list[Any]) -> Any:
192+
return single_key_decoder(value[0])
193+
194+
return key_decoder
195+
196+
return make_engine_struct_decoder(
197+
field_path,
198+
key_fields_schema,
199+
dst_type_info,
200+
for_key=True,
201+
)
202+
203+
173204
def make_engine_value_decoder(
174205
field_path: list[str],
175206
src_type: dict[str, Any],
@@ -244,31 +275,11 @@ def decode(value: Any) -> Any | None:
244275
)
245276

246277
num_key_parts = src_type.get("num_key_parts", 1)
247-
key_type_info = analyze_type_info(key_type)
248-
key_decoder: Callable[..., Any] | None = None
249-
if (
250-
isinstance(
251-
key_type_info.variant, (AnalyzedBasicType, AnalyzedAnyType)
252-
)
253-
and num_key_parts == 1
254-
):
255-
single_key_decoder = make_engine_value_decoder(
256-
field_path,
257-
engine_fields_schema[0]["type"],
258-
key_type_info,
259-
for_key=True,
260-
)
261-
262-
def key_decoder(value: list[Any]) -> Any:
263-
return single_key_decoder(value[0])
264-
265-
else:
266-
key_decoder = make_engine_struct_decoder(
267-
field_path,
268-
engine_fields_schema[0:num_key_parts],
269-
key_type_info,
270-
for_key=True,
271-
)
278+
key_decoder = make_engine_key_decoder(
279+
field_path,
280+
engine_fields_schema[0:num_key_parts],
281+
analyze_type_info(key_type),
282+
)
272283
value_decoder = make_engine_struct_decoder(
273284
field_path,
274285
engine_fields_schema[num_key_parts:],

python/cocoindex/op.py

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from .convert import (
2222
make_engine_value_encoder,
2323
make_engine_value_decoder,
24+
make_engine_key_decoder,
2425
make_engine_struct_decoder,
2526
)
2627
from .typing import (
@@ -29,7 +30,6 @@
2930
resolve_forward_ref,
3031
analyze_type_info,
3132
AnalyzedAnyType,
32-
AnalyzedBasicType,
3333
AnalyzedDictType,
3434
)
3535

@@ -532,24 +532,9 @@ def create_export_context(
532532
else (Any, Any)
533533
)
534534

535-
key_type_info = analyze_type_info(key_annotation)
536-
if (
537-
len(key_fields_schema) == 1
538-
and key_fields_schema[0]["type"]["kind"] != "Struct"
539-
and isinstance(key_type_info.variant, (AnalyzedAnyType, AnalyzedBasicType))
540-
):
541-
# Special case for ease of use: single key column can be mapped to a basic type without the wrapper struct.
542-
key_decoder = make_engine_value_decoder(
543-
["(key)"],
544-
key_fields_schema[0]["type"],
545-
key_type_info,
546-
for_key=True,
547-
)
548-
else:
549-
key_decoder = make_engine_struct_decoder(
550-
["(key)"], key_fields_schema, key_type_info, for_key=True
551-
)
552-
535+
key_decoder = make_engine_key_decoder(
536+
["(key)"], key_fields_schema, analyze_type_info(key_annotation)
537+
)
553538
value_decoder = make_engine_struct_decoder(
554539
["(value)"], value_fields_schema, analyze_type_info(value_annotation)
555540
)

0 commit comments

Comments
 (0)