From dc184e2b7382091a3a5c71656c17d26e2d962da6 Mon Sep 17 00:00:00 2001 From: rbasralian Date: Wed, 18 Sep 2024 16:24:12 -0400 Subject: [PATCH] include column name in prefix for `checkCastTo` instead --- .../deephaven/engine/table/ColumnSource.java | 60 ++++++++++++++++++- .../engine/table/impl/TableDefaults.java | 11 +--- 2 files changed, 61 insertions(+), 10 deletions(-) diff --git a/engine/api/src/main/java/io/deephaven/engine/table/ColumnSource.java b/engine/api/src/main/java/io/deephaven/engine/table/ColumnSource.java index c70c2fe65a0..9ba13992d3d 100644 --- a/engine/api/src/main/java/io/deephaven/engine/table/ColumnSource.java +++ b/engine/api/src/main/java/io/deephaven/engine/table/ColumnSource.java @@ -177,8 +177,34 @@ default void exportAllTo(final Object @NotNull [] dest, @NotNull final T tuple) */ @FinalDefault default ColumnSource cast(Class clazz) { + return cast(clazz, (String) null); + } + + /** + * Returns this {@code ColumnSource}, parameterized by {@code }, if the data type of this column (as given by + * {@link #getType()}) can be cast to {@code clazz}. This is analogous to casting the objects provided by this + * column source to {@code clazz}. + *

+ * For example, the following code will throw an exception if the "MyString" column does not actually contain + * {@code String} data: + * + *

+     *     ColumnSource<String> colSource = table.getColumnSource("MyString").cast(String.class)
+     * 
+ *

+ * Due to the nature of type erasure, the JVM will still insert an additional cast to {@code TYPE} when elements are + * retrieved from the column source, such as with {@code String myStr = colSource.get(0)}. + * + * @param clazz The target type. + * @param The target type, as a type parameter. Intended to be inferred from {@code clazz}. + * @param colName An optional column name, which will be included in exception messages. + * @return A {@code ColumnSource} parameterized by {@code TYPE}. + */ + @FinalDefault + default ColumnSource cast(Class clazz, @Nullable String colName) { Require.neqNull(clazz, "clazz"); - TypeHelper.checkCastTo("ColumnSource", getType(), clazz); + final String castCheckPrefix = colName == null ? "ColumnSource" : "ColumnSource[" + colName + ']'; + TypeHelper.checkCastTo(castCheckPrefix, getType(), clazz); // noinspection unchecked return (ColumnSource) this; } @@ -208,8 +234,38 @@ default ColumnSource cast(Class clazz) { */ @FinalDefault default ColumnSource cast(Class clazz, @Nullable Class componentType) { + return cast(clazz, componentType, null); + } + + /** + * Returns this {@code ColumnSource}, parameterized by {@code }, if the data type of this column (as given by + * {@link #getType()}) can be cast to {@code clazz}. This is analogous to casting the objects provided by this + * column source to {@code clazz}. Additionally, this checks that the component type of this column (as given by + * {@link #getComponentType()}) can be cast to {@code componentType} (both must be present and castable, or both + * must be {@code null}). + * + *

+ * For example, the following code will throw an exception if the "MyString" column does not actually contain + * {@code String} data: + * + *

+     *     ColumnSource<String> colSource = table.getColumnSource("MyString").cast(String.class, null)
+     * 
+ *

+ * Due to the nature of type erasure, the JVM will still insert an additional cast to {@code TYPE} when elements are + * retrieved from the column source, such as with {@code String myStr = colSource.get(0)}. + * + * @param clazz The target type. + * @param componentType The target component type, may be {@code null}. + * @param colName An optional column name, which will be included in exception messages. + * @param The target type, as a type parameter. Intended to be inferred from {@code clazz}. + * @return A {@code ColumnSource} parameterized by {@code TYPE}. + */ + @FinalDefault + default ColumnSource cast(Class clazz, @Nullable Class componentType, @Nullable String colName) { Require.neqNull(clazz, "clazz"); - TypeHelper.checkCastTo("ColumnSource", getType(), getComponentType(), clazz, componentType); + final String castCheckPrefix = colName == null ? "ColumnSource" : "ColumnSource[" + colName + ']'; + TypeHelper.checkCastTo(castCheckPrefix, getType(), getComponentType(), clazz, componentType); // noinspection unchecked return (ColumnSource) this; } diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/TableDefaults.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/TableDefaults.java index 95ae43d0498..d815bc5bd22 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/TableDefaults.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/TableDefaults.java @@ -99,7 +99,7 @@ default ColumnSource getColumnSource(String sourceName, Class ColumnSource getColumnSource(String sourceName, Class componentType) { @SuppressWarnings("rawtypes") ColumnSource rawColumnSource = getColumnSource(sourceName); - try { - // noinspection unchecked - return rawColumnSource.cast(clazz, componentType); - } catch (ClassCastException ex) { - throw new RuntimeException( - "Error retrieving ColumnSource with type " + clazz.getName() + " for column " + sourceName, ex); - } + // noinspection unchecked + return rawColumnSource.cast(clazz, componentType, sourceName); } // -----------------------------------------------------------------------------------------------------------------