From d42a860695db23ff7b26b48dae3bfed005ecaace Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rados=C5=82aw=20Wa=C5=9Bko?= Date: Mon, 13 Mar 2023 14:54:12 +0100 Subject: [PATCH] WIP: adding StorageType to in-memory #1 --- .../src/Internal/SQL_Type_Mapping.enso | 4 +- .../0.0.0-dev/src/Data/Type/Storage.enso | 7 ++ .../Table/0.0.0-dev/src/Data/Type/Utils.enso | 7 -- .../0.0.0-dev/src/Data/Type/Value_Type.enso | 8 ++ .../Standard/Table/0.0.0-dev/src/Errors.enso | 14 +++ .../data/column/builder/object/Builder.java | 10 +- .../column/builder/object/TypedBuilder.java | 3 - .../data/column/storage/BoolStorage.java | 5 +- .../data/column/storage/DateStorage.java | 6 +- .../data/column/storage/DateTimeStorage.java | 6 +- .../data/column/storage/DoubleStorage.java | 9 +- .../data/column/storage/LongStorage.java | 23 +++-- .../column/storage/MixedStorageFacade.java | 92 +++++++++++++++++++ .../data/column/storage/ObjectStorage.java | 5 +- .../column/storage/SpecializedStorage.java | 3 +- .../table/data/column/storage/Storage.java | 23 +---- .../data/column/storage/StringStorage.java | 6 +- .../data/column/storage/TimeOfDayStorage.java | 6 +- .../data/column/storage/type/StorageType.java | 45 +++++++++ 19 files changed, 222 insertions(+), 60 deletions(-) delete mode 100644 distribution/lib/Standard/Table/0.0.0-dev/src/Data/Type/Utils.enso create mode 100644 std-bits/table/src/main/java/org/enso/table/data/column/storage/MixedStorageFacade.java create mode 100644 std-bits/table/src/main/java/org/enso/table/data/column/storage/type/StorageType.java diff --git a/distribution/lib/Standard/Database/0.0.0-dev/src/Internal/SQL_Type_Mapping.enso b/distribution/lib/Standard/Database/0.0.0-dev/src/Internal/SQL_Type_Mapping.enso index c8ea00e81db5f..5a43bb860d4d0 100644 --- a/distribution/lib/Standard/Database/0.0.0-dev/src/Internal/SQL_Type_Mapping.enso +++ b/distribution/lib/Standard/Database/0.0.0-dev/src/Internal/SQL_Type_Mapping.enso @@ -11,8 +11,8 @@ type SQL_Type_Mapping have at least a few exceptions, and some like SQLite may have very limited support). If an SQL_Type that matches the Value_Type cannot be found, a closest approximate match is returned instead. If an exact match - cannot be found, an `Inexact_Type_???` warning is reported according to - the `on_problems` setting. + cannot be found, an `Inexact_Type_Coercion` warning is reported according + to the `on_problems` setting. If the conversion is exact, it should be reversible, i.e. `sql_type_to_value_type (value_type_to_sql x) = x`. diff --git a/distribution/lib/Standard/Table/0.0.0-dev/src/Data/Type/Storage.enso b/distribution/lib/Standard/Table/0.0.0-dev/src/Data/Type/Storage.enso index 682430caff75f..cbf296bb594e8 100644 --- a/distribution/lib/Standard/Table/0.0.0-dev/src/Data/Type/Storage.enso +++ b/distribution/lib/Standard/Table/0.0.0-dev/src/Data/Type/Storage.enso @@ -7,6 +7,13 @@ import Standard.Table.Data.Type.Value_Type.Value_Type polyglot java import org.enso.table.data.column.builder.object.Builder polyglot java import org.enso.table.data.column.storage.Storage as Java_Storage +## PRIVATE + Gets the value type represented by this Java Storage. +value_type_of_storage : Java_Storage -> Value_Type +value_type_of_storage storage = case storage.getStoredType of + "Integer" -> + "" + ## Represents different types of underlying storage for Columns. type Storage ## A column storing text data. diff --git a/distribution/lib/Standard/Table/0.0.0-dev/src/Data/Type/Utils.enso b/distribution/lib/Standard/Table/0.0.0-dev/src/Data/Type/Utils.enso deleted file mode 100644 index 2eff38afbd57b..0000000000000 --- a/distribution/lib/Standard/Table/0.0.0-dev/src/Data/Type/Utils.enso +++ /dev/null @@ -1,7 +0,0 @@ -## PRIVATE - Checks if the given `value` fits the provided `value_type` without - conversions other than numeric widening. -fits : Value_Type -> Any -> Boolean -fits value_type value = case value_type of - ## FIXME!!! - _ -> False diff --git a/distribution/lib/Standard/Table/0.0.0-dev/src/Data/Type/Value_Type.enso b/distribution/lib/Standard/Table/0.0.0-dev/src/Data/Type/Value_Type.enso index 8bc3c4e308799..8ece62ee03443 100644 --- a/distribution/lib/Standard/Table/0.0.0-dev/src/Data/Type/Value_Type.enso +++ b/distribution/lib/Standard/Table/0.0.0-dev/src/Data/Type/Value_Type.enso @@ -23,6 +23,12 @@ type Bits Bits.Bits_32 -> 32 Bits.Bits_64 -> 64 + to_text : Text + to_text self = case self of + Bits.Bits_16 -> "16 bits" + Bits.Bits_32 -> "32 bits" + Bits.Bits_64 -> "64 bits" + type Bits_Comparator compare x y = Comparable.from x.to_bits . compare x.to_bits y.to_bits hash x = Comparable.from x.to_bits . hash x.to_bits @@ -126,6 +132,8 @@ type Value_Type Value_Type.Char _ _ -> True _ -> False + # TODO move these functions below to a separate file + ## PRIVATE Finds a type that can fit both a current type and a new type. reconcile_types current new = case current of diff --git a/distribution/lib/Standard/Table/0.0.0-dev/src/Errors.enso b/distribution/lib/Standard/Table/0.0.0-dev/src/Errors.enso index d76e8b3334881..eeaa1d21bbb0b 100644 --- a/distribution/lib/Standard/Table/0.0.0-dev/src/Errors.enso +++ b/distribution/lib/Standard/Table/0.0.0-dev/src/Errors.enso @@ -431,3 +431,17 @@ type Invalid_Aggregate_Column to_display_text : Text to_display_text self = "The name ["+self.name+"] is not a valid column name nor expression." + +type Inexact_Type_Coercion + ## Indicates that the requested `Value_Type` is not available in the given + backend, so it was replaced by its closest available type. + Warning (requested_type : Value_Type) (actual_type : Value_Type) + +type Invalid_Value_For_Type + ## Indicates that a column construction/transformation failed because the + provided value is not valid for the requested column type. + Error (value : Any) (value_type : Value_Type) + + to_display_text : Text + to_display_text self = + "The value ["+self.value.to_text+"] is not valid for the column type ["+self.value_type.to_text+"]." diff --git a/std-bits/table/src/main/java/org/enso/table/data/column/builder/object/Builder.java b/std-bits/table/src/main/java/org/enso/table/data/column/builder/object/Builder.java index e521877ddbaa5..e503fdf793355 100644 --- a/std-bits/table/src/main/java/org/enso/table/data/column/builder/object/Builder.java +++ b/std-bits/table/src/main/java/org/enso/table/data/column/builder/object/Builder.java @@ -1,11 +1,12 @@ package org.enso.table.data.column.builder.object; import org.enso.table.data.column.storage.Storage; +import org.enso.table.data.column.storage.type.StorageType; /** A builder for creating columns dynamically. */ public abstract class Builder { - public static Builder getForType(int type, int size) { - return switch (type) { + public static Builder getForType(StorageType type, int size) { + Builder builder = switch (type) { case Storage.Type.OBJECT -> new ObjectBuilder(size); case Storage.Type.LONG -> NumericBuilder.createLongBuilder(size); case Storage.Type.DOUBLE -> NumericBuilder.createDoubleBuilder(size); @@ -16,6 +17,8 @@ public static Builder getForType(int type, int size) { case Storage.Type.DATE_TIME -> new DateTimeBuilder(size); default -> new InferredBuilder(size); }; + assert builder.getType().equals(type); + return builder; } /** @@ -66,4 +69,7 @@ public static Builder getForType(int type, int size) { * @return a storage containing all the items appended so far */ public abstract Storage seal(); + + /** @return the current storage type of this builder */ + public abstract StorageType getType(); } diff --git a/std-bits/table/src/main/java/org/enso/table/data/column/builder/object/TypedBuilder.java b/std-bits/table/src/main/java/org/enso/table/data/column/builder/object/TypedBuilder.java index c7364eb029864..e796ba71ea87f 100644 --- a/std-bits/table/src/main/java/org/enso/table/data/column/builder/object/TypedBuilder.java +++ b/std-bits/table/src/main/java/org/enso/table/data/column/builder/object/TypedBuilder.java @@ -26,9 +26,6 @@ public abstract class TypedBuilder extends Builder { */ public abstract TypedBuilder retypeTo(long type); - /** @return the current storage type of this builder */ - public abstract int getType(); - /** Specifies if the following object will be accepted by this builder's append* methods. */ public abstract boolean accepts(Object o); } diff --git a/std-bits/table/src/main/java/org/enso/table/data/column/storage/BoolStorage.java b/std-bits/table/src/main/java/org/enso/table/data/column/storage/BoolStorage.java index bc2442813bca1..923ab7559bc67 100644 --- a/std-bits/table/src/main/java/org/enso/table/data/column/storage/BoolStorage.java +++ b/std-bits/table/src/main/java/org/enso/table/data/column/storage/BoolStorage.java @@ -13,6 +13,7 @@ import org.enso.table.data.column.operation.map.MapOperationProblemBuilder; import org.enso.table.data.column.operation.map.UnaryMapOperation; import org.enso.table.data.column.operation.map.bool.BooleanIsInOp; +import org.enso.table.data.column.storage.type.StorageType; import org.enso.table.data.index.Index; import org.enso.table.data.mask.OrderMask; import org.enso.table.data.mask.SliceRange; @@ -55,8 +56,8 @@ public int countMissing() { } @Override - public int getType() { - return Type.BOOL; + public StorageType getType() { + return StorageType.BOOLEAN; } @Override diff --git a/std-bits/table/src/main/java/org/enso/table/data/column/storage/DateStorage.java b/std-bits/table/src/main/java/org/enso/table/data/column/storage/DateStorage.java index 56ab384c733d0..9b05312c64a96 100644 --- a/std-bits/table/src/main/java/org/enso/table/data/column/storage/DateStorage.java +++ b/std-bits/table/src/main/java/org/enso/table/data/column/storage/DateStorage.java @@ -5,8 +5,8 @@ import org.enso.table.data.column.builder.object.Builder; import org.enso.table.data.column.builder.object.DateBuilder; import org.enso.table.data.column.operation.map.MapOpStorage; -import org.enso.table.data.column.operation.map.SpecializedIsInOp; import org.enso.table.data.column.operation.map.datetime.DateTimeIsInOp; +import org.enso.table.data.column.storage.type.StorageType; public final class DateStorage extends SpecializedStorage { /** @@ -36,8 +36,8 @@ protected LocalDate[] newUnderlyingArray(int size) { } @Override - public int getType() { - return Type.DATE; + public StorageType getType() { + return StorageType.DATE; } @Override diff --git a/std-bits/table/src/main/java/org/enso/table/data/column/storage/DateTimeStorage.java b/std-bits/table/src/main/java/org/enso/table/data/column/storage/DateTimeStorage.java index 9b35f9f539a98..649486d3190e8 100644 --- a/std-bits/table/src/main/java/org/enso/table/data/column/storage/DateTimeStorage.java +++ b/std-bits/table/src/main/java/org/enso/table/data/column/storage/DateTimeStorage.java @@ -3,8 +3,8 @@ import org.enso.table.data.column.builder.object.Builder; import org.enso.table.data.column.builder.object.DateTimeBuilder; import org.enso.table.data.column.operation.map.MapOpStorage; -import org.enso.table.data.column.operation.map.SpecializedIsInOp; import org.enso.table.data.column.operation.map.datetime.DateTimeIsInOp; +import org.enso.table.data.column.storage.type.StorageType; import java.time.ZonedDateTime; @@ -38,8 +38,8 @@ protected ZonedDateTime[] newUnderlyingArray(int size) { } @Override - public int getType() { - return Type.DATE_TIME; + public StorageType getType() { + return StorageType.DATE_TIME; } @Override diff --git a/std-bits/table/src/main/java/org/enso/table/data/column/storage/DoubleStorage.java b/std-bits/table/src/main/java/org/enso/table/data/column/storage/DoubleStorage.java index eb81998e5ecc1..793b83cf78bbd 100644 --- a/std-bits/table/src/main/java/org/enso/table/data/column/storage/DoubleStorage.java +++ b/std-bits/table/src/main/java/org/enso/table/data/column/storage/DoubleStorage.java @@ -11,6 +11,7 @@ import org.enso.table.data.column.operation.map.numeric.DoubleBooleanOp; import org.enso.table.data.column.operation.map.numeric.DoubleIsInOp; import org.enso.table.data.column.operation.map.numeric.DoubleNumericOp; +import org.enso.table.data.column.storage.type.StorageType; import org.enso.table.data.index.Index; import org.enso.table.data.mask.OrderMask; import org.enso.table.data.mask.SliceRange; @@ -71,10 +72,12 @@ public Double getItemBoxed(int idx) { return isMissing.get(idx) ? null : Double.longBitsToDouble(data[idx]); } - /** @inheritDoc */ + /** + * @inheritDoc + */ @Override - public int getType() { - return Type.DOUBLE; + public StorageType getType() { + return StorageType.FLOAT_64; } /** @inheritDoc */ diff --git a/std-bits/table/src/main/java/org/enso/table/data/column/storage/LongStorage.java b/std-bits/table/src/main/java/org/enso/table/data/column/storage/LongStorage.java index 817f8c424aac4..85c07ef0e902c 100644 --- a/std-bits/table/src/main/java/org/enso/table/data/column/storage/LongStorage.java +++ b/std-bits/table/src/main/java/org/enso/table/data/column/storage/LongStorage.java @@ -1,8 +1,5 @@ package org.enso.table.data.column.storage; -import java.util.BitSet; -import java.util.List; - import org.enso.table.data.column.builder.object.Builder; import org.enso.table.data.column.builder.object.NumericBuilder; import org.enso.table.data.column.operation.map.MapOpStorage; @@ -11,13 +8,20 @@ import org.enso.table.data.column.operation.map.numeric.LongBooleanOp; import org.enso.table.data.column.operation.map.numeric.LongIsInOp; import org.enso.table.data.column.operation.map.numeric.LongNumericOp; +import org.enso.table.data.column.storage.type.StorageType; import org.enso.table.data.index.Index; import org.enso.table.data.mask.OrderMask; import org.enso.table.data.mask.SliceRange; import org.graalvm.polyglot.Value; +import java.util.BitSet; +import java.util.List; + /** A column storing 64-bit integers. */ public final class LongStorage extends NumericStorage { + // TODO at some point we will want to add separate storage classes for byte, short and int, for more compact + // storage and more efficient handling of smaller integers; for now we will be handling this just by checking the + // bounds private final long[] data; private final BitSet isMissing; private final int size; @@ -75,13 +79,18 @@ public Long getItemBoxed(int idx) { return isMissing.get(idx) ? null : data[idx]; } - /** @inheritDoc */ + /** + * @inheritDoc + */ @Override - public int getType() { - return Type.LONG; + public StorageType getType() { + // TODO add possibility to set integer bit limit + return StorageType.INTEGER_64; } - /** @inheritDoc */ + /** + * @inheritDoc + */ @Override public boolean isNa(long idx) { return isMissing.get((int) idx); diff --git a/std-bits/table/src/main/java/org/enso/table/data/column/storage/MixedStorageFacade.java b/std-bits/table/src/main/java/org/enso/table/data/column/storage/MixedStorageFacade.java new file mode 100644 index 0000000000000..87aa97962f28c --- /dev/null +++ b/std-bits/table/src/main/java/org/enso/table/data/column/storage/MixedStorageFacade.java @@ -0,0 +1,92 @@ +package org.enso.table.data.column.storage; + +import org.enso.table.data.column.builder.object.Builder; +import org.enso.table.data.column.operation.map.MapOperationProblemBuilder; +import org.enso.table.data.column.storage.type.StorageType; +import org.enso.table.data.mask.OrderMask; +import org.enso.table.data.mask.SliceRange; + +import java.util.BitSet; +import java.util.List; + +public class MixedStorageFacade extends Storage { + private final Storage underlyingStorage; + public MixedStorageFacade(Storage storage) { + underlyingStorage = storage; + } + + @Override + public int size() { + return underlyingStorage.size(); + } + + @Override + public int countMissing() { + return underlyingStorage.countMissing(); + } + + @Override + public StorageType getType() { + return StorageType.ANY_OBJECT; + } + + @Override + public boolean isNa(long idx) { + return underlyingStorage.isNa(idx); + } + + @Override + public Object getItemBoxed(int idx) { + return underlyingStorage.getItemBoxed(idx); + } + + @Override + public boolean isOpVectorized(String name) { + return underlyingStorage.isOpVectorized(name); + } + + @Override + protected Storage runVectorizedMap(String name, Object argument, MapOperationProblemBuilder problemBuilder) { + return underlyingStorage.runVectorizedMap(name, argument, problemBuilder); + } + + @Override + protected Storage runVectorizedZip(String name, Storage argument, MapOperationProblemBuilder problemBuilder) { + return underlyingStorage.runVectorizedZip(name, argument, problemBuilder); + } + + @Override + public Storage mask(BitSet mask, int cardinality) { + Storage newStorage = underlyingStorage.mask(mask, cardinality); + return new MixedStorageFacade(newStorage); + } + + @Override + public Storage applyMask(OrderMask mask) { + Storage newStorage = underlyingStorage.applyMask(mask); + return new MixedStorageFacade(newStorage); + } + + @Override + public Storage countMask(int[] counts, int total) { + Storage newStorage = underlyingStorage.countMask(counts, total); + return new MixedStorageFacade(newStorage); + } + + @Override + public Storage slice(int offset, int limit) { + Storage newStorage = underlyingStorage.slice(offset, limit); + return new MixedStorageFacade(newStorage); + } + + @Override + public Builder createDefaultBuilderOfSameType(int capacity) { + throw new UnsupportedOperationException("TODO"); + } + + @Override + public Storage slice(List ranges) { + Storage newStorage = underlyingStorage.slice(ranges); + return new MixedStorageFacade(newStorage); + } +} diff --git a/std-bits/table/src/main/java/org/enso/table/data/column/storage/ObjectStorage.java b/std-bits/table/src/main/java/org/enso/table/data/column/storage/ObjectStorage.java index 9996e711742cc..b541e0edd2d11 100644 --- a/std-bits/table/src/main/java/org/enso/table/data/column/storage/ObjectStorage.java +++ b/std-bits/table/src/main/java/org/enso/table/data/column/storage/ObjectStorage.java @@ -6,6 +6,7 @@ import org.enso.table.data.column.builder.object.ObjectBuilder; import org.enso.table.data.column.operation.map.MapOpStorage; import org.enso.table.data.column.operation.map.UnaryMapOperation; +import org.enso.table.data.column.storage.type.StorageType; /** A column storing arbitrary objects. */ public final class ObjectStorage extends SpecializedStorage { @@ -28,8 +29,8 @@ protected Object[] newUnderlyingArray(int size) { } @Override - public int getType() { - return Type.OBJECT; + public StorageType getType() { + return StorageType.ANY_OBJECT; } @Override diff --git a/std-bits/table/src/main/java/org/enso/table/data/column/storage/SpecializedStorage.java b/std-bits/table/src/main/java/org/enso/table/data/column/storage/SpecializedStorage.java index 77a0e99dd3059..5a30c4e4750cf 100644 --- a/std-bits/table/src/main/java/org/enso/table/data/column/storage/SpecializedStorage.java +++ b/std-bits/table/src/main/java/org/enso/table/data/column/storage/SpecializedStorage.java @@ -4,6 +4,7 @@ import java.util.List; import org.enso.table.data.column.operation.map.MapOpStorage; import org.enso.table.data.column.operation.map.MapOperationProblemBuilder; +import org.enso.table.data.column.storage.type.StorageType; import org.enso.table.data.index.Index; import org.enso.table.data.mask.OrderMask; import org.enso.table.data.mask.SliceRange; @@ -15,7 +16,7 @@ public abstract class SpecializedStorage extends Storage { protected abstract T[] newUnderlyingArray(int size); @Override - public abstract int getType(); + public abstract StorageType getType(); /** * @param data the underlying data diff --git a/std-bits/table/src/main/java/org/enso/table/data/column/storage/Storage.java b/std-bits/table/src/main/java/org/enso/table/data/column/storage/Storage.java index febb1b97cda33..eec21045b1797 100644 --- a/std-bits/table/src/main/java/org/enso/table/data/column/storage/Storage.java +++ b/std-bits/table/src/main/java/org/enso/table/data/column/storage/Storage.java @@ -10,6 +10,7 @@ import org.enso.table.data.column.builder.object.InferredBuilder; import org.enso.table.data.column.builder.object.ObjectBuilder; import org.enso.table.data.column.operation.map.MapOperationProblemBuilder; +import org.enso.table.data.column.storage.type.StorageType; import org.enso.table.data.mask.OrderMask; import org.enso.table.data.mask.SliceRange; import org.graalvm.polyglot.Value; @@ -22,8 +23,8 @@ public abstract class Storage { /** @return the number of NA elements in this column */ public abstract int countMissing(); - /** @return the type tag of this column's storage. Must be one of {@link Type} */ - public abstract int getType(); + /** @return the type tag of this column's storage.*/ + public abstract StorageType getType(); /** * Checks whether the value at {@code idx} is missing. @@ -41,24 +42,6 @@ public abstract class Storage { */ public abstract T getItemBoxed(int idx); - /** - * Enumerating possible storage types. - * - *

Keep in sync with variables in {@code Standard.Table.Data.Column}. These variables are - * copied between Enso and Java code, in order to make them trivially constant on the Enso side, - * without invoking the polyglot machinery to access them. - */ - public static final class Type { - public static final int OBJECT = 0; - public static final int LONG = 1; - public static final int DOUBLE = 2; - public static final int STRING = 3; - public static final int BOOL = 4; - public static final int DATE = 5; - public static final int TIME_OF_DAY = 6; - public static final int DATE_TIME = 7; - } - /** A container for names of vectorizable operation. */ public static final class Maps { public static final String EQ = "=="; diff --git a/std-bits/table/src/main/java/org/enso/table/data/column/storage/StringStorage.java b/std-bits/table/src/main/java/org/enso/table/data/column/storage/StringStorage.java index 555ac2b0ef029..659b2aa00e58e 100644 --- a/std-bits/table/src/main/java/org/enso/table/data/column/storage/StringStorage.java +++ b/std-bits/table/src/main/java/org/enso/table/data/column/storage/StringStorage.java @@ -12,6 +12,7 @@ import org.enso.table.data.column.operation.map.text.LikeOp; import org.enso.table.data.column.operation.map.text.StringBooleanOp; import org.enso.table.data.column.operation.map.text.StringIsInOp; +import org.enso.table.data.column.storage.type.StorageType; import org.graalvm.polyglot.Value; /** A column storing strings. */ @@ -36,8 +37,9 @@ protected String[] newUnderlyingArray(int size) { } @Override - public int getType() { - return Type.STRING; + public StorageType getType() { + // TODO constant length strings support + return StorageType.VARIABLE_LENGTH_CHAR; } private static final MapOpStorage> ops = buildOps(); diff --git a/std-bits/table/src/main/java/org/enso/table/data/column/storage/TimeOfDayStorage.java b/std-bits/table/src/main/java/org/enso/table/data/column/storage/TimeOfDayStorage.java index 3466630374afa..5649d5bb2db94 100644 --- a/std-bits/table/src/main/java/org/enso/table/data/column/storage/TimeOfDayStorage.java +++ b/std-bits/table/src/main/java/org/enso/table/data/column/storage/TimeOfDayStorage.java @@ -5,8 +5,8 @@ import org.enso.table.data.column.builder.object.Builder; import org.enso.table.data.column.builder.object.TimeOfDayBuilder; import org.enso.table.data.column.operation.map.MapOpStorage; -import org.enso.table.data.column.operation.map.SpecializedIsInOp; import org.enso.table.data.column.operation.map.datetime.DateTimeIsInOp; +import org.enso.table.data.column.storage.type.StorageType; public final class TimeOfDayStorage extends SpecializedStorage { /** @@ -36,8 +36,8 @@ protected LocalTime[] newUnderlyingArray(int size) { } @Override - public int getType() { - return Type.TIME_OF_DAY; + public StorageType getType() { + return StorageType.TIME_OF_DAY; } @Override diff --git a/std-bits/table/src/main/java/org/enso/table/data/column/storage/type/StorageType.java b/std-bits/table/src/main/java/org/enso/table/data/column/storage/type/StorageType.java new file mode 100644 index 0000000000000..495b32ebba560 --- /dev/null +++ b/std-bits/table/src/main/java/org/enso/table/data/column/storage/type/StorageType.java @@ -0,0 +1,45 @@ +package org.enso.table.data.column.storage.type; + +public sealed interface StorageType { + record Boolean() implements StorageType {} + record Integer(Bits bits) implements StorageType {} + record Float(Bits bits) implements StorageType { + public Float { + if (bits != Bits.BITS_64) { + throw new IllegalArgumentException("Only 64-bit floats are currently supported."); + } + } + } + + record FixedLengthChar(int size) implements StorageType {} + record VariableLengthChar() implements StorageType {} + record Date() implements StorageType {} + record TimeOfDay() implements StorageType {} + record DateTime() implements StorageType {} + record AnyObject() implements StorageType {} + + Boolean BOOLEAN = new Boolean(); + Integer INTEGER_64 = new Integer(Bits.BITS_8); + Float FLOAT_64 = new Float(Bits.BITS_64); + VariableLengthChar VARIABLE_LENGTH_CHAR = new VariableLengthChar(); + Date DATE = new Date(); + TimeOfDay TIME_OF_DAY = new TimeOfDay(); + DateTime DATE_TIME = new DateTime(); + AnyObject ANY_OBJECT = new AnyObject(); + + enum Bits { + BITS_8, + BITS_16, + BITS_32, + BITS_64 + + public int toBits() { + return switch (this) { + case BITS_8 -> 8; + case BITS_16 -> 16; + case BITS_32 -> 32; + case BITS_64 -> 64; + }; + } + } +}