Skip to content

Commit 55ad905

Browse files
committed
fix
1 parent 46a8b24 commit 55ad905

2 files changed

Lines changed: 57 additions & 0 deletions

File tree

paimon-common/src/main/java/org/apache/paimon/data/BinaryString.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,6 +1013,14 @@ public static String defaultDecodeUTF8(byte[] bytes, int offset, int len) {
10131013
return new String(bytes, offset, len, StandardCharsets.UTF_8);
10141014
}
10151015

1016+
/**
1017+
* Concatenates input strings together into a single string. Returns NULL if any argument is
1018+
* NULL.
1019+
*/
1020+
public static BinaryString concat(BinaryString... inputs) {
1021+
return concat(Arrays.asList(inputs));
1022+
}
1023+
10161024
/**
10171025
* Concatenates input strings together into a single string. Returns NULL if any argument is
10181026
* NULL.
@@ -1042,6 +1050,17 @@ public static BinaryString concat(Iterable<BinaryString> inputs) {
10421050
return fromBytes(result);
10431051
}
10441052

1053+
/**
1054+
* Concatenates input strings together into a single string using the separator. Returns NULL If
1055+
* the separator is NULL.
1056+
*
1057+
* <p>Note: CONCAT_WS() does not skip any empty strings, however it does skip any NULL values
1058+
* after the separator. For example, concat_ws(",", "a", null, "c") would yield "a,c".
1059+
*/
1060+
public static BinaryString concatWs(BinaryString separator, BinaryString... inputs) {
1061+
return concatWs(separator, Arrays.asList(inputs));
1062+
}
1063+
10451064
/**
10461065
* Concatenates input strings together into a single string using the separator. Returns NULL If
10471066
* the separator is NULL.

paimon-common/src/test/java/org/apache/paimon/data/BinaryStringTest.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
import static java.nio.charset.StandardCharsets.UTF_8;
3636
import static org.apache.paimon.data.BinaryString.EMPTY_UTF8;
3737
import static org.apache.paimon.data.BinaryString.blankString;
38+
import static org.apache.paimon.data.BinaryString.concat;
39+
import static org.apache.paimon.data.BinaryString.concatWs;
3840
import static org.apache.paimon.data.BinaryString.fromBytes;
3941
import static org.apache.paimon.utils.DecimalUtils.castFrom;
4042
import static org.assertj.core.api.Assertions.assertThat;
@@ -221,6 +223,42 @@ public void testMultiSegments() {
221223
assertThat(binaryString2.compareTo(binaryString1)).isEqualTo(1);
222224
}
223225

226+
@TestTemplate
227+
void concatTest() {
228+
assertThat(concat()).isEqualTo(EMPTY_UTF8);
229+
assertThat(concat((BinaryString) null)).isNull();
230+
assertThat(concat(EMPTY_UTF8)).isEqualTo(EMPTY_UTF8);
231+
assertThat(concat(fromString("ab"))).isEqualTo(fromString("ab"));
232+
assertThat(concat(fromString("a"), fromString("b"))).isEqualTo(fromString("ab"));
233+
assertThat(concat(fromString("a"), fromString("b"), fromString("c")))
234+
.isEqualTo(fromString("abc"));
235+
assertThat(concat(fromString("a"), null, fromString("c"))).isNull();
236+
assertThat(concat(fromString("a"), null, null)).isNull();
237+
assertThat(concat(null, null, null)).isNull();
238+
assertThat(concat(fromString("数据"), fromString("砖头"))).isEqualTo(fromString("数据砖头"));
239+
}
240+
241+
@TestTemplate
242+
void concatWsTest() {
243+
// Returns empty if the separator is null
244+
assertThat(concatWs(null, (BinaryString) null)).isNull();
245+
assertThat(concatWs(null, fromString("a"))).isNull();
246+
247+
// If separator is null, concatWs should skip all null inputs and never return null.
248+
BinaryString sep = fromString("哈哈");
249+
assertThat(concatWs(sep, EMPTY_UTF8)).isEqualTo(EMPTY_UTF8);
250+
assertThat(concatWs(sep, fromString("ab"))).isEqualTo(fromString("ab"));
251+
assertThat(concatWs(sep, fromString("a"), fromString("b"))).isEqualTo(fromString("a哈哈b"));
252+
assertThat(concatWs(sep, fromString("a"), fromString("b"), fromString("c")))
253+
.isEqualTo(fromString("a哈哈b哈哈c"));
254+
assertThat(concatWs(sep, fromString("a"), null, fromString("c")))
255+
.isEqualTo(fromString("a哈哈c"));
256+
assertThat(concatWs(sep, fromString("a"), null, null)).isEqualTo(fromString("a"));
257+
assertThat(concatWs(sep, null, null, null)).isEqualTo(EMPTY_UTF8);
258+
assertThat(concatWs(sep, fromString("数据"), fromString("砖头")))
259+
.isEqualTo(fromString("数据哈哈砖头"));
260+
}
261+
224262
@TestTemplate
225263
public void contains() {
226264
assertThat(EMPTY_UTF8.contains(EMPTY_UTF8)).isTrue();

0 commit comments

Comments
 (0)