Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
ec2079a
feat: introduce macro operators (logical-plan-level skeleton)
Xiao-zhen-Liu May 15, 2026
6e30c78
feat(macro): persistence + REST endpoints for macro operators
Xiao-zhen-Liu May 15, 2026
404b277
feat(macro): wire MacroExpander into amber's execution-time compiler
Xiao-zhen-Liu May 15, 2026
5e11274
feat(macro): right-click "Create Macro" action — first UI surface
Xiao-zhen-Liu May 15, 2026
fdb7f4d
fix(macro): show "create macro" even when boundary links are highlighted
Xiao-zhen-Liu May 15, 2026
8958226
fix(macro): GET /workflow/{wid} returns 404 for macro rows
Xiao-zhen-Liu May 15, 2026
4808cff
feat(macro): swap selected sub-DAG with a single MacroOp node on create
Xiao-zhen-Liu May 15, 2026
b7aaf04
chore(macro): temporary console.log tracing in onCreateMacro
Xiao-zhen-Liu May 15, 2026
34492ab
fix(macro): bypass getNewOperatorPredicate for Macro instance constru…
Xiao-zhen-Liu May 15, 2026
3130d08
chore(macro): remove diagnostic console.log tracing from onCreateMacro
Xiao-zhen-Liu May 15, 2026
4224ecf
feat(macro): drill-down editor — double-click a macro to view its body
Xiao-zhen-Liu May 15, 2026
8e0af42
fix(macro): strip orphan \`nullable: true\` from operator schemas on …
Xiao-zhen-Liu May 15, 2026
84dfae4
fix(macro): reset canvas before drill-down load + stub macro icons
Xiao-zhen-Liu May 15, 2026
2ae10cb
fix(macro): subscribe to route paramMap so in-tab navigations reload …
Xiao-zhen-Liu May 15, 2026
f7748b8
fix(macro): use window.location.href for macro drill-down navigation
Xiao-zhen-Liu May 15, 2026
2612cfe
fix(macro): make MacroBody parse cleanly so compile doesn't silently …
Xiao-zhen-Liu May 15, 2026
7a05120
chore: remove stray frontend/project/build.properties from prior commit
Xiao-zhen-Liu May 15, 2026
4c895f0
chore(macro): replace PythonUDFV2-stub icons with distinct macro icons
Xiao-zhen-Liu May 15, 2026
c34577c
feat(macro): URI-safe ID separator, exec stats roll-up, UI polish
Xiao-zhen-Liu May 16, 2026
49beec9
fix(macro): preserve full sub-DAG external interface as macro ports
Xiao-zhen-Liu May 16, 2026
e6ee6ce
feat(macro): port-level stats + results on outer canvas, drill-down e…
Xiao-zhen-Liu May 16, 2026
ab10880
feat(macro): view-result, nested macros, SPA drill-down navigation
Xiao-zhen-Liu May 16, 2026
4aa7b19
fix(macro): drill-down navigation + duplicate-link tolerance
Xiao-zhen-Liu May 16, 2026
484cd31
feat(macro): add 'Expand macro' context-menu action — inverse of create
Xiao-zhen-Liu May 16, 2026
8c27552
feat(macro): drill-down uses parent wid for execution websocket
Xiao-zhen-Liu May 16, 2026
d379bcf
feat(macro): Your Macros palette section + click-to-add instantiation
Xiao-zhen-Liu May 16, 2026
b35fdc5
feat(macro): suggestMacros agent panel — heuristic v1 ranked candidates
Xiao-zhen-Liu May 16, 2026
dddfd65
feat(macro): fuseMacro agent tool — §9.2 fusion substitution end-to-end
Xiao-zhen-Liu May 16, 2026
f985d33
fix(macro): suggestMacros now finds candidates in workflows that mix
Xiao-zhen-Liu May 16, 2026
60c8c56
feat(macro): suggestMacros materializes directly without right-click
Xiao-zhen-Liu May 16, 2026
0869cd6
feat(macro): visual ⚡FUSED badge for verified-fused macros
Xiao-zhen-Liu May 16, 2026
28a7edb
feat(macro): unfuse action + real Filter/Projection codegen in fusion
Xiao-zhen-Liu May 16, 2026
fdbe561
feat(macro): recurring-pattern detection + one-click multi-occurrence…
Xiao-zhen-Liu May 16, 2026
7379be9
feat(macro): per-macro usage count surfaced in Your Macros palette
Xiao-zhen-Liu May 16, 2026
d0eb880
feat(macro): export/import macro definitions as JSON files
Xiao-zhen-Liu May 16, 2026
dba535a
feat(macro): fuse codegen handles PythonUDFV2, Regex, Limit, Distinct
Xiao-zhen-Liu May 16, 2026
d24203b
fix(macro): robust fuse codegen for PythonUDFV2 + Filter symbol conds
Xiao-zhen-Liu May 16, 2026
8fb88fc
feat(macro): proactive suggestion badge — agent watches the canvas
Xiao-zhen-Liu May 16, 2026
59994ea
fix(macro): set schema-propagation fields on fused PythonUDFOpDescV2
Xiao-zhen-Liu May 16, 2026
5dd6739
feat(macro): stale-instance detection + refresh-from-source action
Xiao-zhen-Liu May 16, 2026
d920714
feat(macro): show estimated speedup on canvas next to FUSED badge
Xiao-zhen-Liu May 16, 2026
be666d2
feat(macro): pre-fill smart default name in Create Macro prompt
Xiao-zhen-Liu May 16, 2026
402f65f
feat(macro): hover-preview highlighting for suggestion rows
Xiao-zhen-Liu May 16, 2026
f3dee71
feat(macro): one-click 'Fuse all macros' + Your Macros filter input
Xiao-zhen-Liu May 16, 2026
9f14107
feat(macro): auto-categorize macros in palette by op composition
Xiao-zhen-Liu May 16, 2026
44154d1
feat(macro): show op-chain subtitle under each palette macro
Xiao-zhen-Liu May 16, 2026
8113027
feat(macro): richer rationales in suggestion panel
Xiao-zhen-Liu May 16, 2026
174a0bc
feat(macro): auto-generate description at create time
Xiao-zhen-Liu May 16, 2026
74da921
feat(macro): export records nested-macro dependencies for portability
Xiao-zhen-Liu May 16, 2026
abb6940
feat(macro): transitive export/import bundles — fully self-contained …
Xiao-zhen-Liu May 16, 2026
d5fa76f
feat(macro): category-specific palette icons
Xiao-zhen-Liu May 16, 2026
b24d0a7
feat(macro): 🚀 Auto-optimize workflow — agent does the full refactor
Xiao-zhen-Liu May 16, 2026
80521b4
fix(macro): auto-optimize groups suggestions by pattern signature
Xiao-zhen-Liu May 16, 2026
5d9015b
fix(macro): kill the runaway /api/macro/* HTTP storm
Xiao-zhen-Liu May 16, 2026
c3948fd
fix(macro): back-to-parent navigation + redirect macro-as-workflow loads
Xiao-zhen-Liu May 16, 2026
d12195b
fix(engine): propagate phase-transition errors + identify missing-sch…
Xiao-zhen-Liu May 16, 2026
38439c1
fix(macro): use fresh UUIDs for inner ops (not macro-instance prefix)
Xiao-zhen-Liu May 16, 2026
6ed848c
feat(macro): deterministic UUIDs + cache-backed stats roll-up on canv…
Xiao-zhen-Liu May 16, 2026
ce820a2
feat(macro): aggregate stats at every macro chain level (nested-macro…
Xiao-zhen-Liu May 16, 2026
acc2182
fix(macro): aggregate row counts from boundary ports, not all inner ops
Xiao-zhen-Liu May 16, 2026
f75ec51
fix(macro): match runtime ops by chain SUFFIX, not exact length
Xiao-zhen-Liu May 16, 2026
28de679
chore(macro): remove debug logging + plan-dump from WorkflowCompiler
Xiao-zhen-Liu May 16, 2026
e2dc6b1
feat(macro): polish AI suggestions + fix view-result, stats, fusion math
Xiao-zhen-Liu May 16, 2026
006ddba
fix(macro): tolerate UI-only `estimatedSpeedup` on MacroFusion
Xiao-zhen-Liu May 16, 2026
e360aa6
chore: drop .pr-description.md from tracked tree
Xiao-zhen-Liu May 16, 2026
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
Original file line number Diff line number Diff line change
Expand Up @@ -573,7 +573,14 @@ class RegionExecutionCoordinator(
val schemaOptional =
region.getOperator(outputPortId.opId).outputPorts(outputPortId.portId)._3
val schema =
schemaOptional.getOrElse(throw new IllegalStateException("Schema is missing"))
schemaOptional.getOrElse(
throw new IllegalStateException(
s"Schema is missing for output port: opId=${outputPortId.opId.logicalOpId.id} " +
s"layer=${outputPortId.opId.layerName} " +
s"portId=${outputPortId.portId} " +
s"isInternal=${outputPortId.portId.internal}"
)
)
DocumentFactory.createDocument(storageUriToAdd, schema)
if (!isRestart) {
WorkflowExecutionsResource.insertOperatorPortResultUri(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,14 @@ class WorkflowExecutionCoordinator(
regionExecutionCoordinators.values.filter(!_.isCompleted).toSeq

// Trigger sync for each unfinished region.
unfinishedRegionCoordinators.foreach(_.syncStatusAndTransitionRegionExecutionPhase())
// IMPORTANT: capture the sync futures so any exception thrown during phase
// transition (e.g. "Schema is missing" in createOutputPortStorageObjects)
// propagates out as a Future.exception. Previously `.foreach(...)` swallowed
// the returned Future, which meant phase-transition failures were
// discarded and the region appeared to hang silently instead of failing
// with a FatalError visible in the client UI.
val syncFutures =
unfinishedRegionCoordinators.map(_.syncStatusAndTransitionRegionExecutionPhase())

// Wait only for region termination futures (kill path), then re-run coordination.
val terminationFutures = unfinishedRegionCoordinators.flatMap(_.getTerminationFutureOpt)
Expand All @@ -80,7 +87,12 @@ class WorkflowExecutionCoordinator(

if (regionExecutionCoordinators.values.exists(!_.isCompleted)) {
// Some regions are still not completed yet. Cannot start the new regions.
return Future.Unit
// But before returning success, wait on the syncFutures so any
// transition-phase failure (e.g. "Schema is missing") makes it out
// of this method as a Future.exception — PortCompletedHandler's
// .onFailure handler will then turn it into a FatalError on the
// client. Without this, the failure was being swallowed in foreach.
return Future.collect(syncFutures).unit
}

// All existing regions are completed. Start the next region (if any).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ import org.apache.texera.web.resource.dashboard.user.project.{
}
import org.apache.texera.web.resource.dashboard.user.quota.UserQuotaResource
import org.apache.texera.web.resource.dashboard.user.workflow.{
MacroResource,
WorkflowAccessResource,
WorkflowExecutionsResource,
WorkflowResource,
Expand Down Expand Up @@ -148,6 +149,7 @@ class TexeraWebApplication
environment.jersey.register(classOf[PublicProjectResource])
environment.jersey.register(classOf[WorkflowAccessResource])
environment.jersey.register(classOf[WorkflowResource])
environment.jersey.register(classOf[MacroResource])
environment.jersey.register(classOf[HubResource])
environment.jersey.register(classOf[UserResource])
environment.jersey.register(classOf[WorkflowVersionResource])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ import org.apache.texera.dao.SqlServer
import org.apache.texera.dao.jooq.generated.Tables.OPERATOR_EXECUTIONS
import org.apache.texera.web.model.websocket.request.{LogicalPlanPojo, WorkflowExecuteRequest}
import org.apache.texera.workflow.{LogicalLink, WorkflowCompiler}
import org.apache.texera.workflow.macroOp.DbMacroRegistry
import org.apache.texera.web.resource.dashboard.user.workflow.WorkflowExecutionsResource
import org.apache.texera.web.service.{ExecutionResultService, WorkflowService}
import org.apache.texera.web.storage.ExecutionStateStore.updateWorkflowState
Expand Down Expand Up @@ -894,7 +895,7 @@ class SyncExecutionResource extends LazyLogging {
): Map[String, String] = {
try {
val tempContext = new WorkflowContext(WorkflowIdentity(workflowId))
val compiler = new WorkflowCompiler(tempContext)
val compiler = new WorkflowCompiler(tempContext, new DbMacroRegistry())
compiler.compile(logicalPlan)
Map.empty
} catch {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,7 @@ object HubResource {
}

val records = baseWorkflowSelect()
.where(WORKFLOW.WID.in(wids: _*))
.and(WORKFLOW.WID.in(wids: _*))
.groupBy(
WORKFLOW.WID,
WORKFLOW.NAME,
Expand Down
Loading
Loading