Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions cdisc_rules_engine/operations/codelist_extensible.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,12 @@ def _handle_multiple_versions(self) -> pd.Series:
self.params.ct_package_type, unique_ct_versions
)
ct_df = self.evaluation_dataset.__class__.from_dict(ct_data)
ct_df = ct_df.astype(
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR only converts the ct_df to string but evaluation dataset is still not made safe for merge. if it has empty columns the merge can fail. I have noticed that in the test the evaluation dataset was made safe manually by converting it to string. That let me to think that we need to make the evaluation dataset safe here too to merge without errors.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i believe that the fix for the types allowed us to have empty evaluation datasets as well. I've removed the conversions from the tests.

{
"version": "string",
"codelist_code": "string",
}
)
if self.params.codelist_code in self.evaluation_dataset.columns:
is_extensible = self.evaluation_dataset.merge(
ct_df.data,
Expand Down
6 changes: 6 additions & 0 deletions cdisc_rules_engine/operations/codelist_terms.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,12 @@ def _handle_multiple_versions(self) -> pd.Series:
self.params.ct_package_type, unique_ct_versions
)
ct_df = self.evaluation_dataset.__class__.from_dict(ct_data)
ct_df = ct_df.astype(
{
"version": "string",
"codelist_code": "string",
}
)
if self.params.codelist_code in self.evaluation_dataset.columns:
result = self.evaluation_dataset.merge(
ct_df.data,
Expand Down
20 changes: 16 additions & 4 deletions tests/unit/test_operations/test_codelist_extensible.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,40 +124,52 @@ def test_empty_metadata(operation_params):


@mark.parametrize(
"package_type, codelist_code, expected",
"package_type, codelist_code, versions, codelist_codes, expected",
[
(
"mock_package",
"codelist_code",
["v1", "v2", "v3"],
["C1", "C2", "C3"],
[True, False, None],
),
(
"mock_package",
"C1",
["v1", "v2", "v3"],
["C1", "C2", "C3"],
[True, True, True],
),
(
"missing_package",
"codelist_code",
["v1", "v2", "v3"],
["C1", "C2", "C3"],
[None, None, None],
),
("mock_package", "codelist_code", [], [], []),
],
)
def test_multiple_versions(
operation_params, mock_metadata, package_type, codelist_code, expected
operation_params,
mock_metadata,
package_type,
codelist_code,
versions,
codelist_codes,
expected,
):
operation_params.ct_package_type = package_type
operation_params.ct_version = "version"
operation_params.codelist_code = codelist_code
versions = ["v1", "v2", "v3"]

library_metadata = LibraryMetadataContainer()
for version in versions:
mock_metadata[f"mock_package-{version}"] = mock_metadata["mock_package"]
library_metadata._ct_package_metadata = mock_metadata

evaluation_dataset = PandasDataset.from_dict(
{"version": versions, "codelist_code": ["C1", "C2", "C3"]}
{"version": versions, "codelist_code": codelist_codes}
)

operation = CodelistExtensible(
Expand Down
36 changes: 36 additions & 0 deletions tests/unit/test_operations/test_codelist_terms.py
Original file line number Diff line number Diff line change
Expand Up @@ -323,3 +323,39 @@ def test_multiple_versions(
except RuleExecutionError:
result = pd.Series(RuleExecutionError)
assert result.equals(pd.Series(expected))


def test_empty_dataset_multiple_versions(
operation_params,
mock_metadata,
):
operation_params.ct_package_type = "mock_package"
operation_params.ct_version = "version"
operation_params.codelist_code = "codelist_code"
operation_params.term_code = "t_code"
operation_params.term_value = None
operation_params.term_pref_term = None
operation_params.returntype = None

library_metadata = LibraryMetadataContainer()
library_metadata._ct_package_metadata = mock_metadata

evaluation_dataset = PandasDataset.from_dict(
{
"version": [],
"codelist_code": [],
"t_code": [],
"t_value": [],
"t_pref_term": [],
}
)

operation = CodelistTerms(
operation_params,
evaluation_dataset,
MagicMock(),
MagicMock(),
library_metadata,
)
result = operation._execute_operation()
assert result.tolist() == []
Loading