Copy disabled (too large)
Download .txt
Showing preview only (15,145K chars total). Download the full file to get everything.
Repository: Texera/texera
Branch: main
Commit: 2b763e442d3b
Files: 1986
Total size: 25.6 MB
Directory structure:
gitextract_mvod0m3k/
├── .asf.yaml
├── .dockerignore
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug-template.yaml
│ │ ├── feature-template.yaml
│ │ └── task-template.yaml
│ ├── PULL_REQUEST_TEMPLATE
│ ├── labeler.yml
│ ├── release/
│ │ └── vote-email-template.md
│ ├── scripts/
│ │ ├── compose-backport-message.py
│ │ └── prepare-backport-checkout.sh
│ └── workflows/
│ ├── auto-queue.yml
│ ├── automatic-email-notif-on-ddl-change.yml
│ ├── build-and-push-images.yml
│ ├── build.yml
│ ├── check-header.yml
│ ├── comment-commands.yml
│ ├── create-release-candidate.yml
│ ├── direct-backport-push.yml
│ ├── license-binary-checker.yml
│ ├── lint-pr.yml
│ ├── pr-assignment.yml
│ ├── pr-labeler.yml
│ └── required-checks.yml
├── .gitignore
├── .jvmopts
├── .licenserc.yaml
├── .run/
│ ├── AccessControlService.run.xml
│ ├── ComputingUnitManagingService.run.xml
│ ├── ComputingUnitMaster.run.xml
│ ├── ComputingUnitWorker.run.xml
│ ├── ConfigService.run.xml
│ ├── FileService.run.xml
│ ├── TexeraWebApplication.run.xml
│ ├── WorkflowCompilingService.run.xml
│ ├── frontend.run.xml
│ ├── texera micro services.run.xml
│ └── texera-lakefs.run.xml
├── .scalafix.conf
├── .scalafmt.conf
├── AGENTS.md
├── CLAUDE.md
├── CONTRIBUTING.md
├── DISCLAIMER
├── LICENSE
├── NOTICE
├── README.md
├── SECURITY.md
├── access-control-service/
│ ├── LICENSE-binary
│ ├── NOTICE-binary
│ ├── build.sbt
│ ├── project/
│ │ └── build.properties
│ └── src/
│ ├── main/
│ │ ├── resources/
│ │ │ ├── access-control-service-web-config.yaml
│ │ │ └── logback.xml
│ │ └── scala/
│ │ └── org/
│ │ └── apache/
│ │ └── texera/
│ │ └── service/
│ │ ├── AccessControlService.scala
│ │ ├── AccessControlServiceConfiguration.scala
│ │ ├── activity/
│ │ │ └── UserActivityEventListener.scala
│ │ └── resource/
│ │ ├── AccessControlResource.scala
│ │ └── HealthCheckResource.scala
│ └── test/
│ └── scala/
│ └── org/
│ └── apache/
│ └── texera/
│ ├── AccessControlResourceSpec.scala
│ └── service/
│ ├── AccessControlServiceRunSpec.scala
│ └── activity/
│ └── UserActivityEventListenerSpec.scala
├── agent-service/
│ ├── .dockerignore
│ ├── .prettierrc
│ ├── LICENSE-binary
│ ├── bin/
│ │ └── collect-licenses.ts
│ ├── package.json
│ ├── src/
│ │ ├── agent/
│ │ │ ├── index.ts
│ │ │ ├── prompts.ts
│ │ │ ├── texera-agent.ts
│ │ │ ├── tools/
│ │ │ │ ├── index.ts
│ │ │ │ ├── result-formatting.test.ts
│ │ │ │ ├── result-formatting.ts
│ │ │ │ ├── tools-utility.test.ts
│ │ │ │ ├── tools-utility.ts
│ │ │ │ ├── workflow-crud-tools.ts
│ │ │ │ └── workflow-execution-tools.ts
│ │ │ ├── util/
│ │ │ │ ├── auto-layout.test.ts
│ │ │ │ ├── auto-layout.ts
│ │ │ │ ├── context-utils.ts
│ │ │ │ ├── workflow-system-metadata.ts
│ │ │ │ └── workflow-utils.ts
│ │ │ ├── workflow-result-state.test.ts
│ │ │ ├── workflow-result-state.ts
│ │ │ ├── workflow-state.test.ts
│ │ │ └── workflow-state.ts
│ │ ├── api/
│ │ │ ├── auth-api.ts
│ │ │ ├── backend-api.ts
│ │ │ ├── compile-api.ts
│ │ │ ├── execution-api.ts
│ │ │ ├── index.ts
│ │ │ └── workflow-api.ts
│ │ ├── config/
│ │ │ └── env.ts
│ │ ├── index.ts
│ │ ├── logger.ts
│ │ ├── server.test.ts
│ │ ├── server.ts
│ │ └── types/
│ │ ├── agent.ts
│ │ ├── execution.ts
│ │ ├── index.ts
│ │ └── workflow.ts
│ └── tsconfig.json
├── amber/
│ ├── .scalafix.conf
│ ├── .scalafmt.conf
│ ├── DESCRIPTION
│ ├── LICENSE-binary-java
│ ├── LICENSE-binary-python
│ ├── NOTICE-binary
│ ├── README.md
│ ├── build.sbt
│ ├── dev-requirements.txt
│ ├── operator-requirements.txt
│ ├── project/
│ │ ├── build.properties
│ │ └── plugins.sbt
│ ├── pyproject.toml
│ ├── requirements.txt
│ └── src/
│ ├── main/
│ │ ├── protobuf/
│ │ │ └── org/
│ │ │ └── apache/
│ │ │ └── texera/
│ │ │ └── amber/
│ │ │ └── engine/
│ │ │ ├── architecture/
│ │ │ │ ├── rpc/
│ │ │ │ │ ├── controlcommands.proto
│ │ │ │ │ ├── controllerservice.proto
│ │ │ │ │ ├── controlreturns.proto
│ │ │ │ │ ├── testerservice.proto
│ │ │ │ │ └── workerservice.proto
│ │ │ │ ├── sendsemantics/
│ │ │ │ │ └── partitionings.proto
│ │ │ │ └── worker/
│ │ │ │ └── statistics.proto
│ │ │ └── common/
│ │ │ ├── actormessage.proto
│ │ │ ├── ambermessage.proto
│ │ │ └── executionruntimestate.proto
│ │ ├── python/
│ │ │ ├── core/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── architecture/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── handlers/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── actorcommand/
│ │ │ │ │ │ │ ├── actor_handler_base.py
│ │ │ │ │ │ │ ├── backpressure_handler.py
│ │ │ │ │ │ │ └── credit_update_handler.py
│ │ │ │ │ │ └── control/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── add_input_channel_handler.py
│ │ │ │ │ │ ├── add_partitioning_handler.py
│ │ │ │ │ │ ├── assign_port_handler.py
│ │ │ │ │ │ ├── control_handler_base.py
│ │ │ │ │ │ ├── debug_command_handler.py
│ │ │ │ │ │ ├── end_channel_handler.py
│ │ │ │ │ │ ├── end_worker_handler.py
│ │ │ │ │ │ ├── evaluate_expression_handler.py
│ │ │ │ │ │ ├── initialize_executor_handler.py
│ │ │ │ │ │ ├── no_operation_handler.py
│ │ │ │ │ │ ├── open_executor_handler.py
│ │ │ │ │ │ ├── pause_worker_handler.py
│ │ │ │ │ │ ├── query_statistics_handler.py
│ │ │ │ │ │ ├── replay_current_tuple_handler.py
│ │ │ │ │ │ ├── resume_worker_handler.py
│ │ │ │ │ │ ├── start_channel_handler.py
│ │ │ │ │ │ ├── start_worker_handler.py
│ │ │ │ │ │ └── update_executor_handler.py
│ │ │ │ │ ├── managers/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── console_message_manager.py
│ │ │ │ │ │ ├── context.py
│ │ │ │ │ │ ├── debug_manager.py
│ │ │ │ │ │ ├── embedded_control_message_manager.py
│ │ │ │ │ │ ├── exception_manager.py
│ │ │ │ │ │ ├── executor_manager.py
│ │ │ │ │ │ ├── pause_manager.py
│ │ │ │ │ │ ├── state_manager.py
│ │ │ │ │ │ ├── state_processing_manager.py
│ │ │ │ │ │ ├── statistics_manager.py
│ │ │ │ │ │ └── tuple_processing_manager.py
│ │ │ │ │ ├── packaging/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── input_manager.py
│ │ │ │ │ │ └── output_manager.py
│ │ │ │ │ ├── rpc/
│ │ │ │ │ │ ├── async_rpc_client.py
│ │ │ │ │ │ ├── async_rpc_handler_initializer.py
│ │ │ │ │ │ └── async_rpc_server.py
│ │ │ │ │ └── sendsemantics/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── broad_cast_partitioner.py
│ │ │ │ │ ├── hash_based_shuffle_partitioner.py
│ │ │ │ │ ├── one_to_one_partitioner.py
│ │ │ │ │ ├── partitioner.py
│ │ │ │ │ ├── range_based_shuffle_partitioner.py
│ │ │ │ │ └── round_robin_partitioner.py
│ │ │ │ ├── models/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── batch.py
│ │ │ │ │ ├── internal_marker.py
│ │ │ │ │ ├── internal_queue.py
│ │ │ │ │ ├── operator.py
│ │ │ │ │ ├── payload.py
│ │ │ │ │ ├── schema/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── arrow_schema_utils.py
│ │ │ │ │ │ ├── attribute_type.py
│ │ │ │ │ │ ├── attribute_type_utils.py
│ │ │ │ │ │ ├── field.py
│ │ │ │ │ │ └── schema.py
│ │ │ │ │ ├── single_blocking_io.py
│ │ │ │ │ ├── state.py
│ │ │ │ │ ├── table.py
│ │ │ │ │ ├── tuple.py
│ │ │ │ │ └── type/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── large_binary.py
│ │ │ │ ├── proxy/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── proxy_client.py
│ │ │ │ │ └── proxy_server.py
│ │ │ │ ├── python_worker.py
│ │ │ │ ├── runnables/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── data_processor.py
│ │ │ │ │ ├── heartbeat.py
│ │ │ │ │ ├── main_loop.py
│ │ │ │ │ ├── network_receiver.py
│ │ │ │ │ └── network_sender.py
│ │ │ │ ├── storage/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── document_factory.py
│ │ │ │ │ ├── iceberg/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── iceberg_catalog_instance.py
│ │ │ │ │ │ ├── iceberg_document.py
│ │ │ │ │ │ ├── iceberg_table_writer.py
│ │ │ │ │ │ └── iceberg_utils.py
│ │ │ │ │ ├── model/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── buffered_item_writer.py
│ │ │ │ │ │ ├── readonly_virtual_document.py
│ │ │ │ │ │ └── virtual_document.py
│ │ │ │ │ ├── runnables/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── input_port_materialization_reader_runnable.py
│ │ │ │ │ │ └── port_storage_writer.py
│ │ │ │ │ ├── storage_config.py
│ │ │ │ │ └── vfs_uri_factory.py
│ │ │ │ └── util/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── atomic.py
│ │ │ │ ├── base_protocols.py
│ │ │ │ ├── buffer/
│ │ │ │ │ ├── buffer_base.py
│ │ │ │ │ └── timed_buffer.py
│ │ │ │ ├── console_message/
│ │ │ │ │ ├── replace_print.py
│ │ │ │ │ ├── timed_buffer.py
│ │ │ │ │ └── timestamp.py
│ │ │ │ ├── customized_queue/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── double_blocking_queue.py
│ │ │ │ │ ├── inner.py
│ │ │ │ │ ├── linked_blocking_multi_queue.py
│ │ │ │ │ └── queue_base.py
│ │ │ │ ├── expression_evaluator.py
│ │ │ │ ├── proto/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── runnable.py
│ │ │ │ ├── stoppable/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── stoppable.py
│ │ │ │ │ └── stoppable_queue_blocking_thread.py
│ │ │ │ └── virtual_identity.py
│ │ │ ├── proto/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── org/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── apache/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── texera/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── amber/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── core/
│ │ │ │ │ │ │ └── __init__.py
│ │ │ │ │ │ └── engine/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── architecture/
│ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ ├── rpc/
│ │ │ │ │ │ │ │ └── __init__.py
│ │ │ │ │ │ │ ├── sendsemantics/
│ │ │ │ │ │ │ │ └── __init__.py
│ │ │ │ │ │ │ └── worker/
│ │ │ │ │ │ │ └── __init__.py
│ │ │ │ │ │ └── common/
│ │ │ │ │ │ └── __init__.py
│ │ │ │ │ └── web/
│ │ │ │ │ └── __init__.py
│ │ │ │ └── scalapb/
│ │ │ │ └── __init__.py
│ │ │ ├── pyamber/
│ │ │ │ └── __init__.py
│ │ │ ├── pytexera/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── storage/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── dataset_file_document.py
│ │ │ │ │ ├── large_binary_input_stream.py
│ │ │ │ │ ├── large_binary_manager.py
│ │ │ │ │ └── large_binary_output_stream.py
│ │ │ │ └── udf/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── examples/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── count_batch_operator.py
│ │ │ │ │ ├── echo_operator.py
│ │ │ │ │ ├── echo_table_operator.py
│ │ │ │ │ ├── generator_operator_binary.py
│ │ │ │ │ ├── generator_operator_integer.py
│ │ │ │ │ ├── join_operator.py
│ │ │ │ │ └── rudf/
│ │ │ │ │ ├── r_table_operator.py
│ │ │ │ │ └── r_tuple_operator.py
│ │ │ │ └── udf_operator.py
│ │ │ └── texera_run_python_worker.py
│ │ ├── resources/
│ │ │ ├── cache.ccf
│ │ │ ├── computing-unit-master-config.yml
│ │ │ ├── logback.xml
│ │ │ ├── texera-compiling-service-web-config.yml
│ │ │ └── web-config.yml
│ │ └── scala/
│ │ └── org/
│ │ └── apache/
│ │ └── texera/
│ │ ├── amber/
│ │ │ ├── clustering/
│ │ │ │ ├── ClusterListener.scala
│ │ │ │ └── SingleNodeListener.scala
│ │ │ ├── engine/
│ │ │ │ ├── architecture/
│ │ │ │ │ ├── common/
│ │ │ │ │ │ ├── AmberProcessor.scala
│ │ │ │ │ │ ├── ExecutorDeployment.scala
│ │ │ │ │ │ ├── PekkoActorRefMappingService.scala
│ │ │ │ │ │ ├── PekkoActorService.scala
│ │ │ │ │ │ ├── PekkoMessageTransferService.scala
│ │ │ │ │ │ ├── ProcessingStepCursor.scala
│ │ │ │ │ │ └── WorkflowActor.scala
│ │ │ │ │ ├── controller/
│ │ │ │ │ │ ├── ClientEvent.scala
│ │ │ │ │ │ ├── Controller.scala
│ │ │ │ │ │ ├── ControllerAsyncRPCHandlerInitializer.scala
│ │ │ │ │ │ ├── ControllerProcessor.scala
│ │ │ │ │ │ ├── ControllerTimerService.scala
│ │ │ │ │ │ ├── GlobalReplayManager.scala
│ │ │ │ │ │ ├── Workflow.scala
│ │ │ │ │ │ ├── WorkflowScheduler.scala
│ │ │ │ │ │ ├── execution/
│ │ │ │ │ │ │ ├── ChannelExecution.scala
│ │ │ │ │ │ │ ├── ExecutionUtils.scala
│ │ │ │ │ │ │ ├── LinkExecution.scala
│ │ │ │ │ │ │ ├── OperatorExecution.scala
│ │ │ │ │ │ │ ├── RegionExecution.scala
│ │ │ │ │ │ │ ├── WorkerPortExecution.scala
│ │ │ │ │ │ │ └── WorkflowExecution.scala
│ │ │ │ │ │ └── promisehandlers/
│ │ │ │ │ │ ├── ConsoleMessageHandler.scala
│ │ │ │ │ │ ├── DebugCommandHandler.scala
│ │ │ │ │ │ ├── EmbeddedControlMessageHandler.scala
│ │ │ │ │ │ ├── EvaluatePythonExpressionHandler.scala
│ │ │ │ │ │ ├── JumpToOperatorRegionHandler.scala
│ │ │ │ │ │ ├── LinkWorkersHandler.scala
│ │ │ │ │ │ ├── PauseHandler.scala
│ │ │ │ │ │ ├── PortCompletedHandler.scala
│ │ │ │ │ │ ├── QueryWorkerStatisticsHandler.scala
│ │ │ │ │ │ ├── ReconfigurationHandler.scala
│ │ │ │ │ │ ├── ResumeHandler.scala
│ │ │ │ │ │ ├── RetrieveWorkflowStateHandler.scala
│ │ │ │ │ │ ├── RetryWorkflowHandler.scala
│ │ │ │ │ │ ├── StartWorkflowHandler.scala
│ │ │ │ │ │ ├── TakeGlobalCheckpointHandler.scala
│ │ │ │ │ │ ├── WorkerExecutionCompletedHandler.scala
│ │ │ │ │ │ └── WorkerStateUpdatedHandler.scala
│ │ │ │ │ ├── deploysemantics/
│ │ │ │ │ │ ├── AddressInfo.scala
│ │ │ │ │ │ ├── deploystrategy/
│ │ │ │ │ │ │ ├── DeployStrategy.scala
│ │ │ │ │ │ │ ├── OneOnEach.scala
│ │ │ │ │ │ │ ├── RandomDeployment.scala
│ │ │ │ │ │ │ └── RoundRobinDeployment.scala
│ │ │ │ │ │ └── layer/
│ │ │ │ │ │ └── WorkerExecution.scala
│ │ │ │ │ ├── logreplay/
│ │ │ │ │ │ ├── AsyncReplayLogWriter.scala
│ │ │ │ │ │ ├── EmptyReplayLogger.scala
│ │ │ │ │ │ ├── OrderEnforcer.scala
│ │ │ │ │ │ ├── ReplayLogGenerator.scala
│ │ │ │ │ │ ├── ReplayLogManager.scala
│ │ │ │ │ │ ├── ReplayLogger.scala
│ │ │ │ │ │ ├── ReplayLoggerImpl.scala
│ │ │ │ │ │ └── ReplayOrderEnforcer.scala
│ │ │ │ │ ├── messaginglayer/
│ │ │ │ │ │ ├── AmberFIFOChannel.scala
│ │ │ │ │ │ ├── CongestionControl.scala
│ │ │ │ │ │ ├── DeadLetterMonitorActor.scala
│ │ │ │ │ │ ├── FlowControl.scala
│ │ │ │ │ │ ├── InputGateway.scala
│ │ │ │ │ │ ├── InputManager.scala
│ │ │ │ │ │ ├── NetworkInputGateway.scala
│ │ │ │ │ │ ├── NetworkOutputGateway.scala
│ │ │ │ │ │ ├── OrderingEnforcer.scala
│ │ │ │ │ │ ├── OutputManager.scala
│ │ │ │ │ │ ├── WorkerPort.scala
│ │ │ │ │ │ └── WorkerTimerService.scala
│ │ │ │ │ ├── pythonworker/
│ │ │ │ │ │ ├── PythonProxyClient.scala
│ │ │ │ │ │ ├── PythonProxyServer.scala
│ │ │ │ │ │ ├── PythonWorkflowWorker.scala
│ │ │ │ │ │ └── WorkerBatchInternalQueue.scala
│ │ │ │ │ ├── scheduling/
│ │ │ │ │ │ ├── CostBasedScheduleGenerator.scala
│ │ │ │ │ │ ├── CostEstimator.scala
│ │ │ │ │ │ ├── ExpansionGreedyScheduleGenerator.scala
│ │ │ │ │ │ ├── Region.scala
│ │ │ │ │ │ ├── RegionExecutionCoordinator.scala
│ │ │ │ │ │ ├── RegionPlan.scala
│ │ │ │ │ │ ├── Schedule.scala
│ │ │ │ │ │ ├── ScheduleGenerator.scala
│ │ │ │ │ │ ├── SchedulingUtils.scala
│ │ │ │ │ │ ├── WorkflowExecutionCoordinator.scala
│ │ │ │ │ │ ├── config/
│ │ │ │ │ │ │ ├── ChannelConfig.scala
│ │ │ │ │ │ │ ├── LinkConfig.scala
│ │ │ │ │ │ │ ├── OperatorConfig.scala
│ │ │ │ │ │ │ ├── PortConfig.scala
│ │ │ │ │ │ │ ├── ResourceConfig.scala
│ │ │ │ │ │ │ └── WorkerConfig.scala
│ │ │ │ │ │ └── resourcePolicies/
│ │ │ │ │ │ ├── ExecutionClusterInfo.scala
│ │ │ │ │ │ └── ResourceAllocator.scala
│ │ │ │ │ ├── sendsemantics/
│ │ │ │ │ │ └── partitioners/
│ │ │ │ │ │ ├── BroadcastPartitioner.scala
│ │ │ │ │ │ ├── HashBasedShufflePartitioner.scala
│ │ │ │ │ │ ├── OneToOnePartitioner.scala
│ │ │ │ │ │ ├── Partitioner.scala
│ │ │ │ │ │ ├── RangeBasedShufflePartitioner.scala
│ │ │ │ │ │ └── RoundRobinPartitioner.scala
│ │ │ │ │ └── worker/
│ │ │ │ │ ├── DPThread.scala
│ │ │ │ │ ├── DataProcessor.scala
│ │ │ │ │ ├── DataProcessorRPCHandlerInitializer.scala
│ │ │ │ │ ├── EmbeddedControlMessageManager.scala
│ │ │ │ │ ├── PauseManager.scala
│ │ │ │ │ ├── PauseType.scala
│ │ │ │ │ ├── WorkflowWorker.scala
│ │ │ │ │ ├── managers/
│ │ │ │ │ │ ├── InputPortMaterializationReaderThread.scala
│ │ │ │ │ │ ├── OutputPortResultWriterThread.scala
│ │ │ │ │ │ ├── SerializationManager.scala
│ │ │ │ │ │ └── StatisticsManager.scala
│ │ │ │ │ └── promisehandlers/
│ │ │ │ │ ├── AddInputChannelHandler.scala
│ │ │ │ │ ├── AddPartitioningHandler.scala
│ │ │ │ │ ├── AssignPortHandler.scala
│ │ │ │ │ ├── EndChannelHandler.scala
│ │ │ │ │ ├── EndHandler.scala
│ │ │ │ │ ├── FinalizeCheckpointHandler.scala
│ │ │ │ │ ├── FlushNetworkBufferHandler.scala
│ │ │ │ │ ├── InitializeExecutorHandler.scala
│ │ │ │ │ ├── OpenExecutorHandler.scala
│ │ │ │ │ ├── PauseHandler.scala
│ │ │ │ │ ├── PrepareCheckpointHandler.scala
│ │ │ │ │ ├── QueryStatisticsHandler.scala
│ │ │ │ │ ├── ResumeHandler.scala
│ │ │ │ │ ├── RetrieveStateHandler.scala
│ │ │ │ │ ├── StartChannelHandler.scala
│ │ │ │ │ ├── StartHandler.scala
│ │ │ │ │ └── UpdateExecutorHandler.scala
│ │ │ │ └── common/
│ │ │ │ ├── AmberConfig.scala
│ │ │ │ ├── AmberKryoInitializer.scala
│ │ │ │ ├── AmberLogging.scala
│ │ │ │ ├── AmberRuntime.scala
│ │ │ │ ├── CheckpointState.scala
│ │ │ │ ├── CheckpointSupport.scala
│ │ │ │ ├── ElidableStatement.scala
│ │ │ │ ├── FriesReconfigurationAlgorithm.scala
│ │ │ │ ├── FutureBijection.scala
│ │ │ │ ├── SerializedState.scala
│ │ │ │ ├── Utils.scala
│ │ │ │ ├── ambermessage/
│ │ │ │ │ ├── DataPayload.scala
│ │ │ │ │ ├── DirectControlMessagePayload.scala
│ │ │ │ │ ├── RecoveryPayload.scala
│ │ │ │ │ ├── WorkflowFIFOMessagePayload.scala
│ │ │ │ │ └── WorkflowMessage.scala
│ │ │ │ ├── client/
│ │ │ │ │ ├── AmberClient.scala
│ │ │ │ │ └── ClientActor.scala
│ │ │ │ ├── rpc/
│ │ │ │ │ ├── AsyncRPCClient.scala
│ │ │ │ │ ├── AsyncRPCHandlerInitializer.scala
│ │ │ │ │ └── AsyncRPCServer.scala
│ │ │ │ ├── statetransition/
│ │ │ │ │ ├── StateManager.scala
│ │ │ │ │ └── WorkerStateManager.scala
│ │ │ │ ├── storage/
│ │ │ │ │ ├── EmptyRecordStorage.scala
│ │ │ │ │ ├── HDFSRecordStorage.scala
│ │ │ │ │ ├── SequentialRecordStorage.scala
│ │ │ │ │ └── VFSRecordStorage.scala
│ │ │ │ └── virtualidentity/
│ │ │ │ └── util.scala
│ │ │ └── error/
│ │ │ └── ErrorUtils.scala
│ │ ├── web/
│ │ │ ├── ComputingUnitMaster.scala
│ │ │ ├── ComputingUnitWorker.scala
│ │ │ ├── ServletAwareConfigurator.scala
│ │ │ ├── SessionState.scala
│ │ │ ├── SubscriptionManager.scala
│ │ │ ├── TexeraWebApplication.scala
│ │ │ ├── TexeraWebConfiguration.java
│ │ │ ├── WebsocketInput.scala
│ │ │ ├── WorkflowLifecycleManager.scala
│ │ │ ├── auth/
│ │ │ │ ├── GuestAuthFilter.scala
│ │ │ │ ├── JwtAuth.scala
│ │ │ │ ├── UserAuthenticator.scala
│ │ │ │ └── UserRoleAuthorizer.scala
│ │ │ ├── model/
│ │ │ │ ├── collab/
│ │ │ │ │ ├── event/
│ │ │ │ │ │ ├── CollabWebSocketEvent.scala
│ │ │ │ │ │ ├── CommandEvent.scala
│ │ │ │ │ │ ├── LockGrantedEvent.scala
│ │ │ │ │ │ ├── LockRejectedEvent.scala
│ │ │ │ │ │ ├── ReleaseLockEvent.scala
│ │ │ │ │ │ ├── RestoreVersionEvent.scala
│ │ │ │ │ │ └── WorkflowAccessEvent.scala
│ │ │ │ │ ├── request/
│ │ │ │ │ │ ├── AcquireLockRequest.scala
│ │ │ │ │ │ ├── CollabWebSocketRequest.scala
│ │ │ │ │ │ ├── CommandRequest.scala
│ │ │ │ │ │ ├── HeartBeatRequest.scala
│ │ │ │ │ │ ├── RestoreVersionRequest.scala
│ │ │ │ │ │ ├── TryLockRequest.scala
│ │ │ │ │ │ └── WIdRequest.scala
│ │ │ │ │ └── response/
│ │ │ │ │ └── HeartBeatResponse.scala
│ │ │ │ ├── common/
│ │ │ │ │ └── AccessEntry.scala
│ │ │ │ ├── http/
│ │ │ │ │ ├── request/
│ │ │ │ │ │ ├── auth/
│ │ │ │ │ │ │ ├── UserLoginRequest.scala
│ │ │ │ │ │ │ └── UserRegistrationRequest.scala
│ │ │ │ │ │ └── result/
│ │ │ │ │ │ └── ResultExportRequest.scala
│ │ │ │ │ └── response/
│ │ │ │ │ ├── SchemaPropagationResponse.scala
│ │ │ │ │ ├── TokenIssueResponse.scala
│ │ │ │ │ └── result/
│ │ │ │ │ └── ResultExportResponse.scala
│ │ │ │ └── websocket/
│ │ │ │ ├── event/
│ │ │ │ │ ├── CacheStatusUpdateEvent.scala
│ │ │ │ │ ├── ExecutionDurationUpdateEvent.scala
│ │ │ │ │ ├── ExecutionStatusEnum.scala
│ │ │ │ │ ├── OperatorStatisticsUpdateEvent.scala
│ │ │ │ │ ├── PaginatedResultEvent.scala
│ │ │ │ │ ├── RegionStateEvent.scala
│ │ │ │ │ ├── TexeraWebSocketEvent.scala
│ │ │ │ │ ├── WebResultUpdateEvent.scala
│ │ │ │ │ ├── WorkerAssignmentUpdateEvent.scala
│ │ │ │ │ ├── WorkflowAvailableResultEvent.scala
│ │ │ │ │ ├── WorkflowErrorEvent.scala
│ │ │ │ │ ├── WorkflowStateEvent.scala
│ │ │ │ │ └── python/
│ │ │ │ │ └── ConsoleUpdateEvent.scala
│ │ │ │ ├── request/
│ │ │ │ │ ├── EditingTimeCompilationRequest.scala
│ │ │ │ │ ├── HeartBeatRequest.scala
│ │ │ │ │ ├── ModifyLogicRequest.scala
│ │ │ │ │ ├── ResultPaginationRequest.scala
│ │ │ │ │ ├── RetryRequest.scala
│ │ │ │ │ ├── SkipTupleRequest.scala
│ │ │ │ │ ├── TexeraWebSocketRequest.scala
│ │ │ │ │ ├── WorkflowCheckpointRequest.scala
│ │ │ │ │ ├── WorkflowExecuteRequest.scala
│ │ │ │ │ ├── WorkflowKillRequest.scala
│ │ │ │ │ ├── WorkflowPauseRequest.scala
│ │ │ │ │ ├── WorkflowResumeRequest.scala
│ │ │ │ │ └── python/
│ │ │ │ │ ├── DebugCommandRequest.scala
│ │ │ │ │ └── PythonExpressionEvaluateRequest.scala
│ │ │ │ └── response/
│ │ │ │ ├── ClusterStatusUpdateEvent.scala
│ │ │ │ ├── HeartBeatResponse.scala
│ │ │ │ ├── ModifyLogicResponse.scala
│ │ │ │ ├── RegionUpdateEvent.scala
│ │ │ │ └── python/
│ │ │ │ └── PythonExpressionEvaluateResponse.scala
│ │ │ ├── resource/
│ │ │ │ ├── CollaborationResource.scala
│ │ │ │ ├── EmailTemplate.scala
│ │ │ │ ├── GmailResource.scala
│ │ │ │ ├── HealthCheckResource.scala
│ │ │ │ ├── MockKillWorkerResource.scala
│ │ │ │ ├── SuccessExecutionResult.scala
│ │ │ │ ├── SyncExecutionResource.scala
│ │ │ │ ├── SystemMetadataResource.scala
│ │ │ │ ├── UserConfigResource.scala
│ │ │ │ ├── WebsocketPayloadSizeTuner.scala
│ │ │ │ ├── WorkflowWebsocketResource.scala
│ │ │ │ ├── aiassistant/
│ │ │ │ │ ├── AiAssistantManager.scala
│ │ │ │ │ ├── AiAssistantResource.scala
│ │ │ │ │ ├── test_type_annotation_visitor.py
│ │ │ │ │ └── type_annotation_visitor.py
│ │ │ │ ├── auth/
│ │ │ │ │ ├── AuthResource.scala
│ │ │ │ │ └── GoogleAuthResource.scala
│ │ │ │ ├── dashboard/
│ │ │ │ │ ├── DashboardResource.scala
│ │ │ │ │ ├── DatasetSearchQueryBuilder.scala
│ │ │ │ │ ├── FulltextSearchQueryUtils.scala
│ │ │ │ │ ├── ProjectSearchQueryBuilder.scala
│ │ │ │ │ ├── SearchQueryBuilder.scala
│ │ │ │ │ ├── UnifiedResourceSchema.scala
│ │ │ │ │ ├── WorkflowSearchQueryBuilder.scala
│ │ │ │ │ ├── admin/
│ │ │ │ │ │ ├── execution/
│ │ │ │ │ │ │ └── AdminExecutionResource.scala
│ │ │ │ │ │ ├── settings/
│ │ │ │ │ │ │ └── AdminSettingsResource.scala
│ │ │ │ │ │ └── user/
│ │ │ │ │ │ └── AdminUserResource.scala
│ │ │ │ │ ├── hub/
│ │ │ │ │ │ ├── ActionType.scala
│ │ │ │ │ │ ├── EntityTables.scala
│ │ │ │ │ │ ├── EntityType.scala
│ │ │ │ │ │ └── HubResource.scala
│ │ │ │ │ └── user/
│ │ │ │ │ ├── UserResource.scala
│ │ │ │ │ ├── dataset/
│ │ │ │ │ │ ├── DatasetResource.scala
│ │ │ │ │ │ └── utils/
│ │ │ │ │ │ └── DatasetStatisticsUtils.scala
│ │ │ │ │ ├── project/
│ │ │ │ │ │ ├── ProjectAccessResource.scala
│ │ │ │ │ │ ├── ProjectResource.scala
│ │ │ │ │ │ └── PublicProjectResource.scala
│ │ │ │ │ ├── quota/
│ │ │ │ │ │ └── UserQuotaResource.scala
│ │ │ │ │ └── workflow/
│ │ │ │ │ ├── WorkflowAccessResource.scala
│ │ │ │ │ ├── WorkflowExecutionsResource.scala
│ │ │ │ │ ├── WorkflowResource.scala
│ │ │ │ │ └── WorkflowVersionResource.scala
│ │ │ │ └── pythonvirtualenvironment/
│ │ │ │ ├── PveManager.scala
│ │ │ │ ├── PveResource.scala
│ │ │ │ └── PveWebsocketResource.scala
│ │ │ ├── service/
│ │ │ │ ├── EmailNotificationService.scala
│ │ │ │ ├── ExecutionConsoleService.scala
│ │ │ │ ├── ExecutionReconfigurationService.scala
│ │ │ │ ├── ExecutionResultService.scala
│ │ │ │ ├── ExecutionRuntimeService.scala
│ │ │ │ ├── ExecutionStatsService.scala
│ │ │ │ ├── ExecutionsMetadataPersistService.scala
│ │ │ │ ├── ResultExportService.scala
│ │ │ │ ├── WorkflowEmailNotifier.scala
│ │ │ │ ├── WorkflowExecutionService.scala
│ │ │ │ └── WorkflowService.scala
│ │ │ └── storage/
│ │ │ ├── ExecutionReconfigurationStore.scala
│ │ │ ├── ExecutionStateStore.scala
│ │ │ ├── StateStore.scala
│ │ │ └── WorkflowStateStore.scala
│ │ └── workflow/
│ │ ├── LogicalLink.scala
│ │ ├── LogicalPlan.scala
│ │ └── WorkflowCompiler.scala
│ └── test/
│ ├── integration/
│ │ └── org/
│ │ └── apache/
│ │ └── texera/
│ │ └── amber/
│ │ ├── engine/
│ │ │ └── e2e/
│ │ │ └── ReconfigurationIntegrationSpec.scala
│ │ ├── storage/
│ │ │ └── iceberg/
│ │ │ └── IcebergRestCatalogIntegrationSpec.scala
│ │ └── tags/
│ │ └── IntegrationTest.java
│ ├── java/
│ │ └── org/
│ │ └── apache/
│ │ └── texera/
│ │ └── web/
│ │ └── resource/
│ │ └── dashboard/
│ │ └── user/
│ │ └── dataset/
│ │ └── GitVersionControlLocalFileStorageSpec.java
│ ├── python/
│ │ ├── core/
│ │ │ ├── architecture/
│ │ │ │ ├── handlers/
│ │ │ │ │ └── control/
│ │ │ │ │ ├── test_debug_command_handler.py
│ │ │ │ │ ├── test_evaluate_expression_handler.py
│ │ │ │ │ ├── test_replay_current_tuple_handler.py
│ │ │ │ │ └── test_update_executor_handler.py
│ │ │ │ ├── managers/
│ │ │ │ │ ├── test_console_message_manager.py
│ │ │ │ │ ├── test_debug_manager.py
│ │ │ │ │ ├── test_embedded_control_message_manager.py
│ │ │ │ │ ├── test_exception_manager.py
│ │ │ │ │ ├── test_executor_manager.py
│ │ │ │ │ ├── test_pause_manager.py
│ │ │ │ │ ├── test_state_manager.py
│ │ │ │ │ ├── test_state_processing_manager.py
│ │ │ │ │ ├── test_statistics_manager.py
│ │ │ │ │ └── test_tuple_processing_manager.py
│ │ │ │ ├── rpc/
│ │ │ │ │ └── test_async_rpc_client.py
│ │ │ │ └── sendsemantics/
│ │ │ │ └── test_partitioners.py
│ │ │ ├── models/
│ │ │ │ ├── schema/
│ │ │ │ │ └── test_schema.py
│ │ │ │ ├── test_operator.py
│ │ │ │ ├── test_state.py
│ │ │ │ ├── test_table.py
│ │ │ │ ├── test_tuple.py
│ │ │ │ └── type/
│ │ │ │ └── test_large_binary.py
│ │ │ ├── proxy/
│ │ │ │ ├── test_proxy_client.py
│ │ │ │ └── test_proxy_server.py
│ │ │ ├── runnables/
│ │ │ │ ├── test_console_message.py
│ │ │ │ ├── test_data_processor.py
│ │ │ │ ├── test_heartbeat.py
│ │ │ │ ├── test_main_loop.py
│ │ │ │ ├── test_network_receiver.py
│ │ │ │ └── test_network_sender.py
│ │ │ ├── storage/
│ │ │ │ └── iceberg/
│ │ │ │ ├── test_iceberg_document.py
│ │ │ │ ├── test_iceberg_rest_catalog_integration.py
│ │ │ │ ├── test_iceberg_utils_catalog.py
│ │ │ │ └── test_iceberg_utils_large_binary.py
│ │ │ ├── test_python_worker.py
│ │ │ └── util/
│ │ │ ├── console_message/
│ │ │ │ └── test_replace_print.py
│ │ │ ├── customized_queue/
│ │ │ │ ├── test_inner.py
│ │ │ │ └── test_linked_blocking_multi_queue.py
│ │ │ ├── test_atomic.py
│ │ │ ├── test_expression_evaluator.py
│ │ │ └── test_virtual_identity.py
│ │ └── pytexera/
│ │ ├── storage/
│ │ │ ├── test_dataset_file_document.py
│ │ │ ├── test_large_binary_input_stream.py
│ │ │ ├── test_large_binary_manager.py
│ │ │ └── test_large_binary_output_stream.py
│ │ └── udf/
│ │ └── examples/
│ │ ├── test_count_batch_operator.py
│ │ ├── test_echo_operator.py
│ │ ├── test_echo_table_operator.py
│ │ ├── test_generator_operator_binary.py
│ │ └── test_generator_operator_integer.py
│ └── scala/
│ └── org/
│ └── apache/
│ └── texera/
│ ├── amber/
│ │ ├── engine/
│ │ │ ├── architecture/
│ │ │ │ ├── common/
│ │ │ │ │ └── ProcessingStepCursorSpec.scala
│ │ │ │ ├── control/
│ │ │ │ │ ├── TrivialControlSpec.scala
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── ChainHandler.scala
│ │ │ │ │ ├── CollectHandler.scala
│ │ │ │ │ ├── ErrorHandler.scala
│ │ │ │ │ ├── MultiCallHandler.scala
│ │ │ │ │ ├── NestedHandler.scala
│ │ │ │ │ ├── PingPongHandler.scala
│ │ │ │ │ ├── RecursionHandler.scala
│ │ │ │ │ ├── TesterAsyncRPCHandlerInitializer.scala
│ │ │ │ │ └── TrivialControlTester.scala
│ │ │ │ ├── controller/
│ │ │ │ │ ├── ControllerSpec.scala
│ │ │ │ │ ├── GlobalReplayManagerSpec.scala
│ │ │ │ │ ├── WorkflowSchedulerSpec.scala
│ │ │ │ │ └── execution/
│ │ │ │ │ ├── ExecutionUtilsSpec.scala
│ │ │ │ │ ├── LinkExecutionSpec.scala
│ │ │ │ │ ├── WorkerPortExecutionSpec.scala
│ │ │ │ │ └── WorkflowExecutionSpec.scala
│ │ │ │ ├── deploysemantics/
│ │ │ │ │ ├── AddressInfoSpec.scala
│ │ │ │ │ ├── deploystrategy/
│ │ │ │ │ │ └── DeployStrategiesSpec.scala
│ │ │ │ │ └── layer/
│ │ │ │ │ └── WorkerExecutionSpec.scala
│ │ │ │ ├── logreplay/
│ │ │ │ │ ├── EmptyReplayLogManagerImplSpec.scala
│ │ │ │ │ └── LogreplayPrimitivesSpec.scala
│ │ │ │ ├── messaginglayer/
│ │ │ │ │ ├── AmberFIFOChannelSpec.scala
│ │ │ │ │ ├── CongestionControlSpec.scala
│ │ │ │ │ ├── FlowControlSpec.scala
│ │ │ │ │ ├── NetworkInputGatewaySpec.scala
│ │ │ │ │ ├── OrderingEnforcerSpec.scala
│ │ │ │ │ ├── OutputManagerSpec.scala
│ │ │ │ │ ├── RangeBasedShuffleSpec.scala
│ │ │ │ │ └── WorkerPortSpec.scala
│ │ │ │ ├── pythonworker/
│ │ │ │ │ └── PythonWorkflowWorkerSpec.scala
│ │ │ │ ├── scheduling/
│ │ │ │ │ ├── CostBasedScheduleGeneratorSpec.scala
│ │ │ │ │ ├── DefaultCostEstimatorSpec.scala
│ │ │ │ │ ├── ExpansionGreedyScheduleGeneratorSpec.scala
│ │ │ │ │ ├── RegionCoordinatorTestSupport.scala
│ │ │ │ │ ├── RegionExecutionCoordinatorSpec.scala
│ │ │ │ │ ├── RegionPlanSpec.scala
│ │ │ │ │ ├── RegionSpec.scala
│ │ │ │ │ ├── ScheduleSpec.scala
│ │ │ │ │ ├── SchedulingUtilsSpec.scala
│ │ │ │ │ ├── WorkflowExecutionCoordinatorSpec.scala
│ │ │ │ │ ├── config/
│ │ │ │ │ │ ├── ChannelConfigSpec.scala
│ │ │ │ │ │ ├── LinkConfigSpec.scala
│ │ │ │ │ │ └── SchedulingConfigsSpec.scala
│ │ │ │ │ └── resourcePolicies/
│ │ │ │ │ └── ResourcePoliciesSpec.scala
│ │ │ │ ├── sendsemantics/
│ │ │ │ │ └── partitioners/
│ │ │ │ │ ├── NetworkOutputBufferSpec.scala
│ │ │ │ │ └── PartitionersSpec.scala
│ │ │ │ └── worker/
│ │ │ │ ├── DPThreadSpec.scala
│ │ │ │ ├── DataProcessorSpec.scala
│ │ │ │ ├── PauseTypeSpec.scala
│ │ │ │ ├── WorkerSpec.scala
│ │ │ │ ├── managers/
│ │ │ │ │ ├── OutputPortResultWriterThreadSpec.scala
│ │ │ │ │ └── WorkerManagersSpec.scala
│ │ │ │ └── promisehandlers/
│ │ │ │ └── EndHandlerSpec.scala
│ │ │ ├── common/
│ │ │ │ ├── CheckpointSubsystemSpec.scala
│ │ │ │ ├── UtilsSpec.scala
│ │ │ │ ├── ambermessage/
│ │ │ │ │ ├── AmberMessageEnvelopesSpec.scala
│ │ │ │ │ └── DataPayloadSpec.scala
│ │ │ │ └── statetransition/
│ │ │ │ ├── StateManagerSpec.scala
│ │ │ │ └── WorkerStateManagerSpec.scala
│ │ │ ├── e2e/
│ │ │ │ ├── BatchSizePropagationSpec.scala
│ │ │ │ ├── DataProcessingSpec.scala
│ │ │ │ ├── PauseSpec.scala
│ │ │ │ ├── ReconfigurationSpec.scala
│ │ │ │ └── TestUtils.scala
│ │ │ └── faulttolerance/
│ │ │ ├── CheckpointSpec.scala
│ │ │ ├── LoggingSpec.scala
│ │ │ └── ReplaySpec.scala
│ │ └── error/
│ │ └── ErrorUtilsSpec.scala
│ ├── web/
│ │ ├── auth/
│ │ │ └── UserAuthenticatorSpec.scala
│ │ ├── resource/
│ │ │ ├── dashboard/
│ │ │ │ ├── file/
│ │ │ │ │ └── WorkflowResourceSpec.scala
│ │ │ │ └── user/
│ │ │ │ └── workflow/
│ │ │ │ ├── WorkflowAccessResourceSpec.scala
│ │ │ │ ├── WorkflowExecutionsResourceSpec.scala
│ │ │ │ └── WorkflowVersionResourceSpec.scala
│ │ │ └── pythonvirtualenvironment/
│ │ │ └── PveResourceSpec.scala
│ │ └── service/
│ │ ├── ExecutionConsoleServiceSpec.scala
│ │ ├── ExecutionReconfigurationServiceSpec.scala
│ │ └── ExecutionResultServiceSpec.scala
│ └── workflow/
│ ├── WorkflowCompilerSpec.scala
│ └── common/
│ └── storage/
│ └── ReadonlyLocalFileDocumentSpec.scala
├── bin/
│ ├── .htaccess
│ ├── README.md
│ ├── access-control-service.dockerfile
│ ├── add-computing-unit-worker.sh
│ ├── agent-service.dockerfile
│ ├── bootstrap-lakekeeper.sh
│ ├── build-images.sh
│ ├── build-services.sh
│ ├── build.sh
│ ├── computing-unit-managing-service.sh
│ ├── computing-unit-master.dockerfile
│ ├── computing-unit-worker.dockerfile
│ ├── config-service.dockerfile
│ ├── config-service.sh
│ ├── config.php
│ ├── cron-restart-crashed-worker.sh
│ ├── deploy-daemon.sh
│ ├── deploy-docker.sh
│ ├── file-service.dockerfile
│ ├── file-service.sh
│ ├── fix-format.sh
│ ├── forum/
│ │ ├── flarum.sql
│ │ ├── macos-install.sh
│ │ ├── start-flarum.sh
│ │ └── ubuntu-install.sh
│ ├── frontend-dev.sh
│ ├── frontend-proto-gen.sh
│ ├── frontend.sh
│ ├── install-nltk.sh
│ ├── k8s/
│ │ ├── Chart.yaml
│ │ ├── README.md
│ │ ├── templates/
│ │ │ ├── access-control-service-deployment.yaml
│ │ │ ├── access-control-service-service.yaml
│ │ │ ├── config-service-deployment.yaml
│ │ │ ├── config-service-service.yaml
│ │ │ ├── example-data-loader-job.yaml
│ │ │ ├── external-names.yaml
│ │ │ ├── file-service-deployment.yaml
│ │ │ ├── file-service-service.yaml
│ │ │ ├── gateway-backend.yaml
│ │ │ ├── gateway-routes.yaml
│ │ │ ├── gateway-security-policy.yaml
│ │ │ ├── gateway.yaml
│ │ │ ├── lakefs-secret.yaml
│ │ │ ├── lakefs-setup-job.yaml
│ │ │ ├── minio-persistence.yaml
│ │ │ ├── postgresql-init-script-config.yaml
│ │ │ ├── postgresql-persistence.yaml
│ │ │ ├── pylsp.yaml
│ │ │ ├── shared-editing-server.yaml
│ │ │ ├── webserver-deployment.yaml
│ │ │ ├── webserver-service.yaml
│ │ │ ├── workflow-compiling-service-deployment.yaml
│ │ │ ├── workflow-compiling-service-service.yaml
│ │ │ ├── workflow-computing-unit-manager-deployment.yaml
│ │ │ ├── workflow-computing-unit-manager-service-account.yaml
│ │ │ ├── workflow-computing-unit-manager-service.yaml
│ │ │ ├── workflow-computing-unit-master-prepull-daemonset.yaml
│ │ │ ├── workflow-computing-unit-resource-quota.yaml
│ │ │ ├── workflow-computing-units-namespace.yaml
│ │ │ └── workflow-computing-units-service.yaml
│ │ ├── values-development.yaml
│ │ └── values.yaml
│ ├── licensing/
│ │ ├── audit_jar_licenses.py
│ │ ├── check_binary_deps.py
│ │ ├── concat_license_binary.py
│ │ └── test_check_binary_deps.py
│ ├── litellm-config.yaml
│ ├── merge-image-tags.sh
│ ├── pylsp/
│ │ ├── Dockerfile
│ │ ├── python-language-server.yaml
│ │ └── run_pylsp.sh
│ ├── python-language-service.sh
│ ├── python-proto-gen.sh
│ ├── server.sh
│ ├── shared-editing-server.sh
│ ├── single-node/
│ │ ├── DISCLAIMER
│ │ ├── LICENSE
│ │ ├── NOTICE
│ │ ├── README.md
│ │ ├── docker-compose.yml
│ │ ├── examples/
│ │ │ ├── datasets/
│ │ │ │ ├── iris-species/
│ │ │ │ │ ├── Iris.csv
│ │ │ │ │ └── description.txt
│ │ │ │ └── popular-movies-of-imdb/
│ │ │ │ ├── TMDb_updated.csv
│ │ │ │ └── description.txt
│ │ │ ├── load-examples.sh
│ │ │ └── workflows/
│ │ │ ├── [Example] Data Exploration on Movies Dataset.json
│ │ │ └── [Example] Machine Learning on Iris Dataset.json
│ │ ├── litellm-config.yaml
│ │ └── nginx.conf
│ ├── terminate-daemon.sh
│ ├── texera-web-application.dockerfile
│ ├── utils/
│ │ ├── resolve-texera-home.sh
│ │ └── texera-logging.sh
│ ├── workflow-compiling-service.dockerfile
│ ├── workflow-compiling-service.sh
│ ├── workflow-computing-unit-managing-service.dockerfile
│ ├── workflow-computing-unit.sh
│ └── y-websocket-server/
│ ├── Dockerfile
│ └── package.json
├── build.sbt
├── codecov.yml
├── common/
│ ├── auth/
│ │ ├── build.sbt
│ │ └── src/
│ │ ├── main/
│ │ │ └── scala/
│ │ │ └── org/
│ │ │ └── apache/
│ │ │ └── texera/
│ │ │ └── auth/
│ │ │ ├── JwtAuth.scala
│ │ │ ├── JwtAuthFilter.scala
│ │ │ ├── JwtParser.scala
│ │ │ ├── RequestLoggingFilter.scala
│ │ │ ├── SessionUser.scala
│ │ │ ├── UserActivityTracker.scala
│ │ │ └── util/
│ │ │ ├── ComputingUnitAccess.scala
│ │ │ └── HeaderField.scala
│ │ └── test/
│ │ └── scala/
│ │ └── org/
│ │ └── apache/
│ │ └── texera/
│ │ └── auth/
│ │ ├── JwtParserSpec.scala
│ │ └── UserActivityTrackerSpec.scala
│ ├── config/
│ │ ├── build.sbt
│ │ └── src/
│ │ └── main/
│ │ ├── resources/
│ │ │ ├── application.conf
│ │ │ ├── auth.conf
│ │ │ ├── cluster.conf
│ │ │ ├── computing-unit.conf
│ │ │ ├── default.conf
│ │ │ ├── gui.conf
│ │ │ ├── kubernetes.conf
│ │ │ ├── llm.conf
│ │ │ ├── storage.conf
│ │ │ ├── udf.conf
│ │ │ └── user-system.conf
│ │ └── scala/
│ │ └── org/
│ │ └── apache/
│ │ └── texera/
│ │ ├── amber/
│ │ │ ├── config/
│ │ │ │ ├── ApplicationConfig.scala
│ │ │ │ ├── EnvironmentalVariable.scala
│ │ │ │ ├── PekkoConfig.scala
│ │ │ │ ├── PythonUtils.scala
│ │ │ │ ├── StorageConfig.scala
│ │ │ │ └── UdfConfig.scala
│ │ │ └── util/
│ │ │ └── ConfigParserUtil.scala
│ │ └── config/
│ │ ├── AuthConfig.scala
│ │ ├── ComputingUnitConfig.scala
│ │ ├── DefaultsConfig.scala
│ │ ├── GuiConfig.scala
│ │ ├── KubernetesConfig.scala
│ │ ├── LLMConfig.scala
│ │ └── UserSystemConfig.scala
│ ├── dao/
│ │ ├── .gitignore
│ │ ├── build.sbt
│ │ └── src/
│ │ ├── main/
│ │ │ ├── resources/
│ │ │ │ └── jooq-conf.xml
│ │ │ └── scala/
│ │ │ └── org/
│ │ │ └── apache/
│ │ │ └── texera/
│ │ │ └── dao/
│ │ │ ├── SiteSettings.scala
│ │ │ └── SqlServer.scala
│ │ └── test/
│ │ └── scala/
│ │ └── org/
│ │ └── apache/
│ │ └── texera/
│ │ └── dao/
│ │ ├── MockTexeraDB.scala
│ │ └── SiteSettingsSpec.scala
│ ├── pybuilder/
│ │ ├── build.sbt
│ │ └── src/
│ │ ├── main/
│ │ │ └── scala/
│ │ │ └── org/
│ │ │ └── apache/
│ │ │ └── texera/
│ │ │ └── amber/
│ │ │ └── pybuilder/
│ │ │ ├── BoundaryValidator.scala
│ │ │ ├── EncodableInspector.scala
│ │ │ ├── EncodableStringAnnotation.java
│ │ │ ├── PythonLexerUtils.scala
│ │ │ └── PythonTemplateBuilder.scala
│ │ └── test/
│ │ └── scala/
│ │ └── org/
│ │ └── apache/
│ │ └── texera/
│ │ └── amber/
│ │ └── pybuilder/
│ │ ├── PythonLexerUtilsSpec.scala
│ │ ├── PythonTemplateBuilderApiSpec.scala
│ │ └── PythonTemplateBuilderSpec.scala
│ ├── workflow-core/
│ │ ├── build.sbt
│ │ └── src/
│ │ ├── main/
│ │ │ ├── protobuf/
│ │ │ │ ├── org/
│ │ │ │ │ └── apache/
│ │ │ │ │ └── texera/
│ │ │ │ │ └── amber/
│ │ │ │ │ └── core/
│ │ │ │ │ ├── executor.proto
│ │ │ │ │ ├── virtualidentity.proto
│ │ │ │ │ ├── workflow.proto
│ │ │ │ │ └── workflowruntimestate.proto
│ │ │ │ └── scalapb/
│ │ │ │ └── scalapb.proto
│ │ │ └── scala/
│ │ │ └── org/
│ │ │ └── apache/
│ │ │ └── texera/
│ │ │ ├── amber/
│ │ │ │ ├── core/
│ │ │ │ │ ├── WorkflowRuntimeException.scala
│ │ │ │ │ ├── executor/
│ │ │ │ │ │ ├── ExecFactory.scala
│ │ │ │ │ │ ├── JavaRuntimeCompilation.scala
│ │ │ │ │ │ ├── OperatorExecutor.scala
│ │ │ │ │ │ └── SourceOperatorExecutor.scala
│ │ │ │ │ ├── state/
│ │ │ │ │ │ └── State.scala
│ │ │ │ │ ├── storage/
│ │ │ │ │ │ ├── DocumentFactory.scala
│ │ │ │ │ │ ├── FileResolver.scala
│ │ │ │ │ │ ├── IcebergCatalogInstance.scala
│ │ │ │ │ │ ├── VFSURIFactory.scala
│ │ │ │ │ │ ├── model/
│ │ │ │ │ │ │ ├── BufferedItemWriter.scala
│ │ │ │ │ │ │ ├── DatasetFileDocument.scala
│ │ │ │ │ │ │ ├── OnDataset.scala
│ │ │ │ │ │ │ ├── ReadonlyLocalFileDocument.scala
│ │ │ │ │ │ │ ├── ReadonlyVirtualDocument.scala
│ │ │ │ │ │ │ ├── VirtualCollection.scala
│ │ │ │ │ │ │ └── VirtualDocument.scala
│ │ │ │ │ │ ├── result/
│ │ │ │ │ │ │ ├── ResultSchema.scala
│ │ │ │ │ │ │ ├── WorkflowResultStore.scala
│ │ │ │ │ │ │ └── iceberg/
│ │ │ │ │ │ │ ├── IcebergDocument.scala
│ │ │ │ │ │ │ ├── IcebergTableWriter.scala
│ │ │ │ │ │ │ └── OnIceberg.scala
│ │ │ │ │ │ └── util/
│ │ │ │ │ │ ├── LakeFSStorageClient.scala
│ │ │ │ │ │ ├── StorageUtil.scala
│ │ │ │ │ │ └── dataset/
│ │ │ │ │ │ ├── GitVersionControlLocalFileStorage.java
│ │ │ │ │ │ ├── JGitVersionControl.java
│ │ │ │ │ │ └── PhysicalFileNode.java
│ │ │ │ │ ├── tuple/
│ │ │ │ │ │ ├── Attribute.java
│ │ │ │ │ │ ├── AttributeType.java
│ │ │ │ │ │ ├── AttributeTypeUtils.scala
│ │ │ │ │ │ ├── LargeBinary.java
│ │ │ │ │ │ ├── Schema.scala
│ │ │ │ │ │ ├── Tuple.scala
│ │ │ │ │ │ ├── TupleLike.scala
│ │ │ │ │ │ └── TupleUtils.scala
│ │ │ │ │ └── workflow/
│ │ │ │ │ ├── ExecutionMode.java
│ │ │ │ │ ├── LocationPreference.scala
│ │ │ │ │ ├── PartitionInfo.scala
│ │ │ │ │ ├── PhysicalOp.scala
│ │ │ │ │ ├── PhysicalPlan.scala
│ │ │ │ │ ├── WorkflowContext.scala
│ │ │ │ │ └── WorkflowSettings.scala
│ │ │ │ └── util/
│ │ │ │ ├── ArrowUtils.scala
│ │ │ │ ├── IcebergUtil.scala
│ │ │ │ ├── JSONUtils.scala
│ │ │ │ ├── VirtualIdentityUtils.scala
│ │ │ │ └── serde/
│ │ │ │ ├── GlobalPortIdentitySerde.scala
│ │ │ │ ├── PortIdentityKeyDeserializer.scala
│ │ │ │ └── PortIdentityKeySerializer.scala
│ │ │ └── service/
│ │ │ └── util/
│ │ │ ├── LargeBinaryInputStream.scala
│ │ │ ├── LargeBinaryManager.scala
│ │ │ ├── LargeBinaryOutputStream.scala
│ │ │ └── S3StorageClient.scala
│ │ └── test/
│ │ ├── resources/
│ │ │ ├── country_sales_small.csv
│ │ │ └── datasets/
│ │ │ └── 1/
│ │ │ ├── directory/
│ │ │ │ └── a.csv
│ │ │ └── random_data.csv
│ │ └── scala/
│ │ └── org/
│ │ └── apache/
│ │ └── texera/
│ │ ├── amber/
│ │ │ ├── core/
│ │ │ │ ├── WorkflowRuntimeExceptionSpec.scala
│ │ │ │ ├── executor/
│ │ │ │ │ └── CoreExecutorReflectionSpec.scala
│ │ │ │ ├── state/
│ │ │ │ │ └── StateSpec.scala
│ │ │ │ ├── storage/
│ │ │ │ │ ├── VFSURIFactorySpec.scala
│ │ │ │ │ ├── model/
│ │ │ │ │ │ └── VirtualDocumentSpec.scala
│ │ │ │ │ └── util/
│ │ │ │ │ └── StorageUtilSpec.scala
│ │ │ │ ├── tuple/
│ │ │ │ │ ├── AttributeTypeUtilsSpec.scala
│ │ │ │ │ ├── InternalMarkerSpec.scala
│ │ │ │ │ ├── SchemaSpec.scala
│ │ │ │ │ ├── TupleSpec.scala
│ │ │ │ │ └── TupleUtilsSpec.scala
│ │ │ │ └── workflow/
│ │ │ │ ├── PartitionInfoSpec.scala
│ │ │ │ ├── WorkflowContextSpec.scala
│ │ │ │ └── WorkflowCoreTypesSpec.scala
│ │ │ ├── storage/
│ │ │ │ ├── FileResolverSpec.scala
│ │ │ │ └── result/
│ │ │ │ └── iceberg/
│ │ │ │ ├── IcebergDocumentConsoleMessagesSpec.scala
│ │ │ │ ├── IcebergDocumentSpec.scala
│ │ │ │ └── IcebergTableStatsSpec.scala
│ │ │ └── util/
│ │ │ ├── ArrowUtilsSpec.scala
│ │ │ ├── IcebergUtilSpec.scala
│ │ │ ├── JSONUtilsSpec.scala
│ │ │ └── VirtualIdentityUtilsSpec.scala
│ │ └── service/
│ │ └── util/
│ │ ├── LargeBinaryInputStreamSpec.scala
│ │ ├── LargeBinaryManagerSpec.scala
│ │ ├── LargeBinaryOutputStreamSpec.scala
│ │ ├── S3StorageClientSpec.scala
│ │ └── S3StorageTestBase.scala
│ └── workflow-operator/
│ ├── build.sbt
│ ├── project/
│ │ └── build.properties
│ └── src/
│ ├── main/
│ │ └── scala/
│ │ ├── com/
│ │ │ └── kjetland/
│ │ │ └── jackson/
│ │ │ └── jsonSchema/
│ │ │ ├── JsonSchemaDraft.java
│ │ │ ├── JsonSchemaGenerator.scala
│ │ │ └── annotations/
│ │ │ ├── JsonSchemaArrayWithUniqueItems.java
│ │ │ ├── JsonSchemaBool.java
│ │ │ ├── JsonSchemaDefault.java
│ │ │ ├── JsonSchemaDescription.java
│ │ │ ├── JsonSchemaExamples.java
│ │ │ ├── JsonSchemaFormat.java
│ │ │ ├── JsonSchemaInject.java
│ │ │ ├── JsonSchemaInt.java
│ │ │ ├── JsonSchemaOptions.java
│ │ │ ├── JsonSchemaString.java
│ │ │ └── JsonSchemaTitle.java
│ │ └── org/
│ │ └── apache/
│ │ └── texera/
│ │ └── amber/
│ │ ├── operator/
│ │ │ ├── DummyProperties.scala
│ │ │ ├── LogicalOp.scala
│ │ │ ├── PortDescriptor.scala
│ │ │ ├── PythonOperatorDescriptor.scala
│ │ │ ├── SpecialPhysicalOpFactory.scala
│ │ │ ├── TestOperators.scala
│ │ │ ├── aggregate/
│ │ │ │ ├── AggregateOpDesc.scala
│ │ │ │ ├── AggregateOpExec.scala
│ │ │ │ ├── AggregationFunction.java
│ │ │ │ ├── AggregationOperation.scala
│ │ │ │ └── DistributedAggregation.scala
│ │ │ ├── cartesianProduct/
│ │ │ │ ├── CartesianProductOpDesc.scala
│ │ │ │ └── CartesianProductOpExec.scala
│ │ │ ├── dictionary/
│ │ │ │ ├── DictionaryMatcherOpDesc.scala
│ │ │ │ ├── DictionaryMatcherOpExec.scala
│ │ │ │ └── MatchingType.java
│ │ │ ├── difference/
│ │ │ │ ├── DifferenceOpDesc.scala
│ │ │ │ └── DifferenceOpExec.scala
│ │ │ ├── distinct/
│ │ │ │ ├── DistinctOpDesc.scala
│ │ │ │ └── DistinctOpExec.scala
│ │ │ ├── dummy/
│ │ │ │ └── DummyOpDesc.scala
│ │ │ ├── filter/
│ │ │ │ ├── ComparisonType.java
│ │ │ │ ├── FilterOpDesc.scala
│ │ │ │ ├── FilterOpExec.scala
│ │ │ │ ├── FilterPredicate.java
│ │ │ │ ├── SpecializedFilterOpDesc.scala
│ │ │ │ └── SpecializedFilterOpExec.scala
│ │ │ ├── flatmap/
│ │ │ │ ├── FlatMapOpDesc.scala
│ │ │ │ └── FlatMapOpExec.scala
│ │ │ ├── hashJoin/
│ │ │ │ ├── HashJoinBuildOpExec.scala
│ │ │ │ ├── HashJoinOpDesc.scala
│ │ │ │ ├── HashJoinProbeOpExec.scala
│ │ │ │ └── JoinType.java
│ │ │ ├── huggingFace/
│ │ │ │ ├── HuggingFaceIrisLogisticRegressionOpDesc.scala
│ │ │ │ ├── HuggingFaceSentimentAnalysisOpDesc.scala
│ │ │ │ ├── HuggingFaceSpamSMSDetectionOpDesc.scala
│ │ │ │ └── HuggingFaceTextSummarizationOpDesc.scala
│ │ │ ├── ifStatement/
│ │ │ │ ├── IfOpDesc.scala
│ │ │ │ └── IfOpExec.scala
│ │ │ ├── intersect/
│ │ │ │ ├── IntersectOpDesc.scala
│ │ │ │ └── IntersectOpExec.scala
│ │ │ ├── intervalJoin/
│ │ │ │ ├── IntervalJoinOpDesc.scala
│ │ │ │ ├── IntervalJoinOpExec.scala
│ │ │ │ └── TimeIntervalType.java
│ │ │ ├── keywordSearch/
│ │ │ │ ├── KeywordSearchOpDesc.scala
│ │ │ │ └── KeywordSearchOpExec.scala
│ │ │ ├── limit/
│ │ │ │ ├── LimitOpDesc.scala
│ │ │ │ └── LimitOpExec.scala
│ │ │ ├── machineLearning/
│ │ │ │ ├── Scorer/
│ │ │ │ │ ├── MachineLearningScorerOpDesc.scala
│ │ │ │ │ ├── classificationMetricsFnc.java
│ │ │ │ │ └── regressionMetricsFnc.java
│ │ │ │ └── sklearnAdvanced/
│ │ │ │ ├── KNNTrainer/
│ │ │ │ │ ├── SklearnAdvancedKNNClassifierTrainerOpDesc.scala
│ │ │ │ │ ├── SklearnAdvancedKNNParameters.java
│ │ │ │ │ └── SklearnAdvancedKNNRegressorTrainerOpDesc.scala
│ │ │ │ ├── SVCTrainer/
│ │ │ │ │ ├── SklearnAdvancedSVCParameters.java
│ │ │ │ │ └── SklearnAdvancedSVCTrainerOpDesc.scala
│ │ │ │ ├── SVRTrainer/
│ │ │ │ │ ├── SklearnAdvancedSVRParameters.java
│ │ │ │ │ └── SklearnAdvancedSVRTrainerOpDesc.scala
│ │ │ │ └── base/
│ │ │ │ ├── HyperParameters.scala
│ │ │ │ └── SklearnAdvancedBaseDesc.scala
│ │ │ ├── map/
│ │ │ │ ├── MapOpDesc.scala
│ │ │ │ └── MapOpExec.scala
│ │ │ ├── metadata/
│ │ │ │ ├── OPVersion.java
│ │ │ │ ├── OperatorGroupConstants.scala
│ │ │ │ ├── OperatorMetadataGenerator.scala
│ │ │ │ ├── PropertyNameConstants.scala
│ │ │ │ └── annotations/
│ │ │ │ ├── AutofillAttributeName.java
│ │ │ │ ├── AutofillAttributeNameLambda.java
│ │ │ │ ├── AutofillAttributeNameList.java
│ │ │ │ ├── AutofillAttributeNameOnPort1.java
│ │ │ │ ├── BatchByColumn.java
│ │ │ │ ├── CommonOpDescAnnotation.java
│ │ │ │ ├── EnablePresets.java
│ │ │ │ ├── HideAnnotation.java
│ │ │ │ └── UIWidget.java
│ │ │ ├── projection/
│ │ │ │ ├── AttributeUnit.java
│ │ │ │ ├── ProjectionOpDesc.scala
│ │ │ │ └── ProjectionOpExec.scala
│ │ │ ├── randomksampling/
│ │ │ │ ├── RandomKSamplingOpDesc.scala
│ │ │ │ └── RandomKSamplingOpExec.scala
│ │ │ ├── regex/
│ │ │ │ ├── RegexOpDesc.scala
│ │ │ │ └── RegexOpExec.scala
│ │ │ ├── reservoirsampling/
│ │ │ │ ├── ReservoirSamplingOpDesc.scala
│ │ │ │ └── ReservoirSamplingOpExec.scala
│ │ │ ├── sink/
│ │ │ │ └── ProgressiveUtils.scala
│ │ │ ├── sklearn/
│ │ │ │ ├── SklearnAdaptiveBoostingOpDesc.scala
│ │ │ │ ├── SklearnBaggingOpDesc.scala
│ │ │ │ ├── SklearnBernoulliNaiveBayesOpDesc.scala
│ │ │ │ ├── SklearnClassifierOpDesc.scala
│ │ │ │ ├── SklearnComplementNaiveBayesOpDesc.scala
│ │ │ │ ├── SklearnDecisionTreeOpDesc.scala
│ │ │ │ ├── SklearnDummyClassifierOpDesc.scala
│ │ │ │ ├── SklearnExtraTreeOpDesc.scala
│ │ │ │ ├── SklearnExtraTreesOpDesc.scala
│ │ │ │ ├── SklearnGaussianNaiveBayesOpDesc.scala
│ │ │ │ ├── SklearnGradientBoostingOpDesc.scala
│ │ │ │ ├── SklearnKNNOpDesc.scala
│ │ │ │ ├── SklearnLinearRegressionOpDesc.scala
│ │ │ │ ├── SklearnLinearSVMOpDesc.scala
│ │ │ │ ├── SklearnLogisticRegressionCVOpDesc.scala
│ │ │ │ ├── SklearnLogisticRegressionOpDesc.scala
│ │ │ │ ├── SklearnMultiLayerPerceptronOpDesc.scala
│ │ │ │ ├── SklearnMultinomialNaiveBayesOpDesc.scala
│ │ │ │ ├── SklearnNearestCentroidOpDesc.scala
│ │ │ │ ├── SklearnPassiveAggressiveOpDesc.scala
│ │ │ │ ├── SklearnPerceptronOpDesc.scala
│ │ │ │ ├── SklearnPredictionOpDesc.scala
│ │ │ │ ├── SklearnProbabilityCalibrationOpDesc.scala
│ │ │ │ ├── SklearnRandomForestOpDesc.scala
│ │ │ │ ├── SklearnRidgeCVOpDesc.scala
│ │ │ │ ├── SklearnRidgeOpDesc.scala
│ │ │ │ ├── SklearnSDGOpDesc.scala
│ │ │ │ ├── SklearnSVMOpDesc.scala
│ │ │ │ ├── testing/
│ │ │ │ │ └── SklearnTestingOpDesc.scala
│ │ │ │ └── training/
│ │ │ │ ├── SklearnTrainingAdaptiveBoostingOpDesc.scala
│ │ │ │ ├── SklearnTrainingBaggingOpDesc.scala
│ │ │ │ ├── SklearnTrainingBernoulliNaiveBayesOpDesc.scala
│ │ │ │ ├── SklearnTrainingComplementNaiveBayesOpDesc.scala
│ │ │ │ ├── SklearnTrainingDecisionTreeOpDesc.scala
│ │ │ │ ├── SklearnTrainingDummyClassifierOpDesc.scala
│ │ │ │ ├── SklearnTrainingExtraTreeOpDesc.scala
│ │ │ │ ├── SklearnTrainingExtraTreesOpDesc.scala
│ │ │ │ ├── SklearnTrainingGaussianNaiveBayesOpDesc.scala
│ │ │ │ ├── SklearnTrainingGradientBoostingOpDesc.scala
│ │ │ │ ├── SklearnTrainingKNNOpDesc.scala
│ │ │ │ ├── SklearnTrainingLinearRegressionOpDesc.scala
│ │ │ │ ├── SklearnTrainingLinearSVMOpDesc.scala
│ │ │ │ ├── SklearnTrainingLogisticRegressionCVOpDesc.scala
│ │ │ │ ├── SklearnTrainingLogisticRegressionOpDesc.scala
│ │ │ │ ├── SklearnTrainingMultiLayerPerceptronOpDesc.scala
│ │ │ │ ├── SklearnTrainingMultinomialNaiveBayesOpDesc.scala
│ │ │ │ ├── SklearnTrainingNearestCentroidOpDesc.scala
│ │ │ │ ├── SklearnTrainingOpDesc.scala
│ │ │ │ ├── SklearnTrainingPassiveAggressiveOpDesc.scala
│ │ │ │ ├── SklearnTrainingPerceptronOpDesc.scala
│ │ │ │ ├── SklearnTrainingProbabilityCalibrationOpDesc.scala
│ │ │ │ ├── SklearnTrainingRandomForestOpDesc.scala
│ │ │ │ ├── SklearnTrainingRidgeCVOpDesc.scala
│ │ │ │ ├── SklearnTrainingRidgeOpDesc.scala
│ │ │ │ ├── SklearnTrainingSDGOpDesc.scala
│ │ │ │ └── SklearnTrainingSVMOpDesc.scala
│ │ │ ├── sleep/
│ │ │ │ ├── SleepOpDesc.scala
│ │ │ │ └── SleepOpExec.scala
│ │ │ ├── sort/
│ │ │ │ ├── SortCriteriaUnit.scala
│ │ │ │ ├── SortOpDesc.scala
│ │ │ │ ├── SortPreference.java
│ │ │ │ ├── StableMergeSortOpDesc.scala
│ │ │ │ └── StableMergeSortOpExec.scala
│ │ │ ├── sortPartitions/
│ │ │ │ ├── SortPartitionsOpDesc.scala
│ │ │ │ └── SortPartitionsOpExec.scala
│ │ │ ├── source/
│ │ │ │ ├── BufferedBlockReader.java
│ │ │ │ ├── PythonSourceOperatorDescriptor.scala
│ │ │ │ ├── SourceOperatorDescriptor.scala
│ │ │ │ ├── apis/
│ │ │ │ │ ├── reddit/
│ │ │ │ │ │ ├── RedditSearchSourceOpDesc.scala
│ │ │ │ │ │ └── RedditSourceOperatorFunction.java
│ │ │ │ │ └── twitter/
│ │ │ │ │ ├── TwitterSourceOpDesc.scala
│ │ │ │ │ ├── TwitterSourceOpExec.scala
│ │ │ │ │ └── v2/
│ │ │ │ │ ├── TwitterFullArchiveSearchSourceOpDesc.scala
│ │ │ │ │ ├── TwitterFullArchiveSearchSourceOpExec.scala
│ │ │ │ │ ├── TwitterSearchSourceOpDesc.scala
│ │ │ │ │ └── TwitterSearchSourceOpExec.scala
│ │ │ │ ├── cache/
│ │ │ │ │ └── CacheSourceOpExec.scala
│ │ │ │ ├── dataset/
│ │ │ │ │ ├── FileListerSourceOpDesc.scala
│ │ │ │ │ └── FileListerSourceOpExec.scala
│ │ │ │ ├── fetcher/
│ │ │ │ │ ├── DecodingMethod.java
│ │ │ │ │ ├── RandomUserAgent.java
│ │ │ │ │ ├── URLFetchUtil.scala
│ │ │ │ │ ├── URLFetcherOpDesc.scala
│ │ │ │ │ └── URLFetcherOpExec.scala
│ │ │ │ ├── scan/
│ │ │ │ │ ├── AutoClosingIterator.scala
│ │ │ │ │ ├── FileAttributeType.java
│ │ │ │ │ ├── FileDecodingMethod.java
│ │ │ │ │ ├── ScanSourceOpDesc.scala
│ │ │ │ │ ├── arrow/
│ │ │ │ │ │ ├── ArrowSourceOpDesc.scala
│ │ │ │ │ │ └── ArrowSourceOpExec.scala
│ │ │ │ │ ├── csv/
│ │ │ │ │ │ ├── CSVScanSourceOpDesc.scala
│ │ │ │ │ │ ├── CSVScanSourceOpExec.scala
│ │ │ │ │ │ ├── ParallelCSVScanSourceOpDesc.scala
│ │ │ │ │ │ └── ParallelCSVScanSourceOpExec.scala
│ │ │ │ │ ├── csvOld/
│ │ │ │ │ │ ├── CSVOldScanSourceOpDesc.scala
│ │ │ │ │ │ └── CSVOldScanSourceOpExec.scala
│ │ │ │ │ ├── file/
│ │ │ │ │ │ ├── FileScanOpDesc.scala
│ │ │ │ │ │ ├── FileScanOpExec.scala
│ │ │ │ │ │ ├── FileScanSourceOpDesc.scala
│ │ │ │ │ │ ├── FileScanSourceOpExec.scala
│ │ │ │ │ │ └── FileScanUtils.scala
│ │ │ │ │ ├── json/
│ │ │ │ │ │ ├── JSONLScanSourceOpDesc.scala
│ │ │ │ │ │ └── JSONLScanSourceOpExec.scala
│ │ │ │ │ └── text/
│ │ │ │ │ ├── TextInputSourceOpDesc.scala
│ │ │ │ │ ├── TextInputSourceOpExec.scala
│ │ │ │ │ └── TextSourceOpDesc.scala
│ │ │ │ └── sql/
│ │ │ │ ├── SQLSourceOpDesc.scala
│ │ │ │ ├── SQLSourceOpExec.scala
│ │ │ │ ├── asterixdb/
│ │ │ │ │ ├── AsterixDBConnUtil.scala
│ │ │ │ │ ├── AsterixDBSourceOpDesc.scala
│ │ │ │ │ └── AsterixDBSourceOpExec.scala
│ │ │ │ ├── mysql/
│ │ │ │ │ ├── MySQLConnUtil.scala
│ │ │ │ │ ├── MySQLSourceOpDesc.scala
│ │ │ │ │ └── MySQLSourceOpExec.scala
│ │ │ │ └── postgresql/
│ │ │ │ ├── PostgreSQLConnUtil.scala
│ │ │ │ ├── PostgreSQLSourceOpDesc.scala
│ │ │ │ └── PostgreSQLSourceOpExec.scala
│ │ │ ├── split/
│ │ │ │ ├── SplitOpDesc.scala
│ │ │ │ └── SplitOpExec.scala
│ │ │ ├── substringSearch/
│ │ │ │ ├── SubstringSearchOpDesc.scala
│ │ │ │ └── SubstringSearchOpExec.scala
│ │ │ ├── symmetricDifference/
│ │ │ │ ├── SymmetricDifferenceOpDesc.scala
│ │ │ │ └── SymmetricDifferenceOpExec.scala
│ │ │ ├── typecasting/
│ │ │ │ ├── TypeCastingOpDesc.scala
│ │ │ │ ├── TypeCastingOpExec.scala
│ │ │ │ └── TypeCastingUnit.java
│ │ │ ├── udf/
│ │ │ │ ├── java/
│ │ │ │ │ └── JavaUDFOpDesc.scala
│ │ │ │ ├── python/
│ │ │ │ │ ├── DualInputPortsPythonUDFOpDescV2.scala
│ │ │ │ │ ├── LambdaAttributeUnit.java
│ │ │ │ │ ├── PythonLambdaFunctionOpDesc.scala
│ │ │ │ │ ├── PythonTableReducerOpDesc.scala
│ │ │ │ │ ├── PythonUDFOpDescV2.scala
│ │ │ │ │ └── source/
│ │ │ │ │ └── PythonUDFSourceOpDescV2.scala
│ │ │ │ └── r/
│ │ │ │ ├── RUDFOpDesc.scala
│ │ │ │ └── RUDFSourceOpDesc.scala
│ │ │ ├── union/
│ │ │ │ ├── UnionOpDesc.scala
│ │ │ │ └── UnionOpExec.scala
│ │ │ ├── unneststring/
│ │ │ │ ├── UnnestStringOpDesc.scala
│ │ │ │ └── UnnestStringOpExec.scala
│ │ │ ├── util/
│ │ │ │ └── OperatorDescriptorUtils.scala
│ │ │ └── visualization/
│ │ │ ├── DotPlot/
│ │ │ │ └── DotPlotOpDesc.scala
│ │ │ ├── IcicleChart/
│ │ │ │ └── IcicleChartOpDesc.scala
│ │ │ ├── ImageUtility.scala
│ │ │ ├── ImageViz/
│ │ │ │ └── ImageVisualizerOpDesc.scala
│ │ │ ├── ScatterMatrixChart/
│ │ │ │ └── ScatterMatrixChartOpDesc.scala
│ │ │ ├── barChart/
│ │ │ │ └── BarChartOpDesc.scala
│ │ │ ├── boxViolinPlot/
│ │ │ │ ├── BoxViolinPlotOpDesc.scala
│ │ │ │ └── BoxViolinPlotQuartileFunction.java
│ │ │ ├── bubbleChart/
│ │ │ │ └── BubbleChartOpDesc.scala
│ │ │ ├── bulletChart/
│ │ │ │ ├── BulletChartOpDesc.scala
│ │ │ │ └── BulletChartStepDefinition.scala
│ │ │ ├── candlestickChart/
│ │ │ │ └── CandlestickChartOpDesc.scala
│ │ │ ├── carpetPlot/
│ │ │ │ └── CarpetPlotOpDesc.scala
│ │ │ ├── choroplethMap/
│ │ │ │ └── ChoroplethMapOpDesc.scala
│ │ │ ├── continuousErrorBands/
│ │ │ │ ├── BandConfig.scala
│ │ │ │ └── ContinuousErrorBandsOpDesc.scala
│ │ │ ├── contourPlot/
│ │ │ │ ├── ContourPlotColoringFunction.java
│ │ │ │ └── ContourPlotOpDesc.scala
│ │ │ ├── dendrogram/
│ │ │ │ └── DendrogramOpDesc.scala
│ │ │ ├── dumbbellPlot/
│ │ │ │ ├── DumbbellDotConfig.scala
│ │ │ │ └── DumbbellPlotOpDesc.scala
│ │ │ ├── ecdfPlot/
│ │ │ │ └── ECDFPlotOpDesc.scala
│ │ │ ├── figureFactoryTable/
│ │ │ │ ├── FigureFactoryTableConfig.scala
│ │ │ │ └── FigureFactoryTableOpDesc.scala
│ │ │ ├── filledAreaPlot/
│ │ │ │ └── FilledAreaPlotOpDesc.scala
│ │ │ ├── funnelPlot/
│ │ │ │ └── FunnelPlotOpDesc.scala
│ │ │ ├── ganttChart/
│ │ │ │ └── GanttChartOpDesc.scala
│ │ │ ├── gaugeChart/
│ │ │ │ ├── GaugeChartOpDesc.scala
│ │ │ │ └── GaugeChartSteps.scala
│ │ │ ├── heatMap/
│ │ │ │ └── HeatMapOpDesc.scala
│ │ │ ├── hierarchychart/
│ │ │ │ ├── HierarchyChartOpDesc.scala
│ │ │ │ ├── HierarchyChartType.java
│ │ │ │ └── HierarchySection.scala
│ │ │ ├── histogram/
│ │ │ │ └── HistogramChartOpDesc.scala
│ │ │ ├── histogram2d/
│ │ │ │ ├── Histogram2DOpDesc.scala
│ │ │ │ └── NormalizationType.java
│ │ │ ├── htmlviz/
│ │ │ │ ├── HtmlVizOpDesc.scala
│ │ │ │ └── HtmlVizOpExec.scala
│ │ │ ├── lineChart/
│ │ │ │ ├── LineChartOpDesc.scala
│ │ │ │ ├── LineConfig.scala
│ │ │ │ └── LineMode.java
│ │ │ ├── nestedTable/
│ │ │ │ ├── NestedTableConfig.scala
│ │ │ │ └── NestedTableOpDesc.scala
│ │ │ ├── networkGraph/
│ │ │ │ └── NetworkGraphOpDesc.scala
│ │ │ ├── parallelCoordinatesPlot/
│ │ │ │ └── ParallelCoordinatesPlotOpDesc.scala
│ │ │ ├── pieChart/
│ │ │ │ └── PieChartOpDesc.scala
│ │ │ ├── polarChart/
│ │ │ │ └── PolarChartOpDesc.scala
│ │ │ ├── quiverPlot/
│ │ │ │ └── QuiverPlotOpDesc.scala
│ │ │ ├── radarChart/
│ │ │ │ └── RadarChartOpDesc.scala
│ │ │ ├── radarPlot/
│ │ │ │ ├── RadarPlotLinePattern.java
│ │ │ │ └── RadarPlotOpDesc.scala
│ │ │ ├── rangeSlider/
│ │ │ │ ├── RangeSliderHandleDuplicateFunction.java
│ │ │ │ └── RangeSliderOpDesc.scala
│ │ │ ├── sankeyDiagram/
│ │ │ │ └── SankeyDiagramOpDesc.scala
│ │ │ ├── scatter3DChart/
│ │ │ │ └── Scatter3dChartOpDesc.scala
│ │ │ ├── scatterplot/
│ │ │ │ └── ScatterplotOpDesc.scala
│ │ │ ├── stripChart/
│ │ │ │ └── StripChartOpDesc.scala
│ │ │ ├── tablesChart/
│ │ │ │ ├── TablesConfig.scala
│ │ │ │ └── TablesPlotOpDesc.scala
│ │ │ ├── ternaryContour/
│ │ │ │ └── TernaryContourOpDesc.scala
│ │ │ ├── ternaryPlot/
│ │ │ │ └── TernaryPlotOpDesc.scala
│ │ │ ├── timeSeriesplot/
│ │ │ │ └── TimeSeriesOpDesc.scala
│ │ │ ├── treeplot/
│ │ │ │ └── TreePlotOpDesc.scala
│ │ │ ├── urlviz/
│ │ │ │ ├── UrlVizOpDesc.scala
│ │ │ │ └── UrlVizOpExec.scala
│ │ │ ├── volcanoPlot/
│ │ │ │ └── VolcanoPlotOpDesc.scala
│ │ │ ├── waterfallChart/
│ │ │ │ └── WaterfallChartOpDesc.scala
│ │ │ ├── windRoseChart/
│ │ │ │ └── WindRoseChartOpDesc.scala
│ │ │ └── wordCloud/
│ │ │ └── WordCloudOpDesc.scala
│ │ └── util/
│ │ └── ObjectMapperUtils.scala
│ └── test/
│ ├── resources/
│ │ ├── 100.jsonl
│ │ ├── 1000.jsonl
│ │ ├── country_sales_headerless_small.csv
│ │ ├── country_sales_headerless_small_multi_line.csv
│ │ ├── country_sales_headerless_small_multi_line_custom_delimiter.csv
│ │ ├── country_sales_medium.csv
│ │ ├── country_sales_small.csv
│ │ ├── country_sales_small_multi_line.csv
│ │ ├── line_numbers.txt
│ │ ├── line_numbers_crlf.txt
│ │ └── numbers.txt
│ └── scala/
│ └── org/
│ └── apache/
│ └── texera/
│ └── amber/
│ ├── operator/
│ │ ├── aggregate/
│ │ │ ├── AggregateOpSpec.scala
│ │ │ └── AggregationOperationSpec.scala
│ │ ├── cartesianProduct/
│ │ │ └── CartesianProductOpExecSpec.scala
│ │ ├── dictionary/
│ │ │ └── DictionaryMatcherOpExecSpec.scala
│ │ ├── difference/
│ │ │ └── DifferenceOpExecSpec.scala
│ │ ├── distinct/
│ │ │ └── DistinctOpExecSpec.scala
│ │ ├── filter/
│ │ │ └── SpecializedFilterOpExecSpec.scala
│ │ ├── flatmap/
│ │ │ └── FlatMapOpExecSpec.scala
│ │ ├── hashJoin/
│ │ │ └── HashJoinOpSpec.scala
│ │ ├── ifStatement/
│ │ │ └── IfOpExecSpec.scala
│ │ ├── intersect/
│ │ │ ├── IntersectOpDescSpec.scala
│ │ │ └── IntersectOpExecSpec.scala
│ │ ├── intervalJoin/
│ │ │ └── IntervalOpExecSpec.scala
│ │ ├── keywordSearch/
│ │ │ └── KeywordSearchOpExecSpec.scala
│ │ ├── limit/
│ │ │ └── LimitOpExecSpec.scala
│ │ ├── map/
│ │ │ └── MapOpExecSpec.scala
│ │ ├── projection/
│ │ │ ├── ProjectionOpDescSpec.scala
│ │ │ └── ProjectionOpExecSpec.scala
│ │ ├── sink/
│ │ │ └── ProgressiveUtilsSpec.scala
│ │ ├── sklearn/
│ │ │ └── SklearnOpDescRegistrySpec.scala
│ │ ├── sleep/
│ │ │ └── SleepOpDescSpec.scala
│ │ ├── sort/
│ │ │ └── StableMergeSortOpExecSpec.scala
│ │ ├── sortPartitions/
│ │ │ └── SortPartitionsOpExecSpec.scala
│ │ ├── source/
│ │ │ ├── dataset/
│ │ │ │ └── FileListerSourceOpDescSpec.scala
│ │ │ ├── fetcher/
│ │ │ │ ├── URLFetcherOpDescSpec.scala
│ │ │ │ └── URLFetcherOpExecSpec.scala
│ │ │ └── scan/
│ │ │ ├── csv/
│ │ │ │ ├── CSVScanSourceOpDescSpec.scala
│ │ │ │ └── CSVScanSourceOpExecSpec.scala
│ │ │ ├── file/
│ │ │ │ ├── FileScanOpDescSpec.scala
│ │ │ │ ├── FileScanSourceOpDescSpec.scala
│ │ │ │ └── FileScanSourceOpExecSpec.scala
│ │ │ └── text/
│ │ │ └── TextInputSourceOpDescSpec.scala
│ │ ├── symmetricDifference/
│ │ │ └── SymmetricDifferenceOpExecSpec.scala
│ │ ├── timeSeriesPlot/
│ │ │ └── TimeSeriesOpDescSpec.scala
│ │ ├── typecasting/
│ │ │ └── TypeCastingOpExecSpec.scala
│ │ ├── udf/
│ │ │ └── python/
│ │ │ └── PythonLambdaFunctionOpDescSpec.scala
│ │ ├── unneststring/
│ │ │ └── UnnestStringOpExecSpec.scala
│ │ └── visualization/
│ │ ├── DotPlot/
│ │ │ └── DotPlotOpDescSpec.scala
│ │ ├── ImageViz/
│ │ │ └── ImageVisualizerOpDescSpec.scala
│ │ ├── barChart/
│ │ │ └── BarChartOpDescSpec.scala
│ │ ├── bubbleChart/
│ │ │ └── BubbleChartOpDescSpec.scala
│ │ ├── bulletChart/
│ │ │ └── BulletChartOpDescSpec.scala
│ │ ├── ecdfPlot/
│ │ │ └── ECDFPlotOpDescSpec.scala
│ │ ├── filledAreaPlot/
│ │ │ └── FilledAreaPlotOpDescSpec.scala
│ │ ├── funnelPlot/
│ │ │ └── FunnelPlotOpDescSpec.scala
│ │ ├── ganttChart/
│ │ │ └── GanttChartOpDescSpec.scala
│ │ ├── heatMap/
│ │ │ └── HeatMapOpDescSpec.scala
│ │ ├── hierarchychart/
│ │ │ └── HierarchyChartOpDescSpec.scala
│ │ ├── htmlviz/
│ │ │ └── HtmlVizOpExecSpec.scala
│ │ ├── lineChart/
│ │ │ └── LineChartOpDescSpec.scala
│ │ ├── pieChart/
│ │ │ └── PieChartOpDescSpec.scala
│ │ ├── scatterplot/
│ │ │ └── ScatterPlotOpDescSpec.scala
│ │ ├── volcanoPlot/
│ │ │ └── VolcanoPlotOpDescSpec.scala
│ │ └── wordCloud/
│ │ └── WordCloudOpDescSpec.scala
│ ├── pybuilder/
│ │ ├── DescriptorChecker.scala
│ │ ├── PythonClassgraphScanner.scala
│ │ ├── PythonConsoleCapture.scala
│ │ ├── PythonRawTextReportRenderer.scala
│ │ ├── PythonReflectionTextUtils.scala
│ │ └── PythonReflectionUtils.scala
│ └── util/
│ ├── ArrowUtilsSpec.scala
│ └── PythonCodeRawInvalidTextSpec.scala
├── computing-unit-managing-service/
│ ├── LICENSE-binary
│ ├── NOTICE-binary
│ ├── build.sbt
│ ├── project/
│ │ ├── build.properties
│ │ └── plugins.sbt
│ └── src/
│ └── main/
│ ├── resources/
│ │ └── computing-unit-managing-service-config.yaml
│ └── scala/
│ └── org/
│ └── apache/
│ └── texera/
│ └── service/
│ ├── ComputingUnitManagingService.scala
│ ├── ComputingUnitManagingServiceConfiguration.scala
│ ├── resource/
│ │ ├── ComputingUnitAccessResource.scala
│ │ ├── ComputingUnitManagingResource.scala
│ │ ├── ComputingUnitState.scala
│ │ └── HealthCheckResource.scala
│ └── util/
│ ├── ComputingUnitHelpers.scala
│ ├── ComputingUnitManagingServiceException.scala
│ └── KubernetesClient.scala
├── config-service/
│ ├── LICENSE-binary
│ ├── NOTICE-binary
│ ├── build.sbt
│ └── src/
│ └── main/
│ ├── resources/
│ │ └── config-service-web-config.yaml
│ └── scala/
│ └── org/
│ └── apache/
│ └── texera/
│ └── service/
│ ├── ConfigService.scala
│ ├── ConfigServiceConfiguration.scala
│ └── resource/
│ ├── ConfigResource.scala
│ └── HealthCheckResource.scala
├── file-service/
│ ├── LICENSE-binary
│ ├── NOTICE-binary
│ ├── build.sbt
│ └── src/
│ ├── main/
│ │ ├── resources/
│ │ │ ├── docker-compose.yml
│ │ │ ├── file-service-web-config.yaml
│ │ │ └── minio-config.yml
│ │ └── scala/
│ │ └── org/
│ │ └── apache/
│ │ └── texera/
│ │ └── service/
│ │ ├── FileService.scala
│ │ ├── FileServiceConfiguration.scala
│ │ ├── resource/
│ │ │ ├── DatasetAccessResource.scala
│ │ │ ├── DatasetResource.scala
│ │ │ └── HealthCheckResource.scala
│ │ ├── type/
│ │ │ ├── dataset/
│ │ │ │ └── DatasetFileNode.scala
│ │ │ └── serde/
│ │ │ └── DatasetFileNodeSerializer.java
│ │ └── util/
│ │ └── LakeFSExceptionHandler.scala
│ └── test/
│ └── scala/
│ └── org/
│ └── apache/
│ └── texera/
│ └── service/
│ ├── MockLakeFS.scala
│ └── resource/
│ └── DatasetResourceSpec.scala
├── frontend/
│ ├── .editorconfig
│ ├── .eslintrc.json
│ ├── .gitignore
│ ├── .nvmrc
│ ├── .prettierignore
│ ├── .prettierrc.json
│ ├── .yarn/
│ │ └── releases/
│ │ └── yarn-4.14.1.cjs
│ ├── .yarnrc.yml
│ ├── LICENSE-binary
│ ├── README.md
│ ├── angular.json
│ ├── custom-webpack.config.js
│ ├── git-version.js
│ ├── nx.json
│ ├── package.json
│ ├── proxy.config.json
│ ├── src/
│ │ ├── app/
│ │ │ ├── app-routing.constant.ts
│ │ │ ├── app-routing.module.ts
│ │ │ ├── app.component.ts
│ │ │ ├── app.module.ts
│ │ │ ├── common/
│ │ │ │ ├── app-setting.ts
│ │ │ │ ├── formly/
│ │ │ │ │ ├── array.type.ts
│ │ │ │ │ ├── collab-wrapper/
│ │ │ │ │ │ └── collab-wrapper/
│ │ │ │ │ │ ├── collab-wrapper.component.css
│ │ │ │ │ │ ├── collab-wrapper.component.html
│ │ │ │ │ │ └── collab-wrapper.component.ts
│ │ │ │ │ ├── formly-config.ts
│ │ │ │ │ ├── formly-utils.ts
│ │ │ │ │ ├── multischema.type.ts
│ │ │ │ │ ├── null.type.ts
│ │ │ │ │ ├── object.type.ts
│ │ │ │ │ ├── preset-wrapper/
│ │ │ │ │ │ ├── preset-wrapper.component.html
│ │ │ │ │ │ ├── preset-wrapper.component.scss
│ │ │ │ │ │ ├── preset-wrapper.component.spec.ts
│ │ │ │ │ │ └── preset-wrapper.component.ts
│ │ │ │ │ └── repeat-dnd/
│ │ │ │ │ ├── repeat-dnd.component.css
│ │ │ │ │ ├── repeat-dnd.component.html
│ │ │ │ │ └── repeat-dnd.component.ts
│ │ │ │ ├── service/
│ │ │ │ │ ├── blob-error-http-interceptor.service.ts
│ │ │ │ │ ├── computing-unit/
│ │ │ │ │ │ ├── computing-unit-actions/
│ │ │ │ │ │ │ └── computing-unit-actions.service.ts
│ │ │ │ │ │ ├── computing-unit-status/
│ │ │ │ │ │ │ ├── computing-unit-status.service.ts
│ │ │ │ │ │ │ └── mock-computing-unit-status.service.ts
│ │ │ │ │ │ └── workflow-computing-unit/
│ │ │ │ │ │ └── workflow-computing-unit-managing.service.ts
│ │ │ │ │ ├── gui-config.service.mock.ts
│ │ │ │ │ ├── gui-config.service.ts
│ │ │ │ │ ├── notification/
│ │ │ │ │ │ ├── notification.service.spec.ts
│ │ │ │ │ │ └── notification.service.ts
│ │ │ │ │ ├── user/
│ │ │ │ │ │ ├── auth-guard.service.ts
│ │ │ │ │ │ ├── auth.service.ts
│ │ │ │ │ │ ├── config/
│ │ │ │ │ │ │ ├── user-config.service.spec.ts
│ │ │ │ │ │ │ └── user-config.service.ts
│ │ │ │ │ │ ├── google-auth.service.ts
│ │ │ │ │ │ ├── registration-request-modal/
│ │ │ │ │ │ │ ├── registration-request-modal.component.html
│ │ │ │ │ │ │ ├── registration-request-modal.component.scss
│ │ │ │ │ │ │ └── registration-request-modal.component.ts
│ │ │ │ │ │ ├── stub-auth.service.ts
│ │ │ │ │ │ ├── stub-user.service.ts
│ │ │ │ │ │ ├── user.service.spec.ts
│ │ │ │ │ │ └── user.service.ts
│ │ │ │ │ └── workflow-persist/
│ │ │ │ │ ├── stub-workflow-persist.service.ts
│ │ │ │ │ ├── workflow-persist.service.spec.ts
│ │ │ │ │ └── workflow-persist.service.ts
│ │ │ │ ├── testing/
│ │ │ │ │ └── test-utils.ts
│ │ │ │ ├── type/
│ │ │ │ │ ├── computing-unit-connection.interface.ts
│ │ │ │ │ ├── dataset-file.ts
│ │ │ │ │ ├── dataset-staged-object.ts
│ │ │ │ │ ├── dataset.ts
│ │ │ │ │ ├── datasetVersionFileTree.ts
│ │ │ │ │ ├── execution.ts
│ │ │ │ │ ├── generic-web-response.ts
│ │ │ │ │ ├── gui-config.ts
│ │ │ │ │ ├── physical-plan.ts
│ │ │ │ │ ├── proto/
│ │ │ │ │ │ ├── google/
│ │ │ │ │ │ │ └── protobuf/
│ │ │ │ │ │ │ └── descriptor.ts
│ │ │ │ │ │ ├── org/
│ │ │ │ │ │ │ └── apache/
│ │ │ │ │ │ │ └── texera/
│ │ │ │ │ │ │ └── amber/
│ │ │ │ │ │ │ └── core/
│ │ │ │ │ │ │ ├── virtualidentity.ts
│ │ │ │ │ │ │ └── workflow.ts
│ │ │ │ │ │ └── scalapb/
│ │ │ │ │ │ └── scalapb.ts
│ │ │ │ │ ├── user.ts
│ │ │ │ │ ├── workflow-computing-unit.ts
│ │ │ │ │ └── workflow.ts
│ │ │ │ └── util/
│ │ │ │ ├── array-utils.ts
│ │ │ │ ├── assert.ts
│ │ │ │ ├── computing-unit.util.ts
│ │ │ │ ├── context.ts
│ │ │ │ ├── error.ts
│ │ │ │ ├── format.util.ts
│ │ │ │ ├── logical-operator-port-serde.ts
│ │ │ │ ├── map.ts
│ │ │ │ ├── panel-dock.ts
│ │ │ │ ├── port-identity-serde.ts
│ │ │ │ ├── predicate.ts
│ │ │ │ ├── set.ts
│ │ │ │ ├── size-formatter.util.spec.ts
│ │ │ │ ├── size-formatter.util.ts
│ │ │ │ ├── storage.ts
│ │ │ │ ├── stub.ts
│ │ │ │ ├── switch.ts
│ │ │ │ ├── url.ts
│ │ │ │ ├── workflow-check.ts
│ │ │ │ └── workflow-compilation-utils.ts
│ │ │ ├── dashboard/
│ │ │ │ ├── component/
│ │ │ │ │ ├── admin/
│ │ │ │ │ │ ├── execution/
│ │ │ │ │ │ │ ├── admin-execution.component.html
│ │ │ │ │ │ │ ├── admin-execution.component.scss
│ │ │ │ │ │ │ ├── admin-execution.component.spec.ts
│ │ │ │ │ │ │ └── admin-execution.component.ts
│ │ │ │ │ │ ├── settings/
│ │ │ │ │ │ │ ├── admin-settings.component.html
│ │ │ │ │ │ │ ├── admin-settings.component.scss
│ │ │ │ │ │ │ ├── admin-settings.component.spec.ts
│ │ │ │ │ │ │ └── admin-settings.component.ts
│ │ │ │ │ │ └── user/
│ │ │ │ │ │ ├── admin-user.component.html
│ │ │ │ │ │ ├── admin-user.component.scss
│ │ │ │ │ │ ├── admin-user.component.spec.ts
│ │ │ │ │ │ └── admin-user.component.ts
│ │ │ │ │ ├── button-style.scss
│ │ │ │ │ ├── dashboard.component.html
│ │ │ │ │ ├── dashboard.component.scss
│ │ │ │ │ ├── dashboard.component.spec.ts
│ │ │ │ │ ├── dashboard.component.ts
│ │ │ │ │ ├── section-style.scss
│ │ │ │ │ ├── user/
│ │ │ │ │ │ ├── files-uploader/
│ │ │ │ │ │ │ ├── conflicting-file-modal-content/
│ │ │ │ │ │ │ │ ├── conflicting-file-modal-content.component.html
│ │ │ │ │ │ │ │ ├── conflicting-file-modal-content.component.scss
│ │ │ │ │ │ │ │ └── conflicting-file-modal-content.component.ts
│ │ │ │ │ │ │ ├── files-uploader.component.html
│ │ │ │ │ │ │ ├── files-uploader.component.scss
│ │ │ │ │ │ │ └── files-uploader.component.ts
│ │ │ │ │ │ ├── filters/
│ │ │ │ │ │ │ ├── filters.component.html
│ │ │ │ │ │ │ ├── filters.component.scss
│ │ │ │ │ │ │ ├── filters.component.spec.ts
│ │ │ │ │ │ │ └── filters.component.ts
│ │ │ │ │ │ ├── filters-instructions/
│ │ │ │ │ │ │ ├── filters-instructions.component.html
│ │ │ │ │ │ │ ├── filters-instructions.component.spec.ts
│ │ │ │ │ │ │ └── filters-instructions.component.ts
│ │ │ │ │ │ ├── flarum/
│ │ │ │ │ │ │ ├── flarum.component.html
│ │ │ │ │ │ │ └── flarum.component.ts
│ │ │ │ │ │ ├── list-item/
│ │ │ │ │ │ │ ├── list-item.component.html
│ │ │ │ │ │ │ ├── list-item.component.scss
│ │ │ │ │ │ │ ├── list-item.component.spec.ts
│ │ │ │ │ │ │ └── list-item.component.ts
│ │ │ │ │ │ ├── markdown-description/
│ │ │ │ │ │ │ ├── markdown-description.component.html
│ │ │ │ │ │ │ ├── markdown-description.component.scss
│ │ │ │ │ │ │ └── markdown-description.component.ts
│ │ │ │ │ │ ├── search/
│ │ │ │ │ │ │ ├── search.component.html
│ │ │ │ │ │ │ ├── search.component.scss
│ │ │ │ │ │ │ └── search.component.ts
│ │ │ │ │ │ ├── search-bar/
│ │ │ │ │ │ │ ├── search-bar.component.html
│ │ │ │ │ │ │ ├── search-bar.component.scss
│ │ │ │ │ │ │ └── search-bar.component.ts
│ │ │ │ │ │ ├── search-results/
│ │ │ │ │ │ │ ├── search-results.component.html
│ │ │ │ │ │ │ ├── search-results.component.scss
│ │ │ │ │ │ │ └── search-results.component.ts
│ │ │ │ │ │ ├── share-access/
│ │ │ │ │ │ │ ├── share-access.component.html
│ │ │ │ │ │ │ ├── share-access.component.scss
│ │ │ │ │ │ │ └── share-access.component.ts
│ │ │ │ │ │ ├── sort-button/
│ │ │ │ │ │ │ ├── sort-button.component.html
│ │ │ │ │ │ │ ├── sort-button.component.scss
│ │ │ │ │ │ │ └── sort-button.component.ts
│ │ │ │ │ │ ├── user-avatar/
│ │ │ │ │ │ │ ├── user-avatar.component.html
│ │ │ │ │ │ │ ├── user-avatar.component.scss
│ │ │ │ │ │ │ ├── user-avatar.component.spec.ts
│ │ │ │ │ │ │ └── user-avatar.component.ts
│ │ │ │ │ │ ├── user-computing-unit/
│ │ │ │ │ │ │ ├── user-computing-unit-list-item/
│ │ │ │ │ │ │ │ ├── user-computing-unit-list-item.component.html
│ │ │ │ │ │ │ │ ├── user-computing-unit-list-item.component.scss
│ │ │ │ │ │ │ │ └── user-computing-unit-list-item.component.ts
│ │ │ │ │ │ │ ├── user-computing-unit.component.html
│ │ │ │ │ │ │ ├── user-computing-unit.component.scss
│ │ │ │ │ │ │ ├── user-computing-unit.component.spec.ts
│ │ │ │ │ │ │ └── user-computing-unit.component.ts
│ │ │ │ │ │ ├── user-dataset/
│ │ │ │ │ │ │ ├── user-dataset-explorer/
│ │ │ │ │ │ │ │ ├── dataset-detail.component.html
│ │ │ │ │ │ │ │ ├── dataset-detail.component.scss
│ │ │ │ │ │ │ │ ├── dataset-detail.component.ts
│ │ │ │ │ │ │ │ ├── user-dataset-file-renderer/
│ │ │ │ │ │ │ │ │ ├── user-dataset-file-renderer.component.html
│ │ │ │ │ │ │ │ │ ├── user-dataset-file-renderer.component.scss
│ │ │ │ │ │ │ │ │ ├── user-dataset-file-renderer.component.spec.ts
│ │ │ │ │ │ │ │ │ └── user-dataset-file-renderer.component.ts
│ │ │ │ │ │ │ │ ├── user-dataset-staged-objects-list/
│ │ │ │ │ │ │ │ │ ├── user-dataset-staged-objects-list.component.html
│ │ │ │ │ │ │ │ │ ├── user-dataset-staged-objects-list.component.scss
│ │ │ │ │ │ │ │ │ └── user-dataset-staged-objects-list.component.ts
│ │ │ │ │ │ │ │ ├── user-dataset-version-creator/
│ │ │ │ │ │ │ │ │ ├── user-dataset-version-creator.component.html
│ │ │ │ │ │ │ │ │ ├── user-dataset-version-creator.component.scss
│ │ │ │ │ │ │ │ │ └── user-dataset-version-creator.component.ts
│ │ │ │ │ │ │ │ └── user-dataset-version-filetree/
│ │ │ │ │ │ │ │ ├── user-dataset-version-filetree.component.html
│ │ │ │ │ │ │ │ ├── user-dataset-version-filetree.component.scss
│ │ │ │ │ │ │ │ └── user-dataset-version-filetree.component.ts
│ │ │ │ │ │ │ ├── user-dataset-list-item/
│ │ │ │ │ │ │ │ ├── user-dataset-list-item.component.html
│ │ │ │ │ │ │ │ ├── user-dataset-list-item.component.scss
│ │ │ │ │ │ │ │ └── user-dataset-list-item.component.ts
│ │ │ │ │ │ │ ├── user-dataset.component.html
│ │ │ │ │ │ │ ├── user-dataset.component.scss
│ │ │ │ │ │ │ └── user-dataset.component.ts
│ │ │ │ │ │ ├── user-icon/
│ │ │ │ │ │ │ ├── user-icon.component.html
│ │ │ │ │ │ │ ├── user-icon.component.scss
│ │ │ │ │ │ │ ├── user-icon.component.spec.ts
│ │ │ │ │ │ │ └── user-icon.component.ts
│ │ │ │ │ │ ├── user-project/
│ │ │ │ │ │ │ ├── public-project/
│ │ │ │ │ │ │ │ ├── public-project.component.html
│ │ │ │ │ │ │ │ └── public-project.component.ts
│ │ │ │ │ │ │ ├── user-project-list-item/
│ │ │ │ │ │ │ │ ├── user-project-list-item.component.html
│ │ │ │ │ │ │ │ ├── user-project-list-item.component.scss
│ │ │ │ │ │ │ │ ├── user-project-list-item.component.spec.ts
│ │ │ │ │ │ │ │ └── user-project-list-item.component.ts
│ │ │ │ │ │ │ ├── user-project-section/
│ │ │ │ │ │ │ │ ├── ngbd-modal-add-project-workflow/
│ │ │ │ │ │ │ │ │ ├── ngbd-modal-add-project-workflow.component.html
│ │ │ │ │ │ │ │ │ ├── ngbd-modal-add-project-workflow.component.scss
│ │ │ │ │ │ │ │ │ └── ngbd-modal-add-project-workflow.component.ts
│ │ │ │ │ │ │ │ ├── ngbd-modal-remove-project-workflow/
│ │ │ │ │ │ │ │ │ ├── ngbd-modal-remove-project-workflow.component.html
│ │ │ │ │ │ │ │ │ ├── ngbd-modal-remove-project-workflow.component.scss
│ │ │ │ │ │ │ │ │ └── ngbd-modal-remove-project-workflow.component.ts
│ │ │ │ │ │ │ │ ├── user-project-section.component.html
│ │ │ │ │ │ │ │ ├── user-project-section.component.scss
│ │ │ │ │ │ │ │ └── user-project-section.component.ts
│ │ │ │ │ │ │ ├── user-project.component.html
│ │ │ │ │ │ │ ├── user-project.component.scss
│ │ │ │ │ │ │ └── user-project.component.ts
│ │ │ │ │ │ ├── user-quota/
│ │ │ │ │ │ │ ├── user-quota.component.html
│ │ │ │ │ │ │ ├── user-quota.component.scss
│ │ │ │ │ │ │ ├── user-quota.component.spec.ts
│ │ │ │ │ │ │ └── user-quota.component.ts
│ │ │ │ │ │ └── user-workflow/
│ │ │ │ │ │ ├── ngbd-modal-workflow-executions/
│ │ │ │ │ │ │ ├── workflow-execution-history.component.html
│ │ │ │ │ │ │ ├── workflow-execution-history.component.scss
│ │ │ │ │ │ │ ├── workflow-execution-history.component.ts
│ │ │ │ │ │ │ └── workflow-runtime-statistics/
│ │ │ │ │ │ │ ├── workflow-runtime-statistics.component.html
│ │ │ │ │ │ │ ├── workflow-runtime-statistics.component.scss
│ │ │ │ │ │ │ └── workflow-runtime-statistics.component.ts
│ │ │ │ │ │ ├── user-workflow-list-item/
│ │ │ │ │ │ │ ├── highlight-search-terms.pipe.ts
│ │ │ │ │ │ │ ├── user-workflow-list-item.component.html
│ │ │ │ │ │ │ ├── user-workflow-list-item.component.scss
│ │ │ │ │ │ │ ├── user-workflow-list-item.component.spec.ts
│ │ │ │ │ │ │ └── user-workflow-list-item.component.ts
│ │ │ │ │ │ ├── user-workflow.component.html
│ │ │ │ │ │ ├── user-workflow.component.scss
│ │ │ │ │ │ ├── user-workflow.component.spec.ts
│ │ │ │ │ │ └── user-workflow.component.ts
│ │ │ │ │ └── user-dashboard-test-fixtures.ts
│ │ │ │ ├── service/
│ │ │ │ │ ├── admin/
│ │ │ │ │ │ ├── execution/
│ │ │ │ │ │ │ └── admin-execution.service.ts
│ │ │ │ │ │ ├── guard/
│ │ │ │ │ │ │ └── admin-guard.service.ts
│ │ │ │ │ │ ├── settings/
│ │ │ │ │ │ │ └── admin-settings.service.ts
│ │ │ │ │ │ └── user/
│ │ │ │ │ │ └── admin-user.service.ts
│ │ │ │ │ └── user/
│ │ │ │ │ ├── dataset/
│ │ │ │ │ │ └── dataset.service.ts
│ │ │ │ │ ├── download/
│ │ │ │ │ │ ├── download.service.spec.ts
│ │ │ │ │ │ └── download.service.ts
│ │ │ │ │ ├── file/
│ │ │ │ │ │ └── file-saver.service.ts
│ │ │ │ │ ├── flarum/
│ │ │ │ │ │ └── flarum.service.ts
│ │ │ │ │ ├── project/
│ │ │ │ │ │ ├── stub-user-project.service.ts
│ │ │ │ │ │ └── user-project.service.ts
│ │ │ │ │ ├── public-project/
│ │ │ │ │ │ └── public-project.service.ts
│ │ │ │ │ ├── quota/
│ │ │ │ │ │ └── user-quota.service.ts
│ │ │ │ │ ├── search.service.ts
│ │ │ │ │ ├── share-access/
│ │ │ │ │ │ └── share-access.service.ts
│ │ │ │ │ ├── stub-search.service.ts
│ │ │ │ │ ├── workflow-executions/
│ │ │ │ │ │ ├── workflow-executions.service.spec.ts
│ │ │ │ │ │ └── workflow-executions.service.ts
│ │ │ │ │ ├── workflow-snapshot/
│ │ │ │ │ │ └── workflow-snapshot.service.ts
│ │ │ │ │ └── workflow-version/
│ │ │ │ │ ├── workflow-version.service.spec.ts
│ │ │ │ │ └── workflow-version.service.ts
│ │ │ │ └── type/
│ │ │ │ ├── dashboard-dataset.interface.ts
│ │ │ │ ├── dashboard-entry.ts
│ │ │ │ ├── dashboard-file.interface.ts
│ │ │ │ ├── dashboard-project.interface.ts
│ │ │ │ ├── dashboard-workflow.interface.ts
│ │ │ │ ├── google-api-response.ts
│ │ │ │ ├── quota-statistic.interface.ts
│ │ │ │ ├── search-filter-parameters.ts
│ │ │ │ ├── search-result.ts
│ │ │ │ ├── share-access.interface.ts
│ │ │ │ ├── sort-method.ts
│ │ │ │ ├── type-predicates.ts
│ │ │ │ ├── workflow-executions-entry.ts
│ │ │ │ ├── workflow-metadata.interface.ts
│ │ │ │ ├── workflow-runtime-statistics.ts
│ │ │ │ ├── workflow-snapshot-entry.ts
│ │ │ │ └── workflow-version-entry.ts
│ │ │ ├── hub/
│ │ │ │ ├── component/
│ │ │ │ │ ├── about/
│ │ │ │ │ │ ├── about.component.html
│ │ │ │ │ │ ├── about.component.scss
│ │ │ │ │ │ ├── about.component.spec.ts
│ │ │ │ │ │ ├── about.component.ts
│ │ │ │ │ │ └── local-login/
│ │ │ │ │ │ ├── local-login.component.html
│ │ │ │ │ │ ├── local-login.component.scss
│ │ │ │ │ │ └── local-login.component.ts
│ │ │ │ │ ├── browse-section/
│ │ │ │ │ │ ├── browse-section.component.html
│ │ │ │ │ │ ├── browse-section.component.scss
│ │ │ │ │ │ ├── browse-section.component.spec.ts
│ │ │ │ │ │ └── browse-section.component.ts
│ │ │ │ │ ├── hub-search-result/
│ │ │ │ │ │ ├── hub-search-result.component.html
│ │ │ │ │ │ ├── hub-search-result.component.scss
│ │ │ │ │ │ └── hub-search-result.component.ts
│ │ │ │ │ ├── hub.component.html
│ │ │ │ │ ├── hub.component.scss
│ │ │ │ │ ├── hub.component.ts
│ │ │ │ │ ├── landing-page/
│ │ │ │ │ │ ├── landing-page.component.html
│ │ │ │ │ │ ├── landing-page.component.scss
│ │ │ │ │ │ └── landing-page.component.ts
│ │ │ │ │ ├── type/
│ │ │ │ │ │ └── hub-workflow.interface.ts
│ │ │ │ │ └── workflow/
│ │ │ │ │ └── detail/
│ │ │ │ │ ├── hub-workflow-detail.component.html
│ │ │ │ │ ├── hub-workflow-detail.component.scss
│ │ │ │ │ └── hub-workflow-detail.component.ts
│ │ │ │ └── service/
│ │ │ │ └── hub.service.ts
│ │ │ └── workspace/
│ │ │ ├── component/
│ │ │ │ ├── agent/
│ │ │ │ │ ├── agent-interaction/
│ │ │ │ │ │ ├── agent-interaction.component.html
│ │ │ │ │ │ ├── agent-interaction.component.scss
│ │ │ │ │ │ └── agent-interaction.component.ts
│ │ │ │ │ └── agent-panel/
│ │ │ │ │ ├── agent-chat/
│ │ │ │ │ │ ├── agent-chat.component.html
│ │ │ │ │ │ ├── agent-chat.component.scss
│ │ │ │ │ │ └── agent-chat.component.ts
│ │ │ │ │ ├── agent-panel.component.html
│ │ │ │ │ ├── agent-panel.component.scss
│ │ │ │ │ ├── agent-panel.component.ts
│ │ │ │ │ ├── agent-registration/
│ │ │ │ │ │ ├── agent-registration.component.html
│ │ │ │ │ │ ├── agent-registration.component.scss
│ │ │ │ │ │ └── agent-registration.component.ts
│ │ │ │ │ └── react-step-detail-modal/
│ │ │ │ │ ├── react-step-detail-modal.component.html
│ │ │ │ │ ├── react-step-detail-modal.component.scss
│ │ │ │ │ └── react-step-detail-modal.component.ts
│ │ │ │ ├── code-editor-dialog/
│ │ │ │ │ ├── annotation-suggestion.component.html
│ │ │ │ │ ├── annotation-suggestion.component.scss
│ │ │ │ │ ├── annotation-suggestion.component.spec.ts
│ │ │ │ │ ├── annotation-suggestion.component.ts
│ │ │ │ │ ├── breakpoint-condition-input/
│ │ │ │ │ │ ├── breakpoint-condition-input.component.html
│ │ │ │ │ │ ├── breakpoint-condition-input.component.scss
│ │ │ │ │ │ ├── breakpoint-condition-input.component.spec.ts
│ │ │ │ │ │ └── breakpoint-condition-input.component.ts
│ │ │ │ │ ├── code-debugger.component.html
│ │ │ │ │ ├── code-debugger.component.spec.ts
│ │ │ │ │ ├── code-debugger.component.ts
│ │ │ │ │ ├── code-editor.component.html
│ │ │ │ │ ├── code-editor.component.scss
│ │ │ │ │ ├── code-editor.component.spec.ts
│ │ │ │ │ └── code-editor.component.ts
│ │ │ │ ├── codearea-custom-template/
│ │ │ │ │ ├── codearea-custom-template.component.html
│ │ │ │ │ ├── codearea-custom-template.component.scss
│ │ │ │ │ ├── codearea-custom-template.component.spec.ts
│ │ │ │ │ └── codearea-custom-template.component.ts
│ │ │ │ ├── dataset-file-selector/
│ │ │ │ │ ├── dataset-file-selector.component.html
│ │ │ │ │ └── dataset-file-selector.component.ts
│ │ │ │ ├── dataset-selection-modal/
│ │ │ │ │ ├── dataset-selection-modal.component.html
│ │ │ │ │ ├── dataset-selection-modal.component.scss
│ │ │ │ │ └── dataset-selection-modal.component.ts
│ │ │ │ ├── dataset-version-selector/
│ │ │ │ │ ├── dataset-version-selector.component.html
│ │ │ │ │ └── dataset-version-selector.component.ts
│ │ │ │ ├── left-panel/
│ │ │ │ │ ├── environment/
│ │ │ │ │ │ └── environment.component.ts
│ │ │ │ │ ├── left-panel.component.html
│ │ │ │ │ ├── left-panel.component.scss
│ │ │ │ │ ├── left-panel.component.spec.ts
│ │ │ │ │ ├── left-panel.component.ts
│ │ │ │ │ ├── operator-menu/
│ │ │ │ │ │ ├── operator-label/
│ │ │ │ │ │ │ ├── operator-label.component.html
│ │ │ │ │ │ │ ├── operator-label.component.scss
│ │ │ │ │ │ │ ├── operator-label.component.spec.ts
│ │ │ │ │ │ │ └── operator-label.component.ts
│ │ │ │ │ │ ├── operator-menu.component.html
│ │ │ │ │ │ ├── operator-menu.component.scss
│ │ │ │ │ │ ├── operator-menu.component.spec.ts
│ │ │ │ │ │ └── operator-menu.component.ts
│ │ │ │ │ ├── settings/
│ │ │ │ │ │ ├── settings.component.html
│ │ │ │ │ │ ├── settings.component.scss
│ │ │ │ │ │ ├── settings.component.spec.ts
│ │ │ │ │ │ └── settings.component.ts
│ │ │ │ │ ├── time-travel/
│ │ │ │ │ │ ├── time-travel.component.html
│ │ │ │ │ │ ├── time-travel.component.scss
│ │ │ │ │ │ ├── time-travel.component.spec.ts
│ │ │ │ │ │ └── time-travel.component.ts
│ │ │ │ │ └── versions-list/
│ │ │ │ │ ├── versions-list.component.html
│ │ │ │ │ ├── versions-list.component.scss
│ │ │ │ │ ├── versions-list.component.spec.ts
│ │ │ │ │ └── versions-list.component.ts
│ │ │ │ ├── menu/
│ │ │ │ │ ├── coeditor-user-icon/
│ │ │ │ │ │ ├── coeditor-user-icon.component.css
│ │ │ │ │ │ ├── coeditor-user-icon.component.html
│ │ │ │ │ │ ├── coeditor-user-icon.component.spec.ts
│ │ │ │ │ │ └── coeditor-user-icon.component.ts
│ │ │ │ │ ├── menu.component.html
│ │ │ │ │ ├── menu.component.scss
│ │ │ │ │ ├── menu.component.spec.ts
│ │ │ │ │ └── menu.component.ts
│ │ │ │ ├── power-button/
│ │ │ │ │ ├── computing-unit-selection.component.html
│ │ │ │ │ ├── computing-unit-selection.component.scss
│ │ │ │ │ ├── computing-unit-selection.component.spec.ts
│ │ │ │ │ └── computing-unit-selection.component.ts
│ │ │ │ ├── property-editor/
│ │ │ │ │ ├── operator-property-edit-frame/
│ │ │ │ │ │ ├── operator-property-edit-frame.component.html
│ │ │ │ │ │ ├── operator-property-edit-frame.component.scss
│ │ │ │ │ │ ├── operator-property-edit-frame.component.spec.ts
│ │ │ │ │ │ └── operator-property-edit-frame.component.ts
│ │ │ │ │ ├── port-property-edit-frame/
│ │ │ │ │ │ ├── port-property-edit-frame.component.html
│ │ │ │ │ │ ├── port-property-edit-frame.component.scss
│ │ │ │ │ │ ├── port-property-edit-frame.component.spec.ts
│ │ │ │ │ │ └── port-property-edit-frame.component.ts
│ │ │ │ │ ├── property-editor.component.html
│ │ │ │ │ ├── property-editor.component.scss
│ │ │ │ │ ├── property-editor.component.spec.ts
│ │ │ │ │ ├── property-editor.component.ts
│ │ │ │ │ └── typecasting-display/
│ │ │ │ │ ├── type-casting-display.component.html
│ │ │ │ │ ├── type-casting-display.component.spec.ts
│ │ │ │ │ └── type-casting-display.component.ts
│ │ │ │ ├── result-exportation/
│ │ │ │ │ ├── result-exportation.component.html
│ │ │ │ │ ├── result-exportation.component.scss
│ │ │ │ │ └── result-exportation.component.ts
│ │ │ │ ├── result-panel/
│ │ │ │ │ ├── console-frame/
│ │ │ │ │ │ ├── console-frame.component.html
│ │ │ │ │ │ ├── console-frame.component.scss
│ │ │ │ │ │ ├── console-frame.component.spec.ts
│ │ │ │ │ │ └── console-frame.component.ts
│ │ │ │ │ ├── error-frame/
│ │ │ │ │ │ ├── error-frame.component.html
│ │ │ │ │ │ ├── error-frame.component.scss
│ │ │ │ │ │ ├── error-frame.component.spec.ts
│ │ │ │ │ │ └── error-frame.component.ts
│ │ │ │ │ ├── result-panel-modal.component.html
│ │ │ │ │ ├── result-panel-modal.component.ts
│ │ │ │ │ ├── result-panel-model.component.scss
│ │ │ │ │ ├── result-panel.component.html
│ │ │ │ │ ├── result-panel.component.scss
│ │ │ │ │ ├── result-panel.component.spec.ts
│ │ │ │ │ ├── result-panel.component.ts
│ │ │ │ │ └── result-table-frame/
│ │ │ │ │ ├── result-table-frame.component.html
│ │ │ │ │ ├── result-table-frame.component.scss
│ │ │ │ │ ├── result-table-frame.component.spec.ts
│ │ │ │ │ └── result-table-frame.component.ts
│ │ │ │ ├── visualization-panel-content/
│ │ │ │ │ ├── visualization-frame-content.component.html
│ │ │ │ │ ├── visualization-frame-content.component.scss
│ │ │ │ │ └── visualization-frame-content.component.ts
│ │ │ │ ├── workflow-editor/
│ │ │ │ │ ├── comment-box-modal/
│ │ │ │ │ │ ├── nz-modal-comment-box.component.html
│ │ │ │ │ │ ├── nz-modal-comment-box.component.scss
│ │ │ │ │ │ └── nz-modal-comment-box.component.ts
│ │ │ │ │ ├── context-menu/
│ │ │ │ │ │ └── context-menu/
│ │ │ │ │ │ ├── context-menu.component.html
│ │ │ │ │ │ ├── context-menu.component.scss
│ │ │ │ │ │ ├── context-menu.component.spec.ts
│ │ │ │ │ │ └── context-menu.component.ts
│ │ │ │ │ ├── mini-map/
│ │ │ │ │ │ ├── mini-map.component.html
│ │ │ │ │ │ ├── mini-map.component.scss
│ │ │ │ │ │ ├── mini-map.component.spec.ts
│ │ │ │ │ │ └── mini-map.component.ts
│ │ │ │ │ ├── workflow-editor.component.html
│ │ │ │ │ ├── workflow-editor.component.scss
│ │ │ │ │ ├── workflow-editor.component.spec.ts
│ │ │ │ │ └── workflow-editor.component.ts
│ │ │ │ ├── workspace.component.html
│ │ │ │ ├── workspace.component.scss
│ │ │ │ ├── workspace.component.spec.ts
│ │ │ │ └── workspace.component.ts
│ │ │ ├── service/
│ │ │ │ ├── agent/
│ │ │ │ │ ├── agent-types.ts
│ │ │ │ │ └── agent.service.ts
│ │ │ │ ├── ai-analyst/
│ │ │ │ │ └── ai-analyst.service.ts
│ │ │ │ ├── ai-assistant/
│ │ │ │ │ └── ai-assistant.service.ts
│ │ │ │ ├── code-editor/
│ │ │ │ │ └── code-editor.service.ts
│ │ │ │ ├── compile-workflow/
│ │ │ │ │ └── workflow-compiling.service.ts
│ │ │ │ ├── drag-drop/
│ │ │ │ │ ├── drag-drop.service.spec.ts
│ │ │ │ │ └── drag-drop.service.ts
│ │ │ │ ├── dynamic-schema/
│ │ │ │ │ ├── dynamic-schema.service.spec.ts
│ │ │ │ │ └── dynamic-schema.service.ts
│ │ │ │ ├── execute-workflow/
│ │ │ │ │ ├── execute-workflow.service.spec.ts
│ │ │ │ │ ├── execute-workflow.service.ts
│ │ │ │ │ ├── mock-result-data.ts
│ │ │ │ │ └── mock-workflow-plan.ts
│ │ │ │ ├── joint-ui/
│ │ │ │ │ ├── joint-ui.service.spec.ts
│ │ │ │ │ └── joint-ui.service.ts
│ │ │ │ ├── operator-debug/
│ │ │ │ │ ├── udf-debug.service.spec.ts
│ │ │ │ │ └── udf-debug.service.ts
│ │ │ │ ├── operator-menu/
│ │ │ │ │ ├── operator-menu.service.spec.ts
│ │ │ │ │ └── operator-menu.service.ts
│ │ │ │ ├── operator-metadata/
│ │ │ │ │ ├── mock-operator-metadata.data.ts
│ │ │ │ │ ├── operator-metadata.service.spec.ts
│ │ │ │ │ ├── operator-metadata.service.ts
│ │ │ │ │ └── stub-operator-metadata.service.ts
│ │ │ │ ├── panel/
│ │ │ │ │ └── panel.service.ts
│ │ │ │ ├── preset/
│ │ │ │ │ ├── preset.service.spec.ts
│ │ │ │ │ └── preset.service.ts
│ │ │ │ ├── report-generation/
│ │ │ │ │ └── report-generation.service.ts
│ │ │ │ ├── undo-redo/
│ │ │ │ │ ├── undo-redo.service.spec.ts
│ │ │ │ │ └── undo-redo.service.ts
│ │ │ │ ├── validation/
│ │ │ │ │ ├── validation-workflow.service.spec.ts
│ │ │ │ │ └── validation-workflow.service.ts
│ │ │ │ ├── virtual-environment/
│ │ │ │ │ └── virtual-environment.service.ts
│ │ │ │ ├── workflow-console/
│ │ │ │ │ ├── workflow-console.service.spec.ts
│ │ │ │ │ └── workflow-console.service.ts
│ │ │ │ ├── workflow-graph/
│ │ │ │ │ ├── model/
│ │ │ │ │ │ ├── coeditor-presence.service.spec.ts
│ │ │ │ │ │ ├── coeditor-presence.service.ts
│ │ │ │ │ │ ├── joint-graph-wrapper.spec.ts
│ │ │ │ │ │ ├── joint-graph-wrapper.ts
│ │ │ │ │ │ ├── mock-workflow-data.ts
│ │ │ │ │ │ ├── shared-model-change-handler.ts
│ │ │ │ │ │ ├── shared-model.ts
│ │ │ │ │ │ ├── sync-texera-model.spec.ts
│ │ │ │ │ │ ├── sync-texera-model.ts
│ │ │ │ │ │ ├── workflow-action.service.spec.ts
│ │ │ │ │ │ ├── workflow-action.service.ts
│ │ │ │ │ │ ├── workflow-graph.spec.ts
│ │ │ │ │ │ └── workflow-graph.ts
│ │ │ │ │ └── util/
│ │ │ │ │ ├── workflow-util.service.spec.ts
│ │ │ │ │ └── workflow-util.service.ts
│ │ │ │ ├── workflow-result/
│ │ │ │ │ ├── panel-resize/
│ │ │ │ │ │ ├── panel-resize.service.spec.ts
│ │ │ │ │ │ └── panel-resize.service.ts
│ │ │ │ │ ├── workflow-result.service.spec.ts
│ │ │ │ │ └── workflow-result.service.ts
│ │ │ │ ├── workflow-result-export/
│ │ │ │ │ ├── workflow-result-export.service.spec.ts
│ │ │ │ │ └── workflow-result-export.service.ts
│ │ │ │ ├── workflow-status/
│ │ │ │ │ ├── operator-reuse-cache-status.service.spec.ts
│ │ │ │ │ ├── operator-reuse-cache-status.service.ts
│ │ │ │ │ └── workflow-status.service.ts
│ │ │ │ └── workflow-websocket/
│ │ │ │ ├── workflow-websocket.service.spec.ts
│ │ │ │ └── workflow-websocket.service.ts
│ │ │ └── types/
│ │ │ ├── collab-websocket.interface.ts
│ │ │ ├── custom-json-schema.interface.ts
│ │ │ ├── execute-workflow.interface.ts
│ │ │ ├── operator-schema.interface.ts
│ │ │ ├── result-table.interface.ts
│ │ │ ├── shared-editing.interface.ts
│ │ │ ├── workflow-common.interface.ts
│ │ │ ├── workflow-compiling.interface.ts
│ │ │ └── workflow-websocket.interface.ts
│ │ ├── assets/
│ │ │ ├── .gitkeep
│ │ │ └── logos/
│ │ │ └── site.webmanifest
│ │ ├── environments/
│ │ │ ├── environment.default.ts
│ │ │ ├── environment.prod.ts
│ │ │ ├── environment.test.ts
│ │ │ └── environment.ts
│ │ ├── index.html
│ │ ├── jsdom-svg-polyfill.ts
│ │ ├── main.test.ts
│ │ ├── main.ts
│ │ ├── styles.scss
│ │ ├── test-zone-setup.ts
│ │ ├── tsconfig.app.json
│ │ ├── tsconfig.spec.json
│ │ ├── tsconfig.test.json
│ │ └── vitest-globals.d.ts
│ ├── tools/
│ │ └── jschardet-stub/
│ │ ├── index.js
│ │ └── package.json
│ ├── tsconfig.json
│ ├── vitest.browser.config.ts
│ └── vitest.config.ts
├── licenses/
│ ├── LICENSE-0BSD.txt
│ ├── LICENSE-BSD-2-Clause.txt
│ ├── LICENSE-BSD-3-Clause.txt
│ ├── LICENSE-CDDL-1.0.txt
│ ├── LICENSE-CDDL-1.1.txt
│ ├── LICENSE-EDL-1.0.txt
│ ├── LICENSE-EPL-1.0.txt
│ ├── LICENSE-EPL-2.0.txt
│ ├── LICENSE-ISC.txt
│ ├── LICENSE-MIT-CMU.txt
│ ├── LICENSE-MIT.txt
│ ├── LICENSE-MPL-2.0.txt
│ ├── LICENSE-PSF-2.0.txt
│ ├── LICENSE-Unlicense.txt
│ ├── LICENSE-avro.txt
│ ├── LICENSE-aws-sdk.txt
│ ├── LICENSE-awssdk-third-party-jackson.txt
│ ├── LICENSE-commons-math3.txt
│ ├── LICENSE-glassfish-hk2.txt
│ ├── LICENSE-guice.txt
│ ├── LICENSE-hadoop-shaded.txt
│ ├── LICENSE-hadoop.txt
│ ├── LICENSE-iceberg-bundled-guava.txt
│ ├── LICENSE-iceberg.txt
│ ├── LICENSE-jackson-afterburner.txt
│ ├── LICENSE-jackson-blackbird.txt
│ ├── LICENSE-jackson-core.txt
│ ├── LICENSE-jakarta-ee.txt
│ ├── LICENSE-javax-activation.txt
│ ├── LICENSE-javax-ee-cddl.txt
│ ├── LICENSE-javax-mail.txt
│ ├── LICENSE-jaxb-api.txt
│ ├── LICENSE-jersey.txt
│ ├── LICENSE-jetty-11.0.txt
│ ├── LICENSE-jetty-9.4.txt
│ ├── LICENSE-jetty-jakarta-servlet-api.txt
│ ├── LICENSE-lombok.txt
│ ├── LICENSE-lucene.txt
│ ├── LICENSE-netty-tcnative-boringssl.txt
│ ├── LICENSE-netty.txt
│ ├── LICENSE-pekko-actor.txt
│ ├── LICENSE-pekko-cluster.txt
│ ├── LICENSE-pekko-protobuf-v3.txt
│ ├── LICENSE-pekko-remote.txt
│ ├── LICENSE-postgresql.txt
│ ├── LICENSE-slf4j.txt
│ └── LICENSE-threeten-extra.txt
├── licenses-3rd-party-code/
│ ├── angular.md
│ ├── mbknor-jackson-jsonschema.txt
│ └── monaco-languageclient.txt
├── project/
│ ├── AddMetaInfLicenseFiles.scala
│ ├── JdkOptions.scala
│ ├── build.properties
│ └── plugins.sbt
├── pyright-language-service/
│ ├── README.md
│ ├── package.json
│ ├── src/
│ │ ├── config.json
│ │ ├── language-server-runner.ts
│ │ ├── main.ts
│ │ ├── server-commons.ts
│ │ └── types/
│ │ └── hocon-parser.d.ts
│ └── tsconfig.json
├── sql/
│ ├── changelog.xml
│ ├── docker-compose.yml
│ ├── iceberg_postgres_catalog.sql
│ ├── misc/
│ │ └── tweets.sql
│ ├── texera_ddl.sql
│ ├── texera_lakefs.sql
│ ├── texera_lakekeeper.sql
│ └── updates/
│ ├── 01.sql
│ ├── 02.sql
│ ├── 03.sql
│ ├── 04.sql
│ ├── 05.sql
│ ├── 06.sql
│ ├── 07.sql
│ ├── 08.sql
│ ├── 09.sql
│ ├── 10.sql
│ ├── 11.sql
│ ├── 12.sql
│ ├── 13.sql
│ ├── 14.sql
│ ├── 15.sql
│ ├── 16.sql
│ ├── 17.sql
│ ├── 18.sql
│ ├── 19.sql
│ ├── 20.sql
│ ├── 21.sql
│ └── 22.sql
└── workflow-compiling-service/
├── LICENSE-binary
├── NOTICE-binary
├── build.sbt
├── project/
│ └── build.properties
└── src/
├── main/
│ ├── resources/
│ │ └── workflow-compiling-service-config.yaml
│ └── scala/
│ └── org/
│ └── apache/
│ └── texera/
│ ├── amber/
│ │ └── compiler/
│ │ ├── WorkflowCompiler.scala
│ │ └── model/
│ │ ├── LogicalLink.scala
│ │ ├── LogicalPlan.scala
│ │ └── LogicalPlanPojo.scala
│ └── service/
│ ├── WorkflowCompilingService.scala
│ ├── WorkflowCompilingServiceConfiguration.scala
│ └── resource/
│ ├── HealthCheckResource.scala
│ └── WorkflowCompilationResource.scala
└── test/
├── resources/
│ └── country_sales_small.csv
└── scala/
└── org/
└── apache/
└── texera/
└── service/
└── resource/
└── WorkflowCompilationResourceSpec.scala
================================================
FILE CONTENTS
================================================
================================================
FILE: .asf.yaml
================================================
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# https://cwiki.apache.org/confluence/display/INFRA/Git+-+.asf.yaml+features
github:
description: "Human-AI Collaborative Data Science Using Visual Workflows"
homepage: https://texera.apache.org/
labels:
- human-ai-collaboration
- ai-agents
- visual-workflows
- data-science
- runtime-debugging
- artificial-intelligence
- machine-learning
- interactive-engine
- cloud-native
protected_tags:
- "v*.*.*"
dependabot_alerts: true
dependabot_updates: false
features:
# Enable wiki for documentation
wiki: true
# Enable issue management
issues: true
# Enable projects for project management boards
projects: true
# Enable github discussions
discussions: true
pull_requests:
# allow auto-merge
allow_auto_merge: true
# enable updating head branches of pull requests
allow_update_branch: true
# auto-delete head branches after being merged
del_branch_on_merge: true
enabled_merge_buttons:
squash: true
squash_commit_message: PR_TITLE_AND_DESC
merge: false
rebase: false
protected_branches:
main:
required_status_checks:
# strict means "Require branches to be up to date before merging".
strict: true
# contexts are the names of checks that must pass
contexts:
- Required Checks
- Check License Headers
- Validate PR title
required_pull_request_reviews:
dismiss_stale_reviews: false
require_code_owner_reviews: false
required_approving_review_count: 1
required_linear_history: true
required_conversation_resolution: true
notifications:
commits: commits@texera.apache.org
issues: notifications@texera.apache.org
pullrequests: notifications@texera.apache.org
discussions: dev@texera.apache.org
jobs: commits@texera.apache.org
================================================
FILE: .dockerignore
================================================
# Ignore all directories named `user-resources` anywhere in the project
**/user-resources/
# Ignoring binary/output
**/target/
**/out/
# Ignoring packages
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# Ignoring VSCode related files
.vscode/
# Ignoring IntelliJ related files
*.iml
.idea/
.idea_modules/
lib_managed/
src_managed/
# Ignoring Eclipse files
.classpath
.project
.settings
# Ignoring sublime files
*.sublime-workspace
# Ignoring index folder and data folder
index/
catalog/
plan/
plan_files/
query-results/
# Ignoring Mac OSX specific files
.DS_Store
# Ignoring jenv related files
.java-version
# Ignoring scala related files
hs_err_pid*
# Ignoring Python related files
venv/
__pycache__/
*.py[cod]
*$py.class
.ipynb_checkpoints
.pytype/
# Ignoring Python-generated files
*.model
*.pkl
# Ignoring user-generated resources
user-resources/
# Ignoring Gmail tokens
gmail/
# Ignoring Maven-related files
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
.mvn/wrapper/maven-wrapper.jar
# Ignoring sbt related files
.bsp/
sbt.json
# Ignoring rebel related files
rebel.xml
# Ignoring log files
*.log
*.log.gz
# Ignoring the entire log folder
log/
# Ignoring package-lock.json
package-lock.json
# Ignoring Protobuf related files
scalapb/scalapb
# Ignoring credentials
client_secret_*
StoredCredential*
**/apache2/
**/Apache24/
**/php/
Composer-Setup.exe
# Ignoring folders generated by VSCode IDE
.metals/
.bloop/
.ammonite/
metals.sbt
# === NEW: Ignore frontend-related files ===
# Ignore node_modules in all subdirectories
**/node_modules/
**/.pnp/
**/.pnp.js
# Ignore Angular build output
**/dist/
**/.angular/cache/
**/.nx/cache/
# Ignore Yarn cache and lock files
**/.yarn/cache/
**/.yarn/install-state.gz
**/.pnp.cjs
**/.pnp.loader.mjs
# Ignore frontend dependency-related files
**/yarn-error.log
**/.turbo/
**/.next/
**/coverage/
================================================
FILE: .gitattributes
================================================
* text=auto eol=lf
================================================
FILE: .github/ISSUE_TEMPLATE/bug-template.yaml
================================================
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: Bug Report
description: File a bug report.
type: "Bug"
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report!
- type: textarea
id: what-happened
attributes:
label: What happened?
description: Also tell us, what did you expect to happen?
placeholder: Tell us what you see!
value: "A bug happened!"
validations:
required: true
- type: textarea
id: reproduce
attributes:
label: How to reproduce?
description: Please include steps for a repro.
validations:
required: true
- type: dropdown
id: branch
attributes:
label: Branch
description: Which branch did you hit this on?
options:
- main
- 1.1.0-incubating
default: 0
validations:
required: true
- type: input
id: commit-hash
attributes:
label: Commit Hash (Optional)
description: If you know the specific commit that has the issue, please provide the commit hash here.
placeholder: e.g., a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0
validations:
required: false
- type: dropdown
id: browsers
attributes:
label: What browsers are you seeing the problem on?
multiple: true
options:
- Chrome
- Safari
- Firefox
- Microsoft Edge
- type: textarea
id: logs
attributes:
label: Relevant log output
description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
render: shell
- type: markdown
attributes:
value: |
By submitting this issue, you agree to follow the [Apache Code of Conduct](https://www.apache.org/foundation/policies/conduct).
================================================
FILE: .github/ISSUE_TEMPLATE/feature-template.yaml
================================================
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: Feature Request
description: Suggest a new feature or improvement.
type: "Feature"
body:
- type: markdown
attributes:
value: |
Thanks for suggesting a feature! Please provide as much detail as possible to help us evaluate your idea.
- type: textarea
id: summary
attributes:
label: Feature Summary
description: Clearly describe what the feature is and the problem it solves.
placeholder: Describe your feature idea and what problem it addresses.
validations:
required: true
- type: textarea
id: proposal
attributes:
label: Proposed Solution or Design
description: Explain how you imagine this feature working. Include examples, diagrams, or pseudo-code if relevant.
placeholder: Describe your proposed solution or design approach.
validations:
required: true
- type: dropdown
id: affected-area
attributes:
label: Affected Area
description: Which part of the system does this feature relate to?
multiple: true
options:
- Workflow Engine (Amber)
- Workflow UI
- Hub
- Storage / Metadata
- Deployment / Infrastructure
- Other
- type: markdown
attributes:
value: |
By submitting this issue, you agree to follow the [Apache Code of Conduct](https://www.apache.org/foundation/policies/conduct).
================================================
FILE: .github/ISSUE_TEMPLATE/task-template.yaml
================================================
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: Task
description: Create a new development or maintenance task.
type: "Task"
body:
- type: markdown
attributes:
value: |
Thanks for creating a task! Please describe what needs to be done and why.
- type: textarea
id: task-summary
attributes:
label: Task Summary
description: Briefly describe what needs to be done, try to do a single step in a task.
placeholder: Example — Refactor workflow scheduler module for better modularity.
validations:
required: true
- type: checkboxes
id: checklist
attributes:
label: Task Type
description: Select the type of work involved.
options:
- label: Refactor / Cleanup
- label: DevOps / Deployment / CI
- label: Testing / QA
- label: Documentation
- label: Performance
- label: Other
- type: markdown
attributes:
value: |
By submitting this issue, you agree to follow the [Apache Code of Conduct](https://www.apache.org/foundation/policies/conduct).
================================================
FILE: .github/PULL_REQUEST_TEMPLATE
================================================
<!--
Thanks for sending a pull request (PR)! Here are some tips for you:
1. If this is your first time, please read our contributor guidelines:
[Contributing to Texera](https://github.com/apache/texera/blob/main/CONTRIBUTING.md)
2. Ensure you have added or run the appropriate tests for your PR
3. If the PR is work in progress, mark it a draft on GitHub.
4. Please write your PR title to summarize what this PR proposes, we
are following Conventional Commits style for PR titles as well.
5. Be sure to keep the PR description updated to reflect all changes.
-->
### What changes were proposed in this PR?
<!--
Please clarify what changes you are proposing. The purpose of this section
is to outline the changes. Here are some tips for you:
1. If you propose a new API, clarify the use case for a new API.
2. If you fix a bug, you can clarify why it is a bug.
3. If it is a refactoring, clarify what has been changed.
3. It would be helpful to include a before-and-after comparison using
screenshots or GIFs.
4. Please consider writing useful notes for better and faster reviews.
-->
### Any related issues, documentation, discussions?
<!--
Please use this section to link other resources if not mentioned already.
1. If this PR fixes an issue, please include `Fixes #1234`, `Resolves #1234`
or `Closes #1234`. If it is only related, simply mention the issue number.
2. If there is design documentation, please add the link.
3. If there is a discussion in the mailing list, please add the link.
-->
### How was this PR tested?
<!--
If tests were added, say they were added here. Or simply mention that if the PR
is tested with existing test cases. Make sure to include/update test cases that
check the changes thoroughly including negative and positive cases if possible.
If it was tested in a way different from regular unit tests, please clarify how
you tested step by step, ideally copy and paste-able, so that other reviewers can
test and check, and descendants can verify in the future. If tests were not added,
please describe why they were not added and/or why it was difficult to add.
-->
### Was this PR authored or co-authored using generative AI tooling?
<!--
If generative AI tooling has been used in the process of authoring this PR,
please include the phrase: 'Generated-by: ' followed by the name of the tool
and its version. If no, write 'No'.
Please refer to the [ASF Generative Tooling Guidance](https://www.apache.org/legal/generative-tooling.html) for details.
-->
================================================
FILE: .github/labeler.yml
================================================
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
frontend:
- changed-files:
- any-glob-to-any-file:
- 'frontend/**'
common:
- changed-files:
- any-glob-to-any-file:
- 'common/**'
# Root-level Scala build / lint config: a change to any of these
# affects every Scala stack (amber + the platform services).
- 'build.sbt'
- 'project/**'
- '.scalafix.conf'
- '.scalafmt.conf'
platform:
- changed-files:
- any-glob-to-any-file:
- 'access-control-service/**'
- 'computing-unit-managing-service/**'
- 'config-service/**'
- 'file-service/**'
- 'workflow-compiling-service/**'
agent-service:
- changed-files:
- any-glob-to-any-file:
- 'agent-service/**'
engine:
# Non-Python, non-integration parts of amber/. Pure Python changes
# under amber/src/{main,test}/python/** intentionally fall through to
# the `python` label (which the labeler also matches via **/*.py),
# so they only trigger the python + amber-integration stacks rather
# than the full Scala-only `amber` stack. Integration specs live
# under amber/src/test/integration/** (added to sbt's Test sources
# via amber/build.sbt) and are caught by the `amber-integration`
# label below. Top-level Scala formatter / linter configs are
# included so a PR that only updates them still triggers the Scala
# stacks instead of producing an empty stack union.
- changed-files:
- any-glob-to-any-file:
- 'amber/build.sbt'
- 'amber/.scalafmt.conf'
- 'amber/.scalafix.conf'
- 'amber/project/**'
- 'amber/src/main/scala/**'
- 'amber/src/main/java/**'
- 'amber/src/main/protobuf/**'
- 'amber/src/main/resources/**'
- 'amber/src/test/scala/**'
- 'amber/src/test/java/**'
amber-integration:
# Scala specs that exercise both Scala and Python end-to-end. They
# live under amber/src/test/integration/** (sbt picks them up via
# `Test / unmanagedSourceDirectories += .../test/integration` in
# amber/build.sbt) and are tagged @org.apache.texera.amber.tags
# .IntegrationTest. This label maps to the amber-integration stack
# only, so a PR that touches just an integration spec does not pay
# for the full Scala-only `amber` job.
- changed-files:
- any-glob-to-any-file:
- 'amber/src/test/integration/**'
python:
# Includes pip requirement manifests so dependency-only PRs still
# exercise the Python + amber-integration stacks. Without this a
# bumped requirements.txt would only get `dependencies` (no stack
# mapping) and silently skip CI for the very deps it's changing.
- changed-files:
- any-glob-to-any-file:
- 'amber/src/main/python/**'
- 'amber/src/test/python/**'
- 'amber/pyproject.toml'
- '**/*.py'
- '**/requirements.txt'
- '**/*-requirements.txt'
docs:
- changed-files:
- any-glob-to-any-file:
- 'docs/**'
- '**/*.md'
- 'NOTICE'
- 'LICENSE'
ci:
- changed-files:
- any-glob-to-any-file:
- '.github/**'
- '.asf.yaml'
- 'codecov.yml'
dev:
- changed-files:
- any-glob-to-any-file:
- 'bin/**'
dependencies:
- changed-files:
- any-glob-to-any-file:
- '**/requirements.txt'
- '**/package.json'
- '**/build.sbt'
- '**/project.sbt'
ddl-change:
- changed-files:
- any-glob-to-any-file:
- '**/*.sql'
feature:
- head-branch:
- '^feat'
- 'feature'
fix:
- head-branch: '^fix'
refactor:
- head-branch: '^refactor'
================================================
FILE: .github/release/vote-email-template.md
================================================
Subject: [VOTE] Release Apache Texera (incubating) ${VERSION} RC${RC_NUM}
Hi Texera Community,
This is a call for vote to release Apache Texera (incubating) ${VERSION}.
== Release Candidate Artifacts ==
https://dist.apache.org/repos/dist/dev/incubator/texera/${VERSION}-RC${RC_NUM}/
The directory contains:
- Source tarball (.tar.gz) with GPG signature (.asc) and SHA512 checksum (.sha512)
- Docker Compose deployment bundle with GPG signature and SHA512 checksum
== Container Images ==
Container images are available at:
${IMAGE_REGISTRY}/texera-dashboard-service:${VERSION}
${IMAGE_REGISTRY}/texera-workflow-execution-coordinator:${VERSION}
${IMAGE_REGISTRY}/texera-workflow-compiling-service:${VERSION}
${IMAGE_REGISTRY}/texera-file-service:${VERSION}
${IMAGE_REGISTRY}/texera-config-service:${VERSION}
${IMAGE_REGISTRY}/texera-access-control-service:${VERSION}
${IMAGE_REGISTRY}/texera-workflow-computing-unit-managing-service:${VERSION}
These images are built from the source tarball included in this release.
The Dockerfiles are included in the source for audit and verification.
== Git Tag ==
https://github.com/apache/texera/releases/tag/${TAG_NAME}
Commit: ${COMMIT_HASH}
== Keys ==
The release was signed with GPG key [${GPG_KEY_ID}] (${GPG_EMAIL})
KEYS file: https://downloads.apache.org/incubator/texera/KEYS
== Vote ==
The vote will be open for at least 72 hours.
[ ] +1 Approve the release
[ ] 0 No opinion
[ ] -1 Disapprove the release (please provide the reason)
== Checklist ==
[ ] Checksums and PGP signatures are valid
[ ] LICENSE and NOTICE files are correct
[ ] All files have ASF license headers where appropriate
[ ] No unexpected binary files
[ ] Source tarball matches the Git tag
[ ] Can compile from source successfully
[ ] Docker Compose bundle deploys successfully with the published images
Thanks,
[Your Name]
Apache Texera (incubating) PPMC
================================================
FILE: .github/scripts/compose-backport-message.py
================================================
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Composes the backport commit message: insert "(backported from commit X)"
# between the message body and the trailer block (the trailing run of
# `Key: value` lines such as Co-Authored-By and Signed-off-by) so trailers
# stay contiguous at the bottom — that's where git itself parses them.
#
# The trailer block, by git convention, is the run of `Key: value` lines
# after the LAST blank line in the message, and only counts if EVERY line
# after that blank line is in trailer format. This avoids mis-detecting a
# Conventional Commits subject like "feat: foo" or a body line like
# "References:" as a trailer.
#
# Usage: original-message-on-stdin | compose-backport-message.py <merge-sha>
import re
import sys
sha = sys.argv[1]
msg = sys.stdin.read().rstrip("\n")
lines = msg.split("\n")
trailer_re = re.compile(r"^[A-Za-z][A-Za-z0-9-]*:\s")
last_blank = -1
for idx in range(len(lines) - 1, -1, -1):
if lines[idx] == "":
last_blank = idx
break
trailer_start = len(lines)
if last_blank != -1:
candidate = lines[last_blank + 1 :]
if candidate and all(trailer_re.match(line) for line in candidate):
trailer_start = last_blank + 1
backport = f"(backported from commit {sha})"
if trailer_start == len(lines):
print(msg + "\n\n" + backport)
else:
body = "\n".join(lines[:trailer_start]).rstrip("\n")
trailers = "\n".join(lines[trailer_start:])
print(body + "\n\n" + backport + "\n\n" + trailers)
================================================
FILE: .github/scripts/prepare-backport-checkout.sh
================================================
#!/usr/bin/env bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set -euo pipefail
target_branch="${1:?target branch is required}"
commit_range="${2:?commit range is required}"
workspace_branch="ci-backport-${target_branch//\//-}"
git fetch --no-tags origin "${target_branch}"
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
if [[ "${commit_range}" != *..* ]]; then
echo "Invalid commit range: ${commit_range}" >&2
exit 1
fi
start_sha="${commit_range%..*}"
end_sha="${commit_range##*..}"
if [[ -z "$(git rev-list -n 1 "${commit_range}")" ]]; then
echo "No commits found in range ${commit_range}" >&2
exit 1
fi
# Build a single squash commit whose parent is the range start and whose tree
# matches the range end. Cherry-picking this squash onto the release branch
# applies the cumulative diff in one 3-way merge, which avoids spurious
# conflicts when intermediate commits in the range happen to overlap with
# changes already present (under different SHAs) on the release branch.
end_tree="$(git rev-parse "${end_sha}^{tree}")"
squash_sha="$(git commit-tree -p "${start_sha}" -m "ci: squashed backport of ${commit_range}" "${end_tree}")"
git checkout -B "${workspace_branch}" "origin/${target_branch}"
git cherry-pick -x "${squash_sha}"
================================================
FILE: .github/workflows/auto-queue.yml
================================================
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Temporary stand-in for GitHub Merge Queue.
#
# Triggers:
# * push to main: advance the queue right after a merge.
# * pull_request {auto_merge_enabled, ready_for_review}: a PR just
# became eligible — kick the queue without waiting for cron.
# * pull_request_review {submitted}: an approval may have just made
# a PR eligible (script filters non-approval review states).
# * workflow_run {Required Checks, completed}: the head PR's CI
# just finished. On success, auto-merge fires and the next push to
# main triggers us; on failure, the head PR's CI moves from PENDING
# to FAILURE so the in-flight guard releases — this trigger gives
# us a same-second kick instead of waiting on cron.
# * 5-minute cron: bounded safety net for any missed event delivery
# and for PRs that became BEHIND without producing any of the above.
# * workflow_dispatch: manual smoke test.
#
# Strategy: scan open PRs targeting main and pick the oldest eligible PR with
# mergeStateStatus=BEHIND, then call updateBranch on it. A PR is eligible only
# if it would actually merge once CI passes — auto-merge enabled, not a draft,
# not conflicting, reviewDecision=APPROVED, and zero unresolved review threads.
# This avoids burning CI on PRs blocked on review.
#
# Emergency priority: a PR carrying the `emergency` label is bumped before
# any non-emergency PR regardless of CREATED_AT ordering, AND its presence
# in BEHIND bypasses the in-flight guard so a non-emergency PR's running
# CI does not delay the bump. Non-emergency PRs continue to wait for the
# queue head as usual.
#
# In-flight guard: if any eligible PR is already past the BEHIND state and
# its required CI is still running (mergeStateStatus != BEHIND and
# statusCheckRollup state is PENDING/EXPECTED), the run exits without
# bumping anyone else. That PR is the queue head; bumping a different PR
# while it is in flight would just preempt CI capacity for a PR that
# would still need re-bumping after the head merges. PRs that are
# BEHIND with PENDING checks do NOT count as in-flight — that CI is on
# pre-update code and would need to re-run after updateBranch anyway.
#
# mergeStateStatus is computed asynchronously and is UNKNOWN for a window
# after a base-branch push. If at least one eligible PR is UNKNOWN, retry
# with backoff up to ~2min to let it settle. If everything is settled and
# nothing is BEHIND, exit without retrying — there's no work.
#
# Token: needs AUTO_MERGE_TOKEN with contents:write + pull_requests:write so
# the resulting push retriggers required CI on the PR. Falls back to
# GITHUB_TOKEN, in which case auto-merge will not actually fire (GITHUB_TOKEN
# pushes don't trigger downstream workflows).
name: Auto Queue
on:
push:
branches: [main]
pull_request:
types: [auto_merge_enabled, ready_for_review]
pull_request_review:
types: [submitted]
workflow_run:
workflows: [Required Checks]
types: [completed]
schedule:
- cron: '*/5 * * * *'
workflow_dispatch:
permissions:
contents: write
pull-requests: write
concurrency:
group: autoqueue-${{ github.repository }}
cancel-in-progress: false
jobs:
update-next-auto-merge-pr:
runs-on: ubuntu-latest
steps:
- uses: actions/github-script@v7
with:
github-token: ${{ secrets.AUTO_MERGE_TOKEN || secrets.GITHUB_TOKEN }}
script: |
const { owner, repo } = context.repo;
// pull_request_review fires for any submitted review (Comment /
// Approve / Request changes). Only Approve can newly satisfy the
// reviewDecision=APPROVED gate, so other states are pure no-ops
// worth short-circuiting before the GraphQL call.
if (
context.eventName === 'pull_request_review' &&
context.payload.review?.state !== 'approved'
) {
core.info(
`Skip: pull_request_review state=` +
`${context.payload.review?.state} (only "approved" can ` +
`change queue eligibility).`
);
return;
}
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
// 0, 10, 20, 30, 30, 30 = 120s total wall-clock budget across
// attempts. Short ramp catches the common case where
// mergeStateStatus settles within ~30s of a base-branch push;
// the tail keeps trying for the rare slow case.
const BACKOFFS_MS = [0, 10000, 20000, 30000, 30000, 30000];
const query = `
query($owner:String!, $name:String!) {
repository(owner:$owner, name:$name) {
pullRequests(
states: OPEN,
baseRefName: "main",
first: 100,
orderBy: {field: CREATED_AT, direction: ASC}
) {
nodes {
number
title
isDraft
mergeable
mergeStateStatus
reviewDecision
autoMergeRequest { enabledAt }
labels(first: 20) {
nodes { name }
}
reviewThreads(first: 100) {
nodes { isResolved }
}
commits(last: 1) {
nodes {
commit {
statusCheckRollup { state }
}
}
}
}
}
}
}`;
// Carrying the `emergency` label lifts a PR above all other
// eligible PRs: it is bumped first regardless of CREATED_AT, and
// its presence in BEHIND bypasses the in-flight guard so a
// non-emergency PR's running CI does not block the bump.
const EMERGENCY_LABEL = 'emergency';
function isEmergency(p) {
return (p.labels?.nodes ?? []).some(
(l) => l.name === EMERGENCY_LABEL,
);
}
function classify(p) {
if (!p.autoMergeRequest) return 'skip: auto-merge not enabled';
if (p.isDraft) return 'skip: draft';
if (p.mergeable === 'CONFLICTING') return 'skip: mergeable=CONFLICTING';
if (p.reviewDecision !== 'APPROVED') {
return `skip: reviewDecision=${p.reviewDecision || 'NONE'}`;
}
const threads = p.reviewThreads?.nodes ?? [];
const unresolved = threads.filter((t) => !t.isResolved).length;
if (unresolved > 0) {
return `skip: ${unresolved} unresolved review thread(s)`;
}
const tag = isEmergency(p) ? ' [emergency]' : '';
return `eligible${tag}: mergeable=${p.mergeable} state=${p.mergeStateStatus}`;
}
const start = Date.now();
for (let attempt = 0; attempt < BACKOFFS_MS.length; attempt++) {
if (BACKOFFS_MS[attempt] > 0) {
const elapsedS = Math.round((Date.now() - start) / 1000);
core.info(
`Waiting ${BACKOFFS_MS[attempt] / 1000}s before attempt ` +
`${attempt + 1}/${BACKOFFS_MS.length} (elapsed ${elapsedS}s).`
);
await sleep(BACKOFFS_MS[attempt]);
}
core.startGroup(`Attempt ${attempt + 1}/${BACKOFFS_MS.length}`);
let data;
try {
data = await github.graphql(query, { owner, name: repo });
} catch (e) {
// Transient GitHub API failures (5xx, "terminated", etc.)
// shouldn't kill the whole run — the backoff loop is exactly
// the right place to absorb them. Try again next attempt.
core.warning(
`GraphQL query failed (status ${e.status ?? '?'}): ` +
`${e.message}. Retrying after backoff.`
);
core.endGroup();
continue;
}
const all = data.repository.pullRequests.nodes;
core.info(`Scanned ${all.length} open PR(s) targeting main.`);
const behind = [];
const unknown = [];
const inFlight = [];
for (const p of all) {
const verdict = classify(p);
core.info(` #${p.number} ${verdict} — ${p.title}`);
if (!verdict.startsWith('eligible')) continue;
if (p.mergeStateStatus === 'BEHIND') {
behind.push(p);
continue;
}
if (p.mergeStateStatus === 'UNKNOWN') {
unknown.push(p);
continue;
}
// Eligible AND not BEHIND/UNKNOWN: this PR is ahead of any
// BEHIND PR in the queue. Treat it as in-flight only if its
// current required CI is actually working toward a merge.
// PENDING/EXPECTED (CI still running on the with-main code)
// means "wait for it"; SUCCESS (about to auto-merge) means
// "wait for it"; FAILURE/ERROR (CI failed) is NOT in-flight
// — auto-merge will not fire, queue can advance past it.
const ciState =
p.commits?.nodes?.[0]?.commit?.statusCheckRollup?.state;
if (
ciState === 'PENDING' ||
ciState === 'EXPECTED' ||
ciState === 'SUCCESS'
) {
inFlight.push({ pr: p, ciState });
}
}
// Stable partition: emergency-labeled PRs go first; within
// each priority class the GraphQL ASC-by-CREATED_AT order
// is preserved.
const emergencyBehind = behind.filter(isEmergency);
const normalBehind = behind.filter((p) => !isEmergency(p));
const orderedBehind = [...emergencyBehind, ...normalBehind];
core.info(
`Eligible: ${behind.length} BEHIND ` +
`(${emergencyBehind.length} emergency), ` +
`${unknown.length} UNKNOWN, ` +
`${inFlight.length} in-flight (queue head still merging), ` +
`rest blocked on failed CI or non-CI gates.`
);
// Emergency BEHIND bypasses the in-flight guard: an emergency
// is by definition something that should preempt CI capacity
// on a non-emergency PR. Without an emergency, fall back to
// the normal "wait for the queue head" behavior.
if (inFlight.length > 0 && emergencyBehind.length === 0) {
const head = inFlight[0];
core.info(
`Skip: PR #${head.pr.number} is in flight ` +
`(state=${head.pr.mergeStateStatus}, ci=${head.ciState}). ` +
`Letting it finish to avoid preempting CI on a PR we may ` +
`need to re-bump.`
);
core.endGroup();
return;
}
if (inFlight.length > 0 && emergencyBehind.length > 0) {
core.info(
`${emergencyBehind.length} emergency PR(s) BEHIND — ` +
`bypassing in-flight guard for #${inFlight[0].pr.number}.`
);
}
if (orderedBehind.length > 0) {
let updated = null;
for (const pr of orderedBehind) {
const tag = isEmergency(pr) ? ' [emergency]' : '';
core.info(`→ updateBranch #${pr.number}${tag}`);
try {
const res = await github.rest.pulls.updateBranch({
owner, repo, pull_number: pr.number,
});
core.info(
`✓ #${pr.number} updateBranch dispatched (HTTP ${res.status}).`
);
updated = pr.number;
break;
} catch (e) {
core.warning(
`✗ #${pr.number} updateBranch failed ` +
`(status ${e.status ?? '?'}): ${e.message}`
);
}
}
core.endGroup();
if (updated !== null) {
core.info(`Done: #${updated} updated on attempt ${attempt + 1}.`);
return;
}
core.info(
'All BEHIND PRs failed updateBranch this attempt; retrying after backoff.'
);
continue;
}
if (unknown.length > 0) {
core.info(
`No BEHIND PRs yet; ${unknown.length} eligible PR(s) ` +
'still UNKNOWN — retrying after backoff to let GitHub settle.'
);
core.endGroup();
continue;
}
core.info(
'No BEHIND or UNKNOWN eligible PRs — nothing to do this run.'
);
core.endGroup();
return;
}
const totalS = Math.round((Date.now() - start) / 1000);
core.info(
`Exhausted ${BACKOFFS_MS.length} attempt(s) over ${totalS}s ` +
`without finding a BEHIND PR to update.`
);
================================================
FILE: .github/workflows/automatic-email-notif-on-ddl-change.yml
================================================
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: Automatic email notification on DDL change
on:
pull_request:
types:
- closed
jobs:
notify:
if: >-
github.event.pull_request.merged == true &&
contains(github.event.pull_request.labels.*.name, 'ddl-change')
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v5
with:
fetch-depth: 0
sparse-checkout: sql/updates/
- name: Get added file in sql/updates/
id: get_sql_file
run: |
FILE=$(git diff --name-only --diff-filter=A \
${{ github.event.pull_request.base.sha }} \
${{ github.event.pull_request.merge_commit_sha }} \
-- 'sql/updates/')
echo "sql_file=$FILE" >> $GITHUB_OUTPUT
- name: Send email
run: |
curl --ssl-reqd \
--url "smtps://smtp.gmail.com:465" \
--user "${{ secrets.NOREPLY_EMAIL_USERNAME }}:${{ secrets.NOREPLY_EMAIL_PASSWORD }}" \
--mail-from "${{ secrets.NOREPLY_EMAIL_USERNAME }}" \
--mail-rcpt "dev@texera.apache.org" \
--upload-file - <<EOF
From: ${{ secrets.NOREPLY_EMAIL_USERNAME }}
To: dev@texera.apache.org
Reply-To: dev@texera.apache.org
Subject: Actions Required After Pulling Latest Update
Content-Type: text/html
<p>Hi all,</p>
<p>We have merged PR #${{ github.event.pull_request.number }} (<a href="${{ github.event.pull_request.html_url }}">${{ github.event.pull_request.html_url }}</a>): ${{ github.event.pull_request.title }}. To incorporate the change, please apply ${{ steps.get_sql_file.outputs.sql_file }} to your local Postgres instance and run <code>sbt jooqGenerate</code> to generate jooq classes.</p>
<p>Best,<br>${{ github.event.pull_request.user.login }}</p>
EOF
================================================
FILE: .github/workflows/build-and-push-images.yml
================================================
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
name: Build and push images
on:
workflow_dispatch:
inputs:
branch:
description: 'Branch to checkout and build from'
required: false
default: 'main'
type: string
image_tag:
description: 'Docker image tag (e.g., latest, v1.0.0). Leave empty to use the short commit hash of the branch.'
required: false
default: ''
type: string
docker_registry:
description: 'Full image registry prefix (e.g., ghcr.io/apache, docker.io/apache)'
required: false
default: 'ghcr.io/apache'
type: string
services:
description: 'Services to build (comma-separated, "*" for all)'
required: false
default: '*'
type: string
platforms:
description: 'Target platforms to build'
required: false
default: 'both'
type: choice
options:
- both
- amd64
- arm64
schedule:
# Run nightly at 2:00 AM UTC
- cron: '0 2 * * *'
permissions:
contents: read
packages: write # Required for pushing to ghcr.io
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event.inputs.image_tag || 'nightly' }}
cancel-in-progress: false
jobs:
# Step 0: Set runtime parameters (handles both manual and scheduled runs)
set-parameters:
runs-on: ubuntu-latest
if: github.event_name != 'schedule' || github.repository == 'apache/texera'
outputs:
branch: ${{ steps.set-params.outputs.branch }}
image_tag: ${{ steps.set-params.outputs.image_tag }}
docker_registry: ${{ steps.set-params.outputs.docker_registry }}
services: ${{ steps.set-params.outputs.services }}
platforms: ${{ steps.set-params.outputs.platforms }}
steps:
- name: Set build parameters
id: set-params
env:
GH_TOKEN: ${{ github.token }}
run: |
# Detect if this is a scheduled run
if [[ "${{ github.event_name }}" == "schedule" ]]; then
echo "Nightly build detected - using nightly defaults"
echo "branch=main" >> $GITHUB_OUTPUT
echo "image_tag=latest" >> $GITHUB_OUTPUT
echo "docker_registry=ghcr.io/apache" >> $GITHUB_OUTPUT
echo "services=*" >> $GITHUB_OUTPUT
echo "platforms=both" >> $GITHUB_OUTPUT
else
echo "Manual workflow_dispatch - using user inputs"
BRANCH="${{ github.event.inputs.branch || 'main' }}"
IMAGE_TAG="${{ github.event.inputs.image_tag }}"
# If image_tag is empty, resolve to the short commit hash of the branch
if [[ -z "$IMAGE_TAG" ]]; then
COMMIT_SHORT=$(gh api "repos/${{ github.repository }}/commits/${BRANCH}" --jq '.sha[:9]')
IMAGE_TAG="$COMMIT_SHORT"
echo "No image tag specified - using short commit hash: $IMAGE_TAG"
fi
echo "branch=$BRANCH" >> $GITHUB_OUTPUT
echo "image_tag=$IMAGE_TAG" >> $GITHUB_OUTPUT
echo "docker_registry=${{ github.event.inputs.docker_registry || 'ghcr.io/apache' }}" >> $GITHUB_OUTPUT
echo "services=${{ github.event.inputs.services || '*' }}" >> $GITHUB_OUTPUT
echo "platforms=${{ github.event.inputs.platforms || 'both' }}" >> $GITHUB_OUTPUT
fi
# Step 1: Generate JOOQ code once and share it
generate-jooq:
needs: [set-parameters]
runs-on: ubuntu-latest
env:
JAVA_OPTS: -Xms2048M -Xmx2048M -Xss6M -XX:ReservedCodeCacheSize=256M -Dfile.encoding=UTF-8
JVM_OPTS: -Xms2048M -Xmx2048M -Xss6M -XX:ReservedCodeCacheSize=256M -Dfile.encoding=UTF-8
steps:
- name: Checkout Texera
uses: actions/checkout@v5
with:
ref: ${{ needs.set-parameters.outputs.branch }}
- name: Setup JDK
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: 17
- name: Setup sbt launcher
uses: sbt/setup-sbt@508b753e53cb6095967669e0911487d2b9bc9f41 # v1.1.22
- uses: coursier/cache-action@90c37294538be80a558fd665531fcdc2b467b475 # v8.1.0
with:
extraSbtFiles: '["*.sbt", "project/**.{scala,sbt}", "project/build.properties" ]'
- name: Install PostgreSQL
run: sudo apt-get update && sudo apt-get install -y postgresql
- name: Start PostgreSQL Service
run: sudo systemctl start postgresql
- name: Configure PostgreSQL authentication
run: |
sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'postgres';"
sudo sed -i 's/local all postgres peer/local all postgres md5/' /etc/postgresql/*/main/pg_hba.conf
sudo sed -i 's/host all all 127.0.0.1\/32 scram-sha-256/host all all 127.0.0.1\/32 md5/' /etc/postgresql/*/main/pg_hba.conf
sudo systemctl restart postgresql
sleep 2
- name: Create Databases
run: |
PGPASSWORD=postgres psql -h localhost -U postgres -f sql/texera_ddl.sql
PGPASSWORD=postgres psql -h localhost -U postgres -f sql/iceberg_postgres_catalog.sql
PGPASSWORD=postgres psql -h localhost -U postgres -f sql/texera_lakefs.sql
- name: Generate JOOQ code
run: sbt DAO/jooqGenerate
- name: Upload JOOQ generated code
uses: actions/upload-artifact@v5
with:
name: jooq-code
path: |
common/dao/src/main/scala/org/apache/texera/dao/jooq/generated/
retention-days: 1
# Step 2: Parse services and prepare build matrix
prepare-matrix:
needs: [set-parameters]
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
build_amd64: ${{ steps.set-platforms.outputs.build_amd64 }}
build_arm64: ${{ steps.set-platforms.outputs.build_arm64 }}
need_manifest: ${{ steps.set-platforms.outputs.need_manifest }}
steps:
- name: Checkout Texera
uses: actions/checkout@v5
with:
ref: ${{ needs.set-parameters.outputs.branch }}
- name: Set target platforms
id: set-platforms
run: |
PLATFORM_INPUT="${{ needs.set-parameters.outputs.platforms }}"
case "$PLATFORM_INPUT" in
both)
echo "build_amd64=true" >> $GITHUB_OUTPUT
echo "build_arm64=true" >> $GITHUB_OUTPUT
echo "need_manifest=true" >> $GITHUB_OUTPUT
echo "Building for both platforms (parallel jobs)"
;;
amd64)
echo "build_amd64=true" >> $GITHUB_OUTPUT
echo "build_arm64=false" >> $GITHUB_OUTPUT
echo "need_manifest=false" >> $GITHUB_OUTPUT
echo "Building for AMD64 only"
;;
arm64)
echo "build_amd64=false" >> $GITHUB_OUTPUT
echo "build_arm64=true" >> $GITHUB_OUTPUT
echo "need_manifest=false" >> $GITHUB_OUTPUT
echo "Building for ARM64 only"
;;
esac
- name: Discover and parse services
id: set-matrix
run: |
SERVICES="${{ needs.set-parameters.outputs.services }}"
# Discover all Dockerfiles in bin/ directory
echo "Discovering services from Dockerfiles..."
cd bin
# Standard services from *.dockerfile pattern (excluding postgres17-pgroonga)
STANDARD_SERVICES=()
for dockerfile in *.dockerfile; do
if [[ -f "$dockerfile" ]]; then
service_name=$(basename "$dockerfile" .dockerfile)
# Skip postgres17-pgroonga
if [[ "$service_name" != "postgres17-pgroonga" ]]; then
STANDARD_SERVICES+=("$service_name")
fi
fi
done
# All services are standard services only
ALL_SERVICES=("${STANDARD_SERVICES[@]}")
echo "Found ${#ALL_SERVICES[@]} services: ${ALL_SERVICES[*]}"
# Filter based on user input
if [[ "$SERVICES" == "*" ]]; then
SERVICES_LIST=("${ALL_SERVICES[@]}")
else
IFS=',' read -ra SERVICES_LIST <<< "$SERVICES"
# Trim whitespace
for i in "${!SERVICES_LIST[@]}"; do
SERVICES_LIST[$i]=$(echo "${SERVICES_LIST[$i]}" | xargs)
done
fi
# Create JSON matrix with dockerfile info
JSON="["
FIRST=true
for service in "${SERVICES_LIST[@]}"; do
# Determine dockerfile path and context
if [[ " ${STANDARD_SERVICES[@]} " =~ " ${service} " ]]; then
dockerfile="bin/${service}.dockerfile"
context="."
# Map dockerfile service names to Docker image names
case "$service" in
"texera-web-application")
image_name="texera-dashboard-service"
;;
"computing-unit-master")
image_name="texera-workflow-execution-coordinator"
;;
"computing-unit-worker")
image_name="texera-workflow-execution-runner"
;;
"access-control-service")
image_name="texera-access-control-service"
;;
"config-service")
image_name="texera-config-service"
;;
"file-service")
image_name="texera-file-service"
;;
"workflow-compiling-service")
image_name="texera-workflow-compiling-service"
;;
"workflow-computing-unit-managing-service")
image_name="texera-workflow-computing-unit-managing-service"
;;
"agent-service")
image_name="texera-agent-service"
;;
*)
# Default: use service name as-is
image_name="$service"
;;
esac
else
echo "WARNING: Unknown service: $service, skipping"
continue
fi
if [[ "$FIRST" == "true" ]]; then
FIRST=false
else
JSON+=","
fi
JSON+="{\"service\":\"$service\",\"image_name\":\"$image_name\",\"dockerfile\":\"$dockerfile\",\"context\":\"$context\"}"
done
JSON+="]"
echo "Generated matrix: $JSON"
echo "matrix={\"include\":$JSON}" >> $GITHUB_OUTPUT
# Step 3a: Build AMD64 images (runs in parallel with ARM64)
build-amd64:
runs-on: ubuntu-latest
needs: [set-parameters, generate-jooq, prepare-matrix]
if: needs.prepare-matrix.outputs.build_amd64 == 'true'
strategy:
matrix: ${{ fromJson(needs.prepare-matrix.outputs.matrix) }}
fail-fast: false
max-parallel: 8 # Higher parallelism for native builds
env:
DOCKER_REGISTRY: ${{ needs.set-parameters.outputs.docker_registry }}
JAVA_OPTS: -Xms2048M -Xmx2048M -Xss6M -XX:ReservedCodeCacheSize=256M -Dfile.encoding=UTF-8
JVM_OPTS: -Xms2048M -Xmx2048M -Xss6M -XX:ReservedCodeCacheSize=256M -Dfile.encoding=UTF-8
steps:
- name: Checkout Texera
uses: actions/checkout@v5
with:
ref: ${{ needs.set-parameters.outputs.branch }}
- name: Setup JDK
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: 17
- name: Setup sbt launcher
uses: sbt/setup-sbt@508b753e53cb6095967669e0911487d2b9bc9f41 # v1.1.22
- uses: coursier/cache-action@90c37294538be80a558fd665531fcdc2b467b475 # v8.1.0
with:
extraSbtFiles: '["*.sbt", "project/**.{scala,sbt}", "project/build.properties" ]'
- name: Download JOOQ generated code
uses: actions/download-artifact@v6
with:
name: jooq-code
path: common/dao/src/main/scala/org/apache/texera/dao/jooq/generated/
- name: Free up disk space
run: |
sudo apt-get clean
sudo rm -rf /usr/share/dotnet
sudo rm -rf /opt/ghc
sudo rm -rf /usr/local/share/boost
df -h
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0
- name: Log in to GitHub Container Registry
if: startsWith(needs.set-parameters.outputs.docker_registry, 'ghcr.io/')
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Log in to Docker Hub
if: ${{ !startsWith(needs.set-parameters.outputs.docker_registry, 'ghcr.io/') }}
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Build and push AMD64 image
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
with:
context: ${{ matrix.context }}
file: ${{ matrix.dockerfile }}
platforms: linux/amd64
push: true
tags: ${{ env.DOCKER_REGISTRY }}/${{ matrix.image_name }}:${{ needs.set-parameters.outputs.image_tag }}-amd64
cache-from: type=gha,scope=${{ matrix.image_name }}-amd64
cache-to: type=gha,mode=max,scope=${{ matrix.image_name }}-amd64
labels: |
org.opencontainers.image.title=${{ matrix.image_name }}
org.opencontainers.image.description=Apache Texera ${{ matrix.image_name }} (AMD64)
org.opencontainers.image.vendor=Apache Texera
# Step 3b: Build ARM64 images (runs in parallel with AMD64)
build-arm64:
runs-on: ubuntu-latest
needs: [set-parameters, generate-jooq, prepare-matrix]
if: needs.prepare-matrix.outputs.build_arm64 == 'true'
strategy:
matrix: ${{ fromJson(needs.prepare-matrix.outputs.matrix) }}
fail-fast: false
max-parallel: 4 # Lower for QEMU builds
env:
DOCKER_REGISTRY: ${{ needs.set-parameters.outputs.docker_registry }}
JAVA_OPTS: -Xms2048M -Xmx2048M -Xss6M -XX:ReservedCodeCacheSize=256M -Dfile.encoding=UTF-8
JVM_OPTS: -Xms2048M -Xmx2048M -Xss6M -XX:ReservedCodeCacheSize=256M -Dfile.encoding=UTF-8
steps:
- name: Checkout Texera
uses: actions/checkout@v5
with:
ref: ${{ needs.set-parameters.outputs.branch }}
- name: Setup JDK
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: 17
- name: Setup sbt launcher
uses: sbt/setup-sbt@508b753e53cb6095967669e0911487d2b9bc9f41 # v1.1.22
- uses: coursier/cache-action@90c37294538be80a558fd665531fcdc2b467b475 # v8.1.0
with:
extraSbtFiles: '["*.sbt", "project/**.{scala,sbt}", "project/build.properties" ]'
- name: Download JOOQ generated code
uses: actions/download-artifact@v6
with:
name: jooq-code
path: common/dao/src/main/scala/org/apache/texera/dao/jooq/generated/
- name: Free up disk space
run: |
sudo apt-get clean
sudo rm -rf /usr/share/dotnet
sudo rm -rf /opt/ghc
sudo rm -rf /usr/local/share/boost
df -h
# Set up QEMU for ARM64 emulation
- name: Set up QEMU
uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0
with:
platforms: linux/arm64
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0
- name: Log in to GitHub Container Registry
if: startsWith(needs.set-parameters.outputs.docker_registry, 'ghcr.io/')
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Log in to Docker Hub
if: ${{ !startsWith(needs.set-parameters.outputs.docker_registry, 'ghcr.io/') }}
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Build and push ARM64 image
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
with:
context: ${{ matrix.context }}
file: ${{ matrix.dockerfile }}
platforms: linux/arm64
push: true
tags: ${{ env.DOCKER_REGISTRY }}/${{ matrix.image_name }}:${{ needs.set-parameters.outputs.image_tag }}-arm64
cache-from: type=gha,scope=${{ matrix.image_name }}-arm64
cache-to: type=gha,mode=max,scope=${{ matrix.image_name }}-arm64
labels: |
org.opencontainers.image.title=${{ matrix.image_name }}
org.opencontainers.image.description=Apache Texera ${{ matrix.image_name }} (ARM64)
org.opencontainers.image.vendor=Apache Texera
# Step 4: Create multi-arch manifests (only if building both platforms)
create-manifests:
runs-on: ubuntu-latest
needs: [set-parameters, prepare-matrix, build-amd64, build-arm64]
if: always() && needs.prepare-matrix.outputs.need_manifest == 'true'
strategy:
matrix: ${{ fromJson(needs.prepare-matrix.outputs.matrix) }}
fail-fast: false
env:
DOCKER_REGISTRY: ${{ needs.set-parameters.outputs.docker_registry }}
steps:
- name: Log in to GitHub Container Registry
if: startsWith(needs.set-parameters.outputs.docker_registry, 'ghcr.io/')
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Log in to Docker Hub
if: ${{ !startsWith(needs.set-parameters.outputs.docker_registry, 'ghcr.io/') }}
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Create and push multi-arch manifest
run: |
# Create manifest list combining both architectures
docker buildx imagetools create -t \
${{ env.DOCKER_REGISTRY }}/${{ matrix.image_name }}:${{ needs.set-parameters.outputs.image_tag }} \
${{ env.DOCKER_REGISTRY }}/${{ matrix.image_name }}:${{ needs.set-parameters.outputs.image_tag }}-amd64 \
${{ env.DOCKER_REGISTRY }}/${{ matrix.image_name }}:${{ needs.set-parameters.outputs.image_tag }}-arm64
- name: Inspect multi-arch manifest
run: |
docker buildx imagetools inspect ${{ env.DOCKER_REGISTRY }}/${{ matrix.image_name }}:${{ needs.set-parameters.outputs.image_tag }}
# Step 5: Summary report
build-summary:
runs-on: ubuntu-latest
needs: [set-parameters, prepare-matrix, build-amd64, build-arm64, create-manifests]
if: always()
steps:
- name: Generate build summary
run: |
echo "# Texera Multi-Arch Build Complete (Parallel)" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "## Build Configuration" >> $GITHUB_STEP_SUMMARY
echo "- **Trigger:** ${{ github.event_name }}" >> $GITHUB_STEP_SUMMARY
echo "- **Branch:** \`${{ needs.set-parameters.outputs.branch }}\`" >> $GITHUB_STEP_SUMMARY
echo "- **Registry:** \`${{ needs.set-parameters.outputs.docker_registry }}\`" >> $GITHUB_STEP_SUMMARY
echo "- **Tag:** \`${{ needs.set-parameters.outputs.image_tag }}\`" >> $GITHUB_STEP_SUMMARY
echo "- **Services:** ${{ needs.set-parameters.outputs.services }}" >> $GITHUB_STEP_SUMMARY
echo "- **Platforms:** ${{ needs.set-parameters.outputs.platforms }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "## Build Method" >> $GITHUB_STEP_SUMMARY
echo "**Parallel platform builds** (faster)" >> $GITHUB_STEP_SUMMARY
echo "- AMD64: Native build on \`ubuntu-latest\`" >> $GITHUB_STEP_SUMMARY
echo "- ARM64: QEMU emulation on \`ubuntu-latest\` (runs in parallel)" >> $GITHUB_STEP_SUMMARY
echo "- Manifests: Combined into multi-arch images" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "> **Performance:** AMD64 and ARM64 now build simultaneously instead of sequentially!" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "## Images Published" >> $GITHUB_STEP_SUMMARY
echo "All images are now available as multi-arch manifests at:" >> $GITHUB_STEP_SUMMARY
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
echo "docker pull ${{ needs.set-parameters.outputs.docker_registry }}/<service-name>:${{ needs.set-parameters.outputs.image_tag }}" >> $GITHUB_STEP_SUMMARY
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### Usage" >> $GITHUB_STEP_SUMMARY
echo "The images will automatically use the correct architecture:" >> $GITHUB_STEP_SUMMARY
echo "- On x86_64/AMD64: pulls linux/amd64 variant" >> $GITHUB_STEP_SUMMARY
echo "- On ARM64/M1/M2: pulls linux/arm64 variant" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### Build Status" >> $GITHUB_STEP_SUMMARY
echo "- AMD64 builds: ${{ needs.build-amd64.result }}" >> $GITHUB_STEP_SUMMARY
echo "- ARM64 builds: ${{ needs.build-arm64.result }}" >> $GITHUB_STEP_SUMMARY
echo "- Manifest creation: ${{ needs.create-manifests.result }}" >> $GITHUB_STEP_SUMMARY
================================================
FILE: .github/workflows/build.yml
================================================
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
name: Build
on:
workflow_call:
inputs:
checkout_ref:
required: false
type: string
default: ""
backport_target_branch:
required: false
type: string
default: ""
backport_commit_range:
required: false
type: string
default: ""
job_name_suffix:
required: false
type: string
default: ""
run_frontend:
required: false
type: boolean
default: true
run_amber:
required: false
type: boolean
default: true
run_amber_integration:
required: false
type: boolean
default: true
run_platform:
required: false
type: boolean
default: true
run_python:
required: false
type: boolean
default: true
run_agent_service:
required: false
type: boolean
default: true
mode:
# PR (default) | nightly | release. Only "PR" passes
# --ignore-transitive-version to check_binary_deps.py.
required: false
type: string
default: PR
env:
NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }}
jobs:
frontend:
if: ${{ inputs.run_frontend }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
include:
- os: macos-latest
arch: arm64
- os: ubuntu-latest
arch: x64
- os: windows-latest
arch: x64
node-version:
- 24.10.0
steps:
- name: Checkout Texera
uses: actions/checkout@v5
with:
ref: ${{ inputs.checkout_ref || github.sha }}
fetch-depth: 0
- name: Prepare backport workspace
if: ${{ inputs.backport_target_branch != '' }}
working-directory: ${{ github.workspace }}
run: bash ./.github/scripts/prepare-backport-checkout.sh "${{ inputs.backport_target_branch }}" "${{ inputs.backport_commit_range }}"
- name: Setup node
uses: actions/setup-node@v5
with:
node-version: ${{ matrix.node-version }}
architecture: ${{ matrix.arch }}
- uses: actions/cache@v5
with:
path: frontend/.yarn/cache
key: ${{ runner.os }}-${{ matrix.arch }}-${{ matrix.node-version }}-yarn-cache-v4-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-${{ matrix.arch }}-${{ matrix.node-version }}-yarn-cache-v4-
- name: Prepare Yarn 4.14.1
run: corepack enable && corepack prepare yarn@4.14.1 --activate
- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: "3.12"
- name: Install dependency
timeout-minutes: 20
run: yarn --cwd frontend install --immutable --inline-builds --network-timeout=100000
- name: Lint with Prettier & ESLint
run: yarn --cwd frontend format:ci
- name: Prod build
run: yarn --cwd frontend run build:ci
- name: Check bundled npm packages against per-module LICENSE-binary files
if: matrix.os == 'ubuntu-latest'
run: ./bin/licensing/check_binary_deps.py ${{ inputs.mode == 'PR' && '--ignore-transitive-version' || '' }} npm frontend/dist/3rdpartylicenses.json
- name: Run frontend unit tests
run: yarn --cwd frontend run test:ci
- name: Upload frontend coverage to Codecov
if: matrix.os == 'ubuntu-latest' && always()
uses: codecov/codecov-action@75cd11691c0faa626561e295848008c8a7dddffe # v5.5.4
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: ./frontend/coverage/**/lcov.info
flags: frontend
fail_ci_if_error: false
- name: Install Playwright Chromium
run: yarn --cwd frontend playwright install ${{ matrix.os == 'ubuntu-latest' && '--with-deps' || '' }} chromium
- name: Run frontend browser-mode tests
run: yarn --cwd frontend ng run gui:test-browser
amber:
# The amber job runs the cross-cutting Scala lints (scalafmtCheckAll,
# scalafixAll --check) once on behalf of every Scala module, then builds
# and tests just the WorkflowExecutionService dist. Per-service builds
# and tests for the platform services live in the `platform` matrix
# below. License-binary checks are scoped to the amber dist.
if: ${{ inputs.run_amber }}
strategy:
matrix:
os: [ubuntu-22.04]
java-version: [17]
runs-on: ${{ matrix.os }}
env:
JAVA_OPTS: -Xms2048M -Xmx2048M -Xss6M -XX:ReservedCodeCacheSize=256M -Dfile.encoding=UTF-8
JVM_OPTS: -Xms2048M -Xmx2048M -Xss6M -XX:ReservedCodeCacheSize=256M -Dfile.encoding=UTF-8
services:
postgres:
image: postgres
env:
POSTGRES_PASSWORD: postgres
ports:
- 5432:5432
options: >-
--health-cmd="pg_isready -U postgres"
--health-interval=10s
--health-timeout=5s
--health-retries=5
steps:
- name: Checkout
uses: actions/checkout@v5
with:
ref: ${{ inputs.checkout_ref || github.sha }}
fetch-depth: 0
- name: Prepare backport workspace
if: ${{ inputs.backport_target_branch != '' }}
working-directory: ${{ github.workspace }}
run: bash ./.github/scripts/prepare-backport-checkout.sh "${{ inputs.backport_target_branch }}" "${{ inputs.backport_commit_range }}"
- name: Setup JDK
uses: actions/setup-java@v5
with:
distribution: "temurin"
java-version: 17
- name: Create Databases
# Must run before any sbt compile step: the build's JOOQ source
# generators connect to texera_db while compiling.
run: |
psql -h localhost -U postgres -f sql/texera_ddl.sql
psql -h localhost -U postgres -f sql/iceberg_postgres_catalog.sql
psql -h localhost -U postgres -f sql/texera_lakefs.sql
env:
PGPASSWORD: postgres
- name: Setup sbt launcher
uses: sbt/setup-sbt@508b753e53cb6095967669e0911487d2b9bc9f41 # v1.1.22
- uses: coursier/cache-action@90c37294538be80a558fd665531fcdc2b467b475 # v8.1.0
with:
extraSbtFiles: '["*.sbt", "project/**.{scala,sbt}", "project/build.properties" ]'
- name: Lint and build amber distributable bundle
# Single sbt invocation: scalafmt -> scalafix -> amber dist.
# scalafmtCheckAll and scalafixAll cover every Scala module, so the
# platform matrix below skips them. scalafix triggers compile (and
# JOOQ codegen), which the dist command then reuses incrementally.
run: |
sbt scalafmtCheckAll \
"scalafixAll --check" \
WorkflowExecutionService/dist
- name: Unzip amber dist and check binary licenses
# Per-module LICENSE-binary files live at the repo root after #4668;
# the amber JVM dist is checked against amber/LICENSE-binary-java.
# The audit always runs (mirroring the previous 'if: always()' on its
# own step) and never fails the step; the binding check's exit code
# drives it.
run: |
set -euo pipefail
mkdir -p /tmp/dists
unzip -q amber/target/universal/amber-*.zip -d /tmp/dists/
check_exit=0
./bin/licensing/check_binary_deps.py ${{ inputs.mode == 'PR' && '--ignore-transitive-version' || '' }} jar \
--license-binary amber/LICENSE-binary-java \
/tmp/dists/amber-*/lib || check_exit=$?
./bin/licensing/audit_jar_licenses.py /tmp/dists/amber-*/lib || true
exit "$check_exit"
- name: Create texera_db_for_test_cases
run: psql -h localhost -U postgres -v DB_NAME=texera_db_for_test_cases -f sql/texera_ddl.sql
env:
PGPASSWORD: postgres
- name: Set docker-java API version
run: |
echo "api.version=1.52" >> ~/.docker-java.properties
cat ~/.docker-java.properties
- name: Run amber and common module tests with coverage
# 'jacoco' runs tests under sbt-jacoco's JVM agent and emits per-
# module jacoco.xml that the codecov upload step picks up.
# `WorkflowExecutionService/jacoco` only runs that project's
# Test config (sbt's `test` task does not transit dependsOn),
# so common modules' tests are listed explicitly here. Modules
# with no tests (Auth, Config) are skipped.
#
# AMBER_TEST_FILTER=skip-integration tells amber/build.sbt to
# exclude @org.apache.texera.amber.tags.IntegrationTest specs;
# those run in the amber-integration job below.
env:
AMBER_TEST_FILTER: skip-integration
run: |
sbt "DAO/jacoco" \
"PyBuilder/jacoco" \
"WorkflowCore/jacoco" \
"WorkflowOperator/jacoco" \
"WorkflowExecutionService/jacoco"
- name: Upload amber and common coverage to Codecov
if: always()
uses: codecov/codecov-action@75cd11691c0faa626561e295848008c8a7dddffe # v5.5.4
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: ./**/target/scala-2.13/jacoco/report/jacoco.xml
flags: amber
fail_ci_if_error: false
amber-integration:
# Runs Scala tests tagged @org.apache.texera.amber.tags.IntegrationTest —
# currently the e2e specs that spawn Python UDF workers. Provisions
# Python deps that the lighter `amber` job no longer installs. Cross-
# cutting lints (scalafmt / scalafix) and the amber dist + binary
# license check stay in `amber`; this job is tests-only.
if: ${{ inputs.run_amber_integration }}
strategy:
matrix:
os: [ubuntu-22.04]
java-version: [17]
runs-on: ${{ matrix.os }}
env:
JAVA_OPTS: -Xms2048M -Xmx2048M -Xss6M -XX:ReservedCodeCacheSize=256M -Dfile.encoding=UTF-8
JVM_OPTS: -Xms2048M -Xmx2048M -Xss6M -XX:ReservedCodeCacheSize=256M -Dfile.encoding=UTF-8
services:
postgres:
image: postgres
env:
POSTGRES_PASSWORD: postgres
ports:
- 5432:5432
options: >-
--health-cmd="pg_isready -U postgres"
--health-interval=10s
--health-timeout=5s
--health-retries=5
steps:
- name: Checkout
uses: actions/checkout@v5
with:
ref: ${{ inputs.checkout_ref || github.sha }}
fetch-depth: 0
- name: Prepare backport workspace
if: ${{ inputs.backport_target_branch != '' }}
working-directory: ${{ github.workspace }}
run: bash ./.github/scripts/prepare-backport-checkout.sh "${{ inputs.backport_target_branch }}" "${{ inputs.backport_commit_range }}"
- name: Setup JDK
uses: actions/setup-java@v5
with:
distribution: "temurin"
java-version: 17
- name: Setup Python for Scala-Python integration tests
uses: actions/setup-python@v6
with:
python-version: "3.11"
- name: Show Python
run: python --version || python3 --version
- name: Install Python dependencies
# The integration tests spawn Python UDF workers; install
# everything they need on the host. uv for speed; no licensing
# concerns because no dist is built here.
# --index-strategy unsafe-best-match makes uv consider every
# version on every index (pip's default) rather than stopping at
# the first index that lists a package. operator-requirements.txt
# adds the pytorch CPU index as an --extra-index-url, which
# mirrors a subset of common deps (e.g. pillow); without this
# flag a dependabot bump to a version not yet mirrored there
# fails to resolve even though PyPI has it.
run: |
python -m pip install uv
if [ -f amber/requirements.txt ]; then uv pip install --system --index-strategy unsafe-best-match -r amber/requirements.txt; fi
if [ -f amber/operator-requirements.txt ]; then uv pip install --system --index-strategy unsafe-best-match -r amber/operator-requirements.txt; fi
if [ -f amber/dev-requirements.txt ]; then uv pip install --system --index-strategy unsafe-best-match -r amber/dev-requirements.txt; fi
- name: Create Databases
run: |
psql -h localhost -U postgres -f sql/texera_ddl.sql
psql -h localhost -U postgres -f sql/iceberg_postgres_catalog.sql
psql -h localhost -U postgres -f sql/texera_lakefs.sql
psql -h localhost -U postgres -f sql/texera_lakekeeper.sql
env:
PGPASSWORD: postgres
- name: Setup sbt launcher
uses: sbt/setup-sbt@508b753e53cb6095967669e0911487d2b9bc9f41 # v1.1.22
- uses: coursier/cache-action@90c37294538be80a558fd665531fcdc2b467b475 # v8.1.0
with:
extraSbtFiles: '["*.sbt", "project/**.{scala,sbt}", "project/build.properties" ]'
- name: Create texera_db_for_test_cases
run: psql -h localhost -U postgres -v DB_NAME=texera_db_for_test_cases -f sql/texera_ddl.sql
env:
PGPASSWORD: postgres
- name: Start MinIO
run: |
docker run -d --name minio --network host \
-e MINIO_ROOT_USER=texera_minio \
-e MINIO_ROOT_PASSWORD=password \
minio/minio:RELEASE.2025-02-28T09-55-16Z server /data
for i in $(seq 1 3); do
curl -sf http://localhost:9000/minio/health/live && break
echo "Waiting for MinIO... (attempt $i)"
sleep 1
done
- name: Start Lakekeeper
env:
LAKEKEEPER__PG_DATABASE_URL_READ: postgres://postgres:postgres@localhost:5432/texera_lakekeeper
LAKEKEEPER__PG_DATABASE_URL_WRITE: postgres://postgres:postgres@localhost:5432/texera_lakekeeper
LAKEKEEPER__PG_ENCRYPTION_KEY: texera_key
run: |
docker run --rm --network host \
-e LAKEKEEPER__PG_DATABASE_URL_READ \
-e LAKEKEEPER__PG_DATABASE_URL_WRITE \
-e LAKEKEEPER__PG_ENCRYPTION_KEY \
vakamo/lakekeeper:v0.11.0 migrate
docker run -d --name lakekeeper --network host \
-e LAKEKEEPER__PG_DATABASE_URL_READ \
-e LAKEKEEPER__PG_DATABASE_URL_WRITE \
-e LAKEKEEPER__PG_ENCRYPTION_KEY \
-e LAKEKEEPER__METRICS_PORT=9091 \
vakamo/lakekeeper:v0.11.0 serve
for i in $(seq 1 3); do
docker exec lakekeeper /home/nonroot/lakekeeper healthcheck && break
echo "Waiting for Lakekeeper... (attempt $i)"
sleep 1
done
docker exec lakekeeper /home/nonroot/lakekeeper healthcheck || {
echo "Lakekeeper failed to start. Container logs:"
docker logs lakekeeper
exit 1
}
- name: Initialize Lakekeeper warehouse
# Pull defaults out of storage.conf so this step doesn't duplicate
# values that already live in the runtime config. Each scalar in
# storage.conf is followed by a `${?VAR}` env-override line whose
# name is globally unique, so anchoring grep on that override line
# selects the value unambiguously across nested scopes.
run: |
CONF=common/config/src/main/resources/storage.conf
extract() {
grep -B1 -F "\${?$1}" "$CONF" | head -1 | sed -E 's/.*"([^"]+)".*/\1/'
}
WAREHOUSE_NAME=$(extract STORAGE_ICEBERG_CATALOG_REST_WAREHOUSE_NAME)
S3_BUCKET=$(extract STORAGE_ICEBERG_CATALOG_REST_S3_BUCKET)
S3_ENDPOINT=$(extract STORAGE_S3_ENDPOINT)
S3_REGION=$(extract STORAGE_S3_REGION)
S3_USERNAME=$(extract STORAGE_S3_AUTH_USERNAME)
S3_PASSWORD=$(extract STORAGE_S3_AUTH_PASSWORD)
# Lakekeeper's management API lives on the same host as the
# catalog; strip the /catalog suffix off the catalog URI to get
# the base URL.
REST_URI=$(extract STORAGE_ICEBERG_CATALOG_REST_URI)
LAKEKEEPER_BASE=${REST_URI%/catalog}
LAKEKEEPER_BASE=${LAKEKEEPER_BASE%/}
docker run --rm --network host --entrypoint sh minio/mc -c \
"mc alias set minio $S3_ENDPOINT $S3_USERNAME $S3_PASSWORD && \
mc mb --ignore-existing minio/$S3_BUCKET"
curl -sf -X POST -H 'Content-Type: application/json' \
-d '{"project-id":"00000000-0000-0000-0000-000000000000","project-name":"default"}' \
"$LAKEKEEPER_BASE/management/v1/project" || true
curl -sf -X POST -H 'Content-Type: application/json' -d @- \
"$LAKEKEEPER_BASE/management/v1/warehouse" <<EOF
{
"warehouse-name": "$WAREHOUSE_NAME",
"project-id": "00000000-0000-0000-0000-000000000000",
"storage-profile": {
"type": "s3",
"bucket": "$S3_BUCKET",
"region": "$S3_REGION",
"endpoint": "$S3_ENDPOINT",
"flavor": "s3-compat",
"path-style-access": true,
"sts-enabled": false
},
"storage-credential": {
"type": "s3",
"credential-type": "access-key",
"aws-access-key-id": "$S3_USERNAME",
"aws-secret-access-key": "$S3_PASSWORD"
}
}
EOF
- name: Lint and run amber integration tests
# AMBER_TEST_FILTER=integration-only tells amber/build.sbt to
# keep only @org.apache.texera.amber.tags.IntegrationTest
# specs. The Java @TagAnnotation makes the marker visible to
# ScalaTest's reflection, so `-n TAG` correctly narrows the
# run.
#
# scalafmtCheckAll + scalafixAll --check are run here as well
# because an integration-only PR fires only the
# `amber-integration` label; the amber job's own cross-cutting
# lint would not run, and the change would otherwise land
# unlinted. Costs ~30s when amber also runs, which is fine.
# No jacoco — these specs exercise code paths already covered
# by amber's unit-test coverage.
env:
AMBER_TEST_FILTER: integration-only
run: |
sbt scalafmtCheckAll \
"scalafixAll --check" \
"WorkflowExecutionService/test"
- name: Run Python integration tests
run: |
cd amber && pytest -m integration -sv
platform:
# Per-service build, test, and license check for the non-amber Scala
# services. Each matrix entry runs its own dist + test in isolation
# against per-module LICENSE-binary (#4668). scalafmt / scalafix already
# cover every module in the amber job above, so this matrix skips them.
if: ${{ inputs.run_platform }}
name: ${{ format('platform{0} ({1})', inputs.job_name_suffix, matrix.service) }}
runs-on: ubuntu-22.04
strategy:
fail-fast: false
matrix:
include:
- service: config-service
sbt_project: ConfigService
- service: access-control-service
sbt_project: AccessControlService
- service: file-service
sbt_project: FileService
- service: computing-unit-managing-service
sbt_project: ComputingUnitManagingService
- service: workflow-compiling-service
sbt_project: WorkflowCompilingService
env:
JAVA_OPTS: -Xms2048M -Xmx2048M -Xss6M -XX:ReservedCodeCacheSize=256M -Dfile.encoding=UTF-8
JVM_OPTS: -Xms2048M -Xmx2048M -Xss6M -XX:ReservedCodeCacheSize=256M -Dfile.encoding=UTF-8
services:
# Each platform service transitively depends on DAO, which runs JOOQ
# code generation at compile time and needs the live texera schema.
postgres:
image: postgres
env:
POSTGRES_PASSWORD: postgres
ports:
- 5432:5432
options: >-
--health-cmd="pg_isready -U postgres"
--health-interval=10s
--health-timeout=5s
--health-retries=5
steps:
- name: Checkout
uses: actions/checkout@v5
with:
ref: ${{ inputs.checkout_ref || github.sha }}
fetch-depth: 0
- name: Prepare backport workspace
if: ${{ inputs.backport_target_branch != '' }}
working-directory: ${{ github.workspace }}
run: bash ./.github/scripts/prepare-backport-checkout.sh "${{ inputs.backport_target_branch }}" "${{ inputs.backport_commit_range }}"
- name: Setup JDK
uses: actions/setup-java@v5
with:
distribution: "temurin"
java-version: 17
- name: Setup sbt launcher
uses: sbt/setup-sbt@508b753e53cb6095967669e0911487d2b9bc9f41 # v1.1.22
- uses: coursier/cache-action@90c37294538be80a558fd665531fcdc2b467b475 # v8.1.0
with:
extraSbtFiles: '["*.sbt", "project/**.{scala,sbt}", "project/build.properties" ]'
- name: Create Databases
run: |
psql -h localhost -U postgres -f sql/texera_ddl.sql
psql -h localhost -U postgres -f sql/iceberg_postgres_catalog.sql
psql -h localhost -U postgres -f sql/texera_lakefs.sql
env:
PGPASSWORD: postgres
- name: Build dist and run ${{ matrix.service }} tests with coverage
# Single sbt invocation so dist + test share compiled state. Use
# `jacoco` so the codecov upload step has a report to pick up.
run: sbt "${{ matrix.sbt_project }}/dist" "${{ matrix.sbt_project }}/jacoco"
- name: Unzip ${{ matrix.service }} dist and check binary licenses
# Each platform service has its own LICENSE-binary at the repo root
# after #4668; check this service's dist against just its own file.
run: |
set -euo pipefail
mkdir -p /tmp/dists
unzip -q ${{ matrix.service }}/target/universal/${{ matrix.service }}-*.zip -d /tmp/dists/
check_exit=0
./bin/licensing/check_binary_deps.py ${{ inputs.mode == 'PR' && '--ignore-transitive-version' || '' }} jar \
--license-binary ${{ matrix.service }}/LICENSE-binary \
/tmp/dists/${{ matrix.service }}-*/lib || check_exit=$?
./bin/licensing/audit_jar_licenses.py /tmp/dists/${{ matrix.service }}-*/lib || true
exit "$check_exit"
- name: Upload ${{ matrix.service }} coverage to Codecov
# Per-service flag so each matrix entry has its own Codecov view
# rather than being merged into one umbrella `platform` flag.
if: always()
uses: codecov/codecov-action@75cd11691c0faa626561e295848008c8a7dddffe # v5.5.4
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: ./${{ matrix.service }}/target/scala-2.13/jacoco/report/jacoco.xml
flags: ${{ matrix.service }}
fail_ci_if_error: false
python:
if: ${{ inputs.run_python }}
strategy:
matrix:
os: [ubuntu-latest]
python-version: ["3.10", "3.11", "3.12", "3.13"]
runs-on: ${{ matrix.os }}
services:
postgres:
image: postgres
env:
POSTGRES_PASSWORD: postgres
ports:
- 5432:5432
options: >-
--health-cmd="pg_isready -U postgres"
--health-interval=10s
--health-timeout=5s
--health-retries=5
steps:
- name: Checkout Texera
uses: actions/checkout@v5
with:
ref: ${{ inputs.checkout_ref || github.sha }}
fetch-depth: 0
- name: Prepare backport workspace
if: ${{ inputs.backport_target_branch != '' }}
run: bash ./.github/scripts/prepare-backport-checkout.sh "${{ inputs.backport_target_branch }}" "${{ inputs.backport_commit_range }}"
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
- name: Unit-test licensing scripts
# Stdlib only, no install needed. Runs on every matrix row (3.10 →
# 3.13) so the script's behavior is guarded across all supported
# Python versions before the license check itself runs (3.12 only).
run: python3 -m unittest discover -s bin/licensing -p "test_*.py" -v
- name: Install dependencies
# 3.12 is the only leg that drives the binary-license check via
# pip-licenses. Keep stock pip there so the resolved versions
# match amber/LICENSE-binary-python (also generated with pip,
# tracking what the production image installs). Other legs use
# uv purely for install-speed.
run: |
if [ "${{ matrix.python-version }}" = "3.12" ]; then
python -m pip install --upgrade pip pip-licenses
install="pip install"
else
python -m pip install uv
# See amber-integration job for why --index-strategy is set.
install="uv pip install --system --index-strategy unsafe-best-match"
fi
if [ -f amber/requirements.txt ]; then $install -r amber/requirements.txt; fi
if [ -f amber/operator-requirements.txt ]; then $install -r amber/operator-requirements.txt; fi
- name: Generate pip-licenses manifest
if: matrix.python-version == '3.12'
run: pip-licenses --format=csv --ignore-packages pip-licenses prettytable wcwidth > /tmp/pip-licenses.csv
- name: Check installed Python packages against per-module LICENSE-binary files
if: matrix.python-version == '3.12'
run: ./bin/licensing/check_binary_deps.py ${{ inputs.mode == 'PR' && '--ignore-transitive-version' || '' }} python /tmp/pip-licenses.csv
- name: Create iceberg catalog database
run: psql -h localhost -U postgres -f sql/iceberg_postgres_catalog.sql
env:
PGPASSWORD: postgres
- name: Lint with Ruff
run: |
cd amber && ruff check src/main/python src/test/python && ruff format --check src/main/python src/test/python
- name: Install dev dependencies
# Test-only deps live in amber/dev-requirements.txt and are
# installed after the LICENSE-binary snapshot above so they never
# appear in pip-licenses output. Packaging skips this file. uv
# is safe here regardless of leg because it runs post-snapshot.
run: |
python -m pip install uv
if [ -f amber/dev-requirements.txt ]; then uv pip install --system -r amber/dev-requirements.txt; fi
- name: Test with pytest
run: |
cd amber && pytest -m "not integration" --cov=src/main/python --cov-report=xml -sv
- name: Upload python coverage to Codecov
if: matrix.python-version == '3.12' && always()
uses: codecov/codecov-action@75cd11691c0faa626561e295848008c8a7dddffe # v5.5.4
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: ./amber/coverage.xml
flags: python
fail_ci_if_error: false
agent-service:
if: ${{ inputs.run_agent_service }}
name: ${{ format('agent-service{0} ({1})', inputs.job_name_suffix, matrix.os) }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
bun-version: ["1.3.3"]
defaults:
run:
working-directory: agent-service
steps:
- name: Checkout Texera
uses: actions/checkout@v5
with:
ref: ${{ inputs.checkout_ref || github.sha }}
fetch-depth: 0
- name: Prepare backport workspace
if: ${{ inputs.backport_target_branch != '' }}
working-directory: ${{ github.workspace }}
run: bash ./.github/scripts/prepare-backport-checkout.sh "${{ inputs.backport_target_branch }}" "${{ inputs.backport_commit_range }}"
- name: Setup Bun
run: |
curl -fsSL https://bun.sh/install | bash -s -- bun-v${{ matrix.bun-version }}
echo "$HOME/.bun/bin" >> $GITHUB_PATH
- name: Install production dependencies
run: bun install --production --frozen-lockfile
- name: Generate agent-service license manifest
if: matrix.os == 'ubuntu-latest'
run: |
mkdir -p dist
bun run bin/collect-licenses.ts > dist/3rdpartylicenses.json
- name: Check bundled agent-service packages against per-module LICENSE-binary files
if: matrix.os == 'ubuntu-latest'
run: ../bin/licensing/check_binary_deps.py ${{ inputs.mode == 'PR' && '--ignore-transitive-version' || '' }} agent-npm dist/3rdpartylicenses.json
- name: Install development dependencies
run: bun install --frozen-lockfile
- name: Lint with Prettier
run: bun run format:check
- name: Typecheck
run: bun run typecheck
- name: Run unit tests
run: bun test --coverage --coverage-reporter=lcov
- name: Upload agent-service coverage to Codecov
if: matrix.os == 'ubuntu-latest' && always()
uses: codecov/codecov-action@75cd11691c0faa626561e295848008c8a7dddffe # v5.5.4
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: ./agent-service/coverage/lcov.info
flags: agent-service
fail_ci_if_error: false
================================================
FILE: .github/workflows/check-header.yml
================================================
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: Release Auditing
on:
push:
branches:
- 'ci-enable/**'
- 'main'
pull_request:
workflow_dispatch:
jobs:
test:
name: Check License Headers
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: apache/skywalking-eyes@5c5b974209f0de5d905f37deb69369068ebfc15c # v0.7.0
================================================
FILE: .github/workflows/comment-commands.yml
================================================
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# /take, /untake, /request-review, and /unrequest-review comment commands.
#
# Triage state is no longer materialized as a label — it is the search
# filter `is:issue is:open no:assignee`. Anyone can self-claim an issue
# by commenting `/take` (and self-release with `/untake`); PR-driven
# assignee sync is handled by `pr-assignment.yml`.
#
# On pull requests, the author can request or cancel reviewer requests
# via `/request-review @user [@user ...]` and `/unrequest-review @user
# [@user ...]`. We avoid the `/review` namespace so it stays free for
# future use (e.g. self-review).
name: Comment commands
on:
issue_comment:
types: [created]
permissions:
issues: write
pull-requests: write
jobs:
take:
# The startsWith filter at the job level keeps unrelated comments
# from allocating a runner; the regex inside the script enforces an
# exact `/take` or `/untake` so suffixes like `/take this` do not
# silently match.
if: >-
github.event_name == 'issue_comment'
&& github.event.action == 'created'
&& github.event.issue.pull_request == null
&& github.event.comment.user.type != 'Bot'
&& (startsWith(github.event.comment.body, '/take')
|| startsWith(github.event.comment.body, '/untake'))
runs-on: ubuntu-latest
steps:
- uses: actions/github-script@v8
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const body = (context.payload.comment.body || '').trim();
const issue_number = context.payload.issue.number;
const login = context.payload.comment.user.login;
const { owner, repo } = context.repo;
core.info(
`take/untake candidate: ${login} on issue #${issue_number}; ` +
`body=${JSON.stringify(body)}`,
);
if (/^\/take\s*$/.test(body)) {
try {
await github.rest.issues.addAssignees({
owner, repo, issue_number, assignees: [login],
});
core.info(`Assigned ${login} to issue #${issue_number}`);
} catch (e) {
core.warning(
`addAssignees on #${issue_number} failed: ${e.message}`,
);
}
} else if (/^\/untake\s*$/.test(body)) {
try {
await github.rest.issues.removeAssignees({
owner, repo, issue_number, assignees: [login],
});
core.info(`Unassigned ${login} from issue #${issue_number}`);
} catch (e) {
core.warning(
`removeAssignees on #${issue_number} failed: ${e.message}`,
);
}
} else {
core.info(
`Comment does not match exact '/take' or '/untake'; skipping.`,
);
}
request-review:
# Job-level startsWith gate avoids spinning up a runner for every
# PR comment; the regex inside the script enforces the exact shape.
if: >-
github.event_name == 'issue_comment'
&& github.event.action == 'created'
&& github.event.issue.pull_request != null
&& github.event.comment.user.type != 'Bot'
&& (startsWith(github.event.comment.body, '/request-review')
|| startsWith(github.event.comment.body, '/unrequest-review'))
runs-on: ubuntu-latest
steps:
- uses: actions/github-script@v8
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const body = (context.payload.comment.body || '').trim();
const pull_number = context.payload.issue.number;
const commenter = context.payload.comment.user.login;
const author = context.payload.issue.user.login;
const { owner, repo } = context.repo;
const match = body.match(
/^\/(request-review|unrequest-review)\b(.*)$/s,
);
if (!match) {
core.info(`Comment does not match exact command; skipping.`);
return;
}
const action = match[1];
if (commenter !== author) {
core.info(
`${commenter} is not the author of #${pull_number}; skipping.`,
);
return;
}
// Parse @user and @org/team mentions; route teams to the
// team_reviewers bucket. Strip self so the API doesn't
// reject the whole atomic call over one bad name. Copilot
// is a bot reviewer that the REST API expects as the exact
// slug "Copilot", so normalize any casing of @copilot.
const reviewers = [];
const team_reviewers = [];
for (const [, h] of match[2].matchAll(
/@([\w-]+(?:\/[\w.-]+)?)/g,
)) {
if (h.includes('/')) team_reviewers.push(h.split('/')[1]);
else if (h.toLowerCase() === 'copilot') reviewers.push('Copilot');
else if (h.toLowerCase() !== author.toLowerCase())
reviewers.push(h);
}
if (!reviewers.length && !team_reviewers.length) {
core.warning(`No valid @mentions in '${action}'; skipping.`);
return;
}
const params = { owner, repo, pull_number, reviewers, team_reviewers };
try {
if (action === 'request-review') {
await github.rest.pulls.requestReviewers(params);
} else {
await github.rest.pulls.removeRequestedReviewers(params);
}
core.info(
`${action} on #${pull_number} by ${commenter}: ` +
`users=[${reviewers.join(', ')}] ` +
`teams=[${team_reviewers.join(', ')}]`,
);
} catch (e) {
core.warning(
`${action} on #${pull_number} failed: ${e.message}`,
);
}
================================================
FILE: .github/workflows/create-release-candidate.yml
================================================
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
name: Create and upload release candidate artifacts
on:
workflow_dispatch:
inputs:
tag:
description: 'Existing Git tag (e.g., v1.1.0-incubating-rc1)'
required: true
type: string
rc_number:
description: 'Release candidate number for artifacts (e.g., 1 for RC1, 2 for RC2)'
required: true
type: string
default: '1'
image_registry:
description: 'Container image registry prefix (e.g., ghcr.io/apache, docker.io/apache)'
required: false
type: string
default: 'ghcr.io/apache'
use_tag_as_image_tag:
description: 'If true, pin the bundled docker-compose IMAGE_TAG to the git tag (with leading "v" stripped, e.g. 1.1.0-incubating-rc7). If false, pin it to the 9-char commit hash.'
required: false
type: boolean
default: false
jobs:
# Strict-mode build of the tagged commit. Gates RC artifact creation: if
# the tag doesn't compile or has license-binary drift, no RC is produced.
build:
uses: ./.github/workflows/build.yml
with:
checkout_ref: ${{ github.event.inputs.tag }}
mode: release
secrets: inherit
create-rc:
needs: build
runs-on: ubuntu-latest
outputs:
version: ${{ steps.vars.outputs.version }}
rc_num: ${{ steps.vars.outputs.rc_num }}
tag_name: ${{ steps.vars.outputs.tag_name }}
rc_dir: ${{ steps.vars.outputs.rc_dir }}
commit_hash: ${{ steps.vars.outputs.commit_hash }}
src_tarball: ${{ steps.vars.outputs.src_tarball }}
compose_tarball: ${{ steps.vars.outputs.compose_tarball }}
steps:
- name: Checkout code
uses: actions/checkout@v5
with:
fetch-depth: 0 # Full history for proper tagging
- name: Validate tag exists
run: |
TAG_NAME="${{ github.event.inputs.tag }}"
# Check if tag exists
if ! git rev-parse "$TAG_NAME" >/dev/null 2>&1; then
echo "Error: Tag '$TAG_NAME' does not exist"
echo "Available tags:"
git tag -l | tail -10
exit 1
fi
echo "✓ Tag validation passed: $TAG_NAME"
- name: Set up variables
id: vars
run: |
TAG_NAME="${{ github.event.inputs.tag }}"
RC_NUM="${{ github.event.inputs.rc_number }}"
IMAGE_REGISTRY="${{ github.event.inputs.image_registry }}"
# Parse version from tag (format: v1.1.0-incubating or v1.1.0-incubating-rcN)
# Both formats are accepted, but we use the input rc_number for artifacts
if [[ "$TAG_NAME" =~ ^v([0-9]+\.[0-9]+\.[0-9]+-incubating)(-rc[0-9]+)?$ ]]; then
VERSION="${BASH_REMATCH[1]}"
else
echo "Error: Tag must be in format vX.Y.Z-incubating or vX.Y.Z-incubating-rcN (e.g., v1.1.0-incubating-rc1)"
exit 1
fi
COMMIT_HASH=$(git rev-parse "$TAG_NAME")
COMMIT_SHORT=$(git rev-parse "$TAG_NAME" | cut -c1-9)
RC_DIR="${VERSION}-RC${RC_NUM}"
SRC_TARBALL="apache-texera-${VERSION}-src.tar.gz"
COMPOSE_TARBALL="apache-texera-${VERSION}-docker-compose.tar.gz"
# Choose what gets pinned as IMAGE_TAG in the bundled .env. Default
# is the commit short hash; if use_tag_as_image_tag is true, use the
# git tag with the leading "v" stripped.
USE_TAG_AS_IMAGE_TAG="${{ github.event.inputs.use_tag_as_image_tag }}"
if [[ "$USE_TAG_AS_IMAGE_TAG" == "true" ]]; then
IMAGE_TAG="${TAG_NAME#v}"
else
IMAGE_TAG="$COMMIT_SHORT"
fi
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "rc_num=$RC_NUM" >> $GITHUB_OUTPUT
echo "tag_name=$TAG_NAME" >> $GITHUB_OUTPUT
echo "rc_dir=$RC_DIR" >> $GITHUB_OUTPUT
echo "commit_hash=$COMMIT_HASH" >> $GITHUB_OUTPUT
echo "commit_short=$COMMIT_SHORT" >> $GITHUB_OUTPUT
echo "image_registry=$IMAGE_REGISTRY" >> $GITHUB_OUTPUT
echo "image_tag=$IMAGE_TAG" >> $GITHUB_OUTPUT
echo "src_tarball=$SRC_TARBALL" >> $GITHUB_OUTPUT
echo "compose_tarball=$COMPOSE_TARBALL" >> $GITHUB_OUTPUT
echo "Release Candidate: $TAG_NAME"
echo "Version: $VERSION"
echo "RC Number: $RC_NUM"
echo "Commit: $COMMIT_HASH ($COMMIT_SHORT)"
echo "Image Registry: $IMAGE_REGISTRY"
echo "Bundled IMAGE_TAG: $IMAGE_TAG"
echo "Staging directory: dist/dev/incubator/texera/$RC_DIR"
- name: Create source tarball
run: |
TAG_NAME="${{ steps.vars.outputs.tag_name }}"
SRC_TARBALL="${{ steps.vars.outputs.src_tarball }}"
VERSION="${{ steps.vars.outputs.version }}"
TEMP_DIR=$(mktemp -d)
# Export the git repository at the tag
git archive --format=tar --prefix="apache-texera-${VERSION}-src/" "$TAG_NAME" | tar -x -C "$TEMP_DIR"
# Create tarball
cd "$TEMP_DIR"
tar -czf "$GITHUB_WORKSPACE/$SRC_TARBALL" "apache-texera-${VERSION}-src"
cd "$GITHUB_WORKSPACE"
# Verify tarball was created
if [[ ! -f "$SRC_TARBALL" ]]; then
echo "Error: Source tarball was not created"
exit 1
fi
# Show tarball info
ls -lh "$SRC_TARBALL"
echo "✓ Created source tarball: $SRC_TARBALL"
- name: Create Docker Compose deployment bundle
run: |
VERSION="${{ steps.vars.outputs.version }}"
TAG_NAME="${{ steps.vars.outputs.tag_name }}"
IMAGE_REGISTRY="${{ steps.vars.outputs.image_registry }}"
IMAGE_TAG="${{ steps.vars.outputs.image_tag }}"
COMPOSE_TARBALL="${{ steps.vars.outputs.compose_tarball }}"
TEMP_DIR=$(mktemp -d)
BUNDLE_DIR="$TEMP_DIR/apache-texera-${VERSION}-docker-compose"
mkdir -p "$BUNDLE_DIR"
# Export the single-node directory from the tagged source
mkdir -p "$TEMP_DIR/_raw"
git archive --format=tar "$TAG_NAME" -- bin/single-node/ sql/ | tar -x -C "$TEMP_DIR/_raw"
# Copy deployment files
cp "$TEMP_DIR/_raw/bin/single-node/docker-compose.yml" "$BUNDLE_DIR/"
cp "$TEMP_DIR/_raw/bin/single-node/nginx.conf" "$BUNDLE_DIR/"
cp "$TEMP_DIR/_raw/bin/single-node/litellm-config.yaml" "$BUNDLE_DIR/"
cp "$TEMP_DIR/_raw/bin/single-node/LICENSE" "$BUNDLE_DIR/"
cp "$TEMP_DIR/_raw/bin/single-node/NOTICE" "$BUNDLE_DIR/"
cp "$TEMP_DIR/_raw/bin/single-node/DISCLAIMER" "$BUNDLE_DIR/"
cp -r "$TEMP_DIR/_raw/sql" "$BUNDLE_DIR/"
# Patch the SQL mount path for the self-contained bundle layout
# In the repo it's ../../sql (relative to bin/single-node/), in the bundle it's ./sql
sed -i 's|../../sql|./sql|g' "$BUNDLE_DIR/docker-compose.yml"
# Generate a release-pinned .env file with the version tag
# Start from the source .env and ensure IMAGE_REGISTRY and IMAGE_TAG are set
cp "$TEMP_DIR/_raw/bin/single-node/.env" "$BUNDLE_DIR/.env"
# Replace if line exists, otherwise append
if grep -q '^IMAGE_REGISTRY=' "$BUNDLE_DIR/.env"; then
sed -i "s|^IMAGE_REGISTRY=.*|IMAGE_REGISTRY=${IMAGE_REGISTRY}|" "$BUNDLE_DIR/.env"
else
echo "IMAGE_REGISTRY=${IMAGE_REGISTRY}" >> "$BUNDLE_DIR/.env"
fi
if grep -q '^IMAGE_TAG=' "$BUNDLE_DIR/.env"; then
sed -i "s|^IMAGE_TAG=.*|IMAGE_TAG=${IMAGE_TAG}|" "$BUNDLE_DIR/.env"
else
echo "IMAGE_TAG=${IMAGE_TAG}" >> "$BUNDLE_DIR/.env"
fi
if grep -q '^TEXERA_SERVICE_LOG_LEVEL=' "$BUNDLE_DIR/.env"; then
sed -i "s|^TEXERA_SERVICE_LOG_LEVEL=.*|TEXERA_SERVICE_LOG_LEVEL=ERROR|" "$BUNDLE_DIR/.env"
else
echo "TEXERA_SERVICE_LOG_LEVEL=ERROR" >> "$BUNDLE_DIR/.env"
fi
# Include the README from the repo
cp "$TEMP_DIR/_raw/bin/single-node/README.md" "$BUNDLE_DIR/"
# Include example datasets, workflows, and the loader script
if [ -d "$TEMP_DIR/_raw/bin/single-node/examples" ]; then
cp -r "$TEMP_DIR/_raw/bin/single-node/examples" "$BUNDLE_DIR/"
echo "✓ Included examples directory (datasets, workflows, load-examples.sh)"
fi
# Create tarball
cd "$TEMP_DIR"
tar -czf "$GITHUB_WORKSPACE/$COMPOSE_TARBALL" "apache-texera-${VERSION}-docker-compose"
cd "$GITHUB_WORKSPACE"
ls -lh "$COMPOSE_TARBALL"
echo "✓ Created Docker Compose bundle: $COMPOSE_TARBALL"
- name: Import GPG key
run: |
echo "${{ secrets.GPG_PRIVATE_KEY }}" | gpg --batch --import
# List imported keys
gpg --list-secret-keys
echo "✓ GPG key imported successfully"
- name: Sign and checksum all artifacts
run: |
for artifact in \
"${{ steps.vars.outputs.src_tarball }}" \
"${{ steps.vars.outputs.compose_tarball }}"; do
# GPG signature
echo "${{ secrets.GPG_PASSPHRASE }}" | gpg --batch --yes --pinentry-mode loopback --passphrase-fd 0 \
--armor --detach-sign --output "${artifact}.asc" "$artifact"
gpg --verify "${artifact}.asc" "$artifact"
echo "✓ Signed: ${artifact}"
# SHA512 checksum
sha512sum "$artifact" > "${artifact}.sha512"
echo "✓ Checksum: ${artifact}.sha512"
done
- name: Generate vote email template
id: vote_email
run: |
VERSION="${{ steps.vars.outputs.version }}"
RC_NUM="${{ steps.vars.outputs.rc_num }}"
TAG_NAME="${{ steps.vars.outputs.tag_name }}"
RC_DIR="${{ steps.vars.outputs.rc_dir }}"
COMMIT_HASH="${{ steps.vars.outputs.commit_hash }}"
IMAGE_REGISTRY="${{ steps.vars.outputs.image_registry }}"
# Get GPG key ID from the imported key
GPG_KEY_ID=$(gpg --list-secret-keys --keyid-format LONG | grep 'sec' | head -n1 | awk '{print $2}' | cut -d'/' -f2)
GPG_EMAIL=$(gpg --list-secret-keys | grep 'uid' | head -n1 | grep -oP '[\w\.-]+@[\w\.-]+')
# Copy template from repository
cp .github/release/vote-email-template.md vote-email.txt
# Substitute variables in the template
sed -i "s|\${VERSION}|${VERSION}|g" vote-email.txt
sed -i "s|\${RC_NUM}|${RC_NUM}|g" vote-email.txt
sed -i "s|\${RC_DIR}|${RC_DIR}|g" vote-email.txt
sed -i "s|\${TAG_NAME}|${TAG_NAME}|g" vote-email.txt
sed -i "s|\${COMMIT_HASH}|${COMMIT_HASH}|g" vote-email.txt
sed -i "s|\${GPG_KEY_ID}|${GPG_KEY_ID}|g" vote-email.txt
sed -i "s|\${GPG_EMAIL}|${GPG_EMAIL}|g" vote-email.txt
sed -i "s|\${IMAGE_REGISTRY}|${IMAGE_REGISTRY}|g" vote-email.txt
echo "✓ Vote email template generated!"
- name: Upload RC artifacts
uses: actions/upload-artifact@v5
with:
name: rc-artifacts
path: |
${{ steps.vars.outputs.src_tarball }}
${{ steps.vars.outputs.src_tarball }}.asc
${{ steps.vars.outputs.src_tarball }}.sha512
${{ steps.vars.outputs.compose_tarball }}
${{ steps.vars.outputs.compose_tarball }}.asc
${{ steps.vars.outputs.compose_tarball }}.sha512
vote-email.txt
retention-days: 7
upload-rc:
runs-on: ubuntu-latest
needs: create-rc
steps:
- name: Download RC artifacts
uses: actions/download-artifact@v6
with:
name: rc-artifacts
- name: Verify downloaded artifacts
run: |
SRC_TARBALL="${{ needs.create-rc.outputs.src_tarball }}"
COMPOSE_TARBALL="${{ needs.create-rc.outputs.compose_tarball }}"
echo "Verifying downloaded artifacts..."
ls -lh
for artifact in "$SRC_TARBALL" "$COMPOSE_TARBALL"; do
if [[ ! -f "$artifact" ]] || [[ ! -f "${artifact}.asc" ]] || [[ ! -f "${artifact}.sha512" ]]; then
echo "Error: Missing artifact or signature/checksum for: $artifact"
exit 1
fi
done
echo "✓ All artifacts downloaded successfully"
- name: Install SVN
run: |
sudo apt-get update
sudo apt-get install -y subversion
svn --version
- name: Checkout SVN dev directory
run: |
RC_DIR="${{ needs.create-rc.outputs.rc_dir }}"
# Checkout the dev directory with depth=empty (lightweight)
svn co --depth=empty https://dist.apache.org/repos/dist/dev/incubator/texera svn-texera \
--username "${{ secrets.SVN_USERNAME }}" \
--password "${{ secrets.SVN_PASSWORD }}" \
--no-auth-cache
cd svn-texera
# Check if RC directory already exists on the remote
SVN_BASE="https://dist.apache.org/repos/dist/dev/incubator/texera"
if svn info "$SVN_BASE/$RC_DIR" >/dev/null 2>&1; then
# Directory exists remotely — update (checkout) it into the working copy
svn update --depth=infinity "$RC_DIR" \
--username "${{ secrets.SVN_USERNAME }}" \
--password "${{ secrets.SVN_PASSWORD }}" \
--no-auth-cache || true
# If update didn't bring it down (empty parent checkout), do a sparse checkout
if [[ ! -d "$RC_DIR" ]]; then
svn update --set-depth=infinity "$RC_DIR" \
--username "${{ secrets.SVN_USERNAME }}" \
--password "${{ secrets.SVN_PASSWORD }}" \
--no-auth-cache
fi
echo "✓ RC directory already exists remotely, checked out: $RC_DIR"
else
# Directory doesn't exist remotely — create and add it
mkdir -p "$RC_DIR"
svn add "$RC_DIR"
echo "✓ Created new RC directory: $RC_DIR"
fi
- name: Stage artifacts to SVN
run: |
SRC_TARBALL="${{ needs.create-rc.outputs.src_tarball }}"
COMPOSE_TARBALL="${{ needs.create-rc.outputs.compose_tarball }}"
RC_DIR="${{ needs.create-rc.outputs.rc_dir }}"
cd svn-texera/"$RC_DIR"
# Copy all artifacts
for artifact in "$SRC_TARBALL" "$COMPOSE_TARBALL"; do
cp "$GITHUB_WORKSPACE/$artifact" .
cp "$GITHUB_WORKSPACE/${artifact}.asc" .
cp "$GITHUB_WORKSPACE/${artifact}.sha512" .
done
# Add files to SVN
svn add * --force
# Check status
svn status
echo "✓ Staged all artifacts to SVN"
- name: Commit artifacts to dist/dev
run: |
VERSION="${{ needs.create-rc.outputs.version }}"
RC_NUM="${{ needs.create-rc.outputs.rc_num }}"
RC_DIR="${{ needs.create-rc.outputs.rc_dir }}"
cd svn-texera
# Commit with descriptive message
svn commit -m "Add Apache Texera ${VERSION} RC${RC_NUM} artifacts (source + docker-compose)" \
--username "${{ secrets.SVN_USERNAME }}" \
--password "${{ secrets.SVN_PASSWORD }}" \
--no-auth-cache
echo "✓ Committed artifacts to dist/dev/incubator/texera/$RC_DIR"
- name: Generate release summary
run: |
VERSION="${{ needs.create-rc.outputs.version }}"
RC_NUM="${{ needs.create-rc.outputs.rc_num }}"
TAG_NAME="${{ needs.create-rc.outputs.tag_name }}"
RC_DIR="${{ needs.create-rc.outputs.rc_dir }}"
COMMIT_HASH="${{ needs.create-rc.outputs.commit_hash }}"
SRC_TARBALL="${{ needs.create-rc.outputs.src_tarball }}"
COMPOSE_TARBALL="${{ needs.create-rc.outputs.compose_tarball }}"
echo "## Release Candidate Created Successfully!" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### Release Information" >> $GITHUB_STEP_SUMMARY
echo "- **Version:** ${VERSION}" >> $GITHUB_STEP_SUMMARY
echo "- **RC Number:** RC${RC_NUM}" >> $GITHUB_STEP_SUMMARY
echo "- **Git Tag:** \`${TAG_NAME}\`" >> $GITHUB_STEP_SUMMARY
echo "- **Commit:** \`${COMMIT_HASH}\`" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### Artifacts Location" >> $GITHUB_STEP_SUMMARY
echo "**Staging Directory:** https://dist.apache.org/repos/dist/dev/incubator/texera/${RC_DIR}/" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### Artifacts Created" >> $GITHUB_STEP_SUMMARY
echo "| Artifact | Description |" >> $GITHUB_STEP_SUMMARY
echo "|----------|-------------|" >> $GITHUB_STEP_SUMMARY
echo "| \`${SRC_TARBALL}\` | Source code |" >> $GITHUB_STEP_SUMMARY
echo "| \`${COMPOSE_TARBALL}\` | Docker Compose deployment bundle |" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "Each artifact has a corresponding \`.asc\` (GPG signature) and \`.sha512\` (checksum) file." >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### Next Steps" >> $GITHUB_STEP_SUMMARY
echo "1. Build and push container images using the \`Build and push images\` workflow with tag \`${VERSION}\`" >> $GITHUB_STEP_SUMMARY
echo "2. Verify the artifacts at the staging directory" >> $GITHUB_STEP_SUMMARY
echo "3. Send [VOTE] email to dev@texera.apache.org" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### Verification" >> $GITHUB_STEP_SUMMARY
echo "\`\`\`bash" >> $GITHUB_STEP_SUMMARY
echo "# Import KEYS and verify signatures" >> $GITHUB_STEP_SUMMARY
echo "gpg --import KEYS" >> $GITHUB_STEP_SUMMARY
echo "gpg --verify ${SRC_TARBALL}.asc ${SRC_TARBALL}" >> $GITHUB_STEP_SUMMARY
echo "gpg --verify ${COMPOSE_TARBALL}.asc ${COMPOSE_TARBALL}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "# Verify SHA512 checksums" >> $GITHUB_STEP_SUMMARY
echo "sha512sum -c ${SRC_TARBALL}.sha512" >> $GITHUB_STEP_SUMMARY
echo "sha512sum -c ${COMPOSE_TARBALL}.sha512" >> $GITHUB_STEP_SUMMARY
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**KEYS file:** https://downloads.apache.org/incubator/texera/KEYS" >> $GITHUB_STEP_SUMMARY
echo "✓ Release candidate workflow completed successfully!"
- name: Display vote email template
run: |
echo "## Vote Email Template" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "Copy the content below to send to dev@texera.apache.org:" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
cat "$GITHUB_WORKSPACE/vote-email.txt" >> $GITHUB_STEP_SUMMARY
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
================================================
FILE: .github/workflows/direct-backport-push.yml
================================================
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: Direct Backport Push
on:
push:
branches:
- main
permissions:
actions: read
contents: write
issues: write
pull-requests: write
statuses: write
jobs:
discover:
name: Discover direct backport targets
runs-on: ubuntu-latest
outputs:
pr_number: ${{ steps.discover.outputs.pr_number }}
targets: ${{ steps.discover.outputs.targets }}
has_targets: ${{ steps.discover.outputs.has_targets }}
steps:
- name: Resolve merged PR and green targets
id: discover
uses: actions/github-script@v8
with:
script: |
const sha = context.sha;
const { owner, repo } = context.repo;
// Strategy 1 (preferred): parse the squash-merge commit message.
// ASF .asf.yaml forces squash merges with PR_TITLE_AND_DESC, so the
// first line ends with "(#NNNN)". This is deterministic and avoids
// the commit↔PR association index, which can lag for tens of seconds
// after a merge.
async function resolvePrFromMessage() {
const message = context.payload?.head_commit?.message ?? "";
const firstLine = message.split("\n", 1)[0];
const match = firstLine.match(/\(#(\d+)\)\s*$/);
if (!match) {
core.info('Commit message does not end with "(#N)"; falling back to API.');
return null;
}
const prNumber = Number(match[1]);
try {
const { data: pr } = await github.rest.pulls.get({
owner,
repo,
pull_number: prNumber,
});
if (!pr.merged) {
core.warning(`PR #${prNumber} extracted from commit message is not merged; falling back to API.`);
return null;
}
core.info(`Resolved PR #${prNumber} from commit message.`);
return pr;
} catch (e) {
core.warning(`Failed to fetch PR #${prNumber}: ${e.message}. Falling back to API.`);
return null;
}
}
// Strategy 2 (fallback): GET /commits/{sha}/pulls with exponential
// backoff. 5 attempts at 0/2/4/8/16s — total worst case ~30s.
async function resolvePrFromApi() {
const backoffsMs = [0, 2000, 4000, 8000, 16000];
for (let i = 0; i < backoffsMs.length; i++) {
if (backoffsMs[i] > 0) {
core.info(`Retrying commit→PR lookup in ${backoffsMs[i] / 1000}s (attempt ${i + 1}/${backoffsMs.length}).`);
await new Promise((resolve) => setTimeout(resolve, backoffsMs[i]));
}
const response = await github.request(
"GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls",
{
owner,
repo,
commit_sha: sha,
}
);
const pr = response.data.find((p) => p.merge_commit_sha === sha) ?? response.data[0];
if (pr) {
core.info(`Resolved PR #${pr.number} from commits/${sha}/pulls on attempt ${i + 1}.`);
return pr;
}
}
return null;
}
const pullRequest = (await resolvePrFromMessage()) ?? (await resolvePrFromApi());
if (!pullRequest) {
core.info(`No merged pull request is associated with ${sha}.`);
core.setOutput("pr_number", "");
core.setOutput("targets", "[]");
core.setOutput("has_targets", "false");
return;
}
const requestedTargets = [...new Set(
pullRequest.labels
.map((label) => label.name)
.filter((name) => /^release\/.+$/.test(name))
)].sort();
if (requestedTargets.length === 0) {
core.info(`PR #${pullRequest.number} does not request any backports.`);
core.setOutput("pr_number", String(pullRequest.number));
core.setOutput("targets", "[]");
core.setOutput("has_targets", "false");
return;
}
const buildRuns = await github.paginate(
github.rest.actions.listWorkflowRuns,
{
owner,
repo,
workflow_id: "required-checks.yml",
head_sha: pullRequest.head.sha,
per_page: 100,
}
);
let greenTargets = [];
if (buildRuns.length === 0) {
core.warning(`No Build workflow runs found for ${pullRequest.head.sha}.`);
} else {
const allJobs = [];
for (const run of buildRuns) {
const jobs = await github.paginate(
github.rest.actions.listJobsForWorkflowRun,
{
owner,
repo,
run_id: run.id,
per_page: 100,
}
);
allJobs.push(...jobs);
}
greenTargets = requestedTargets.filter((target) => {
const prefix = `backport (${target}) / `;
const targetJobs = allJobs.filter((job) => job.name.startsWith(prefix));
// Treat skipped as green: precheck legitimately skips stacks
// based on PR labels, matching the Required Checks aggregator.
return (
targetJobs.length > 0 &&
targetJobs.every(
(job) => job.conclusion === "success" || job.conclusion === "skipped"
)
);
});
}
const skippedTargets = requestedTargets.filter((target) => !greenTargets.includes(target));
if (skippedTargets.length > 0) {
core.warning(`Skipping targets without a successful Backport run: ${skippedTargets.join(", ")}`);
}
core.setOutput("pr_number", String(pullRequest.number));
core.setOutput("targets", JSON.stringify(greenTargets));
core.setOutput("has_targets", greenTargets.length > 0 ? "true" : "false");
push-backports:
needs: discover
if: ${{ needs.discover.outputs.has_targets == 'true' }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
target: ${{ fromJson(needs.discover.outputs.targets) }}
steps:
- name: Checkout main
uses: actions/checkout@v5
with:
fetch-depth: 0
# Use AUTO_MERGE_TOKEN (fine-grained PAT) so the push to the release
# branch retriggers workflows on that branch. GITHUB_TOKEN-authored
# pushes are excluded from triggering downstream workflows, which
# silences post-merge CI on backport commits.
token: ${{ secrets.AUTO_MERGE_TOKEN || secrets.GITHUB_TOKEN }}
- name: Cherry-pick merge commit onto target branch
id: cherry_pick
env:
MERGE_SHA: ${{ github.sha }}
TARGET_BRANCH: ${{ matrix.target }}
run: |
set -euo pipefail
log() { printf '[backport %s] %s\n' "${TARGET_BRANCH}" "$*"; }
group() { printf '::group::%s\n' "$*"; }
endgroup() { printf '::endgroup::\n'; }
group "Validate merge commit ${MERGE_SHA}"
parent_count=$(git rev-list --parents -n 1 "${MERGE_SHA}" | awk '{print NF-1}')
log "parent_count=${parent_count}"
if [[ "${parent_count}" -ne 1 ]]; then
echo "::error::Direct backport expects a squash-merged commit on main. ${MERGE_SHA} has ${parent_count} parents."
exit 1
fi
endgroup
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
# Reuse the squash commit's full message so the PR title, description,
# and any Co-Authored-By trailers GitHub injected stay attached to
# the backport commit. The author is the squash commit's author
# (the original PR author for squash merges).
original_author=$(git log -1 --format='%an <%ae>' "${MERGE_SHA}")
merge_message=$(git log -1 --format=%B "${MERGE_SHA}")
log "original_author=${original_author}"
group "Cherry-pick onto ${TARGET_BRANCH}"
git fetch --no-tags origin "${TARGET_BRANCH}"
git checkout -B "${TARGET_BRANCH}" "origin/${TARGET_BRANCH}"
base_sha=$(git rev-parse HEAD)
log "base_sha=${base_sha}"
if ! git cherry-pick --no-commit "${MERGE_SHA}"; then
endgroup
group "Conflict diagnosis"
conflicts=$(git diff --name-only --diff-filter=U)
log "Conflicted files:"
printf ' %s\n' ${conflicts}
# merge-base of the source commit and the target branch — the
# most recent point where main and the release branch shared
# history. Anything on main between the merge-base and the
# source commit that touches a conflicting file is a candidate
# "missing prerequisite" the backport probably needs first.
merge_base=$(git merge-base "${MERGE_SHA}^" "origin/${TARGET_BRANCH}" || echo "")
log ""
log "merge_base(${MERGE_SHA:0:8}^, origin/${TARGET_BRANCH})=${merge_base:-<none>}"
for f in ${conflicts}; do
log ""
log "── ${f} ──"
log "Conflict markers (line numbers in the working tree):"
grep -nE '^(<<<<<<<|=======|>>>>>>>)' -- "${f}" | head -40 || true
if [[ -n "${merge_base}" ]]; then
log ""
log "Commits on main that modified ${f} between ${merge_base:0:8}..${MERGE_SHA:0:8}^ (likely-missing prerequisites — consider backporting these first):"
git log --oneline --no-merges "${merge_base}..${MERGE_SHA}^" -- "${f}" | head -20 || true
log ""
log "Commits on ${TARGET_BRANCH} that modified ${f} since ${merge_base:0:8} (changes already on the release branch that diverged from main):"
git log --oneline --no-merges "${merge_base}..origin/${TARGET_BRANCH}" -- "${f}" | head -20 || true
fi
log ""
log "Last 3 commits anywhere that touched ${f}:"
git log --oneline --all -3 -- "${f}" || true
done
endgroup
# Write a condensed markdown summary for the failure PR comment.
# Caps: 5 files, 10 prerequisite commits total — keep PR
# comments scannable; the full detail is in the job log above.
diagnosis_file="${RUNNER_TEMP:-/tmp}/backport-diagnosis.md"
{
echo "**Conflicts in:**"
num=0
for f in ${conflicts}; do
if [[ ${num} -lt 5 ]]; then
printf -- '- `%s`\n' "${f}"
fi
num=$((num + 1))
done
if [[ ${num} -gt 5 ]]; then
printf -- '- _(+%d more)_\n' "$((num - 5))"
fi
if [[ -n "${merge_base}" ]]; then
echo
echo "**Likely-missing prerequisites on main** (commits that touched these files between merge-base \`${merge_base:0:8}\` and \`${MERGE_SHA:0:8}^\` — consider backporting these first):"
{
for f in ${conflicts}; do
git log --oneline --no-merges "${merge_base}..${MERGE_SHA}^" -- "${f}" || true
done
} | sort -u | head -10 | while IFS= read -r line; do
[[ -n "${line}" ]] && printf -- '- `%s`\n' "${line}"
done
fi
} > "${diagnosis_file}"
log "Wrote diagnosis summary to ${diagnosis_file}"
echo "::error::Cherry-pick of ${MERGE_SHA} onto ${TARGET_BRANCH} hit conflicts. See 'Conflict diagnosis' group above for likely-missing prerequisite commits and per-file conflict markers."
exit 1
fi
endgroup
group "Compose backport commit message"
new_message=$(
printf '%s' "${merge_message}" \
| python3 .github/scripts/compose-backport-message.py "${MERGE_SHA}"
)
printf '%s\n' "${new_message}" | git commit -F - --author="${original_author}"
log "local_sha=$(git rev-parse HEAD)"
endgroup
# Push with retry. Transient failures (network, GitHub 5xx) are pure
# backoff. Non-fast-forward (race with another push to the same
# release branch) refreshes origin/<target> and rebases this single
# cherry-pick on top before retrying.
push_attempts=5
push_backoffs=(0 5 15 30 60)
push_success=0
for i in $(seq 0 $((push_attempts - 1))); do
if [[ "${push_backoffs[i]}" -gt 0 ]]; then
log "Push attempt $((i + 1))/${push_attempts}: sleeping ${push_backoffs[i]}s"
sleep "${push_backoffs[i]}"
fi
group "Push attempt $((i + 1))/${push_attempts}"
if git push origin "HEAD:${TARGET_BRANCH}" 2>&1; then
push_success=1
endgroup
break
fi
push_rc=$?
log "git push exit code=${push_rc}"
endgroup
# Refresh origin and rebase before retrying. If the remote did not
# advance, this is a no-op rebase and the next push will likely
# hit the same transient error — backoff handles that.
log "Refreshing origin/${TARGET_BRANCH} before retry"
git fetch --no-tags origin "${TARGET_BRANCH}"
old_remote_head="${remote_head:-${base_sha}}"
remote_head=$(git rev-parse "origin/${TARGET_BRANCH}")
log "origin/${TARGET_BRANCH}=${remote_head}"
if ! git rebase "origin/${TARGET_BRANCH}"; then
conflicts=$(git diff --name-only --diff-filter=U)
group "Rebase conflict diagnosis"
log "Conflicted files during rebase:"
printf ' %s\n' ${conflicts}
log ""
log "Commits on ${TARGET_BRANCH} that landed since this run started (${old_remote_head:0:8}..${remote_head:0:8}):"
git log --oneline --no-merges "${old_remote_head}..${remote_head}" | head -20 || true
for f in ${conflicts}; do
log ""
log "── ${f} ──"
log "Commits in ${old_remote_head:0:8}..${remote_head:0:8} that touched ${f}:"
git log --oneline --no-merges "${old_remote_head}..${remote_head}" -- "${f}" | head -20 || true
done
endgroup
diagnosis_file="${RUNNER_TEMP:-/tmp}/backport-diagnosis.md"
{
printf -- '**Rebase conflict during push** — another commit landed on `%s` between the start of this run and the push attempt.\n\n' "${TARGET_BRANCH}"
echo "**Conflicts in:**"
num=0
for f in ${conflicts}; do
if [[ ${num} -lt 5 ]]; then
printf -- '- `%s`\n' "${f}"
fi
num=$((num + 1))
done
if [[ ${num} -gt 5 ]]; then
printf -- '- _(+%d more)_\n' "$((num - 5))"
fi
echo
printf -- '**Racing commits on `%s`** (`%s..%s`):\n' \
"${TARGET_BRANCH}" "${old_remote_head:0:8}" "${remote_head:0:8}"
git log --oneline --no-merges "${old_remote_head}..${remote_head}" | head -10 | while IFS= read -r line; do
[[ -n "${line}" ]] && printf -- '- `%s`\n' "${line}"
done
} > "${diagnosis_file}"
log "Wrote diagnosis summary to ${diagnosis_file}"
git rebase --abort || true
echo "::error::Rebase onto refreshed origin/${TARGET_BRANCH} hit a conflict; another commit changed the same lines. See 'Rebase conflict diagnosis' group for the racing commits."
exit 1
fi
done
if [[ "${push_success}" -ne 1 ]]; then
echo "::error::git push to ${TARGET_BRANCH} failed after ${push_attempts} attempts"
exit 1
fi
new_sha=$(git rev-parse HEAD)
log "new_sha=${new_sha}"
echo "new_sha=${new_sha}" >> "$GITHUB_OUTPUT"
- name: Annotate original PR and commit on success
if: success()
uses: actions/github-script@v8
env:
MERGE_SHA: ${{ github.sha }}
TARGET_BRANCH: ${{ matrix.target }}
NEW_SHA: ${{ steps.cherry_pick.outputs.new_sha }}
PR_NUMBER: ${{ needs.discover.outputs.pr_number }}
with:
script: |
const { MERGE_SHA, TARGET_BRANCH, NEW_SHA, PR_NUMBER } = process.env;
const { owner, repo } = context.repo;
const runUrl =
`${context.serverUrl}/${owner}/${repo}/actions/runs/${context.runId}`;
const newCommitUrl =
`${context.serverUrl}/${owner}/${repo}/commit/${NEW_SHA}`;
const branchUrl =
`${context.serverUrl}/${owner}/${repo}/tree/${TARGET_BRANCH}`;
core.info(
`Annotating: merge_sha=${MERGE_SHA} new_sha=${NEW_SHA} ` +
`target=${TARGET_BRANCH} pr=${PR_NUMBER || '<unknown>'}`,
);
// Annotation API calls are best-effort: a transient 5xx shouldn't
// demote the whole job to failure when the cherry-pick itself
// succeeded. Each call gets a small bounded retry; if it still
// fails we log a warning and move on so the other annotations
// still get a chance to land.
const backoffsMs = [0, 2000, 5000, 15000];
async function withRetry(name, fn) {
for (let i = 0; i < backoffsMs.length; i++) {
if (backoffsMs[i] > 0) {
core.info(
`Retrying ${name} in ${backoffsMs[i] / 1000}s ` +
`(attempt ${i + 1}/${backoffsMs.length}).`,
);
await new Promise((r) => setTimeout(r, backoffsMs[i]));
}
try {
const out = await fn();
core.info(`${name} ok.`);
return out;
} catch (e) {
const msg = `${name} failed (status ${e.status ?? '?'}): ${e.message}`;
if (i === backoffsMs.length - 1) {
core.warning(`${msg} — giving up.`);
return null;
}
core.warning(`${msg} — will retry.`);
}
}
}
// GitHub auto-derives the branch badges shown next to a commit
// title from "branches that contain this commit". A cherry-pick
// produces a different SHA than the main commit, so the release
// branch will never naturally appear on the main commit's page.
// Two surfacing channels instead:
// 1. A commit status — appears as a green check badge in the
// same row as CI statuses on the commit and any PRs that
// reference it. target_url drops the user on the new commit.
// 2. A commit comment with the same info, for richer detail.
await withRetry("createCommitStatus", () =>
github.rest.repos.createCommitStatus({
owner,
repo,
sha: MERGE_SHA,
state: "success",
context: `backport/${TARGET_BRANCH}`,
description: `Backported as ${NEW_SHA.slice(0, 7)}`,
target_url: newCommitUrl,
}),
);
await withRetry("createCommitComment", () =>
github.rest.repos.createCommitComment({
owner,
repo,
commit_sha: MERGE_SHA,
body:
`Backported to [\`${TARGET_BRANCH}\`](${branchUrl}) as ` +
`[\`${NEW_SHA.slice(0, 7)}\`](${newCommitUrl}). ` +
`[Run](${runUrl})`,
}),
);
if (PR_NUMBER) {
await withRetry("createPRComment", () =>
github.rest.issues.createComment({
owner,
repo,
issue_number: Number(PR_NUMBER),
body:
`Backport to [\`${TARGET_BRANCH}\`](${branchUrl}) succeeded ` +
`as [\`${NEW_SHA.slice(0, 7)}\`](${newCommitUrl}). ` +
`[Run](${runUrl})`,
}),
);
} else {
core.info("No PR number resolved — skipping PR comment.");
}
- name: Annotate original PR and commit on failure
if: failure()
uses: actions/github-script@v8
env:
MERGE_SHA: ${{ github.sha }}
TARGET_BRANCH: ${{ matrix.target }}
PR_NUMBER: ${{ needs.discover.outputs.pr_number }}
with:
script: |
const { MERGE_SHA, TARGET_BRANCH, PR_NUMBER } = process.env;
const { owner, repo } = context.repo;
const runUrl =
`${context.serverUrl}/${owner}/${repo}/actions/runs/${context.runId}`;
core.info(
`Annotating failure: merge_sha=${MERGE_SHA} ` +
`target=${TARGET_BRANCH} pr=${PR_NUMBER || '<unknown>'}`,
);
const backoffsMs = [0, 2000, 5000, 15000];
async function withRetry(name, fn) {
for (let i = 0; i < backoffsMs.length; i++) {
if (backoffsMs[i] > 0) {
core.info(
`Retrying ${name} in ${backoffsMs[i] / 1000}s ` +
`(attempt ${i + 1}/${backoffsMs.length}).`,
);
await new Promise((r) => setTimeout(r, backoffsMs[i]));
}
try {
const out = await fn();
core.info(`${name} ok.`);
return out;
} catch (e) {
const msg = `${name} failed (status ${e.status ?? '?'}): ${e.message}`;
if (i === backoffsMs.length - 1) {
core.warning(`${msg} — giving up.`);
return null;
}
core.warning(`${msg} — will retry.`);
}
}
}
// Find this matrix leg's job so the link drops the user directly
// onto the failing log instead of the run summary.
let jobUrl = runUrl;
const jobs = await withRetry("listJobsForWorkflowRun", () =>
github.paginate(github.rest.actions.listJobsForWorkflowRun, {
owner,
repo,
run_id: context.runId,
per_page: 100,
}),
);
if (jobs) {
const me = jobs.find((j) => j.name.includes(`(${TARGET_BRANCH})`));
if (me?.html_url) {
jobUrl = me.html_url;
core.info(`Resolved job URL for matrix leg: ${jobUrl}`);
} else {
core.info(
`No job matched name including "(${TARGET_BRANCH})"; ` +
"falling back to run URL.",
);
}
}
await withRetry("createCommitStatus", () =>
github.rest.repos.createCommitStatus({
owner,
repo,
sha: MERGE_SHA,
state: "failure",
context: `backport/${TARGET_BRANCH}`,
description: "Backport failed",
target_url: jobUrl,
}),
);
// Pick up the markdown diagnosis the bash step wrote on
// conflict (cherry-pick or rebase). Missing file just means
// the failure happened elsewhere (e.g. push 5xx after retries,
// permissions) — we still post the basic comment.
const fs = require("fs");
const diagPath =
`${process.env.RUNNER_TEMP || "/tmp"}/backport-diagnosis.md`;
let diagnosis = "";
try {
diagnosis = fs.readFileSync(diagPath, "utf8").trim();
if (diagnosis) {
core.info(`Found diagnosis at ${diagPath} (${diagnosis.length} chars)`);
}
} catch (e) {
core.info(
`No diagnosis file at ${diagPath} (${e.code}) — failure likely not a conflict.`,
);
}
if (PR_NUMBER) {
const head =
`Backport to \`${TARGET_BRANCH}\` failed. ` +
`See [job log](${jobUrl}).`;
const body = diagnosis ? `${head}\n\n${diagnosis}` : head;
await withRetry("createPRComment", () =>
github.rest.issues.createComment({
owner,
repo,
issue_number: Number(PR_NUMBER),
body,
}),
);
} else {
core.info("No PR number resolved — skipping PR comment.");
}
================================================
FILE: .github/workflows/license-binary-checker.yml
================================================
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
name: License Binary Checker
# Scheduled drift checker for per-module LICENSE-binary files. Calls
# build.yml with mode=nightly (strict) and files / updates / closes
# one tracking issue (label `license-binary-drift`). Sub-task of #4688.
on:
schedule:
# 11:00 UTC daily = 04:00 PDT / 03:00 PST.
- cron: "0 11 * * *"
workflow_dispatch:
permissions:
contents: read
issues: write # create / update / close the tracking issue
actions: read # listJobsForWorkflowRun in the report step
concurrency:
group: license-binary-checker
cancel-in-progress: false
jobs:
build:
uses: ./.github/workflows/build.yml
with:
mode: nightly
secrets: inherit
report:
if: always()
needs: [build]
runs-on: ubuntu-latest
steps:
- name: File or update tracking issue
uses: actions/github-script@v8
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const TRACKING_LABEL = 'license-binary-drift';
const TITLE = 'License-binary drift detected';
// Match license-check step names; ignore unrelated failures.
const LICENSE_STEP_RE = /license[-\s]?binary|binary licenses/i;
const { owner, repo } = context.repo;
const runUrl =
`${context.serverUrl}/${owner}/${repo}/actions/runs/${context.runId}`;
// Walk every job in the current run (which includes the called
// build.yml jobs, prefixed with the calling job id `build`).
const jobs = await github.paginate(
github.rest.actions.listJobsForWorkflowRun,
{ owner, repo, run_id: context.runId, per_page: 100 }
);
const licenseFailures = [];
const licenseSuccesses = [];
for (const job of jobs) {
for (const step of job.steps || []) {
if (!LICENSE_STEP_RE.test(step.name)) continue;
if (step.conclusion === 'failure') {
licenseFailures.push({
job: job.name,
step: step.name,
url: job.html_url,
});
} else if (step.conclusion === 'success') {
licenseSuccesses.push({ job: job.name, step: step.name });
}
}
}
const anyDrift = licenseFailures.length > 0;
core.info(
`License-check steps: ${licenseSuccesses.length} ok, ` +
`${licenseFailures.length} failed.`
);
const { data: existing } = await github.rest.issues.listForRepo({
owner, repo, state: 'open', labels: TRACKING_LABEL, per_page: 5,
});
// Only manage issues for runs against the default branch.
const defaultBranch = context.payload.repository.default_branch;
const isDefaultBranch =
context.ref === `refs/heads/${defaultBranch}` ||
context.eventName === 'schedule';
if (!isDefaultBranch) {
core.info(
`Not on default branch (ref=${context.ref}); ` +
`skipping issue management. Drift detected: ${anyDrift}.`
);
return;
}
if (!anyDrift) {
if (existing.length === 0) {
core.info('No drift, no existing tracking issue. Nothing to do.');
return;
}
for (const issue of existing) {
await github.rest.issues.update({
owner, repo, issue_number: issue.number,
state: 'closed', state_reason: 'completed',
});
await github.rest.issues.createComment({
owner, repo, issue_number: issue.number,
body:
`Closed automatically: scheduled run ${runUrl} found ` +
`no license-binary drift across any ecosystem.`,
});
core.info(`Closed stale tracking issue #${issue.number}`);
}
return;
}
// Body shape mirrors ISSUE_TEMPLATE/task-template.yaml.
const failureLines = licenseFailures.map(
(f) => `- \`${f.job}\` — ${f.step} ([logs](${f.url}))`
);
const body =
`### Task Summary\n\n` +
`License-binary drift on \`${context.sha.slice(0, 7)}\` ` +
`([run](${runUrl})).\n\n` +
`**Where:**\n\n` +
failureLines.join('\n') +
`\n\n**How to resolve:** refresh the per-module ` +
`\`LICENSE-binary\` file(s) to match the bundled versions.\n\n` +
`### Task Type\n\n` +
`- [ ] Refactor / Cleanup\n` +
`- [x] DevOps / Deployment / CI\n` +
`- [ ] Testing / QA\n` +
`- [ ] Documentation\n` +
`- [ ] Performance\n` +
`- [ ] Other\n\n` +
`---\n\n` +
`By submitting this issue, you agree to follow the ` +
`[Apache Code of Conduct]` +
`(https://www.apache.org/foundation/policies/conduct).`;
if (existing.length > 0) {
const issue = existing[0];
await github.rest.issues.update({
owner, repo, issue_number: issue.number,
title: TITLE, body,
});
core.info(`Updated tracking issue #${issue.number}`);
for (const extra of existing.slice(1)) {
await github.rest.issues.update({
owner, repo, issue_number: extra.number,
state: 'closed', state_reason: 'not_planned',
});
core.info(`Closed duplicate tracking issue #${extra.number}`);
}
} else {
const { data: created } = await github.rest.issues.create({
owner, repo, title: TITLE, body,
labels: [TRACKING_LABEL, 'ci', 'triage'],
});
core.info(`Filed new tracking issue #${created.number}`);
}
================================================
FILE: .github/workflows/lint-pr.yml
================================================
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: Lint PR
on:
pull_request_target:
types:
- opened
- edited
- reopened
- synchronize
jobs:
main:
name: Validate PR title
runs-on: ubuntu-latest
permissions:
pull-requests: read
steps:
- uses: amannn/action-semantic-pull-request@48f256284bd46cdaab1048c3721360e808335d50 # v6.1.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
================================================
FILE: .github/workflows/pr-assignment.yml
================================================
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: PR assignment
on:
pull_request_target:
types: [opened, edited, closed]
permissions:
issues: write
pull-requests: write
jobs:
# All three behaviors live as steps under one job so the PR Checks
# tab shows a single entry per event instead of two-or-three skipped
# siblings. Step-level if-guards keep the actual work scoped.
pr-assignment:
runs-on: ubuntu-latest
steps:
- name: Self-assign PR author to the PR
if: >-
github.event.action == 'opened'
&& github.event.pull_request.user.type != 'Bot'
&& github.event.pull_request.assignees[0] == null
uses: actions/github-script@v8
with:
script: |
const pr = context.payload.pull_request;
core.info(`PR #${pr.number} opened by ${pr.user.login}; self-assigning.`);
try {
await github.rest.issues.addAssignees({
...context.repo,
issue_number: pr.number,
assignees: [pr.user.login],
});
core.info(`Assigned ${pr.user.login} to PR #${pr.number}`);
} catch (e) {
core.warning(`Self-assign on PR #${pr.number} failed: ${e.message}`);
}
- name: Sync PR opener as assignee on linked issues
# Mirror the PR opener as an assignee on each same-repo issue listed
# in closingIssuesReferences. On body edits, also drop the opener
# from issues whose closing keyword was removed. Other manual
# assignees are never touched here, so this never fights with the
# merge-time credit step or human triage decisions.
if: >-
contains(fromJSON('["opened","edited"]'), github.event.action)
&& github.event.pull_request.state == 'open'
&& github.event.pull_request.user.type != 'Bot'
uses: actions/github-script@v8
with:
script: |
const { owner, repo } = context.repo;
const pr = context.payload.pull_request;
const opener = pr.user.login;
core.info(`Event ${context.payload.action} on PR #${pr.number} by ${opener}; syncing closing-issue assignees.`);
const { repository: { pullRequest: prq } } = await github.graphql(`
query($owner: String!, $repo: String!, $pr: Int!) {
repository(owner: $owner, name: $repo) {
pullRequest(number: $pr) {
closingIssuesReferences(first: 50) {
nodes { number repository { nameWithOwner } }
}
}
}
}`, { owner, repo, pr: pr.number });
const sameRepo = `${owner}/${repo}`;
const allRefs = prq.closingIssuesReferences.nodes;
const linked = allRefs
.filter((n) => n.repository.nameWithOwner === sameRepo)
.map((n) => n.number);
const crossRepo = allRefs.filter((n) => n.repository.nameWithOwner !== sameRepo);
core.info(`Found ${linked.length} same-repo closing reference(s): ${linked.join(', ') || '(none)'}`);
if (crossRepo.length) {
core.info(`Skipping ${crossRepo.length} cross-repo reference(s): ${crossRepo.map((n) => `${n.repository.nameWithOwner}#${n.number}`).join(', ')}`);
}
for (const issue_number of linked) {
try {
await github.rest.issues.addAssignees({
owner, repo, issue_number, assignees: [opener],
});
core.info(`Assigned ${opener} to issue #${issue_number}`);
} catch (e) {
core.warning(`addAssignees on #${issue_number} failed: ${e.message}`);
}
}
// On body edit, find closing refs that disappeared from the body
// and remove the opener from those issues. closingIssuesReferences
// is a snapshot of the *new* state, so we need text-diff to detect
// removals. Cross-repo refs are intentionally skipped.
if (
context.payload.action === 'edited' &&
context.payload.changes &&
context.payload.changes.body &&
typeof context.payload.changes.body.from === 'string'
) {
// GitHub also recognizes the colon form ("Closes: #123"), so
// allow an optional ":" between the keyword and the issue
// ref. Multiple refs on one line still need their own
// keyword each ("Closes #1, closes #2"), matching the
// `closingIssuesReferences` semantics — `Closes #1, #2`
// links only #1, so the diff treats only #1 as removed.
const re = /\b(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?):?\s+#(\d+)/gi;
const oldBody = context.payload.changes.body.from || '';
const newBody = pr.body || '';
const oldRefs = new Set([...oldBody.matchAll(re)].map((m) => Number(m[1])));
const newRefs = new Set([...newBody.matchAll(re)].map((m) => Number(m[1])));
const removed = [...oldRefs].filter((n) => !newRefs.has(n));
core.info(`Body-diff: oldRefs=[${[...oldRefs].join(',')}] newRefs=[${[...newRefs].join(',')}] removed=[${removed.join(',')}]`);
for (const issue_number of removed) {
try {
await github.rest.issues.removeAssignees({
owner, repo, issue_number, assignees: [opener],
});
core.info(`Unassigned ${opener} from issue #${issue_number}`);
} catch (e) {
core.warning(`removeAssignees on #${issue_number} failed: ${e.message}`);
}
}
} else if (context.payload.action === 'edited') {
core.info(`Body unchanged on edit; skipping removal-detection.`);
}
- name: Unassign PR opener from linked issues on PR close without merge
# When a PR is closed without merging, the opener was added to
# linked issues by the "Sync PR opener" step on open/edit. Mirror
# the close: remove them so abandoned PRs do not leave stale
# assignees. With no other assignee the issue then drops back into
# the `is:open no:assignee` triage filter automatically. Cross-repo
# refs are skipped, consistent with the assign side.
if: >-
github.event.action == 'closed'
&& github.event.pull_request.merged == false
&& github.event.pull_request.user.type != 'Bot'
uses: actions/github-script@v8
with:
script: |
const { owner, repo } = context.repo;
const pr = context.payload.pull_request;
const opener = pr.user.login;
core.info(`PR #${pr.number} closed without merge; unassigning ${opener} from linked issues.`);
const { repository: { pullRequest: prq } } = await github.graphql(`
query($owner: String!, $repo: String!, $pr: Int!) {
repository(owner: $owner, name: $repo) {
pullRequest(number: $pr) {
closingIssuesReferences(first: 50) {
nodes { number repository { nameWithOwner } }
}
}
}
}`, { owner, repo, pr: pr.number });
const sameRepo = `${owner}/${repo}`;
const linked = prq.closingIssuesReferences.nodes
.filter((n) => n.repository.nameWithOwner === sameRepo)
.map((n) => n.number);
core.info(`Found ${linked.length} same-repo closing reference(s): ${linked.join(', ') || '(none)'}`);
for (const issue_number of linked) {
try {
await github.rest.issues.removeAssignees({
owner, repo, issue_number, assignees: [opener],
});
core.info(`Unassigned ${opener} from issue #${issue_number}`);
} catch (e) {
core.warning(`removeAssignees on #${issue_number} failed: ${e.message}`);
}
}
- name: Credit issue assignees on PR merge
if: github.event.action == 'closed' && github.event.pull_request.merged
uses: actions/github-script@v8
with:
script: |
const { owner, repo } = context.repo;
const pr = context.payload.pull_request;
const opener = pr.user;
const isHuman = (l) => l && !l.endsWith('[bot]');
core.info(`PR #${pr.number} merged by opener=${opener.login}; computing credited authors.`);
const { repository: { pullRequest: prq } } = await github.graphql(`
query($owner: String!, $repo: String!, $pr: Int!) {
repository(owner: $owner, name: $repo) {
pullRequest(number: $pr) {
closingIssuesReferences(first: 50) {
nodes {
number
repository { nameWithOwner }
assignees(first: 20) { nodes { login } }
}
}
commits(first: 250) {
nodes { commit {
parents { totalCount }
authors(first: 10) { nodes { user { login } } }
} }
}
}
}
}`, { owner, repo, pr: pr.number });
const authors = new Set();
if (opener.type !== 'Bot' && isHuman(opener.login)) authors.add(opener.login);
for (const { commit } of prq.commits.nodes) {
if (commit.parents.totalCount > 1) continue;
for (const a of commit.authors.nodes) {
if (isHuman(a.user?.login)) authors.add(a.user.login);
}
}
const credited = [...authors].slice(0, 10);
const creditedSet = new Set(credited);
core.info(`Credited authors (max 10, [bot] filtered): [${credited.join(', ') || '(none)'}]`);
if (!credited.length) {
core.info(`No human authors to credit; skipping all linked issues.`);
return;
}
const sameRepoIssues = prq.closingIssuesReferences.nodes.filter((n) => n.repository.nameWithOwner === `${owner}/${repo}`);
core.info(`Linked same-repo issues to credit: [${sameRepoIssues.map((i) => `#${i.number}`).join(', ') || '(none)'}]`);
for (const issue of sameRepoIssues) {
const current = issue.assignees.nodes.map(n => n.login);
const toRemove = current.filter(l => !creditedSet.has(l));
const toAdd = credited.filter(l => !current.includes(l));
const args = { owner, repo, issue_number: issue.number };
core.info(`Issue #${issue.number}: current=[${current.join(',')}] credited=[${credited.join(',')}] toRemove=[${toRemove.join(',')}] toAdd=[${toAdd.join(',')}]`);
try {
if (toRemove.length) {
await github.rest.issues.removeAssignees({ ...args, assignees: toRemove });
core.info(`Removed [${toRemove.join(', ')}] from issue #${issue.number}`);
}
if (toAdd.length) {
await github.rest.issues.addAssignees({ ...args, assignees: toAdd });
core.info(`Added [${toAdd.join(', ')}] to issue #${issue.number}`);
}
} catch (e) {
core.warning(`Updating assignees on #${issue.number} failed: ${e.message}`);
}
}
================================================
FILE: .github/workflows/pr-labeler.yml
================================================
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: "Pull Request Labeler"
on:
- pull_request_target
jobs:
labeler:
permissions:
contents: read
pull-requests: write
runs-on: ubuntu-latest
steps:
- uses: actions/labeler@v6
with:
sync-labels: true
================================================
FILE: .github/workflows/required-checks.yml
================================================
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
name: Required Checks
on:
push:
branches:
- 'ci-enable/**'
- 'main'
- 'release/**'
pull_request:
types:
- opened
- reopened
- synchronize
- labeled
- unlabeled
workflow_dispatch:
permissions:
checks: write
contents: read
pull-requests: read
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/main' && !startsWith(github.ref, 'refs/heads/release/') }}
jobs:
# Precheck decides which downstream jobs run for this event:
# - On PR events, wait for the Pull Request Labeler workflow to finish so
# the labels it applies (frontend, docs, dev, ...) are available, then
# gate run_* outputs on those labels.
# - run_frontend / run_amber / run_platform / run_python /
# run_agent_service: gate the main build stacks. Each labeler-applied
# label maps to the stacks it requires (LABEL_STACKS below); the run
# set is the union across all PR labels. Empty union (e.g. docs-only
# / dev-only PRs) skips every stack. Push and workflow_dispatch
# events run every stack.
# - backport_targets: JSON array of release/* labels currently on the PR.
# Drives the backport matrix; empty array means no backport runs.
precheck:
name: Precheck
runs-on: ubuntu-latest
outputs:
run_frontend: ${{ steps.decide.outputs.run_frontend }}
run_amber: ${{ steps.decide.outputs.run_amber }}
run_amber_integration: ${{ steps.decide.outputs.run_amber_integration }}
run_platform: ${{ steps.decide.outputs.run_platform }}
run_python: ${{ steps.decide.outputs.run_python }}
run_agent_service: ${{ steps.decide.outputs.run_agent_service }}
backport_targets: ${{ steps.decide.outputs.backport_targets }}
steps:
- name: Wait for Pull Request Labeler
if: github.event_name == 'pull_request'
uses: actions/github-script@v8
with:
script: |
const ref = context.payload.pull_request.head.sha;
const maxAttempts = 30;
for (let i = 0; i < maxAttempts; i++) {
const { data } = await github.rest.checks.listForRef({
owner: context.repo.owner,
repo: context.repo.repo,
ref,
check_name: "labeler",
});
const check = data.check_runs[0];
if (check && check.status === "completed") {
core.info(`labeler ${check.conclusion}`);
return;
}
core.info(`labeler not ready (attempt ${i + 1}/${maxAttempts})`);
await new Promise((r) => setTimeout(r, 10000));
}
core.warning("labeler did not complete within 5 minutes; proceeding with current labels.");
- name: Decide which jobs to run
id: decide
uses: actions/github-script@v8
with:
script: |
const eventName = context.eventName;
let labels = [];
if (eventName === "pull_request") {
// Re-fetch labels: the labeler may have just added some.
const { data: pr } = await github.rest.pulls.get({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.payload.pull_request.number,
});
labels = pr.labels.map((l) => l.name);
core.info(`PR labels: ${labels.join(", ") || "(none)"}`);
}
// Map each labeler-applied label to the stacks it requires. The
// run set is the union across all PR labels. Labels not listed
// here (release/*, feature, fix, refactor) contribute no stacks.
// dependencies is intentionally a no-op: every dep manifest the
// labeler matches lives under a component dir and is already
// covered by that component's label.
//
// label | frontend | amber | amber-integ | platform | python | agent-service
// ------------------|----------|-------|-------------|----------|--------|--------------
// frontend | x | | | | |
// python | | | x | | x |
// engine | | x | x | | |
// amber-integration | | | x | | |
// platform | | | | x | |
// agent-service | | | | | | x
// common | | x | x | x | | (root
// scala
// build/lint
// config)
// ddl-change | | x | x | x | |
// ci | x | x | x | x | x | x
// docs / dev / | | | | | |
// deps / release/ | | | | | |
// * / branch | | | | | |
//
// amber-integration runs the Scala tests tagged
// @org.apache.texera.amber.tags.IntegrationTest (e2e specs that
// spawn Python UDF workers). The labeler attaches `python` to
// any *.py change (including amber/src/{main,test}/python/**),
// so `engine` does not need to fire the python stack itself —
// pure-Python amber changes pick up `python` directly. The
// `amber-integration` label catches *IntegrationSpec.scala
// edits so a test-only change does not trigger the full
// Scala-only amber stack.
const LABEL_STACKS = {
frontend: ["frontend"],
python: ["amber-integration", "python"],
engine: ["amber", "amber-integration"],
"amber-integration": ["amber-integration"],
platform: ["platform"],
"agent-service": ["agent-service"],
common: ["amber", "amber-integration", "platform"],
"ddl-change": ["amber", "amber-integration", "platform"],
ci: ["frontend", "amber", "amber-integration", "platform", "python", "agent-service"],
};
let runFrontend = true;
let runAmber = true;
let runAmberIntegration = true;
let runPlatform = true;
let runPython = true;
let runAgentService = true;
if (eventName === "pull_request") {
const stacks = new Set();
for (const label of labels) {
for (const stack of LABEL_STACKS[label] || []) {
stacks.add(stack);
}
}
runFrontend = stacks.has("frontend");
runAmber = stacks.has("amber");
runAmberIntegration = stacks.has("amber-integration");
runPlatform = stacks.has("platform");
runPython = stacks.has("python");
runAgentService = stacks.has("agent-service");
core.info(
`Stacks selected by label union: ${[...stacks].sort().join(", ") || "(none)"}`
);
}
core.setOutput("run_frontend", runFrontend ? "true" : "false");
core.setOutput("run_amber", runAmber ? "true" : "false");
core.setOutput("run_amber_integration", runAmberIntegration ? "true" : "false");
core.setOutput("run_platform", runPlatform ? "true" : "false");
core.setOutput("run_python", runPython ? "true" : "false");
core.setOutput("run_agent_service", runAgentService ? "true" : "false");
// Backport targets: all current release/* labels on the PR.
const targets = [...new Set(labels.filter((n) => /^release\/.+$/.test(n)))].sort();
if (targets.length === 0) {
core.info("No backport targets on PR.");
} else {
core.info(`Backport targets: ${targets.join(", ")}`);
}
core.setOutput("backport_targets", JSON.stringify(targets));
cleanup-stale-backport:
if: ${{ github.event_name == 'pull_request' && github.event.action == 'unlabeled' && startsWith(github.event.label.name, 'release/') }}
runs-on: ubuntu-latest
steps:
- name: Cancel obsolete backport check_runs for the removed target
uses: actions/github-script@v8
with:
script: |
const { owner, repo } = context.repo;
const target = context.payload.label.name;
const headSha = context.payload.pull_request.head.sha;
const prefix = `backport (${target}) `;
const checks = await github.paginate(
github.rest.checks.listForRef,
{ owner, repo, ref: headSha, per_page: 100 }
);
for (const check of checks) {
if (!check.name.startsWith(prefix)) continue;
if (check.status === "completed" && check.conclusion === "cancelled") continue;
try {
await github.rest.checks.update({
owner,
repo,
check_run_id: check.id,
status: "completed",
conclusion: "cancelled",
});
core.info(`Cancelled check ${check.name}`);
} catch (e) {
core.warning(`Failed to update check ${check.id} (${check.name}): ${e.message}`);
}
}
build:
needs: precheck
uses: ./.github/workflows/build.yml
with:
run_frontend: ${{ needs.precheck.outputs.run_frontend == 'true' }}
run_amber: ${{ needs.precheck.outputs.run_amber == 'true' }}
run_amber_integration: ${{ needs.precheck.outputs.run_amber_integration == 'true' }}
run_platform: ${{ needs.precheck.outputs.run_platform == 'true' }}
run_python: ${{ needs.precheck.outputs.run_python == 'true' }}
run_agent_service: ${{ needs.precheck.outputs.run_agent_service == 'true' }}
secrets: inherit
backport:
needs: precheck
if: ${{ needs.precheck.outputs.backport_targets != '[]' }}
strategy:
fail-fast: false
matrix:
target: ${{ fromJson(needs.precheck.outputs.backport_targets) }}
uses: ./.github/workflows/build.yml
with:
checkout_ref: refs/pull/${{ github.event.pull_request.number }}/head
backport_target_branch: ${{ matrix.target }}
backport_commit_range: ${{ format('{0}..{1}', github.event.pull_request.base.sha, github.event.pull_request.head.sha) }}
job_name_suffix: ""
run_frontend: ${{ needs.precheck.outputs.run_frontend == 'true' }}
run_amber: ${{ needs.precheck.outputs.run_amber == 'true' }}
run_amber_integration: ${{ needs.precheck.outputs.run_amber_integration == 'true' }}
run_platform: ${{ needs.precheck.outputs.run_platform == 'true' }}
run_python: ${{ needs.precheck.outputs.run_python == 'true' }}
run_agent_service: ${{ needs.precheck.outputs.run_agent_service == 'true' }}
secrets: inherit
required-checks:
# Do not rename this job — its display name is referenced in .asf.yaml.
name: Required Checks
needs: [precheck, build, backport]
if: always()
runs-on: ubuntu-latest
steps:
- name: Verify all required checks succeeded or were skipped
run: |
declare -A results=(
[precheck]="${{ needs.precheck.result }}"
[build]="${{ needs.build.result }}"
[backport]="${{ needs.backport.result }}"
)
failed=0
for job in "${!results[@]}"; do
r="${results[$job]}"
echo "${job}: ${r}"
if [[ "$r" != "success" && "$r" != "skipped" ]]; then
failed=1
fi
done
if (( failed )); then
echo "::error::One or more required checks did not succeed."
exit 1
fi
echo "All required checks succeeded or were skipped."
================================================
FILE: .gitignore
================================================
# Ignoring binary/output
target/
out/
# Ignoring packages
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# Ignoring VSCode related files
.vscode/
# Ignoring IntelliJ related files
*.iml
.idea/
.idea_modules/
lib_managed/
src_managed/
# Ignoring Eclipse files
.classpath
.project
.settings
# Ignoring sublime files
*.sublime-workspace
# Ignoring index folder and data folder
index/
catalog/
plan/
plan_files/
query-results/
# Ignoring Mac OSX specific files
.DS_Store
# Ignoring jenv related files
.java-version
# Ignoring scala related files
hs_err_pid*
# Ignoring python related files
venv/
__pycache__/
*.py[cod]
*$py.class
.ipynb_checkpoints
.pytype/
.coverage
coverage.xml
.pytest_cache/
# Ignoring python generated files
*.model
*.pkl
# Ingoring user generated resources
user-resources/
# Ingoring gmail tokens
gmail/
# Ignoring maven related files
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
.mvn/wrapper/maven-wrapper.jar
# Ignoring sbt related files
.bsp/
sbt.json
# Ignoring rebel related files
rebel.xml
# Ignoring log files
*.log
*.log.gz
# Ignoring the entire log folder
logs/
# Ignoring package-lock.json
package-lock.json
# Ignoring protobuf related files
scalapb/scalapb
# Ignoring credentials
client_secret_*
StoredCredential*
**/apache2/
**/Apache24/
**/php/
Composer-Setup.exe
# Ignoring folders generated by vscode IDE
.metals/
.bloop/
.ammonite/
metals.sbt
# Ignoring Helm related files
**/charts/*.tgz
**/texera-helmchart/charts/
**/texera-helmchart/*/requirements.lock
**/texera-helmchart/Chart.lock
**/.helm/
# Additional Helm/Kubernetes related files
.kubeconfig
*.kubeconfig
**/.kube/
values-*.yaml # Any environment-specific value overrides
# Ignore nested node modules
**/node_modules/
**/package-lock.json
.env
# agent-service is Bun-based; yarn/npm artifacts aren't needed
agent-service/.yarn/
agent-service/.yarnrc.yml
agent-service/yarn.lock
agent-service/CLAUDE.md
# Ignoring local Claude Code artifacts (settings, worktrees, scratch)
.claude/
================================================
FILE: .jvmopts
================================================
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Required by Kryo: https://github.com/altoo-ag/pekko-kryo-serialization#using-kryo-on-jdk-17
--add-opens=java.base/java.lang=ALL-UNNAMED
--add-opens=java.base/java.lang.invoke=ALL-UNNAMED
--add-opens=java.base/java.util=ALL-UNNAMED
--add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED
--add-opens=java.base/sun.nio.ch=ALL-UNNAMED
# Required by Apache Arrow: https://arrow.apache.org/java/main/install.html
--add-opens=java.base/java.nio=ALL-UNNAMED
# Required by Apache Pekko: https://pekko.apache.org/docs/pekko/snapshot/release-notes/releases-2.0.html
--add-opens=java.base/jdk.internal.misc=ALL-UNNAMED
================================================
FILE: .licenserc.yaml
================================================
header:
license:
spdx-id: Apache-2.0
copyright-owner: Apache Software Foundation
paths-ignore:
- 'licenses'
- '**/*.md'
- '**/*.csv'
- '**/*.txt'
- '**/*.json'
- '**/*.jsonl'
- 'DESCRIPTION'
- 'DISCLAIMER'
- 'LICENSE'
- 'NOTICE'
# Per-module LICENSE-binary / NOTICE-binary describing the third-party
# content bundled in each module's binary artifact (Universal dist zip
# or Docker image). Plain-text manifests, not source files.
- '**/LICENSE-binary'
- '**/LICENSE-binary-*'
- '**/NOTICE-binary'
- '.dockerignore'
- '.gitattributes'
- '.github/PULL_REQUEST_TEMPLATE'
- 'yarn.lock'
- '.nvmrc'
- '.htaccess'
- '.gitkeep'
- 'site.webmanifest'
- '.gitignore'
- '.licenserc.yaml'
- 'frontend/.yarn/**'
- 'amber/src/main/python/proto/**'
- '**/.env.example'
- '**/.prettierrc'
- '**/bun.lock'
# Third-party code with MIT license - see LICENSE file for attribution
- 'common/workflow-operator/src/main/scala/com/kjetland/**'
# TypeFox monaco-languageclient derived files (MIT License)
- 'pyright-language-service/src/main.ts'
- 'pyright-language-service/src/language-server-runner.ts'
- 'pyright-language-service/src/server-commons.ts'
- 'frontend/src/app/common/formly/array.type.ts'
- 'frontend/src/app/common/formly/object.type.ts'
- 'frontend/src/app/common/formly/multischema.type.ts'
- 'frontend/src/app/common/formly/null.type.ts'
# Third-party SVG assets - see LICENSE file for attribution
- 'frontend/src/assets/svg/operator-view-result.svg'
- 'frontend/src/assets/svg/operator-reuse-cache-invalid.svg'
- 'frontend/src/assets/svg/operator-reuse-cache-valid.svg'
- 'frontend/src/app/common/type/proto/org/apache/texera/amber/core/virtualidentity.ts'
- 'frontend/src/app/common/type/proto/org/apache/texera/amber/core/workflow.ts'
- 'frontend/src/app/common/type/proto/google/protobuf/descriptor.ts'
- 'frontend/src/app/common/type/proto/scalapb/scalapb.ts'
================================================
FILE: .run/AccessControlService.run.xml
================================================
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="AccessControlService" type="Application" factoryName="Application">
<option name="MAIN_CLASS_NAME" value="org.apache.texera.service.AccessControlService" />
<module name="texera.access-control-service" />
<shortenClasspath name="ARGS_FILE" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="org.apache.texera.service.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>
================================================
FILE: .run/ComputingUnitManagingService.run.xml
================================================
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="ComputingUnitManagingService" type="Application" factoryName="Application">
<option name="MAIN_CLASS_NAME" value="org.apache.texera.service.ComputingUnitManagingService" />
<module name="texera.computing-unit-managing-service" />
<shortenClasspath name="ARGS_FILE" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="org.apache.texera.service.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>
================================================
FILE: .run/ComputingUnitMaster.run.xml
================================================
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="ComputingUnitMaster" type="Application" factoryName="Application">
<option name="MAIN_CLASS_NAME" value="org.apache.texera.web.ComputingUnitMaster" />
<option name="VM_PARAMETERS" value="@$PROJECT_DIR$/.jvmopts" />
<module name="texera.amber" />
<shortenClasspath name="ARGS_FILE" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="org.apache.texera.web.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>
================================================
FILE: .run/ComputingUnitWorker.run.xml
================================================
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<componen
gitextract_mvod0m3k/
├── .asf.yaml
├── .dockerignore
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug-template.yaml
│ │ ├── feature-template.yaml
│ │ └── task-template.yaml
│ ├── PULL_REQUEST_TEMPLATE
│ ├── labeler.yml
│ ├── release/
│ │ └── vote-email-template.md
│ ├── scripts/
│ │ ├── compose-backport-message.py
│ │ └── prepare-backport-checkout.sh
│ └── workflows/
│ ├── auto-queue.yml
│ ├── automatic-email-notif-on-ddl-change.yml
│ ├── build-and-push-images.yml
│ ├── build.yml
│ ├── check-header.yml
│ ├── comment-commands.yml
│ ├── create-release-candidate.yml
│ ├── direct-backport-push.yml
│ ├── license-binary-checker.yml
│ ├── lint-pr.yml
│ ├── pr-assignment.yml
│ ├── pr-labeler.yml
│ └── required-checks.yml
├── .gitignore
├── .jvmopts
├── .licenserc.yaml
├── .run/
│ ├── AccessControlService.run.xml
│ ├── ComputingUnitManagingService.run.xml
│ ├── ComputingUnitMaster.run.xml
│ ├── ComputingUnitWorker.run.xml
│ ├── ConfigService.run.xml
│ ├── FileService.run.xml
│ ├── TexeraWebApplication.run.xml
│ ├── WorkflowCompilingService.run.xml
│ ├── frontend.run.xml
│ ├── texera micro services.run.xml
│ └── texera-lakefs.run.xml
├── .scalafix.conf
├── .scalafmt.conf
├── AGENTS.md
├── CLAUDE.md
├── CONTRIBUTING.md
├── DISCLAIMER
├── LICENSE
├── NOTICE
├── README.md
├── SECURITY.md
├── access-control-service/
│ ├── LICENSE-binary
│ ├── NOTICE-binary
│ ├── build.sbt
│ ├── project/
│ │ └── build.properties
│ └── src/
│ ├── main/
│ │ ├── resources/
│ │ │ ├── access-control-service-web-config.yaml
│ │ │ └── logback.xml
│ │ └── scala/
│ │ └── org/
│ │ └── apache/
│ │ └── texera/
│ │ └── service/
│ │ ├── AccessControlService.scala
│ │ ├── AccessControlServiceConfiguration.scala
│ │ ├── activity/
│ │ │ └── UserActivityEventListener.scala
│ │ └── resource/
│ │ ├── AccessControlResource.scala
│ │ └── HealthCheckResource.scala
│ └── test/
│ └── scala/
│ └── org/
│ └── apache/
│ └── texera/
│ ├── AccessControlResourceSpec.scala
│ └── service/
│ ├── AccessControlServiceRunSpec.scala
│ └── activity/
│ └── UserActivityEventListenerSpec.scala
├── agent-service/
│ ├── .dockerignore
│ ├── .prettierrc
│ ├── LICENSE-binary
│ ├── bin/
│ │ └── collect-licenses.ts
│ ├── package.json
│ ├── src/
│ │ ├── agent/
│ │ │ ├── index.ts
│ │ │ ├── prompts.ts
│ │ │ ├── texera-agent.ts
│ │ │ ├── tools/
│ │ │ │ ├── index.ts
│ │ │ │ ├── result-formatting.test.ts
│ │ │ │ ├── result-formatting.ts
│ │ │ │ ├── tools-utility.test.ts
│ │ │ │ ├── tools-utility.ts
│ │ │ │ ├── workflow-crud-tools.ts
│ │ │ │ └── workflow-execution-tools.ts
│ │ │ ├── util/
│ │ │ │ ├── auto-layout.test.ts
│ │ │ │ ├── auto-layout.ts
│ │ │ │ ├── context-utils.ts
│ │ │ │ ├── workflow-system-metadata.ts
│ │ │ │ └── workflow-utils.ts
│ │ │ ├── workflow-result-state.test.ts
│ │ │ ├── workflow-result-state.ts
│ │ │ ├── workflow-state.test.ts
│ │ │ └── workflow-state.ts
│ │ ├── api/
│ │ │ ├── auth-api.ts
│ │ │ ├── backend-api.ts
│ │ │ ├── compile-api.ts
│ │ │ ├── execution-api.ts
│ │ │ ├── index.ts
│ │ │ └── workflow-api.ts
│ │ ├── config/
│ │ │ └── env.ts
│ │ ├── index.ts
│ │ ├── logger.ts
│ │ ├── server.test.ts
│ │ ├── server.ts
│ │ └── types/
│ │ ├── agent.ts
│ │ ├── execution.ts
│ │ ├── index.ts
│ │ └── workflow.ts
│ └── tsconfig.json
├── amber/
│ ├── .scalafix.conf
│ ├── .scalafmt.conf
│ ├── DESCRIPTION
│ ├── LICENSE-binary-java
│ ├── LICENSE-binary-python
│ ├── NOTICE-binary
│ ├── README.md
│ ├── build.sbt
│ ├── dev-requirements.txt
│ ├── operator-requirements.txt
│ ├── project/
│ │ ├── build.properties
│ │ └── plugins.sbt
│ ├── pyproject.toml
│ ├── requirements.txt
│ └── src/
│ ├── main/
│ │ ├── protobuf/
│ │ │ └── org/
│ │ │ └── apache/
│ │ │ └── texera/
│ │ │ └── amber/
│ │ │ └── engine/
│ │ │ ├── architecture/
│ │ │ │ ├── rpc/
│ │ │ │ │ ├── controlcommands.proto
│ │ │ │ │ ├── controllerservice.proto
│ │ │ │ │ ├── controlreturns.proto
│ │ │ │ │ ├── testerservice.proto
│ │ │ │ │ └── workerservice.proto
│ │ │ │ ├── sendsemantics/
│ │ │ │ │ └── partitionings.proto
│ │ │ │ └── worker/
│ │ │ │ └── statistics.proto
│ │ │ └── common/
│ │ │ ├── actormessage.proto
│ │ │ ├── ambermessage.proto
│ │ │ └── executionruntimestate.proto
│ │ ├── python/
│ │ │ ├── core/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── architecture/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── handlers/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── actorcommand/
│ │ │ │ │ │ │ ├── actor_handler_base.py
│ │ │ │ │ │ │ ├── backpressure_handler.py
│ │ │ │ │ │ │ └── credit_update_handler.py
│ │ │ │ │ │ └── control/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── add_input_channel_handler.py
│ │ │ │ │ │ ├── add_partitioning_handler.py
│ │ │ │ │ │ ├── assign_port_handler.py
│ │ │ │ │ │ ├── control_handler_base.py
│ │ │ │ │ │ ├── debug_command_handler.py
│ │ │ │ │ │ ├── end_channel_handler.py
│ │ │ │ │ │ ├── end_worker_handler.py
│ │ │ │ │ │ ├── evaluate_expression_handler.py
│ │ │ │ │ │ ├── initialize_executor_handler.py
│ │ │ │ │ │ ├── no_operation_handler.py
│ │ │ │ │ │ ├── open_executor_handler.py
│ │ │ │ │ │ ├── pause_worker_handler.py
│ │ │ │ │ │ ├── query_statistics_handler.py
│ │ │ │ │ │ ├── replay_current_tuple_handler.py
│ │ │ │ │ │ ├── resume_worker_handler.py
│ │ │ │ │ │ ├── start_channel_handler.py
│ │ │ │ │ │ ├── start_worker_handler.py
│ │ │ │ │ │ └── update_executor_handler.py
│ │ │ │ │ ├── managers/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── console_message_manager.py
│ │ │ │ │ │ ├── context.py
│ │ │ │ │ │ ├── debug_manager.py
│ │ │ │ │ │ ├── embedded_control_message_manager.py
│ │ │ │ │ │ ├── exception_manager.py
│ │ │ │ │ │ ├── executor_manager.py
│ │ │ │ │ │ ├── pause_manager.py
│ │ │ │ │ │ ├── state_manager.py
│ │ │ │ │ │ ├── state_processing_manager.py
│ │ │ │ │ │ ├── statistics_manager.py
│ │ │ │ │ │ └── tuple_processing_manager.py
│ │ │ │ │ ├── packaging/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── input_manager.py
│ │ │ │ │ │ └── output_manager.py
│ │ │ │ │ ├── rpc/
│ │ │ │ │ │ ├── async_rpc_client.py
│ │ │ │ │ │ ├── async_rpc_handler_initializer.py
│ │ │ │ │ │ └── async_rpc_server.py
│ │ │ │ │ └── sendsemantics/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── broad_cast_partitioner.py
│ │ │ │ │ ├── hash_based_shuffle_partitioner.py
│ │ │ │ │ ├── one_to_one_partitioner.py
│ │ │ │ │ ├── partitioner.py
│ │ │ │ │ ├── range_based_shuffle_partitioner.py
│ │ │ │ │ └── round_robin_partitioner.py
│ │ │ │ ├── models/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── batch.py
│ │ │ │ │ ├── internal_marker.py
│ │ │ │ │ ├── internal_queue.py
│ │ │ │ │ ├── operator.py
│ │ │ │ │ ├── payload.py
│ │ │ │ │ ├── schema/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── arrow_schema_utils.py
│ │ │ │ │ │ ├── attribute_type.py
│ │ │ │ │ │ ├── attribute_type_utils.py
│ │ │ │ │ │ ├── field.py
│ │ │ │ │ │ └── schema.py
│ │ │ │ │ ├── single_blocking_io.py
│ │ │ │ │ ├── state.py
│ │ │ │ │ ├── table.py
│ │ │ │ │ ├── tuple.py
│ │ │ │ │ └── type/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── large_binary.py
│ │ │ │ ├── proxy/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── proxy_client.py
│ │ │ │ │ └── proxy_server.py
│ │ │ │ ├── python_worker.py
│ │ │ │ ├── runnables/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── data_processor.py
│ │ │ │ │ ├── heartbeat.py
│ │ │ │ │ ├── main_loop.py
│ │ │ │ │ ├── network_receiver.py
│ │ │ │ │ └── network_sender.py
│ │ │ │ ├── storage/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── document_factory.py
│ │ │ │ │ ├── iceberg/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── iceberg_catalog_instance.py
│ │ │ │ │ │ ├── iceberg_document.py
│ │ │ │ │ │ ├── iceberg_table_writer.py
│ │ │ │ │ │ └── iceberg_utils.py
│ │ │ │ │ ├── model/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── buffered_item_writer.py
│ │ │ │ │ │ ├── readonly_virtual_document.py
│ │ │ │ │ │ └── virtual_document.py
│ │ │ │ │ ├── runnables/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── input_port_materialization_reader_runnable.py
│ │ │ │ │ │ └── port_storage_writer.py
│ │ │ │ │ ├── storage_config.py
│ │ │ │ │ └── vfs_uri_factory.py
│ │ │ │ └── util/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── atomic.py
│ │ │ │ ├── base_protocols.py
│ │ │ │ ├── buffer/
│ │ │ │ │ ├── buffer_base.py
│ │ │ │ │ └── timed_buffer.py
│ │ │ │ ├── console_message/
│ │ │ │ │ ├── replace_print.py
│ │ │ │ │ ├── timed_buffer.py
│ │ │ │ │ └── timestamp.py
│ │ │ │ ├── customized_queue/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── double_blocking_queue.py
│ │ │ │ │ ├── inner.py
│ │ │ │ │ ├── linked_blocking_multi_queue.py
│ │ │ │ │ └── queue_base.py
│ │ │ │ ├── expression_evaluator.py
│ │ │ │ ├── proto/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── runnable.py
│ │ │ │ ├── stoppable/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── stoppable.py
│ │ │ │ │ └── stoppable_queue_blocking_thread.py
│ │ │ │ └── virtual_identity.py
│ │ │ ├── proto/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── org/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── apache/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── texera/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── amber/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── core/
│ │ │ │ │ │ │ └── __init__.py
│ │ │ │ │ │ └── engine/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── architecture/
│ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ ├── rpc/
│ │ │ │ │ │ │ │ └── __init__.py
│ │ │ │ │ │ │ ├── sendsemantics/
│ │ │ │ │ │ │ │ └── __init__.py
│ │ │ │ │ │ │ └── worker/
│ │ │ │ │ │ │ └── __init__.py
│ │ │ │ │ │ └── common/
│ │ │ │ │ │ └── __init__.py
│ │ │ │ │ └── web/
│ │ │ │ │ └── __init__.py
│ │ │ │ └── scalapb/
│ │ │ │ └── __init__.py
│ │ │ ├── pyamber/
│ │ │ │ └── __init__.py
│ │ │ ├── pytexera/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── storage/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── dataset_file_document.py
│ │ │ │ │ ├── large_binary_input_stream.py
│ │ │ │ │ ├── large_binary_manager.py
│ │ │ │ │ └── large_binary_output_stream.py
│ │ │ │ └── udf/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── examples/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── count_batch_operator.py
│ │ │ │ │ ├── echo_operator.py
│ │ │ │ │ ├── echo_table_operator.py
│ │ │ │ │ ├── generator_operator_binary.py
│ │ │ │ │ ├── generator_operator_integer.py
│ │ │ │ │ ├── join_operator.py
│ │ │ │ │ └── rudf/
│ │ │ │ │ ├── r_table_operator.py
│ │ │ │ │ └── r_tuple_operator.py
│ │ │ │ └── udf_operator.py
│ │ │ └── texera_run_python_worker.py
│ │ ├── resources/
│ │ │ ├── cache.ccf
│ │ │ ├── computing-unit-master-config.yml
│ │ │ ├── logback.xml
│ │ │ ├── texera-compiling-service-web-config.yml
│ │ │ └── web-config.yml
│ │ └── scala/
│ │ └── org/
│ │ └── apache/
│ │ └── texera/
│ │ ├── amber/
│ │ │ ├── clustering/
│ │ │ │ ├── ClusterListener.scala
│ │ │ │ └── SingleNodeListener.scala
│ │ │ ├── engine/
│ │ │ │ ├── architecture/
│ │ │ │ │ ├── common/
│ │ │ │ │ │ ├── AmberProcessor.scala
│ │ │ │ │ │ ├── ExecutorDeployment.scala
│ │ │ │ │ │ ├── PekkoActorRefMappingService.scala
│ │ │ │ │ │ ├── PekkoActorService.scala
│ │ │ │ │ │ ├── PekkoMessageTransferService.scala
│ │ │ │ │ │ ├── ProcessingStepCursor.scala
│ │ │ │ │ │ └── WorkflowActor.scala
│ │ │ │ │ ├── controller/
│ │ │ │ │ │ ├── ClientEvent.scala
│ │ │ │ │ │ ├── Controller.scala
│ │ │ │ │ │ ├── ControllerAsyncRPCHandlerInitializer.scala
│ │ │ │ │ │ ├── ControllerProcessor.scala
│ │ │ │ │ │ ├── ControllerTimerService.scala
│ │ │ │ │ │ ├── GlobalReplayManager.scala
│ │ │ │ │ │ ├── Workflow.scala
│ │ │ │ │ │ ├── WorkflowScheduler.scala
│ │ │ │ │ │ ├── execution/
│ │ │ │ │ │ │ ├── ChannelExecution.scala
│ │ │ │ │ │ │ ├── ExecutionUtils.scala
│ │ │ │ │ │ │ ├── LinkExecution.scala
│ │ │ │ │ │ │ ├── OperatorExecution.scala
│ │ │ │ │ │ │ ├── RegionExecution.scala
│ │ │ │ │ │ │ ├── WorkerPortExecution.scala
│ │ │ │ │ │ │ └── WorkflowExecution.scala
│ │ │ │ │ │ └── promisehandlers/
│ │ │ │ │ │ ├── ConsoleMessageHandler.scala
│ │ │ │ │ │ ├── DebugCommandHandler.scala
│ │ │ │ │ │ ├── EmbeddedControlMessageHandler.scala
│ │ │ │ │ │ ├── EvaluatePythonExpressionHandler.scala
│ │ │ │ │ │ ├── JumpToOperatorRegionHandler.scala
│ │ │ │ │ │ ├── LinkWorkersHandler.scala
│ │ │ │ │ │ ├── PauseHandler.scala
│ │ │ │ │ │ ├── PortCompletedHandler.scala
│ │ │ │ │ │ ├── QueryWorkerStatisticsHandler.scala
│ │ │ │ │ │ ├── ReconfigurationHandler.scala
│ │ │ │ │ │ ├── ResumeHandler.scala
│ │ │ │ │ │ ├── RetrieveWorkflowStateHandler.scala
│ │ │ │ │ │ ├── RetryWorkflowHandler.scala
│ │ │ │ │ │ ├── StartWorkflowHandler.scala
│ │ │ │ │ │ ├── TakeGlobalCheckpointHandler.scala
│ │ │ │ │ │ ├── WorkerExecutionCompletedHandler.scala
│ │ │ │ │ │ └── WorkerStateUpdatedHandler.scala
│ │ │ │ │ ├── deploysemantics/
│ │ │ │ │ │ ├── AddressInfo.scala
│ │ │ │ │ │ ├── deploystrategy/
│ │ │ │ │ │ │ ├── DeployStrategy.scala
│ │ │ │ │ │ │ ├── OneOnEach.scala
│ │ │ │ │ │ │ ├── RandomDeployment.scala
│ │ │ │ │ │ │ └── RoundRobinDeployment.scala
│ │ │ │ │ │ └── layer/
│ │ │ │ │ │ └── WorkerExecution.scala
│ │ │ │ │ ├── logreplay/
│ │ │ │ │ │ ├── AsyncReplayLogWriter.scala
│ │ │ │ │ │ ├── EmptyReplayLogger.scala
│ │ │ │ │ │ ├── OrderEnforcer.scala
│ │ │ │ │ │ ├── ReplayLogGenerator.scala
│ │ │ │ │ │ ├── ReplayLogManager.scala
│ │ │ │ │ │ ├── ReplayLogger.scala
│ │ │ │ │ │ ├── ReplayLoggerImpl.scala
│ │ │ │ │ │ └── ReplayOrderEnforcer.scala
│ │ │ │ │ ├── messaginglayer/
│ │ │ │ │ │ ├── AmberFIFOChannel.scala
│ │ │ │ │ │ ├── CongestionControl.scala
│ │ │ │ │ │ ├── DeadLetterMonitorActor.scala
│ │ │ │ │ │ ├── FlowControl.scala
│ │ │ │ │ │ ├── InputGateway.scala
│ │ │ │ │ │ ├── InputManager.scala
│ │ │ │ │ │ ├── NetworkInputGateway.scala
│ │ │ │ │ │ ├── NetworkOutputGateway.scala
│ │ │ │ │ │ ├── OrderingEnforcer.scala
│ │ │ │ │ │ ├── OutputManager.scala
│ │ │ │ │ │ ├── WorkerPort.scala
│ │ │ │ │ │ └── WorkerTimerService.scala
│ │ │ │ │ ├── pythonworker/
│ │ │ │ │ │ ├── PythonProxyClient.scala
│ │ │ │ │ │ ├── PythonProxyServer.scala
│ │ │ │ │ │ ├── PythonWorkflowWorker.scala
│ │ │ │ │ │ └── WorkerBatchInternalQueue.scala
│ │ │ │ │ ├── scheduling/
│ │ │ │ │ │ ├── CostBasedScheduleGenerator.scala
│ │ │ │ │ │ ├── CostEstimator.scala
│ │ │ │ │ │ ├── ExpansionGreedyScheduleGenerator.scala
│ │ │ │ │ │ ├── Region.scala
│ │ │ │ │ │ ├── RegionExecutionCoordinator.scala
│ │ │ │ │ │ ├── RegionPlan.scala
│ │ │ │ │ │ ├── Schedule.scala
│ │ │ │ │ │ ├── ScheduleGenerator.scala
│ │ │ │ │ │ ├── SchedulingUtils.scala
│ │ │ │ │ │ ├── WorkflowExecutionCoordinator.scala
│ │ │ │ │ │ ├── config/
│ │ │ │ │ │ │ ├── ChannelConfig.scala
│ │ │ │ │ │ │ ├── LinkConfig.scala
│ │ │ │ │ │ │ ├── OperatorConfig.scala
│ │ │ │ │ │ │ ├── PortConfig.scala
│ │ │ │ │ │ │ ├── ResourceConfig.scala
│ │ │ │ │ │ │ └── WorkerConfig.scala
│ │ │ │ │ │ └── resourcePolicies/
│ │ │ │ │ │ ├── ExecutionClusterInfo.scala
│ │ │ │ │ │ └── ResourceAllocator.scala
│ │ │ │ │ ├── sendsemantics/
│ │ │ │ │ │ └── partitioners/
│ │ │ │ │ │ ├── BroadcastPartitioner.scala
│ │ │ │ │ │ ├── HashBasedShufflePartitioner.scala
│ │ │ │ │ │ ├── OneToOnePartitioner.scala
│ │ │ │ │ │ ├── Partitioner.scala
│ │ │ │ │ │ ├── RangeBasedShufflePartitioner.scala
│ │ │ │ │ │ └── RoundRobinPartitioner.scala
│ │ │ │ │ └── worker/
│ │ │ │ │ ├── DPThread.scala
│ │ │ │ │ ├── DataProcessor.scala
│ │ │ │ │ ├── DataProcessorRPCHandlerInitializer.scala
│ │ │ │ │ ├── EmbeddedControlMessageManager.scala
│ │ │ │ │ ├── PauseManager.scala
│ │ │ │ │ ├── PauseType.scala
│ │ │ │ │ ├── WorkflowWorker.scala
│ │ │ │ │ ├── managers/
│ │ │ │ │ │ ├── InputPortMaterializationReaderThread.scala
│ │ │ │ │ │ ├── OutputPortResultWriterThread.scala
│ │ │ │ │ │ ├── SerializationManager.scala
│ │ │ │ │ │ └── StatisticsManager.scala
│ │ │ │ │ └── promisehandlers/
│ │ │ │ │ ├── AddInputChannelHandler.scala
│ │ │ │ │ ├── AddPartitioningHandler.scala
│ │ │ │ │ ├── AssignPortHandler.scala
│ │ │ │ │ ├── EndChannelHandler.scala
│ │ │ │ │ ├── EndHandler.scala
│ │ │ │ │ ├── FinalizeCheckpointHandler.scala
│ │ │ │ │ ├── FlushNetworkBufferHandler.scala
│ │ │ │ │ ├── InitializeExecutorHandler.scala
│ │ │ │ │ ├── OpenExecutorHandler.scala
│ │ │ │ │ ├── PauseHandler.scala
│ │ │ │ │ ├── PrepareCheckpointHandler.scala
│ │ │ │ │ ├── QueryStatisticsHandler.scala
│ │ │ │ │ ├── ResumeHandler.scala
│ │ │ │ │ ├── RetrieveStateHandler.scala
│ │ │ │ │ ├── StartChannelHandler.scala
│ │ │ │ │ ├── StartHandler.scala
│ │ │ │ │ └── UpdateExecutorHandler.scala
│ │ │ │ └── common/
│ │ │ │ ├── AmberConfig.scala
│ │ │ │ ├── AmberKryoInitializer.scala
│ │ │ │ ├── AmberLogging.scala
│ │ │ │ ├── AmberRuntime.scala
│ │ │ │ ├── CheckpointState.scala
│ │ │ │ ├── CheckpointSupport.scala
│ │ │ │ ├── ElidableStatement.scala
│ │ │ │ ├── FriesReconfigurationAlgorithm.scala
│ │ │ │ ├── FutureBijection.scala
│ │ │ │ ├── SerializedState.scala
│ │ │ │ ├── Utils.scala
│ │ │ │ ├── ambermessage/
│ │ │ │ │ ├── DataPayload.scala
│ │ │ │ │ ├── DirectControlMessagePayload.scala
│ │ │ │ │ ├── RecoveryPayload.scala
│ │ │ │ │ ├── WorkflowFIFOMessagePayload.scala
│ │ │ │ │ └── WorkflowMessage.scala
│ │ │ │ ├── client/
│ │ │ │ │ ├── AmberClient.scala
│ │ │ │ │ └── ClientActor.scala
│ │ │ │ ├── rpc/
│ │ │ │ │ ├── AsyncRPCClient.scala
│ │ │ │ │ ├── AsyncRPCHandlerInitializer.scala
│ │ │ │ │ └── AsyncRPCServer.scala
│ │ │ │ ├── statetransition/
│ │ │ │ │ ├── StateManager.scala
│ │ │ │ │ └── WorkerStateManager.scala
│ │ │ │ ├── storage/
│ │ │ │ │ ├── EmptyRecordStorage.scala
│ │ │ │ │ ├── HDFSRecordStorage.scala
│ │ │ │ │ ├── SequentialRecordStorage.scala
│ │ │ │ │ └── VFSRecordStorage.scala
│ │ │ │ └── virtualidentity/
│ │ │ │ └── util.scala
│ │ │ └── error/
│ │ │ └── ErrorUtils.scala
│ │ ├── web/
│ │ │ ├── ComputingUnitMaster.scala
│ │ │ ├── ComputingUnitWorker.scala
│ │ │ ├── ServletAwareConfigurator.scala
│ │ │ ├── SessionState.scala
│ │ │ ├── SubscriptionManager.scala
│ │ │ ├── TexeraWebApplication.scala
│ │ │ ├── TexeraWebConfiguration.java
│ │ │ ├── WebsocketInput.scala
│ │ │ ├── WorkflowLifecycleManager.scala
│ │ │ ├── auth/
│ │ │ │ ├── GuestAuthFilter.scala
│ │ │ │ ├── JwtAuth.scala
│ │ │ │ ├── UserAuthenticator.scala
│ │ │ │ └── UserRoleAuthorizer.scala
│ │ │ ├── model/
│ │ │ │ ├── collab/
│ │ │ │ │ ├── event/
│ │ │ │ │ │ ├── CollabWebSocketEvent.scala
│ │ │ │ │ │ ├── CommandEvent.scala
│ │ │ │ │ │ ├── LockGrantedEvent.scala
│ │ │ │ │ │ ├── LockRejectedEvent.scala
│ │ │ │ │ │ ├── ReleaseLockEvent.scala
│ │ │ │ │ │ ├── RestoreVersionEvent.scala
│ │ │ │ │ │ └── WorkflowAccessEvent.scala
│ │ │ │ │ ├── request/
│ │ │ │ │ │ ├── AcquireLockRequest.scala
│ │ │ │ │ │ ├── CollabWebSocketRequest.scala
│ │ │ │ │ │ ├── CommandRequest.scala
│ │ │ │ │ │ ├── HeartBeatRequest.scala
│ │ │ │ │ │ ├── RestoreVersionRequest.scala
│ │ │ │ │ │ ├── TryLockRequest.scala
│ │ │ │ │ │ └── WIdRequest.scala
│ │ │ │ │ └── response/
│ │ │ │ │ └── HeartBeatResponse.scala
│ │ │ │ ├── common/
│ │ │ │ │ └── AccessEntry.scala
│ │ │ │ ├── http/
│ │ │ │ │ ├── request/
│ │ │ │ │ │ ├── auth/
│ │ │ │ │ │ │ ├── UserLoginRequest.scala
│ │ │ │ │ │ │ └── UserRegistrationRequest.scala
│ │ │ │ │ │ └── result/
│ │ │ │ │ │ └── ResultExportRequest.scala
│ │ │ │ │ └── response/
│ │ │ │ │ ├── SchemaPropagationResponse.scala
│ │ │ │ │ ├── TokenIssueResponse.scala
│ │ │ │ │ └── result/
│ │ │ │ │ └── ResultExportResponse.scala
│ │ │ │ └── websocket/
│ │ │ │ ├── event/
│ │ │ │ │ ├── CacheStatusUpdateEvent.scala
│ │ │ │ │ ├── ExecutionDurationUpdateEvent.scala
│ │ │ │ │ ├── ExecutionStatusEnum.scala
│ │ │ │ │ ├── OperatorStatisticsUpdateEvent.scala
│ │ │ │ │ ├── PaginatedResultEvent.scala
│ │ │ │ │ ├── RegionStateEvent.scala
│ │ │ │ │ ├── TexeraWebSocketEvent.scala
│ │ │ │ │ ├── WebResultUpdateEvent.scala
│ │ │ │ │ ├── WorkerAssignmentUpdateEvent.scala
│ │ │ │ │ ├── WorkflowAvailableResultEvent.scala
│ │ │ │ │ ├── WorkflowErrorEvent.scala
│ │ │ │ │ ├── WorkflowStateEvent.scala
│ │ │ │ │ └── python/
│ │ │ │ │ └── ConsoleUpdateEvent.scala
│ │ │ │ ├── request/
│ │ │ │ │ ├── EditingTimeCompilationRequest.scala
│ │ │ │ │ ├── HeartBeatRequest.scala
│ │ │ │ │ ├── ModifyLogicRequest.scala
│ │ │ │ │ ├── ResultPaginationRequest.scala
│ │ │ │ │ ├── RetryRequest.scala
│ │ │ │ │ ├── SkipTupleRequest.scala
│ │ │ │ │ ├── TexeraWebSocketRequest.scala
│ │ │ │ │ ├── WorkflowCheckpointRequest.scala
│ │ │ │ │ ├── WorkflowExecuteRequest.scala
│ │ │ │ │ ├── WorkflowKillRequest.scala
│ │ │ │ │ ├── WorkflowPauseRequest.scala
│ │ │ │ │ ├── WorkflowResumeRequest.scala
│ │ │ │ │ └── python/
│ │ │ │ │ ├── DebugCommandRequest.scala
│ │ │ │ │ └── PythonExpressionEvaluateRequest.scala
│ │ │ │ └── response/
│ │ │ │ ├── ClusterStatusUpdateEvent.scala
│ │ │ │ ├── HeartBeatResponse.scala
│ │ │ │ ├── ModifyLogicResponse.scala
│ │ │ │ ├── RegionUpdateEvent.scala
│ │ │ │ └── python/
│ │ │ │ └── PythonExpressionEvaluateResponse.scala
│ │ │ ├── resource/
│ │ │ │ ├── CollaborationResource.scala
│ │ │ │ ├── EmailTemplate.scala
│ │ │ │ ├── GmailResource.scala
│ │ │ │ ├── HealthCheckResource.scala
│ │ │ │ ├── MockKillWorkerResource.scala
│ │ │ │ ├── SuccessExecutionResult.scala
│ │ │ │ ├── SyncExecutionResource.scala
│ │ │ │ ├── SystemMetadataResource.scala
│ │ │ │ ├── UserConfigResource.scala
│ │ │ │ ├── WebsocketPayloadSizeTuner.scala
│ │ │ │ ├── WorkflowWebsocketResource.scala
│ │ │ │ ├── aiassistant/
│ │ │ │ │ ├── AiAssistantManager.scala
│ │ │ │ │ ├── AiAssistantResource.scala
│ │ │ │ │ ├── test_type_annotation_visitor.py
│ │ │ │ │ └── type_annotation_visitor.py
│ │ │ │ ├── auth/
│ │ │ │ │ ├── AuthResource.scala
│ │ │ │ │ └── GoogleAuthResource.scala
│ │ │ │ ├── dashboard/
│ │ │ │ │ ├── DashboardResource.scala
│ │ │ │ │ ├── DatasetSearchQueryBuilder.scala
│ │ │ │ │ ├── FulltextSearchQueryUtils.scala
│ │ │ │ │ ├── ProjectSearchQueryBuilder.scala
│ │ │ │ │ ├── SearchQueryBuilder.scala
│ │ │ │ │ ├── UnifiedResourceSchema.scala
│ │ │ │ │ ├── WorkflowSearchQueryBuilder.scala
│ │ │ │ │ ├── admin/
│ │ │ │ │ │ ├── execution/
│ │ │ │ │ │ │ └── AdminExecutionResource.scala
│ │ │ │ │ │ ├── settings/
│ │ │ │ │ │ │ └── AdminSettingsResource.scala
│ │ │ │ │ │ └── user/
│ │ │ │ │ │ └── AdminUserResource.scala
│ │ │ │ │ ├── hub/
│ │ │ │ │ │ ├── ActionType.scala
│ │ │ │ │ │ ├── EntityTables.scala
│ │ │ │ │ │ ├── EntityType.scala
│ │ │ │ │ │ └── HubResource.scala
│ │ │ │ │ └── user/
│ │ │ │ │ ├── UserResource.scala
│ │ │ │ │ ├── dataset/
│ │ │ │ │ │ ├── DatasetResource.scala
│ │ │ │ │ │ └── utils/
│ │ │ │ │ │ └── DatasetStatisticsUtils.scala
│ │ │ │ │ ├── project/
│ │ │ │ │ │ ├── ProjectAccessResource.scala
│ │ │ │ │ │ ├── ProjectResource.scala
│ │ │ │ │ │ └── PublicProjectResource.scala
│ │ │ │ │ ├── quota/
│ │ │ │ │ │ └── UserQuotaResource.scala
│ │ │ │ │ └── workflow/
│ │ │ │ │ ├── WorkflowAccessResource.scala
│ │ │ │ │ ├── WorkflowExecutionsResource.scala
│ │ │ │ │ ├── WorkflowResource.scala
│ │ │ │ │ └── WorkflowVersionResource.scala
│ │ │ │ └── pythonvirtualenvironment/
│ │ │ │ ├── PveManager.scala
│ │ │ │ ├── PveResource.scala
│ │ │ │ └── PveWebsocketResource.scala
│ │ │ ├── service/
│ │ │ │ ├── EmailNotificationService.scala
│ │ │ │ ├── ExecutionConsoleService.scala
│ │ │ │ ├── ExecutionReconfigurationService.scala
│ │ │ │ ├── ExecutionResultService.scala
│ │ │ │ ├── ExecutionRuntimeService.scala
│ │ │ │ ├── ExecutionStatsService.scala
│ │ │ │ ├── ExecutionsMetadataPersistService.scala
│ │ │ │ ├── ResultExportService.scala
│ │ │ │ ├── WorkflowEmailNotifier.scala
│ │ │ │ ├── WorkflowExecutionService.scala
│ │ │ │ └── WorkflowService.scala
│ │ │ └── storage/
│ │ │ ├── ExecutionReconfigurationStore.scala
│ │ │ ├── ExecutionStateStore.scala
│ │ │ ├── StateStore.scala
│ │ │ └── WorkflowStateStore.scala
│ │ └── workflow/
│ │ ├── LogicalLink.scala
│ │ ├── LogicalPlan.scala
│ │ └── WorkflowCompiler.scala
│ └── test/
│ ├── integration/
│ │ └── org/
│ │ └── apache/
│ │ └── texera/
│ │ └── amber/
│ │ ├── engine/
│ │ │ └── e2e/
│ │ │ └── ReconfigurationIntegrationSpec.scala
│ │ ├── storage/
│ │ │ └── iceberg/
│ │ │ └── IcebergRestCatalogIntegrationSpec.scala
│ │ └── tags/
│ │ └── IntegrationTest.java
│ ├── java/
│ │ └── org/
│ │ └── apache/
│ │ └── texera/
│ │ └── web/
│ │ └── resource/
│ │ └── dashboard/
│ │ └── user/
│ │ └── dataset/
│ │ └── GitVersionControlLocalFileStorageSpec.java
│ ├── python/
│ │ ├── core/
│ │ │ ├── architecture/
│ │ │ │ ├── handlers/
│ │ │ │ │ └── control/
│ │ │ │ │ ├── test_debug_command_handler.py
│ │ │ │ │ ├── test_evaluate_expression_handler.py
│ │ │ │ │ ├── test_replay_current_tuple_handler.py
│ │ │ │ │ └── test_update_executor_handler.py
│ │ │ │ ├── managers/
│ │ │ │ │ ├── test_console_message_manager.py
│ │ │ │ │ ├── test_debug_manager.py
│ │ │ │ │ ├── test_embedded_control_message_manager.py
│ │ │ │ │ ├── test_exception_manager.py
│ │ │ │ │ ├── test_executor_manager.py
│ │ │ │ │ ├── test_pause_manager.py
│ │ │ │ │ ├── test_state_manager.py
│ │ │ │ │ ├── test_state_processing_manager.py
│ │ │ │ │ ├── test_statistics_manager.py
│ │ │ │ │ └── test_tuple_processing_manager.py
│ │ │ │ ├── rpc/
│ │ │ │ │ └── test_async_rpc_client.py
│ │ │ │ └── sendsemantics/
│ │ │ │ └── test_partitioners.py
│ │ │ ├── models/
│ │ │ │ ├── schema/
│ │ │ │ │ └── test_schema.py
│ │ │ │ ├── test_operator.py
│ │ │ │ ├── test_state.py
│ │ │ │ ├── test_table.py
│ │ │ │ ├── test_tuple.py
│ │ │ │ └── type/
│ │ │ │ └── test_large_binary.py
│ │ │ ├── proxy/
│ │ │ │ ├── test_proxy_client.py
│ │ │ │ └── test_proxy_server.py
│ │ │ ├── runnables/
│ │ │ │ ├── test_console_message.py
│ │ │ │ ├── test_data_processor.py
│ │ │ │ ├── test_heartbeat.py
│ │ │ │ ├── test_main_loop.py
│ │ │ │ ├── test_network_receiver.py
│ │ │ │ └── test_network_sender.py
│ │ │ ├── storage/
│ │ │ │ └── iceberg/
│ │ │ │ ├── test_iceberg_document.py
│ │ │ │ ├── test_iceberg_rest_catalog_integration.py
│ │ │ │ ├── test_iceberg_utils_catalog.py
│ │ │ │ └── test_iceberg_utils_large_binary.py
│ │ │ ├── test_python_worker.py
│ │ │ └── util/
│ │ │ ├── console_message/
│ │ │ │ └── test_replace_print.py
│ │ │ ├── customized_queue/
│ │ │ │ ├── test_inner.py
│ │ │ │ └── test_linked_blocking_multi_queue.py
│ │ │ ├── test_atomic.py
│ │ │ ├── test_expression_evaluator.py
│ │ │ └── test_virtual_identity.py
│ │ └── pytexera/
│ │ ├── storage/
│ │ │ ├── test_dataset_file_document.py
│ │ │ ├── test_large_binary_input_stream.py
│ │ │ ├── test_large_binary_manager.py
│ │ │ └── test_large_binary_output_stream.py
│ │ └── udf/
│ │ └── examples/
│ │ ├── test_count_batch_operator.py
│ │ ├── test_echo_operator.py
│ │ ├── test_echo_table_operator.py
│ │ ├── test_generator_operator_binary.py
│ │ └── test_generator_operator_integer.py
│ └── scala/
│ └── org/
│ └── apache/
│ └── texera/
│ ├── amber/
│ │ ├── engine/
│ │ │ ├── architecture/
│ │ │ │ ├── common/
│ │ │ │ │ └── ProcessingStepCursorSpec.scala
│ │ │ │ ├── control/
│ │ │ │ │ ├── TrivialControlSpec.scala
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── ChainHandler.scala
│ │ │ │ │ ├── CollectHandler.scala
│ │ │ │ │ ├── ErrorHandler.scala
│ │ │ │ │ ├── MultiCallHandler.scala
│ │ │ │ │ ├── NestedHandler.scala
│ │ │ │ │ ├── PingPongHandler.scala
│ │ │ │ │ ├── RecursionHandler.scala
│ │ │ │ │ ├── TesterAsyncRPCHandlerInitializer.scala
│ │ │ │ │ └── TrivialControlTester.scala
│ │ │ │ ├── controller/
│ │ │ │ │ ├── ControllerSpec.scala
│ │ │ │ │ ├── GlobalReplayManagerSpec.scala
│ │ │ │ │ ├── WorkflowSchedulerSpec.scala
│ │ │ │ │ └── execution/
│ │ │ │ │ ├── ExecutionUtilsSpec.scala
│ │ │ │ │ ├── LinkExecutionSpec.scala
│ │ │ │ │ ├── WorkerPortExecutionSpec.scala
│ │ │ │ │ └── WorkflowExecutionSpec.scala
│ │ │ │ ├── deploysemantics/
│ │ │ │ │ ├── AddressInfoSpec.scala
│ │ │ │ │ ├── deploystrategy/
│ │ │ │ │ │ └── DeployStrategiesSpec.scala
│ │ │ │ │ └── layer/
│ │ │ │ │ └── WorkerExecutionSpec.scala
│ │ │ │ ├── logreplay/
│ │ │ │ │ ├── EmptyReplayLogManagerImplSpec.scala
│ │ │ │ │ └── LogreplayPrimitivesSpec.scala
│ │ │ │ ├── messaginglayer/
│ │ │ │ │ ├── AmberFIFOChannelSpec.scala
│ │ │ │ │ ├── CongestionControlSpec.scala
│ │ │ │ │ ├── FlowControlSpec.scala
│ │ │ │ │ ├── NetworkInputGatewaySpec.scala
│ │ │ │ │ ├── OrderingEnforcerSpec.scala
│ │ │ │ │ ├── OutputManagerSpec.scala
│ │ │ │ │ ├── RangeBasedShuffleSpec.scala
│ │ │ │ │ └── WorkerPortSpec.scala
│ │ │ │ ├── pythonworker/
│ │ │ │ │ └── PythonWorkflowWorkerSpec.scala
│ │ │ │ ├── scheduling/
│ │ │ │ │ ├── CostBasedScheduleGeneratorSpec.scala
│ │ │ │ │ ├── DefaultCostEstimatorSpec.scala
│ │ │ │ │ ├── ExpansionGreedyScheduleGeneratorSpec.scala
│ │ │ │ │ ├── RegionCoordinatorTestSupport.scala
│ │ │ │ │ ├── RegionExecutionCoordinatorSpec.scala
│ │ │ │ │ ├── RegionPlanSpec.scala
│ │ │ │ │ ├── RegionSpec.scala
│ │ │ │ │ ├── ScheduleSpec.scala
│ │ │ │ │ ├── SchedulingUtilsSpec.scala
│ │ │ │ │ ├── WorkflowExecutionCoordinatorSpec.scala
│ │ │ │ │ ├── config/
│ │ │ │ │ │ ├── ChannelConfigSpec.scala
│ │ │ │ │ │ ├── LinkConfigSpec.scala
│ │ │ │ │ │ └── SchedulingConfigsSpec.scala
│ │ │ │ │ └── resourcePolicies/
│ │ │ │ │ └── ResourcePoliciesSpec.scala
│ │ │ │ ├── sendsemantics/
│ │ │ │ │ └── partitioners/
│ │ │ │ │ ├── NetworkOutputBufferSpec.scala
│ │ │ │ │ └── PartitionersSpec.scala
│ │ │ │ └── worker/
│ │ │ │ ├── DPThreadSpec.scala
│ │ │ │ ├── DataProcessorSpec.scala
│ │ │ │ ├── PauseTypeSpec.scala
│ │ │ │ ├── WorkerSpec.scala
│ │ │ │ ├── managers/
│ │ │ │ │ ├── OutputPortResultWriterThreadSpec.scala
│ │ │ │ │ └── WorkerManagersSpec.scala
│ │ │ │ └── promisehandlers/
│ │ │ │ └── EndHandlerSpec.scala
│ │ │ ├── common/
│ │ │ │ ├── CheckpointSubsystemSpec.scala
│ │ │ │ ├── UtilsSpec.scala
│ │ │ │ ├── ambermessage/
│ │ │ │ │ ├── AmberMessageEnvelopesSpec.scala
│ │ │ │ │ └── DataPayloadSpec.scala
│ │ │ │ └── statetransition/
│ │ │ │ ├── StateManagerSpec.scala
│ │ │ │ └── WorkerStateManagerSpec.scala
│ │ │ ├── e2e/
│ │ │ │ ├── BatchSizePropagationSpec.scala
│ │ │ │ ├── DataProcessingSpec.scala
│ │ │ │ ├── PauseSpec.scala
│ │ │ │ ├── ReconfigurationSpec.scala
│ │ │ │ └── TestUtils.scala
│ │ │ └── faulttolerance/
│ │ │ ├── CheckpointSpec.scala
│ │ │ ├── LoggingSpec.scala
│ │ │ └── ReplaySpec.scala
│ │ └── error/
│ │ └── ErrorUtilsSpec.scala
│ ├── web/
│ │ ├── auth/
│ │ │ └── UserAuthenticatorSpec.scala
│ │ ├── resource/
│ │ │ ├── dashboard/
│ │ │ │ ├── file/
│ │ │ │ │ └── WorkflowResourceSpec.scala
│ │ │ │ └── user/
│ │ │ │ └── workflow/
│ │ │ │ ├── WorkflowAccessResourceSpec.scala
│ │ │ │ ├── WorkflowExecutionsResourceSpec.scala
│ │ │ │ └── WorkflowVersionResourceSpec.scala
│ │ │ └── pythonvirtualenvironment/
│ │ │ └── PveResourceSpec.scala
│ │ └── service/
│ │ ├── ExecutionConsoleServiceSpec.scala
│ │ ├── ExecutionReconfigurationServiceSpec.scala
│ │ └── ExecutionResultServiceSpec.scala
│ └── workflow/
│ ├── WorkflowCompilerSpec.scala
│ └── common/
│ └── storage/
│ └── ReadonlyLocalFileDocumentSpec.scala
├── bin/
│ ├── .htaccess
│ ├── README.md
│ ├── access-control-service.dockerfile
│ ├── add-computing-unit-worker.sh
│ ├── agent-service.dockerfile
│ ├── bootstrap-lakekeeper.sh
│ ├── build-images.sh
│ ├── build-services.sh
│ ├── build.sh
│ ├── computing-unit-managing-service.sh
│ ├── computing-unit-master.dockerfile
│ ├── computing-unit-worker.dockerfile
│ ├── config-service.dockerfile
│ ├── config-service.sh
│ ├── config.php
│ ├── cron-restart-crashed-worker.sh
│ ├── deploy-daemon.sh
│ ├── deploy-docker.sh
│ ├── file-service.dockerfile
│ ├── file-service.sh
│ ├── fix-format.sh
│ ├── forum/
│ │ ├── flarum.sql
│ │ ├── macos-install.sh
│ │ ├── start-flarum.sh
│ │ └── ubuntu-install.sh
│ ├── frontend-dev.sh
│ ├── frontend-proto-gen.sh
│ ├── frontend.sh
│ ├── install-nltk.sh
│ ├── k8s/
│ │ ├── Chart.yaml
│ │ ├── README.md
│ │ ├── templates/
│ │ │ ├── access-control-service-deployment.yaml
│ │ │ ├── access-control-service-service.yaml
│ │ │ ├── config-service-deployment.yaml
│ │ │ ├── config-service-service.yaml
│ │ │ ├── example-data-loader-job.yaml
│ │ │ ├── external-names.yaml
│ │ │ ├── file-service-deployment.yaml
│ │ │ ├── file-service-service.yaml
│ │ │ ├── gateway-backend.yaml
│ │ │ ├── gateway-routes.yaml
│ │ │ ├── gateway-security-policy.yaml
│ │ │ ├── gateway.yaml
│ │ │ ├── lakefs-secret.yaml
│ │ │ ├── lakefs-setup-job.yaml
│ │ │ ├── minio-persistence.yaml
│ │ │ ├── postgresql-init-script-config.yaml
│ │ │ ├── postgresql-persistence.yaml
│ │ │ ├── pylsp.yaml
│ │ │ ├── shared-editing-server.yaml
│ │ │ ├── webserver-deployment.yaml
│ │ │ ├── webserver-service.yaml
│ │ │ ├── workflow-compiling-service-deployment.yaml
│ │ │ ├── workflow-compiling-service-service.yaml
│ │ │ ├── workflow-computing-unit-manager-deployment.yaml
│ │ │ ├── workflow-computing-unit-manager-service-account.yaml
│ │ │ ├── workflow-computing-unit-manager-service.yaml
│ │ │ ├── workflow-computing-unit-master-prepull-daemonset.yaml
│ │ │ ├── workflow-computing-unit-resource-quota.yaml
│ │ │ ├── workflow-computing-units-namespace.yaml
│ │ │ └── workflow-computing-units-service.yaml
│ │ ├── values-development.yaml
│ │ └── values.yaml
│ ├── licensing/
│ │ ├── audit_jar_licenses.py
│ │ ├── check_binary_deps.py
│ │ ├── concat_license_binary.py
│ │ └── test_check_binary_deps.py
│ ├── litellm-config.yaml
│ ├── merge-image-tags.sh
│ ├── pylsp/
│ │ ├── Dockerfile
│ │ ├── python-language-server.yaml
│ │ └── run_pylsp.sh
│ ├── python-language-service.sh
│ ├── python-proto-gen.sh
│ ├── server.sh
│ ├── shared-editing-server.sh
│ ├── single-node/
│ │ ├── DISCLAIMER
│ │ ├── LICENSE
│ │ ├── NOTICE
│ │ ├── README.md
│ │ ├── docker-compose.yml
│ │ ├── examples/
│ │ │ ├── datasets/
│ │ │ │ ├── iris-species/
│ │ │ │ │ ├── Iris.csv
│ │ │ │ │ └── description.txt
│ │ │ │ └── popular-movies-of-imdb/
│ │ │ │ ├── TMDb_updated.csv
│ │ │ │ └── description.txt
│ │ │ ├── load-examples.sh
│ │ │ └── workflows/
│ │ │ ├── [Example] Data Exploration on Movies Dataset.json
│ │ │ └── [Example] Machine Learning on Iris Dataset.json
│ │ ├── litellm-config.yaml
│ │ └── nginx.conf
│ ├── terminate-daemon.sh
│ ├── texera-web-application.dockerfile
│ ├── utils/
│ │ ├── resolve-texera-home.sh
│ │ └── texera-logging.sh
│ ├── workflow-compiling-service.dockerfile
│ ├── workflow-compiling-service.sh
│ ├── workflow-computing-unit-managing-service.dockerfile
│ ├── workflow-computing-unit.sh
│ └── y-websocket-server/
│ ├── Dockerfile
│ └── package.json
├── build.sbt
├── codecov.yml
├── common/
│ ├── auth/
│ │ ├── build.sbt
│ │ └── src/
│ │ ├── main/
│ │ │ └── scala/
│ │ │ └── org/
│ │ │ └── apache/
│ │ │ └── texera/
│ │ │ └── auth/
│ │ │ ├── JwtAuth.scala
│ │ │ ├── JwtAuthFilter.scala
│ │ │ ├── JwtParser.scala
│ │ │ ├── RequestLoggingFilter.scala
│ │ │ ├── SessionUser.scala
│ │ │ ├── UserActivityTracker.scala
│ │ │ └── util/
│ │ │ ├── ComputingUnitAccess.scala
│ │ │ └── HeaderField.scala
│ │ └── test/
│ │ └── scala/
│ │ └── org/
│ │ └── apache/
│ │ └── texera/
│ │ └── auth/
│ │ ├── JwtParserSpec.scala
│ │ └── UserActivityTrackerSpec.scala
│ ├── config/
│ │ ├── build.sbt
│ │ └── src/
│ │ └── main/
│ │ ├── resources/
│ │ │ ├── application.conf
│ │ │ ├── auth.conf
│ │ │ ├── cluster.conf
│ │ │ ├── computing-unit.conf
│ │ │ ├── default.conf
│ │ │ ├── gui.conf
│ │ │ ├── kubernetes.conf
│ │ │ ├── llm.conf
│ │ │ ├── storage.conf
│ │ │ ├── udf.conf
│ │ │ └── user-system.conf
│ │ └── scala/
│ │ └── org/
│ │ └── apache/
│ │ └── texera/
│ │ ├── amber/
│ │ │ ├── config/
│ │ │ │ ├── ApplicationConfig.scala
│ │ │ │ ├── EnvironmentalVariable.scala
│ │ │ │ ├── PekkoConfig.scala
│ │ │ │ ├── PythonUtils.scala
│ │ │ │ ├── StorageConfig.scala
│ │ │ │ └── UdfConfig.scala
│ │ │ └── util/
│ │ │ └── ConfigParserUtil.scala
│ │ └── config/
│ │ ├── AuthConfig.scala
│ │ ├── ComputingUnitConfig.scala
│ │ ├── DefaultsConfig.scala
│ │ ├── GuiConfig.scala
│ │ ├── KubernetesConfig.scala
│ │ ├── LLMConfig.scala
│ │ └── UserSystemConfig.scala
│ ├── dao/
│ │ ├── .gitignore
│ │ ├── build.sbt
│ │ └── src/
│ │ ├── main/
│ │ │ ├── resources/
│ │ │ │ └── jooq-conf.xml
│ │ │ └── scala/
│ │ │ └── org/
│ │ │ └── apache/
│ │ │ └── texera/
│ │ │ └── dao/
│ │ │ ├── SiteSettings.scala
│ │ │ └── SqlServer.scala
│ │ └── test/
│ │ └── scala/
│ │ └── org/
│ │ └── apache/
│ │ └── texera/
│ │ └── dao/
│ │ ├── MockTexeraDB.scala
│ │ └── SiteSettingsSpec.scala
│ ├── pybuilder/
│ │ ├── build.sbt
│ │ └── src/
│ │ ├── main/
│ │ │ └── scala/
│ │ │ └── org/
│ │ │ └── apache/
│ │ │ └── texera/
│ │ │ └── amber/
│ │ │ └── pybuilder/
│ │ │ ├── BoundaryValidator.scala
│ │ │ ├── EncodableInspector.scala
│ │ │ ├── EncodableStringAnnotation.java
│ │ │ ├── PythonLexerUtils.scala
│ │ │ └── PythonTemplateBuilder.scala
│ │ └── test/
│ │ └── scala/
│ │ └── org/
│ │ └── apache/
│ │ └── texera/
│ │ └── amber/
│ │ └── pybuilder/
│ │ ├── PythonLexerUtilsSpec.scala
│ │ ├── PythonTemplateBuilderApiSpec.scala
│ │ └── PythonTemplateBuilderSpec.scala
│ ├── workflow-core/
│ │ ├── build.sbt
│ │ └── src/
│ │ ├── main/
│ │ │ ├── protobuf/
│ │ │ │ ├── org/
│ │ │ │ │ └── apache/
│ │ │ │ │ └── texera/
│ │ │ │ │ └── amber/
│ │ │ │ │ └── core/
│ │ │ │ │ ├── executor.proto
│ │ │ │ │ ├── virtualidentity.proto
│ │ │ │ │ ├── workflow.proto
│ │ │ │ │ └── workflowruntimestate.proto
│ │ │ │ └── scalapb/
│ │ │ │ └── scalapb.proto
│ │ │ └── scala/
│ │ │ └── org/
│ │ │ └── apache/
│ │ │ └── texera/
│ │ │ ├── amber/
│ │ │ │ ├── core/
│ │ │ │ │ ├── WorkflowRuntimeException.scala
│ │ │ │ │ ├── executor/
│ │ │ │ │ │ ├── ExecFactory.scala
│ │ │ │ │ │ ├── JavaRuntimeCompilation.scala
│ │ │ │ │ │ ├── OperatorExecutor.scala
│ │ │ │ │ │ └── SourceOperatorExecutor.scala
│ │ │ │ │ ├── state/
│ │ │ │ │ │ └── State.scala
│ │ │ │ │ ├── storage/
│ │ │ │ │ │ ├── DocumentFactory.scala
│ │ │ │ │ │ ├── FileResolver.scala
│ │ │ │ │ │ ├── IcebergCatalogInstance.scala
│ │ │ │ │ │ ├── VFSURIFactory.scala
│ │ │ │ │ │ ├── model/
│ │ │ │ │ │ │ ├── BufferedItemWriter.scala
│ │ │ │ │ │ │ ├── DatasetFileDocument.scala
│ │ │ │ │ │ │ ├── OnDataset.scala
│ │ │ │ │ │ │ ├── ReadonlyLocalFileDocument.scala
│ │ │ │ │ │ │ ├── ReadonlyVirtualDocument.scala
│ │ │ │ │ │ │ ├── VirtualCollection.scala
│ │ │ │ │ │ │ └── VirtualDocument.scala
│ │ │ │ │ │ ├── result/
│ │ │ │ │ │ │ ├── ResultSchema.scala
│ │ │ │ │ │ │ ├── WorkflowResultStore.scala
│ │ │ │ │ │ │ └── iceberg/
│ │ │ │ │ │ │ ├── IcebergDocument.scala
│ │ │ │ │ │ │ ├── IcebergTableWriter.scala
│ │ │ │ │ │ │ └── OnIceberg.scala
│ │ │ │ │ │ └── util/
│ │ │ │ │ │ ├── LakeFSStorageClient.scala
│ │ │ │ │ │ ├── StorageUtil.scala
│ │ │ │ │ │ └── dataset/
│ │ │ │ │ │ ├── GitVersionControlLocalFileStorage.java
│ │ │ │ │ │ ├── JGitVersionControl.java
│ │ │ │ │ │ └── PhysicalFileNode.java
│ │ │ │ │ ├── tuple/
│ │ │ │ │ │ ├── Attribute.java
│ │ │ │ │ │ ├── AttributeType.java
│ │ │ │ │ │ ├── AttributeTypeUtils.scala
│ │ │ │ │ │ ├── LargeBinary.java
│ │ │ │ │ │ ├── Schema.scala
│ │ │ │ │ │ ├── Tuple.scala
│ │ │ │ │ │ ├── TupleLike.scala
│ │ │ │ │ │ └── TupleUtils.scala
│ │ │ │ │ └── workflow/
│ │ │ │ │ ├── ExecutionMode.java
│ │ │ │ │ ├── LocationPreference.scala
│ │ │ │ │ ├── PartitionInfo.scala
│ │ │ │ │ ├── PhysicalOp.scala
│ │ │ │ │ ├── PhysicalPlan.scala
│ │ │ │ │ ├── WorkflowContext.scala
│ │ │ │ │ └── WorkflowSettings.scala
│ │ │ │ └── util/
│ │ │ │ ├── ArrowUtils.scala
│ │ │ │ ├── IcebergUtil.scala
│ │ │ │ ├── JSONUtils.scala
│ │ │ │ ├── VirtualIdentityUtils.scala
│ │ │ │ └── serde/
│ │ │ │ ├── GlobalPortIdentitySerde.scala
│ │ │ │ ├── PortIdentityKeyDeserializer.scala
│ │ │ │ └── PortIdentityKeySerializer.scala
│ │ │ └── service/
│ │ │ └── util/
│ │ │ ├── LargeBinaryInputStream.scala
│ │ │ ├── LargeBinaryManager.scala
│ │ │ ├── LargeBinaryOutputStream.scala
│ │ │ └── S3StorageClient.scala
│ │ └── test/
│ │ ├── resources/
│ │ │ ├── country_sales_small.csv
│ │ │ └── datasets/
│ │ │ └── 1/
│ │ │ ├── directory/
│ │ │ │ └── a.csv
│ │ │ └── random_data.csv
│ │ └── scala/
│ │ └── org/
│ │ └── apache/
│ │ └── texera/
│ │ ├── amber/
│ │ │ ├── core/
│ │ │ │ ├── WorkflowRuntimeExceptionSpec.scala
│ │ │ │ ├── executor/
│ │ │ │ │ └── CoreExecutorReflectionSpec.scala
│ │ │ │ ├── state/
│ │ │ │ │ └── StateSpec.scala
│ │ │ │ ├── storage/
│ │ │ │ │ ├── VFSURIFactorySpec.scala
│ │ │ │ │ ├── model/
│ │ │ │ │ │ └── VirtualDocumentSpec.scala
│ │ │ │ │ └── util/
│ │ │ │ │ └── StorageUtilSpec.scala
│ │ │ │ ├── tuple/
│ │ │ │ │ ├── AttributeTypeUtilsSpec.scala
│ │ │ │ │ ├── InternalMarkerSpec.scala
│ │ │ │ │ ├── SchemaSpec.scala
│ │ │ │ │ ├── TupleSpec.scala
│ │ │ │ │ └── TupleUtilsSpec.scala
│ │ │ │ └── workflow/
│ │ │ │ ├── PartitionInfoSpec.scala
│ │ │ │ ├── WorkflowContextSpec.scala
│ │ │ │ └── WorkflowCoreTypesSpec.scala
│ │ │ ├── storage/
│ │ │ │ ├── FileResolverSpec.scala
│ │ │ │ └── result/
│ │ │ │ └── iceberg/
│ │ │ │ ├── IcebergDocumentConsoleMessagesSpec.scala
│ │ │ │ ├── IcebergDocumentSpec.scala
│ │ │ │ └── IcebergTableStatsSpec.scala
│ │ │ └── util/
│ │ │ ├── ArrowUtilsSpec.scala
│ │ │ ├── IcebergUtilSpec.scala
│ │ │ ├── JSONUtilsSpec.scala
│ │ │ └── VirtualIdentityUtilsSpec.scala
│ │ └── service/
│ │ └── util/
│ │ ├── LargeBinaryInputStreamSpec.scala
│ │ ├── LargeBinaryManagerSpec.scala
│ │ ├── LargeBinaryOutputStreamSpec.scala
│ │ ├── S3StorageClientSpec.scala
│ │ └── S3StorageTestBase.scala
│ └── workflow-operator/
│ ├── build.sbt
│ ├── project/
│ │ └── build.properties
│ └── src/
│ ├── main/
│ │ └── scala/
│ │ ├── com/
│ │ │ └── kjetland/
│ │ │ └── jackson/
│ │ │ └── jsonSchema/
│ │ │ ├── JsonSchemaDraft.java
│ │ │ ├── JsonSchemaGenerator.scala
│ │ │ └── annotations/
│ │ │ ├── JsonSchemaArrayWithUniqueItems.java
│ │ │ ├── JsonSchemaBool.java
│ │ │ ├── JsonSchemaDefault.java
│ │ │ ├── JsonSchemaDescription.java
│ │ │ ├── JsonSchemaExamples.java
│ │ │ ├── JsonSchemaFormat.java
│ │ │ ├── JsonSchemaInject.java
│ │ │ ├── JsonSchemaInt.java
│ │ │ ├── JsonSchemaOptions.java
│ │ │ ├── JsonSchemaString.java
│ │ │ └── JsonSchemaTitle.java
│ │ └── org/
│ │ └── apache/
│ │ └── texera/
│ │ └── amber/
│ │ ├── operator/
│ │ │ ├── DummyProperties.scala
│ │ │ ├── LogicalOp.scala
│ │ │ ├── PortDescriptor.scala
│ │ │ ├── PythonOperatorDescriptor.scala
│ │ │ ├── SpecialPhysicalOpFactory.scala
│ │ │ ├── TestOperators.scala
│ │ │ ├── aggregate/
│ │ │ │ ├── AggregateOpDesc.scala
│ │ │ │ ├── AggregateOpExec.scala
│ │ │ │ ├── AggregationFunction.java
│ │ │ │ ├── AggregationOperation.scala
│ │ │ │ └── DistributedAggregation.scala
│ │ │ ├── cartesianProduct/
│ │ │ │ ├── CartesianProductOpDesc.scala
│ │ │ │ └── CartesianProductOpExec.scala
│ │ │ ├── dictionary/
│ │ │ │ ├── DictionaryMatcherOpDesc.scala
│ │ │ │ ├── DictionaryMatcherOpExec.scala
│ │ │ │ └── MatchingType.java
│ │ │ ├── difference/
│ │ │ │ ├── DifferenceOpDesc.scala
│ │ │ │ └── DifferenceOpExec.scala
│ │ │ ├── distinct/
│ │ │ │ ├── DistinctOpDesc.scala
│ │ │ │ └── DistinctOpExec.scala
│ │ │ ├── dummy/
│ │ │ │ └── DummyOpDesc.scala
│ │ │ ├── filter/
│ │ │ │ ├── ComparisonType.java
│ │ │ │ ├── FilterOpDesc.scala
│ │ │ │ ├── FilterOpExec.scala
│ │ │ │ ├── FilterPredicate.java
│ │ │ │ ├── SpecializedFilterOpDesc.scala
│ │ │ │ └── SpecializedFilterOpExec.scala
│ │ │ ├── flatmap/
│ │ │ │ ├── FlatMapOpDesc.scala
│ │ │ │ └── FlatMapOpExec.scala
│ │ │ ├── hashJoin/
│ │ │ │ ├── HashJoinBuildOpExec.scala
│ │ │ │ ├── HashJoinOpDesc.scala
│ │ │ │ ├── HashJoinProbeOpExec.scala
│ │ │ │ └── JoinType.java
│ │ │ ├── huggingFace/
│ │ │ │ ├── HuggingFaceIrisLogisticRegressionOpDesc.scala
│ │ │ │ ├── HuggingFaceSentimentAnalysisOpDesc.scala
│ │ │ │ ├── HuggingFaceSpamSMSDetectionOpDesc.scala
│ │ │ │ └── HuggingFaceTextSummarizationOpDesc.scala
│ │ │ ├── ifStatement/
│ │ │ │ ├── IfOpDesc.scala
│ │ │ │ └── IfOpExec.scala
│ │ │ ├── intersect/
│ │ │ │ ├── IntersectOpDesc.scala
│ │ │ │ └── IntersectOpExec.scala
│ │ │ ├── intervalJoin/
│ │ │ │ ├── IntervalJoinOpDesc.scala
│ │ │ │ ├── IntervalJoinOpExec.scala
│ │ │ │ └── TimeIntervalType.java
│ │ │ ├── keywordSearch/
│ │ │ │ ├── KeywordSearchOpDesc.scala
│ │ │ │ └── KeywordSearchOpExec.scala
│ │ │ ├── limit/
│ │ │ │ ├── LimitOpDesc.scala
│ │ │ │ └── LimitOpExec.scala
│ │ │ ├── machineLearning/
│ │ │ │ ├── Scorer/
│ │ │ │ │ ├── MachineLearningScorerOpDesc.scala
│ │ │ │ │ ├── classificationMetricsFnc.java
│ │ │ │ │ └── regressionMetricsFnc.java
│ │ │ │ └── sklearnAdvanced/
│ │ │ │ ├── KNNTrainer/
│ │ │ │ │ ├── SklearnAdvancedKNNClassifierTrainerOpDesc.scala
│ │ │ │ │ ├── SklearnAdvancedKNNParameters.java
│ │ │ │ │ └── SklearnAdvancedKNNRegressorTrainerOpDesc.scala
│ │ │ │ ├── SVCTrainer/
│ │ │ │ │ ├── SklearnAdvancedSVCParameters.java
│ │ │ │ │ └── SklearnAdvancedSVCTrainerOpDesc.scala
│ │ │ │ ├── SVRTrainer/
│ │ │ │ │ ├── SklearnAdvancedSVRParameters.java
│ │ │ │ │ └── SklearnAdvancedSVRTrainerOpDesc.scala
│ │ │ │ └── base/
│ │ │ │ ├── HyperParameters.scala
│ │ │ │ └── SklearnAdvancedBaseDesc.scala
│ │ │ ├── map/
│ │ │ │ ├── MapOpDesc.scala
│ │ │ │ └── MapOpExec.scala
│ │ │ ├── metadata/
│ │ │ │ ├── OPVersion.java
│ │ │ │ ├── OperatorGroupConstants.scala
│ │ │ │ ├── OperatorMetadataGenerator.scala
│ │ │ │ ├── PropertyNameConstants.scala
│ │ │ │ └── annotations/
│ │ │ │ ├── AutofillAttributeName.java
│ │ │ │ ├── AutofillAttributeNameLambda.java
│ │ │ │ ├── AutofillAttributeNameList.java
│ │ │ │ ├── AutofillAttributeNameOnPort1.java
│ │ │ │ ├── BatchByColumn.java
│ │ │ │ ├── CommonOpDescAnnotation.java
│ │ │ │ ├── EnablePresets.java
│ │ │ │ ├── HideAnnotation.java
│ │ │ │ └── UIWidget.java
│ │ │ ├── projection/
│ │ │ │ ├── AttributeUnit.java
│ │ │ │ ├── ProjectionOpDesc.scala
│ │ │ │ └── ProjectionOpExec.scala
│ │ │ ├── randomksampling/
│ │ │ │ ├── RandomKSamplingOpDesc.scala
│ │ │ │ └── RandomKSamplingOpExec.scala
│ │ │ ├── regex/
│ │ │ │ ├── RegexOpDesc.scala
│ │ │ │ └── RegexOpExec.scala
│ │ │ ├── reservoirsampling/
│ │ │ │ ├── ReservoirSamplingOpDesc.scala
│ │ │ │ └── ReservoirSamplingOpExec.scala
│ │ │ ├── sink/
│ │ │ │ └── ProgressiveUtils.scala
│ │ │ ├── sklearn/
│ │ │ │ ├── SklearnAdaptiveBoostingOpDesc.scala
│ │ │ │ ├── SklearnBaggingOpDesc.scala
│ │ │ │ ├── SklearnBernoulliNaiveBayesOpDesc.scala
│ │ │ │ ├── SklearnClassifierOpDesc.scala
│ │ │ │ ├── SklearnComplementNaiveBayesOpDesc.scala
│ │ │ │ ├── SklearnDecisionTreeOpDesc.scala
│ │ │ │ ├── SklearnDummyClassifierOpDesc.scala
│ │ │ │ ├── SklearnExtraTreeOpDesc.scala
│ │ │ │ ├── SklearnExtraTreesOpDesc.scala
│ │ │ │ ├── SklearnGaussianNaiveBayesOpDesc.scala
│ │ │ │ ├── SklearnGradientBoostingOpDesc.scala
│ │ │ │ ├── SklearnKNNOpDesc.scala
│ │ │ │ ├── SklearnLinearRegressionOpDesc.scala
│ │ │ │ ├── SklearnLinearSVMOpDesc.scala
│ │ │ │ ├── SklearnLogisticRegressionCVOpDesc.scala
│ │ │ │ ├── SklearnLogisticRegressionOpDesc.scala
│ │ │ │ ├── SklearnMultiLayerPerceptronOpDesc.scala
│ │ │ │ ├── SklearnMultinomialNaiveBayesOpDesc.scala
│ │ │ │ ├── SklearnNearestCentroidOpDesc.scala
│ │ │ │ ├── SklearnPassiveAggressiveOpDesc.scala
│ │ │ │ ├── SklearnPerceptronOpDesc.scala
│ │ │ │ ├── SklearnPredictionOpDesc.scala
│ │ │ │ ├── SklearnProbabilityCalibrationOpDesc.scala
│ │ │ │ ├── SklearnRandomForestOpDesc.scala
│ │ │ │ ├── SklearnRidgeCVOpDesc.scala
│ │ │ │ ├── SklearnRidgeOpDesc.scala
│ │ │ │ ├── SklearnSDGOpDesc.scala
│ │ │ │ ├── SklearnSVMOpDesc.scala
│ │ │ │ ├── testing/
│ │ │ │ │ └── SklearnTestingOpDesc.scala
│ │ │ │ └── training/
│ │ │ │ ├── SklearnTrainingAdaptiveBoostingOpDesc.scala
│ │ │ │ ├── SklearnTrainingBaggingOpDesc.scala
│ │ │ │ ├── SklearnTrainingBernoulliNaiveBayesOpDesc.scala
│ │ │ │ ├── SklearnTrainingComplementNaiveBayesOpDesc.scala
│ │ │ │ ├── SklearnTrainingDecisionTreeOpDesc.scala
│ │ │ │ ├── SklearnTrainingDummyClassifierOpDesc.scala
│ │ │ │ ├── SklearnTrainingExtraTreeOpDesc.scala
│ │ │ │ ├── SklearnTrainingExtraTreesOpDesc.scala
│ │ │ │ ├── SklearnTrainingGaussianNaiveBayesOpDesc.scala
│ │ │ │ ├── SklearnTrainingGradientBoostingOpDesc.scala
│ │ │ │ ├── SklearnTrainingKNNOpDesc.scala
│ │ │ │ ├── SklearnTrainingLinearRegressionOpDesc.scala
│ │ │ │ ├── SklearnTrainingLinearSVMOpDesc.scala
│ │ │ │ ├── SklearnTrainingLogisticRegressionCVOpDesc.scala
│ │ │ │ ├── SklearnTrainingLogisticRegressionOpDesc.scala
│ │ │ │ ├── SklearnTrainingMultiLayerPerceptronOpDesc.scala
│ │ │ │ ├── SklearnTrainingMultinomialNaiveBayesOpDesc.scala
│ │ │ │ ├── SklearnTrainingNearestCentroidOpDesc.scala
│ │ │ │ ├── SklearnTrainingOpDesc.scala
│ │ │ │ ├── SklearnTrainingPassiveAggressiveOpDesc.scala
│ │ │ │ ├── SklearnTrainingPerceptronOpDesc.scala
│ │ │ │ ├── SklearnTrainingProbabilityCalibrationOpDesc.scala
│ │ │ │ ├── SklearnTrainingRandomForestOpDesc.scala
│ │ │ │ ├── SklearnTrainingRidgeCVOpDesc.scala
│ │ │ │ ├── SklearnTrainingRidgeOpDesc.scala
│ │ │ │ ├── SklearnTrainingSDGOpDesc.scala
│ │ │ │ └── SklearnTrainingSVMOpDesc.scala
│ │ │ ├── sleep/
│ │ │ │ ├── SleepOpDesc.scala
│ │ │ │ └── SleepOpExec.scala
│ │ │ ├── sort/
│ │ │ │ ├── SortCriteriaUnit.scala
│ │ │ │ ├── SortOpDesc.scala
│ │ │ │ ├── SortPreference.java
│ │ │ │ ├── StableMergeSortOpDesc.scala
│ │ │ │ └── StableMergeSortOpExec.scala
│ │ │ ├── sortPartitions/
│ │ │ │ ├── SortPartitionsOpDesc.scala
│ │ │ │ └── SortPartitionsOpExec.scala
│ │ │ ├── source/
│ │ │ │ ├── BufferedBlockReader.java
│ │ │ │ ├── PythonSourceOperatorDescriptor.scala
│ │ │ │ ├── SourceOperatorDescriptor.scala
│ │ │ │ ├── apis/
│ │ │ │ │ ├── reddit/
│ │ │ │ │ │ ├── RedditSearchSourceOpDesc.scala
│ │ │ │ │ │ └── RedditSourceOperatorFunction.java
│ │ │ │ │ └── twitter/
│ │ │ │ │ ├── TwitterSourceOpDesc.scala
│ │ │ │ │ ├── TwitterSourceOpExec.scala
│ │ │ │ │ └── v2/
│ │ │ │ │ ├── TwitterFullArchiveSearchSourceOpDesc.scala
│ │ │ │ │ ├── TwitterFullArchiveSearchSourceOpExec.scala
│ │ │ │ │ ├── TwitterSearchSourceOpDesc.scala
│ │ │ │ │ └── TwitterSearchSourceOpExec.scala
│ │ │ │ ├── cache/
│ │ │ │ │ └── CacheSourceOpExec.scala
│ │ │ │ ├── dataset/
│ │ │ │ │ ├── FileListerSourceOpDesc.scala
│ │ │ │ │ └── FileListerSourceOpExec.scala
│ │ │ │ ├── fetcher/
│ │ │ │ │ ├── DecodingMethod.java
│ │ │ │ │ ├── RandomUserAgent.java
│ │ │ │ │ ├── URLFetchUtil.scala
│ │ │ │ │ ├── URLFetcherOpDesc.scala
│ │ │ │ │ └── URLFetcherOpExec.scala
│ │ │ │ ├── scan/
│ │ │ │ │ ├── AutoClosingIterator.scala
│ │ │ │ │ ├── FileAttributeType.java
│ │ │ │ │ ├── FileDecodingMethod.java
│ │ │ │ │ ├── ScanSourceOpDesc.scala
│ │ │ │ │ ├── arrow/
│ │ │ │ │ │ ├── ArrowSourceOpDesc.scala
│ │ │ │ │ │ └── ArrowSourceOpExec.scala
│ │ │ │ │ ├── csv/
│ │ │ │ │ │ ├── CSVScanSourceOpDesc.scala
│ │ │ │ │ │ ├── CSVScanSourceOpExec.scala
│ │ │ │ │ │ ├── ParallelCSVScanSourceOpDesc.scala
│ │ │ │ │ │ └── ParallelCSVScanSourceOpExec.scala
│ │ │ │ │ ├── csvOld/
│ │ │ │ │ │ ├── CSVOldScanSourceOpDesc.scala
│ │ │ │ │ │ └── CSVOldScanSourceOpExec.scala
│ │ │ │ │ ├── file/
│ │ │ │ │ │ ├── FileScanOpDesc.scala
│ │ │ │ │ │ ├── FileScanOpExec.scala
│ │ │ │ │ │ ├── FileScanSourceOpDesc.scala
│ │ │ │ │ │ ├── FileScanSourceOpExec.scala
│ │ │ │ │ │ └── FileScanUtils.scala
│ │ │ │ │ ├── json/
│ │ │ │ │ │ ├── JSONLScanSourceOpDesc.scala
│ │ │ │ │ │ └── JSONLScanSourceOpExec.scala
│ │ │ │ │ └── text/
│ │ │ │ │ ├── TextInputSourceOpDesc.scala
│ │ │ │ │ ├── TextInputSourceOpExec.scala
│ │ │ │ │ └── TextSourceOpDesc.scala
│ │ │ │ └── sql/
│ │ │ │ ├── SQLSourceOpDesc.scala
│ │ │ │ ├── SQLSourceOpExec.scala
│ │ │ │ ├── asterixdb/
│ │ │ │ │ ├── AsterixDBConnUtil.scala
│ │ │ │ │ ├── AsterixDBSourceOpDesc.scala
│ │ │ │ │ └── AsterixDBSourceOpExec.scala
│ │ │ │ ├── mysql/
│ │ │ │ │ ├── MySQLConnUtil.scala
│ │ │ │ │ ├── MySQLSourceOpDesc.scala
│ │ │ │ │ └── MySQLSourceOpExec.scala
│ │ │ │ └── postgresql/
│ │ │ │ ├── PostgreSQLConnUtil.scala
│ │ │ │ ├── PostgreSQLSourceOpDesc.scala
│ │ │ │ └── PostgreSQLSourceOpExec.scala
│ │ │ ├── split/
│ │ │ │ ├── SplitOpDesc.scala
│ │ │ │ └── SplitOpExec.scala
│ │ │ ├── substringSearch/
│ │ │ │ ├── SubstringSearchOpDesc.scala
│ │ │ │ └── SubstringSearchOpExec.scala
│ │ │ ├── symmetricDifference/
│ │ │ │ ├── SymmetricDifferenceOpDesc.scala
│ │ │ │ └── SymmetricDifferenceOpExec.scala
│ │ │ ├── typecasting/
│ │ │ │ ├── TypeCastingOpDesc.scala
│ │ │ │ ├── TypeCastingOpExec.scala
│ │ │ │ └── TypeCastingUnit.java
│ │ │ ├── udf/
│ │ │ │ ├── java/
│ │ │ │ │ └── JavaUDFOpDesc.scala
│ │ │ │ ├── python/
│ │ │ │ │ ├── DualInputPortsPythonUDFOpDescV2.scala
│ │ │ │ │ ├── LambdaAttributeUnit.java
│ │ │ │ │ ├── PythonLambdaFunctionOpDesc.scala
│ │ │ │ │ ├── PythonTableReducerOpDesc.scala
│ │ │ │ │ ├── PythonUDFOpDescV2.scala
│ │ │ │ │ └── source/
│ │ │ │ │ └── PythonUDFSourceOpDescV2.scala
│ │ │ │ └── r/
│ │ │ │ ├── RUDFOpDesc.scala
│ │ │ │ └── RUDFSourceOpDesc.scala
│ │ │ ├── union/
│ │ │ │ ├── UnionOpDesc.scala
│ │ │ │ └── UnionOpExec.scala
│ │ │ ├── unneststring/
│ │ │ │ ├── UnnestStringOpDesc.scala
│ │ │ │ └── UnnestStringOpExec.scala
│ │ │ ├── util/
│ │ │ │ └── OperatorDescriptorUtils.scala
│ │ │ └── visualization/
│ │ │ ├── DotPlot/
│ │ │ │ └── DotPlotOpDesc.scala
│ │ │ ├── IcicleChart/
│ │ │ │ └── IcicleChartOpDesc.scala
│ │ │ ├── ImageUtility.scala
│ │ │ ├── ImageViz/
│ │ │ │ └── ImageVisualizerOpDesc.scala
│ │ │ ├── ScatterMatrixChart/
│ │ │ │ └── ScatterMatrixChartOpDesc.scala
│ │ │ ├── barChart/
│ │ │ │ └── BarChartOpDesc.scala
│ │ │ ├── boxViolinPlot/
│ │ │ │ ├── BoxViolinPlotOpDesc.scala
│ │ │ │ └── BoxViolinPlotQuartileFunction.java
│ │ │ ├── bubbleChart/
│ │ │ │ └── BubbleChartOpDesc.scala
│ │ │ ├── bulletChart/
│ │ │ │ ├── BulletChartOpDesc.scala
│ │ │ │ └── BulletChartStepDefinition.scala
│ │ │ ├── candlestickChart/
│ │ │ │ └── CandlestickChartOpDesc.scala
│ │ │ ├── carpetPlot/
│ │ │ │ └── CarpetPlotOpDesc.scala
│ │ │ ├── choroplethMap/
│ │ │ │ └── ChoroplethMapOpDesc.scala
│ │ │ ├── continuousErrorBands/
│ │ │ │ ├── BandConfig.scala
│ │ │ │ └── ContinuousErrorBandsOpDesc.scala
│ │ │ ├── contourPlot/
│ │ │ │ ├── ContourPlotColoringFunction.java
│ │ │ │ └── ContourPlotOpDesc.scala
│ │ │ ├── dendrogram/
│ │ │ │ └── DendrogramOpDesc.scala
│ │ │ ├── dumbbellPlot/
│ │ │ │ ├── DumbbellDotConfig.scala
│ │ │ │ └── DumbbellPlotOpDesc.scala
│ │ │ ├── ecdfPlot/
│ │ │ │ └── ECDFPlotOpDesc.scala
│ │ │ ├── figureFactoryTable/
│ │ │ │ ├── FigureFactoryTableConfig.scala
│ │ │ │ └── FigureFactoryTableOpDesc.scala
│ │ │ ├── filledAreaPlot/
│ │ │ │ └── FilledAreaPlotOpDesc.scala
│ │ │ ├── funnelPlot/
│ │ │ │ └── FunnelPlotOpDesc.scala
│ │ │ ├── ganttChart/
│ │ │ │ └── GanttChartOpDesc.scala
│ │ │ ├── gaugeChart/
│ │ │ │ ├── GaugeChartOpDesc.scala
│ │ │ │ └── GaugeChartSteps.scala
│ │ │ ├── heatMap/
│ │ │ │ └── HeatMapOpDesc.scala
│ │ │ ├── hierarchychart/
│ │ │ │ ├── HierarchyChartOpDesc.scala
│ │ │ │ ├── HierarchyChartType.java
│ │ │ │ └── HierarchySection.scala
│ │ │ ├── histogram/
│ │ │ │ └── HistogramChartOpDesc.scala
│ │ │ ├── histogram2d/
│ │ │ │ ├── Histogram2DOpDesc.scala
│ │ │ │ └── NormalizationType.java
│ │ │ ├── htmlviz/
│ │ │ │ ├── HtmlVizOpDesc.scala
│ │ │ │ └── HtmlVizOpExec.scala
│ │ │ ├── lineChart/
│ │ │ │ ├── LineChartOpDesc.scala
│ │ │ │ ├── LineConfig.scala
│ │ │ │ └── LineMode.java
│ │ │ ├── nestedTable/
│ │ │ │ ├── NestedTableConfig.scala
│ │ │ │ └── NestedTableOpDesc.scala
│ │ │ ├── networkGraph/
│ │ │ │ └── NetworkGraphOpDesc.scala
│ │ │ ├── parallelCoordinatesPlot/
│ │ │ │ └── ParallelCoordinatesPlotOpDesc.scala
│ │ │ ├── pieChart/
│ │ │ │ └── PieChartOpDesc.scala
│ │ │ ├── polarChart/
│ │ │ │ └── PolarChartOpDesc.scala
│ │ │ ├── quiverPlot/
│ │ │ │ └── QuiverPlotOpDesc.scala
│ │ │ ├── radarChart/
│ │ │ │ └── RadarChartOpDesc.scala
│ │ │ ├── radarPlot/
│ │ │ │ ├── RadarPlotLinePattern.java
│ │ │ │ └── RadarPlotOpDesc.scala
│ │ │ ├── rangeSlider/
│ │ │ │ ├── RangeSliderHandleDuplicateFunction.java
│ │ │ │ └── RangeSliderOpDesc.scala
│ │ │ ├── sankeyDiagram/
│ │ │ │ └── SankeyDiagramOpDesc.scala
│ │ │ ├── scatter3DChart/
│ │ │ │ └── Scatter3dChartOpDesc.scala
│ │ │ ├── scatterplot/
│ │ │ │ └── ScatterplotOpDesc.scala
│ │ │ ├── stripChart/
│ │ │ │ └── StripChartOpDesc.scala
│ │ │ ├── tablesChart/
│ │ │ │ ├── TablesConfig.scala
│ │ │ │ └── TablesPlotOpDesc.scala
│ │ │ ├── ternaryContour/
│ │ │ │ └── TernaryContourOpDesc.scala
│ │ │ ├── ternaryPlot/
│ │ │ │ └── TernaryPlotOpDesc.scala
│ │ │ ├── timeSeriesplot/
│ │ │ │ └── TimeSeriesOpDesc.scala
│ │ │ ├── treeplot/
│ │ │ │ └── TreePlotOpDesc.scala
│ │ │ ├── urlviz/
│ │ │ │ ├── UrlVizOpDesc.scala
│ │ │ │ └── UrlVizOpExec.scala
│ │ │ ├── volcanoPlot/
│ │ │ │ └── VolcanoPlotOpDesc.scala
│ │ │ ├── waterfallChart/
│ │ │ │ └── WaterfallChartOpDesc.scala
│ │ │ ├── windRoseChart/
│ │ │ │ └── WindRoseChartOpDesc.scala
│ │ │ └── wordCloud/
│ │ │ └── WordCloudOpDesc.scala
│ │ └── util/
│ │ └── ObjectMapperUtils.scala
│ └── test/
│ ├── resources/
│ │ ├── 100.jsonl
│ │ ├── 1000.jsonl
│ │ ├── country_sales_headerless_small.csv
│ │ ├── country_sales_headerless_small_multi_line.csv
│ │ ├── country_sales_headerless_small_multi_line_custom_delimiter.csv
│ │ ├── country_sales_medium.csv
│ │ ├── country_sales_small.csv
│ │ ├── country_sales_small_multi_line.csv
│ │ ├── line_numbers.txt
│ │ ├── line_numbers_crlf.txt
│ │ └── numbers.txt
│ └── scala/
│ └── org/
│ └── apache/
│ └── texera/
│ └── amber/
│ ├── operator/
│ │ ├── aggregate/
│ │ │ ├── AggregateOpSpec.scala
│ │ │ └── AggregationOperationSpec.scala
│ │ ├── cartesianProduct/
│ │ │ └── CartesianProductOpExecSpec.scala
│ │ ├── dictionary/
│ │ │ └── DictionaryMatcherOpExecSpec.scala
│ │ ├── difference/
│ │ │ └── DifferenceOpExecSpec.scala
│ │ ├── distinct/
│ │ │ └── DistinctOpExecSpec.scala
│ │ ├── filter/
│ │ │ └── SpecializedFilterOpExecSpec.scala
│ │ ├── flatmap/
│ │ │ └── FlatMapOpExecSpec.scala
│ │ ├── hashJoin/
│ │ │ └── HashJoinOpSpec.scala
│ │ ├── ifStatement/
│ │ │ └── IfOpExecSpec.scala
│ │ ├── intersect/
│ │ │ ├── IntersectOpDescSpec.scala
│ │ │ └── IntersectOpExecSpec.scala
│ │ ├── intervalJoin/
│ │ │ └── IntervalOpExecSpec.scala
│ │ ├── keywordSearch/
│ │ │ └── KeywordSearchOpExecSpec.scala
│ │ ├── limit/
│ │ │ └── LimitOpExecSpec.scala
│ │ ├── map/
│ │ │ └── MapOpExecSpec.scala
│ │ ├── projection/
│ │ │ ├── ProjectionOpDescSpec.scala
│ │ │ └── ProjectionOpExecSpec.scala
│ │ ├── sink/
│ │ │ └── ProgressiveUtilsSpec.scala
│ │ ├── sklearn/
│ │ │ └── SklearnOpDescRegistrySpec.scala
│ │ ├── sleep/
│ │ │ └── SleepOpDescSpec.scala
│ │ ├── sort/
│ │ │ └── StableMergeSortOpExecSpec.scala
│ │ ├── sortPartitions/
│ │ │ └── SortPartitionsOpExecSpec.scala
│ │ ├── source/
│ │ │ ├── dataset/
│ │ │ │ └── FileListerSourceOpDescSpec.scala
│ │ │ ├── fetcher/
│ │ │ │ ├── URLFetcherOpDescSpec.scala
│ │ │ │ └── URLFetcherOpExecSpec.scala
│ │ │ └── scan/
│ │ │ ├── csv/
│ │ │ │ ├── CSVScanSourceOpDescSpec.scala
│ │ │ │ └── CSVScanSourceOpExecSpec.scala
│ │ │ ├── file/
│ │ │ │ ├── FileScanOpDescSpec.scala
│ │ │ │ ├── FileScanSourceOpDescSpec.scala
│ │ │ │ └── FileScanSourceOpExecSpec.scala
│ │ │ └── text/
│ │ │ └── TextInputSourceOpDescSpec.scala
│ │ ├── symmetricDifference/
│ │ │ └── SymmetricDifferenceOpExecSpec.scala
│ │ ├── timeSeriesPlot/
│ │ │ └── TimeSeriesOpDescSpec.scala
│ │ ├── typecasting/
│ │ │ └── TypeCastingOpExecSpec.scala
│ │ ├── udf/
│ │ │ └── python/
│ │ │ └── PythonLambdaFunctionOpDescSpec.scala
│ │ ├── unneststring/
│ │ │ └── UnnestStringOpExecSpec.scala
│ │ └── visualization/
│ │ ├── DotPlot/
│ │ │ └── DotPlotOpDescSpec.scala
│ │ ├── ImageViz/
│ │ │ └── ImageVisualizerOpDescSpec.scala
│ │ ├── barChart/
│ │ │ └── BarChartOpDescSpec.scala
│ │ ├── bubbleChart/
│ │ │ └── BubbleChartOpDescSpec.scala
│ │ ├── bulletChart/
│ │ │ └── BulletChartOpDescSpec.scala
│ │ ├── ecdfPlot/
│ │ │ └── ECDFPlotOpDescSpec.scala
│ │ ├── filledAreaPlot/
│ │ │ └── FilledAreaPlotOpDescSpec.scala
│ │ ├── funnelPlot/
│ │ │ └── FunnelPlotOpDescSpec.scala
│ │ ├── ganttChart/
│ │ │ └── GanttChartOpDescSpec.scala
│ │ ├── heatMap/
│ │ │ └── HeatMapOpDescSpec.scala
│ │ ├── hierarchychart/
│ │ │ └── HierarchyChartOpDescSpec.scala
│ │ ├── htmlviz/
│ │ │ └── HtmlVizOpExecSpec.scala
│ │ ├── lineChart/
│ │ │ └── LineChartOpDescSpec.scala
│ │ ├── pieChart/
│ │ │ └── PieChartOpDescSpec.scala
│ │ ├── scatterplot/
│ │ │ └── ScatterPlotOpDescSpec.scala
│ │ ├── volcanoPlot/
│ │ │ └── VolcanoPlotOpDescSpec.scala
│ │ └── wordCloud/
│ │ └── WordCloudOpDescSpec.scala
│ ├── pybuilder/
│ │ ├── DescriptorChecker.scala
│ │ ├── PythonClassgraphScanner.scala
│ │ ├── PythonConsoleCapture.scala
│ │ ├── PythonRawTextReportRenderer.scala
│ │ ├── PythonReflectionTextUtils.scala
│ │ └── PythonReflectionUtils.scala
│ └── util/
│ ├── ArrowUtilsSpec.scala
│ └── PythonCodeRawInvalidTextSpec.scala
├── computing-unit-managing-service/
│ ├── LICENSE-binary
│ ├── NOTICE-binary
│ ├── build.sbt
│ ├── project/
│ │ ├── build.properties
│ │ └── plugins.sbt
│ └── src/
│ └── main/
│ ├── resources/
│ │ └── computing-unit-managing-service-config.yaml
│ └── scala/
│ └── org/
│ └── apache/
│ └── texera/
│ └── service/
│ ├── ComputingUnitManagingService.scala
│ ├── ComputingUnitManagingServiceConfiguration.scala
│ ├── resource/
│ │ ├── ComputingUnitAccessResource.scala
│ │ ├── ComputingUnitManagingResource.scala
│ │ ├── ComputingUnitState.scala
│ │ └── HealthCheckResource.scala
│ └── util/
│ ├── ComputingUnitHelpers.scala
│ ├── ComputingUnitManagingServiceException.scala
│ └── KubernetesClient.scala
├── config-service/
│ ├── LICENSE-binary
│ ├── NOTICE-binary
│ ├── build.sbt
│ └── src/
│ └── main/
│ ├── resources/
│ │ └── config-service-web-config.yaml
│ └── scala/
│ └── org/
│ └── apache/
│ └── texera/
│ └── service/
│ ├── ConfigService.scala
│ ├── ConfigServiceConfiguration.scala
│ └── resource/
│ ├── ConfigResource.scala
│ └── HealthCheckResource.scala
├── file-service/
│ ├── LICENSE-binary
│ ├── NOTICE-binary
│ ├── build.sbt
│ └── src/
│ ├── main/
│ │ ├── resources/
│ │ │ ├── docker-compose.yml
│ │ │ ├── file-service-web-config.yaml
│ │ │ └── minio-config.yml
│ │ └── scala/
│ │ └── org/
│ │ └── apache/
│ │ └── texera/
│ │ └── service/
│ │ ├── FileService.scala
│ │ ├── FileServiceConfiguration.scala
│ │ ├── resource/
│ │ │ ├── DatasetAccessResource.scala
│ │ │ ├── DatasetResource.scala
│ │ │ └── HealthCheckResource.scala
│ │ ├── type/
│ │ │ ├── dataset/
│ │ │ │ └── DatasetFileNode.scala
│ │ │ └── serde/
│ │ │ └── DatasetFileNodeSerializer.java
│ │ └── util/
│ │ └── LakeFSExceptionHandler.scala
│ └── test/
│ └── scala/
│ └── org/
│ └── apache/
│ └── texera/
│ └── service/
│ ├── MockLakeFS.scala
│ └── resource/
│ └── DatasetResourceSpec.scala
├── frontend/
│ ├── .editorconfig
│ ├── .eslintrc.json
│ ├── .gitignore
│ ├── .nvmrc
│ ├── .prettierignore
│ ├── .prettierrc.json
│ ├── .yarn/
│ │ └── releases/
│ │ └── yarn-4.14.1.cjs
│ ├── .yarnrc.yml
│ ├── LICENSE-binary
│ ├── README.md
│ ├── angular.json
│ ├── custom-webpack.config.js
│ ├── git-version.js
│ ├── nx.json
│ ├── package.json
│ ├── proxy.config.json
│ ├── src/
│ │ ├── app/
│ │ │ ├── app-routing.constant.ts
│ │ │ ├── app-routing.module.ts
│ │ │ ├── app.component.ts
│ │ │ ├── app.module.ts
│ │ │ ├── common/
│ │ │ │ ├── app-setting.ts
│ │ │ │ ├── formly/
│ │ │ │ │ ├── array.type.ts
│ │ │ │ │ ├── collab-wrapper/
│ │ │ │ │ │ └── collab-wrapper/
│ │ │ │ │ │ ├── collab-wrapper.component.css
│ │ │ │ │ │ ├── collab-wrapper.component.html
│ │ │ │ │ │ └── collab-wrapper.component.ts
│ │ │ │ │ ├── formly-config.ts
│ │ │ │ │ ├── formly-utils.ts
│ │ │ │ │ ├── multischema.type.ts
│ │ │ │ │ ├── null.type.ts
│ │ │ │ │ ├── object.type.ts
│ │ │ │ │ ├── preset-wrapper/
│ │ │ │ │ │ ├── preset-wrapper.component.html
│ │ │ │ │ │ ├── preset-wrapper.component.scss
│ │ │ │ │ │ ├── preset-wrapper.component.spec.ts
│ │ │ │ │ │ └── preset-wrapper.component.ts
│ │ │ │ │ └── repeat-dnd/
│ │ │ │ │ ├── repeat-dnd.component.css
│ │ │ │ │ ├── repeat-dnd.component.html
│ │ │ │ │ └── repeat-dnd.component.ts
│ │ │ │ ├── service/
│ │ │ │ │ ├── blob-error-http-interceptor.service.ts
│ │ │ │ │ ├── computing-unit/
│ │ │ │ │ │ ├── computing-unit-actions/
│ │ │ │ │ │ │ └── computing-unit-actions.service.ts
│ │ │ │ │ │ ├── computing-unit-status/
│ │ │ │ │ │ │ ├── computing-unit-status.service.ts
│ │ │ │ │ │ │ └── mock-computing-unit-status.service.ts
│ │ │ │ │ │ └── workflow-computing-unit/
│ │ │ │ │ │ └── workflow-computing-unit-managing.service.ts
│ │ │ │ │ ├── gui-config.service.mock.ts
│ │ │ │ │ ├── gui-config.service.ts
│ │ │ │ │ ├── notification/
│ │ │ │ │ │ ├── notification.service.spec.ts
│ │ │ │ │ │ └── notification.service.ts
│ │ │ │ │ ├── user/
│ │ │ │ │ │ ├── auth-guard.service.ts
│ │ │ │ │ │ ├── auth.service.ts
│ │ │ │ │ │ ├── config/
│ │ │ │ │ │ │ ├── user-config.service.spec.ts
│ │ │ │ │ │ │ └── user-config.service.ts
│ │ │ │ │ │ ├── google-auth.service.ts
│ │ │ │ │ │ ├── registration-request-modal/
│ │ │ │ │ │ │ ├── registration-request-modal.component.html
│ │ │ │ │ │ │ ├── registration-request-modal.component.scss
│ │ │ │ │ │ │ └── registration-request-modal.component.ts
│ │ │ │ │ │ ├── stub-auth.service.ts
│ │ │ │ │ │ ├── stub-user.service.ts
│ │ │ │ │ │ ├── user.service.spec.ts
│ │ │ │ │ │ └── user.service.ts
│ │ │ │ │ └── workflow-persist/
│ │ │ │ │ ├── stub-workflow-persist.service.ts
│ │ │ │ │ ├── workflow-persist.service.spec.ts
│ │ │ │ │ └── workflow-persist.service.ts
│ │ │ │ ├── testing/
│ │ │ │ │ └── test-utils.ts
│ │ │ │ ├── type/
│ │ │ │ │ ├── computing-unit-connection.interface.ts
│ │ │ │ │ ├── dataset-file.ts
│ │ │ │ │ ├── dataset-staged-object.ts
│ │ │ │ │ ├── dataset.ts
│ │ │ │ │ ├── datasetVersionFileTree.ts
│ │ │ │ │ ├── execution.ts
│ │ │ │ │ ├── generic-web-response.ts
│ │ │ │ │ ├── gui-config.ts
│ │ │ │ │ ├── physical-plan.ts
│ │ │ │ │ ├── proto/
│ │ │ │ │ │ ├── google/
│ │ │ │ │ │ │ └── protobuf/
│ │ │ │ │ │ │ └── descriptor.ts
│ │ │ │ │ │ ├── org/
│ │ │ │ │ │ │ └── apache/
│ │ │ │ │ │ │ └── texera/
│ │ │ │ │ │ │ └── amber/
│ │ │ │ │ │ │ └── core/
│ │ │ │ │ │ │ ├── virtualidentity.ts
│ │ │ │ │ │ │ └── workflow.ts
│ │ │ │ │ │ └── scalapb/
│ │ │ │ │ │ └── scalapb.ts
│ │ │ │ │ ├── user.ts
│ │ │ │ │ ├── workflow-computing-unit.ts
│ │ │ │ │ └── workflow.ts
│ │ │ │ └── util/
│ │ │ │ ├── array-utils.ts
│ │ │ │ ├── assert.ts
│ │ │ │ ├── computing-unit.util.ts
│ │ │ │ ├── context.ts
│ │ │ │ ├── error.ts
│ │ │ │ ├── format.util.ts
│ │ │ │ ├── logical-operator-port-serde.ts
│ │ │ │ ├── map.ts
│ │ │ │ ├── panel-dock.ts
│ │ │ │ ├── port-identity-serde.ts
│ │ │ │ ├── predicate.ts
│ │ │ │ ├── set.ts
│ │ │ │ ├── size-formatter.util.spec.ts
│ │ │ │ ├── size-formatter.util.ts
│ │ │ │ ├── storage.ts
│ │ │ │ ├── stub.ts
│ │ │ │ ├── switch.ts
│ │ │ │ ├── url.ts
│ │ │ │ ├── workflow-check.ts
│ │ │ │ └── workflow-compilation-utils.ts
│ │ │ ├── dashboard/
│ │ │ │ ├── component/
│ │ │ │ │ ├── admin/
│ │ │ │ │ │ ├── execution/
│ │ │ │ │ │ │ ├── admin-execution.component.html
│ │ │ │ │ │ │ ├── admin-execution.component.scss
│ │ │ │ │ │ │ ├── admin-execution.component.spec.ts
│ │ │ │ │ │ │ └── admin-execution.component.ts
│ │ │ │ │ │ ├── settings/
│ │ │ │ │ │ │ ├── admin-settings.component.html
│ │ │ │ │ │ │ ├── admin-settings.component.scss
│ │ │ │ │ │ │ ├── admin-settings.component.spec.ts
│ │ │ │ │ │ │ └── admin-settings.component.ts
│ │ │ │ │ │ └── user/
│ │ │ │ │ │ ├── admin-user.component.html
│ │ │ │ │ │ ├── admin-user.component.scss
│ │ │ │ │ │ ├── admin-user.component.spec.ts
│ │ │ │ │ │ └── admin-user.component.ts
│ │ │ │ │ ├── button-style.scss
│ │ │ │ │ ├── dashboard.component.html
│ │ │ │ │ ├── dashboard.component.scss
│ │ │ │ │ ├── dashboard.component.spec.ts
│ │ │ │ │ ├── dashboard.component.ts
│ │ │ │ │ ├── section-style.scss
│ │ │ │ │ ├── user/
│ │ │ │ │ │ ├── files-uploader/
│ │ │ │ │ │ │ ├── conflicting-file-modal-content/
│ │ │ │ │ │ │ │ ├── conflicting-file-modal-content.component.html
│ │ │ │ │ │ │ │ ├── conflicting-file-modal-content.component.scss
│ │ │ │ │ │ │ │ └── conflicting-file-modal-content.component.ts
│ │ │ │ │ │ │ ├── files-uploader.component.html
│ │ │ │ │ │ │ ├── files-uploader.component.scss
│ │ │ │ │ │ │ └── files-uploader.component.ts
│ │ │ │ │ │ ├── filters/
│ │ │ │ │ │ │ ├── filters.component.html
│ │ │ │ │ │ │ ├── filters.component.scss
│ │ │ │ │ │ │ ├── filters.component.spec.ts
│ │ │ │ │ │ │ └── filters.component.ts
│ │ │ │ │ │ ├── filters-instructions/
│ │ │ │ │ │ │ ├── filters-instructions.component.html
│ │ │ │ │ │ │ ├── filters-instructions.component.spec.ts
│ │ │ │ │ │ │ └── filters-instructions.component.ts
│ │ │ │ │ │ ├── flarum/
│ │ │ │ │ │ │ ├── flarum.component.html
│ │ │ │ │ │ │ └── flarum.component.ts
│ │ │ │ │ │ ├── list-item/
│ │ │ │ │ │ │ ├── list-item.component.html
│ │ │ │ │ │ │ ├── list-item.component.scss
│ │ │ │ │ │ │ ├── list-item.component.spec.ts
│ │ │ │ │ │ │ └── list-item.component.ts
│ │ │ │ │ │ ├── markdown-description/
│ │ │ │ │ │ │ ├── markdown-description.component.html
│ │ │ │ │ │ │ ├── markdown-description.component.scss
│ │ │ │ │ │ │ └── markdown-description.component.ts
│ │ │ │ │ │ ├── search/
│ │ │ │ │ │ │ ├── search.component.html
│ │ │ │ │ │ │ ├── search.component.scss
│ │ │ │ │ │ │ └── search.component.ts
│ │ │ │ │ │ ├── search-bar/
│ │ │ │ │ │ │ ├── search-bar.component.html
│ │ │ │ │ │ │ ├── search-bar.component.scss
│ │ │ │ │ │ │ └── search-bar.component.ts
│ │ │ │ │ │ ├── search-results/
│ │ │ │ │ │ │ ├── search-results.component.html
│ │ │ │ │ │ │ ├── search-results.component.scss
│ │ │ │ │ │ │ └── search-results.component.ts
│ │ │ │ │ │ ├── share-access/
│ │ │ │ │ │ │ ├── share-access.component.html
│ │ │ │ │ │ │ ├── share-access.component.scss
│ │ │ │ │ │ │ └── share-access.component.ts
│ │ │ │ │ │ ├── sort-button/
│ │ │ │ │ │ │ ├── sort-button.component.html
│ │ │ │ │ │ │ ├── sort-button.component.scss
│ │ │ │ │ │ │ └── sort-button.component.ts
│ │ │ │ │ │ ├── user-avatar/
│ │ │ │ │ │ │ ├── user-avatar.component.html
│ │ │ │ │ │ │ ├── user-avatar.component.scss
│ │ │ │ │ │ │ ├── user-avatar.component.spec.ts
│ │ │ │ │ │ │ └── user-avatar.component.ts
│ │ │ │ │ │ ├── user-computing-unit/
│ │ │ │ │ │ │ ├── user-computing-unit-list-item/
│ │ │ │ │ │ │ │ ├── user-computing-unit-list-item.component.html
│ │ │ │ │ │ │ │ ├── user-computing-unit-list-item.component.scss
│ │ │ │ │ │ │ │ └── user-computing-unit-list-item.component.ts
│ │ │ │ │ │ │ ├── user-computing-unit.component.html
│ │ │ │ │ │ │ ├── user-computing-unit.component.scss
│ │ │ │ │ │ │ ├── user-computing-unit.component.spec.ts
│ │ │ │ │ │ │ └── user-computing-unit.component.ts
│ │ │ │ │ │ ├── user-dataset/
│ │ │ │ │ │ │ ├── user-dataset-explorer/
│ │ │ │ │ │ │ │ ├── dataset-detail.component.html
│ │ │ │ │ │ │ │ ├── dataset-detail.component.scss
│ │ │ │ │ │ │ │ ├── dataset-detail.component.ts
│ │ │ │ │ │ │ │ ├── user-dataset-file-renderer/
│ │ │ │ │ │ │ │ │ ├── user-dataset-file-renderer.component.html
│ │ │ │ │ │ │ │ │ ├── user-dataset-file-renderer.component.scss
│ │ │ │ │ │ │ │ │ ├── user-dataset-file-renderer.component.spec.ts
│ │ │ │ │ │ │ │ │ └── user-dataset-file-renderer.component.ts
│ │ │ │ │ │ │ │ ├── user-dataset-staged-objects-list/
│ │ │ │ │ │ │ │ │ ├── user-dataset-staged-objects-list.component.html
│ │ │ │ │ │ │ │ │ ├── user-dataset-staged-objects-list.component.scss
│ │ │ │ │ │ │ │ │ └── user-dataset-staged-objects-list.component.ts
│ │ │ │ │ │ │ │ ├── user-dataset-version-creator/
│ │ │ │ │ │ │ │ │ ├── user-dataset-version-creator.component.html
│ │ │ │ │ │ │ │ │ ├── user-dataset-version-creator.component.scss
│ │ │ │ │ │ │ │ │ └── user-dataset-version-creator.component.ts
│ │ │ │ │ │ │ │ └── user-dataset-version-filetree/
│ │ │ │ │ │ │ │ ├── user-dataset-version-filetree.component.html
│ │ │ │ │ │ │ │ ├── user-dataset-version-filetree.component.scss
│ │ │ │ │ │ │ │ └── user-dataset-version-filetree.component.ts
│ │ │ │ │ │ │ ├── user-dataset-list-item/
│ │ │ │ │ │ │ │ ├── user-dataset-list-item.component.html
│ │ │ │ │ │ │ │ ├── user-dataset-list-item.component.scss
│ │ │ │ │ │ │ │ └── user-dataset-list-item.component.ts
│ │ │ │ │ │ │ ├── user-dataset.component.html
│ │ │ │ │ │ │ ├── user-dataset.component.scss
│ │ │ │ │ │ │ └── user-dataset.component.ts
│ │ │ │ │ │ ├── user-icon/
│ │ │ │ │ │ │ ├── user-icon.component.html
│ │ │ │ │ │ │ ├── user-icon.component.scss
│ │ │ │ │ │ │ ├── user-icon.component.spec.ts
│ │ │ │ │ │ │ └── user-icon.component.ts
│ │ │ │ │ │ ├── user-project/
│ │ │ │ │ │ │ ├── public-project/
│ │ │ │ │ │ │ │ ├── public-project.component.html
│ │ │ │ │ │ │ │ └── public-project.component.ts
│ │ │ │ │ │ │ ├── user-project-list-item/
│ │ │ │ │ │ │ │ ├── user-project-list-item.component.html
│ │ │ │ │ │ │ │ ├── user-project-list-item.component.scss
│ │ │ │ │ │ │ │ ├── user-project-list-item.component.spec.ts
│ │ │ │ │ │ │ │ └── user-project-list-item.component.ts
│ │ │ │ │ │ │ ├── user-project-section/
│ │ │ │ │ │ │ │ ├── ngbd-modal-add-project-workflow/
│ │ │ │ │ │ │ │ │ ├── ngbd-modal-add-project-workflow.component.html
│ │ │ │ │ │ │ │ │ ├── ngbd-modal-add-project-workflow.component.scss
│ │ │ │ │ │ │ │ │ └── ngbd-modal-add-project-workflow.component.ts
│ │ │ │ │ │ │ │ ├── ngbd-modal-remove-project-workflow/
│ │ │ │ │ │ │ │ │ ├── ngbd-modal-remove-project-workflow.component.html
│ │ │ │ │ │ │ │ │ ├── ngbd-modal-remove-project-workflow.component.scss
│ │ │ │ │ │ │ │ │ └── ngbd-modal-remove-project-workflow.component.ts
│ │ │ │ │ │ │ │ ├── user-project-section.component.html
│ │ │ │ │ │ │ │ ├── user-project-section.component.scss
│ │ │ │ │ │ │ │ └── user-project-section.component.ts
│ │ │ │ │ │ │ ├── user-project.component.html
│ │ │ │ │ │ │ ├── user-project.component.scss
│ │ │ │ │ │ │ └── user-project.component.ts
│ │ │ │ │ │ ├── user-quota/
│ │ │ │ │ │ │ ├── user-quota.component.html
│ │ │ │ │ │ │ ├── user-quota.component.scss
│ │ │ │ │ │ │ ├── user-quota.component.spec.ts
│ │ │ │ │ │ │ └── user-quota.component.ts
│ │ │ │ │ │ └── user-workflow/
│ │ │ │ │ │ ├── ngbd-modal-workflow-executions/
│ │ │ │ │ │ │ ├── workflow-execution-history.component.html
│ │ │ │ │ │ │ ├── workflow-execution-history.component.scss
│ │ │ │ │ │ │ ├── workflow-execution-history.component.ts
│ │ │ │ │ │ │ └── workflow-runtime-statistics/
│ │ │ │ │ │ │ ├── workflow-runtime-statistics.component.html
│ │ │ │ │ │ │ ├── workflow-runtime-statistics.component.scss
│ │ │ │ │ │ │ └── workflow-runtime-statistics.component.ts
│ │ │ │ │ │ ├── user-workflow-list-item/
│ │ │ │ │ │ │ ├── highlight-search-terms.pipe.ts
│ │ │ │ │ │ │ ├── user-workflow-list-item.component.html
│ │ │ │ │ │ │ ├── user-workflow-list-item.component.scss
│ │ │ │ │ │ │ ├── user-workflow-list-item.component.spec.ts
│ │ │ │ │ │ │ └── user-workflow-list-item.component.ts
│ │ │ │ │ │ ├── user-workflow.component.html
│ │ │ │ │ │ ├── user-workflow.component.scss
│ │ │ │ │ │ ├── user-workflow.component.spec.ts
│ │ │ │ │ │ └── user-workflow.component.ts
│ │ │ │ │ └── user-dashboard-test-fixtures.ts
│ │ │ │ ├── service/
│ │ │ │ │ ├── admin/
│ │ │ │ │ │ ├── execution/
│ │ │ │ │ │ │ └── admin-execution.service.ts
│ │ │ │ │ │ ├── guard/
│ │ │ │ │ │ │ └── admin-guard.service.ts
│ │ │ │ │ │ ├── settings/
│ │ │ │ │ │ │ └── admin-settings.service.ts
│ │ │ │ │ │ └── user/
│ │ │ │ │ │ └── admin-user.service.ts
│ │ │ │ │ └── user/
│ │ │ │ │ ├── dataset/
│ │ │ │ │ │ └── dataset.service.ts
│ │ │ │ │ ├── download/
│ │ │ │ │ │ ├── download.service.spec.ts
│ │ │ │ │ │ └── download.service.ts
│ │ │ │ │ ├── file/
│ │ │ │ │ │ └── file-saver.service.ts
│ │ │ │ │ ├── flarum/
│ │ │ │ │ │ └── flarum.service.ts
│ │ │ │ │ ├── project/
│ │ │ │ │ │ ├── stub-user-project.service.ts
│ │ │ │ │ │ └── user-project.service.ts
│ │ │ │ │ ├── public-project/
│ │ │ │ │ │ └── public-project.service.ts
│ │ │ │ │ ├── quota/
│ │ │ │ │ │ └── user-quota.service.ts
│ │ │ │ │ ├── search.service.ts
│ │ │ │ │ ├── share-access/
│ │ │ │ │ │ └── share-access.service.ts
│ │ │ │ │ ├── stub-search.service.ts
│ │ │ │ │ ├── workflow-executions/
│ │ │ │ │ │ ├── workflow-executions.service.spec.ts
│ │ │ │ │ │ └── workflow-executions.service.ts
│ │ │ │ │ ├── workflow-snapshot/
│ │ │ │ │ │ └── workflow-snapshot.service.ts
│ │ │ │ │ └── workflow-version/
│ │ │ │ │ ├── workflow-version.service.spec.ts
│ │ │ │ │ └── workflow-version.service.ts
│ │ │ │ └── type/
│ │ │ │ ├── dashboard-dataset.interface.ts
│ │ │ │ ├── dashboard-entry.ts
│ │ │ │ ├── dashboard-file.interface.ts
│ │ │ │ ├── dashboard-project.interface.ts
│ │ │ │ ├── dashboard-workflow.interface.ts
│ │ │ │ ├── google-api-response.ts
│ │ │ │ ├── quota-statistic.interface.ts
│ │ │ │ ├── search-filter-parameters.ts
│ │ │ │ ├── search-result.ts
│ │ │ │ ├── share-access.interface.ts
│ │ │ │ ├── sort-method.ts
│ │ │ │ ├── type-predicates.ts
│ │ │ │ ├── workflow-executions-entry.ts
│ │ │ │ ├── workflow-metadata.interface.ts
│ │ │ │ ├── workflow-runtime-statistics.ts
│ │ │ │ ├── workflow-snapshot-entry.ts
│ │ │ │ └── workflow-version-entry.ts
│ │ │ ├── hub/
│ │ │ │ ├── component/
│ │ │ │ │ ├── about/
│ │ │ │ │ │ ├── about.component.html
│ │ │ │ │ │ ├── about.component.scss
│ │ │ │ │ │ ├── about.component.spec.ts
│ │ │ │ │ │ ├── about.component.ts
│ │ │ │ │ │ └── local-login/
│ │ │ │ │ │ ├── local-login.component.html
│ │ │ │ │ │ ├── local-login.component.scss
│ │ │ │ │ │ └── local-login.component.ts
│ │ │ │ │ ├── browse-section/
│ │ │ │ │ │ ├── browse-section.component.html
│ │ │ │ │ │ ├── browse-section.component.scss
│ │ │ │ │ │ ├── browse-section.component.spec.ts
│ │ │ │ │ │ └── browse-section.component.ts
│ │ │ │ │ ├── hub-search-result/
│ │ │ │ │ │ ├── hub-search-result.component.html
│ │ │ │ │ │ ├── hub-search-result.component.scss
│ │ │ │ │ │ └── hub-search-result.component.ts
│ │ │ │ │ ├── hub.component.html
│ │ │ │ │ ├── hub.component.scss
│ │ │ │ │ ├── hub.component.ts
│ │ │ │ │ ├── landing-page/
│ │ │ │ │ │ ├── landing-page.component.html
│ │ │ │ │ │ ├── landing-page.component.scss
│ │ │ │ │ │ └── landing-page.component.ts
│ │ │ │ │ ├── type/
│ │ │ │ │ │ └── hub-workflow.interface.ts
│ │ │ │ │ └── workflow/
│ │ │ │ │ └── detail/
│ │ │ │ │ ├── hub-workflow-detail.component.html
│ │ │ │ │ ├── hub-workflow-detail.component.scss
│ │ │ │ │ └── hub-workflow-detail.component.ts
│ │ │ │ └── service/
│ │ │ │ └── hub.service.ts
│ │ │ └── workspace/
│ │ │ ├── component/
│ │ │ │ ├── agent/
│ │ │ │ │ ├── agent-interaction/
│ │ │ │ │ │ ├── agent-interaction.component.html
│ │ │ │ │ │ ├── agent-interaction.component.scss
│ │ │ │ │ │ └── agent-interaction.component.ts
│ │ │ │ │ └── agent-panel/
│ │ │ │ │ ├── agent-chat/
│ │ │ │ │ │ ├── agent-chat.component.html
│ │ │ │ │ │ ├── agent-chat.component.scss
│ │ │ │ │ │ └── agent-chat.component.ts
│ │ │ │ │ ├── agent-panel.component.html
│ │ │ │ │ ├── agent-panel.component.scss
│ │ │ │ │ ├── agent-panel.component.ts
│ │ │ │ │ ├── agent-registration/
│ │ │ │ │ │ ├── agent-registration.component.html
│ │ │ │ │ │ ├── agent-registration.component.scss
│ │ │ │ │ │ └── agent-registration.component.ts
│ │ │ │ │ └── react-step-detail-modal/
│ │ │ │ │ ├── react-step-detail-modal.component.html
│ │ │ │ │ ├── react-step-detail-modal.component.scss
│ │ │ │ │ └── react-step-detail-modal.component.ts
│ │ │ │ ├── code-editor-dialog/
│ │ │ │ │ ├── annotation-suggestion.component.html
│ │ │ │ │ ├── annotation-suggestion.component.scss
│ │ │ │ │ ├── annotation-suggestion.component.spec.ts
│ │ │ │ │ ├── annotation-suggestion.component.ts
│ │ │ │ │ ├── breakpoint-condition-input/
│ │ │ │ │ │ ├── breakpoint-condition-input.component.html
│ │ │ │ │ │ ├── breakpoint-condition-input.component.scss
│ │ │ │ │ │ ├── breakpoint-condition-input.component.spec.ts
│ │ │ │ │ │ └── breakpoint-condition-input.component.ts
│ │ │ │ │ ├── code-debugger.component.html
│ │ │ │ │ ├── code-debugger.component.spec.ts
│ │ │ │ │ ├── code-debugger.component.ts
│ │ │ │ │ ├── code-editor.component.html
│ │ │ │ │ ├── code-editor.component.scss
│ │ │ │ │ ├── code-editor.component.spec.ts
│ │ │ │ │ └── code-editor.component.ts
│ │ │ │ ├── codearea-custom-template/
│ │ │ │ │ ├── codearea-custom-template.component.html
│ │ │ │ │ ├── codearea-custom-template.component.scss
│ │ │ │ │ ├── codearea-custom-template.component.spec.ts
│ │ │ │ │ └── codearea-custom-template.component.ts
│ │ │ │ ├── dataset-file-selector/
│ │ │ │ │ ├── dataset-file-selector.component.html
│ │ │ │ │ └── dataset-file-selector.component.ts
│ │ │ │ ├── dataset-selection-modal/
│ │ │ │ │ ├── dataset-selection-modal.component.html
│ │ │ │ │ ├── dataset-selection-modal.component.scss
│ │ │ │ │ └── dataset-selection-modal.component.ts
│ │ │ │ ├── dataset-version-selector/
│ │ │ │ │ ├── dataset-version-selector.component.html
│ │ │ │ │ └── dataset-version-selector.component.ts
│ │ │ │ ├── left-panel/
│ │ │ │ │ ├── environment/
│ │ │ │ │ │ └── environment.component.ts
│ │ │ │ │ ├── left-panel.component.html
│ │ │ │ │ ├── left-panel.component.scss
│ │ │ │ │ ├── left-panel.component.spec.ts
│ │ │ │ │ ├── left-panel.component.ts
│ │ │ │ │ ├── operator-menu/
│ │ │ │ │ │ ├── operator-label/
│ │ │ │ │ │ │ ├── operator-label.component.html
│ │ │ │ │ │ │ ├── operator-label.component.scss
│ │ │ │ │ │ │ ├── operator-label.component.spec.ts
│ │ │ │ │ │ │ └── operator-label.component.ts
│ │ │ │ │ │ ├── operator-menu.component.html
│ │ │ │ │ │ ├── operator-menu.component.scss
│ │ │ │ │ │ ├── operator-menu.component.spec.ts
│ │ │ │ │ │ └── operator-menu.component.ts
│ │ │ │ │ ├── settings/
│ │ │ │ │ │ ├── settings.component.html
│ │ │ │ │ │ ├── settings.component.scss
│ │ │ │ │ │ ├── settings.component.spec.ts
│ │ │ │ │ │ └── settings.component.ts
│ │ │ │ │ ├── time-travel/
│ │ │ │ │ │ ├── time-travel.component.html
│ │ │ │ │ │ ├── time-travel.component.scss
│ │ │ │ │ │ ├── time-travel.component.spec.ts
│ │ │ │ │ │ └── time-travel.component.ts
│ │ │ │ │ └── versions-list/
│ │ │ │ │ ├── versions-list.component.html
│ │ │ │ │ ├── versions-list.component.scss
│ │ │ │ │ ├── versions-list.component.spec.ts
│ │ │ │ │ └── versions-list.component.ts
│ │ │ │ ├── menu/
│ │ │ │ │ ├── coeditor-user-icon/
│ │ │ │ │ │ ├── coeditor-user-icon.component.css
│ │ │ │ │ │ ├── coeditor-user-icon.component.html
│ │ │ │ │ │ ├── coeditor-user-icon.component.spec.ts
│ │ │ │ │ │ └── coeditor-user-icon.component.ts
│ │ │ │ │ ├── menu.component.html
│ │ │ │ │ ├── menu.component.scss
│ │ │ │ │ ├── menu.component.spec.ts
│ │ │ │ │ └── menu.component.ts
│ │ │ │ ├── power-button/
│ │ │ │ │ ├── computing-unit-selection.component.html
│ │ │ │ │ ├── computing-unit-selection.component.scss
│ │ │ │ │ ├── computing-unit-selection.component.spec.ts
│ │ │ │ │ └── computing-unit-selection.component.ts
│ │ │ │ ├── property-editor/
│ │ │ │ │ ├── operator-property-edit-frame/
│ │ │ │ │ │ ├── operator-property-edit-frame.component.html
│ │ │ │ │ │ ├── operator-property-edit-frame.component.scss
│ │ │ │ │ │ ├── operator-property-edit-frame.component.spec.ts
│ │ │ │ │ │ └── operator-property-edit-frame.component.ts
│ │ │ │ │ ├── port-property-edit-frame/
│ │ │ │ │ │ ├── port-property-edit-frame.component.html
│ │ │ │ │ │ ├── port-property-edit-frame.component.scss
│ │ │ │ │ │ ├── port-property-edit-frame.component.spec.ts
│ │ │ │ │ │ └── port-property-edit-frame.component.ts
│ │ │ │ │ ├── property-editor.component.html
│ │ │ │ │ ├── property-editor.component.scss
│ │ │ │ │ ├── property-editor.component.spec.ts
│ │ │ │ │ ├── property-editor.component.ts
│ │ │ │ │ └── typecasting-display/
│ │ │ │ │ ├── type-casting-display.component.html
│ │ │ │ │ ├── type-casting-display.component.spec.ts
│ │ │ │ │ └── type-casting-display.component.ts
│ │ │ │ ├── result-exportation/
│ │ │ │ │ ├── result-exportation.component.html
│ │ │ │ │ ├── result-exportation.component.scss
│ │ │ │ │ └── result-exportation.component.ts
│ │ │ │ ├── result-panel/
│ │ │ │ │ ├── console-frame/
│ │ │ │ │ │ ├── console-frame.component.html
│ │ │ │ │ │ ├── console-frame.component.scss
│ │ │ │ │ │ ├── console-frame.component.spec.ts
│ │ │ │ │ │ └── console-frame.component.ts
│ │ │ │ │ ├── error-frame/
│ │ │ │ │ │ ├── error-frame.component.html
│ │ │ │ │ │ ├── error-frame.component.scss
│ │ │ │ │ │ ├── error-frame.component.spec.ts
│ │ │ │ │ │ └── error-frame.component.ts
│ │ │ │ │ ├── result-panel-modal.component.html
│ │ │ │ │ ├── result-panel-modal.component.ts
│ │ │ │ │ ├── result-panel-model.component.scss
│ │ │ │ │ ├── result-panel.component.html
│ │ │ │ │ ├── result-panel.component.scss
│ │ │ │ │ ├── result-panel.component.spec.ts
│ │ │ │ │ ├── result-panel.component.ts
│ │ │ │ │ └── result-table-frame/
│ │ │ │ │ ├── result-table-frame.component.html
│ │ │ │ │ ├── result-table-frame.component.scss
│ │ │ │ │ ├── result-table-frame.component.spec.ts
│ │ │ │ │ └── result-table-frame.component.ts
│ │ │ │ ├── visualization-panel-content/
│ │ │ │ │ ├── visualization-frame-content.component.html
│ │ │ │ │ ├── visualization-frame-content.component.scss
│ │ │ │ │ └── visualization-frame-content.component.ts
│ │ │ │ ├── workflow-editor/
│ │ │ │ │ ├── comment-box-modal/
│ │ │ │ │ │ ├── nz-modal-comment-box.component.html
│ │ │ │ │ │ ├── nz-modal-comment-box.component.scss
│ │ │ │ │ │ └── nz-modal-comment-box.component.ts
│ │ │ │ │ ├── context-menu/
│ │ │ │ │ │ └── context-menu/
│ │ │ │ │ │ ├── context-menu.component.html
│ │ │ │ │ │ ├── context-menu.component.scss
│ │ │ │ │ │ ├── context-menu.component.spec.ts
│ │ │ │ │ │ └── context-menu.component.ts
│ │ │ │ │ ├── mini-map/
│ │ │ │ │ │ ├── mini-map.component.html
│ │ │ │ │ │ ├── mini-map.component.scss
│ │ │ │ │ │ ├── mini-map.component.spec.ts
│ │ │ │ │ │ └── mini-map.component.ts
│ │ │ │ │ ├── workflow-editor.component.html
│ │ │ │ │ ├── workflow-editor.component.scss
│ │ │ │ │ ├── workflow-editor.component.spec.ts
│ │ │ │ │ └── workflow-editor.component.ts
│ │ │ │ ├── workspace.component.html
│ │ │ │ ├── workspace.component.scss
│ │ │ │ ├── workspace.component.spec.ts
│ │ │ │ └── workspace.component.ts
│ │ │ ├── service/
│ │ │ │ ├── agent/
│ │ │ │ │ ├── agent-types.ts
│ │ │ │ │ └── agent.service.ts
│ │ │ │ ├── ai-analyst/
│ │ │ │ │ └── ai-analyst.service.ts
│ │ │ │ ├── ai-assistant/
│ │ │ │ │ └── ai-assistant.service.ts
│ │ │ │ ├── code-editor/
│ │ │ │ │ └── code-editor.service.ts
│ │ │ │ ├── compile-workflow/
│ │ │ │ │ └── workflow-compiling.service.ts
│ │ │ │ ├── drag-drop/
│ │ │ │ │ ├── drag-drop.service.spec.ts
│ │ │ │ │ └── drag-drop.service.ts
│ │ │ │ ├── dynamic-schema/
│ │ │ │ │ ├── dynamic-schema.service.spec.ts
│ │ │ │ │ └── dynamic-schema.service.ts
│ │ │ │ ├── execute-workflow/
│ │ │ │ │ ├── execute-workflow.service.spec.ts
│ │ │ │ │ ├── execute-workflow.service.ts
│ │ │ │ │ ├── mock-result-data.ts
│ │ │ │ │ └── mock-workflow-plan.ts
│ │ │ │ ├── joint-ui/
│ │ │ │ │ ├── joint-ui.service.spec.ts
│ │ │ │ │ └── joint-ui.service.ts
│ │ │ │ ├── operator-debug/
│ │ │ │ │ ├── udf-debug.service.spec.ts
│ │ │ │ │ └── udf-debug.service.ts
│ │ │ │ ├── operator-menu/
│ │ │ │ │ ├── operator-menu.service.spec.ts
│ │ │ │ │ └── operator-menu.service.ts
│ │ │ │ ├── operator-metadata/
│ │ │ │ │ ├── mock-operator-metadata.data.ts
│ │ │ │ │ ├── operator-metadata.service.spec.ts
│ │ │ │ │ ├── operator-metadata.service.ts
│ │ │ │ │ └── stub-operator-metadata.service.ts
│ │ │ │ ├── panel/
│ │ │ │ │ └── panel.service.ts
│ │ │ │ ├── preset/
│ │ │ │ │ ├── preset.service.spec.ts
│ │ │ │ │ └── preset.service.ts
│ │ │ │ ├── report-generation/
│ │ │ │ │ └── report-generation.service.ts
│ │ │ │ ├── undo-redo/
│ │ │ │ │ ├── undo-redo.service.spec.ts
│ │ │ │ │ └── undo-redo.service.ts
│ │ │ │ ├── validation/
│ │ │ │ │ ├── validation-workflow.service.spec.ts
│ │ │ │ │ └── validation-workflow.service.ts
│ │ │ │ ├── virtual-environment/
│ │ │ │ │ └── virtual-environment.service.ts
│ │ │ │ ├── workflow-console/
│ │ │ │ │ ├── workflow-console.service.spec.ts
│ │ │ │ │ └── workflow-console.service.ts
│ │ │ │ ├── workflow-graph/
│ │ │ │ │ ├── model/
│ │ │ │ │ │ ├── coeditor-presence.service.spec.ts
│ │ │ │ │ │ ├── coeditor-presence.service.ts
│ │ │ │ │ │ ├── joint-graph-wrapper.spec.ts
│ │ │ │ │ │ ├── joint-graph-wrapper.ts
│ │ │ │ │ │ ├── mock-workflow-data.ts
│ │ │ │ │ │ ├── shared-model-change-handler.ts
│ │ │ │ │ │ ├── shared-model.ts
│ │ │ │ │ │ ├── sync-texera-model.spec.ts
│ │ │ │ │ │ ├── sync-texera-model.ts
│ │ │ │ │ │ ├── workflow-action.service.spec.ts
│ │ │ │ │ │ ├── workflow-action.service.ts
│ │ │ │ │ │ ├── workflow-graph.spec.ts
│ │ │ │ │ │ └── workflow-graph.ts
│ │ │ │ │ └── util/
│ │ │ │ │ ├── workflow-util.service.spec.ts
│ │ │ │ │ └── workflow-util.service.ts
│ │ │ │ ├── workflow-result/
│ │ │ │ │ ├── panel-resize/
│ │ │ │ │ │ ├── panel-resize.service.spec.ts
│ │ │ │ │ │ └── panel-resize.service.ts
│ │ │ │ │ ├── workflow-result.service.spec.ts
│ │ │ │ │ └── workflow-result.service.ts
│ │ │ │ ├── workflow-result-export/
│ │ │ │ │ ├── workflow-result-export.service.spec.ts
│ │ │ │ │ └── workflow-result-export.service.ts
│ │ │ │ ├── workflow-status/
│ │ │ │ │ ├── operator-reuse-cache-status.service.spec.ts
│ │ │ │ │ ├── operator-reuse-cache-status.service.ts
│ │ │ │ │ └── workflow-status.service.ts
│ │ │ │ └── workflow-websocket/
│ │ │ │ ├── workflow-websocket.service.spec.ts
│ │ │ │ └── workflow-websocket.service.ts
│ │ │ └── types/
│ │ │ ├── collab-websocket.interface.ts
│ │ │ ├── custom-json-schema.interface.ts
│ │ │ ├── execute-workflow.interface.ts
│ │ │ ├── operator-schema.interface.ts
│ │ │ ├── result-table.interface.ts
│ │ │ ├── shared-editing.interface.ts
│ │ │ ├── workflow-common.interface.ts
│ │ │ ├── workflow-compiling.interface.ts
│ │ │ └── workflow-websocket.interface.ts
│ │ ├── assets/
│ │ │ ├── .gitkeep
│ │ │ └── logos/
│ │ │ └── site.webmanifest
│ │ ├── environments/
│ │ │ ├── environment.default.ts
│ │ │ ├── environment.prod.ts
│ │ │ ├── environment.test.ts
│ │ │ └── environment.ts
│ │ ├── index.html
│ │ ├── jsdom-svg-polyfill.ts
│ │ ├── main.test.ts
│ │ ├── main.ts
│ │ ├── styles.scss
│ │ ├── test-zone-setup.ts
│ │ ├── tsconfig.app.json
│ │ ├── tsconfig.spec.json
│ │ ├── tsconfig.test.json
│ │ └── vitest-globals.d.ts
│ ├── tools/
│ │ └── jschardet-stub/
│ │ ├── index.js
│ │ └── package.json
│ ├── tsconfig.json
│ ├── vitest.browser.config.ts
│ └── vitest.config.ts
├── licenses/
│ ├── LICENSE-0BSD.txt
│ ├── LICENSE-BSD-2-Clause.txt
│ ├── LICENSE-BSD-3-Clause.txt
│ ├── LICENSE-CDDL-1.0.txt
│ ├── LICENSE-CDDL-1.1.txt
│ ├── LICENSE-EDL-1.0.txt
│ ├── LICENSE-EPL-1.0.txt
│ ├── LICENSE-EPL-2.0.txt
│ ├── LICENSE-ISC.txt
│ ├── LICENSE-MIT-CMU.txt
│ ├── LICENSE-MIT.txt
│ ├── LICENSE-MPL-2.0.txt
│ ├── LICENSE-PSF-2.0.txt
│ ├── LICENSE-Unlicense.txt
│ ├── LICENSE-avro.txt
│ ├── LICENSE-aws-sdk.txt
│ ├── LICENSE-awssdk-third-party-jackson.txt
│ ├── LICENSE-commons-math3.txt
│ ├── LICENSE-glassfish-hk2.txt
│ ├── LICENSE-guice.txt
│ ├── LICENSE-hadoop-shaded.txt
│ ├── LICENSE-hadoop.txt
│ ├── LICENSE-iceberg-bundled-guava.txt
│ ├── LICENSE-iceberg.txt
│ ├── LICENSE-jackson-afterburner.txt
│ ├── LICENSE-jackson-blackbird.txt
│ ├── LICENSE-jackson-core.txt
│ ├── LICENSE-jakarta-ee.txt
│ ├── LICENSE-javax-activation.txt
│ ├── LICENSE-javax-ee-cddl.txt
│ ├── LICENSE-javax-mail.txt
│ ├── LICENSE-jaxb-api.txt
│ ├── LICENSE-jersey.txt
│ ├── LICENSE-jetty-11.0.txt
│ ├── LICENSE-jetty-9.4.txt
│ ├── LICENSE-jetty-jakarta-servlet-api.txt
│ ├── LICENSE-lombok.txt
│ ├── LICENSE-lucene.txt
│ ├── LICENSE-netty-tcnative-boringssl.txt
│ ├── LICENSE-netty.txt
│ ├── LICENSE-pekko-actor.txt
│ ├── LICENSE-pekko-cluster.txt
│ ├── LICENSE-pekko-protobuf-v3.txt
│ ├── LICENSE-pekko-remote.txt
│ ├── LICENSE-postgresql.txt
│ ├── LICENSE-slf4j.txt
│ └── LICENSE-threeten-extra.txt
├── licenses-3rd-party-code/
│ ├── angular.md
│ ├── mbknor-jackson-jsonschema.txt
│ └── monaco-languageclient.txt
├── project/
│ ├── AddMetaInfLicenseFiles.scala
│ ├── JdkOptions.scala
│ ├── build.properties
│ └── plugins.sbt
├── pyright-language-service/
│ ├── README.md
│ ├── package.json
│ ├── src/
│ │ ├── config.json
│ │ ├── language-server-runner.ts
│ │ ├── main.ts
│ │ ├── server-commons.ts
│ │ └── types/
│ │ └── hocon-parser.d.ts
│ └── tsconfig.json
├── sql/
│ ├── changelog.xml
│ ├── docker-compose.yml
│ ├── iceberg_postgres_catalog.sql
│ ├── misc/
│ │ └── tweets.sql
│ ├── texera_ddl.sql
│ ├── texera_lakefs.sql
│ ├── texera_lakekeeper.sql
│ └── updates/
│ ├── 01.sql
│ ├── 02.sql
│ ├── 03.sql
│ ├── 04.sql
│ ├── 05.sql
│ ├── 06.sql
│ ├── 07.sql
│ ├── 08.sql
│ ├── 09.sql
│ ├── 10.sql
│ ├── 11.sql
│ ├── 12.sql
│ ├── 13.sql
│ ├── 14.sql
│ ├── 15.sql
│ ├── 16.sql
│ ├── 17.sql
│ ├── 18.sql
│ ├── 19.sql
│ ├── 20.sql
│ ├── 21.sql
│ └── 22.sql
└── workflow-compiling-service/
├── LICENSE-binary
├── NOTICE-binary
├── build.sbt
├── project/
│ └── build.properties
└── src/
├── main/
│ ├── resources/
│ │ └── workflow-compiling-service-config.yaml
│ └── scala/
│ └── org/
│ └── apache/
│ └── texera/
│ ├── amber/
│ │ └── compiler/
│ │ ├── WorkflowCompiler.scala
│ │ └── model/
│ │ ├── LogicalLink.scala
│ │ ├── LogicalPlan.scala
│ │ └── LogicalPlanPojo.scala
│ └── service/
│ ├── WorkflowCompilingService.scala
│ ├── WorkflowCompilingServiceConfiguration.scala
│ └── resource/
│ ├── HealthCheckResource.scala
│ └── WorkflowCompilationResource.scala
└── test/
├── resources/
│ └── country_sales_small.csv
└── scala/
└── org/
└── apache/
└── texera/
└── service/
└── resource/
└── WorkflowCompilationResourceSpec.scala
Showing preview only (1,154K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (12030 symbols across 497 files)
FILE: agent-service/bin/collect-licenses.ts
type Entry (line 27) | type Entry = { name: string; version: string; license: string };
function normalizeLicense (line 29) | function normalizeLicense(license: unknown): string {
function readPackageJson (line 42) | async function readPackageJson(dir: string): Promise<Entry | null> {
function walk (line 58) | async function walk(nm: string): Promise<Entry[]> {
FILE: agent-service/src/agent/prompts.ts
constant PYTHON_UDF_OPERATOR_TYPES (line 22) | const PYTHON_UDF_OPERATOR_TYPES = ["PythonUDFV2"];
constant R_UDF_OPERATOR_TYPES (line 23) | const R_UDF_OPERATOR_TYPES = ["RUDF"];
constant PYTHON_UDF_INSTRUCTIONS (line 25) | const PYTHON_UDF_INSTRUCTIONS = `## Python UDF Guide
constant R_UDF_INSTRUCTIONS (line 96) | const R_UDF_INSTRUCTIONS = `## R UDF Guide
constant SYSTEM_PROMPT_TEMPLATE (line 154) | const SYSTEM_PROMPT_TEMPLATE = `You are a data science Copilot that help...
function buildAllowedOperatorSchemas (line 259) | function buildAllowedOperatorSchemas(
function buildSystemPrompt (line 284) | function buildSystemPrompt(metadataStore: WorkflowSystemMetadata, allowe...
FILE: agent-service/src/agent/texera-agent.ts
constant PERSIST_DEBOUNCE_MS (line 55) | const PERSIST_DEBOUNCE_MS = 500;
type TexeraAgentConfig (line 57) | interface TexeraAgentConfig {
type AgentMessageResult (line 65) | interface AgentMessageResult {
type ReActStepCallback (line 73) | type ReActStepCallback = (step: ReActStep) => void;
class TexeraAgent (line 84) | class TexeraAgent {
method constructor (line 128) | constructor(config: TexeraAgentConfig) {
method initialize (line 162) | async initialize(): Promise<void> {
method rebuildSystemPrompt (line 177) | private rebuildSystemPrompt(): void {
method buildExecutionConfig (line 182) | private buildExecutionConfig(): ExecutionConfig | undefined {
method createTools (line 194) | private createTools(): Record<string, any> {
method getState (line 234) | getState(): AgentStateEnum {
method getWorkflowState (line 238) | getWorkflowState(): WorkflowState {
method getMetadataStore (line 242) | getMetadataStore(): WorkflowSystemMetadata {
method getHead (line 246) | getHead(): string {
method getAncestorPath (line 250) | getAncestorPath(stepId?: string): string[] {
method getStepsById (line 261) | getStepsById(): Map<string, ReActStep> {
method getWorkflowResultState (line 265) | getWorkflowResultState(): WorkflowResultState {
method getWebsockets (line 269) | getWebsockets(): Set<any> {
method addWebsocket (line 273) | addWebsocket(ws: any): void {
method removeWebsocket (line 277) | removeWebsocket(ws: any): void {
method getReActSteps (line 281) | getReActSteps(): ReActStep[] {
method getVisibleReActSteps (line 289) | getVisibleReActSteps(): ReActStep[] {
method getAllSteps (line 297) | getAllSteps(): ReActStep[] {
method checkout (line 301) | checkout(stepId: string): boolean {
method setStepCallback (line 311) | setStepCallback(callback: ReActStepCallback | null): void {
method generateStepId (line 315) | private generateStepId(): string {
method addStep (line 319) | private addStep(step: ReActStep): void {
method getSystemInfo (line 332) | getSystemInfo(): {
method getSettings (line 355) | getSettings(): AgentSettings {
method updateSettings (line 359) | updateSettings(updates: {
method refreshWorkflowFromBackend (line 411) | async refreshWorkflowFromBackend(): Promise<void> {
method setDelegateConfig (line 432) | setDelegateConfig(config: {
method getDelegateConfig (line 446) | getDelegateConfig():
method setupWorkflowChangeHandlers (line 452) | private setupWorkflowChangeHandlers(): void {
method sendMessage (line 488) | async sendMessage(userMessage: string, messageSource?: "chat" | "feedb...
method getFormattedResultsForDAG (line 727) | private getFormattedResultsForDAG(): Map<string, string> {
method stop (line 736) | stop(): void {
method clearHistory (line 743) | clearHistory(): void {
method getOperatorIdsFromStep (line 761) | private getOperatorIdsFromStep(step: ReActStep): { added: string[]; mo...
method getReActStepsByOperatorIds (line 804) | public getReActStepsByOperatorIds(operatorIds: string[]): ReActStep[] {
method destroy (line 826) | destroy(): void {
FILE: agent-service/src/agent/tools/result-formatting.test.ts
function makeOpInfo (line 26) | function makeOpInfo(overrides: Partial<OperatorInfo> = {}): OperatorInfo {
function makeOperator (line 36) | function makeOperator(id: string, inputPortIDs: string[] = []): Operator...
function makeLink (line 52) | function makeLink(linkID: string, source: [string, string], target: [str...
constant EMPTY_STATE (line 60) | const EMPTY_STATE = new WorkflowState();
function tableLines (line 248) | function tableLines(opInfo: Partial<OperatorInfo>): string[] {
FILE: agent-service/src/agent/tools/result-formatting.ts
function formatOperatorResult (line 24) | function formatOperatorResult(operatorId: string, opInfo: OperatorInfo, ...
function formatInputOutputMetadata (line 67) | function formatInputOutputMetadata(
function jsonToTableFormat (line 102) | function jsonToTableFormat(jsonResult: Record<string, any>[]): string {
FILE: agent-service/src/agent/tools/tools-utility.ts
function createToolResult (line 20) | function createToolResult(message: string): string {
function createErrorResult (line 24) | function createErrorResult(error: string): string {
function formatLinkDescription (line 28) | function formatLinkDescription(sourceOperatorId: string, targetOperatorI...
function formatAddOperatorResult (line 32) | function formatAddOperatorResult(
function formatModifyOperatorResult (line 49) | function formatModifyOperatorResult(
function formatExecuteOperatorResult (line 64) | function formatExecuteOperatorResult(operatorId: string): string {
function formatOperatorError (line 68) | function formatOperatorError(operatorId: string, error: string): string {
FILE: agent-service/src/agent/tools/workflow-crud-tools.ts
type ToolContext (line 39) | interface ToolContext {
constant TOOL_NAME_ADD_OPERATOR (line 48) | const TOOL_NAME_ADD_OPERATOR = "addOperator";
constant TOOL_NAME_MODIFY_OPERATOR (line 49) | const TOOL_NAME_MODIFY_OPERATOR = "modifyOperator";
constant TOOL_NAME_DELETE_OPERATOR (line 50) | const TOOL_NAME_DELETE_OPERATOR = "deleteOperator";
function formatInputArgs (line 52) | function formatInputArgs(args: Record<string, any>): string {
function createAddOperatorTool (line 60) | function createAddOperatorTool(
function createModifyOperatorTool (line 207) | function createModifyOperatorTool(workflowState: WorkflowState, context?...
function createDeleteOperatorTool (line 328) | function createDeleteOperatorTool(workflowState: WorkflowState, _context...
FILE: agent-service/src/agent/tools/workflow-execution-tools.ts
constant TOOL_NAME_EXECUTE_OPERATOR (line 34) | const TOOL_NAME_EXECUTE_OPERATOR = "executeOperator";
type ExecutionConfig (line 36) | interface ExecutionConfig {
class AsyncMutex (line 52) | class AsyncMutex {
method acquire (line 55) | async acquire(): Promise<() => void> {
function getWorkflowMutex (line 71) | function getWorkflowMutex(workflowId: number): AsyncMutex {
type WorkflowValidationResult (line 80) | interface WorkflowValidationResult {
type OperatorValidation (line 85) | interface OperatorValidation {
function validateOperatorSchema (line 90) | function validateOperatorSchema(operatorType: string, operatorProperties...
function validateOperatorConnection (line 96) | function validateOperatorConnection(operatorId: string, workflowState: W...
function combineValidations (line 136) | function combineValidations(...validations: OperatorValidation[]): Opera...
function validateWorkflow (line 150) | function validateWorkflow(workflowState: WorkflowState): WorkflowValidat...
function formatWorkflowValidationErrors (line 169) | function formatWorkflowValidationErrors(validationResult: WorkflowValida...
function buildLogicalPlan (line 182) | function buildLogicalPlan(workflowState: WorkflowState, opsToViewResult?...
function executeWorkflowHttp (line 254) | async function executeWorkflowHttp(
function formatInputOutput (line 330) | function formatInputOutput(
function formatExecutionError (line 365) | function formatExecutionError(
function jsonToTableFormat (line 396) | function jsonToTableFormat(jsonResult: Record<string, any>[]): string {
function executeOperatorAndFormat (line 434) | async function executeOperatorAndFormat(
function createExecuteOperatorTool (line 588) | function createExecuteOperatorTool(
FILE: agent-service/src/agent/util/auto-layout.test.ts
function makeOperator (line 25) | function makeOperator(id: string): OperatorPredicate {
function makeLink (line 37) | function makeLink(linkID: string, src: string, tgt: string): OperatorLink {
constant SENTINEL (line 48) | const SENTINEL = -9999;
constant SENTINEL_POS (line 49) | const SENTINEL_POS = { x: SENTINEL, y: SENTINEL };
FILE: agent-service/src/agent/util/auto-layout.ts
constant LAYOUT_CONFIG (line 25) | const LAYOUT_CONFIG: dagre.GraphLabel = {
constant NODE_WIDTH (line 33) | const NODE_WIDTH = 200;
constant NODE_HEIGHT (line 34) | const NODE_HEIGHT = 80;
function autoLayoutWorkflow (line 36) | function autoLayoutWorkflow(workflowState: WorkflowState): void {
FILE: agent-service/src/agent/util/context-utils.ts
function assembleContext (line 34) | function assembleContext(
function serializeTask (line 104) | function serializeTask(steps: ReActStep[], status: "completed" | "ongoin...
function serializeDag (line 138) | function serializeDag(
function serializeOperator (line 218) | function serializeOperator(
function formatSchema (line 280) | function formatSchema(schema: PortSchema): string {
function parsePortIndex (line 285) | function parsePortIndex(portId: string): string {
FILE: agent-service/src/agent/util/workflow-system-metadata.ts
type OperatorSchemaInfo (line 29) | interface OperatorSchemaInfo {
type CompactOperatorSchema (line 35) | interface CompactOperatorSchema {
constant FILTERED_PROPERTY_KEYS (line 40) | const FILTERED_PROPERTY_KEYS = ["dummyPropertyList"];
constant FILTERED_DEFINITION_KEYS (line 42) | const FILTERED_DEFINITION_KEYS = [
constant COMPACT_SCHEMA_EXCLUDED_KEYS (line 52) | const COMPACT_SCHEMA_EXCLUDED_KEYS = ["propertyOrder", "autofill", "auto...
function filterObjectKeys (line 54) | function filterObjectKeys(obj: any, keysToExclude: string[]): any {
function inlineRefs (line 67) | function inlineRefs(schema: any, definitions: Record<string, any>): any {
function getCompactSchema (line 99) | function getCompactSchema(jsonSchema: any): CompactOperatorSchema | null {
class WorkflowSystemMetadata (line 129) | class WorkflowSystemMetadata {
method getInstance (line 132) | static getInstance(): WorkflowSystemMetadata {
method initializeGlobal (line 139) | static async initializeGlobal(): Promise<WorkflowSystemMetadata> {
method initializeFromBackend (line 152) | async initializeFromBackend(): Promise<void> {
method loadFromMetadata (line 164) | loadFromMetadata(metadata: OperatorMetadata): void {
method isInitialized (line 175) | isInitialized(): boolean {
method getSchema (line 179) | getSchema(operatorType: string): any | undefined {
method getDescription (line 183) | getDescription(operatorType: string): string {
method getAdditionalMetadata (line 187) | getAdditionalMetadata(operatorType: string): any | undefined {
method getAllOperatorTypes (line 191) | getAllOperatorTypes(): Record<string, string> {
method getCompactSchema (line 199) | getCompactSchema(operatorType: string): CompactOperatorSchema | null {
method getAllSchemasAsJson (line 205) | getAllSchemasAsJson(): string {
method getOperatorCount (line 217) | getOperatorCount(): number {
method operatorTypeExists (line 221) | operatorTypeExists(operatorType: string): boolean {
method validateOperatorProperties (line 225) | validateOperatorProperties(operatorType: string, properties: Record<st...
function formatValidationErrors (line 254) | function formatValidationErrors(validation: Validation): string {
function formatCompactSchemaForError (line 260) | function formatCompactSchemaForError(compactSchema: CompactOperatorSchem...
FILE: agent-service/src/agent/util/workflow-utils.ts
function serializePortIdentity (line 32) | function serializePortIdentity(id: number, internal: boolean = false): s...
function parseLogicalOperatorPortID (line 36) | function parseLogicalOperatorPortID(portId: string): { portNumber: numbe...
function getInputLinksByOperatorId (line 48) | function getInputLinksByOperatorId(operatorId: string, links: OperatorLi...
function extractOperatorInputPortSchemaMap (line 52) | function extractOperatorInputPortSchemaMap(
type InputPortInfo (line 100) | interface InputPortInfo {
type OutputPortInfo (line 106) | interface OutputPortInfo {
function inputPortToPortDescription (line 110) | function inputPortToPortDescription(portID: string, inputPortInfo: Input...
function outputPortToPortDescription (line 120) | function outputPortToPortDescription(portID: string, outputPortInfo: Out...
class WorkflowUtilService (line 137) | class WorkflowUtilService {
method constructor (line 142) | constructor(metadataStore: WorkflowSystemMetadata, workflowState: Work...
method getNewOperatorPredicate (line 148) | public getNewOperatorPredicate(operatorType: string, customDisplayName...
FILE: agent-service/src/agent/workflow-result-state.test.ts
function makeInfo (line 24) | function makeInfo(outputTuples: number): OperatorInfo {
FILE: agent-service/src/agent/workflow-result-state.ts
type ResultEntry (line 22) | interface ResultEntry {
class WorkflowResultState (line 35) | class WorkflowResultState {
method constructor (line 38) | constructor(private getAncestorPath: () => string[]) {}
method set (line 40) | set(operatorId: string, stepId: string, operatorInfo: OperatorInfo): v...
method get (line 49) | get(operatorId: string): ResultEntry | undefined {
method getOperatorInfo (line 61) | getOperatorInfo(operatorId: string): OperatorInfo | undefined {
method getAllVisible (line 65) | getAllVisible(): Map<string, ResultEntry> {
method clear (line 80) | clear(): void {
FILE: agent-service/src/agent/workflow-state.test.ts
function makeOperator (line 24) | function makeOperator(id: string, overrides: Partial<OperatorPredicate> ...
function makeLink (line 37) | function makeLink(linkId: string, sourceId: string, targetId: string): O...
FILE: agent-service/src/agent/workflow-state.ts
type ValidationOutput (line 36) | interface ValidationOutput {
constant DEFAULT_WORKFLOW_SETTINGS (line 41) | const DEFAULT_WORKFLOW_SETTINGS: WorkflowSettings = {
class WorkflowState (line 53) | class WorkflowState {
method getWorkflowChangedStream (line 85) | getWorkflowChangedStream(): Observable<unknown> {
method generateOperatorId (line 96) | generateOperatorId(operatorType: string): string {
method generateLinkId (line 100) | generateLinkId(): string {
method addOperator (line 104) | addOperator(operator: OperatorPredicate, position?: Point): void {
method getOperator (line 114) | getOperator(operatorId: string): OperatorPredicate | undefined {
method getAllOperators (line 118) | getAllOperators(): OperatorPredicate[] {
method getAllEnabledOperators (line 122) | getAllEnabledOperators(): OperatorPredicate[] {
method deleteOperator (line 126) | deleteOperator(operatorId: string): boolean {
method updateOperatorProperties (line 147) | updateOperatorProperties(operatorId: string, properties: Record<string...
method updateOperatorDisplayName (line 160) | updateOperatorDisplayName(operatorId: string, displayName: string): bo...
method updateOperatorInputPorts (line 173) | updateOperatorInputPorts(operatorId: string, numInputPorts: number): b...
method updateOperatorPosition (line 196) | updateOperatorPosition(operatorId: string, position: Point): boolean {
method getOperatorPosition (line 204) | getOperatorPosition(operatorId: string): Point | undefined {
method addLink (line 208) | addLink(link: OperatorLink): void {
method getLink (line 213) | getLink(linkId: string): OperatorLink | undefined {
method getAllLinks (line 217) | getAllLinks(): OperatorLink[] {
method deleteLink (line 221) | deleteLink(linkId: string): boolean {
method getLinksConnectedToOperator (line 232) | getLinksConnectedToOperator(operatorId: string): OperatorLink[] {
method getSubDAG (line 238) | getSubDAG(targetOperatorId: string): { operators: OperatorPredicate[];...
method getFrontierOperators (line 270) | getFrontierOperators(depth: number): string[] {
method getValidationChangedStream (line 337) | getValidationChangedStream(): Observable<ValidationOutput> {
method getValidationOutput (line 341) | getValidationOutput(): ValidationOutput {
method setValidationError (line 348) | setValidationError(operatorId: string, error: ValidationError): void {
method clearValidationError (line 353) | clearValidationError(operatorId: string): void {
method setAllValidationErrors (line 358) | setAllValidationErrors(errors: Record<string, ValidationError>): void {
method updateWorkflowEmptyState (line 364) | private updateWorkflowEmptyState(): void {
method emitValidationChanged (line 373) | private emitValidationChanged(): void {
method getWorkflowContent (line 380) | getWorkflowContent(): WorkflowContent {
method setWorkflowContent (line 395) | setWorkflowContent(content: WorkflowContent): void {
method toLogicalPlan (line 418) | toLogicalPlan(targetOperatorId?: string): LogicalPlan {
method addSubscription (line 456) | addSubscription(subscription: Subscription): void {
method reset (line 460) | reset(): void {
method destroy (line 471) | destroy(): void {
FILE: agent-service/src/api/auth-api.ts
function decodeJWT (line 24) | function decodeJWT(token: string): any {
function extractUserFromToken (line 36) | function extractUserFromToken(token: string): UserInfo {
function isTokenExpired (line 46) | function isTokenExpired(token: string): boolean {
function validateToken (line 56) | function validateToken(token: string): boolean {
function createAuthHeaders (line 60) | function createAuthHeaders(token: string): Record<string, string> {
FILE: agent-service/src/api/backend-api.ts
type BackendConfig (line 22) | interface BackendConfig {
function getBackendConfig (line 36) | function getBackendConfig(): BackendConfig {
type InputPortInfo (line 40) | interface InputPortInfo {
type OutputPortInfo (line 46) | interface OutputPortInfo {
type OperatorAdditionalMetadata (line 50) | interface OperatorAdditionalMetadata {
type OperatorSchema (line 62) | interface OperatorSchema {
type GroupInfo (line 69) | interface GroupInfo {
type OperatorMetadata (line 74) | interface OperatorMetadata {
function fetchOperatorMetadata (line 79) | async function fetchOperatorMetadata(): Promise<OperatorMetadata> {
FILE: agent-service/src/api/compile-api.ts
type SchemaAttribute (line 26) | interface SchemaAttribute {
type PortSchema (line 31) | type PortSchema = ReadonlyArray<SchemaAttribute>;
type WorkflowFatalError (line 33) | interface WorkflowFatalError {
type WorkflowCompilationResponse (line 39) | interface WorkflowCompilationResponse {
function compileWorkflowAsync (line 45) | async function compileWorkflowAsync(logicalPlan: LogicalPlan): Promise<W...
FILE: agent-service/src/api/execution-api.ts
type LogicalLink (line 20) | interface LogicalLink {
type LogicalOperator (line 27) | interface LogicalOperator {
type LogicalPlan (line 33) | interface LogicalPlan {
FILE: agent-service/src/api/workflow-api.ts
type Workflow (line 24) | interface Workflow {
type WorkflowPersistRequest (line 34) | interface WorkflowPersistRequest {
constant WORKFLOW_BASE_URL (line 42) | const WORKFLOW_BASE_URL = "workflow";
function persistWorkflow (line 44) | async function persistWorkflow(
function retrieveWorkflow (line 78) | async function retrieveWorkflow(token: string, wid: number): Promise<Wor...
FILE: agent-service/src/logger.ts
function createLogger (line 43) | function createLogger(module: string, bindings: Record<string, unknown> ...
FILE: agent-service/src/server.test.ts
constant API (line 24) | const API = env.API_PREFIX;
function url (line 27) | function url(path: string): string {
function postJson (line 31) | async function postJson(path: string, body: unknown): Promise<Response> {
function patchJson (line 41) | async function patchJson(path: string, body: unknown): Promise<Response> {
function getJson (line 51) | async function getJson(path: string): Promise<Response> {
function del (line 55) | async function del(path: string): Promise<Response> {
function readJson (line 59) | async function readJson<T = unknown>(res: Response): Promise<T> {
FILE: agent-service/src/server.ts
function createAgentInstance (line 46) | async function createAgentInstance(
function getAgentInfo (line 98) | function getAgentInfo(agentId: string, agent: TexeraAgent): AgentInfo {
function getAgent (line 132) | function getAgent(agentId: string): TexeraAgent {
type WsMessage (line 405) | interface WsMessage {
type OperatorResultSummaryWs (line 411) | interface OperatorResultSummaryWs {
type WsOutgoingMessage (line 425) | interface WsOutgoingMessage {
function getOperatorResultSummaries (line 436) | function getOperatorResultSummaries(agent: TexeraAgent): Record<string, ...
function broadcastToAgent (line 462) | function broadcastToAgent(agentId: string, message: WsOutgoingMessage): ...
function buildApp (line 477) | function buildApp() {
function _resetAgentStoreForTests (line 598) | function _resetAgentStoreForTests(): void {
function printStartupMessage (line 603) | function printStartupMessage(app: ReturnType<typeof buildApp>) {
function initializeServices (line 645) | async function initializeServices() {
function start (line 655) | async function start() {
FILE: agent-service/src/types/agent.ts
type AgentState (line 22) | enum AgentState {
type TokenUsage (line 29) | interface TokenUsage {
constant INITIAL_STEP_ID (line 36) | const INITIAL_STEP_ID = "step-initial";
type ReActStep (line 38) | interface ReActStep {
type OperatorResultSerializationMode (line 65) | enum OperatorResultSerializationMode {
type AgentSettings (line 69) | interface AgentSettings {
constant DEFAULT_AGENT_SETTINGS (line 81) | const DEFAULT_AGENT_SETTINGS: Omit<AgentSettings, "systemPrompt"> = {
type UserInfo (line 111) | interface UserInfo {
type AgentDelegateConfig (line 118) | interface AgentDelegateConfig {
type AgentSettingsApi (line 126) | interface AgentSettingsApi {
type AgentInfo (line 137) | interface AgentInfo {
type CreateAgentRequest (line 147) | interface CreateAgentRequest {
type UpdateAgentSettingsRequest (line 156) | interface UpdateAgentSettingsRequest {
FILE: agent-service/src/types/execution.ts
type ConsoleMessage (line 20) | interface ConsoleMessage {
type PortShape (line 25) | interface PortShape {
type OperatorInfo (line 31) | interface OperatorInfo {
type SyncExecutionResult (line 47) | interface SyncExecutionResult {
FILE: agent-service/src/types/workflow.ts
type LogicalPort (line 20) | interface LogicalPort {
type PortIdentity (line 25) | interface PortIdentity {
type PartitionInfo (line 30) | type PartitionInfo =
type PortDescription (line 42) | interface PortDescription {
type OperatorPredicate (line 51) | interface OperatorPredicate {
type LogicalOperator (line 67) | interface LogicalOperator {
type OperatorLink (line 73) | interface OperatorLink {
type LogicalLink (line 79) | interface LogicalLink {
type LogicalPlan (line 86) | interface LogicalPlan {
type Point (line 93) | interface Point {
type CommentBox (line 98) | interface CommentBox {
type WorkflowSettings (line 107) | interface WorkflowSettings {
type WorkflowContent (line 111) | interface WorkflowContent {
type AttributeType (line 119) | type AttributeType = "string" | "integer" | "double" | "boolean" | "long...
type SchemaAttribute (line 121) | interface SchemaAttribute {
type PortSchema (line 126) | type PortSchema = readonly SchemaAttribute[];
type OperatorPortSchemaMap (line 128) | type OperatorPortSchemaMap = Record<string, PortSchema | undefined>;
type OperatorDetail (line 130) | interface OperatorDetail {
type ValidationError (line 139) | type ValidationError = {
type Validation (line 144) | type Validation = { isValid: true } | ValidationError;
FILE: amber/src/main/python/core/architecture/handlers/actorcommand/actor_handler_base.py
class ActorCommandHandler (line 24) | class ActorCommandHandler(ABC):
method __call__ (line 27) | def __call__(
FILE: amber/src/main/python/core/architecture/handlers/actorcommand/backpressure_handler.py
class BackpressureHandler (line 36) | class BackpressureHandler(ActorCommandHandler):
method __call__ (line 39) | def __call__(
FILE: amber/src/main/python/core/architecture/handlers/actorcommand/credit_update_handler.py
class CreditUpdateHandler (line 25) | class CreditUpdateHandler(ActorCommandHandler):
method __call__ (line 28) | def __call__(
FILE: amber/src/main/python/core/architecture/handlers/control/add_input_channel_handler.py
class AddInputChannelHandler (line 25) | class AddInputChannelHandler(ControlHandler):
method add_input_channel (line 26) | async def add_input_channel(self, req: AddInputChannelRequest) -> Empt...
FILE: amber/src/main/python/core/architecture/handlers/control/add_partitioning_handler.py
class AddPartitioningHandler (line 25) | class AddPartitioningHandler(ControlHandler):
method add_partitioning (line 26) | async def add_partitioning(self, req: AddPartitioningRequest) -> Empty...
FILE: amber/src/main/python/core/architecture/handlers/control/assign_port_handler.py
class AssignPortHandler (line 28) | class AssignPortHandler(ControlHandler):
method assign_port (line 29) | async def assign_port(self, req: AssignPortRequest) -> EmptyReturn:
FILE: amber/src/main/python/core/architecture/handlers/control/control_handler_base.py
class ControlHandler (line 21) | class ControlHandler(WorkerServiceBase):
method __init__ (line 22) | def __init__(self, context):
FILE: amber/src/main/python/core/architecture/handlers/control/debug_command_handler.py
class WorkerDebugCommandHandler (line 27) | class WorkerDebugCommandHandler(ControlHandler):
method debug_command (line 28) | async def debug_command(self, req: DebugCommandRequest) -> EmptyReturn:
method translate_debug_command (line 42) | def translate_debug_command(command: str, context: Context) -> str:
FILE: amber/src/main/python/core/architecture/handlers/control/end_channel_handler.py
class EndChannelHandler (line 26) | class EndChannelHandler(ControlHandler):
method end_channel (line 27) | async def end_channel(self, req: EmptyRequest) -> EmptyReturn:
FILE: amber/src/main/python/core/architecture/handlers/control/end_worker_handler.py
class EndWorkerHandler (line 28) | class EndWorkerHandler(ControlHandler):
method end_worker (line 34) | async def end_worker(self, req: EmptyRequest) -> EmptyReturn:
FILE: amber/src/main/python/core/architecture/handlers/control/evaluate_expression_handler.py
class EvaluateExpressionHandler (line 26) | class EvaluateExpressionHandler(ControlHandler):
method evaluate_python_expression (line 27) | async def evaluate_python_expression(
FILE: amber/src/main/python/core/architecture/handlers/control/initialize_executor_handler.py
class InitializeExecutorHandler (line 27) | class InitializeExecutorHandler(ControlHandler):
method initialize_executor (line 28) | async def initialize_executor(self, req: InitializeExecutorRequest) ->...
FILE: amber/src/main/python/core/architecture/handlers/control/no_operation_handler.py
class NoOperationHandler (line 25) | class NoOperationHandler(ControlHandler):
method no_operation (line 26) | async def no_operation(self, req: EmptyRequest) -> EmptyReturn:
FILE: amber/src/main/python/core/architecture/handlers/control/open_executor_handler.py
class OpenExecutorHandler (line 25) | class OpenExecutorHandler(ControlHandler):
method open_executor (line 26) | async def open_executor(self, req: EmptyRequest) -> EmptyReturn:
FILE: amber/src/main/python/core/architecture/handlers/control/pause_worker_handler.py
class PauseWorkerHandler (line 26) | class PauseWorkerHandler(ControlHandler):
method pause_worker (line 27) | async def pause_worker(self, req: EmptyRequest) -> WorkerStateResponse:
FILE: amber/src/main/python/core/architecture/handlers/control/query_statistics_handler.py
class QueryStatisticsHandler (line 28) | class QueryStatisticsHandler(ControlHandler):
method query_statistics (line 29) | async def query_statistics(self, req: EmptyRequest) -> WorkerMetricsRe...
FILE: amber/src/main/python/core/architecture/handlers/control/replay_current_tuple_handler.py
class RetryCurrentTupleHandler (line 31) | class RetryCurrentTupleHandler(ControlHandler):
method retry_current_tuple (line 32) | async def retry_current_tuple(self, req: EmptyRequest) -> EmptyReturn:
FILE: amber/src/main/python/core/architecture/handlers/control/resume_worker_handler.py
class ResumeWorkerHandler (line 26) | class ResumeWorkerHandler(ControlHandler):
method resume_worker (line 27) | async def resume_worker(self, req: EmptyRequest) -> WorkerStateResponse:
FILE: amber/src/main/python/core/architecture/handlers/control/start_channel_handler.py
class StartChannelHandler (line 26) | class StartChannelHandler(ControlHandler):
method start_channel (line 27) | async def start_channel(self, req: EmptyRequest) -> EmptyReturn:
FILE: amber/src/main/python/core/architecture/handlers/control/start_worker_handler.py
class StartWorkerHandler (line 42) | class StartWorkerHandler(ControlHandler):
method start_worker (line 43) | async def start_worker(self, req: EmptyRequest) -> WorkerStateResponse:
FILE: amber/src/main/python/core/architecture/handlers/control/update_executor_handler.py
class UpdateExecutorHandler (line 27) | class UpdateExecutorHandler(ControlHandler):
method update_executor (line 28) | async def update_executor(self, req: UpdateExecutorRequest) -> EmptyRe...
FILE: amber/src/main/python/core/architecture/managers/console_message_manager.py
class ConsoleMessageManager (line 24) | class ConsoleMessageManager:
method __init__ (line 25) | def __init__(self):
method get_messages (line 28) | def get_messages(self, force_flush: bool = False) -> Iterator[ConsoleM...
method put_message (line 31) | def put_message(self, msg: ConsoleMessage) -> None:
FILE: amber/src/main/python/core/architecture/managers/context.py
class Context (line 37) | class Context:
method __init__ (line 46) | def __init__(self, worker_id, input_queue):
method close (line 79) | def close(self):
FILE: amber/src/main/python/core/architecture/managers/debug_manager.py
class DebugManager (line 24) | class DebugManager:
method __init__ (line 25) | def __init__(self, condition: Condition):
method has_debug_command (line 33) | def has_debug_command(self) -> bool:
method has_debug_event (line 36) | def has_debug_event(self) -> bool:
method get_debug_event (line 39) | def get_debug_event(self) -> str:
method put_debug_command (line 46) | def put_debug_command(self, command: str) -> None:
FILE: amber/src/main/python/core/architecture/managers/embedded_control_message_manager.py
class EmbeddedControlMessageManager (line 29) | class EmbeddedControlMessageManager:
method __init__ (line 30) | def __init__(self, actor_id: ActorVirtualIdentity, input_gateway):
method is_ecm_aligned (line 35) | def is_ecm_aligned(
method get_channels_within_scope (line 77) | def get_channels_within_scope(self, ecm: EmbeddedControlMessage) -> Dict[
FILE: amber/src/main/python/core/architecture/managers/exception_manager.py
class ExceptionManager (line 23) | class ExceptionManager:
method __init__ (line 24) | def __init__(self):
method set_exception_info (line 28) | def set_exception_info(self, exc_info: ExceptionInfo) -> None:
method has_exception (line 32) | def has_exception(self) -> bool:
method get_exc_info (line 35) | def get_exc_info(self) -> ExceptionInfo:
FILE: amber/src/main/python/core/architecture/managers/executor_manager.py
class ExecutorManager (line 32) | class ExecutorManager:
method __init__ (line 46) | def __init__(self):
method fs (line 51) | def fs(self) -> FS:
method gen_module_file_name (line 74) | def gen_module_file_name(self) -> Tuple[str, str]:
method load_executor_definition (line 86) | def load_executor_definition(self, code: str) -> type(Operator):
method close (line 114) | def close(self) -> None:
method is_concrete_operator (line 123) | def is_concrete_operator(cls: type) -> bool:
method initialize_executor (line 136) | def initialize_executor(self, code: str, is_source: bool, language: st...
method update_executor (line 170) | def update_executor(self, code: str, is_source: bool) -> None:
FILE: amber/src/main/python/core/architecture/managers/pause_manager.py
class PauseType (line 29) | class PauseType(Enum):
class PauseManager (line 37) | class PauseManager:
method __init__ (line 42) | def __init__(
method pause (line 54) | def pause(self, pause_type: PauseType, change_state=True) -> None:
method pause_input_channel (line 64) | def pause_input_channel(
method resume (line 70) | def resume(self, pause_type: PauseType, change_state=True) -> None:
method is_paused (line 90) | def is_paused(self) -> bool:
FILE: amber/src/main/python/core/architecture/managers/state_manager.py
class InvalidStateException (line 23) | class InvalidStateException(Exception):
class InvalidTransitionException (line 27) | class InvalidTransitionException(Exception):
class StateManager (line 31) | class StateManager:
method __init__ (line 37) | def __init__(self, state_transition_graph: Dict[T, Set[T]], initial_st...
method assert_state (line 41) | def assert_state(self, state: T) -> None:
method confirm_state (line 51) | def confirm_state(self, *states: Union[T, Tuple[T]]) -> bool:
method transit_to (line 60) | def transit_to(self, state: T) -> None:
method get_current_state (line 79) | def get_current_state(self) -> T:
FILE: amber/src/main/python/core/architecture/managers/state_processing_manager.py
class StateProcessingManager (line 23) | class StateProcessingManager:
method __init__ (line 24) | def __init__(self):
method get_input_state (line 28) | def get_input_state(self) -> Optional[State]:
method get_output_state (line 32) | def get_output_state(self) -> Optional[State]:
FILE: amber/src/main/python/core/architecture/managers/statistics_manager.py
class StatisticsManager (line 31) | class StatisticsManager:
method __init__ (line 32) | def __init__(self) -> None:
method get_statistics (line 45) | def get_statistics(self) -> WorkerStatistics:
method increase_input_statistics (line 66) | def increase_input_statistics(self, port_id: PortIdentity, size: int) ...
method increase_output_statistics (line 72) | def increase_output_statistics(self, port_id: PortIdentity, size: int)...
method increase_data_processing_time (line 78) | def increase_data_processing_time(self, time: int) -> None:
method increase_control_processing_time (line 83) | def increase_control_processing_time(self, time: int) -> None:
method update_total_execution_time (line 88) | def update_total_execution_time(self, time: int) -> None:
method initialize_worker_start_time (line 111) | def initialize_worker_start_time(self, time: int) -> None:
FILE: amber/src/main/python/core/architecture/managers/tuple_processing_manager.py
class TupleProcessingManager (line 25) | class TupleProcessingManager:
method __init__ (line 26) | def __init__(self):
method get_internal_marker (line 35) | def get_internal_marker(self) -> Optional[InternalMarker]:
method get_input_tuple (line 39) | def get_input_tuple(self) -> Optional[Tuple]:
method get_output_tuple (line 43) | def get_output_tuple(self) -> Optional[Tuple]:
method get_input_port_id (line 47) | def get_input_port_id(self) -> int:
FILE: amber/src/main/python/core/architecture/packaging/input_manager.py
class Channel (line 36) | class Channel:
method __init__ (line 37) | def __init__(self):
method set_port_id (line 40) | def set_port_id(self, port_id: PortIdentity) -> None:
class WorkerPort (line 44) | class WorkerPort:
method __init__ (line 45) | def __init__(self, schema: Schema):
method add_channel (line 50) | def add_channel(self, channel: ChannelIdentity) -> None:
method get_channels (line 53) | def get_channels(self) -> Set[ChannelIdentity]:
method get_schema (line 56) | def get_schema(self) -> Schema:
class InputManager (line 60) | class InputManager:
method __init__ (line 63) | def __init__(self, worker_id: str, input_queue: InternalQueue):
method complete_current_port (line 73) | def complete_current_port(self, channel_id: ChannelIdentity) -> None:
method all_ports_completed (line 77) | def all_ports_completed(self) -> bool:
method set_up_input_port_mat_reader_threads (line 80) | def set_up_input_port_mat_reader_threads(
method get_input_port_mat_reader_threads (line 96) | def get_input_port_mat_reader_threads(
method start_input_port_mat_reader_threads (line 101) | def start_input_port_mat_reader_threads(self):
method get_all_channel_ids (line 114) | def get_all_channel_ids(self) -> Dict[ChannelIdentity, Channel].keys:
method get_all_data_channel_ids (line 117) | def get_all_data_channel_ids(self) -> Set[ChannelIdentity]:
method add_input_port (line 120) | def add_input_port(
method get_port_id (line 138) | def get_port_id(self, channel_id: ChannelIdentity) -> PortIdentity:
method get_port (line 141) | def get_port(self, port_id: PortIdentity) -> WorkerPort:
method register_input (line 144) | def register_input(
method process_data_payload (line 156) | def process_data_payload(
method _process_data (line 168) | def _process_data(self, table: Table) -> Iterator[Tuple]:
FILE: amber/src/main/python/core/architecture/packaging/output_manager.py
class OutputManager (line 71) | class OutputManager:
method __init__ (line 72) | def __init__(self, worker_id: str):
method is_missing_output_ports (line 90) | def is_missing_output_ports(self):
method add_output_port (line 106) | def add_output_port(
method set_up_port_storage_writer (line 124) | def set_up_port_storage_writer(self, port_id: PortIdentity, storage_ur...
method get_port (line 147) | def get_port(self, port_id=None) -> WorkerPort:
method get_port_ids (line 150) | def get_port_ids(self) -> typing.List[PortIdentity]:
method get_output_channel_ids (line 153) | def get_output_channel_ids(self) -> typing.List[ChannelIdentity]:
method save_tuple_to_storage_if_needed (line 156) | def save_tuple_to_storage_if_needed(self, tuple_: Tuple, port_id=None)...
method close_port_storage_writers (line 174) | def close_port_storage_writers(self) -> None:
method add_partitioning (line 188) | def add_partitioning(self, tag: PhysicalLink, partitioning: Partitioni...
method tuple_to_batch (line 211) | def tuple_to_batch(
method emit_ecm (line 224) | def emit_ecm(
method emit_state (line 241) | def emit_state(
method tuple_to_frame (line 261) | def tuple_to_frame(self, tuples: typing.List[Tuple]) -> DataFrame:
FILE: amber/src/main/python/core/architecture/rpc/async_rpc_client.py
function async_run (line 44) | def async_run(func: Callable[..., Any]) -> Callable[..., Any]:
class AsyncRPCClient (line 58) | class AsyncRPCClient:
method __init__ (line 59) | def __init__(self, output_queue: InternalQueue, context: Context):
method _assign_context (line 76) | def _assign_context(
method _wrap_all_async_methods_with_async_run (line 104) | def _wrap_all_async_methods_with_async_run(self, instance: Any) -> None:
method controller_stub (line 111) | def controller_stub(self) -> ControllerServiceStub:
method get_worker_interface (line 117) | def get_worker_interface(self, target_worker) -> WorkerServiceStub:
method _create_proxy (line 127) | def _create_proxy(self, service_class, target_worker: ActorVirtualIden...
method _create_future (line 203) | def _create_future(self, to: ActorVirtualIdentity) -> Future:
method receive (line 216) | def receive(
method _fulfill_promise (line 227) | def _fulfill_promise(
FILE: amber/src/main/python/core/architecture/rpc/async_rpc_handler_initializer.py
class AsyncRPCHandlerInitializer (line 53) | class AsyncRPCHandlerInitializer(
FILE: amber/src/main/python/core/architecture/rpc/async_rpc_server.py
class AsyncRPCServer (line 40) | class AsyncRPCServer:
method __init__ (line 41) | def __init__(self, output_queue: InternalQueue, context: Context):
method _wrap_as_stream (line 48) | def _wrap_as_stream(self, request: ControlRequest) -> grpclib.server.S...
method receive (line 71) | def receive(self, from_: ChannelIdentity, control_invocation: ControlI...
method look_up (line 148) | def look_up(self, method_name: str) -> grpclib.const.Handler:
method _no_reply_needed (line 153) | def _no_reply_needed(command_id: int) -> bool:
FILE: amber/src/main/python/core/architecture/sendsemantics/broad_cast_partitioner.py
class BroadcastPartitioner (line 34) | class BroadcastPartitioner(Partitioner):
method __init__ (line 35) | def __init__(self, partitioning: BroadcastPartitioning):
method add_tuple_to_batch (line 44) | def add_tuple_to_batch(
method flush (line 54) | def flush(
method flush_state (line 67) | def flush_state(
method reset (line 81) | def reset(self) -> None:
FILE: amber/src/main/python/core/architecture/sendsemantics/hash_based_shuffle_partitioner.py
class HashBasedShufflePartitioner (line 35) | class HashBasedShufflePartitioner(Partitioner):
method __init__ (line 36) | def __init__(self, partitioning: HashBasedShufflePartitioning):
method add_tuple_to_batch (line 55) | def add_tuple_to_batch(
method flush (line 71) | def flush(
method flush_state (line 81) | def flush_state(
FILE: amber/src/main/python/core/architecture/sendsemantics/one_to_one_partitioner.py
class OneToOnePartitioner (line 34) | class OneToOnePartitioner(Partitioner):
method __init__ (line 35) | def __init__(self, partitioning: OneToOnePartitioning, worker_id: str):
method add_tuple_to_batch (line 45) | def add_tuple_to_batch(
method flush (line 54) | def flush(
method flush_state (line 63) | def flush_state(
method reset (line 74) | def reset(self) -> None:
FILE: amber/src/main/python/core/architecture/sendsemantics/partitioner.py
class Partitioner (line 31) | class Partitioner(ABC):
method __init__ (line 32) | def __init__(self, partitioning: Message):
method add_tuple_to_batch (line 35) | def add_tuple_to_batch(
method flush (line 40) | def flush(
method flush_state (line 45) | def flush_state(
method reset (line 52) | def reset(self) -> None:
method __repr__ (line 55) | def __repr__(self):
FILE: amber/src/main/python/core/architecture/sendsemantics/range_based_shuffle_partitioner.py
class RangeBasedShufflePartitioner (line 35) | class RangeBasedShufflePartitioner(Partitioner):
method __init__ (line 36) | def __init__(self, partitioning: RangeBasedShufflePartitioning):
method get_receiver_index (line 63) | def get_receiver_index(self, column_val) -> int:
method add_tuple_to_batch (line 72) | def add_tuple_to_batch(
method flush (line 84) | def flush(
method flush_state (line 94) | def flush_state(
FILE: amber/src/main/python/core/architecture/sendsemantics/round_robin_partitioner.py
class RoundRobinPartitioner (line 34) | class RoundRobinPartitioner(Partitioner):
method __init__ (line 35) | def __init__(self, partitioning: RoundRobinPartitioning):
method add_tuple_to_batch (line 54) | def add_tuple_to_batch(
method flush (line 65) | def flush(
method flush_state (line 76) | def flush_state(
FILE: amber/src/main/python/core/models/__init__.py
class ExceptionInfo (line 39) | class ExceptionInfo(NamedTuple):
FILE: amber/src/main/python/core/models/batch.py
class Batch (line 24) | class Batch(pandas.DataFrame):
method __init__ (line 25) | def __init__(self, batch_like: BatchLike):
FILE: amber/src/main/python/core/models/internal_marker.py
class InternalMarker (line 19) | class InternalMarker:
class StartChannel (line 28) | class StartChannel(InternalMarker):
class EndChannel (line 32) | class EndChannel(InternalMarker):
FILE: amber/src/main/python/core/models/internal_queue.py
class InternalQueueElement (line 37) | class InternalQueueElement(QueueElement):
class DataElement (line 42) | class DataElement(InternalQueueElement):
class DCMElement (line 47) | class DCMElement(InternalQueueElement):
class ECMElement (line 52) | class ECMElement(InternalQueueElement):
class InternalQueue (line 59) | class InternalQueue(IQueue):
class DisableType (line 60) | class DisableType(Enum):
method __init__ (line 64) | def __init__(self):
method is_empty (line 71) | def is_empty(self, key=None) -> bool:
method get (line 74) | def get(self) -> T:
method put (line 77) | def put(self, item: T) -> None:
method disable (line 91) | def disable(self, channel_id: ChannelIdentity) -> None:
method enable (line 94) | def enable(self, channel_id: ChannelIdentity) -> None:
method is_control_empty (line 97) | def is_control_empty(self) -> bool:
method is_data_empty (line 104) | def is_data_empty(self) -> bool:
method __len__ (line 111) | def __len__(self) -> int:
method size (line 114) | def size(self) -> int:
method size_control (line 117) | def size_control(self) -> int:
method size_data (line 124) | def size_data(self) -> int:
method enable_data (line 131) | def enable_data(self, disable_type: DisableType) -> bool:
method disable_data (line 142) | def disable_data(self, disable_type: DisableType) -> None:
method in_mem_size (line 149) | def in_mem_size(self) -> int:
method is_data_enabled (line 156) | def is_data_enabled(self) -> bool:
FILE: amber/src/main/python/core/models/operator.py
class Operator (line 32) | class Operator(ABC):
class PythonTemplateDecoder (line 37) | class PythonTemplateDecoder:
class Decoder (line 38) | class Decoder(Protocol):
method to_str (line 41) | def to_str(self, data: Union[str, bytes]) -> str: ...
class StdlibBase64Decoder (line 43) | class StdlibBase64Decoder:
method to_str (line 46) | def to_str(self, data: Union[str, bytes]) -> str:
method __init__ (line 51) | def __init__(
method _build_cached_decoder (line 59) | def _build_cached_decoder(self, cache_size: int):
method decode (line 66) | def decode(self, data: Union[str, bytes]) -> str:
method _get_template_decoder (line 69) | def _get_template_decoder(self) -> "Operator.PythonTemplateDecoder":
method decode_python_template (line 74) | def decode_python_template(self, data: Union[str, bytes]) -> str:
method is_source (line 81) | def is_source(self) -> bool:
method is_source (line 92) | def is_source(self, value: bool) -> None:
method open (line 95) | def open(self) -> None:
method close (line 102) | def close(self) -> None:
method process_state (line 108) | def process_state(self, state: State, port: int) -> Optional[State]:
method produce_state_on_start (line 118) | def produce_state_on_start(self, port: int) -> Optional[State]:
method produce_state_on_finish (line 127) | def produce_state_on_finish(self, port: int) -> Optional[State]:
class TupleOperatorV2 (line 137) | class TupleOperatorV2(Operator):
method process_tuple (line 144) | def process_tuple(self, tuple_: Tuple, port: int) -> Iterator[Optional...
method on_finish (line 155) | def on_finish(self, port: int) -> Iterator[Optional[TupleLike]]:
class SourceOperator (line 166) | class SourceOperator(TupleOperatorV2):
method produce (line 170) | def produce(self) -> Iterator[Union[TupleLike, TableLike, None]]:
method on_finish (line 180) | def on_finish(self, port: int) -> Iterator[Optional[TupleLike]]:
method process_tuple (line 186) | def process_tuple(self, tuple_: Tuple, port: int) -> Iterator[Optional...
class BatchOperator (line 190) | class BatchOperator(TupleOperatorV2):
method __init__ (line 198) | def __init__(self):
method _validate_batch_size (line 205) | def _validate_batch_size(value):
method process_tuple (line 214) | def process_tuple(self, tuple_: Tuple, port: int) -> Iterator[Optional...
method _process_batch (line 223) | def _process_batch(self, port: int) -> Iterator[Optional[BatchLike]]:
method on_finish (line 244) | def on_finish(self, port: int) -> Iterator[Optional[BatchLike]]:
method process_batch (line 249) | def process_batch(self, batch: Batch, port: int) -> Iterator[Optional[...
class TableOperator (line 262) | class TableOperator(TupleOperatorV2):
method __init__ (line 268) | def __init__(self):
method process_tuple (line 274) | def process_tuple(self, tuple_: Tuple, port: int) -> Iterator[Optional...
method on_finish (line 278) | def on_finish(self, port: int) -> Iterator[Optional[TableLike]]:
method process_table (line 283) | def process_table(self, table: Table, port: int) -> Iterator[Optional[...
FILE: amber/src/main/python/core/models/payload.py
class DataPayload (line 25) | class DataPayload:
class DataFrame (line 30) | class DataFrame(DataPayload):
class StateFrame (line 35) | class StateFrame(DataPayload):
FILE: amber/src/main/python/core/models/schema/arrow_schema_utils.py
function arrow_schema_to_attr_types (line 33) | def arrow_schema_to_attr_types(arrow_schema: pa.Schema) -> dict[str, Att...
function attr_types_to_arrow_schema (line 48) | def attr_types_to_arrow_schema(
FILE: amber/src/main/python/core/models/schema/attribute_type.py
class AttributeType (line 26) | class AttributeType(Enum):
FILE: amber/src/main/python/core/models/schema/attribute_type_utils.py
function detect_attribute_type_from_arrow_field (line 36) | def detect_attribute_type_from_arrow_field(field: pa.Field) -> Attribute...
function create_arrow_field_with_metadata (line 56) | def create_arrow_field_with_metadata(
FILE: amber/src/main/python/core/models/schema/schema.py
class Schema (line 32) | class Schema:
method __init__ (line 49) | def __init__(
method add (line 61) | def add(self, attr_name: str, attr_type: AttributeType) -> None:
method _from_raw_schema (line 72) | def _from_raw_schema(self, raw_schema: Mapping[str, str]) -> None:
method _from_arrow_schema (line 83) | def _from_arrow_schema(self, arrow_schema: pa.Schema) -> None:
method as_arrow_schema (line 95) | def as_arrow_schema(self) -> pa.Schema:
method get_attr_names (line 102) | def get_attr_names(self) -> List[str]:
method get_attr_type (line 109) | def get_attr_type(self, attr_name: str) -> AttributeType:
method as_key_value_pairs (line 117) | def as_key_value_pairs(self) -> List[Tuple[str, AttributeType]]:
method get_partial_schema (line 124) | def get_partial_schema(self, attribute_names: List[str]) -> "Schema":
method __eq__ (line 138) | def __eq__(self, other: object) -> bool:
method __str__ (line 145) | def __str__(self) -> str:
FILE: amber/src/main/python/core/models/single_blocking_io.py
class SingleBlockingIO (line 25) | class SingleBlockingIO(IO):
method __init__ (line 37) | def __init__(self, condition: Condition):
method write (line 42) | def write(self, s: str) -> None:
method flush (line 50) | def flush(self) -> None:
method readline (line 60) | def readline(self, limit=None) -> str:
method close (line 82) | def close(self) -> None:
method fileno (line 85) | def fileno(self) -> int:
method isatty (line 88) | def isatty(self) -> bool:
method read (line 91) | def read(self, __n: int = ...) -> AnyStr:
method readable (line 94) | def readable(self) -> bool:
method readlines (line 97) | def readlines(self, __hint: int = ...) -> list[AnyStr]:
method seek (line 100) | def seek(self, __offset: int, __whence: int = ...) -> int:
method seekable (line 103) | def seekable(self) -> bool:
method tell (line 106) | def tell(self) -> int:
method truncate (line 109) | def truncate(self, __size: int | None = ...) -> int:
method writable (line 112) | def writable(self) -> bool:
method writelines (line 115) | def writelines(self, __lines: Iterable[AnyStr]) -> None:
method __next__ (line 118) | def __next__(self) -> AnyStr:
method __iter__ (line 121) | def __iter__(self) -> Iterator[AnyStr]:
method __enter__ (line 124) | def __enter__(self) -> IO[AnyStr]:
method __exit__ (line 127) | def __exit__(
FILE: amber/src/main/python/core/models/state.py
class State (line 26) | class State(dict):
method to_json (line 30) | def to_json(self) -> str:
method to_tuple (line 33) | def to_tuple(self) -> Tuple:
method from_json (line 37) | def from_json(cls, payload: str) -> "State":
method from_tuple (line 41) | def from_tuple(cls, row: Tuple) -> "State":
function _to_json_value (line 50) | def _to_json_value(value: Any) -> Any:
function _from_json_value (line 67) | def _from_json_value(value: Any) -> Any:
FILE: amber/src/main/python/core/models/table.py
class Table (line 27) | class Table(pandas.DataFrame):
method from_table (line 29) | def from_table(table):
method from_data_frame (line 33) | def from_data_frame(df):
method from_tuple_likes (line 37) | def from_tuple_likes(tuple_likes: Iterator[TupleLike]):
method __init__ (line 55) | def __init__(self, table_like):
method as_tuples (line 69) | def as_tuples(self) -> Iterator[Tuple]:
method __eq__ (line 78) | def __eq__(self, other: "Table") -> bool:
function all_output_to_tuple (line 85) | def all_output_to_tuple(output) -> Iterator[Tuple]:
FILE: amber/src/main/python/core/models/tuple.py
class TupleLike (line 39) | class TupleLike(Protocol):
method __getitem__ (line 40) | def __getitem__(self, item: typing.Union[str, int]) -> Field: ...
method __setitem__ (line 42) | def __setitem__(self, key: typing.Union[str, int], value: Field) -> No...
class ArrowTableTupleProvider (line 45) | class ArrowTableTupleProvider:
method __init__ (line 50) | def __init__(self, table: pyarrow.Table):
method __iter__ (line 59) | def __iter__(self) -> Iterator[Callable]:
method __next__ (line 65) | def __next__(self) -> Callable:
function double_to_long (line 115) | def double_to_long(value: float) -> int:
function int_32 (line 128) | def int_32(value: int) -> int:
function java_hash_bool (line 137) | def java_hash_bool(value: bool) -> int:
function java_hash_long (line 146) | def java_hash_long(value: int) -> int:
function java_hash_bytes (line 155) | def java_hash_bytes(bytes: Iterator[int], init: int, salt: int):
class Tuple (line 169) | class Tuple:
method __init__ (line 174) | def __init__(
method __getitem__ (line 196) | def __getitem__(self, item: typing.Union[int, str]) -> Field:
method __setitem__ (line 221) | def __setitem__(self, field_name: str, field_value: Field) -> None:
method as_series (line 231) | def as_series(self) -> pandas.Series:
method as_dict (line 235) | def as_dict(self) -> "OrderedDict[str, Field]":
method as_key_value_pairs (line 246) | def as_key_value_pairs(self) -> List[typing.Tuple[str, Field]]:
method get_serialized_field (line 249) | def get_serialized_field(self, field_name: str) -> Field:
method get_field_names (line 270) | def get_field_names(self) -> typing.Tuple[str]:
method get_fields (line 273) | def get_fields(self, output_field_names=None) -> typing.Tuple[Field, ....
method finalize (line 281) | def finalize(self, schema: Schema) -> None:
method cast_to_schema (line 298) | def cast_to_schema(self, schema: Schema) -> None:
method validate_schema (line 330) | def validate_schema(self, schema: Schema) -> None:
method get_partial_tuple (line 366) | def get_partial_tuple(self, attribute_names: List[str]) -> "Tuple":
method __iter__ (line 382) | def __iter__(self) -> Iterator[Field]:
method __str__ (line 385) | def __str__(self) -> str:
method __eq__ (line 393) | def __eq__(self, other: Any) -> bool:
method __ne__ (line 400) | def __ne__(self, other) -> bool:
method __len__ (line 403) | def __len__(self) -> int:
method __contains__ (line 406) | def __contains__(self, __x: object) -> bool:
method __hash__ (line 409) | def __hash__(self) -> int:
method in_mem_size (line 441) | def in_mem_size(self) -> int:
FILE: amber/src/main/python/core/models/type/large_binary.py
class largebinary (line 28) | class largebinary:
method __init__ (line 53) | def __init__(self, uri: Optional[str] = None):
method uri (line 76) | def uri(self) -> str:
method get_bucket_name (line 80) | def get_bucket_name(self) -> str:
method get_object_key (line 84) | def get_object_key(self) -> str:
method __str__ (line 88) | def __str__(self) -> str:
method __repr__ (line 91) | def __repr__(self) -> str:
method __eq__ (line 94) | def __eq__(self, other) -> bool:
method __hash__ (line 97) | def __hash__(self) -> int:
FILE: amber/src/main/python/core/proxy/proxy_client.py
class ProxyClient (line 31) | class ProxyClient(FlightClient):
method __init__ (line 32) | def __init__(
method call_action (line 50) | def call_action(
method send_data (line 82) | def send_data(self, command: bytes, table: Optional[Table]) -> int:
method _handshake (line 103) | def _handshake(self, handshake_port: int) -> None:
FILE: amber/src/main/python/core/proxy/proxy_server.py
function get_free_local_port (line 37) | def get_free_local_port():
class ProxyServer (line 44) | class ProxyServer(FlightServerBase):
method ack (line 65) | def ack(original_func: Optional[Callable] = None, msg="ack"):
method __init__ (line 106) | def __init__(
method do_put (line 176) | def do_put(
method list_actions (line 210) | def list_actions(self, context: ServerCallContext) -> Iterator[Tuple[s...
method do_action (line 221) | def do_action(self, context: ServerCallContext, action: Action) -> Ite...
method register (line 258) | def register(self, name: str, action: Callable, description: str = "")...
method register_data_handler (line 278) | def register_data_handler(self, handler: Callable) -> None:
method register_control_handler (line 292) | def register_control_handler(self, handler: Callable) -> None:
method register_actor_message_handler (line 306) | def register_actor_message_handler(self, handler: Callable) -> None:
method graceful_shutdown (line 312) | def graceful_shutdown(self):
method get_port_number (line 318) | def get_port_number(self):
FILE: amber/src/main/python/core/python_worker.py
class PythonWorker (line 27) | class PythonWorker(Runnable, Stoppable):
method __init__ (line 28) | def __init__(self, worker_id: str, host: str, output_port: int):
method run (line 47) | def run(self) -> None:
method stop (line 70) | def stop(self):
FILE: amber/src/main/python/core/runnables/data_processor.py
class DataProcessor (line 40) | class DataProcessor(Runnable, Stoppable):
method __init__ (line 41) | def __init__(self, context: Context):
method run (line 45) | def run(self) -> None:
method process_internal_marker (line 77) | def process_internal_marker(self, internal_marker: InternalMarker) -> ...
method process_state (line 88) | def process_state(self, state: State) -> None:
method process_tuple (line 96) | def process_tuple(self) -> None:
method _executor_session (line 107) | def _executor_session(self):
method _set_output_tuple (line 133) | def _set_output_tuple(self, output_iterator: Iterator[Optional[TupleLi...
method _set_output_state (line 151) | def _set_output_state(self, output_state: State) -> None:
method _switch_context (line 159) | def _switch_context(self) -> None:
method _check_and_process_debug_command (line 168) | def _check_and_process_debug_command(self) -> None:
method _report_exception (line 178) | def _report_exception(self, exc_info: ExceptionInfo):
method stop (line 198) | def stop(self):
FILE: amber/src/main/python/core/runnables/heartbeat.py
class Heartbeat (line 31) | class Heartbeat(Runnable, Stoppable):
method __init__ (line 32) | def __init__(
method run (line 47) | def run(self) -> None:
method _check_heartbeat (line 80) | def _check_heartbeat(self) -> bool:
method stop (line 99) | def stop(self):
FILE: amber/src/main/python/core/runnables/main_loop.py
class MainLoop (line 70) | class MainLoop(StoppableQueueBlockingRunnable):
method __init__ (line 71) | def __init__(
method complete (line 90) | def complete(self) -> None:
method _check_and_process_control (line 106) | def _check_and_process_control(self) -> None:
method pre_start (line 130) | def pre_start(self) -> None:
method receive (line 136) | def receive(self, next_entry: QueueElement) -> None:
method process_input_tuple (line 158) | def process_input_tuple(self) -> None:
method process_input_state (line 192) | def process_input_state(self) -> None:
method process_tuple_with_udf (line 206) | def process_tuple_with_udf(self) -> Iterator[Optional[Tuple]]:
method _process_dcm (line 222) | def _process_dcm(self, dcm_element: DCMElement) -> None:
method _process_tuple (line 242) | def _process_tuple(self, tuple_: Tuple) -> None:
method _process_state (line 247) | def _process_state(self, state_: State) -> None:
method _process_start_channel (line 252) | def _process_start_channel(self) -> None:
method _process_end_channel (line 258) | def _process_end_channel(self) -> None:
method _process_ecm (line 292) | def _process_ecm(self, ecm_element: ECMElement):
method _send_ecm_to_data_channels (line 344) | def _send_ecm_to_data_channels(
method _send_ecm_to_channel (line 366) | def _send_ecm_to_channel(
method _process_data_element (line 378) | def _process_data_element(self, data_element: DataElement) -> None:
method _send_console_message (line 424) | def _send_console_message(self, console_message: ConsoleMessage):
method _switch_context (line 429) | def _switch_context(self) -> None:
method _check_and_report_debug_event (line 444) | def _check_and_report_debug_event(self) -> None:
method _check_exception (line 460) | def _check_exception(self) -> None:
method _check_and_report_console_messages (line 465) | def _check_and_report_console_messages(self, force_flush=False) -> None:
method _post_switch_context_checks (line 469) | def _post_switch_context_checks(self) -> None:
FILE: amber/src/main/python/core/runnables/network_receiver.py
class NetworkReceiver (line 56) | class NetworkReceiver(Runnable, Stoppable):
method __init__ (line 62) | def __init__(
method register_shutdown (line 147) | def register_shutdown(self, shutdown: callable) -> None:
method run (line 154) | def run(self) -> None:
method stop (line 160) | def stop(self):
method proxy_server (line 165) | def proxy_server(self):
method register_actor_command_handler (line 168) | def register_actor_command_handler(self, handler: ActorCommandHandler)...
method look_up (line 171) | def look_up(self, cmd: ActorCommand) -> ActorCommandHandler:
FILE: amber/src/main/python/core/runnables/network_sender.py
class NetworkSender (line 41) | class NetworkSender(StoppableQueueBlockingRunnable):
method __init__ (line 46) | def __init__(
method receive (line 59) | def receive(self, next_entry: InternalQueueElement):
method _send_ecm (line 70) | def _send_ecm(self, to: ChannelIdentity, ecm: EmbeddedControlMessage) ...
method _send_data (line 88) | def _send_data(self, to: ChannelIdentity, data_payload: DataPayload) -...
method _send_control (line 111) | def _send_control(
FILE: amber/src/main/python/core/storage/document_factory.py
class DocumentFactory (line 38) | class DocumentFactory:
method sanitize_uri_path (line 47) | def sanitize_uri_path(uri):
method create_document (line 59) | def create_document(uri: str, schema: Schema) -> VirtualDocument:
method open_document (line 94) | def open_document(uri: str) -> typing.Tuple[VirtualDocument, Optional[...
FILE: amber/src/main/python/core/storage/iceberg/iceberg_catalog_instance.py
class IcebergCatalogInstance (line 28) | class IcebergCatalogInstance:
method get_instance (line 40) | def get_instance(cls):
method replace_instance (line 73) | def replace_instance(cls, catalog: Catalog):
FILE: amber/src/main/python/core/storage/iceberg/iceberg_document.py
class IcebergDocument (line 41) | class IcebergDocument(VirtualDocument[T]):
method __init__ (line 58) | def __init__(
method get_uri (line 75) | def get_uri(self) -> ParseResult:
method clear (line 84) | def clear(self):
method get (line 91) | def get(self) -> Iterator[T]:
method get_range (line 95) | def get_range(self, from_index: int, until_index: int) -> Iterator[T]:
method get_after (line 99) | def get_after(self, offset: int) -> Iterator[T]:
method get_count (line 103) | def get_count(self) -> int:
method writer (line 110) | def writer(self, writer_identifier: str):
method _get_using_file_sequence_order (line 126) | def _get_using_file_sequence_order(
class IcebergIterator (line 142) | class IcebergIterator(Iterator[T]):
method __init__ (line 147) | def __init__(
method _load_table_metadata (line 180) | def _load_table_metadata(self) -> Optional[Table]:
method _seek_to_usable_file (line 184) | def _seek_to_usable_file(self) -> Iterator[FileScanTask]:
method _extract_sorted_file_scan_tasks (line 220) | def _extract_sorted_file_scan_tasks(self, current_snapshot):
method __iter__ (line 241) | def __iter__(self) -> Iterator[T]:
method __next__ (line 244) | def __next__(self) -> T:
method _skip_records (line 275) | def _skip_records(iterator, count):
FILE: amber/src/main/python/core/storage/iceberg/iceberg_table_writer.py
class IcebergTableWriter (line 32) | class IcebergTableWriter(BufferedItemWriter[T]):
method __init__ (line 49) | def __init__(
method buffer_size (line 75) | def buffer_size(self) -> int:
method open (line 78) | def open(self) -> None:
method put_one (line 82) | def put_one(self, item: T) -> None:
method remove_one (line 88) | def remove_one(self, item: T) -> None:
method _flush_buffer (line 92) | def _flush_buffer(self) -> None:
method close (line 120) | def close(self) -> None:
method buffer_size (line 126) | def buffer_size(self, value):
FILE: amber/src/main/python/core/storage/iceberg/iceberg_utils.py
function encode_large_binary_field_name (line 63) | def encode_large_binary_field_name(field_name: str, attr_type) -> str:
function decode_large_binary_field_name (line 70) | def decode_large_binary_field_name(field_name: str) -> str:
function iceberg_schema_to_amber_schema (line 77) | def iceberg_schema_to_amber_schema(iceberg_schema: Schema):
function amber_schema_to_iceberg_schema (line 107) | def amber_schema_to_iceberg_schema(amber_schema) -> Schema:
function create_postgres_catalog (line 127) | def create_postgres_catalog(
function create_rest_catalog (line 156) | def create_rest_catalog(
function create_table (line 194) | def create_table(
function load_table_metadata (line 231) | def load_table_metadata(
function read_data_file_as_arrow_table (line 251) | def read_data_file_as_arrow_table(
function amber_tuples_to_arrow_table (line 265) | def amber_tuples_to_arrow_table(
function arrow_table_to_amber_tuples (line 290) | def arrow_table_to_amber_tuples(
FILE: amber/src/main/python/core/storage/model/buffered_item_writer.py
class BufferedItemWriter (line 25) | class BufferedItemWriter(ABC, Generic[T]):
method buffer_size (line 35) | def buffer_size(self) -> int:
method open (line 43) | def open(self) -> None:
method close (line 51) | def close(self) -> None:
method put_one (line 59) | def put_one(self, item: T) -> None:
method remove_one (line 68) | def remove_one(self, item: T) -> None:
FILE: amber/src/main/python/core/storage/model/readonly_virtual_document.py
class ReadonlyVirtualDocument (line 26) | class ReadonlyVirtualDocument(ABC, Generic[T]):
method get_uri (line 35) | def get_uri(self) -> ParseResult:
method get_item (line 43) | def get_item(self, i: int) -> T:
method get (line 52) | def get(self) -> Iterator[T]:
method get_range (line 60) | def get_range(self, from_index: int, until_index: int) -> Iterator[T]:
method get_after (line 71) | def get_after(self, offset: int) -> Iterator[T]:
method get_count (line 80) | def get_count(self) -> int:
FILE: amber/src/main/python/core/storage/model/virtual_document.py
class VirtualDocument (line 30) | class VirtualDocument(ReadonlyVirtualDocument[T], ABC):
method get_uri (line 39) | def get_uri(self) -> ParseResult:
method get_item (line 43) | def get_item(self, i: int) -> T:
method get (line 47) | def get(self) -> Iterator[T]:
method get_range (line 51) | def get_range(self, from_index: int, until_index: int) -> Iterator[T]:
method get_after (line 55) | def get_after(self, offset: int) -> Iterator[T]:
method get_count (line 59) | def get_count(self) -> int:
method writer (line 62) | def writer(self, writer_identifier: str) -> BufferedItemWriter[T]:
method clear (line 72) | def clear(self) -> None:
FILE: amber/src/main/python/core/storage/runnables/input_port_materialization_reader_runnable.py
class InputPortMaterializationReaderRunnable (line 66) | class InputPortMaterializationReaderRunnable(Runnable, Stoppable):
method __init__ (line 67) | def __init__(
method finished (line 111) | def finished(self) -> bool:
method tuple_to_batch_with_filter (line 117) | def tuple_to_batch_with_filter(self, tuple_: Tuple) -> typing.Iterator...
method run (line 128) | def run(self) -> None:
method stop (line 157) | def stop(self):
method emit_ecm (line 161) | def emit_ecm(self, method_name: str, alignment: EmbeddedControlMessage...
method emit_payload (line 189) | def emit_payload(self, payload: Union[DataPayload, EmbeddedControlMess...
method tuples_to_data_frame (line 200) | def tuples_to_data_frame(self, tuples: typing.List[Tuple]) -> DataFrame:
FILE: amber/src/main/python/core/storage/runnables/port_storage_writer.py
class PortStorageWriterElement (line 28) | class PortStorageWriterElement(QueueElement):
class PortStorageWriter (line 32) | class PortStorageWriter(StoppableQueueBlockingRunnable):
method __init__ (line 33) | def __init__(self, buffered_item_writer: BufferedItemWriter, queue: IQ...
method receive (line 38) | def receive(self, next_entry: QueueElement) -> None:
method pre_start (line 45) | def pre_start(self) -> None:
method post_stop (line 49) | def post_stop(self) -> None:
FILE: amber/src/main/python/core/storage/storage_config.py
class StorageConfig (line 19) | class StorageConfig:
method initialize (line 45) | def initialize(
method __new__ (line 85) | def __new__(cls, *args, **kwargs):
FILE: amber/src/main/python/core/storage/vfs_uri_factory.py
class VFSResourceType (line 33) | class VFSResourceType(str, Enum):
class VFSURIFactory (line 39) | class VFSURIFactory:
method decode_uri (line 43) | def decode_uri(
method create_result_uri (line 91) | def create_result_uri(workflow_id, execution_id, global_port_id) -> str:
FILE: amber/src/main/python/core/util/atomic.py
class AtomicInteger (line 21) | class AtomicInteger:
method __init__ (line 22) | def __init__(self, value=0):
method inc (line 26) | def inc(self, d=1):
method dec (line 31) | def dec(self, d=1):
method get_and_inc (line 34) | def get_and_inc(self, d=1):
method get_and_dec (line 40) | def get_and_dec(self, d=1):
method value (line 44) | def value(self):
method value (line 49) | def value(self, v):
method get_and_set (line 54) | def get_and_set(self, v):
FILE: amber/src/main/python/core/util/base_protocols.py
class Putable (line 26) | class Putable(Protocol):
method put (line 28) | def put(self, item: T) -> None:
class KeyedPutable (line 32) | class KeyedPutable(Protocol):
method put (line 34) | def put(self, key: K, item: T) -> None:
class Getable (line 38) | class Getable(Protocol):
method get (line 40) | def get(self) -> T:
class FlushedGetable (line 44) | class FlushedGetable(Protocol):
method get (line 46) | def get(self, flush: bool) -> T:
class EmtpyCheckable (line 50) | class EmtpyCheckable(Sized):
method is_empty (line 52) | def is_empty(self) -> bool:
class KeyedEmtpyCheckable (line 56) | class KeyedEmtpyCheckable(Sized):
method is_empty (line 58) | def is_empty(self, key: Optional[K] = None) -> bool:
FILE: amber/src/main/python/core/util/buffer/buffer_base.py
class IBuffer (line 23) | class IBuffer(FlushedGetable, Putable, metaclass=ABCMeta):
FILE: amber/src/main/python/core/util/buffer/timed_buffer.py
class TimedBuffer (line 25) | class TimedBuffer(IBuffer):
method __init__ (line 26) | def __init__(self, max_message_num=10, max_flush_interval_in_ms=500):
method put (line 32) | def put(self, message: ConsoleMessage) -> None:
method get (line 35) | def get(self, flush: bool = False) -> Iterator[ConsoleMessage]:
FILE: amber/src/main/python/core/util/console_message/replace_print.py
class replace_print (line 32) | class replace_print(ContextManager):
method __init__ (line 45) | def __init__(self, worker_id: str, buf: IBuffer):
method __enter__ (line 53) | def __enter__(self) -> None:
method __exit__ (line 86) | def __exit__(self, exc_type, exc_val, exc_tb) -> bool:
FILE: amber/src/main/python/core/util/console_message/timed_buffer.py
class TimedBuffer (line 26) | class TimedBuffer:
method __init__ (line 27) | def __init__(self, max_message_num=10, max_flush_interval_in_ms=500):
method add (line 33) | def add(self, console_message: PythonConsoleMessageV2) -> None:
method get (line 36) | def get(self, flush=False) -> Iterator[PythonConsoleMessageV2]:
FILE: amber/src/main/python/core/util/console_message/timestamp.py
function current_time_in_local_timezone (line 22) | def current_time_in_local_timezone():
FILE: amber/src/main/python/core/util/customized_queue/inner.py
function raw_inner (line 27) | def raw_inner(x):
class static_inner (line 34) | class static_inner:
method __init__ (line 37) | def __init__(self, cls):
method __set_name__ (line 41) | def __set_name__(self, owner, name):
class class_inner (line 47) | class class_inner(static_inner):
method __init__ (line 50) | def __init__(self, cls):
method _innerparents (line 56) | def _innerparents(self, outercls):
method __set_name__ (line 70) | def __set_name__(self, owner, name):
method __get__ (line 87) | def __get__(self, outerobj, outercls):
class inner (line 112) | class inner(class_inner):
method property (line 120) | def property(cls, icls):
method cached_property (line 127) | def cached_property(cls, icls):
method __get__ (line 134) | def __get__(self, outerobj, outercls):
FILE: amber/src/main/python/core/util/customized_queue/linked_blocking_multi_queue.py
class LinkedBlockingMultiQueue (line 32) | class LinkedBlockingMultiQueue(IKeyedQueue):
class Node (line 34) | class Node(Generic[T]):
method __init__ (line 35) | def __init__(self, item: T):
class SubQueue (line 41) | class SubQueue(Generic[T]):
method __init__ (line 42) | def __init__(self, key: K):
method clear (line 54) | def clear(self) -> None:
method disable (line 71) | def disable(self) -> None:
method enable (line 81) | def enable(self) -> None:
method is_enabled (line 97) | def is_enabled(self) -> bool:
method enqueue (line 104) | def enqueue(self, node: LinkedBlockingMultiQueue.Node[T]) -> None:
method dequeue (line 109) | def dequeue(self) -> T:
method __str__ (line 120) | def __str__(self) -> str:
method size (line 129) | def size(self) -> int:
method is_empty (line 132) | def is_empty(self) -> bool:
method put (line 135) | def put(self, obj: T) -> None:
method remove (line 152) | def remove(self, obj: T) -> bool:
method unlink (line 167) | def unlink(
method fully_lock (line 179) | def fully_lock(self) -> None:
method fully_unlock (line 183) | def fully_unlock(self) -> None:
class PriorityGroup (line 188) | class PriorityGroup(Generic[T]):
method __init__ (line 189) | def __init__(self, priority: int = 0):
method add_queue (line 195) | def add_queue(self, to_add: LinkedBlockingMultiQueue.SubQueue[T]) ->...
method remove_queue (line 199) | def remove_queue(self, to_remove: LinkedBlockingMultiQueue.SubQueue[...
method get_next_sub_queue (line 212) | def get_next_sub_queue(self) -> Optional[LinkedBlockingMultiQueue.Su...
method peek (line 226) | def peek(self) -> Optional[T]:
class DefaultSubQueueSelection (line 241) | class DefaultSubQueueSelection(Generic[T]):
method __init__ (line 242) | def __init__(
method get_next (line 249) | def get_next(self) -> Optional[LinkedBlockingMultiQueue.SubQueue[T]]:
method peek (line 256) | def peek(self) -> Optional[T]:
method set_priority_groups (line 263) | def set_priority_groups(
method __init__ (line 268) | def __init__(self):
method in_mem_size (line 285) | def in_mem_size(self, key: K) -> int:
method put (line 288) | def put(self, key: K, item: T) -> None:
method get (line 299) | def get(self) -> T:
method peek (line 325) | def peek(self) -> Optional[T]:
method enable (line 343) | def enable(self, key: K) -> None:
method disable (line 353) | def disable(self, key: K) -> None:
method size (line 363) | def size(self, key: Optional[K] = None) -> int:
method __len__ (line 379) | def __len__(self) -> int:
method is_empty (line 382) | def is_empty(self, key: Optional[K] = None) -> bool:
method is_enabled (line 393) | def is_enabled(self, key: K) -> bool:
method add_sub_queue (line 396) | def add_sub_queue(self, key: K, priority: int) -> Optional[SubQueue]:
method remove_sub_queue (line 437) | def remove_sub_queue(self, key: K) -> SubQueue:
method get_sub_queue (line 452) | def get_sub_queue(self, key: K) -> SubQueue:
method _signal_not_empty (line 462) | def _signal_not_empty(self) -> None:
FILE: amber/src/main/python/core/util/customized_queue/queue_base.py
class QueueElement (line 31) | class QueueElement:
class QueueControl (line 36) | class QueueControl(QueueElement):
class IQueue (line 40) | class IQueue(Putable, Getable, EmtpyCheckable, metaclass=ABCMeta):
class IKeyedQueue (line 44) | class IKeyedQueue(KeyedPutable, Getable, KeyedEmtpyCheckable, metaclass=...
FILE: amber/src/main/python/core/util/expression_evaluator.py
class ExpressionEvaluator (line 29) | class ExpressionEvaluator:
method evaluate (line 36) | def evaluate(
method _has_attributes (line 103) | def _has_attributes(value: Any) -> bool:
method _is_expandable (line 107) | def _is_expandable(obj, parent=None) -> bool:
method _is_mapping (line 126) | def _is_mapping(obj) -> bool:
method _is_generator (line 130) | def _is_generator(obj) -> bool:
method _is_iterator (line 134) | def _is_iterator(obj) -> bool:
method _is_iterable (line 138) | def _is_iterable(obj) -> bool:
method _contains_attributes (line 148) | def _contains_attributes(obj) -> bool:
method _is_empty_container (line 152) | def _is_empty_container(obj) -> bool:
method _contextualize_expression (line 156) | def _contextualize_expression(
method _extract_container_items (line 167) | def _extract_container_items(value: Any) -> List[TypedValue]:
method _extract_attributes (line 180) | def _extract_attributes(value: Any) -> List[TypedValue]:
method _extract_generator_locals (line 184) | def _extract_generator_locals(value: Any) -> List[TypedValue]:
method _to_typed_values (line 191) | def _to_typed_values(
FILE: amber/src/main/python/core/util/proto/__init__.py
function get_one_of (line 26) | def get_one_of(base: T, sealed=True) -> T:
function set_one_of (line 31) | def set_one_of(base: T, value: Message) -> T:
FILE: amber/src/main/python/core/util/runnable.py
class Runnable (line 23) | class Runnable(Protocol):
method run (line 25) | def run(self) -> None:
FILE: amber/src/main/python/core/util/stoppable/stoppable.py
class Stoppable (line 22) | class Stoppable(Protocol):
method stop (line 24) | def stop(self):
FILE: amber/src/main/python/core/util/stoppable/stoppable_queue_blocking_thread.py
class StoppableQueueBlockingRunnable (line 26) | class StoppableQueueBlockingRunnable(Runnable, Stoppable):
method __init__ (line 55) | def __init__(self, name: str, queue: IQueue):
method run (line 61) | def run(self):
method receive (line 73) | def receive(self, next_entry: QueueElement):
method pre_start (line 77) | def pre_start(self) -> None:
method post_stop (line 81) | def post_stop(self) -> None:
method stop (line 86) | def stop(self):
method interruptible_get (line 89) | def interruptible_get(self):
class InterruptRunnable (line 95) | class InterruptRunnable(Exception):
FILE: amber/src/main/python/core/util/virtual_identity.py
function get_worker_index (line 32) | def get_worker_index(worker_id: str) -> int:
function serialize_global_port_identity (line 39) | def serialize_global_port_identity(obj: GlobalPortIdentity) -> str:
function deserialize_global_port_identity (line 57) | def deserialize_global_port_identity(encoded_str: str) -> GlobalPortIden...
function get_from_actor_id_for_input_port_storage (line 84) | def get_from_actor_id_for_input_port_storage(
FILE: amber/src/main/python/proto/org/apache/texera/amber/core/__init__.py
class OutputPortOutputMode (line 15) | class OutputPortOutputMode(betterproto.Enum):
class FatalErrorType (line 30) | class FatalErrorType(betterproto.Enum):
class WorkflowIdentity (line 36) | class WorkflowIdentity(betterproto.Message):
class ExecutionIdentity (line 41) | class ExecutionIdentity(betterproto.Message):
class ActorVirtualIdentity (line 46) | class ActorVirtualIdentity(betterproto.Message):
class ChannelIdentity (line 51) | class ChannelIdentity(betterproto.Message):
class OperatorIdentity (line 58) | class OperatorIdentity(betterproto.Message):
class PhysicalOpIdentity (line 63) | class PhysicalOpIdentity(betterproto.Message):
class EmbeddedControlMessageIdentity (line 69) | class EmbeddedControlMessageIdentity(betterproto.Message):
class PortIdentity (line 74) | class PortIdentity(betterproto.Message):
class GlobalPortIdentity (line 80) | class GlobalPortIdentity(betterproto.Message):
class InputPort (line 87) | class InputPort(betterproto.Message):
class OutputPort (line 95) | class OutputPort(betterproto.Message):
class PhysicalLink (line 103) | class PhysicalLink(betterproto.Message):
class OpExecWithCode (line 111) | class OpExecWithCode(betterproto.Message):
class OpExecWithClassName (line 117) | class OpExecWithClassName(betterproto.Message):
class OpExecSource (line 123) | class OpExecSource(betterproto.Message):
class OpExecInitInfo (line 129) | class OpExecInitInfo(betterproto.Message):
class WorkflowFatalError (line 140) | class WorkflowFatalError(betterproto.Message):
FILE: amber/src/main/python/proto/org/apache/texera/amber/engine/architecture/rpc/__init__.py
class EmbeddedControlMessageType (line 32) | class EmbeddedControlMessageType(betterproto.Enum):
class ConsoleMessageType (line 38) | class ConsoleMessageType(betterproto.Enum):
class StatisticsUpdateTarget (line 45) | class StatisticsUpdateTarget(betterproto.Enum):
class ErrorLanguage (line 51) | class ErrorLanguage(betterproto.Enum):
class WorkflowAggregatedState (line 56) | class WorkflowAggregatedState(betterproto.Enum):
class ControlRequest (line 71) | class ControlRequest(betterproto.Message):
class EmptyRequest (line 151) | class EmptyRequest(betterproto.Message):
class AsyncRpcContext (line 156) | class AsyncRpcContext(betterproto.Message):
class ControlInvocation (line 162) | class ControlInvocation(betterproto.Message):
class EmbeddedControlMessage (line 170) | class EmbeddedControlMessage(betterproto.Message):
class PropagateEmbeddedControlMessageRequest (line 180) | class PropagateEmbeddedControlMessageRequest(betterproto.Message):
class TakeGlobalCheckpointRequest (line 193) | class TakeGlobalCheckpointRequest(betterproto.Message):
class WorkflowReconfigureRequest (line 202) | class WorkflowReconfigureRequest(betterproto.Message):
class DebugCommandRequest (line 208) | class DebugCommandRequest(betterproto.Message):
class EvaluatePythonExpressionRequest (line 214) | class EvaluatePythonExpressionRequest(betterproto.Message):
class RetryWorkflowRequest (line 220) | class RetryWorkflowRequest(betterproto.Message):
class ConsoleMessage (line 225) | class ConsoleMessage(betterproto.Message):
class ConsoleMessageTriggeredRequest (line 235) | class ConsoleMessageTriggeredRequest(betterproto.Message):
class PortCompletedRequest (line 240) | class PortCompletedRequest(betterproto.Message):
class WorkerStateUpdatedRequest (line 246) | class WorkerStateUpdatedRequest(betterproto.Message):
class LinkWorkersRequest (line 251) | class LinkWorkersRequest(betterproto.Message):
class Ping (line 256) | class Ping(betterproto.Message):
class Pong (line 265) | class Pong(betterproto.Message):
class Pass (line 274) | class Pass(betterproto.Message):
class Nested (line 281) | class Nested(betterproto.Message):
class MultiCall (line 288) | class MultiCall(betterproto.Message):
class ErrorCommand (line 295) | class ErrorCommand(betterproto.Message):
class Collect (line 302) | class Collect(betterproto.Message):
class GenerateNumber (line 309) | class GenerateNumber(betterproto.Message):
class Chain (line 316) | class Chain(betterproto.Message):
class Recursion (line 323) | class Recursion(betterproto.Message):
class AddInputChannelRequest (line 330) | class AddInputChannelRequest(betterproto.Message):
class AddPartitioningRequest (line 338) | class AddPartitioningRequest(betterproto.Message):
class AssignPortRequest (line 344) | class AssignPortRequest(betterproto.Message):
class FinalizeCheckpointRequest (line 355) | class FinalizeCheckpointRequest(betterproto.Message):
class InitializeExecutorRequest (line 363) | class InitializeExecutorRequest(betterproto.Message):
class UpdateExecutorRequest (line 370) | class UpdateExecutorRequest(betterproto.Message):
class PrepareCheckpointRequest (line 376) | class PrepareCheckpointRequest(betterproto.Message):
class QueryStatisticsRequest (line 384) | class QueryStatisticsRequest(betterproto.Message):
class JumpToOperatorRegionRequest (line 392) | class JumpToOperatorRegionRequest(betterproto.Message):
class ControlReturn (line 397) | class ControlReturn(betterproto.Message):
class EmptyReturn (line 439) | class EmptyReturn(betterproto.Message):
class ControlError (line 444) | class ControlError(betterproto.Message):
class ReturnInvocation (line 452) | class ReturnInvocation(betterproto.Message):
class StringResponse (line 458) | class StringResponse(betterproto.Message):
class IntResponse (line 463) | class IntResponse(betterproto.Message):
class RetrieveWorkflowStateResponse (line 468) | class RetrieveWorkflowStateResponse(betterproto.Message):
class FinalizeCheckpointResponse (line 475) | class FinalizeCheckpointResponse(betterproto.Message):
class PropagateEmbeddedControlMessageResponse (line 480) | class PropagateEmbeddedControlMessageResponse(betterproto.Message):
class TakeGlobalCheckpointResponse (line 487) | class TakeGlobalCheckpointResponse(betterproto.Message):
class TypedValue (line 492) | class TypedValue(betterproto.Message):
class EvaluatedValue (line 501) | class EvaluatedValue(betterproto.Message):
class EvaluatePythonExpressionResponse (line 507) | class EvaluatePythonExpressionResponse(betterproto.Message):
class StartWorkflowResponse (line 512) | class StartWorkflowResponse(betterproto.Message):
class WorkerStateResponse (line 517) | class WorkerStateResponse(betterproto.Message):
class WorkerMetricsResponse (line 522) | class WorkerMetricsResponse(betterproto.Message):
class RpcTesterStub (line 526) | class RpcTesterStub(betterproto.ServiceStub):
method send_ping (line 527) | async def send_ping(
method send_pong (line 544) | async def send_pong(
method send_nested (line 561) | async def send_nested(
method send_pass (line 578) | async def send_pass(
method send_error_command (line 595) | async def send_error_command(
method send_recursion (line 612) | async def send_recursion(
method send_collect (line 629) | async def send_collect(
method send_generate_number (line 646) | async def send_generate_number(
method send_multi_call (line 663) | async def send_multi_call(
method send_chain (line 680) | async def send_chain(
class WorkerServiceStub (line 698) | class WorkerServiceStub(betterproto.ServiceStub):
method add_input_channel (line 699) | async def add_input_channel(
method add_partitioning (line 716) | async def add_partitioning(
method assign_port (line 733) | async def assign_port(
method finalize_checkpoint (line 750) | async def finalize_checkpoint(
method flush_network_buffer (line 767) | async def flush_network_buffer(
method initialize_executor (line 784) | async def initialize_executor(
method open_executor (line 801) | async def open_executor(
method pause_worker (line 818) | async def pause_worker(
method prepare_checkpoint (line 835) | async def prepare_checkpoint(
method query_statistics (line 852) | async def query_statistics(
method resume_worker (line 869) | async def resume_worker(
method retrieve_state (line 886) | async def retrieve_state(
method retry_current_tuple (line 903) | async def retry_current_tuple(
method start_worker (line 920) | async def start_worker(
method end_worker (line 937) | async def end_worker(
method start_channel (line 954) | async def start_channel(
method end_channel (line 971) | async def end_channel(
method debug_command (line 988) | async def debug_command(
method evaluate_python_expression (line 1005) | async def evaluate_python_expression(
method no_operation (line 1022) | async def no_operation(
method update_executor (line 1039) | async def update_executor(
class ControllerServiceStub (line 1057) | class ControllerServiceStub(betterproto.ServiceStub):
method retrieve_workflow_state (line 1058) | async def retrieve_workflow_state(
method propagate_embedded_control_message (line 1075) | async def propagate_embedded_control_message(
method take_global_checkpoint (line 1092) | async def take_global_checkpoint(
method debug_command (line 1109) | async def debug_command(
method evaluate_python_expression (line 1126) | async def evaluate_python_expression(
method console_message_triggered (line 1143) | async def console_message_triggered(
method port_completed (line 1160) | async def port_completed(
method start_workflow (line 1177) | async def start_workflow(
method resume_workflow (line 1194) | async def resume_workflow(
method pause_workflow (line 1211) | async def pause_workflow(
method worker_state_updated (line 1228) | async def worker_state_updated(
method worker_execution_completed (line 1245) | async def worker_execution_completed(
method jump_to_operator_region (line 1262) | async def jump_to_operator_region(
method link_workers (line 1279) | async def link_workers(
method controller_initiate_query_statistics (line 1296) | async def controller_initiate_query_statistics(
method retry_workflow (line 1313) | async def retry_workflow(
method reconfigure_workflow (line 1330) | async def reconfigure_workflow(
class RpcTesterBase (line 1348) | class RpcTesterBase(ServiceBase):
method send_ping (line 1350) | async def send_ping(self, ping: "Ping") -> "IntResponse":
method send_pong (line 1353) | async def send_pong(self, pong: "Pong") -> "IntResponse":
method send_nested (line 1356) | async def send_nested(self, nested: "Nested") -> "StringResponse":
method send_pass (line 1359) | async def send_pass(self, pass_: "Pass") -> "StringResponse":
method send_error_command (line 1362) | async def send_error_command(
method send_recursion (line 1367) | async def send_recursion(self, recursion: "Recursion") -> "StringRespo...
method send_collect (line 1370) | async def send_collect(self, collect: "Collect") -> "StringResponse":
method send_generate_number (line 1373) | async def send_generate_number(
method send_multi_call (line 1378) | async def send_multi_call(self, multi_call: "MultiCall") -> "StringRes...
method send_chain (line 1381) | async def send_chain(self, chain: "Chain") -> "StringResponse":
method __rpc_send_ping (line 1384) | async def __rpc_send_ping(
method __rpc_send_pong (line 1391) | async def __rpc_send_pong(
method __rpc_send_nested (line 1398) | async def __rpc_send_nested(
method __rpc_send_pass (line 1405) | async def __rpc_send_pass(
method __rpc_send_error_command (line 1412) | async def __rpc_send_error_command(
method __rpc_send_recursion (line 1419) | async def __rpc_send_recursion(
method __rpc_send_collect (line 1426) | async def __rpc_send_collect(
method __rpc_send_generate_number (line 1433) | async def __rpc_send_generate_number(
method __rpc_send_multi_call (line 1440) | async def __rpc_send_multi_call(
method __rpc_send_chain (line 1447) | async def __rpc_send_chain(
method __mapping__ (line 1454) | def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
class WorkerServiceBase (line 1519) | class WorkerServiceBase(ServiceBase):
method add_input_channel (line 1521) | async def add_input_channel(
method add_partitioning (line 1526) | async def add_partitioning(
method assign_port (line 1531) | async def assign_port(
method finalize_checkpoint (line 1536) | async def finalize_checkpoint(
method flush_network_buffer (line 1541) | async def flush_network_buffer(
method initialize_executor (line 1546) | async def initialize_executor(
method open_executor (line 1551) | async def open_executor(self, empty_request: "EmptyRequest") -> "Empty...
method pause_worker (line 1554) | async def pause_worker(
method prepare_checkpoint (line 1559) | async def prepare_checkpoint(
method query_statistics (line 1564) | async def query_statistics(
method resume_worker (line 1569) | async def resume_worker(
method retrieve_state (line 1574) | async def retrieve_state(self, empty_request: "EmptyRequest") -> "Empt...
method retry_current_tuple (line 1577) | async def retry_current_tuple(self, empty_request: "EmptyRequest") -> ...
method start_worker (line 1580) | async def start_worker(
method end_worker (line 1585) | async def end_worker(self, empty_request: "EmptyRequest") -> "EmptyRet...
method start_channel (line 1588) | async def start_channel(self, empty_request: "EmptyRequest") -> "Empty...
method end_channel (line 1591) | async def end_channel(self, empty_request: "EmptyRequest") -> "EmptyRe...
method debug_command (line 1594) | async def debug_command(
method evaluate_python_expression (line 1599) | async def evaluate_python_expression(
method no_operation (line 1604) | async def no_operation(self, empty_request: "EmptyRequest") -> "EmptyR...
method update_executor (line 1607) | async def update_executor(
method __rpc_add_input_channel (line 1612) | async def __rpc_add_input_channel(
method __rpc_add_partitioning (line 1619) | async def __rpc_add_partitioning(
method __rpc_assign_port (line 1626) | async def __rpc_assign_port(
method __rpc_finalize_checkpoint (line 1633) | async def __rpc_finalize_checkpoint(
method __rpc_flush_network_buffer (line 1641) | async def __rpc_flush_network_buffer(
method __rpc_initialize_executor (line 1648) | async def __rpc_initialize_executor(
method __rpc_open_executor (line 1655) | async def __rpc_open_executor(
method __rpc_pause_worker (line 1662) | async def __rpc_pause_worker(
method __rpc_prepare_checkpoint (line 1669) | async def __rpc_prepare_checkpoint(
method __rpc_query_statistics (line 1676) | async def __rpc_query_statistics(
method __rpc_resume_worker (line 1683) | async def __rpc_resume_worker(
method __rpc_retrieve_state (line 1690) | async def __rpc_retrieve_state(
method __rpc_retry_current_tuple (line 1697) | async def __rpc_retry_current_tuple(
method __rpc_start_worker (line 1704) | async def __rpc_start_worker(
method __rpc_end_worker (line 1711) | async def __rpc_end_worker(
method __rpc_start_channel (line 1718) | async def __rpc_start_channel(
method __rpc_end_channel (line 1725) | async def __rpc_end_channel(
method __rpc_debug_command (line 1732) | async def __rpc_debug_command(
method __rpc_evaluate_python_expression (line 1739) | async def __rpc_evaluate_python_expression(
method __rpc_no_operation (line 1747) | async def __rpc_no_operation(
method __rpc_update_executor (line 1754) | async def __rpc_update_executor(
method __mapping__ (line 1761) | def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
class ControllerServiceBase (line 1892) | class ControllerServiceBase(ServiceBase):
method retrieve_workflow_state (line 1894) | async def retrieve_workflow_state(
method propagate_embedded_control_message (line 1899) | async def propagate_embedded_control_message(
method take_global_checkpoint (line 1905) | async def take_global_checkpoint(
method debug_command (line 1910) | async def debug_command(
method evaluate_python_expression (line 1915) | async def evaluate_python_expression(
method console_message_triggered (line 1920) | async def console_message_triggered(
method port_completed (line 1925) | async def port_completed(
method start_workflow (line 1930) | async def start_workflow(
method resume_workflow (line 1935) | async def resume_workflow(self, empty_request: "EmptyRequest") -> "Emp...
method pause_workflow (line 1938) | async def pause_workflow(self, empty_request: "EmptyRequest") -> "Empt...
method worker_state_updated (line 1941) | async def worker_state_updated(
method worker_execution_completed (line 1946) | async def worker_execution_completed(
method jump_to_operator_region (line 1951) | async def jump_to_operator_region(
method link_workers (line 1956) | async def link_workers(
method controller_initiate_query_statistics (line 1961) | async def controller_initiate_query_statistics(
method retry_workflow (line 1966) | async def retry_workflow(
method reconfigure_workflow (line 1971) | async def reconfigure_workflow(
method __rpc_retrieve_workflow_state (line 1976) | async def __rpc_retrieve_workflow_state(
method __rpc_propagate_embedded_control_message (line 1984) | async def __rpc_propagate_embedded_control_message(
method __rpc_take_global_checkpoint (line 1992) | async def __rpc_take_global_checkpoint(
method __rpc_debug_command (line 2000) | async def __rpc_debug_command(
method __rpc_evaluate_python_expression (line 2007) | async def __rpc_evaluate_python_expression(
method __rpc_console_message_triggered (line 2015) | async def __rpc_console_message_triggered(
method __rpc_port_completed (line 2023) | async def __rpc_port_completed(
method __rpc_start_workflow (line 2030) | async def __rpc_start_workflow(
method __rpc_resume_workflow (line 2037) | async def __rpc_resume_workflow(
method __rpc_pause_workflow (line 2044) | async def __rpc_pause_workflow(
method __rpc_worker_state_updated (line 2051) | async def __rpc_worker_state_updated(
method __rpc_worker_execution_completed (line 2058) | async def __rpc_worker_execution_completed(
method __rpc_jump_to_operator_region (line 2065) | async def __rpc_jump_to_operator_region(
method __rpc_link_workers (line 2072) | async def __rpc_link_workers(
method __rpc_controller_initiate_query_statistics (line 2079) | async def __rpc_controller_initiate_query_statistics(
method __rpc_retry_workflow (line 2086) | async def __rpc_retry_workflow(
method __rpc_reconfigure_workflow (line 2093) | async def __rpc_reconfigure_workflow(
method __mapping__ (line 2100) | def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
FILE: amber/src/main/python/proto/org/apache/texera/amber/engine/architecture/sendsemantics/__init__.py
class Partitioning (line 17) | class Partitioning(betterproto.Message):
class OneToOnePartitioning (line 36) | class OneToOnePartitioning(betterproto.Message):
class RoundRobinPartitioning (line 42) | class RoundRobinPartitioning(betterproto.Message):
class HashBasedShufflePartitioning (line 48) | class HashBasedShufflePartitioning(betterproto.Message):
class RangeBasedShufflePartitioning (line 55) | class RangeBasedShufflePartitioning(betterproto.Message):
class BroadcastPartitioning (line 64) | class BroadcastPartitioning(betterproto.Message):
FILE: amber/src/main/python/proto/org/apache/texera/amber/engine/architecture/worker/__init__.py
class WorkerState (line 16) | class WorkerState(betterproto.Enum):
class PortTupleMetricsMapping (line 26) | class PortTupleMetricsMapping(betterproto.Message):
class TupleMetrics (line 32) | class TupleMetrics(betterproto.Message):
class WorkerStatistics (line 38) | class WorkerStatistics(betterproto.Message):
class WorkerMetrics (line 47) | class WorkerMetrics(betterproto.Message):
FILE: amber/src/main/python/proto/org/apache/texera/amber/engine/common/__init__.py
class DirectControlMessagePayloadV2 (line 22) | class DirectControlMessagePayloadV2(betterproto.Message):
class PythonDataHeader (line 32) | class PythonDataHeader(betterproto.Message):
class PythonControlMessage (line 38) | class PythonControlMessage(betterproto.Message):
class BreakpointFault (line 44) | class BreakpointFault(betterproto.Message):
class BreakpointFaultBreakpointTuple (line 50) | class BreakpointFaultBreakpointTuple(betterproto.Message):
class OperatorBreakpoints (line 57) | class OperatorBreakpoints(betterproto.Message):
class ExecutionBreakpointStore (line 62) | class ExecutionBreakpointStore(betterproto.Message):
class EvaluatedValueList (line 69) | class EvaluatedValueList(betterproto.Message):
class OperatorConsole (line 74) | class OperatorConsole(betterproto.Message):
class ExecutionConsoleStore (line 84) | class ExecutionConsoleStore(betterproto.Message):
class OperatorWorkerMapping (line 91) | class OperatorWorkerMapping(betterproto.Message):
class OperatorStatistics (line 97) | class OperatorStatistics(betterproto.Message):
class OperatorMetrics (line 111) | class OperatorMetrics(betterproto.Message):
class ExecutionStatsStore (line 119) | class ExecutionStatsStore(betterproto.Message):
class ExecutionMetadataStore (line 131) | class ExecutionMetadataStore(betterproto.Message):
class Backpressure (line 139) | class Backpressure(betterproto.Message):
class CreditUpdate (line 144) | class CreditUpdate(betterproto.Message):
class ActorCommand (line 149) | class ActorCommand(betterproto.Message):
class PythonActorMessage (line 155) | class PythonActorMessage(betterproto.Message):
FILE: amber/src/main/python/proto/org/apache/texera/web/__init__.py
class FatalErrorType (line 36) | class FatalErrorType(betterproto.Enum):
class WorkflowAggregatedState (line 41) | class WorkflowAggregatedState(betterproto.Enum):
class BreakpointFault (line 55) | class BreakpointFault(betterproto.Message):
class BreakpointFaultBreakpointTuple (line 61) | class BreakpointFaultBreakpointTuple(betterproto.Message):
class OperatorBreakpoints (line 68) | class OperatorBreakpoints(betterproto.Message):
class ExecutionBreakpointStore (line 73) | class ExecutionBreakpointStore(betterproto.Message):
class EvaluatedValueList (line 80) | class EvaluatedValueList(betterproto.Message):
class OperatorConsole (line 87) | class OperatorConsole(betterproto.Message):
class ExecutionConsoleStore (line 97) | class ExecutionConsoleStore(betterproto.Message):
class OperatorWorkerMapping (line 104) | class OperatorWorkerMapping(betterproto.Message):
class OperatorStatistics (line 110) | class OperatorStatistics(betterproto.Message):
class OperatorMetrics (line 124) | class OperatorMetrics(betterproto.Message):
class ExecutionStatsStore (line 130) | class ExecutionStatsStore(betterproto.Message):
class WorkflowFatalError (line 142) | class WorkflowFatalError(betterproto.Message):
class ExecutionMetadataStore (line 152) | class ExecutionMetadataStore(betterproto.Message):
FILE: amber/src/main/python/proto/scalapb/__init__.py
class MatchType (line 16) | class MatchType(betterproto.Enum):
class ScalaPbOptionsOptionsScope (line 22) | class ScalaPbOptionsOptionsScope(betterproto.Enum):
class ScalaPbOptionsEnumValueNaming (line 34) | class ScalaPbOptionsEnumValueNaming(betterproto.Enum):
class ScalaPbOptions (line 42) | class ScalaPbOptions(betterproto.Message):
class ScalaPbOptionsAuxMessageOptions (line 186) | class ScalaPbOptionsAuxMessageOptions(betterproto.Message):
class ScalaPbOptionsAuxFieldOptions (line 204) | class ScalaPbOptionsAuxFieldOptions(betterproto.Message):
class ScalaPbOptionsAuxEnumOptions (line 222) | class ScalaPbOptionsAuxEnumOptions(betterproto.Message):
class ScalaPbOptionsAuxEnumValueOptions (line 240) | class ScalaPbOptionsAuxEnumValueOptions(betterproto.Message):
class MessageOptions (line 258) | class MessageOptions(betterproto.Message):
class Collection (line 297) | class Collection(betterproto.Message):
class FieldOptions (line 321) | class FieldOptions(betterproto.Message):
class EnumOptions (line 362) | class EnumOptions(betterproto.Message):
class EnumValueOptions (line 386) | class EnumValueOptions(betterproto.Message):
class OneofOptions (line 400) | class OneofOptions(betterproto.Message):
class FieldTransformation (line 409) | class FieldTransformation(betterproto.Message):
class PreprocessorOutput (line 418) | class PreprocessorOutput(betterproto.Message):
FILE: amber/src/main/python/pytexera/storage/dataset_file_document.py
class DatasetFileDocument (line 24) | class DatasetFileDocument:
method __init__ (line 25) | def __init__(self, file_path: str):
method get_presigned_url (line 55) | def get_presigned_url(self) -> str:
method read_file (line 81) | def read_file(self) -> io.BytesIO:
FILE: amber/src/main/python/pytexera/storage/large_binary_input_stream.py
function _require_open (line 32) | def _require_open(func):
class LargeBinaryInputStream (line 46) | class LargeBinaryInputStream(IOBase):
method __init__ (line 53) | def __init__(self, large_binary: largebinary):
method _lazy_init (line 61) | def _lazy_init(self):
method read (line 73) | def read(self, n: int = -1) -> bytes:
method readline (line 78) | def readline(self, size: int = -1) -> bytes:
method readlines (line 83) | def readlines(self, hint: int = -1) -> list[bytes]:
method readable (line 87) | def readable(self) -> bool:
method seekable (line 91) | def seekable(self) -> bool:
method close (line 95) | def close(self) -> None:
method __enter__ (line 110) | def __enter__(self):
method __exit__ (line 113) | def __exit__(self, exc_type, exc_val, exc_tb):
method __iter__ (line 116) | def __iter__(self):
method __next__ (line 119) | def __next__(self) -> bytes:
FILE: amber/src/main/python/pytexera/storage/large_binary_manager.py
function _get_s3_client (line 35) | def _get_s3_client():
function _ensure_bucket_exists (line 56) | def _ensure_bucket_exists(bucket: str):
function create (line 67) | def create() -> str:
FILE: amber/src/main/python/pytexera/storage/large_binary_output_stream.py
class _QueueReader (line 41) | class _QueueReader:
method __init__ (line 44) | def __init__(self, q: queue.Queue):
method read (line 49) | def read(self, size=-1):
class LargeBinaryOutputStream (line 81) | class LargeBinaryOutputStream(IOBase):
method __init__ (line 103) | def __init__(self, large_binary: largebinary):
method write (line 128) | def write(self, b: Union[bytes, bytearray]) -> int:
method writable (line 177) | def writable(self) -> bool:
method seekable (line 181) | def seekable(self) -> bool:
method flush (line 185) | def flush(self) -> None:
method close (line 195) | def close(self) -> None:
method _cleanup_failed_upload (line 231) | def _cleanup_failed_upload(self):
method __enter__ (line 240) | def __enter__(self):
method __exit__ (line 244) | def __exit__(self, exc_type, exc_val, exc_tb):
FILE: amber/src/main/python/pytexera/udf/examples/count_batch_operator.py
class CountBatchOperator (line 21) | class CountBatchOperator(UDFBatchOperator):
method __init__ (line 24) | def __init__(self):
method process_batch (line 29) | def process_batch(self, batch: Batch, port: int) -> Iterator[Optional[...
FILE: amber/src/main/python/pytexera/udf/examples/echo_operator.py
class EchoOperator (line 21) | class EchoOperator(UDFOperatorV2):
method process_tuple (line 23) | def process_tuple(self, tuple_: Tuple, port: int) -> Iterator[Optional...
method on_finish (line 27) | def on_finish(self, port: int) -> Iterator[Optional[TupleLike]]:
FILE: amber/src/main/python/pytexera/udf/examples/echo_table_operator.py
class EchoTableOperator (line 21) | class EchoTableOperator(UDFTableOperator):
method process_table (line 23) | def process_table(self, table: Table, port: int) -> Iterator[Optional[...
FILE: amber/src/main/python/pytexera/udf/examples/generator_operator_binary.py
class GeneratorOperatorBinary (line 21) | class GeneratorOperatorBinary(UDFSourceOperator):
method produce (line 27) | def produce(self) -> Iterator[Union[TupleLike, TableLike, None]]:
FILE: amber/src/main/python/pytexera/udf/examples/generator_operator_integer.py
class GeneratorOperatorInteger (line 21) | class GeneratorOperatorInteger(UDFSourceOperator):
method produce (line 27) | def produce(self) -> Iterator[Union[TupleLike, TableLike, None]]:
FILE: amber/src/main/python/pytexera/udf/examples/join_operator.py
class JoinOperator (line 24) | class JoinOperator(UDFOperatorV2):
method open (line 26) | def open(self) -> None:
method process_tuple (line 30) | def process_tuple(self, tuple_: Tuple, port: int) -> Iterator[Optional...
FILE: amber/src/main/python/pytexera/udf/udf_operator.py
class UDFOperatorV2 (line 24) | class UDFOperatorV2(TupleOperatorV2):
method open (line 30) | def open(self) -> None:
method process_tuple (line 38) | def process_tuple(self, tuple_: Tuple, port: int) -> Iterator[Optional...
method on_finish (line 51) | def on_finish(self, port: int) -> Iterator[Optional[TupleLike]]:
method close (line 61) | def close(self) -> None:
class UDFSourceOperator (line 68) | class UDFSourceOperator(SourceOperator):
method open (line 69) | def open(self) -> None:
method produce (line 77) | def produce(self) -> Iterator[Optional[Union[TupleLike, TableLike]]]:
method close (line 86) | def close(self) -> None:
class UDFTableOperator (line 93) | class UDFTableOperator(TableOperator):
method open (line 99) | def open(self) -> None:
method process_table (line 107) | def process_table(self, table: Table, port: int) -> Iterator[Optional[...
method close (line 119) | def close(self) -> None:
class UDFBatchOperator (line 126) | class UDFBatchOperator(BatchOperator):
method open (line 132) | def open(self) -> None:
method process_batch (line 140) | def process_batch(self, batch: Batch, port: int) -> Iterator[Optional[...
method close (line 152) | def close(self) -> None:
FILE: amber/src/main/python/texera_run_python_worker.py
function init_loguru_logger (line 25) | def init_loguru_logger(stream_log_level) -> None:
FILE: amber/src/main/scala/org/apache/texera/web/TexeraWebConfiguration.java
class TexeraWebConfiguration (line 24) | public class TexeraWebConfiguration extends Configuration {
FILE: amber/src/main/scala/org/apache/texera/web/resource/aiassistant/test_type_annotation_visitor.py
class TestFunctionsAndMethods (line 23) | class TestFunctionsAndMethods:
method global_functions_code (line 26) | def global_functions_code(self):
method test_global_functions (line 38) | def test_global_functions(self, global_functions_code):
method class_methods_code (line 54) | def class_methods_code(self):
method test_class_methods (line 77) | def test_class_methods(self, class_methods_code):
method lambda_code (line 93) | def lambda_code(self):
method test_lambda_functions (line 99) | def test_lambda_functions(self, lambda_code):
method comprehensive_functions_code (line 105) | def comprehensive_functions_code(self):
method test_comprehensive (line 120) | def test_comprehensive(self, comprehensive_functions_code):
method multi_line_function_code (line 135) | def multi_line_function_code(self):
method test_multi_lines_argument (line 150) | def test_multi_lines_argument(self, multi_line_function_code):
FILE: amber/src/main/scala/org/apache/texera/web/resource/aiassistant/type_annotation_visitor.py
class ParentNodeVisitor (line 24) | class ParentNodeVisitor(ast.NodeVisitor):
method __init__ (line 25) | def __init__(self):
method generic_visit (line 28) | def generic_visit(self, node):
class TypeAnnotationVisitor (line 36) | class TypeAnnotationVisitor(ast.NodeVisitor):
method __init__ (line 37) | def __init__(self, start_line_offset=0):
method visit (line 41) | def visit(self, node):
method process_function (line 48) | def process_function(self, node):
method add_untyped_arg (line 82) | def add_untyped_arg(self, arg):
function find_untyped_variables (line 90) | def find_untyped_variables(source_code, start_line):
FILE: amber/src/test/java/org/apache/texera/web/resource/dashboard/user/dataset/GitVersionControlLocalFileStorageSpec.java
class GitVersionControlLocalFileStorageSpec (line 40) | public class GitVersionControlLocalFileStorageSpec {
method writeFileToRepo (line 56) | private void writeFileToRepo(Path filePath, String fileContent) throws...
method setUp (line 62) | @Before
method tearDown (line 111) | @After
method testFileContentAcrossVersions (line 117) | @Test
method testFileTreeRetrieval (line 151) | @Test
method testUncommittedCheckAndRecoverToLatest (line 207) | @Test
FILE: amber/src/test/python/core/architecture/handlers/control/test_debug_command_handler.py
class TestTranslateDebugCommand (line 34) | class TestTranslateDebugCommand:
method context (line 36) | def context(self):
method test_break_with_lineno_prepends_module (line 41) | def test_break_with_lineno_prepends_module(self, context):
method test_long_break_with_lineno_prepends_module (line 47) | def test_long_break_with_lineno_prepends_module(self, context):
method test_break_preserves_condition_arg (line 53) | def test_break_preserves_condition_arg(self, context):
method test_break_with_no_args_passes_through (line 59) | def test_break_with_no_args_passes_through(self, context):
method test_non_break_command_passes_through (line 63) | def test_non_break_command_passes_through(self, context):
method test_non_break_command_with_args_is_rejoined (line 66) | def test_non_break_command_with_args_is_rejoined(self, context):
method test_leading_and_trailing_whitespace_is_stripped (line 72) | def test_leading_and_trailing_whitespace_is_stripped(self, context):
method test_internal_whitespace_is_collapsed_to_single_space (line 77) | def test_internal_whitespace_is_collapsed_to_single_space(self, context):
method test_break_with_only_lineno_has_no_trailing_space (line 85) | def test_break_with_only_lineno_has_no_trailing_space(self, context):
method test_empty_command_raises_descriptive_error (line 94) | def test_empty_command_raises_descriptive_error(self, context):
method test_whitespace_only_command_raises_descriptive_error (line 98) | def test_whitespace_only_command_raises_descriptive_error(self, context):
method test_uppercase_break_is_not_recognized (line 102) | def test_uppercase_break_is_not_recognized(self, context):
method test_break_with_function_name_passes_through (line 113) | def test_break_with_function_name_passes_through(self, context):
method test_break_with_explicit_filename_passes_through (line 122) | def test_break_with_explicit_filename_passes_through(self, context):
method test_break_with_lineno_before_module_init_raises (line 129) | def test_break_with_lineno_before_module_init_raises(self, context):
method test_break_with_function_name_before_module_init_passes_through (line 136) | def test_break_with_function_name_before_module_init_passes_through(se...
class TestDebugCommandAsyncFlow (line 146) | class TestDebugCommandAsyncFlow:
method handler (line 148) | def handler(self):
method test_translates_then_forwards_to_debug_manager (line 159) | def test_translates_then_forwards_to_debug_manager(self, handler):
method test_resumes_all_three_pause_types (line 165) | def test_resumes_all_three_pause_types(self, handler):
method test_returns_empty_return (line 176) | def test_returns_empty_return(self, handler):
method test_passes_through_non_break_command_unchanged (line 180) | def test_passes_through_non_break_command_unchanged(self, handler):
method test_empty_cmd_propagates_value_error (line 184) | def test_empty_cmd_propagates_value_error(self, handler):
method test_translation_failure_skips_put_and_resume (line 191) | def test_translation_failure_skips_put_and_resume(self, handler):
FILE: amber/src/test/python/core/architecture/handlers/control/test_evaluate_expression_handler.py
class TestEvaluateExpressionHandler (line 34) | class TestEvaluateExpressionHandler:
method executor (line 36) | def executor(self):
method handler (line 42) | def handler(self, executor):
method test_returns_what_the_evaluator_returns (line 53) | def test_returns_what_the_evaluator_returns(self, handler):
method test_runtime_context_exposes_self_tuple_input (line 71) | def test_runtime_context_exposes_self_tuple_input(self, handler, execu...
method test_runtime_context_reflects_current_tuple_at_call_time (line 89) | def test_runtime_context_reflects_current_tuple_at_call_time(
method test_handles_none_input_tuple_and_port (line 121) | def test_handles_none_input_tuple_and_port(self, handler):
method test_evaluator_exception_propagates (line 142) | def test_evaluator_exception_propagates(self, handler):
FILE: amber/src/test/python/core/architecture/handlers/control/test_replay_current_tuple_handler.py
function _build_handler (line 35) | def _build_handler(state: WorkerState, current_tuple, remaining_iter):
class TestRetryCurrentTupleHandler (line 50) | class TestRetryCurrentTupleHandler:
method running_handler (line 52) | def running_handler(self):
method test_returns_empty_return (line 59) | def test_returns_empty_return(self, running_handler):
method test_chains_current_tuple_back_onto_iterator (line 63) | def test_chains_current_tuple_back_onto_iterator(self, running_handler):
method test_resumes_user_and_exception_pause_in_order (line 72) | def test_resumes_user_and_exception_pause_in_order(self, running_handl...
method test_does_not_resume_debug_pause (line 80) | def test_does_not_resume_debug_pause(self, running_handler):
method test_no_op_when_state_is_completed (line 91) | def test_no_op_when_state_is_completed(self):
method test_chains_even_when_remaining_iter_is_exhausted (line 108) | def test_chains_even_when_remaining_iter_is_exhausted(self):
method test_paused_state_still_chains_and_resumes (line 120) | def test_paused_state_still_chains_and_resumes(self):
FILE: amber/src/test/python/core/architecture/handlers/control/test_update_executor_handler.py
function make_request (line 34) | def make_request(code: str) -> UpdateExecutorRequest:
function make_handler (line 41) | def make_handler(executor_is_source: bool = False) -> UpdateExecutorHand...
class TestUpdateExecutorHandler (line 50) | class TestUpdateExecutorHandler:
method test_returns_empty_return (line 51) | def test_returns_empty_return(self):
method test_delegates_extracted_code_to_executor_manager (line 56) | def test_delegates_extracted_code_to_executor_manager(self):
method test_propagates_current_executor_is_source_not_request_field (line 63) | def test_propagates_current_executor_is_source_not_request_field(self):
method test_extracts_code_via_get_one_of_for_op_exec_with_code (line 73) | def test_extracts_code_via_get_one_of_for_op_exec_with_code(self):
FILE: amber/src/test/python/core/architecture/managers/test_console_message_manager.py
function _msg (line 27) | def _msg(title: str) -> ConsoleMessage:
class TestConsoleMessageManager (line 38) | class TestConsoleMessageManager:
method test_initially_force_flush_drains_empty (line 39) | def test_initially_force_flush_drains_empty(self):
method test_force_flush_drains_all_buffered_in_order (line 44) | def test_force_flush_drains_all_buffered_in_order(self):
method test_get_without_flush_below_threshold_yields_nothing (line 53) | def test_get_without_flush_below_threshold_yields_nothing(self):
method test_get_without_flush_at_or_over_max_message_num_drains (line 66) | def test_get_without_flush_at_or_over_max_message_num_drains(self):
method test_get_drains_when_last_output_time_is_stale (line 75) | def test_get_drains_when_last_output_time_is_stale(self):
FILE: amber/src/test/python/core/architecture/managers/test_debug_manager.py
class TestDebugManager (line 25) | class TestDebugManager:
method debug_manager (line 27) | def debug_manager(self):
method test_it_can_init (line 30) | def test_it_can_init(self, debug_manager):
method test_it_has_no_command_initially (line 34) | def test_it_has_no_command_initially(self, debug_manager):
method test_it_has_no_event_initially (line 37) | def test_it_has_no_event_initially(self, debug_manager):
method test_put_command_sets_has_debug_command (line 40) | def test_put_command_sets_has_debug_command(self, debug_manager):
method test_get_debug_event_returns_flushed_output (line 44) | def test_get_debug_event_returns_flushed_output(self, debug_manager):
method test_command_pipe_and_event_pipe_are_independent (line 53) | def test_command_pipe_and_event_pipe_are_independent(self, debug_manag...
method test_pdb_is_wired_to_debug_pipes (line 64) | def test_pdb_is_wired_to_debug_pipes(self, debug_manager):
method test_event_pipe_supports_multiple_round_trips (line 75) | def test_event_pipe_supports_multiple_round_trips(self, debug_manager):
method test_debugger_uses_nosigint_to_avoid_signal_install (line 82) | def test_debugger_uses_nosigint_to_avoid_signal_install(self, debug_ma...
method test_put_empty_command_still_marks_command_present (line 89) | def test_put_empty_command_still_marks_command_present(self, debug_man...
method test_put_overwrites_unconsumed_command (line 97) | def test_put_overwrites_unconsumed_command(self, debug_manager):
method test_put_command_with_embedded_newline_is_passed_verbatim (line 106) | def test_put_command_with_embedded_newline_is_passed_verbatim(self, de...
method test_event_pipe_overwrites_unconsumed_event (line 111) | def test_event_pipe_overwrites_unconsumed_event(self, debug_manager):
FILE: amber/src/test/python/core/architecture/managers/test_embedded_control_message_manager.py
function _channel (line 40) | def _channel(from_name: str, to_name: str = "self", is_control: bool = F...
function _make_ecm (line 48) | def _make_ecm(
function _gateway_with_data_channels (line 63) | def _gateway_with_data_channels(*data_channels: ChannelIdentity):
function _gateway_with_ports (line 71) | def _gateway_with_ports(port_layout: dict, all_channels: set):
class TestEcmAllAlignment (line 88) | class TestEcmAllAlignment:
method test_returns_false_until_all_channels_received (line 89) | def test_returns_false_until_all_channels_received(self):
method test_dict_is_cleaned_up_after_full_alignment (line 100) | def test_dict_is_cleaned_up_after_full_alignment(self):
class TestEcmNoAlignment (line 114) | class TestEcmNoAlignment:
method test_first_message_completes_subsequent_do_not (line 115) | def test_first_message_completes_subsequent_do_not(self):
class TestEcmPortAlignment (line 129) | class TestEcmPortAlignment:
method test_completes_when_a_ports_channels_have_all_arrived (line 130) | def test_completes_when_a_ports_channels_have_all_arrived(self):
method test_unsupported_ecm_type_raises_value_error (line 144) | def test_unsupported_ecm_type_raises_value_error(self):
class TestEcmScope (line 159) | class TestEcmScope:
method test_scope_intersects_with_all_channel_ids (line 160) | def test_scope_intersects_with_all_channel_ids(self):
method test_no_scope_falls_back_to_all_data_channels (line 182) | def test_no_scope_falls_back_to_all_data_channels(self):
FILE: amber/src/test/python/core/architecture/managers/test_exception_manager.py
function _real_exc_info (line 24) | def _real_exc_info() -> ExceptionInfo:
class TestExceptionManager (line 34) | class TestExceptionManager:
method test_initial_state (line 35) | def test_initial_state(self):
method test_set_then_has_exception_true (line 41) | def test_set_then_has_exception_true(self):
method test_get_exc_info_returns_and_clears_current_only (line 49) | def test_get_exc_info_returns_and_clears_current_only(self):
method test_get_exc_info_when_none_returns_none (line 62) | def test_get_exc_info_when_none_returns_none(self):
method test_history_accumulates_in_order (line 66) | def test_history_accumulates_in_order(self):
FILE: amber/src/test/python/core/architecture/managers/test_executor_manager.py
class TestExecutorManager (line 43) | class TestExecutorManager:
method executor_manager (line 47) | def executor_manager(self):
method _mock_r_plugin (line 55) | def _mock_r_plugin(self, executor_class_name, is_source):
method _cleanup_r_plugin (line 78) | def _cleanup_r_plugin(self):
method test_initialization (line 83) | def test_initialization(self, executor_manager):
method test_reject_r_tuple_language (line 88) | def test_reject_r_tuple_language(self, executor_manager):
method test_reject_r_table_language (line 100) | def test_reject_r_table_language(self, executor_manager):
method test_accept_r_tuple_language_with_plugin (line 112) | def test_accept_r_tuple_language_with_plugin(self, executor_manager):
method test_accept_r_table_language_with_plugin (line 123) | def test_accept_r_table_language_with_plugin(self, executor_manager):
method test_accept_r_tuple_source_with_plugin (line 134) | def test_accept_r_tuple_source_with_plugin(self, executor_manager):
method test_accept_r_table_source_with_plugin (line 145) | def test_accept_r_table_source_with_plugin(self, executor_manager):
method test_accept_python_language_regular_operator (line 156) | def test_accept_python_language_regular_operator(self, executor_manager):
method test_accept_python_language_source_operator (line 172) | def test_accept_python_language_source_operator(self, executor_manager):
method test_reject_other_unsupported_languages (line 185) | def test_reject_other_unsupported_languages(self, executor_manager):
method test_gen_module_file_name_increments (line 204) | def test_gen_module_file_name_increments(self, executor_manager):
method test_is_concrete_operator_static_method (line 226) | def test_is_concrete_operator_static_method(self):
method test_regular_operator_is_not_source (line 243) | def test_regular_operator_is_not_source(self, executor_manager):
method test_source_operator_mismatch_raises_error (line 250) | def test_source_operator_mismatch_raises_error(self, executor_manager):
class TestUpdateExecutor (line 287) | class TestUpdateExecutor:
method initialized_manager (line 301) | def initialized_manager(self):
method test_update_preserves_pre_update_dict_state (line 313) | def test_update_preserves_pre_update_dict_state(self, initialized_mana...
method test_update_advances_module_name_monotonically (line 333) | def test_update_advances_module_name_monotonically(self, initialized_m...
method test_update_with_source_mismatch_raises_assertion (line 348) | def test_update_with_source_mismatch_raises_assertion(self, initialize...
method test_update_with_no_operator_class_raises_assertion (line 358) | def test_update_with_no_operator_class_raises_assertion(self, initiali...
method test_update_with_multiple_operator_classes_raises_assertion (line 365) | def test_update_with_multiple_operator_classes_raises_assertion(
method test_repeated_updates_keep_carrying_the_running_state (line 374) | def test_repeated_updates_keep_carrying_the_running_state(
FILE: amber/src/test/python/core/architecture/managers/test_pause_manager.py
class TestPauseManager (line 26) | class TestPauseManager:
method input_queue (line 28) | def input_queue(self):
method state_manager (line 32) | def state_manager(self):
method pause_manager (line 45) | def pause_manager(self, input_queue, state_manager):
method test_it_can_init (line 48) | def test_it_can_init(self, pause_manager):
method test_it_is_not_paused_initially (line 51) | def test_it_is_not_paused_initially(self, pause_manager):
method test_it_can_be_paused_and_resumed (line 54) | def test_it_can_be_paused_and_resumed(self, pause_manager):
method test_it_can_be_paused_when_paused (line 60) | def test_it_can_be_paused_when_paused(self, pause_manager):
method test_it_can_be_resumed_when_resumed (line 68) | def test_it_can_be_resumed_when_resumed(self, pause_manager):
FILE: amber/src/test/python/core/architecture/managers/test_state_manager.py
class TestStateManager (line 28) | class TestStateManager:
method state_manager (line 30) | def state_manager(self):
method test_it_can_init (line 42) | def test_it_can_init(self, state_manager):
method test_it_can_transit_to_defined_state (line 45) | def test_it_can_transit_to_defined_state(self, state_manager):
method test_it_raises_exception_when_transit_to_undefined_state (line 57) | def test_it_raises_exception_when_transit_to_undefined_state(self, sta...
method test_it_raises_exception_when_asserting_a_different_state (line 66) | def test_it_raises_exception_when_asserting_a_different_state(self, st...
FILE: amber/src/test/python/core/architecture/managers/test_state_processing_manager.py
class TestStateProcessingManager (line 22) | class TestStateProcessingManager:
method test_initial_state_is_none (line 23) | def test_initial_state_is_none(self):
method test_get_input_state_returns_then_clears (line 30) | def test_get_input_state_returns_then_clears(self):
method test_get_output_state_returns_then_clears (line 40) | def test_get_output_state_returns_then_clears(self):
method test_input_and_output_slots_are_independent (line 48) | def test_input_and_output_slots_are_independent(self):
FILE: amber/src/test/python/core/architecture/managers/test_statistics_manager.py
function _port (line 24) | def _port(pid: int) -> PortIdentity:
class TestStatisticsManagerDefaults (line 28) | class TestStatisticsManagerDefaults:
method test_get_statistics_with_no_activity (line 29) | def test_get_statistics_with_no_activity(self):
class TestStatisticsManagerInputOutput (line 39) | class TestStatisticsManagerInputOutput:
method test_increase_input_aggregates_count_and_size_per_port (line 40) | def test_increase_input_aggregates_count_and_size_per_port(self):
method test_increase_output_aggregates_count_and_size_per_port (line 55) | def test_increase_output_aggregates_count_and_size_per_port(self):
method test_zero_size_input_is_allowed (line 66) | def test_zero_size_input_is_allowed(self):
method test_negative_size_raises (line 79) | def test_negative_size_raises(self, method):
class TestStatisticsManagerProcessingTime (line 85) | class TestStatisticsManagerProcessingTime:
method test_data_and_control_time_accumulate (line 86) | def test_data_and_control_time_accumulate(self):
method test_zero_processing_time_is_allowed (line 95) | def test_zero_processing_time_is_allowed(self):
method test_negative_time_raises (line 107) | def test_negative_time_raises(self, method):
class TestStatisticsManagerExecutionTime (line 113) | class TestStatisticsManagerExecutionTime:
method test_total_execution_time_is_relative_to_worker_start (line 114) | def test_total_execution_time_is_relative_to_worker_start(self):
method test_total_execution_time_equal_to_start_is_allowed (line 122) | def test_total_execution_time_equal_to_start_is_allowed(self):
method test_total_execution_time_before_start_raises (line 129) | def test_total_execution_time_before_start_raises(self):
method test_idle_time_clamped_to_zero_when_processing_overshoots (line 138) | def test_idle_time_clamped_to_zero_when_processing_overshoots(self):
FILE: amber/src/test/python/core/architecture/managers/test_tuple_processing_manager.py
class TestTupleProcessingManager (line 25) | class TestTupleProcessingManager:
method test_initial_state (line 26) | def test_initial_state(self):
method test_get_internal_marker_consume_once (line 37) | def test_get_internal_marker_consume_once(self):
method test_get_input_tuple_consume_once (line 45) | def test_get_input_tuple_consume_once(self):
method test_get_output_tuple_consume_once (line 53) | def test_get_output_tuple_consume_once(self):
method test_get_input_port_id_returns_zero_when_unset (line 61) | def test_get_input_port_id_returns_zero_when_unset(self):
method test_get_input_port_id_returns_real_port_id (line 69) | def test_get_input_port_id_returns_real_port_id(self):
method test_get_input_port_id_collides_for_port_zero (line 74) | def test_get_input_port_id_collides_for_port_zero(self):
method test_finished_current_event_can_be_signalled (line 86) | def test_finished_current_event_can_be_signalled(self):
method test_input_tuple_does_not_clear_output_or_marker (line 93) | def test_input_tuple_does_not_clear_output_or_marker(self):
FILE: amber/src/test/python/core/architecture/rpc/test_async_rpc_client.py
function _make_client (line 39) | def _make_client():
class TestAsyncRunDecorator (line 48) | class TestAsyncRunDecorator:
method test_runs_coroutine_via_asyncio_run_when_no_loop (line 49) | def test_runs_coroutine_via_asyncio_run_when_no_loop(self):
method test_returns_awaitable_directly_when_called_inside_running_loop (line 58) | def test_returns_awaitable_directly_when_called_inside_running_loop(se...
class TestCreateFuture (line 73) | class TestCreateFuture:
method test_returns_future_instance (line 74) | def test_returns_future_instance(self):
method test_records_promise_at_pre_increment_sequence_and_then_increments (line 80) | def test_records_promise_at_pre_increment_sequence_and_then_increments...
method test_sequence_increments_per_target_independently (line 90) | def test_sequence_increments_per_target_independently(self):
class TestFulfillPromise (line 104) | class TestFulfillPromise:
method _channel (line 105) | def _channel(self, name: str) -> ChannelIdentity:
method test_resolves_matching_future_and_clears_the_entry (line 114) | def test_resolves_matching_future_and_clears_the_entry(self):
method test_silently_logs_when_no_matching_promise_exists (line 125) | def test_silently_logs_when_no_matching_promise_exists(self, monkeypat...
method test_does_not_disturb_unrelated_pending_promises (line 154) | def test_does_not_disturb_unrelated_pending_promises(self):
class TestReceive (line 170) | class TestReceive:
method test_delegates_command_id_and_return_value_to_fulfill_promise (line 171) | def test_delegates_command_id_and_return_value_to_fulfill_promise(self):
class TestProxyStreamBlockers (line 188) | class TestProxyStreamBlockers:
method test_stream_unary_blocked (line 189) | def test_stream_unary_blocked(self):
method test_unary_stream_blocked (line 195) | def test_unary_stream_blocked(self):
method test_stream_stream_blocked (line 201) | def test_stream_stream_blocked(self):
class TestControllerStub (line 208) | class TestControllerStub:
method test_controller_stub_returns_configured_stub (line 209) | def test_controller_stub_returns_configured_stub(self):
method test_controller_stub_unary_unary_is_rewired_with_async_context (line 216) | def test_controller_stub_unary_unary_is_rewired_with_async_context(self):
method test_controller_stub_async_methods_are_wrapped_with_async_run (line 235) | def test_controller_stub_async_methods_are_wrapped_with_async_run(self):
FILE: amber/src/test/python/core/architecture/sendsemantics/test_partitioners.py
function _worker (line 52) | def _worker(name: str) -> ActorVirtualIdentity:
function _channel (line 56) | def _channel(src: str, dst: str) -> ChannelIdentity:
function _tuple (line 60) | def _tuple(**fields) -> Tuple:
function _hashable_tuple (line 64) | def _hashable_tuple(**fields) -> Tuple:
function _snapshot (line 68) | def _snapshot(generator):
class TestBroadcastPartitioner (line 79) | class TestBroadcastPartitioner:
method partitioner (line 81) | def partitioner(self):
method test_init_collects_unique_receivers (line 89) | def test_init_collects_unique_receivers(self):
method test_add_tuple_below_batch_size_yields_nothing (line 104) | def test_add_tuple_below_batch_size_yields_nothing(self, partitioner):
method test_add_tuple_at_batch_size_emits_to_every_receiver_and_resets (line 109) | def test_add_tuple_at_batch_size_emits_to_every_receiver_and_resets(
method test_flush_emits_pending_batch_and_ecm_only_to_target (line 120) | def test_flush_emits_pending_batch_and_ecm_only_to_target(self, partit...
method test_flush_with_empty_batch_emits_only_ecm_for_target (line 127) | def test_flush_with_empty_batch_emits_only_ecm_for_target(self, partit...
method test_flush_to_non_receiver_emits_nothing (line 132) | def test_flush_to_non_receiver_emits_nothing(self, partitioner):
method test_flush_state_emits_pending_batch_and_state_to_every_receiver (line 138) | def test_flush_state_emits_pending_batch_and_state_to_every_receiver(
method test_reset_clears_pending_batch (line 150) | def test_reset_clears_pending_batch(self, partitioner):
class TestRoundRobinPartitioner (line 156) | class TestRoundRobinPartitioner:
method partitioner (line 158) | def partitioner(self):
method test_init_preserves_channel_order (line 166) | def test_init_preserves_channel_order(self, partitioner):
method test_init_dedupes_duplicate_channels_preserving_first_seen_order (line 174) | def test_init_dedupes_duplicate_channels_preserving_first_seen_order(s...
method test_index_advances_modulo_receivers (line 187) | def test_index_advances_modulo_receivers(self, partitioner):
method test_emits_batch_when_a_receiver_slot_fills (line 197) | def test_emits_batch_when_a_receiver_slot_fills(self, partitioner):
method test_flush_emits_pending_batch_and_ecm_for_target_only (line 204) | def test_flush_emits_pending_batch_and_ecm_for_target_only(self, parti...
method test_flush_to_unknown_receiver_emits_nothing (line 213) | def test_flush_to_unknown_receiver_emits_nothing(self, partitioner):
method test_flush_state_emits_pending_batches_and_state_for_each_receiver (line 217) | def test_flush_state_emits_pending_batches_and_state_for_each_receiver(
class TestHashBasedShufflePartitioner (line 235) | class TestHashBasedShufflePartitioner:
method _partitioner (line 236) | def _partitioner(self, batch_size=10, hash_keys=("k",)):
method test_same_key_routes_to_same_receiver_deterministically (line 245) | def test_same_key_routes_to_same_receiver_deterministically(self):
method test_full_batch_yields_and_clears_only_that_slot (line 257) | def test_full_batch_yields_and_clears_only_that_slot(self):
method test_no_hash_attribute_names_falls_back_to_whole_tuple (line 270) | def test_no_hash_attribute_names_falls_back_to_whole_tuple(self):
method test_flush_emits_pending_batch_and_ecm_for_target_only (line 277) | def test_flush_emits_pending_batch_and_ecm_for_target_only(self):
method test_flush_state_emits_pending_batches_and_state (line 285) | def test_flush_state_emits_pending_batches_and_state(self):
class TestRangeBasedShufflePartitioner (line 298) | class TestRangeBasedShufflePartitioner:
method partitioner (line 300) | def partitioner(self):
method test_keys_per_receiver_partitions_range_evenly (line 315) | def test_keys_per_receiver_partitions_range_evenly(self, partitioner):
method test_value_below_range_min_routes_to_first_receiver (line 319) | def test_value_below_range_min_routes_to_first_receiver(self, partitio...
method test_value_above_range_max_routes_to_last_receiver (line 322) | def test_value_above_range_max_routes_to_last_receiver(self, partition...
method test_value_in_range_routes_by_quotient (line 325) | def test_value_in_range_routes_by_quotient(self, partitioner):
method test_add_tuple_routes_using_first_attribute (line 334) | def test_add_tuple_routes_using_first_attribute(self, partitioner):
method test_full_batch_yields_and_clears_only_that_slot (line 343) | def test_full_batch_yields_and_clears_only_that_slot(self):
method test_flush_emits_pending_batch_and_ecm_for_target_only (line 361) | def test_flush_emits_pending_batch_and_ecm_for_target_only(self, parti...
method test_flush_state_emits_pending_batches_and_state (line 370) | def test_flush_state_emits_pending_batches_and_state(self, partitioner):
class TestOneToOnePartitioner (line 382) | class TestOneToOnePartitioner:
method partitioner (line 384) | def partitioner(self):
method test_init_picks_receiver_matching_worker_id (line 396) | def test_init_picks_receiver_matching_worker_id(self, partitioner):
method test_add_tuple_below_batch_yields_nothing (line 399) | def test_add_tuple_below_batch_yields_nothing(self, partitioner):
method test_add_tuple_at_batch_yields_to_unique_receiver_and_resets (line 404) | def test_add_tuple_at_batch_yields_to_unique_receiver_and_resets(self,...
method test_flush_emits_pending_batch_then_ecm (line 410) | def test_flush_emits_pending_batch_then_ecm(self, partitioner):
method test_flush_with_empty_batch_emits_only_ecm (line 417) | def test_flush_with_empty_batch_emits_only_ecm(self, partitioner):
method test_flush_state_emits_pending_batch_then_state (line 421) | def test_flush_state_emits_pending_batch_then_state(self, partitioner):
method test_reset_clears_pending_batch (line 431) | def test_reset_clears_pending_batch(self, partitioner):
FILE: amber/src/test/python/core/models/schema/test_schema.py
class TestSchema (line 25) | class TestSchema:
method raw_schema (line 27) | def raw_schema(self):
method arrow_schema (line 39) | def arrow_schema(self):
method schema (line 53) | def schema(self):
method test_accessors_and_mutators (line 64) | def test_accessors_and_mutators(self, schema):
method test_convert_from_raw_schema (line 86) | def test_convert_from_raw_schema(self, raw_schema, schema):
method test_convert_from_arrow_schema (line 89) | def test_convert_from_arrow_schema(self, arrow_schema, schema):
method test_large_binary_in_raw_schema (line 93) | def test_large_binary_in_raw_schema(self):
method test_large_binary_in_arrow_schema_with_metadata (line 103) | def test_large_binary_in_arrow_schema_with_metadata(self):
method test_large_binary_as_arrow_schema_includes_metadata (line 119) | def test_large_binary_as_arrow_schema_includes_metadata(self):
method test_round_trip_large_binary_schema (line 142) | def test_round_trip_large_binary_schema(self):
FILE: amber/src/test/python/core/models/test_operator.py
class _ConcreteOperator (line 33) | class _ConcreteOperator(TupleOperatorV2):
method process_tuple (line 36) | def process_tuple(self, tuple_, port):
class _ConcreteSource (line 40) | class _ConcreteSource(SourceOperator):
method produce (line 43) | def produce(self):
class _ConcreteBatch (line 47) | class _ConcreteBatch(BatchOperator):
method process_batch (line 50) | def process_batch(self, batch, port):
class _ConcreteTable (line 54) | class _ConcreteTable(TableOperator):
method __init__ (line 57) | def __init__(self):
method process_table (line 61) | def process_table(self, table, port):
class TestPythonTemplateDecoder (line 66) | class TestPythonTemplateDecoder:
method test_stdlib_decoder_decodes_str_input (line 67) | def test_stdlib_decoder_decodes_str_input(self):
method test_stdlib_decoder_accepts_bytes_input (line 72) | def test_stdlib_decoder_accepts_bytes_input(self):
method test_stdlib_decoder_rejects_non_utf8_bytes_strictly (line 77) | def test_stdlib_decoder_rejects_non_utf8_bytes_strictly(self):
method test_default_decoder_when_none_supplied (line 84) | def test_default_decoder_when_none_supplied(self):
method test_uses_injected_custom_decoder (line 89) | def test_uses_injected_custom_decoder(self):
method test_lru_cache_reuses_results_for_repeated_inputs (line 103) | def test_lru_cache_reuses_results_for_repeated_inputs(self):
method test_lru_cache_evicts_when_size_exceeded (line 123) | def test_lru_cache_evicts_when_size_exceeded(self):
class TestIsSourceProperty (line 141) | class TestIsSourceProperty:
method test_default_is_false (line 142) | def test_default_is_false(self):
method test_setter_true_takes_effect (line 146) | def test_setter_true_takes_effect(self):
method test_setter_can_flip_back_to_false (line 151) | def test_setter_can_flip_back_to_false(self):
method test_source_operator_subclass_reports_is_source_true (line 157) | def test_source_operator_subclass_reports_is_source_true(self):
class TestOperatorDefaultMethods (line 162) | class TestOperatorDefaultMethods:
method test_open_is_no_op (line 163) | def test_open_is_no_op(self):
method test_close_is_no_op (line 167) | def test_close_is_no_op(self):
method test_process_state_returns_input_state_unchanged (line 170) | def test_process_state_returns_input_state_unchanged(self):
method test_produce_state_on_start_returns_none_by_default (line 176) | def test_produce_state_on_start_returns_none_by_default(self):
method test_produce_state_on_finish_returns_none_by_default (line 179) | def test_produce_state_on_finish_returns_none_by_default(self):
class TestLazyTemplateDecoder (line 183) | class TestLazyTemplateDecoder:
method test_first_call_creates_decoder_and_caches_on_instance (line 184) | def test_first_call_creates_decoder_and_caches_on_instance(self):
method test_subsequent_calls_reuse_the_cached_decoder (line 190) | def test_subsequent_calls_reuse_the_cached_decoder(self):
method test_decode_python_template_delegates_to_lazy_decoder (line 196) | def test_decode_python_template_delegates_to_lazy_decoder(self):
class TestBatchOperatorValidation (line 202) | class TestBatchOperatorValidation:
method test_validate_batch_size_rejects_none (line 203) | def test_validate_batch_size_rejects_none(self):
method test_validate_batch_size_rejects_non_int (line 207) | def test_validate_batch_size_rejects_non_int(self):
method test_validate_batch_size_rejects_zero (line 211) | def test_validate_batch_size_rejects_zero(self):
method test_validate_batch_size_rejects_negative (line 215) | def test_validate_batch_size_rejects_negative(self):
method test_validate_batch_size_accepts_positive_int (line 219) | def test_validate_batch_size_accepts_positive_int(self):
method test_concrete_batch_operator_initializes_with_valid_size (line 224) | def test_concrete_batch_operator_initializes_with_valid_size(self):
class TestTableOperator (line 229) | class TestTableOperator:
method test_process_tuple_buffers_input_and_yields_none (line 230) | def test_process_tuple_buffers_input_and_yields_none(self):
method test_on_finish_calls_process_table_with_buffered_tuples (line 240) | def test_on_finish_calls_process_table_with_buffered_tuples(self):
method test_on_finish_with_no_buffered_tuples_yields_empty_table (line 253) | def test_on_finish_with_no_buffered_tuples_yields_empty_table(self):
method test_buffers_are_keyed_by_port (line 259) | def test_buffers_are_keyed_by_port(self):
FILE: amber/src/test/python/core/models/test_state.py
class TestState (line 23) | class TestState:
method test_state_subclasses_dict (line 24) | def test_state_subclasses_dict(self):
method test_class_attributes (line 30) | def test_class_attributes(self):
method test_json_round_trip_primitives (line 34) | def test_json_round_trip_primitives(self):
method test_json_round_trip_empty (line 48) | def test_json_round_trip_empty(self):
method test_json_round_trip_bytes (line 51) | def test_json_round_trip_bytes(self):
method test_json_round_trip_nested_dict (line 57) | def test_json_round_trip_nested_dict(self):
method test_json_round_trip_list_of_mixed_values (line 62) | def test_json_round_trip_list_of_mixed_values(self):
method test_json_round_trip_bytes_inside_list_and_nested_dict (line 67) | def test_json_round_trip_bytes_inside_list_and_nested_dict(self):
method test_to_json_rejects_non_serializable_value (line 78) | def test_to_json_rejects_non_serializable_value(self):
method test_tuple_round_trip (line 85) | def test_tuple_round_trip(self):
method test_to_tuple_uses_state_schema (line 90) | def test_to_tuple_uses_state_schema(self):
method test_nested_dict_decodes_to_plain_dict (line 95) | def test_nested_dict_decodes_to_plain_dict(self):
FILE: amber/src/test/python/core/models/test_table.py
class TestTable (line 27) | class TestTable:
method a_timestamp (line 29) | def a_timestamp(self):
method target_raw_tuples (line 33) | def target_raw_tuples(self, a_timestamp):
method target_tuples (line 58) | def target_tuples(self, target_raw_tuples):
method target_table (line 62) | def target_table(self, target_raw_tuples):
method target_data_frame (line 66) | def target_data_frame(self, a_timestamp):
method test_table_creation (line 93) | def test_table_creation(self, target_table, a_timestamp):
method test_as_tuples_preserve_types (line 111) | def test_as_tuples_preserve_types(self, target_table, target_tuples):
method test_table_from_data_frame (line 114) | def test_table_from_data_frame(self, target_table, target_data_frame):
method test_table_from_list_of_tuples (line 117) | def test_table_from_list_of_tuples(self, target_table, target_tuples):
method test_table_from_list_of_series (line 122) | def test_table_from_list_of_series(
method test_table_from_table (line 130) | def test_table_from_table(self, target_table, target_tuples):
method test_use_table_as_data_frame (line 135) | def test_use_table_as_data_frame(self, target_table, target_data_frame):
method test_validation_of_schema (line 142) | def test_validation_of_schema(self):
FILE: amber/src/test/python/core/models/test_tuple.py
class TestTuple (line 29) | class TestTuple:
method target_tuple (line 31) | def target_tuple(self):
method test_tuple_from_list (line 34) | def test_tuple_from_list(self, target_tuple):
method test_tuple_from_dict (line 37) | def test_tuple_from_dict(self, target_tuple):
method test_tuple_from_series (line 40) | def test_tuple_from_series(self, target_tuple):
method test_tuple_as_key_value_pairs (line 43) | def test_tuple_as_key_value_pairs(self, target_tuple):
method test_tuple_as_dict (line 46) | def test_tuple_as_dict(self, target_tuple):
method test_tuple_as_series (line 49) | def test_tuple_as_series(self, target_tuple):
method test_tuple_get_fields (line 52) | def test_tuple_get_fields(self, target_tuple):
method test_tuple_get_field_names (line 55) | def test_tuple_get_field_names(self, target_tuple):
method test_tuple_get_item (line 58) | def test_tuple_get_item(self, target_tuple):
method test_tuple_set_item (line 64) | def test_tuple_set_item(self, target_tuple):
method test_tuple_str (line 74) | def test_tuple_str(self, target_tuple):
method test_tuple_repr (line 77) | def test_tuple_repr(self, target_tuple):
method test_tuple_eq (line 80) | def test_tuple_eq(self, target_tuple):
method test_tuple_ne (line 84) | def test_tuple_ne(self, target_tuple):
method test_reject_empty_tuplelike (line 88) | def test_reject_empty_tuplelike(self):
method test_reject_invalid_tuplelike (line 96) | def test_reject_invalid_tuplelike(self):
method test_tuple_lazy_get_from_arrow (line 104) | def test_tuple_lazy_get_from_arrow(self):
method test_retrieve_tuple_from_empty_arrow_table (line 114) | def test_retrieve_tuple_from_empty_arrow_table(self):
method test_finalize_tuple (line 124) | def test_finalize_tuple(self):
method test_hash (line 140) | def test_hash(self):
method test_tuple_with_large_binary (line 225) | def test_tuple_with_large_binary(self):
method test_tuple_from_arrow_with_large_binary (line 250) | def test_tuple_from_arrow_with_large_binary(self):
method test_tuple_with_null_large_binary (line 289) | def test_tuple_with_null_large_binary(self):
FILE: amber/src/test/python/core/models/type/test_large_binary.py
class TestLargeBinary (line 23) | class TestLargeBinary:
method test_create_with_uri (line 24) | def test_create_with_uri(self):
method test_create_without_uri (line 32) | def test_create_without_uri(self):
method test_invalid_uri_raises_value_error (line 40) | def test_invalid_uri_raises_value_error(self):
method test_get_bucket_name (line 48) | def test_get_bucket_name(self):
method test_get_object_key (line 53) | def test_get_object_key(self):
method test_get_object_key_with_leading_slash (line 58) | def test_get_object_key_with_leading_slash(self):
method test_equality (line 64) | def test_equality(self):
method test_hash (line 75) | def test_hash(self):
method test_uri_property (line 84) | def test_uri_property(self):
FILE: amber/src/test/python/core/proxy/test_proxy_client.py
class TestProxyClient (line 27) | class TestProxyClient:
method data_queue (line 29) | def data_queue(self):
method server (line 33) | def server(self):
method server_with_dp (line 39) | def server_with_dp(self, data_queue):
class MockFlightMetadataReader (line 49) | class MockFlightMetadataReader:
class MockBuffer (line 55) | class MockBuffer:
method to_pybytes (line 56) | def to_pybytes(self):
method read (line 60) | def read(self):
method client (line 64) | def client(self):
method data_table (line 96) | def data_table(self):
method test_client_can_connect_to_server (line 106) | def test_client_can_connect_to_server(self, server, client):
method test_client_can_shutdown_server (line 109) | def test_client_can_shutdown_server(self, server, client):
method test_client_can_call_registered_lambdas (line 112) | def test_client_can_call_registered_lambdas(self, server, client):
method test_client_can_call_registered_function (line 121) | def test_client_can_call_registered_function(self, server, client):
method test_client_can_call_registered_callable_class (line 131) | def test_client_can_call_registered_callable_class(self, server, client):
method test_client_cannot_send_data_without_handler (line 142) | def test_client_cannot_send_data_without_handler(self, server, client,...
method test_client_can_send_data_with_handler (line 147) | def test_client_can_send_data_with_handler(
FILE: amber/src/test/python/core/proxy/test_proxy_server.py
class TestProxyServer (line 24) | class TestProxyServer:
method server (line 26) | def server(self):
method test_server_can_register_control_actions_with_lambda (line 31) | def test_server_can_register_control_actions_with_lambda(self, server):
method test_server_can_register_control_actions_with_function (line 36) | def test_server_can_register_control_actions_with_function(self, server):
method test_server_can_register_control_actions_with_callable_class (line 44) | def test_server_can_register_control_actions_with_callable_class(self,...
method test_server_can_invoke_registered_control_actions (line 53) | def test_server_can_invoke_registered_control_actions(self, server):
FILE: amber/src/test/python/core/runnables/test_console_message.py
class TestConsoleMessage (line 37) | class TestConsoleMessage:
method internal_queue (line 39) | def internal_queue(self):
method timed_buffer (line 43) | def timed_buffer(self):
method console_message (line 47) | def console_message(self):
method mock_controller_channel (line 58) | def mock_controller_channel(self):
method test_console_message_serialization (line 64) | def test_console_message_serialization(
FILE: amber/src/test/python/core/runnables/test_data_processor.py
function context (line 29) | def context():
function data_processor (line 34) | def data_processor(context, monkeypatch):
class _StubExecutor (line 50) | class _StubExecutor:
method __init__ (line 57) | def __init__(self):
method produce_state_on_start (line 60) | def produce_state_on_start(self, port_id):
method produce_state_on_finish (line 64) | def produce_state_on_finish(self, port_id):
method on_finish (line 68) | def on_finish(self, port_id):
class TestProcessInternalMarker (line 73) | class TestProcessInternalMarker:
method test_start_channel_invokes_produce_state_on_start (line 75) | def test_start_channel_invokes_produce_state_on_start(
method test_end_channel_flushes_state_then_drains_on_finish (line 94) | def test_end_channel_flushes_state_then_drains_on_finish(
class TestExecutorSession (line 116) | class TestExecutorSession:
method test_exception_inside_session_is_reported_before_the_switch (line 118) | def test_exception_inside_session_is_reported_before_the_switch(
method test_clean_session_does_not_record_an_exception (line 158) | def test_clean_session_does_not_record_an_exception(self, context, dat...
class TestRunInvariant (line 171) | class TestRunInvariant:
method _drive_run_synchronously (line 179) | def _drive_run_synchronously(context, monkeypatch) -> DataProcessor:
method test_zero_queued_inputs_raises_invariant_error (line 189) | def test_zero_queued_inputs_raises_invariant_error(self, context, monk...
method test_two_queued_inputs_raises_invariant_error (line 198) | def test_two_queued_inputs_raises_invariant_error(self, context, monke...
FILE: amber/src/test/python/core/runnables/test_heartbeat.py
function make_heartbeat (line 27) | def make_heartbeat(host="localhost", port=12345, interval=0.05, event=No...
class TestHeartbeatInit (line 31) | class TestHeartbeatInit:
method test_parses_host_and_port_from_grpc_tcp_url (line 32) | def test_parses_host_and_port_from_grpc_tcp_url(self):
method test_records_interval_and_stop_event_references (line 37) | def test_records_interval_and_stop_event_references(self):
method test_captures_original_parent_pid_at_construction_time (line 43) | def test_captures_original_parent_pid_at_construction_time(self):
method test_supports_ipv6_host_in_bracketed_form (line 48) | def test_supports_ipv6_host_in_bracketed_form(self):
class TestCheckHeartbeat (line 54) | class TestCheckHeartbeat:
method test_returns_true_when_socket_connects (line 55) | def test_returns_true_when_socket_connects(self):
method test_returns_false_when_socket_connection_raises (line 66) | def test_returns_false_when_socket_connection_raises(self):
method test_returns_false_when_socket_connection_times_out (line 74) | def test_returns_false_when_socket_connection_times_out(self):
method test_returns_false_when_socket_close_raises (line 82) | def test_returns_false_when_socket_close_raises(self):
class TestRunEarlyExit (line 98) | class TestRunEarlyExit:
method test_returns_immediately_when_stop_event_is_already_set (line 100) | def test_returns_immediately_when_stop_event_is_already_set(self):
function test_init_accepts_full_port_range (line 115) | def test_init_accepts_full_port_range(port):
FILE: amber/src/test/python/core/runnables/test_main_loop.py
class TestMainLoop (line 90) | class TestMainLoop:
method command_sequence (line 92) | def command_sequence(self):
method mock_link (line 96) | def mock_link(self):
method mock_tuple (line 105) | def mock_tuple(self):
method mock_binary_tuple (line 109) | def mock_binary_tuple(self):
method mock_batch (line 113) | def mock_batch(self):
method mock_sender_actor (line 120) | def mock_sender_actor(self):
method mock_data_input_channel (line 124) | def mock_data_input_channel(self):
method mock_data_output_channel (line 132) | def mock_data_output_channel(self):
method mock_control_input_channel (line 140) | def mock_control_input_channel(self):
method mock_control_output_channel (line 148) | def mock_control_output_channel(self):
method mock_receiver_actor (line 156) | def mock_receiver_actor(self):
method mock_data_element (line 160) | def mock_data_element(self, mock_tuple, mock_data_input_channel):
method mock_state_data_elements (line 171) | def mock_state_data_elements(self, mock_data_input_channel):
method state_processing_executor (line 184) | def state_processing_executor(self):
method mock_binary_data_element (line 218) | def mock_binary_data_element(self, mock_binary_tuple, mock_data_input_...
method mock_batch_data_elements (line 229) | def mock_batch_data_elements(self, mock_batch, mock_data_input_channel):
method mock_end_of_upstream (line 247) | def mock_end_of_upstream(self, mock_tuple, mock_data_input_channel):
method input_queue (line 266) | def input_queue(self):
method output_queue (line 270) | def output_queue(self):
method mock_assign_input_port (line 274) | def mock_assign_input_port(
method mock_assign_output_port (line 292) | def mock_assign_output_port(
method mock_assign_input_port_binary (line 310) | def mock_assign_input_port_binary(
method mock_assign_output_port_binary (line 332) | def mock_assign_output_port_binary(
method mock_add_input_channel (line 350) | def mock_add_input_channel(
method mock_raw_schema (line 380) | def mock_raw_schema(self):
method mock_binary_raw_schema (line 384) | def mock_binary_raw_schema(self):
method mock_initialize_executor (line 388) | def mock_initialize_executor(
method mock_initialize_batch_count_executor (line 417) | def mock_initialize_batch_count_executor(
method mock_add_partitioning (line 448) | def mock_add_partitioning(
method mock_query_statistics (line 485) | def mock_query_statistics(
method mock_pause (line 500) | def mock_pause(
method mock_resume (line 513) | def mock_resume(
method main_loop (line 526) | def main_loop(self, input_queue, output_queue, mock_link):
method main_loop_thread (line 532) | def main_loop_thread(self, main_loop, reraise):
method check_batch_rank_sum (line 541) | def check_batch_rank_sum(
method test_main_loop_thread_can_start (line 565) | def test_main_loop_thread_can_start(self, main_loop_thread):
method test_main_loop_thread_can_process_messages (line 570) | def test_main_loop_thread_can_process_messages(
method test_batch_dp_thread_can_process_batch (line 802) | def test_batch_dp_thread_can_process_batch(
method test_main_loop_thread_can_process_single_tuple_with_binary (line 998) | def test_main_loop_thread_can_process_single_tuple_with_binary(
method send_pause (line 1094) | def send_pause(
method send_resume (line 1115) | def send_resume(
method test_process_state_can_emit_consecutive_states (line 1136) | def test_process_state_can_emit_consecutive_states(
method test_main_loop_thread_can_align_ecm (line 1187) | def test_main_loop_thread_can_align_ecm(
method test_process_state_can_emit_multiple_states (line 1341) | def test_process_state_can_emit_multiple_states(
method test_main_loop_thread_can_process_state (line 1397) | def test_main_loop_thread_can_process_state(
method test_main_loop_thread_can_process_state_after_tuple (line 1502) | def test_main_loop_thread_can_process_state_after_tuple(
method test_console_message_rpc_fires_before_exception_pause (line 1573) | def test_console_message_rpc_fires_before_exception_pause(
FILE: amber/src/test/python/core/runnables/test_network_receiver.py
class TestNetworkReceiver (line 50) | class TestNetworkReceiver:
method input_queue (line 52) | def input_queue(self):
method output_queue (line 56) | def output_queue(self):
method network_receiver (line 60) | def network_receiver(self, output_queue):
class MockFlightMetadataReader (line 65) | class MockFlightMetadataReader:
class MockBuffer (line 71) | class MockBuffer:
method to_pybytes (line 72) | def to_pybytes(self):
method read (line 76) | def read(self):
method network_sender_thread (line 80) | def network_sender_thread(self, input_queue):
method data_payload (line 116) | def data_payload(self):
method test_network_receiver_can_receive_data_messages (line 127) | def test_network_receiver_can_receive_data_messages(
method test_network_receiver_can_receive_consecutive_state_messages (line 144) | def test_network_receiver_can_receive_consecutive_state_messages(
method test_network_receiver_can_receive_control_messages (line 180) | def test_network_receiver_can_receive_control_messages(
method test_network_receiver_can_receive_ecm (line 198) | def test_network_receiver_can_receive_ecm(
FILE: amber/src/test/python/core/runnables/test_network_sender.py
class TestNetworkSender (line 27) | class TestNetworkSender:
method network_receiver (line 29) | def network_receiver(self):
method network_receiver_thread (line 35) | def network_receiver_thread(self, network_receiver):
method network_sender (line 40) | def network_sender(self):
method network_sender_thread (line 46) | def network_sender_thread(self, network_sender):
method test_network_sender_can_stop (line 51) | def test_network_sender_can_stop(
FILE: amber/src/test/python/core/storage/iceberg/test_iceberg_document.py
class TestIcebergDocument (line 61) | class TestIcebergDocument:
method amber_schema (line 63) | def amber_schema(self):
method iceberg_document (line 78) | def iceberg_document(self, amber_schema):
method sample_items (line 101) | def sample_items(self, amber_schema) -> [Tuple]:
method test_basic_read_and_write (line 173) | def test_basic_read_and_write(self, iceberg_document, sample_items):
method test_clear_document (line 185) | def test_clear_document(self, iceberg_document, sample_items):
method test_handle_empty_read (line 199) | def test_handle_empty_read(self, iceberg_document):
method test_concurrent_writes_followed_by_read (line 206) | def test_concurrent_writes_followed_by_read(self, iceberg_document, sa...
method test_read_using_range (line 250) | def test_read_using_range(self, iceberg_document, sample_items):
method test_get_after (line 281) | def test_get_after(self, iceberg_document, sample_items):
method test_get_counts (line 312) | def test_get_counts(self, iceberg_document, sample_items):
FILE: amber/src/test/python/core/storage/iceberg/test_iceberg_rest_catalog_integration.py
function rest_catalog (line 31) | def rest_catalog():
function test_rest_catalog_round_trip (line 43) | def test_rest_catalog_round_trip(rest_catalog):
FILE: amber/src/test/python/core/storage/iceberg/test_iceberg_utils_catalog.py
class TestCreatePostgresCatalog (line 24) | class TestCreatePostgresCatalog:
method test_warehouse_is_passed_without_file_scheme (line 37) | def test_warehouse_is_passed_without_file_scheme(self):
method test_windows_style_warehouse_is_passed_verbatim (line 55) | def test_windows_style_warehouse_is_passed_verbatim(self):
method test_postgres_uri_is_built_with_pg8000_scheme (line 77) | def test_postgres_uri_is_built_with_pg8000_scheme(self):
FILE: amber/src/test/python/core/storage/iceberg/test_iceberg_utils_large_binary.py
class TestIcebergUtilsLargeBinary (line 34) | class TestIcebergUtilsLargeBinary:
method test_encode_large_binary_field_name (line 35) | def test_encode_large_binary_field_name(self):
method test_decode_large_binary_field_name (line 46) | def test_decode_large_binary_field_name(self):
method test_amber_schema_to_iceberg_schema_with_large_binary (line 55) | def test_amber_schema_to_iceberg_schema_with_large_binary(self):
method test_iceberg_schema_to_amber_schema_with_large_binary (line 76) | def test_iceberg_schema_to_amber_schema_with_large_binary(self):
method test_amber_tuples_to_arrow_table_with_large_binary (line 108) | def test_amber_tuples_to_arrow_table_with_large_binary(self):
method test_arrow_table_to_amber_tuples_with_large_binary (line 140) | def test_arrow_table_to_amber_tuples_with_large_binary(self):
method test_round_trip_large_binary_tuples (line 177) | def test_round_trip_large_binary_tuples(self):
method test_arrow_table_to_amber_tuples_with_null_large_binary (line 205) | def test_arrow_table_to_amber_tuples_with_null_large_binary(self):
FILE: amber/src/test/python/core/test_python_worker.py
class _FakeReceiver (line 23) | class _FakeReceiver:
method __init__ (line 24) | def __init__(self, input_queue, host):
method register_shutdown (line 32) | def register_shutdown(self, cb):
method run (line 35) | def run(self):
method stop (line 38) | def stop(self):
class _FakeSender (line 42) | class _FakeSender:
method __init__ (line 43) | def __init__(self, output_queue, host, port, handshake_port):
method run (line 50) | def run(self):
method stop (line 53) | def stop(self):
class _FakeMainLoop (line 57) | class _FakeMainLoop:
method __init__ (line 58) | def __init__(self, worker_id, input_queue, output_queue):
method run (line 62) | def run(self):
method stop (line 65) | def stop(self):
class _FakeHeartbeat (line 69) | class _FakeHeartbeat:
method __init__ (line 70) | def __init__(self, host, port, interval, stop_event):
method run (line 77) | def run(self):
method stop (line 80) | def stop(self):
function stub_network (line 85) | def stub_network(monkeypatch):
class TestPythonWorker (line 92) | class TestPythonWorker:
method test_construction_wires_dependencies (line 94) | def test_construction_wires_dependencies(self, stub_network):
method test_stop_cascades_to_main_loop_sender_and_heartbeat (line 106) | def test_stop_cascades_to_main_loop_sender_and_heartbeat(self, stub_ne...
method test_run_sets_stop_event_after_main_loop_returns (line 116) | def test_run_sets_stop_event_after_main_loop_returns(self, stub_network):
FILE: amber/src/test/python/core/util/console_message/test_replace_print.py
class CapturingBuffer (line 31) | class CapturingBuffer:
method __init__ (line 34) | def __init__(self):
method put (line 37) | def put(self, msg):
class TestReplacePrintLifecycle (line 41) | class TestReplacePrintLifecycle:
method test_print_is_replaced_inside_the_context_and_restored_on_exit (line 42) | def test_print_is_replaced_inside_the_context_and_restored_on_exit(self):
method test_print_is_restored_even_when_the_block_raises (line 49) | def test_print_is_restored_even_when_the_block_raises(self):
method test_exit_returns_true_for_clean_block_and_false_for_raising_block (line 57) | def test_exit_returns_true_for_clean_block_and_false_for_raising_block...
class TestReplacePrintBufferPayload (line 75) | class TestReplacePrintBufferPayload:
method test_print_inside_context_enqueues_a_console_message (line 76) | def test_print_inside_context_enqueues_a_console_message(self):
method test_joins_args_via_the_real_print_so_sep_and_end_kwargs_apply (line 88) | def test_joins_args_via_the_real_print_so_sep_and_end_kwargs_apply(self):
method test_each_print_call_produces_one_buffer_entry (line 94) | def test_each_print_call_produces_one_buffer_entry(self):
method test_print_with_file_kwarg_bypasses_the_buffer (line 104) | def test_print_with_file_kwarg_bypasses_the_buffer(self):
method test_source_field_records_caller_module_function_and_line (line 116) | def test_source_field_records_caller_module_function_and_line(self):
FILE: amber/src/test/python/core/util/customized_queue/test_inner.py
class TestRawInner (line 28) | class TestRawInner:
method test_returns_the_class_unchanged (line 29) | def test_returns_the_class_unchanged(self):
class TestStaticInner (line 38) | class TestStaticInner:
method test_assigns_owner_to_outer_class_at_definition_time (line 39) | def test_assigns_owner_to_outer_class_at_definition_time(self):
method test_inner_class_is_accessible_directly_on_outer (line 49) | def test_inner_class_is_accessible_directly_on_outer(self):
class TestClassInnerDescriptorGuard (line 60) | class TestClassInnerDescriptorGuard:
method test_rejects_classes_that_implement_descriptor_methods (line 62) | def test_rejects_classes_that_implement_descriptor_methods(self, descr...
class TestClassInnerCarriedInheritance (line 71) | class TestClassInnerCarriedInheritance:
method test_subclass_of_outer_gets_a_derived_inner_class (line 72) | def test_subclass_of_outer_gets_a_derived_inner_class(self):
class TestInnerInstanceBinding (line 94) | class TestInnerInstanceBinding:
method test_outer_instance_inner_call_binds_owner_to_that_outer_instance (line 95) | def test_outer_instance_inner_call_binds_owner_to_that_outer_instance(...
class TestInnerProperty (line 122) | class TestInnerProperty:
method test_property_auto_instantiates_inner_on_access (line 123) | def test_property_auto_instantiates_inner_on_access(self):
method test_property_returns_a_new_instance_each_access (line 137) | def test_property_returns_a_new_instance_each_access(self):
class TestInnerCachedProperty (line 153) | class TestInnerCachedProperty:
method test_cached_property_returns_the_same_instance_on_repeat_access (line 154) | def test_cached_property_returns_the_same_instance_on_repeat_access(se...
method test_cached_property_caches_independently_per_outer_instance (line 170) | def test_cached_property_caches_independently_per_outer_instance(self):
FILE: amber/src/test/python/core/util/customized_queue/test_linked_blocking_multi_queue.py
class TestLinkedBlockingMultiQueue (line 28) | class TestLinkedBlockingMultiQueue:
method queue (line 30) | def queue(self):
method test_sub_can_emit (line 36) | def test_sub_can_emit(self, queue):
method test_main_can_emit (line 45) | def test_main_can_emit(self, queue):
method test_main_can_emit_before_sub (line 52) | def test_main_can_emit_before_sub(self, queue):
method test_can_maintain_order_respectively (line 63) | def test_can_maintain_order_respectively(self, queue):
method test_can_disable_sub (line 77) | def test_can_disable_sub(self, queue):
method test_producer_first_insert_sub (line 102) | def test_producer_first_insert_sub(self, queue, reraise):
method test_consumer_first_insert_sub (line 115) | def test_consumer_first_insert_sub(self, queue, reraise):
method test_producer_first_insert_main (line 129) | def test_producer_first_insert_main(self, queue, reraise):
method test_consumer_first_insert_main (line 142) | def test_consumer_first_insert_main(self, queue, reraise):
method test_multiple_producer_race (line 156) | def test_multiple_producer_race(self, queue, reraise):
method test_multi_types (line 192) | def test_multi_types(
method test_common_single_producer_single_consumer (line 204) | def test_common_single_producer_single_consumer(self, queue, reraise):
FILE: amber/src/test/python/core/util/test_atomic.py
class TestAtomicIntegerSingleThreaded (line 25) | class TestAtomicIntegerSingleThreaded:
method test_default_starts_at_zero (line 26) | def test_default_starts_at_zero(self):
method test_initial_value_is_coerced_to_int (line 29) | def test_initial_value_is_coerced_to_int(self):
method test_inc_returns_new_value_after_adding_default_one (line 35) | def test_inc_returns_new_value_after_adding_default_one(self):
method test_inc_with_custom_delta_uses_int_coercion (line 40) | def test_inc_with_custom_delta_uses_int_coercion(self):
method test_dec_is_inc_with_negated_delta (line 46) | def test_dec_is_inc_with_negated_delta(self):
method test_get_and_inc_returns_pre_increment_value (line 51) | def test_get_and_inc_returns_pre_increment_value(self):
method test_get_and_dec_returns_pre_decrement_value (line 56) | def test_get_and_dec_returns_pre_decrement_value(self):
method test_value_setter_replaces_state_with_int_coercion (line 61) | def test_value_setter_replaces_state_with_int_coercion(self):
method test_get_and_set_currently_deadlocks_on_non_reentrant_lock (line 68) | def test_get_and_set_currently_deadlocks_on_non_reentrant_lock(self):
method test_get_and_set_should_return_old_value_and_replace_state (line 117) | def test_get_and_set_should_return_old_value_and_replace_state(self):
class TestAtomicIntegerThreadSafety (line 123) | class TestAtomicIntegerThreadSafety:
method test_inc_under_concurrent_threads_is_lossless (line 124) | def test_inc_under_concurrent_threads_is_lossless(self):
FILE: amber/src/test/python/core/util/test_expression_evaluator.py
class TestExpressionEvaluator (line 25) | class TestExpressionEvaluator:
method test_evaluate_basic_expressions (line 26) | def test_evaluate_basic_expressions(self):
method test_evaluate_str_expression (line 55) | def test_evaluate_str_expression(self):
method test_evaluate_object_expression (line 189) | def test_evaluate_object_expression(self):
method test_evaluate_container_expressions (line 229) | def test_evaluate_container_expressions(self):
method test_evaluate_in_another_context (line 453) | def test_evaluate_in_another_context(self):
FILE: amber/src/test/python/core/util/test_virtual_identity.py
function _gpi (line 35) | def _gpi(
class TestGetWorkerIndex (line 51) | class TestGetWorkerIndex:
method test_extracts_trailing_numeric_index_from_worker_actor_name (line 52) | def test_extracts_trailing_numeric_index_from_worker_actor_name(self):
method test_handles_multi_digit_indexes (line 55) | def test_handles_multi_digit_indexes(self):
method test_raises_value_error_on_unmatched_actor_name (line 58) | def test_raises_value_error_on_unmatched_actor_name(self):
method test_raises_value_error_on_partial_match (line 63) | def test_raises_value_error_on_partial_match(self):
method test_extracts_trailing_index_even_when_layer_name_contains_hyphens (line 68) | def test_extracts_trailing_index_even_when_layer_name_contains_hyphens...
class TestSerializeGlobalPortIdentity (line 79) | class TestSerializeGlobalPortIdentity:
method test_emits_documented_format_for_canonical_input (line 80) | def test_emits_documented_format_for_canonical_input(self):
method test_lowercases_boolean_fields (line 87) | def test_lowercases_boolean_fields(self):
method test_round_trips_through_deserialize (line 95) | def test_round_trips_through_deserialize(self):
class TestDeserializeGlobalPortIdentity (line 109) | class TestDeserializeGlobalPortIdentity:
method test_parses_canonical_encoded_string (line 110) | def test_parses_canonical_encoded_string(self):
method test_treats_boolean_capitalization_case_insensitively (line 119) | def test_treats_boolean_capitalization_case_insensitively(self):
method test_raises_value_error_on_malformed_input (line 128) | def test_raises_value_error_on_malformed_input(self):
method test_raises_value_error_on_missing_field (line 132) | def test_raises_value_error_on_missing_field(self):
class TestGetFromActorIdForInputPortStorage (line 141) | class TestGetFromActorIdForInputPortStorage:
method test_prefixes_materialization_reader_to_uri_plus_actor_name (line 142) | def test_prefixes_materialization_reader_to_uri_plus_actor_name(self):
FILE: amber/src/test/python/pytexera/storage/test_dataset_file_document.py
function auth_env (line 31) | def auth_env(monkeypatch):
function make_response (line 37) | def make_response(status_code: int, body=None, content: bytes = b""):
class TestDatasetFileDocumentInit (line 46) | class TestDatasetFileDocumentInit:
method test_parses_minimal_four_part_path (line 47) | def test_parses_minimal_four_part_path(self, auth_env):
method test_joins_nested_relative_path_back_with_slashes (line 54) | def test_joins_nested_relative_path_back_with_slashes(self, auth_env):
method test_strips_leading_and_trailing_slashes_before_parsing (line 58) | def test_strips_leading_and_trailing_slashes_before_parsing(self, auth...
method test_rejects_path_with_fewer_than_four_segments (line 63) | def test_rejects_path_with_fewer_than_four_segments(self, auth_env):
method test_requires_jwt_token_in_environment (line 67) | def test_requires_jwt_token_in_environment(self, monkeypatch):
method test_treats_empty_jwt_as_missing (line 73) | def test_treats_empty_jwt_as_missing(self, monkeypatch):
method test_falls_back_to_default_endpoint_when_env_missing (line 79) | def test_falls_back_to_default_endpoint_when_env_missing(self, monkeyp...
method test_uses_explicit_endpoint_from_environment (line 85) | def test_uses_explicit_endpoint_from_environment(self, auth_env):
class TestGetPresignedUrl (line 90) | class TestGetPresignedUrl:
method _make_doc (line 91) | def _make_doc(self, monkeypatch, path="/bob@x.com/ds/v1/file.csv"):
method test_returns_presigned_url_field_from_json_body (line 96) | def test_returns_presigned_url_field_from_json_body(self, monkeypatch):
method test_sends_bearer_authorization_header_with_jwt (line 104) | def test_sends_bearer_authorization_header_with_jwt(self, monkeypatch):
method test_url_encodes_filepath_query_parameter (line 112) | def test_url_encodes_filepath_query_parameter(self, monkeypatch):
method test_calls_configured_endpoint (line 125) | def test_calls_configured_endpoint(self, monkeypatch):
method test_raises_runtime_error_with_status_and_body_on_failure (line 133) | def test_raises_runtime_error_with_status_and_body_on_failure(self, mo...
method test_returns_none_when_response_body_lacks_presigned_url_key (line 140) | def test_returns_none_when_response_body_lacks_presigned_url_key(self,...
class TestReadFile (line 149) | class TestReadFile:
method _make_doc (line 150) | def _make_doc(self, monkeypatch):
method test_returns_bytesio_with_downloaded_content (line 155) | def test_returns_bytesio_with_downloaded_content(self, monkeypatch):
method test_propagates_presigned_url_failure (line 166) | def test_propagates_presigned_url_failure(self, monkeypatch):
method test_raises_runtime_error_when_download_fails (line 173) | def test_raises_runtime_error_when_download_fails(self, monkeypatch):
method test_downloads_from_presigned_url_returned_by_first_call (line 183) | def test_downloads_from_presigned_url_returned_by_first_call(self, mon...
FILE: amber/src/test/python/pytexera/storage/test_large_binary_input_stream.py
class TestLargeBinaryInputStream (line 26) | class TestLargeBinaryInputStream:
method large_binary (line 28) | def large_binary(self):
method mock_s3_response (line 33) | def mock_s3_response(self):
method test_init_with_valid_large_binary (line 37) | def test_init_with_valid_large_binary(self, large_binary):
method test_init_with_none_raises_error (line 47) | def test_init_with_none_raises_error(self):
method test_lazy_init_downloads_from_s3 (line 52) | def test_lazy_init_downloads_from_s3(self, large_binary, mock_s3_respo...
method test_read_all (line 75) | def test_read_all(self, large_binary, mock_s3_response):
method test_read_partial (line 89) | def test_read_partial(self, large_binary, mock_s3_response):
method test_readline (line 103) | def test_readline(self, large_binary):
method test_readlines (line 118) | def test_readlines(self, large_binary):
method test_readable (line 133) | def test_readable(self, large_binary):
method test_seekable (line 145) | def test_seekable(self, large_binary):
method test_closed_property (line 153) | def test_closed_property(self, large_binary):
method test_close (line 165) | def test_close(self, large_binary, mock_s3_response):
method test_context_manager (line 180) | def test_context_manager(self, large_binary, mock_s3_response):
method test_iteration (line 195) | def test_iteration(self, large_binary):
method test_read_after_close_raises_error (line 210) | def test_read_after_close_raises_error(self, large_binary, mock_s3_res...
FILE: amber/src/test/python/pytexera/storage/test_large_binary_manager.py
class TestLargeBinaryManager (line 24) | class TestLargeBinaryManager:
method setup_storage_config (line 26) | def setup_storage_config(self):
method test_get_s3_client_initializes_once (line 45) | def test_get_s3_client_initializes_once(self):
method test_get_s3_client_without_boto3_raises_error (line 64) | def test_get_s3_client_without_boto3_raises_error(self):
method test_ensure_bucket_exists_when_bucket_exists (line 89) | def test_ensure_bucket_exists_when_bucket_exists(self):
method test_ensure_bucket_exists_creates_bucket_when_missing (line 104) | def test_ensure_bucket_exists_creates_bucket_when_missing(self):
method test_create_generates_unique_uri (line 120) | def test_create_generates_unique_uri(self):
method test_create_uses_default_bucket (line 142) | def test_create_uses_default_bucket(self):
FILE: amber/src/test/python/pytexera/storage/test_large_binary_output_stream.py
class TestLargeBinaryOutputStream (line 30) | class TestLargeBinaryOutputStream:
method large_binary (line 32) | def large_binary(self):
method test_init_with_valid_large_binary (line 36) | def test_init_with_valid_large_binary(self, large_binary):
method test_init_with_none_raises_error (line 45) | def test_init_with_none_raises_error(self):
method test_write_starts_upload_thread (line 50) | def test_write_starts_upload_thread(self, large_binary):
method test_write_data (line 73) | def test_write_data(self, large_binary):
method test_write_multiple_chunks (line 91) | def test_write_multiple_chunks(self, large_binary):
method test_writable (line 110) | def test_writable(self, large_binary):
method test_seekable (line 118) | def test_seekable(self, large_binary):
method test_closed_property (line 123) | def test_closed_property(self, large_binary):
method test_flush (line 131) | def test_flush(self, large_binary):
method test_close_completes_upload (line 137) | def test_close_completes_upload(self, large_binary):
method test_context_manager (line 158) | def test_context_manager(self, large_binary):
method test_write_after_close_raises_error (line 177) | def test_write_after_close_raises_error(self, large_binary):
method test_close_handles_upload_error (line 185) | def test_close_handles_upload_error(self, large_binary):
method test_write_after_upload_error_raises_error (line 204) | def test_write_after_upload_error_raises_error(self, large_binary):
method test_multiple_close_calls (line 226) | def test_multiple_close_calls(self, large_binary):
class TestCleanupFailedUpload (line 245) | class TestCleanupFailedUpload:
method large_binary (line 249) | def large_binary(self):
method test_delete_object_failure_is_swallowed (line 252) | def test_delete_object_failure_is_swallowed(self, large_binary):
class TestQueueReader (line 277) | class TestQueueReader:
method _populate (line 281) | def _populate(q: queue.Queue, *items):
method test_read_returns_empty_on_immediate_eof (line 286) | def test_read_returns_empty_on_immediate_eof(self):
method test_read_after_eof_returns_empty_repeatedly (line 291) | def test_read_after_eof_returns_empty_repeatedly(self):
method test_read_default_size_joins_all_chunks_until_eof (line 299) | def test_read_default_size_joins_all_chunks_until_eof(self):
method test_read_with_explicit_size_smaller_than_first_chunk (line 304) | def test_read_with_explicit_size_smaller_than_first_chunk(self):
method test_read_buffer_remainder_carries_over_subsequent_calls (line 311) | def test_read_buffer_remainder_carries_over_subsequent_calls(self):
method test_read_size_can_span_multiple_queued_chunks (line 319) | def test_read_size_can_span_multiple_queued_chunks(self):
method test_read_size_zero_returns_empty_and_preserves_buffer (line 325) | def test_read_size_zero_returns_empty_and_preserves_buffer(self):
method test_read_with_size_larger_than_available_returns_all_before_eof (line 336) | def test_read_with_size_larger_than_available_returns_all_before_eof(s...
method test_eof_only_terminates_when_queue_drained_first (line 341) | def test_eof_only_terminates_when_queue_drained_first(self):
method test_read_polls_until_data_arrives (line 347) | def test_read_polls_until_data_arrives(self):
FILE: amber/src/test/python/pytexera/udf/examples/test_count_batch_operator.py
class TestCountBatchOperator (line 26) | class TestCountBatchOperator:
method count_batch_operator (line 28) | def count_batch_operator(self):
method test_count_batch_operator (line 31) | def test_count_batch_operator(self, count_batch_operator):
method test_count_batch_operator_simple (line 44) | def test_count_batch_operator_simple(self, count_batch_operator):
method test_count_batch_operator_medium (line 57) | def test_count_batch_operator_medium(self, count_batch_operator):
method test_count_batch_operator_hard (line 70) | def test_count_batch_operator_hard(self, count_batch_operator):
method test_edge_case_string (line 91) | def test_edge_case_string(self):
method test_edge_case_non_positive (line 104) | def test_edge_case_non_positive(self, count_batch_operator):
method test_edge_case_none (line 114) | def test_edge_case_none(self, count_batch_operator):
FILE: amber/src/test/python/pytexera/udf/examples/test_echo_operator.py
class TestEchoOperator (line 24) | class TestEchoOperator:
method echo_operator (line 26) | def echo_operator(self):
method test_echo_operator (line 29) | def test_echo_operator(self, echo_operator):
FILE: amber/src/test/python/pytexera/udf/examples/test_echo_table_operator.py
class TestEchoTableOperator (line 26) | class TestEchoTableOperator:
method echo_table_operator (line 28) | def echo_table_operator(self):
method test_echo_table_operator (line 31) | def test_echo_table_operator(self, echo_table_operator):
FILE: amber/src/test/python/pytexera/udf/examples/test_generator_operator_binary.py
class TestEchoOperator (line 24) | class TestEchoOperator:
method generator_operator_binary (line 26) | def generator_operator_binary(self):
method test_generator_operator_binary (line 29) | def test_generator_operator_binary(self, generator_operator_binary):
FILE: amber/src/test/python/pytexera/udf/examples/test_generator_operator_integer.py
class TestEchoOperator (line 24) | class TestEchoOperator:
method generator_operator_integer (line 26) | def generator_operator_integer(self):
method test_generator_operator_integer (line 29) | def test_generator_operator_integer(self, generator_operator_integer):
FILE: bin/forum/flarum.sql
type `access_tokens` (line 45) | CREATE TABLE `access_tokens` (
type `discussion_tag` (line 112) | CREATE TABLE `discussion_tag` (
type `discussion_user` (line 140) | CREATE TABLE `discussion_user` (
type `discussion_views` (line 170) | CREATE TABLE `discussion_views` (
type `discussions` (line 201) | CREATE TABLE `discussions` (
type `email_tokens` (line 262) | CREATE TABLE `email_tokens` (
type `flags` (line 289) | CREATE TABLE `flags` (
type `group_permission` (line 322) | CREATE TABLE `group_permission` (
type `group_user` (line 348) | CREATE TABLE `group_user` (
type `groups` (line 376) | CREATE TABLE `groups` (
type `login_providers` (line 406) | CREATE TABLE `login_providers` (
type `migrations` (line 436) | CREATE TABLE `migrations` (
type `notifications` (line 461) | CREATE TABLE `notifications` (
type `password_tokens` (line 495) | CREATE TABLE `password_tokens` (
type `post_likes` (line 521) | CREATE TABLE `post_likes` (
type `post_mentions_group` (line 548) | CREATE TABLE `post_mentions_group` (
type `post_mentions_post` (line 575) | CREATE TABLE `post_mentions_post` (
type `post_mentions_tag` (line 602) | CREATE TABLE `post_mentions_tag` (
type `post_mentions_user` (line 629) | CREATE TABLE `post_mentions_user` (
type `post_user` (line 657) | CREATE TABLE `post_user` (
type `posts` (line 683) | CREATE TABLE `posts` (
type `recipients` (line 734) | CREATE TABLE `recipients` (
type `registration_tokens` (line 770) | CREATE TABLE `registration_tokens` (
type `tag_user` (line 821) | CREATE TABLE `tag_user` (
type `tags` (line 849) | CREATE TABLE `tags` (
type `users` (line 897) | CREATE TABLE `users` (
FILE: bin/licensing/audit_jar_licenses.py
function _classify (line 56) | def _classify(parts: list[str]) -> str | None:
function extract_license_notice (line 85) | def extract_license_notice(jar_path: Path) -> tuple[str, str] | None:
function short_hash (line 107) | def short_hash(text: str) -> str:
function collect_groups (line 111) | def collect_groups(lib_dirs: list[Path]) -> dict[tuple[str, str], list[t...
function needs_per_dep_file (line 133) | def needs_per_dep_file(license_text: str, copyright_count: int) -> bool:
function main (line 147) | def main() -> int:
FILE: bin/licensing/check_binary_deps.py
function _repo_root (line 69) | def _repo_root() -> Path:
function build_default_license_binary (line 73) | def build_default_license_binary() -> Path:
function load_direct_python (line 126) | def load_direct_python() -> set[str]:
function load_direct_npm (line 147) | def load_direct_npm(rel_path: str) -> set[str]:
function load_direct_jar_artifacts (line 161) | def load_direct_jar_artifacts() -> set[str]:
function parse_prose (line 190) | def parse_prose(path: Path, ecosystem: str) -> set[str]:
function collect_jars (line 239) | def collect_jars(lib_dirs) -> set[str]:
function collect_npm (line 253) | def collect_npm(path: Path) -> set[str]:
function canonicalize_python_name (line 261) | def canonicalize_python_name(name: str) -> str:
function canonicalize_python_version (line 266) | def canonicalize_python_version(version: str) -> str:
function collect_python (line 273) | def collect_python(path: Path) -> set[str]:
function _index_npm (line 296) | def _index_npm(items: set[str]) -> dict[str, set[str]]:
function _index_python (line 310) | def _index_python(items: set[str]) -> dict[str, set[str]]:
function _index_jar (line 321) | def _index_jar(items: set[str]) -> dict[str, set[str]]:
function _jar_basename (line 338) | def _jar_basename(artifact: str, version: str) -> str:
function _is_direct_jar (line 342) | def _is_direct_jar(artifact: str, direct_artifacts: set[str]) -> bool:
function report (line 363) | def report(
function diff_simple (line 437) | def diff_simple(
function diff_jars (line 467) | def diff_jars(
function main (line 498) | def main() -> int:
FILE: bin/licensing/concat_license_binary.py
class Subsection (line 91) | class Subsection:
class Group (line 98) | class Group:
method has_entries (line 106) | def has_entries(self) -> bool:
function is_subsection_header (line 110) | def is_subsection_header(line: str) -> bool:
function entry_id (line 118) | def entry_id(entry: list[str]) -> str:
function parse (line 125) | def parse(path: Path) -> tuple[str, list[Group]]:
function merge (line 210) | def merge(parsed: list[tuple[str, list[Group]]]) -> tuple[str, list[Grou...
function emit (line 265) | def emit(apache_header: str, groups: list[Group]) -> str:
function main (line 302) | def main() -> int:
FILE: bin/licensing/test_check_binary_deps.py
class IndexersPreserveAllVersions (line 47) | class IndexersPreserveAllVersions(unittest.TestCase):
method test_index_npm_keeps_multiple_versions (line 54) | def test_index_npm_keeps_multiple_versions(self):
method test_index_npm_handles_scoped_names (line 59) | def test_index_npm_handles_scoped_names(self):
method test_index_python_keeps_multiple_versions (line 64) | def test_index_python_keeps_multiple_versions(self):
method test_index_jar_keeps_multiple_versions (line 69) | def test_index_jar_keeps_multiple_versions(self):
method test_index_jar_warns_on_unparseable_name (line 81) | def test_index_jar_warns_on_unparseable_name(self):
class JarBasenameRoundTrip (line 89) | class JarBasenameRoundTrip(unittest.TestCase):
method test_round_trip_simple (line 94) | def test_round_trip_simple(self):
class IsDirectJar (line 108) | class IsDirectJar(unittest.TestCase):
method test_group_prefixed (line 115) | def test_group_prefixed(self):
method test_bar
Copy disabled (too large)
Download .json
Condensed preview — 1986 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (15,259K chars).
[
{
"path": ".asf.yaml",
"chars": 2737,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": ".dockerignore",
"chars": 1978,
"preview": "# Ignore all directories named `user-resources` anywhere in the project\n**/user-resources/\n\n# Ignoring binary/output\n**/"
},
{
"path": ".gitattributes",
"chars": 19,
"preview": "* text=auto eol=lf\n"
},
{
"path": ".github/ISSUE_TEMPLATE/bug-template.yaml",
"chars": 2587,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": ".github/ISSUE_TEMPLATE/feature-template.yaml",
"chars": 2182,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": ".github/ISSUE_TEMPLATE/task-template.yaml",
"chars": 1834,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE",
"chars": 2548,
"preview": "<!--\nThanks for sending a pull request (PR)! Here are some tips for you:\n 1. If this is your first time, please read ou"
},
{
"path": ".github/labeler.yml",
"chars": 4492,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": ".github/release/vote-email-template.md",
"chars": 1905,
"preview": "Subject: [VOTE] Release Apache Texera (incubating) ${VERSION} RC${RC_NUM}\n\nHi Texera Community,\n\nThis is a call for vote"
},
{
"path": ".github/scripts/compose-backport-message.py",
"chars": 2235,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": ".github/scripts/prepare-backport-checkout.sh",
"chars": 2067,
"preview": "#!/usr/bin/env bash\n\n# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreemen"
},
{
"path": ".github/workflows/auto-queue.yml",
"chars": 14561,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": ".github/workflows/automatic-email-notif-on-ddl-change.yml",
"chars": 2648,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": ".github/workflows/build-and-push-images.yml",
"chars": 23013,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": ".github/workflows/build.yml",
"chars": 30266,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": ".github/workflows/check-header.yml",
"chars": 1116,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": ".github/workflows/comment-commands.yml",
"chars": 6836,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": ".github/workflows/create-release-candidate.yml",
"chars": 19948,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": ".github/workflows/direct-backport-push.yml",
"chars": 26688,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": ".github/workflows/license-binary-checker.yml",
"chars": 7020,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": ".github/workflows/lint-pr.yml",
"chars": 1194,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": ".github/workflows/pr-assignment.yml",
"chars": 12605,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": ".github/workflows/pr-labeler.yml",
"chars": 1039,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": ".github/workflows/required-checks.yml",
"chars": 13428,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": ".gitignore",
"chars": 2189,
"preview": "# Ignoring binary/output\ntarget/\nout/\n\n# Ignoring packages\n*.jar\n*.war\n*.nar\n*.ear\n*.zip\n*.tar.gz\n*.rar\n\n# Ignoring VSCo"
},
{
"path": ".jvmopts",
"chars": 1404,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": ".licenserc.yaml",
"chars": 2069,
"preview": "header:\n license:\n spdx-id: Apache-2.0\n copyright-owner: Apache Software Foundation\n\n paths-ignore:\n - 'licen"
},
{
"path": ".run/AccessControlService.run.xml",
"chars": 1413,
"preview": "<!--\nLicensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE f"
},
{
"path": ".run/ComputingUnitManagingService.run.xml",
"chars": 1438,
"preview": "<!--\nLicensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE f"
},
{
"path": ".run/ComputingUnitMaster.run.xml",
"chars": 1454,
"preview": "<!--\nLicensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE f"
},
{
"path": ".run/ComputingUnitWorker.run.xml",
"chars": 1454,
"preview": "<!--\nLicensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE f"
},
{
"path": ".run/ConfigService.run.xml",
"chars": 1391,
"preview": "<!--\nLicensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE f"
},
{
"path": ".run/FileService.run.xml",
"chars": 1385,
"preview": "<!--\nLicensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE f"
},
{
"path": ".run/TexeraWebApplication.run.xml",
"chars": 1388,
"preview": "<!--\nLicensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE f"
},
{
"path": ".run/WorkflowCompilingService.run.xml",
"chars": 1425,
"preview": "<!--\nLicensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE f"
},
{
"path": ".run/frontend.run.xml",
"chars": 1147,
"preview": "<!--\nLicensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE f"
},
{
"path": ".run/texera micro services.run.xml",
"chars": 1445,
"preview": "<!--\nLicensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE f"
},
{
"path": ".run/texera-lakefs.run.xml",
"chars": 1190,
"preview": "<!--\nLicensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE f"
},
{
"path": ".scalafix.conf",
"chars": 978,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": ".scalafmt.conf",
"chars": 816,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "AGENTS.md",
"chars": 8412,
"preview": "# AGENTS.md\n\n## Architecture Map\n\nApache Texera: Scala/sbt backend services + the Amber workflow execution\nengine, an An"
},
{
"path": "CLAUDE.md",
"chars": 65,
"preview": "# CLAUDE.md\n\nUse the project guidance in [AGENTS.md](AGENTS.md).\n"
},
{
"path": "CONTRIBUTING.md",
"chars": 6963,
"preview": "# Contributing to Texera\n\nThank you for your interest in contributing to Texera! Please follow the steps below to submit"
},
{
"path": "DISCLAIMER",
"chars": 537,
"preview": "Apache Texera is an effort undergoing incubation at The Apache Software\nFoundation (ASF), sponsored by the Apache Incuba"
},
{
"path": "LICENSE",
"chars": 13122,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "NOTICE",
"chars": 175,
"preview": "Apache Texera (Incubating)\nCopyright 2025 The Apache Software Foundation\n\nThis product includes software developed at\nTh"
},
{
"path": "README.md",
"chars": 3516,
"preview": "<h1 align=\"center\">Apache Texera - Human-AI Collaborative Data Science Using Visual Workflows</h1>\n\n<p align=\"center\">\n "
},
{
"path": "SECURITY.md",
"chars": 13000,
"preview": "# Security Policy\n\nThis document outlines Apache Texera (Incubating)'s security model, deployment considerations, and pr"
},
{
"path": "access-control-service/LICENSE-binary",
"chars": 21691,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "access-control-service/NOTICE-binary",
"chars": 56420,
"preview": "Apache Texera (Incubating)\nCopyright 2025-2026 The Apache Software Foundation\n\nThis product includes software developed "
},
{
"path": "access-control-service/build.sbt",
"chars": 3660,
"preview": "// Licensed to the Apache Software Foundation (ASF) under one\n// or more contributor license agreements. See the NOTICE"
},
{
"path": "access-control-service/project/build.properties",
"chars": 806,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "access-control-service/src/main/resources/access-control-service-web-config.yaml",
"chars": 1255,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "access-control-service/src/main/resources/logback.xml",
"chars": 2165,
"preview": "<!--\n Licensed to the Apache Software Foundation (ASF) under one\n or more contributor license agreements. See the NOTIC"
},
{
"path": "access-control-service/src/main/scala/org/apache/texera/service/AccessControlService.scala",
"chars": 4178,
"preview": "// Licensed to the Apache Software Foundation (ASF) under one\n// or more contributor license agreements. See the NOTICE"
},
{
"path": "access-control-service/src/main/scala/org/apache/texera/service/AccessControlServiceConfiguration.scala",
"chars": 943,
"preview": "// Licensed to the Apache Software Foundation (ASF) under one\n// or more contributor license agreements. See the NOTICE"
},
{
"path": "access-control-service/src/main/scala/org/apache/texera/service/activity/UserActivityEventListener.scala",
"chars": 3416,
"preview": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOT"
},
{
"path": "access-control-service/src/main/scala/org/apache/texera/service/resource/AccessControlResource.scala",
"chars": 12216,
"preview": "// Licensed to the Apache Software Foundation (ASF) under one\n// or more contributor license agreements. See the NOTICE"
},
{
"path": "access-control-service/src/main/scala/org/apache/texera/service/resource/HealthCheckResource.scala",
"chars": 1100,
"preview": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOT"
},
{
"path": "access-control-service/src/test/scala/org/apache/texera/AccessControlResourceSpec.scala",
"chars": 9504,
"preview": "// Licensed to the Apache Software Foundation (ASF) under one\n// or more contributor license agreements. See the NOTICE"
},
{
"path": "access-control-service/src/test/scala/org/apache/texera/service/AccessControlServiceRunSpec.scala",
"chars": 2048,
"preview": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOT"
},
{
"path": "access-control-service/src/test/scala/org/apache/texera/service/activity/UserActivityEventListenerSpec.scala",
"chars": 5211,
"preview": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOT"
},
{
"path": "agent-service/.dockerignore",
"chars": 19,
"preview": "node_modules\n.yarn\n"
},
{
"path": "agent-service/.prettierrc",
"chars": 256,
"preview": "{\n \"printWidth\": 120,\n \"tabWidth\": 2,\n \"useTabs\": false,\n \"semi\": true,\n \"singleQuote\": false,\n \"quoteProps\": \"as-"
},
{
"path": "agent-service/LICENSE-binary",
"chars": 14370,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "agent-service/bin/collect-licenses.ts",
"chars": 3130,
"preview": "#!/usr/bin/env bun\n// Licensed to the Apache Software Foundation (ASF) under one\n// or more contributor license agreemen"
},
{
"path": "agent-service/package.json",
"chars": 1158,
"preview": "{\n \"name\": \"texera-agent-service\",\n \"version\": \"0.1.0\",\n \"description\": \"Texera Agent Service - AI agents for workflo"
},
{
"path": "agent-service/src/agent/index.ts",
"chars": 869,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/agent/prompts.ts",
"chars": 11565,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/agent/texera-agent.ts",
"chars": 26869,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/agent/tools/index.ts",
"chars": 926,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/agent/tools/result-formatting.test.ts",
"chars": 11085,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/agent/tools/result-formatting.ts",
"chars": 4903,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/agent/tools/tools-utility.test.ts",
"chars": 5459,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/agent/tools/tools-utility.ts",
"chars": 2695,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/agent/tools/workflow-crud-tools.ts",
"chars": 14876,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/agent/tools/workflow-execution-tools.ts",
"chars": 20795,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/agent/util/auto-layout.test.ts",
"chars": 5715,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/agent/util/auto-layout.ts",
"chars": 2032,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/agent/util/context-utils.ts",
"chars": 9350,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/agent/util/workflow-system-metadata.ts",
"chars": 8501,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/agent/util/workflow-utils.ts",
"chars": 7273,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/agent/workflow-result-state.test.ts",
"chars": 3455,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/agent/workflow-result-state.ts",
"chars": 2657,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/agent/workflow-state.test.ts",
"chars": 6690,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/agent/workflow-state.ts",
"chars": 15517,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/api/auth-api.ts",
"chars": 1942,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/api/backend-api.ts",
"chars": 2564,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/api/compile-api.ts",
"chars": 2430,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/api/execution-api.ts",
"chars": 1227,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/api/index.ts",
"chars": 965,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/api/workflow-api.ts",
"chars": 2920,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/config/env.ts",
"chars": 1659,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/index.ts",
"chars": 1225,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/logger.ts",
"chars": 1593,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/server.test.ts",
"chars": 8170,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/server.ts",
"chars": 22792,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/types/agent.ts",
"chars": 4088,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/types/execution.ts",
"chars": 1530,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/types/index.ts",
"chars": 892,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/src/types/workflow.ts",
"chars": 4063,
"preview": "/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NO"
},
{
"path": "agent-service/tsconfig.json",
"chars": 503,
"preview": "{\n \"compilerOptions\": {\n \"target\": \"ESNext\",\n \"module\": \"Preserve\",\n \"moduleResolution\": \"bundler\",\n \"lib\":"
},
{
"path": "amber/.scalafix.conf",
"chars": 978,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/.scalafmt.conf",
"chars": 910,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/DESCRIPTION",
"chars": 627,
"preview": "Package: Texera-R-UDF\nTitle: Required Libraries for R UDF\nVersion: 1.0.0\nAuthors@R: person(\"Texera\", \"Team\", role = c(\"a"
},
{
"path": "amber/LICENSE-binary-java",
"chars": 36631,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "amber/LICENSE-binary-python",
"chars": 15911,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "amber/NOTICE-binary",
"chars": 61909,
"preview": "Apache Texera (Incubating)\nCopyright 2025-2026 The Apache Software Foundation\n\nThis product includes software developed "
},
{
"path": "amber/README.md",
"chars": 1,
"preview": "\n"
},
{
"path": "amber/build.sbt",
"chars": 14034,
"preview": "// Licensed to the Apache Software Foundation (ASF) under one\n// or more contributor license agreements. See the NOTICE"
},
{
"path": "amber/dev-requirements.txt",
"chars": 1156,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/operator-requirements.txt",
"chars": 1209,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/project/build.properties",
"chars": 804,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/project/plugins.sbt",
"chars": 1066,
"preview": "// Licensed to the Apache Software Foundation (ASF) under one\n// or more contributor license agreements. See the NOTICE"
},
{
"path": "amber/pyproject.toml",
"chars": 1860,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/requirements.txt",
"chars": 1348,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/protobuf/org/apache/texera/amber/engine/architecture/rpc/controlcommands.proto",
"chars": 8151,
"preview": "// Licensed to the Apache Software Foundation (ASF) under one\n// or more contributor license agreements. See the NOTICE"
},
{
"path": "amber/src/main/protobuf/org/apache/texera/amber/engine/architecture/rpc/controllerservice.proto",
"chars": 2547,
"preview": "// Licensed to the Apache Software Foundation (ASF) under one\n// or more contributor license agreements. See the NOTICE"
},
{
"path": "amber/src/main/protobuf/org/apache/texera/amber/engine/architecture/rpc/controlreturns.proto",
"chars": 3657,
"preview": "// Licensed to the Apache Software Foundation (ASF) under one\n// or more contributor license agreements. See the NOTICE"
},
{
"path": "amber/src/main/protobuf/org/apache/texera/amber/engine/architecture/rpc/testerservice.proto",
"chars": 1761,
"preview": "// Licensed to the Apache Software Foundation (ASF) under one\n// or more contributor license agreements. See the NOTICE"
},
{
"path": "amber/src/main/protobuf/org/apache/texera/amber/engine/architecture/rpc/workerservice.proto",
"chars": 2601,
"preview": "// Licensed to the Apache Software Foundation (ASF) under one\n// or more contributor license agreements. See the NOTICE"
},
{
"path": "amber/src/main/protobuf/org/apache/texera/amber/engine/architecture/sendsemantics/partitionings.proto",
"chars": 2111,
"preview": "// Licensed to the Apache Software Foundation (ASF) under one\n// or more contributor license agreements. See the NOTICE"
},
{
"path": "amber/src/main/protobuf/org/apache/texera/amber/engine/architecture/worker/statistics.proto",
"chars": 1853,
"preview": "// Licensed to the Apache Software Foundation (ASF) under one\n// or more contributor license agreements. See the NOTICE"
},
{
"path": "amber/src/main/protobuf/org/apache/texera/amber/engine/common/actormessage.proto",
"chars": 1322,
"preview": "// Licensed to the Apache Software Foundation (ASF) under one\n// or more contributor license agreements. See the NOTICE"
},
{
"path": "amber/src/main/protobuf/org/apache/texera/amber/engine/common/ambermessage.proto",
"chars": 1727,
"preview": "// Licensed to the Apache Software Foundation (ASF) under one\n// or more contributor license agreements. See the NOTICE"
},
{
"path": "amber/src/main/protobuf/org/apache/texera/amber/engine/common/executionruntimestate.proto",
"chars": 3123,
"preview": "// Licensed to the Apache Software Foundation (ASF) under one\n// or more contributor license agreements. See the NOTICE"
},
{
"path": "amber/src/main/python/core/__init__.py",
"chars": 785,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/__init__.py",
"chars": 785,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/handlers/__init__.py",
"chars": 785,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/handlers/actorcommand/actor_handler_base.py",
"chars": 1105,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/handlers/actorcommand/backpressure_handler.py",
"chars": 2388,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/handlers/actorcommand/credit_update_handler.py",
"chars": 1214,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/handlers/control/__init__.py",
"chars": 785,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/handlers/control/add_input_channel_handler.py",
"chars": 1489,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/handlers/control/add_partitioning_handler.py",
"chars": 1223,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/handlers/control/assign_port_handler.py",
"chars": 2324,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/handlers/control/control_handler_base.py",
"chars": 977,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/handlers/control/debug_command_handler.py",
"chars": 3519,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/handlers/control/end_channel_handler.py",
"chars": 1367,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/handlers/control/end_worker_handler.py",
"chars": 1984,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/handlers/control/evaluate_expression_handler.py",
"chars": 1652,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/handlers/control/initialize_executor_handler.py",
"chars": 1475,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/handlers/control/no_operation_handler.py",
"chars": 1115,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/handlers/control/open_executor_handler.py",
"chars": 1171,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/handlers/control/pause_worker_handler.py",
"chars": 1333,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/handlers/control/query_statistics_handler.py",
"chars": 1448,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/handlers/control/replay_current_tuple_handler.py",
"chars": 1949,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/handlers/control/resume_worker_handler.py",
"chars": 1336,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/handlers/control/start_channel_handler.py",
"chars": 1257,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/handlers/control/start_worker_handler.py",
"chars": 4282,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/handlers/control/update_executor_handler.py",
"chars": 1463,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/managers/__init__.py",
"chars": 1021,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/managers/console_message_manager.py",
"chars": 1264,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/managers/context.py",
"chars": 3486,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/managers/debug_manager.py",
"chars": 1921,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/managers/embedded_control_message_manager.py",
"chars": 3529,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/managers/exception_manager.py",
"chars": 1382,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/managers/executor_manager.py",
"chars": 8156,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/managers/pause_manager.py",
"chars": 3472,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/managers/state_manager.py",
"chars": 2742,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/managers/state_processing_manager.py",
"chars": 1307,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/managers/statistics_manager.py",
"chars": 4754,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/managers/tuple_processing_manager.py",
"chars": 2124,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/packaging/__init__.py",
"chars": 785,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/packaging/input_manager.py",
"chars": 6659,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/packaging/output_manager.py",
"chars": 10660,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/rpc/async_rpc_client.py",
"chars": 10158,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/rpc/async_rpc_handler_initializer.py",
"chars": 2913,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/rpc/async_rpc_server.py",
"chars": 6474,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/sendsemantics/__init__.py",
"chars": 785,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/sendsemantics/broad_cast_partitioner.py",
"chars": 2927,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/sendsemantics/hash_based_shuffle_partitioner.py",
"chars": 3539,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/sendsemantics/one_to_one_partitioner.py",
"chars": 2756,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/sendsemantics/partitioner.py",
"chars": 1989,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/sendsemantics/range_based_shuffle_partitioner.py",
"chars": 4036,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/architecture/sendsemantics/round_robin_partitioner.py",
"chars": 3406,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/models/__init__.py",
"chars": 1847,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/models/batch.py",
"chars": 1014,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/models/internal_marker.py",
"chars": 1095,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/models/internal_queue.py",
"chars": 5171,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/models/operator.py",
"chars": 10220,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/models/payload.py",
"chars": 1049,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/models/schema/__init__.py",
"chars": 1017,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/models/schema/arrow_schema_utils.py",
"chars": 2352,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/models/schema/attribute_type.py",
"chars": 3132,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/models/schema/attribute_type_utils.py",
"chars": 2424,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/models/schema/field.py",
"chars": 1030,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/models/schema/schema.py",
"chars": 5687,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/models/single_blocking_io.py",
"chars": 4046,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/models/state.py",
"chars": 2509,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/models/table.py",
"chars": 3382,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/models/tuple.py",
"chars": 16050,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/models/type/__init__.py",
"chars": 851,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/models/type/large_binary.py",
"chars": 3348,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/proxy/__init__.py",
"chars": 904,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/proxy/proxy_client.py",
"chars": 4254,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/proxy/proxy_server.py",
"chars": 11613,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/python_worker.py",
"chars": 2719,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/runnables/__init__.py",
"chars": 1012,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "amber/src/main/python/core/runnables/data_processor.py",
"chars": 8960,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
}
]
// ... and 1786 more files (download for full content)
About this extraction
This page contains the full source code of the Texera/texera GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1986 files (25.6 MB), approximately 3.8M tokens, and a symbol index with 12030 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.