Skip to content

feat(frontend): Support for UDF Ui Parameter#4268

Open
carloea2 wants to merge 23 commits intoapache:mainfrom
carloea2:feat/ui-parameter
Open

feat(frontend): Support for UDF Ui Parameter#4268
carloea2 wants to merge 23 commits intoapache:mainfrom
carloea2:feat/ui-parameter

Conversation

@carloea2
Copy link
Contributor

@carloea2 carloea2 commented Mar 7, 2026

What changes were proposed in this PR?

Add Python UDF Parameter support:
image

What the user writes (Python)

Users declare UI parameters once in open(), and then use the typed value directly:

from pytexera import *
from typing import Iterator, Optional

class ProcessTupleOperator(UDFOperatorV2):

    @overrides
    def open(self):
        # declare UiParameters once, store the parsed runtime values
        self.value1 = self.UiParameter(name="param1", type=AttributeType.DOUBLE).value
        self.value2 = self.UiParameter(name="param2", type=AttributeType.INT).value
        self.value3 = self.UiParameter(name="param3", type=AttributeType.STRING).value
        self.value4 = self.UiParameter(name="param4", type=AttributeType.TIMESTAMP).value

    @overrides
    def process_tuple(self, tuple_: Tuple, port: int) -> Iterator[Optional[TupleLike]]:
        print(self.value1)
        print(self.value2)
        print(self.value3)
        print(self.value4)
        yield tuple_

What shows up in the UI

From those self.UiParameter(...) lines, the property panel automatically generates a Parameters section with one row per parameter:

  • Name + Type are read-only (so they stay consistent with the code)
  • Value is editable (so users can change runtime values without touching the script)

How the values get into Python

When the workflow runs, we inject the UI values into the UDF and the base class applies them right before open() executes. That way, when the user calls UiParameter(...).value, they get the current value from the UI.

Any related issues, documentation, discussions?

Closes #4154

How was this PR tested?

Testing added to backend and frontend

Was this PR authored or co-authored using generative AI tooling?

Co-generated with GPT

@github-actions github-actions bot added feature engine python frontend Changes related to the frontend GUI common labels Mar 7, 2026
@carloea2 carloea2 changed the title Feat/UI parameter feat(frontend): Support for UDF Ui Parameter Mar 7, 2026
@chenlica chenlica requested a review from aglinxinyuan March 7, 2026 16:06
@chenlica
Copy link
Contributor

chenlica commented Mar 7, 2026

@aglinxinyuan Please review it.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR adds UDF UI Parameter support, allowing users to declare typed parameters in their Python UDF open() method via self.UiParameter(name=..., type=AttributeType....). The frontend parses these from the code, displays them as an editable properties panel, and the backend injects the UI-supplied values into the Python code before execution.

Changes:

  • Frontend: New UiUdfParametersParserService and UiUdfParametersSyncService that parse self.UiParameter(...) calls from Python code and sync parsed parameters to the operator property store; new UiUdfParametersComponent renders the parameters table in the property panel.
  • Backend (Scala): New UiUDFParameter model and PythonUdfUiParameterInjector that injects a _texera_injected_ui_parameters hook method into the UDF class with the UI-supplied values encoded via the pybuilder mechanism; all three Python UDF operator descriptors updated to run the injector.
  • Backend (Python): New _UiParameterSupport mixin class added to all UDF base classes; it wraps open() via __init_subclass__ to apply injected values before user code runs.

Reviewed changes

Copilot reviewed 24 out of 25 changed files in this pull request and generated 15 comments.

Show a summary per file
File Description
workflow-compiling.interface.ts Adds large_binary to AttributeType, JAVA/Python attribute type name constants, and derived union types for cross-language type token handling
ui-udf-parameters-parser.service.ts New service that parses self.UiParameter(...) calls from Python code and normalizes type tokens to canonical schema names
ui-udf-parameters-parser.service.spec.ts Tests for the parser service; contains incorrect expected type values
ui-udf-parameters-sync.service.ts New service that attaches to YText changes and syncs parsed parameter structure to operator properties
ui-udf-parameters.component.* New Angular Formly custom type component rendering the parameters table with read-only name/type and editable value columns
operator-property-edit-frame.component.ts/.scss Subscribes to param changes and maps the uiParameters field key to the custom Formly type; adds styling
code-editor.component.ts Attaches/detaches the YText listener when the Monaco editor is initialized/destroyed
formly-config.ts / app.module.ts Registers the new ui-udf-parameters Formly type and declares the component
PythonUdfUiParameterInjector.scala New Scala object that injects the _texera_injected_ui_parameters hook method into UDF classes
PythonUdfUiParameterInjectorSpec.scala Tests for the Scala injector; contains failing test assertions
UiUDFParameter.scala New Scala model class for a UI parameter (attribute + string value)
PythonUDFOpDescV2.scala / DualInputPortsPythonUDFOpDescV2.scala / PythonUDFSourceOpDescV2.scala Adds uiParameters field and wires the injector call
Attribute.java Adds @EncodableStringAnnotation to getName() for safe encoding in pybuilder templates; introduces unused imports
udf_operator.py Adds _UiParameterSupport mixin with UiParameter inner class and wrapping mechanism
attribute_type.py Adds FROM_STRING_PARSER_MAPPING for string-to-type conversion
pytexera/__init__.py / pyamber/__init__.py Exports AttributeType
collab-wrapper.component.css Minor whitespace change to an already-invalid CSS property

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link
Contributor

@aglinxinyuan aglinxinyuan left a comment

Choose a reason for hiding this comment

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

Please fix the test cases, as the frontend currently fails to compile. Also address the comments left by Copilot. The PR still feels quite draft-like, so please take some time to polish it before requesting for review.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

common engine feature frontend Changes related to the frontend GUI python

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants