def test_comparison_refs(): def dummy_node(node_id) -> Node: n = Node( node_id, metadata=None, bindings=[], upstream_nodes=[], flyte_entity=SQLTask(name="x", query_template="x", inputs={}), ) n._id = node_id return n px = Promise("x", NodeOutput(var="x", node=dummy_node("n1"))) py = Promise("y", NodeOutput(var="y", node=dummy_node("n2"))) def print_expr(expr): print(f"{expr} is type {type(expr)}") print_expr(px == py) print_expr(px < py) print_expr((px == py) & (px < py)) print_expr(((px == py) & (px < py)) | (px > py)) print_expr(px < 5) print_expr(px >= 5) print_expr(px != 5)
def _compute_outputs( self, n: Node) -> Optional[Union[Promise, Tuple[Promise], VoidPromise]]: curr = self.compute_output_vars() if curr is None or len(curr) == 0: return VoidPromise(n.id, NodeOutput(node=n, var="placeholder")) promises = [ Promise(var=x, val=NodeOutput(node=n, var=x)) for x in curr ] # TODO: Is there a way to add the Python interface here? Currently, it's an optional arg. return create_task_output(promises)
def construct_input_promises(inputs: List[str]): return { input_name: Promise(var=input_name, val=NodeOutput(node=GLOBAL_START_NODE, var=input_name)) for input_name in inputs }
def add_workflow_input(self, input_name: str, python_type: Type) -> Interface: """ Adds an input to the workflow. """ if input_name in self._inputs: raise FlyteValidationException(f"Input {input_name} has already been specified for wf {self.name}.") self._python_interface = self._python_interface.with_inputs(extra_inputs={input_name: python_type}) self._interface = transform_interface_to_typed_interface(self._python_interface) self._inputs[input_name] = Promise(var=input_name, val=NodeOutput(node=GLOBAL_START_NODE, var=input_name)) self._unbound_inputs.add(self._inputs[input_name]) return self._inputs[input_name]
def _compute_outputs(self, n: Node) -> Union[Promise, Tuple[Promise], VoidPromise]: output_var_sets: typing.List[typing.Set[str]] = [] for c in self._cases: if c.output_promise is None and c.err is None: # One node returns a void output and no error, we will default to a # Void output return VoidPromise(n.id) if c.output_promise is not None: if isinstance(c.output_promise, tuple): output_var_sets.append(set([i.var for i in c.output_promise])) else: output_var_sets.append(set([c.output_promise.var])) curr = output_var_sets[0] if len(output_var_sets) > 1: for x in output_var_sets[1:]: curr = curr.intersection(x) promises = [Promise(var=x, val=NodeOutput(node=n, var=x)) for x in curr] # TODO: Is there a way to add the Python interface here? Currently, it's an optional arg. return create_task_output(promises)