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");
+ }
}