From a3322f870873ccbc50ea7a42c0fb8bed8a4af1f3 Mon Sep 17 00:00:00 2001 From: pkgonan Date: Wed, 12 Oct 2022 17:12:24 +0900 Subject: [PATCH 1/4] feat:Support Bytes to UUID UDF Function --- .../ksql/function/udf/string/Uuid.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/ksqldb-engine/src/main/java/io/confluent/ksql/function/udf/string/Uuid.java b/ksqldb-engine/src/main/java/io/confluent/ksql/function/udf/string/Uuid.java index f71807570846..05a306323baf 100644 --- a/ksqldb-engine/src/main/java/io/confluent/ksql/function/udf/string/Uuid.java +++ b/ksqldb-engine/src/main/java/io/confluent/ksql/function/udf/string/Uuid.java @@ -14,9 +14,11 @@ package io.confluent.ksql.function.udf.string; +import java.nio.ByteBuffer; import io.confluent.ksql.function.FunctionCategory; import io.confluent.ksql.function.udf.Udf; import io.confluent.ksql.function.udf.UdfDescription; +import io.confluent.ksql.function.udf.UdfParameter; @UdfDescription( name = "UUID", @@ -31,4 +33,20 @@ public class Uuid { public String uuid() { return java.util.UUID.randomUUID().toString(); } + + @Udf + public String toUuid(@UdfParameter final ByteBuffer bytes) { + if (bytes == null) { + return null; + } + + if (bytes.getCapacity() != 16) { + return null; + } + + final ByteBuffer firstLong = bytes.getLong(); + final ByteBuffer secondLong = bytes.getLong(); + + return new java.util.UUID(firstLong, secondLong).toString(); + } } From a7d731f48259cc50ce742c0b1192927157d4b6fe Mon Sep 17 00:00:00 2001 From: pkgonan Date: Wed, 12 Oct 2022 17:37:48 +0900 Subject: [PATCH 2/4] add test --- .../ksql/function/udf/string/UuidTest.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/ksqldb-engine/src/test/java/io/confluent/ksql/function/udf/string/UuidTest.java b/ksqldb-engine/src/test/java/io/confluent/ksql/function/udf/string/UuidTest.java index cfbe2bfc472c..fad092e7e755 100644 --- a/ksqldb-engine/src/test/java/io/confluent/ksql/function/udf/string/UuidTest.java +++ b/ksqldb-engine/src/test/java/io/confluent/ksql/function/udf/string/UuidTest.java @@ -19,6 +19,7 @@ import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.isIn; +import java.nio.ByteBuffer; import java.util.Arrays; import java.util.HashSet; import java.util.Set; @@ -59,4 +60,33 @@ public void shouldHaveCorrectOutputFormat() { } } + @Test + public void nullValueShouldReturnNullValue() { + final String uuid = udf.toUuid(null); + + assertThat(uuid, null) + } + + @Test + public void invalidCapacityShouldReturnNullValue() { + final ByteBuffer bytes = ByteBuffer.wrap(new byte[17]); + + final String uuid = udf.toUuid(bytes); + + assertThat(uuid, null) + } + + @Test + public void shouldReturnCorrectOutputFormat() { + // aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee + final String anUuid = udf.uuid(); + + final java.util.UUID uuid = java.util.UUID.fromString(anUuid); + final ByteBuffer bytes = ByteBuffer.wrap(new byte[16]); + bytes.putLong(getMostSignificantBits()); + bytes.putLong(getLeastSignificantBits()); + + final String toUuid = udf.toUuid(bytes); + assertThat(toUuid, anUuid); + } } \ No newline at end of file From 6c4b8eaa7c59adb480cc92105d6611ddfeebdaa0 Mon Sep 17 00:00:00 2001 From: pkgonan Date: Sun, 16 Oct 2022 19:08:37 +0900 Subject: [PATCH 3/4] Refactor --- .../ksql/function/udf/string/Uuid.java | 17 ++++++------- .../ksql/function/udf/string/UuidTest.java | 24 +++++++++---------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/ksqldb-engine/src/main/java/io/confluent/ksql/function/udf/string/Uuid.java b/ksqldb-engine/src/main/java/io/confluent/ksql/function/udf/string/Uuid.java index 05a306323baf..744f4bfe940f 100644 --- a/ksqldb-engine/src/main/java/io/confluent/ksql/function/udf/string/Uuid.java +++ b/ksqldb-engine/src/main/java/io/confluent/ksql/function/udf/string/Uuid.java @@ -14,11 +14,12 @@ package io.confluent.ksql.function.udf.string; -import java.nio.ByteBuffer; import io.confluent.ksql.function.FunctionCategory; import io.confluent.ksql.function.udf.Udf; import io.confluent.ksql.function.udf.UdfDescription; import io.confluent.ksql.function.udf.UdfParameter; +import java.nio.BufferUnderflowException; +import java.nio.ByteBuffer; @UdfDescription( name = "UUID", @@ -36,17 +37,17 @@ public String uuid() { @Udf public String toUuid(@UdfParameter final ByteBuffer bytes) { - if (bytes == null) { + if (bytes == null || bytes.capacity() != 16) { return null; } - if (bytes.getCapacity() != 16) { + try { + final long firstLong = bytes.getLong(); + final long secondLong = bytes.getLong(); + + return new java.util.UUID(firstLong, secondLong).toString(); + } catch (BufferUnderflowException ex) { return null; } - - final ByteBuffer firstLong = bytes.getLong(); - final ByteBuffer secondLong = bytes.getLong(); - - return new java.util.UUID(firstLong, secondLong).toString(); } } diff --git a/ksqldb-engine/src/test/java/io/confluent/ksql/function/udf/string/UuidTest.java b/ksqldb-engine/src/test/java/io/confluent/ksql/function/udf/string/UuidTest.java index fad092e7e755..076066296148 100644 --- a/ksqldb-engine/src/test/java/io/confluent/ksql/function/udf/string/UuidTest.java +++ b/ksqldb-engine/src/test/java/io/confluent/ksql/function/udf/string/UuidTest.java @@ -14,17 +14,16 @@ package io.confluent.ksql.function.udf.string; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.isIn; +import org.junit.Before; +import org.junit.Test; import java.nio.ByteBuffer; import java.util.Arrays; import java.util.HashSet; import java.util.Set; -import org.junit.Before; -import org.junit.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; public class UuidTest { @@ -64,7 +63,7 @@ public void shouldHaveCorrectOutputFormat() { public void nullValueShouldReturnNullValue() { final String uuid = udf.toUuid(null); - assertThat(uuid, null) + assertThat(uuid, is(nullValue())); } @Test @@ -73,7 +72,7 @@ public void invalidCapacityShouldReturnNullValue() { final String uuid = udf.toUuid(bytes); - assertThat(uuid, null) + assertThat(uuid, is(nullValue())); } @Test @@ -83,10 +82,11 @@ public void shouldReturnCorrectOutputFormat() { final java.util.UUID uuid = java.util.UUID.fromString(anUuid); final ByteBuffer bytes = ByteBuffer.wrap(new byte[16]); - bytes.putLong(getMostSignificantBits()); - bytes.putLong(getLeastSignificantBits()); + bytes.putLong(uuid.getMostSignificantBits()); + bytes.putLong(uuid.getLeastSignificantBits()); + byte[] byteArrays = bytes.array(); - final String toUuid = udf.toUuid(bytes); - assertThat(toUuid, anUuid); + final String toUuid = udf.toUuid(ByteBuffer.wrap(byteArrays)); + assertThat(toUuid, is(anUuid)); } } \ No newline at end of file From 9fd95212b91ce0ab6894f1c55768aa64e9459be0 Mon Sep 17 00:00:00 2001 From: pkgonan Date: Sun, 16 Oct 2022 19:38:43 +0900 Subject: [PATCH 4/4] Rename method --- .../java/io/confluent/ksql/function/udf/string/Uuid.java | 2 +- .../io/confluent/ksql/function/udf/string/UuidTest.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ksqldb-engine/src/main/java/io/confluent/ksql/function/udf/string/Uuid.java b/ksqldb-engine/src/main/java/io/confluent/ksql/function/udf/string/Uuid.java index 744f4bfe940f..758c60321079 100644 --- a/ksqldb-engine/src/main/java/io/confluent/ksql/function/udf/string/Uuid.java +++ b/ksqldb-engine/src/main/java/io/confluent/ksql/function/udf/string/Uuid.java @@ -36,7 +36,7 @@ public String uuid() { } @Udf - public String toUuid(@UdfParameter final ByteBuffer bytes) { + public String uuid(@UdfParameter final ByteBuffer bytes) { if (bytes == null || bytes.capacity() != 16) { return null; } diff --git a/ksqldb-engine/src/test/java/io/confluent/ksql/function/udf/string/UuidTest.java b/ksqldb-engine/src/test/java/io/confluent/ksql/function/udf/string/UuidTest.java index 076066296148..878be7d346ab 100644 --- a/ksqldb-engine/src/test/java/io/confluent/ksql/function/udf/string/UuidTest.java +++ b/ksqldb-engine/src/test/java/io/confluent/ksql/function/udf/string/UuidTest.java @@ -61,7 +61,7 @@ public void shouldHaveCorrectOutputFormat() { @Test public void nullValueShouldReturnNullValue() { - final String uuid = udf.toUuid(null); + final String uuid = udf.uuid(null); assertThat(uuid, is(nullValue())); } @@ -70,7 +70,7 @@ public void nullValueShouldReturnNullValue() { public void invalidCapacityShouldReturnNullValue() { final ByteBuffer bytes = ByteBuffer.wrap(new byte[17]); - final String uuid = udf.toUuid(bytes); + final String uuid = udf.uuid(bytes); assertThat(uuid, is(nullValue())); } @@ -86,7 +86,7 @@ public void shouldReturnCorrectOutputFormat() { bytes.putLong(uuid.getLeastSignificantBits()); byte[] byteArrays = bytes.array(); - final String toUuid = udf.toUuid(ByteBuffer.wrap(byteArrays)); + final String toUuid = udf.uuid(ByteBuffer.wrap(byteArrays)); assertThat(toUuid, is(anUuid)); } } \ No newline at end of file