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 78ed72735d [INLONG-11944][Sort] Transform function parseurl supports 
parsing URL query string (#11945)
78ed72735d is described below

commit 78ed72735d67b7fc4ffcc8675efa99dc45494f45
Author: ChunLiang Lu <[email protected]>
AuthorDate: Thu Jul 24 10:12:11 2025 +0800

    [INLONG-11944][Sort] Transform function parseurl supports parsing URL query 
string (#11945)
    
    * [INLONG-11944]​​[Sort] TransformFunction: parse_url supports parsing URL 
query strings​
    
    * fix code format
---
 .../process/function/string/ParseUrlFunction.java  | 29 +++++++++------
 .../function/string/TestParseUrlFunction.java      | 42 ++++++++++++++++++++++
 2 files changed, 60 insertions(+), 11 deletions(-)

diff --git 
a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/string/ParseUrlFunction.java
 
b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/string/ParseUrlFunction.java
index 84f5731db2..e853c59271 100644
--- 
a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/string/ParseUrlFunction.java
+++ 
b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/string/ParseUrlFunction.java
@@ -85,15 +85,22 @@ public class ParseUrlFunction implements ValueParser {
             return null;
         }
 
-        try {
-            URL netUrl = new URL(url);
-            Map<String, String> queryPairs = splitQuery(netUrl.getQuery());
-            if ("QUERY".equals(part)) {
-                if (key != null && queryPairs.containsKey(key)) {
-                    return queryPairs.get(key);
-                }
-                return netUrl.getQuery();
-            } else {
+        if ("QUERY".equals(part)) {
+            String strQuery = null;
+            try {
+                URL netUrl = new URL(url);
+                strQuery = netUrl.getQuery();
+            } catch (MalformedURLException e) {
+                strQuery = url;
+            }
+            Map<String, String> queryPairs = splitQuery(strQuery);
+            if (key == null) {
+                return strQuery;
+            }
+            return queryPairs.getOrDefault(key, "");
+        } else {
+            try {
+                URL netUrl = new URL(url);
                 switch (part) {
                     case "HOST":
                         return netUrl.getHost();
@@ -112,9 +119,9 @@ public class ParseUrlFunction implements ValueParser {
                     default:
                         return null;
                 }
+            } catch (MalformedURLException e) {
+                return null;
             }
-        } catch (MalformedURLException e) {
-            return null;
         }
     }
 
diff --git 
a/inlong-sdk/transform-sdk/src/test/java/org/apache/inlong/sdk/transform/process/function/string/TestParseUrlFunction.java
 
b/inlong-sdk/transform-sdk/src/test/java/org/apache/inlong/sdk/transform/process/function/string/TestParseUrlFunction.java
index fd8f2d3daf..b35980b6e7 100644
--- 
a/inlong-sdk/transform-sdk/src/test/java/org/apache/inlong/sdk/transform/process/function/string/TestParseUrlFunction.java
+++ 
b/inlong-sdk/transform-sdk/src/test/java/org/apache/inlong/sdk/transform/process/function/string/TestParseUrlFunction.java
@@ -25,6 +25,7 @@ import 
org.apache.inlong.sdk.transform.process.TransformProcessor;
 import org.junit.Assert;
 import org.junit.Test;
 
+import java.net.URLEncoder;
 import java.util.HashMap;
 import java.util.List;
 
@@ -139,4 +140,45 @@ public class TestParseUrlFunction extends 
AbstractFunctionStringTestBase {
         Assert.assertEquals(1, output9.size());
         Assert.assertEquals(output9.get(0), 
"result=user:[email protected]:8080");
     }
+
+    @SuppressWarnings("deprecation")
+    @Test
+    public void testUrlDecoderAndParseUrlFunction() throws Exception {
+        String transformSql1 = "select parse_url(string1, string2, string3) 
from source";
+        TransformConfig config1 = new TransformConfig(transformSql1);
+        TransformProcessor<String, String> processor1 = TransformProcessor
+                .create(config1, 
SourceDecoderFactory.createCsvDecoder(csvSource),
+                        SinkEncoderFactory.createKvEncoder(kvSink));
+
+        // case1: 
parse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'HOST')
+        List<String> output1 = processor1
+                
.transform("http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1|QUERY|k1|cloud|1", 
new HashMap<>());
+        Assert.assertEquals(1, output1.size());
+        Assert.assertEquals(output1.get(0), "result=v1");
+
+        String transformSql2 = "select parse_url(url_decode(string1), string2, 
string3) from source";
+        TransformConfig config2 = new TransformConfig(transformSql2);
+        TransformProcessor<String, String> processor2 = TransformProcessor
+                .create(config2, 
SourceDecoderFactory.createCsvDecoder(csvSource),
+                        SinkEncoderFactory.createKvEncoder(kvSink));
+        // case2: 
parse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'QUERY')
+        String rawValue = "http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1";;
+        String encodeValue = URLEncoder.encode(rawValue) + "|QUERY|k2|cloud|1";
+        List<String> output2 = processor2
+                .transform(encodeValue, new HashMap<>());
+        Assert.assertEquals(1, output2.size());
+        Assert.assertEquals(output2.get(0), "result=v2");
+
+        String transformSql3 = "select parse_url(url_decode(string1), 'QUERY', 
'K2') from source";
+        TransformConfig config3 = new TransformConfig(transformSql3);
+        TransformProcessor<String, String> processor3 = TransformProcessor
+                .create(config3, 
SourceDecoderFactory.createCsvDecoder(csvSource),
+                        SinkEncoderFactory.createKvEncoder(kvSink));
+        String rawValue3 = "k1=v1&K2=v2#Ref1";
+        String encodeValue3 = URLEncoder.encode(rawValue3) + 
"|QUERY|k2|cloud|1";
+        List<String> output3 = processor3
+                .transform(encodeValue3, new HashMap<>());
+        Assert.assertEquals(1, output3.size());
+        Assert.assertEquals(output3.get(0), "result=v2#Ref1");
+    }
 }

Reply via email to