| from typing import Any |
|
|
| from langflow.custom import Component |
| from langflow.io import DataInput, DropdownInput, MessageTextInput, Output |
| from langflow.schema import Data, dotdict |
|
|
|
|
| class DataConditionalRouterComponent(Component): |
| display_name = "Condition" |
| description = "Route Data object(s) based on a condition applied to a specified key, including boolean validation." |
| icon = "split" |
| name = "DataConditionalRouter" |
| legacy = True |
|
|
| inputs = [ |
| DataInput( |
| name="data_input", |
| display_name="Data Input", |
| info="The Data object or list of Data objects to process", |
| is_list=True, |
| ), |
| MessageTextInput( |
| name="key_name", |
| display_name="Key Name", |
| info="The name of the key in the Data object(s) to check", |
| ), |
| DropdownInput( |
| name="operator", |
| display_name="Operator", |
| options=["equals", "not equals", "contains", "starts with", "ends with", "boolean validator"], |
| info="The operator to apply for comparing the values. 'boolean validator' treats the value as a boolean.", |
| value="equals", |
| ), |
| MessageTextInput( |
| name="compare_value", |
| display_name="Match Text", |
| info="The value to compare against (not used for boolean validator)", |
| ), |
| ] |
|
|
| outputs = [ |
| Output(display_name="True Output", name="true_output", method="process_data"), |
| Output(display_name="False Output", name="false_output", method="process_data"), |
| ] |
|
|
| def compare_values(self, item_value: str, compare_value: str, operator: str) -> bool: |
| if operator == "equals": |
| return item_value == compare_value |
| if operator == "not equals": |
| return item_value != compare_value |
| if operator == "contains": |
| return compare_value in item_value |
| if operator == "starts with": |
| return item_value.startswith(compare_value) |
| if operator == "ends with": |
| return item_value.endswith(compare_value) |
| if operator == "boolean validator": |
| return self.parse_boolean(item_value) |
| return False |
|
|
| def parse_boolean(self, value): |
| if isinstance(value, bool): |
| return value |
| if isinstance(value, str): |
| return value.lower() in {"true", "1", "yes", "y", "on"} |
| return bool(value) |
|
|
| def validate_input(self, data_item: Data) -> bool: |
| if not isinstance(data_item, Data): |
| self.status = "Input is not a Data object" |
| return False |
| if self.key_name not in data_item.data: |
| self.status = f"Key '{self.key_name}' not found in Data" |
| return False |
| return True |
|
|
| def process_data(self) -> Data | list[Data]: |
| if isinstance(self.data_input, list): |
| true_output = [] |
| false_output = [] |
| for item in self.data_input: |
| if self.validate_input(item): |
| result = self.process_single_data(item) |
| if result: |
| true_output.append(item) |
| else: |
| false_output.append(item) |
| self.stop("false_output" if true_output else "true_output") |
| return true_output or false_output |
| if not self.validate_input(self.data_input): |
| return Data(data={"error": self.status}) |
| result = self.process_single_data(self.data_input) |
| self.stop("false_output" if result else "true_output") |
| return self.data_input |
|
|
| def process_single_data(self, data_item: Data) -> bool: |
| item_value = data_item.data[self.key_name] |
| operator = self.operator |
|
|
| if operator == "boolean validator": |
| condition_met = self.parse_boolean(item_value) |
| condition_description = f"Boolean validation of '{self.key_name}'" |
| else: |
| compare_value = self.compare_value |
| condition_met = self.compare_values(str(item_value), compare_value, operator) |
| condition_description = f"{self.key_name} {operator} {compare_value}" |
|
|
| if condition_met: |
| self.status = f"Condition met: {condition_description}" |
| return True |
| self.status = f"Condition not met: {condition_description}" |
| return False |
|
|
| def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None): |
| if field_name == "operator": |
| if field_value == "boolean validator": |
| build_config["compare_value"]["show"] = False |
| build_config["compare_value"]["advanced"] = True |
| build_config["compare_value"]["value"] = None |
| else: |
| build_config["compare_value"]["show"] = True |
| build_config["compare_value"]["advanced"] = False |
|
|
| return build_config |
|
|