This is an automated email from the ASF dual-hosted git repository.

luchunliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/inlong.git


The following commit(s) were added to refs/heads/master by this push:
     new 066cb0b9b4 [INLONG-12111][SDK] ProtoBuf decoding supports parsing map 
nodes (#12112)
066cb0b9b4 is described below

commit 066cb0b9b49945eca6376e62e91c0f773f2ce6ca
Author: ChunLiang Lu <[email protected]>
AuthorDate: Wed Apr 15 11:09:48 2026 +0800

    [INLONG-12111][SDK] ProtoBuf decoding supports parsing map nodes (#12112)
---
 .../apache/inlong/sdk/transform/decode/PbNode.java | 62 ++++++++++++++++++----
 .../inlong/sdk/transform/decode/PbSourceData.java  | 52 ++++++++++--------
 2 files changed, 82 insertions(+), 32 deletions(-)

diff --git 
a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/decode/PbNode.java
 
b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/decode/PbNode.java
index 63fa6106d9..4fe166832b 100644
--- 
a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/decode/PbNode.java
+++ 
b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/decode/PbNode.java
@@ -37,30 +37,52 @@ public class PbNode {
     private String name;
     private FieldDescriptor fieldDesc;
     private Descriptors.Descriptor messageType;
+    private boolean isLastNode = false;
     private boolean isArray = false;
     private int arrayIndex = -1;
-    private boolean isLastNode = false;
+    private boolean isMap = false;
+    private String mapKey = "";
+    private FieldDescriptor mapKeyDesc;
+    private FieldDescriptor mapValueDesc;
 
     public PbNode(Descriptors.Descriptor messageDesc, String nodeString, 
boolean isLastNode) {
         int beginIndex = nodeString.indexOf('(');
         if (beginIndex < 0) {
             this.name = nodeString;
-            this.fieldDesc = messageDesc.findFieldByName(name);
-            if (this.fieldDesc.getJavaType() == JavaType.MESSAGE) {
-                this.messageType = this.fieldDesc.getMessageType();
+            if (isMapDescriptor(messageDesc)) {
+                FieldDescriptor valueFieldDesc = 
messageDesc.getFields().get(1);
+                Descriptors.Descriptor valueTypeDesc = 
valueFieldDesc.getMessageType();
+                this.fieldDesc = valueTypeDesc.findFieldByName(name);
+                if (this.fieldDesc.getJavaType() == JavaType.MESSAGE) {
+                    this.messageType = this.fieldDesc.getMessageType();
+                }
+            } else {
+                this.fieldDesc = messageDesc.findFieldByName(name);
+                if (this.fieldDesc.getJavaType() == JavaType.MESSAGE) {
+                    this.messageType = this.fieldDesc.getMessageType();
+                }
             }
         } else {
             this.name = StringUtils.trim(nodeString.substring(0, beginIndex));
             this.fieldDesc = messageDesc.findFieldByName(name);
             if (this.fieldDesc.getJavaType() == JavaType.MESSAGE) {
                 this.messageType = this.fieldDesc.getMessageType();
-            }
-            int endIndex = nodeString.lastIndexOf(')');
-            if (endIndex >= 0) {
-                this.isArray = true;
-                this.arrayIndex = 
NumberUtils.toInt(nodeString.substring(beginIndex + 1, endIndex), -1);
-                if (this.arrayIndex < 0) {
-                    this.arrayIndex = 0;
+                int endIndex = nodeString.lastIndexOf(')');
+                if (isMapDescriptor(messageType)) {
+                    this.isMap = true;
+                    if (endIndex >= 0) {
+                        this.mapKey = nodeString.substring(beginIndex + 1, 
endIndex);
+                        this.mapKeyDesc = messageType.getFields().get(0);
+                        this.mapValueDesc = messageType.getFields().get(1);
+                    }
+                } else {
+                    this.isArray = true;
+                    if (endIndex >= 0) {
+                        this.arrayIndex = 
NumberUtils.toInt(nodeString.substring(beginIndex + 1, endIndex), -1);
+                        if (this.arrayIndex < 0) {
+                            this.arrayIndex = 0;
+                        }
+                    }
                 }
             }
         }
@@ -92,4 +114,22 @@ public class PbNode {
         }
         return nodes;
     }
+
+    public static boolean isMapDescriptor(Descriptors.Descriptor descriptor) {
+        if (descriptor.getOptions().getMapEntry()) {
+            return true;
+        }
+
+        if (descriptor.getFields().size() == 2) {
+            Descriptors.FieldDescriptor keyField = 
descriptor.findFieldByNumber(1);
+            Descriptors.FieldDescriptor valueField = 
descriptor.findFieldByNumber(2);
+
+            if (keyField != null && valueField != null &&
+                    "key".equals(keyField.getName()) &&
+                    "value".equals(valueField.getName())) {
+                return true;
+            }
+        }
+        return false;
+    }
 }
diff --git 
a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/decode/PbSourceData.java
 
b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/decode/PbSourceData.java
index d4bea9906e..dbeeade6f3 100644
--- 
a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/decode/PbSourceData.java
+++ 
b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/decode/PbSourceData.java
@@ -184,6 +184,7 @@ public class PbSourceData extends AbstractSourceData {
      * @param root
      * @return
      */
+    @SuppressWarnings("rawtypes")
     private String getNodeValue(List<PbNode> childNodes, DynamicMessage root) {
         String fieldValue = "";
         DynamicMessage current = root;
@@ -212,33 +213,42 @@ public class PbSourceData extends AbstractSourceData {
                         fieldValue = String.valueOf(nodeValue);
                         break;
                     case MESSAGE:
-                        fieldValue = String.valueOf(nodeValue);
+                        if (node.isArray()) {
+                            fieldValue = String.valueOf(((List) 
nodeValue).get(node.getArrayIndex()));
+                        } else if (node.isMap()) {
+                            List<DynamicMessage> nodeValueList = 
(List<DynamicMessage>) nodeValue;
+                            for (DynamicMessage subnodeValue : nodeValueList) {
+                                String keyValue = 
String.valueOf(subnodeValue.getField(node.getMapKeyDesc()));
+                                if (StringUtils.equals(keyValue, 
node.getMapKey())) {
+                                    fieldValue = 
String.valueOf(subnodeValue.getField(node.getMapValueDesc()));
+                                    break;
+                                }
+                            }
+                        } else {
+                            fieldValue = String.valueOf(nodeValue);
+                        }
                         break;
                 }
                 break;
             }
-            if (!node.isArray()) {
-                if (!(nodeValue instanceof DynamicMessage)) {
-                    // error data
-                    break;
-                }
-                current = (DynamicMessage) nodeValue;
-            } else {
-                if (!(nodeValue instanceof List)) {
-                    // error data
-                    break;
-                }
-                List<?> nodeList = (List<?>) nodeValue;
-                if (node.getArrayIndex() >= nodeList.size()) {
-                    // error data
-                    break;
+            if (node.isArray()) {
+                current = (DynamicMessage) ((List) 
nodeValue).get(node.getArrayIndex());
+            } else if (node.isMap()) {
+                List<DynamicMessage> nodeValueList = (List<DynamicMessage>) 
nodeValue;
+                DynamicMessage newCurrent = null;
+                for (DynamicMessage subnodeValue : nodeValueList) {
+                    String keyValue = 
String.valueOf(subnodeValue.getField(node.getMapKeyDesc()));
+                    if (StringUtils.equals(keyValue, node.getMapKey())) {
+                        newCurrent = (DynamicMessage) 
subnodeValue.getField(node.getMapValueDesc());
+                        break;
+                    }
                 }
-                Object nodeElement = nodeList.get(node.getArrayIndex());
-                if (!(nodeElement instanceof DynamicMessage)) {
-                    // error data
-                    break;
+                if (newCurrent == null) {
+                    return fieldValue;
                 }
-                current = (DynamicMessage) nodeElement;
+                current = newCurrent;
+            } else {
+                current = (DynamicMessage) nodeValue;
             }
         }
         return fieldValue;

Reply via email to