Module: factory.workflow/ObjWorkflowDecisionSegment.py
Product: Arbiter
Workflow node executor for the DECISIONSEGMENT node type.
Registered via @ObjNodeRegistry.register("DECISIONSEGMENT").
When the workflow engine encounters a DECISIONSEGMENT node:
ObjDecisionSegmentation with the workflow's DB connectionseg.read(name.lower()) to load the segment definitionseg.evaluate(context[RESULT], input_guid) to run evaluation_calc_{name} in context with the result(run_context, current_result)The evaluation builds a SQL WHERE clause against the segment's
base table, persists results to the meta table, and returns the
first output value.
In def_workflownodes:
| Field | Value |
|---|---|
NodeType |
DECISIONSEGMENT |
Name |
Segment name (e.g. seg_limits) |
The name is lowercased before lookup.
| SEGMENT (legacy) | DECISIONSEGMENT (new) | |
|---|---|---|
| Module | ObjWorkflowSegment |
ObjWorkflowDecisionSegment |
| Engine | ObjServiceSegmentation |
ObjDecisionSegmentation |
| Config table | def_segment |
def_decision_segment |
| Versioned | No | Yes (via ObjVersionMixin) |
| Operators | Inline SQL building | ObjOperator.resolve_operator() |
| Quote stripping | Context values only | Context + column data |
Both node types can coexist in the same workflow. The legacy
SEGMENT node now proxies its compute_segment() to the core
engine, so both paths use the same evaluation logic.
Side-effect import in ObjWorkflow.py (~line 128):
import ObjWorkflowDecisionSegment # noqa: F401
Enum entry in ObjEnum.py:
DECISIONSEGMENT = "DECISIONSEGMENT"
Node type map in ObjConstants.py:
WORKFLOW_NODE_TYPE_MAP = {
"DECISIONSEGMENT": "ObjWorkflowDecisionSegment",
...
}