Skip to content

Commit 41b8530

Browse files
authored
[Improve][Transform] Improve inner sql query for map field type (#7718)
1 parent 116af4f commit 41b8530

File tree

2 files changed

+18
-5
lines changed
  • seatunnel-e2e/seatunnel-transforms-v2-e2e/seatunnel-transforms-v2-e2e-part-2/src/test/resources/sql_transform
  • seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta

2 files changed

+18
-5
lines changed

seatunnel-e2e/seatunnel-transforms-v2-e2e/seatunnel-transforms-v2-e2e-part-2/src/test/resources/sql_transform/inner_query.conf

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ transform {
5353
c_row.c_string c_string,
5454
c_row.c_inner_row.c_inner_string c_inner_string,
5555
c_row.c_inner_row.c_inner_timestamp c_inner_timestamp,
56+
c_row.c_inner_row.c_map inner_map,
5657
c_row.c_inner_row.c_map.innerQuery map_val,
5758
c_row.c_inner_row.c_map.notExistKey map_not_exist_val
5859
from fake"""
@@ -94,11 +95,20 @@ sink {
9495
{rule_type = NOT_NULL}
9596
]
9697
},
98+
{
99+
field_name = "inner_map"
100+
field_type = "map<string, string>"
101+
field_value = [
102+
{
103+
equals_to = {innerQuery=innerQuery}
104+
}
105+
]
106+
},
97107
{
98108
field_name = "map_val"
99109
field_type = "string"
100110
field_value = [
101-
{rule_type = NOT_NULL}
111+
{equals_to = "innerQuery"}
102112
]
103113
},
104114
{

seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLType.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -144,12 +144,15 @@ public SeaTunnelDataType<?> getExpressionType(Expression expression) {
144144
if (filedTypeRes instanceof SeaTunnelRowType) {
145145
parRowType = (SeaTunnelRowType) filedTypeRes;
146146
} else if (filedTypeRes instanceof MapType) {
147-
// for map type. only support it's the latest struct.
148-
if (i != deep - 2) {
147+
if (i < deep - 2) {
149148
throw new IllegalArgumentException(
150-
"For now, we only support map struct is the latest struct in inner query function! Please modify your query!");
149+
"For now, when you query map field with inner query, it must be latest field or latest struct field! Please modify your query!");
150+
}
151+
if (i == deep - 1) {
152+
return filedTypeRes;
153+
} else {
154+
return ((MapType<?, ?>) filedTypeRes).getValueType();
151155
}
152-
return ((MapType<?, ?>) filedTypeRes).getValueType();
153156
}
154157
}
155158
return filedTypeRes;

0 commit comments

Comments
 (0)