Skip to content

Commit 1e18b44

Browse files
committed
one_on_one -> relationship_type
1 parent d16d24f commit 1e18b44

File tree

5 files changed

+45
-25
lines changed

5 files changed

+45
-25
lines changed

everyrow-mcp/src/everyrow_mcp/server.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -352,9 +352,9 @@ class MergeInput(BaseModel):
352352
default=None,
353353
description='Optional. Control web search behavior: "auto" tries LLM merge first then conditionally searches, "no" skips web search entirely, "yes" forces web search on every row. Defaults to "auto" if not provided.',
354354
)
355-
one_on_one: bool | None = Field(
355+
relationship_type: Literal["many_to_one", "one_to_one"] | None = Field(
356356
default=None,
357-
description="Optional boolean parameter for one-on-one merge mode. Defaults to None/False.",
357+
description='Optional. Control merge relationship type: "many_to_one" (default) allows multiple left rows to match one right row, "one_to_one" enforces unique matching between left and right rows.',
358358
)
359359

360360
@field_validator("left_csv", "right_csv")
@@ -398,7 +398,7 @@ async def everyrow_merge(params: MergeInput) -> str:
398398
merge_on_left=params.merge_on_left,
399399
merge_on_right=params.merge_on_right,
400400
use_web_search=params.use_web_search,
401-
one_on_one=params.one_on_one,
401+
relationship_type=params.relationship_type,
402402
)
403403

404404
output_file = resolve_output_path(params.output_path, params.left_csv, "merged")

src/everyrow/generated/models/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from .merge_operation_left_input_type_1_item import MergeOperationLeftInputType1Item
2525
from .merge_operation_left_input_type_2 import MergeOperationLeftInputType2
2626
from .merge_operation_right_input_type_1_item import MergeOperationRightInputType1Item
27+
from .merge_operation_relationship_type_type_0 import MergeOperationRelationshipTypeType0
2728
from .merge_operation_right_input_type_2 import MergeOperationRightInputType2
2829
from .merge_operation_use_web_search_type_0 import MergeOperationUseWebSearchType0
2930
from .operation_response import OperationResponse
@@ -75,6 +76,7 @@
7576
"MergeOperationLeftInputType1Item",
7677
"MergeOperationLeftInputType2",
7778
"MergeOperationRightInputType1Item",
79+
"MergeOperationRelationshipTypeType0",
7880
"MergeOperationRightInputType2",
7981
"MergeOperationUseWebSearchType0",
8082
"OperationResponse",

src/everyrow/generated/models/merge_operation.py

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from attrs import define as _attrs_define
99
from attrs import field as _attrs_field
1010

11+
from ..models.merge_operation_relationship_type_type_0 import MergeOperationRelationshipTypeType0
1112
from ..models.merge_operation_use_web_search_type_0 import MergeOperationUseWebSearchType0
1213
from ..types import UNSET, Unset
1314

@@ -35,11 +36,9 @@ class MergeOperation:
3536
use_web_search (MergeOperationUseWebSearchType0 | None | Unset): Control web search behavior: 'auto' (default)
3637
tries LLM merge first then conditionally searches, 'no' skips web search entirely, 'yes' forces web search
3738
without initial LLM merge Default: MergeOperationUseWebSearchType0.AUTO.
38-
<<<<<<< HEAD
39-
one_on_one (bool | None | Unset): Optional boolean parameter for one-on-one merge mode. Defaults to None/False.
40-
=======
41-
one_on_one (bool | None | Unset): Optional parameter for one-on-one merge behavior
42-
>>>>>>> main
39+
relationship_type (MergeOperationRelationshipTypeType0 | None | Unset): Control relationship type:
40+
'many_to_one' (default) allows multiple left rows to match one right row,
41+
'one_to_one' enforces unique matching between left and right rows.
4342
session_id (None | Unset | UUID): Session ID. If not provided, a new session is auto-created for this task.
4443
"""
4544

@@ -49,7 +48,7 @@ class MergeOperation:
4948
left_key: None | str | Unset = UNSET
5049
right_key: None | str | Unset = UNSET
5150
use_web_search: MergeOperationUseWebSearchType0 | None | Unset = MergeOperationUseWebSearchType0.AUTO
52-
one_on_one: bool | None | Unset = UNSET
51+
relationship_type: MergeOperationRelationshipTypeType0 | None | Unset = UNSET
5352
session_id: None | Unset | UUID = UNSET
5453
additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
5554

@@ -100,11 +99,13 @@ def to_dict(self) -> dict[str, Any]:
10099
else:
101100
use_web_search = self.use_web_search
102101

103-
one_on_one: bool | None | Unset
104-
if isinstance(self.one_on_one, Unset):
105-
one_on_one = UNSET
102+
relationship_type: None | str | Unset
103+
if isinstance(self.relationship_type, Unset):
104+
relationship_type = UNSET
105+
elif isinstance(self.relationship_type, MergeOperationRelationshipTypeType0):
106+
relationship_type = self.relationship_type.value
106107
else:
107-
one_on_one = self.one_on_one
108+
relationship_type = self.relationship_type
108109

109110
session_id: None | str | Unset
110111
if isinstance(self.session_id, Unset):
@@ -129,8 +130,8 @@ def to_dict(self) -> dict[str, Any]:
129130
field_dict["right_key"] = right_key
130131
if use_web_search is not UNSET:
131132
field_dict["use_web_search"] = use_web_search
132-
if one_on_one is not UNSET:
133-
field_dict["one_on_one"] = one_on_one
133+
if relationship_type is not UNSET:
134+
field_dict["relationship_type"] = relationship_type
134135
if session_id is not UNSET:
135136
field_dict["session_id"] = session_id
136137

@@ -246,14 +247,22 @@ def _parse_use_web_search(data: object) -> MergeOperationUseWebSearchType0 | Non
246247

247248
use_web_search = _parse_use_web_search(d.pop("use_web_search", UNSET))
248249

249-
def _parse_one_on_one(data: object) -> bool | None | Unset:
250+
def _parse_relationship_type(data: object) -> MergeOperationRelationshipTypeType0 | None | Unset:
250251
if data is None:
251252
return data
252253
if isinstance(data, Unset):
253254
return data
254-
return cast(bool | None | Unset, data)
255+
try:
256+
if not isinstance(data, str):
257+
raise TypeError()
258+
relationship_type_type_0 = MergeOperationRelationshipTypeType0(data)
259+
260+
return relationship_type_type_0
261+
except (TypeError, ValueError, AttributeError, KeyError):
262+
pass
263+
return cast(MergeOperationRelationshipTypeType0 | None | Unset, data)
255264

256-
one_on_one = _parse_one_on_one(d.pop("one_on_one", UNSET))
265+
relationship_type = _parse_relationship_type(d.pop("relationship_type", UNSET))
257266

258267
def _parse_session_id(data: object) -> None | Unset | UUID:
259268
if data is None:
@@ -279,7 +288,7 @@ def _parse_session_id(data: object) -> None | Unset | UUID:
279288
left_key=left_key,
280289
right_key=right_key,
281290
use_web_search=use_web_search,
282-
one_on_one=one_on_one,
291+
relationship_type=relationship_type,
283292
session_id=session_id,
284293
)
285294

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from enum import Enum
2+
3+
4+
class MergeOperationRelationshipTypeType0(str, Enum):
5+
MANY_TO_ONE = "many_to_one"
6+
ONE_TO_ONE = "one_to_one"
7+
8+
def __str__(self) -> str:
9+
return str(self.value)

src/everyrow/ops.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -545,7 +545,7 @@ async def merge(
545545
merge_on_left: str | None = None,
546546
merge_on_right: str | None = None,
547547
use_web_search: Literal["auto", "yes", "no"] | None = None,
548-
one_on_one: bool | None = None,
548+
relationship_type: Literal["many_to_one", "one_to_one"] | None = None,
549549
) -> MergeResult:
550550
"""Merge two tables using AI.
551551
@@ -557,7 +557,7 @@ async def merge(
557557
merge_on_left: Optional column name in left table to merge on
558558
merge_on_right: Optional column name in right table to merge on
559559
use_web_search: Optional. Control web search behavior: "auto" tries LLM merge first then conditionally searches, "no" skips web search entirely, "yes" forces web search on every row. Defaults to "auto" if not provided.
560-
one_on_one: Optional boolean parameter for one-on-one merge mode. Defaults to None/False.
560+
relationship_type: Optional. Control merge relationship type: "many_to_one" (default) allows multiple left rows to match one right row, "one_to_one" enforces unique matching between left and right rows.
561561
562562
Returns:
563563
MergeResult containing the merged table and match breakdown by method (exact, fuzzy, llm, web)
@@ -580,7 +580,7 @@ async def merge(
580580
merge_on_left=merge_on_left,
581581
merge_on_right=merge_on_right,
582582
use_web_search=use_web_search,
583-
one_on_one=one_on_one,
583+
relationship_type=relationship_type,
584584
)
585585
return await merge_task.await_result()
586586
merge_task = await merge_async(
@@ -591,7 +591,7 @@ async def merge(
591591
merge_on_left=merge_on_left,
592592
merge_on_right=merge_on_right,
593593
use_web_search=use_web_search,
594-
one_on_one=one_on_one,
594+
relationship_type=relationship_type,
595595
)
596596
return await merge_task.await_result()
597597

@@ -604,7 +604,7 @@ async def merge_async(
604604
merge_on_left: str | None = None,
605605
merge_on_right: str | None = None,
606606
use_web_search: Literal["auto", "yes", "no"] | None = None,
607-
one_on_one: bool | None = None,
607+
relationship_type: Literal["many_to_one", "one_to_one"] | None = None,
608608
) -> MergeTask:
609609
"""Submit a merge task asynchronously.
610610
@@ -621,7 +621,7 @@ async def merge_async(
621621
left_key=merge_on_left or UNSET,
622622
right_key=merge_on_right or UNSET,
623623
use_web_search=use_web_search or UNSET, # type: ignore
624-
one_on_one=one_on_one or UNSET, # type: ignore
624+
relationship_type=relationship_type or UNSET, # type: ignore
625625
session_id=session.session_id,
626626
)
627627

0 commit comments

Comments
 (0)