This is an automated email from the ASF dual-hosted git repository.
hansva pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/hop.git
The following commit(s) were added to refs/heads/main by this push:
new 2c252810a8 Fix MongoDB transform dialog layout, update-option
enablement, and Input preview when not outputting JSON (#7165)
2c252810a8 is described below
commit 2c252810a857e0d3ef37f703e7214d8a93588e42
Author: Lance <[email protected]>
AuthorDate: Mon May 25 14:59:56 2026 +0800
Fix MongoDB transform dialog layout, update-option enablement, and Input
preview when not outputting JSON (#7165)
---
.../mongodbdelete/MongoDbDeleteDialog.java | 8 ++--
.../transforms/mongodbinput/MongoDbInput.java | 4 ++
.../transforms/mongodbinput/MongoDbInputData.java | 5 ++-
.../mongodbinput/MongoDbInputDialog.java | 46 +++++++++++++---------
.../mongodboutput/MongoDbOutputDialog.java | 40 ++++++++++++-------
.../messages/messages_en_US.properties | 3 ++
.../messages/messages_zh_CN.properties | 3 ++
.../mongodbinput/MongoDbInputDataTest.java | 10 +++++
8 files changed, 80 insertions(+), 39 deletions(-)
diff --git
a/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbdelete/MongoDbDeleteDialog.java
b/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbdelete/MongoDbDeleteDialog.java
index ff710c891f..407f6febaa 100644
---
a/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbdelete/MongoDbDeleteDialog.java
+++
b/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbdelete/MongoDbDeleteDialog.java
@@ -175,7 +175,7 @@ public class MongoDbDeleteDialog extends
BaseTransformDialog {
BaseMessages.getString(PKG,
"MongoDbDeleteDialog.GetCollections.Button")); // $NON-NLS-1$
fd = new FormData();
fd.right = new FormAttachment(100, 0);
- fd.top = new FormAttachment(lastControl, 0);
+ fd.top = new FormAttachment(wlCollection, 0, SWT.CENTER);
wbGetCollections.setLayoutData(fd);
wbGetCollections.addListener(SWT.Selection, e -> getCollectionNames());
@@ -189,7 +189,7 @@ public class MongoDbDeleteDialog extends
BaseTransformDialog {
});
fd = new FormData();
fd.left = new FormAttachment(middle, 0);
- fd.top = new FormAttachment(lastControl, margin);
+ fd.top = new FormAttachment(wlCollection, 0, SWT.CENTER);
fd.right = new FormAttachment(wbGetCollections, -margin);
wCollection.setLayoutData(fd);
@@ -289,9 +289,9 @@ public class MongoDbDeleteDialog extends
BaseTransformDialog {
}
});
fd = new FormData();
- fd.right = new FormAttachment(100, -margin);
- fd.top = new FormAttachment(0, margin * 3);
fd.left = new FormAttachment(middle, 0);
+ fd.right = new FormAttachment(100, -margin);
+ fd.top = new FormAttachment(useDefinedQueryLab, 0, SWT.CENTER);
wbUseJsonQuery.setLayoutData(fd);
colInf =
diff --git
a/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInput.java
b/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInput.java
index 34e838bc9a..85733ee400 100644
---
a/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInput.java
+++
b/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInput.java
@@ -266,6 +266,10 @@ public class MongoDbInput extends
BaseTransform<MongoDbInputMeta, MongoDbInputDa
data.collection = data.clientWrapper.getCollection(databaseName,
collection);
if (!meta.isOutputJson()) {
+ if (meta.getFields() == null || meta.getFields().isEmpty()) {
+ throw new HopException(
+ BaseMessages.getString(PKG,
"MongoInput.ErrorMessage.NoFieldsSpecified"));
+ }
data.setMongoFields(meta.getFields());
}
diff --git
a/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInputData.java
b/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInputData.java
index 298f4dd7a7..c2584dcec6 100644
---
a/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInputData.java
+++
b/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInputData.java
@@ -258,9 +258,10 @@ public class MongoDbInputData extends BaseTransformData
implements ITransformDat
* @param fields the field path specifications
*/
public void setMongoFields(List<MongoField> fields) {
- // copy this list
userFields = new ArrayList<>();
-
+ if (fields == null) {
+ return;
+ }
for (MongoField f : fields) {
userFields.add(f.copy());
}
diff --git
a/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInputDialog.java
b/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInputDialog.java
index bd5a5d1f63..1cc468a081 100644
---
a/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInputDialog.java
+++
b/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInputDialog.java
@@ -166,7 +166,7 @@ public class MongoDbInputDialog extends BaseTransformDialog
{
BaseMessages.getString(PKG,
"MongoDbInputDialog.GetCollections.Button"));
FormData fd = new FormData();
fd.right = new FormAttachment(100, 0);
- fd.top = new FormAttachment(lastControl, 0);
+ fd.top = new FormAttachment(wlCollection, 0, SWT.CENTER);
wbGetCollections.setLayoutData(fd);
wbGetCollections.addListener(SWT.Selection, e -> getCollectionNames());
@@ -175,8 +175,8 @@ public class MongoDbInputDialog extends BaseTransformDialog
{
wCollection.addModifyListener(lsMod);
FormData fdCollection = new FormData();
fdCollection.left = new FormAttachment(middle, 0);
- fdCollection.top = new FormAttachment(lastControl, margin);
- fdCollection.right = new FormAttachment(wbGetCollections, 0);
+ fdCollection.top = new FormAttachment(wlCollection, 0, SWT.CENTER);
+ fdCollection.right = new FormAttachment(wbGetCollections, -margin);
wCollection.setLayoutData(fdCollection);
lastControl = wCollection;
wCollection.addListener(SWT.Selection, e -> updateQueryTitleInfo());
@@ -497,25 +497,22 @@ public class MongoDbInputDialog extends
BaseTransformDialog {
meta.setExecuteForEachIncomingRow(wbExecuteForEachRow.getSelection());
int numNonEmpty = wFields.nrNonEmpty();
- if (numNonEmpty > 0) {
- List<MongoField> outputFields = new ArrayList<>();
- for (int i = 0; i < numNonEmpty; i++) {
- TableItem item = wFields.getNonEmpty(i);
- MongoField newField = new MongoField();
-
- newField.fieldName = item.getText(1).trim();
- newField.fieldPath = item.getText(2).trim();
- newField.hopType = item.getText(3).trim();
-
- if (!StringUtils.isEmpty(item.getText(4))) {
- newField.indexedValues =
MongoDbInputData.indexedValsList(item.getText(4).trim());
- }
+ List<MongoField> outputFields = new ArrayList<>();
+ for (int i = 0; i < numNonEmpty; i++) {
+ TableItem item = wFields.getNonEmpty(i);
+ MongoField newField = new MongoField();
+
+ newField.fieldName = item.getText(1).trim();
+ newField.fieldPath = item.getText(2).trim();
+ newField.hopType = item.getText(3).trim();
- outputFields.add(newField);
+ if (!StringUtils.isEmpty(item.getText(4))) {
+ newField.indexedValues =
MongoDbInputData.indexedValsList(item.getText(4).trim());
}
- meta.setFields(outputFields);
+ outputFields.add(newField);
}
+ meta.setFields(outputFields);
}
private void ok() {
@@ -734,6 +731,19 @@ public class MongoDbInputDialog extends
BaseTransformDialog {
return;
}
+ if (!oneMeta.isOutputJson() && Utils.isEmpty(oneMeta.getFields())) {
+ ShowMessageDialog smd =
+ new ShowMessageDialog(
+ shell,
+ SWT.ICON_WARNING | SWT.OK,
+ BaseMessages.getString(
+ PKG,
"MongoDbInputDialog.ErrorMessage.NoFieldsForStructuredOutput.Title"),
+ BaseMessages.getString(
+ PKG,
"MongoDbInputDialog.ErrorMessage.NoFieldsForStructuredOutput"));
+ smd.open();
+ return;
+ }
+
PipelineMeta previewMeta =
PipelinePreviewFactory.generatePreviewPipeline(
metadataProvider, oneMeta, wTransformName.getText());
diff --git
a/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodboutput/MongoDbOutputDialog.java
b/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodboutput/MongoDbOutputDialog.java
index ca86defd4d..a03568f7ed 100644
---
a/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodboutput/MongoDbOutputDialog.java
+++
b/plugins/tech/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodboutput/MongoDbOutputDialog.java
@@ -81,8 +81,11 @@ public class MongoDbOutputDialog extends BaseTransformDialog
{
private Button wbTruncate;
private Button wbUpdate;
+ private Label upsertLab;
private Button wbUpsert;
+ private Label multiLab;
private Button wbMulti;
+ private Label modifierLab;
private Button wbModifierUpdate;
private TextVar wWriteRetries;
@@ -267,22 +270,16 @@ public class MongoDbOutputDialog extends
BaseTransformDialog {
SWT.Selection,
e -> {
currentMeta.setChanged();
- wbUpsert.setEnabled(wbUpdate.getSelection());
- wbModifierUpdate.setEnabled(wbUpdate.getSelection());
- wbMulti.setEnabled(wbUpdate.getSelection());
if (!wbUpdate.getSelection()) {
wbModifierUpdate.setSelection(false);
wbMulti.setSelection(false);
wbUpsert.setSelection(false);
}
- wbMulti.setEnabled(wbModifierUpdate.getSelection());
- if (!wbMulti.getEnabled()) {
- wbMulti.setSelection(false);
- }
+ setUpdateOptionControlsEnabled();
});
// upsert line
- Label upsertLab = new Label(wOutputComp, SWT.RIGHT);
+ upsertLab = new Label(wOutputComp, SWT.RIGHT);
upsertLab.setText(BaseMessages.getString(PKG,
"MongoDbOutputDialog.Upsert.Label"));
PropsUi.setLook(upsertLab);
upsertLab.setToolTipText(BaseMessages.getString(PKG,
"MongoDbOutputDialog.Upsert.TipText"));
@@ -302,7 +299,7 @@ public class MongoDbOutputDialog extends
BaseTransformDialog {
lastControl = upsertLab;
// multi line
- Label multiLab = new Label(wOutputComp, SWT.RIGHT);
+ multiLab = new Label(wOutputComp, SWT.RIGHT);
multiLab.setText(BaseMessages.getString(PKG,
"MongoDbOutputDialog.Multi.Label"));
PropsUi.setLook(multiLab);
multiLab.setToolTipText(BaseMessages.getString(PKG,
"MongoDbOutputDialog.Multi.TipText"));
@@ -323,7 +320,7 @@ public class MongoDbOutputDialog extends
BaseTransformDialog {
lastControl = multiLab;
// modifier update
- Label modifierLab = new Label(wOutputComp, SWT.RIGHT);
+ modifierLab = new Label(wOutputComp, SWT.RIGHT);
modifierLab.setText(BaseMessages.getString(PKG,
"MongoDbOutputDialog.Modifier.Label"));
PropsUi.setLook(modifierLab);
modifierLab.setToolTipText(BaseMessages.getString(PKG,
"MongoDbOutputDialog.Modifier.TipText"));
@@ -346,12 +343,13 @@ public class MongoDbOutputDialog extends
BaseTransformDialog {
SWT.Selection,
e -> {
currentMeta.setChanged();
- wbMulti.setEnabled(wbModifierUpdate.getSelection());
if (!wbModifierUpdate.getSelection()) {
wbMulti.setSelection(false);
}
+ setUpdateOptionControlsEnabled();
});
lastControl = modifierLab;
+ setUpdateOptionControlsEnabled();
// retries stuff
Label retriesLab = new Label(wOutputComp, SWT.RIGHT);
@@ -699,6 +697,21 @@ public class MongoDbOutputDialog extends
BaseTransformDialog {
return null;
}
+ /**
+ * Enables or disables Upsert, Modifier update, and Multi-update labels and
checkboxes based on
+ * Update and Modifier update.
+ */
+ private void setUpdateOptionControlsEnabled() {
+ boolean updateSelected = wbUpdate.getSelection();
+ upsertLab.setEnabled(updateSelected);
+ wbUpsert.setEnabled(updateSelected);
+ modifierLab.setEnabled(updateSelected);
+ wbModifierUpdate.setEnabled(updateSelected);
+ boolean multiEnabled = updateSelected && wbModifierUpdate.getSelection();
+ multiLab.setEnabled(multiEnabled);
+ wbMulti.setEnabled(multiEnabled);
+ }
+
private void getData() {
wConnection.setText(Const.NVL(currentMeta.getConnectionName(), "")); //
wCollectionField.setText(Const.NVL(currentMeta.getCollection(), "")); //
@@ -709,14 +722,11 @@ public class MongoDbOutputDialog extends
BaseTransformDialog {
wbTruncate.setSelection(currentMeta.isTruncate());
wbModifierUpdate.setSelection(currentMeta.isModifierUpdate());
- wbUpsert.setEnabled(wbUpdate.getSelection());
- wbModifierUpdate.setEnabled(wbUpdate.getSelection());
- wbMulti.setEnabled(wbUpdate.getSelection());
if (!wbUpdate.getSelection()) {
wbModifierUpdate.setSelection(false);
wbMulti.setSelection(false);
}
- wbMulti.setEnabled(wbModifierUpdate.getSelection());
+ setUpdateOptionControlsEnabled();
if (!wbMulti.getEnabled()) {
wbMulti.setSelection(false);
}
diff --git
a/plugins/tech/mongodb/src/main/resources/org/apache/hop/pipeline/transforms/mongodbinput/messages/messages_en_US.properties
b/plugins/tech/mongodb/src/main/resources/org/apache/hop/pipeline/transforms/mongodbinput/messages/messages_en_US.properties
index 1039793883..bdba76cb54 100644
---
a/plugins/tech/mongodb/src/main/resources/org/apache/hop/pipeline/transforms/mongodbinput/messages/messages_en_US.properties
+++
b/plugins/tech/mongodb/src/main/resources/org/apache/hop/pipeline/transforms/mongodbinput/messages/messages_en_US.properties
@@ -94,4 +94,7 @@ MongoInput.ErrorMessage.ErrorLoadingMongoDbConnection=Error
loading MongoDB conn
MongoInput.ErrorMessage.MongoDbConnection.NotFound=MongoDB connection {0}
couldn''t be found
MongoInput.ErrorMessage.NoCollectionSpecified=No collection specified
MongoInput.ErrorMessage.NoDBSpecified=No database specified
+MongoInput.ErrorMessage.NoFieldsSpecified=No MongoDB document fields are
defined for structured output
+MongoDbInputDialog.ErrorMessage.NoFieldsForStructuredOutput.Title=Missing
fields
+MongoDbInputDialog.ErrorMessage.NoFieldsForStructuredOutput=When ''Output a
single JSON field'' is not selected, define at least one field on the Fields
tab (use Get Fields to sample the collection).
MongoInput.ErrorMessage.PathContainsMultipleExpansions=Path contains multiple
array expansions: {0}
diff --git
a/plugins/tech/mongodb/src/main/resources/org/apache/hop/pipeline/transforms/mongodbinput/messages/messages_zh_CN.properties
b/plugins/tech/mongodb/src/main/resources/org/apache/hop/pipeline/transforms/mongodbinput/messages/messages_zh_CN.properties
index bd9514e956..ae2e86f56d 100644
---
a/plugins/tech/mongodb/src/main/resources/org/apache/hop/pipeline/transforms/mongodbinput/messages/messages_zh_CN.properties
+++
b/plugins/tech/mongodb/src/main/resources/org/apache/hop/pipeline/transforms/mongodbinput/messages/messages_zh_CN.properties
@@ -68,3 +68,6 @@ MongoInput.ErrorMessage.ErrorLoadingMongoDbConnection=\u4ECE
MongoDB \u8FDE\u63A
MongoInput.ErrorMessage.MongoDbConnection.NotFound=\u627E\u4E0D\u5230 MongoDB
\u8FDE\u63A5 {0}
MongoInput.ErrorMessage.NoCollectionSpecified=\u672A\u6307\u5B9A\u96C6\u5408
MongoInput.ErrorMessage.NoDBSpecified=\u672A\u6307\u5B9A\u6570\u636E\u5E93
+MongoInput.ErrorMessage.NoFieldsSpecified=\u672A\u5B9A\u4E49\u7528\u4E8E\u7ED3\u6784\u5316\u8F93\u51FA\u7684
MongoDB \u5B57\u6BB5
+MongoDbInputDialog.ErrorMessage.NoFieldsForStructuredOutput.Title=\u7F3A\u5C11\u5B57\u6BB5
+MongoDbInputDialog.ErrorMessage.NoFieldsForStructuredOutput=\u672A\u52FE\u9009\u300C\u8F93\u51FA\u5355\u4E2A
JSON
\u5B57\u6BB5\u300D\u65F6\uFF0C\u8BF7\u5728\u300C\u5B57\u6BB5\u300D\u9875\u7B7E\u4E2D\u81F3\u5C11\u5B9A\u4E49\u4E00\u4E2A\u5B57\u6BB5\uFF08\u53EF\u4F7F\u7528\u300C\u83B7\u53D6\u5B57\u6BB5\u300D\u4ECE\u96C6\u5408\u4E2D\u91C7\u6837\uFF09\u3002
diff --git
a/plugins/tech/mongodb/src/test/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInputDataTest.java
b/plugins/tech/mongodb/src/test/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInputDataTest.java
index c5c8cbdb28..a63c7170c3 100644
---
a/plugins/tech/mongodb/src/test/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInputDataTest.java
+++
b/plugins/tech/mongodb/src/test/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInputDataTest.java
@@ -17,6 +17,7 @@
package org.apache.hop.pipeline.transforms.mongodbinput;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
@@ -379,4 +380,13 @@ class MongoDbInputDataTest {
"my.${oneparam}.with.${a_dot_param}.otherstuff",
MongoDbInputData.cleansePath("my.${oneparam}.with.${a.dot.param}.otherstuff"));
}
+
+ @Test
+ void setMongoFieldsNullIsSafe() {
+ MongoDbInputData data = new MongoDbInputData();
+ data.outputRowMeta = new RowMeta();
+ data.setMongoFields(null);
+
+ assertDoesNotThrow(data::init);
+ }
}