From f06637727c20b3c6d1ba0f686511f5af53984b93 Mon Sep 17 00:00:00 2001 From: candiduslynx Date: Tue, 8 Aug 2023 14:51:15 +0300 Subject: [PATCH 1/5] use boolean instead of Boolean --- .../java/io/cloudquery/scalar/Binary.java | 52 +++++++++++++++++++ .../java/io/cloudquery/scalar/Scalar.java | 4 +- .../io/cloudquery/scalar/ValidationError.java | 4 ++ 3 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 lib/src/main/java/io/cloudquery/scalar/Binary.java create mode 100644 lib/src/main/java/io/cloudquery/scalar/ValidationError.java diff --git a/lib/src/main/java/io/cloudquery/scalar/Binary.java b/lib/src/main/java/io/cloudquery/scalar/Binary.java new file mode 100644 index 0000000..27f4652 --- /dev/null +++ b/lib/src/main/java/io/cloudquery/scalar/Binary.java @@ -0,0 +1,52 @@ +package io.cloudquery.scalar; + +import org.apache.arrow.vector.types.pojo.ArrowType; + +import java.util.Arrays; + +public class Binary implements Scalar { + private byte[] value; + private boolean valid; + private static final ArrowType dataType = new org.apache.arrow.vector.types.pojo.ArrowType.Binary(); + + @Override + public String String() { + return null; + } + + @Override + public boolean IsValid() { + return this.valid; + } + + @Override + public ArrowType DataType() { + return dataType; + } + + @Override + public void Set(Object obj) { + + } + + @Override + public Object Get() { + if (this.valid) { + return this.value; + } + return null; + } + + @Override + public boolean Equal(Scalar other) { + if (other == null) { + return false; + } + + if (!(other instanceof Binary o)) { + return false; + } + + return (this.valid && o.valid) && Arrays.equals(this.value, o.value); + } +} diff --git a/lib/src/main/java/io/cloudquery/scalar/Scalar.java b/lib/src/main/java/io/cloudquery/scalar/Scalar.java index 5103f44..bd003fa 100644 --- a/lib/src/main/java/io/cloudquery/scalar/Scalar.java +++ b/lib/src/main/java/io/cloudquery/scalar/Scalar.java @@ -5,7 +5,7 @@ public interface Scalar { String String(); - Boolean IsValid(); + boolean IsValid(); ArrowType DataType(); @@ -13,5 +13,5 @@ public interface Scalar { Object Get(); - Boolean Equal(Scalar other); + boolean Equal(Scalar other); } diff --git a/lib/src/main/java/io/cloudquery/scalar/ValidationError.java b/lib/src/main/java/io/cloudquery/scalar/ValidationError.java new file mode 100644 index 0000000..621c843 --- /dev/null +++ b/lib/src/main/java/io/cloudquery/scalar/ValidationError.java @@ -0,0 +1,4 @@ +package io.cloudquery.scalar; + +public class ValidationError extends Error{ +} From 7a3c934f70fafb0cb2061cfd62353e6a5edde7e4 Mon Sep 17 00:00:00 2001 From: candiduslynx Date: Tue, 8 Aug 2023 15:09:32 +0300 Subject: [PATCH 2/5] ValidationErrorException --- .../java/io/cloudquery/scalar/Binary.java | 11 ++--- .../io/cloudquery/scalar/LargeBinary.java | 10 +++++ .../java/io/cloudquery/scalar/Scalar.java | 2 +- .../io/cloudquery/scalar/ValidationError.java | 4 -- .../scalar/ValidationErrorException.java | 40 +++++++++++++++++++ 5 files changed, 57 insertions(+), 10 deletions(-) create mode 100644 lib/src/main/java/io/cloudquery/scalar/LargeBinary.java delete mode 100644 lib/src/main/java/io/cloudquery/scalar/ValidationError.java create mode 100644 lib/src/main/java/io/cloudquery/scalar/ValidationErrorException.java diff --git a/lib/src/main/java/io/cloudquery/scalar/Binary.java b/lib/src/main/java/io/cloudquery/scalar/Binary.java index 27f4652..fcd6ac1 100644 --- a/lib/src/main/java/io/cloudquery/scalar/Binary.java +++ b/lib/src/main/java/io/cloudquery/scalar/Binary.java @@ -5,12 +5,11 @@ import java.util.Arrays; public class Binary implements Scalar { - private byte[] value; - private boolean valid; - private static final ArrowType dataType = new org.apache.arrow.vector.types.pojo.ArrowType.Binary(); + protected byte[] value; + protected boolean valid; @Override - public String String() { + public String toString() { return null; } @@ -21,7 +20,7 @@ public boolean IsValid() { @Override public ArrowType DataType() { - return dataType; + return ArrowType.Binary.INSTANCE; } @Override @@ -50,3 +49,5 @@ public boolean Equal(Scalar other) { return (this.valid && o.valid) && Arrays.equals(this.value, o.value); } } + +; \ No newline at end of file diff --git a/lib/src/main/java/io/cloudquery/scalar/LargeBinary.java b/lib/src/main/java/io/cloudquery/scalar/LargeBinary.java new file mode 100644 index 0000000..4b28316 --- /dev/null +++ b/lib/src/main/java/io/cloudquery/scalar/LargeBinary.java @@ -0,0 +1,10 @@ +package io.cloudquery.scalar; + +import org.apache.arrow.vector.types.pojo.ArrowType; + +public class LargeBinary extends Binary { + @Override + public ArrowType DataType() { + return ArrowType.LargeBinary.INSTANCE; + } +} diff --git a/lib/src/main/java/io/cloudquery/scalar/Scalar.java b/lib/src/main/java/io/cloudquery/scalar/Scalar.java index bd003fa..36d8783 100644 --- a/lib/src/main/java/io/cloudquery/scalar/Scalar.java +++ b/lib/src/main/java/io/cloudquery/scalar/Scalar.java @@ -3,7 +3,7 @@ import org.apache.arrow.vector.types.pojo.ArrowType; public interface Scalar { - String String(); + String toString(); boolean IsValid(); diff --git a/lib/src/main/java/io/cloudquery/scalar/ValidationError.java b/lib/src/main/java/io/cloudquery/scalar/ValidationError.java deleted file mode 100644 index 621c843..0000000 --- a/lib/src/main/java/io/cloudquery/scalar/ValidationError.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.cloudquery.scalar; - -public class ValidationError extends Error{ -} diff --git a/lib/src/main/java/io/cloudquery/scalar/ValidationErrorException.java b/lib/src/main/java/io/cloudquery/scalar/ValidationErrorException.java new file mode 100644 index 0000000..74cf09c --- /dev/null +++ b/lib/src/main/java/io/cloudquery/scalar/ValidationErrorException.java @@ -0,0 +1,40 @@ +package io.cloudquery.scalar; + +import org.apache.arrow.vector.types.pojo.ArrowType; + +public class ValidationErrorException extends Exception { + public Throwable cause; + public String message; + public ArrowType type; + private final Object value; + + + ValidationErrorException(Throwable cause, String message, ArrowType type, Object value) { + super(message, cause); + this.cause = cause; + this.message = message; + this.type = type; + this.value = value; + } + + ValidationErrorException(String message, ArrowType type, Object value) { + super(message); + this.message = message; + this.type = type; + this.value = value; + } + + public String Error() { + if (this.cause == null) { + return String.format("cannot set `%s` with value `%s`: %s", this.type, this.value, this.message); + } + return String.format("cannot set `%s` with value `%s`: %s (%s)", this.type, this.value, this.message, this.cause); + } + + public String Masked() { + if (this.cause == null) { + return String.format("cannot set `%s`: %s", this.type.toString(), this.message); + } + return String.format("cannot set `%s`: %s (%s)", this.type.toString(), this.message, this.cause); + } +} From 6221164e70c8d8301eb45832140a9fac1b651909 Mon Sep 17 00:00:00 2001 From: candiduslynx Date: Tue, 8 Aug 2023 15:15:33 +0300 Subject: [PATCH 3/5] almost complete binary --- lib/src/main/java/io/cloudquery/scalar/Binary.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/src/main/java/io/cloudquery/scalar/Binary.java b/lib/src/main/java/io/cloudquery/scalar/Binary.java index fcd6ac1..21f1b90 100644 --- a/lib/src/main/java/io/cloudquery/scalar/Binary.java +++ b/lib/src/main/java/io/cloudquery/scalar/Binary.java @@ -1,6 +1,7 @@ package io.cloudquery.scalar; import org.apache.arrow.vector.types.pojo.ArrowType; +import org.apache.commons.codec.binary.Base64; import java.util.Arrays; @@ -10,7 +11,10 @@ public class Binary implements Scalar { @Override public String toString() { - return null; + if (this.valid) { + return Base64.encodeBase64String(this.value); + } + return ""; } @Override @@ -48,6 +52,4 @@ public boolean Equal(Scalar other) { return (this.valid && o.valid) && Arrays.equals(this.value, o.value); } -} - -; \ No newline at end of file +} \ No newline at end of file From f71822cddbb0918b35eebd29eb2815724cc3f272 Mon Sep 17 00:00:00 2001 From: candiduslynx Date: Tue, 8 Aug 2023 15:18:22 +0300 Subject: [PATCH 4/5] null value str --- lib/src/main/java/io/cloudquery/scalar/Binary.java | 2 +- lib/src/main/java/io/cloudquery/scalar/Scalar.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/src/main/java/io/cloudquery/scalar/Binary.java b/lib/src/main/java/io/cloudquery/scalar/Binary.java index 21f1b90..06de738 100644 --- a/lib/src/main/java/io/cloudquery/scalar/Binary.java +++ b/lib/src/main/java/io/cloudquery/scalar/Binary.java @@ -14,7 +14,7 @@ public String toString() { if (this.valid) { return Base64.encodeBase64String(this.value); } - return ""; + return NULL_VALUE_STRING; } @Override diff --git a/lib/src/main/java/io/cloudquery/scalar/Scalar.java b/lib/src/main/java/io/cloudquery/scalar/Scalar.java index 36d8783..3a3e547 100644 --- a/lib/src/main/java/io/cloudquery/scalar/Scalar.java +++ b/lib/src/main/java/io/cloudquery/scalar/Scalar.java @@ -14,4 +14,6 @@ public interface Scalar { Object Get(); boolean Equal(Scalar other); + + public static final String NULL_VALUE_STRING = "(null)"; } From 9c9e5b718a4b16f0d068ab60679b981e27831713 Mon Sep 17 00:00:00 2001 From: candiduslynx Date: Tue, 8 Aug 2023 16:08:25 +0300 Subject: [PATCH 5/5] binary impl finalized --- .../java/io/cloudquery/scalar/Binary.java | 52 +++++++++++++++++-- .../io/cloudquery/scalar/LargeBinary.java | 10 +++- .../java/io/cloudquery/scalar/Scalar.java | 12 ++--- ...xception.java => ValidationException.java} | 8 +-- 4 files changed, 67 insertions(+), 15 deletions(-) rename lib/src/main/java/io/cloudquery/scalar/{ValidationErrorException.java => ValidationException.java} (78%) diff --git a/lib/src/main/java/io/cloudquery/scalar/Binary.java b/lib/src/main/java/io/cloudquery/scalar/Binary.java index 06de738..136a920 100644 --- a/lib/src/main/java/io/cloudquery/scalar/Binary.java +++ b/lib/src/main/java/io/cloudquery/scalar/Binary.java @@ -9,6 +9,13 @@ public class Binary implements Scalar { protected byte[] value; protected boolean valid; + public Binary() { + } + + public Binary(Object value) throws ValidationException { + this.set(value); + } + @Override public String toString() { if (this.valid) { @@ -18,22 +25,57 @@ public String toString() { } @Override - public boolean IsValid() { + public boolean isValid() { return this.valid; } @Override - public ArrowType DataType() { + public ArrowType dataType() { return ArrowType.Binary.INSTANCE; } @Override - public void Set(Object obj) { + public void set(Object value) throws ValidationException { + if (value == null) { + this.valid = false; + this.value = null; + return; + } + + if (value instanceof Scalar scalar) { + if (!scalar.isValid()) { + this.valid = false; + this.value = null; + return; + } + + this.set(scalar.get()); + return; + } + + if (value instanceof byte[] bytes) { + this.valid = true; + this.value = bytes; + return; + } + + if (value instanceof String string) { + this.valid = true; + this.value = Base64.decodeBase64(string); + return; + } + + if (value instanceof char[] chars) { + this.valid = true; + this.value = Base64.decodeBase64(new String(chars)); + return; + } + throw new ValidationException(ValidationException.NO_CONVERSION_AVAILABLE, this.dataType(), value); } @Override - public Object Get() { + public Object get() { if (this.valid) { return this.value; } @@ -41,7 +83,7 @@ public Object Get() { } @Override - public boolean Equal(Scalar other) { + public boolean equals(Object other) { if (other == null) { return false; } diff --git a/lib/src/main/java/io/cloudquery/scalar/LargeBinary.java b/lib/src/main/java/io/cloudquery/scalar/LargeBinary.java index 4b28316..11428c2 100644 --- a/lib/src/main/java/io/cloudquery/scalar/LargeBinary.java +++ b/lib/src/main/java/io/cloudquery/scalar/LargeBinary.java @@ -3,8 +3,16 @@ import org.apache.arrow.vector.types.pojo.ArrowType; public class LargeBinary extends Binary { + + public LargeBinary() { + } + + public LargeBinary(Object value) throws ValidationException { + this.set(value); + } + @Override - public ArrowType DataType() { + public ArrowType dataType() { return ArrowType.LargeBinary.INSTANCE; } } diff --git a/lib/src/main/java/io/cloudquery/scalar/Scalar.java b/lib/src/main/java/io/cloudquery/scalar/Scalar.java index 3a3e547..b6857fd 100644 --- a/lib/src/main/java/io/cloudquery/scalar/Scalar.java +++ b/lib/src/main/java/io/cloudquery/scalar/Scalar.java @@ -5,15 +5,15 @@ public interface Scalar { String toString(); - boolean IsValid(); + boolean isValid(); - ArrowType DataType(); + ArrowType dataType(); - void Set(Object obj); + void set(Object value) throws ValidationException; - Object Get(); + Object get(); - boolean Equal(Scalar other); + boolean equals(Object other); - public static final String NULL_VALUE_STRING = "(null)"; + String NULL_VALUE_STRING = "(null)"; } diff --git a/lib/src/main/java/io/cloudquery/scalar/ValidationErrorException.java b/lib/src/main/java/io/cloudquery/scalar/ValidationException.java similarity index 78% rename from lib/src/main/java/io/cloudquery/scalar/ValidationErrorException.java rename to lib/src/main/java/io/cloudquery/scalar/ValidationException.java index 74cf09c..7a8d2da 100644 --- a/lib/src/main/java/io/cloudquery/scalar/ValidationErrorException.java +++ b/lib/src/main/java/io/cloudquery/scalar/ValidationException.java @@ -2,14 +2,16 @@ import org.apache.arrow.vector.types.pojo.ArrowType; -public class ValidationErrorException extends Exception { +public class ValidationException extends Exception { public Throwable cause; public String message; public ArrowType type; private final Object value; + static final String NO_CONVERSION_AVAILABLE = "no conversion available"; - ValidationErrorException(Throwable cause, String message, ArrowType type, Object value) { + + ValidationException(Throwable cause, String message, ArrowType type, Object value) { super(message, cause); this.cause = cause; this.message = message; @@ -17,7 +19,7 @@ public class ValidationErrorException extends Exception { this.value = value; } - ValidationErrorException(String message, ArrowType type, Object value) { + ValidationException(String message, ArrowType type, Object value) { super(message); this.message = message; this.type = type;