From e35861a387f1852e5db76d146df956fe7f6677c5 Mon Sep 17 00:00:00 2001 From: Neilk1021 Date: Wed, 22 Jul 2026 14:30:02 -0700 Subject: [PATCH 01/11] style(frontend): Add descriptions to TextSourceOpDesc and TextInputSourceOpDesc. --- .../scan/text/TextInputSourceOpDesc.scala | 3 ++- .../source/scan/text/TextSourceOpDesc.scala | 21 ++++++++++++------- ...perator-property-edit-frame.component.scss | 7 +++++++ 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextInputSourceOpDesc.scala b/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextInputSourceOpDesc.scala index cfb14940f43..ffa99016523 100644 --- a/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextInputSourceOpDesc.scala +++ b/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextInputSourceOpDesc.scala @@ -19,7 +19,7 @@ package org.apache.texera.amber.operator.source.scan.text -import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.annotation.{JsonProperty, JsonPropertyDescription} import com.kjetland.jackson.jsonSchema.annotations.{JsonSchemaInject, JsonSchemaTitle} import org.apache.texera.amber.core.executor.OpExecWithClassName import org.apache.texera.amber.core.tuple.Schema @@ -34,6 +34,7 @@ class TextInputSourceOpDesc extends SourceOperatorDescriptor with TextSourceOpDe @JsonProperty(required = true) @JsonSchemaTitle("Text") @JsonSchemaInject(json = UIWidget.UIWidgetTextArea) + @JsonPropertyDescription("Input text here and this operator will return a column with your text as its rows.") var textInput: String = _ override def getPhysicalOp( diff --git a/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala b/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala index afa4a3604c0..c28f08c8d92 100644 --- a/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala +++ b/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala @@ -19,13 +19,9 @@ package org.apache.texera.amber.operator.source.scan.text -import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.annotation.{JsonProperty, JsonPropertyDescription} import com.fasterxml.jackson.databind.annotation.JsonDeserialize -import com.kjetland.jackson.jsonSchema.annotations.{ - JsonSchemaInject, - JsonSchemaString, - JsonSchemaTitle -} +import com.kjetland.jackson.jsonSchema.annotations.{JsonSchemaInject, JsonSchemaString, JsonSchemaTitle} import org.apache.texera.amber.operator.metadata.annotations.HideAnnotation import org.apache.texera.amber.operator.source.scan.FileAttributeType @@ -37,15 +33,22 @@ import org.apache.texera.amber.operator.source.scan.FileAttributeType trait TextSourceOpDesc { @JsonProperty(defaultValue = "string", required = true) @JsonSchemaTitle("Attribute Type") + @JsonPropertyDescription("This specifies how to read this text.\n \n Per-line types (string, integer, long, double, boolean, " + + "timestamp) emit one output row per line, casting each line to that type. \n \n" + + "File types ('Single string' / 'binary' / 'large binary') read the entire file in one " + + "single row.") var attributeType: FileAttributeType = FileAttributeType.STRING @JsonProperty(defaultValue = "line", required = true) @JsonSchemaTitle("Attribute Name") @JsonDeserialize(contentAs = classOf[java.lang.String]) + @JsonPropertyDescription("What is the name of the column that this text should be put in?") var attributeName: String = "line" - @JsonSchemaTitle("Limit") + @JsonSchemaTitle("Limit (lines)") @JsonDeserialize(contentAs = classOf[Int]) + @JsonPropertyDescription("Maximum number of lines to output. Leave empty to read all lines. " + + "(Not used when reading the whole file as one row.)") @JsonSchemaInject( strings = Array( new JsonSchemaString(path = HideAnnotation.hideTarget, value = "attributeType"), @@ -58,7 +61,9 @@ trait TextSourceOpDesc { ) var fileScanLimit: Option[Int] = None - @JsonSchemaTitle("Offset") + @JsonSchemaTitle("Offset (lines)") + @JsonPropertyDescription("Number of lines to skip from the start before reading. " + + "(Not used when reading the whole file as one row.)") @JsonDeserialize(contentAs = classOf[Int]) @JsonSchemaInject( strings = Array( diff --git a/frontend/src/app/workspace/component/property-editor/operator-property-edit-frame/operator-property-edit-frame.component.scss b/frontend/src/app/workspace/component/property-editor/operator-property-edit-frame/operator-property-edit-frame.component.scss index 0c652438848..740ac592043 100644 --- a/frontend/src/app/workspace/component/property-editor/operator-property-edit-frame/operator-property-edit-frame.component.scss +++ b/frontend/src/app/workspace/component/property-editor/operator-property-edit-frame/operator-property-edit-frame.component.scss @@ -60,6 +60,13 @@ nz-input-number { width: 100%; } + // preserve newlines (\n) in property descriptions rendered via nzExtra, + // and give them breathing room from the input above + .ant-form-item-extra { + white-space: pre-line; + margin-top: 6px; + line-height: 1.4; + } } } From aab382412e5fe776b8aeaaac08c732eaad35611c Mon Sep 17 00:00:00 2001 From: Neil Ketteringham <53205839+Neilk1021@users.noreply.github.com> Date: Thu, 23 Jul 2026 11:19:30 -0700 Subject: [PATCH 02/11] White space fixes Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Signed-off-by: Neil Ketteringham <53205839+Neilk1021@users.noreply.github.com> --- .../operator/source/scan/text/TextSourceOpDesc.scala | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala b/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala index c28f08c8d92..389554bd3de 100644 --- a/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala +++ b/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala @@ -33,10 +33,11 @@ import org.apache.texera.amber.operator.source.scan.FileAttributeType trait TextSourceOpDesc { @JsonProperty(defaultValue = "string", required = true) @JsonSchemaTitle("Attribute Type") - @JsonPropertyDescription("This specifies how to read this text.\n \n Per-line types (string, integer, long, double, boolean, " + - "timestamp) emit one output row per line, casting each line to that type. \n \n" + - "File types ('Single string' / 'binary' / 'large binary') read the entire file in one " + - "single row.") + @JsonPropertyDescription( + "This specifies how to read this text.\n\n" + + "Per-line types (string, integer, long, double, boolean, timestamp) emit one output row per line, casting each line to that type.\n\n" + + "Single-tuple types ('single string' / 'binary' / 'large binary') read the entire input as one output row." + ) var attributeType: FileAttributeType = FileAttributeType.STRING @JsonProperty(defaultValue = "line", required = true) From 9e2b593fe4ad279f84a0f67a37ac636c650874bc Mon Sep 17 00:00:00 2001 From: Neilk1021 Date: Thu, 23 Jul 2026 11:19:48 -0700 Subject: [PATCH 03/11] style(frontend): Add descriptions to TextSourceOpDesc and TextInputSourceOpDesc. --- .../amber/operator/source/scan/text/TextInputSourceOpDesc.scala | 2 +- .../amber/operator/source/scan/text/TextSourceOpDesc.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextInputSourceOpDesc.scala b/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextInputSourceOpDesc.scala index ffa99016523..50de683f70a 100644 --- a/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextInputSourceOpDesc.scala +++ b/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextInputSourceOpDesc.scala @@ -34,7 +34,7 @@ class TextInputSourceOpDesc extends SourceOperatorDescriptor with TextSourceOpDe @JsonProperty(required = true) @JsonSchemaTitle("Text") @JsonSchemaInject(json = UIWidget.UIWidgetTextArea) - @JsonPropertyDescription("Input text here and this operator will return a column with your text as its rows.") + @JsonPropertyDescription("Enter the input text. By default, each line becomes one tuple.") var textInput: String = _ override def getPhysicalOp( diff --git a/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala b/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala index c28f08c8d92..8480c1d118d 100644 --- a/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala +++ b/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala @@ -35,7 +35,7 @@ trait TextSourceOpDesc { @JsonSchemaTitle("Attribute Type") @JsonPropertyDescription("This specifies how to read this text.\n \n Per-line types (string, integer, long, double, boolean, " + "timestamp) emit one output row per line, casting each line to that type. \n \n" + - "File types ('Single string' / 'binary' / 'large binary') read the entire file in one " + + "File types ('single string' / 'binary' / 'large binary') read the entire file in one " + "single row.") var attributeType: FileAttributeType = FileAttributeType.STRING From 244593d9f54843555f7aa3157389a8c187a39f9e Mon Sep 17 00:00:00 2001 From: Neilk1021 Date: Thu, 23 Jul 2026 11:42:21 -0700 Subject: [PATCH 04/11] style(operators): remove references to columns and rows --- .../amber/operator/source/scan/text/TextSourceOpDesc.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala b/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala index 6c31e9bbecb..0ccd54f4bb9 100644 --- a/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala +++ b/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala @@ -39,15 +39,15 @@ trait TextSourceOpDesc { @JsonSchemaTitle("Attribute Type") @JsonPropertyDescription( "This specifies how to read this text.\n\n" + - "Per-line types (string, integer, long, double, boolean, timestamp) emit one output row per line, casting each line to that type.\n\n" + - "Single-tuple types ('single string' / 'binary' / 'large binary') read the entire input as one output row." + "Per-line types (string, integer, long, double, boolean, timestamp) emit one output tuple per line.\n\n" + + "Single-tuple types ('single string' / 'binary' / 'large binary') output one tuple total." ) var attributeType: FileAttributeType = FileAttributeType.STRING @JsonProperty(defaultValue = "line", required = true) @JsonSchemaTitle("Attribute Name") @JsonDeserialize(contentAs = classOf[java.lang.String]) - @JsonPropertyDescription("What is the name of the column that this text should be put in?") + @JsonPropertyDescription("What is the name of the attribute that this text should be put in?") var attributeName: String = "line" @JsonSchemaTitle("Limit (lines)") From a4736ab06dcd318d98e34c24ff3ab52aadbfcab0 Mon Sep 17 00:00:00 2001 From: Neilk1021 Date: Thu, 23 Jul 2026 11:43:50 -0700 Subject: [PATCH 05/11] style(operators): remove references to columns and rows --- .../amber/operator/source/scan/text/TextSourceOpDesc.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala b/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala index 0ccd54f4bb9..e0b8ba15759 100644 --- a/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala +++ b/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala @@ -54,7 +54,7 @@ trait TextSourceOpDesc { @JsonDeserialize(contentAs = classOf[Int]) @JsonPropertyDescription( "Maximum number of lines to output. Leave empty to read all lines. " + - "(Not used when reading the whole file as one row.)" + "(Not used when reading the whole file as one tuple.)" ) @JsonSchemaInject( strings = Array( @@ -71,7 +71,7 @@ trait TextSourceOpDesc { @JsonSchemaTitle("Offset (lines)") @JsonPropertyDescription( "Number of lines to skip from the start before reading. " + - "(Not used when reading the whole file as one row.)" + "(Not used when reading the whole file as one tuple.)" ) @JsonDeserialize(contentAs = classOf[Int]) @JsonSchemaInject( From a9cef45e355157d92f81430b2aaec2f244d017dc Mon Sep 17 00:00:00 2001 From: Neilk1021 Date: Thu, 23 Jul 2026 12:03:53 -0700 Subject: [PATCH 06/11] style(operators): remove references to columns and rows --- .../amber/operator/source/scan/text/TextSourceOpDesc.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala b/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala index e0b8ba15759..6035952c4b3 100644 --- a/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala +++ b/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala @@ -39,7 +39,7 @@ trait TextSourceOpDesc { @JsonSchemaTitle("Attribute Type") @JsonPropertyDescription( "This specifies how to read this text.\n\n" + - "Per-line types (string, integer, long, double, boolean, timestamp) emit one output tuple per line.\n\n" + + "Per-line types (e.g. string, integer, long, double, boolean, timestamp) emit one output tuple per line.\n\n" + "Single-tuple types ('single string' / 'binary' / 'large binary') output one tuple total." ) var attributeType: FileAttributeType = FileAttributeType.STRING @@ -47,7 +47,7 @@ trait TextSourceOpDesc { @JsonProperty(defaultValue = "line", required = true) @JsonSchemaTitle("Attribute Name") @JsonDeserialize(contentAs = classOf[java.lang.String]) - @JsonPropertyDescription("What is the name of the attribute that this text should be put in?") + @JsonPropertyDescription("Name of the attribute of the output tuple.") var attributeName: String = "line" @JsonSchemaTitle("Limit (lines)") From 3fb87867af8ec3fad597c38f2e7811a644af9c6a Mon Sep 17 00:00:00 2001 From: Neilk1021 Date: Thu, 23 Jul 2026 12:04:37 -0700 Subject: [PATCH 07/11] style(operators): remove references to columns and rows --- .../amber/operator/source/scan/text/TextSourceOpDesc.scala | 1 - 1 file changed, 1 deletion(-) diff --git a/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala b/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala index 6035952c4b3..982ad5aa5fc 100644 --- a/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala +++ b/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala @@ -47,7 +47,6 @@ trait TextSourceOpDesc { @JsonProperty(defaultValue = "line", required = true) @JsonSchemaTitle("Attribute Name") @JsonDeserialize(contentAs = classOf[java.lang.String]) - @JsonPropertyDescription("Name of the attribute of the output tuple.") var attributeName: String = "line" @JsonSchemaTitle("Limit (lines)") From 55de0da8e115bb309a20c07562a3706723fa2139 Mon Sep 17 00:00:00 2001 From: Neilk1021 Date: Thu, 23 Jul 2026 12:31:37 -0700 Subject: [PATCH 08/11] style(operators): shorten attribute desc --- .../amber/operator/source/scan/text/TextSourceOpDesc.scala | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala b/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala index 982ad5aa5fc..0514dd9d1e6 100644 --- a/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala +++ b/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala @@ -38,9 +38,8 @@ trait TextSourceOpDesc { @JsonProperty(defaultValue = "string", required = true) @JsonSchemaTitle("Attribute Type") @JsonPropertyDescription( - "This specifies how to read this text.\n\n" + - "Per-line types (e.g. string, integer, long, double, boolean, timestamp) emit one output tuple per line.\n\n" + - "Single-tuple types ('single string' / 'binary' / 'large binary') output one tuple total." + "Per-line types (string, integer, long, double, boolean, timestamp) emit one tuple per line; \n\n" + + "Single-tuple types ('single string' / 'binary' / 'large binary') output the whole input as one tuple." ) var attributeType: FileAttributeType = FileAttributeType.STRING From 4d57f43f49d5ec8f4e6716b1f8cc44c2d251faee Mon Sep 17 00:00:00 2001 From: Neilk1021 Date: Fri, 24 Jul 2026 12:15:33 -0700 Subject: [PATCH 09/11] style(operator): --- .../operator/source/scan/text/TextSourceOpDesc.scala | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala b/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala index 0514dd9d1e6..07a773580f6 100644 --- a/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala +++ b/common/workflow-operator/src/main/scala/org/apache/texera/amber/operator/source/scan/text/TextSourceOpDesc.scala @@ -38,8 +38,8 @@ trait TextSourceOpDesc { @JsonProperty(defaultValue = "string", required = true) @JsonSchemaTitle("Attribute Type") @JsonPropertyDescription( - "Per-line types (string, integer, long, double, boolean, timestamp) emit one tuple per line; \n\n" + - "Single-tuple types ('single string' / 'binary' / 'large binary') output the whole input as one tuple." + "The output field type. Each line becomes a separate tuple, except for " + + "'single string' / 'binary' / 'large binary', where the entire text becomes one tuple." ) var attributeType: FileAttributeType = FileAttributeType.STRING @@ -52,7 +52,7 @@ trait TextSourceOpDesc { @JsonDeserialize(contentAs = classOf[Int]) @JsonPropertyDescription( "Maximum number of lines to output. Leave empty to read all lines. " + - "(Not used when reading the whole file as one tuple.)" + "(Ignored when reading the whole file as one tuple.)" ) @JsonSchemaInject( strings = Array( @@ -69,7 +69,7 @@ trait TextSourceOpDesc { @JsonSchemaTitle("Offset (lines)") @JsonPropertyDescription( "Number of lines to skip from the start before reading. " + - "(Not used when reading the whole file as one tuple.)" + "(Ignored when reading the whole file as one tuple.)" ) @JsonDeserialize(contentAs = classOf[Int]) @JsonSchemaInject( From 3b5e877bdd0e56517f86e0078129bfcafcb13a97 Mon Sep 17 00:00:00 2001 From: Neilk1021 Date: Mon, 27 Jul 2026 11:19:13 -0700 Subject: [PATCH 10/11] ci: retrigger From 3aef890e339a391452ed3317efcb96a182dd3151 Mon Sep 17 00:00:00 2001 From: Neilk1021 Date: Mon, 27 Jul 2026 11:19:32 -0700 Subject: [PATCH 11/11] ci: retrigger