Skip to content
Closed
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
26 changes: 18 additions & 8 deletions cdisc_rules_engine/check_operators/dataframe_operators.py
Original file line number Diff line number Diff line change
Expand Up @@ -1042,16 +1042,26 @@ def non_empty_within_except_last_row(self, other_value: dict):
@type_operator(FIELD_DATAFRAME)
def contains_all(self, other_value: dict):
target = self.replace_prefix(other_value.get("target"))
value_is_literal: bool = other_value.get("value_is_literal", False)
comparator = other_value.get("comparator")
if isinstance(comparator, list):
# get column as array of values
values = flatten_list(self.value, comparator)
if self.is_column_of_iterables(
self.value[target]
) and self.is_column_of_iterables(self.value[comparator]):
comparison_data = self.get_comparator_data(comparator, value_is_literal)
results = []
for i in range(len(self.value[target])):
target_val = self.value[target].iloc[i]
comp_val = comparison_data.iloc[i]
results.append(all(is_in(item, comp_val) for item in target_val))
else:
comparator = self.replace_prefix(comparator)
values = self.value[comparator].unique()
return self.value.convert_to_series(
set(values).issubset(set(self.value[target].unique()))
)
if isinstance(comparator, list):
# get column as array of values
values = flatten_list(self.value, comparator)
else:
comparator = self.replace_prefix(comparator)
values = self.value[comparator].unique()
results = set(values).issubset(set(self.value[target].unique()))
return self.value.convert_to_series(results)

@log_operator_execution
@type_operator(FIELD_DATAFRAME)
Expand Down
1 change: 1 addition & 0 deletions cdisc_rules_engine/models/operation_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,4 @@ class OperationParams:
target: str = None
value_is_reference: bool = False
namespace: str = None
delimiter: str = None
2 changes: 2 additions & 0 deletions cdisc_rules_engine/operations/operations_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
from cdisc_rules_engine.operations.min_date import MinDate
from cdisc_rules_engine.operations.minimum import Minimum
from cdisc_rules_engine.operations.record_count import RecordCount
from cdisc_rules_engine.operations.split_by import SplitBy
from cdisc_rules_engine.operations.valid_external_dictionary_code import (
ValidExternalDictionaryCode,
)
Expand Down Expand Up @@ -121,6 +122,7 @@ class OperationsFactory(FactoryInterface):
"domain_is_custom": DomainIsCustom,
"domain_label": DomainLabel,
"required_variables": RequiredVariables,
"split_by": SplitBy,
"expected_variables": ExpectedVariables,
"permissible_variables": PermissibleVariables,
"study_domains": StudyDomains,
Expand Down
8 changes: 8 additions & 0 deletions cdisc_rules_engine/operations/split_by.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from cdisc_rules_engine.operations.base_operation import BaseOperation


class SplitBy(BaseOperation):
def _execute_operation(self):
return self.params.dataframe[self.params.target].str.split(
self.params.delimiter
)
1 change: 1 addition & 0 deletions cdisc_rules_engine/utilities/rule_processor.py
Original file line number Diff line number Diff line change
Expand Up @@ -423,6 +423,7 @@ def perform_rule_operations(
term_pref_term=operation.get("term_pref_term"),
namespace=operation.get("namespace"),
value_is_reference=operation.get("value_is_reference", False),
delimiter=operation.get("delimiter"),
)

# execute operation
Expand Down
Loading