Skip to content

Commit

Permalink
checkpoint: laying ground work for Value Types
Browse files Browse the repository at this point in the history
  • Loading branch information
radeusgd committed Mar 27, 2023
1 parent 76409b2 commit 188dc04
Show file tree
Hide file tree
Showing 28 changed files with 100 additions and 56 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@ import Standard.Base.Errors.Illegal_Argument.Illegal_Argument
import Standard.Base.Errors.Illegal_State.Illegal_State

from Standard.Table import Sort_Column, Data_Formatter
import Standard.Table.Data.Value_Type.Value_Type
import Standard.Table.Data.Type.Value_Type.Value_Type
import Standard.Table.Data.Column.Column as Materialized_Column
import Standard.Table.Internal.Java_Problems
import Standard.Table.Internal.Problem_Builder.Problem_Builder
import Standard.Table.Internal.Widget_Helpers
from Standard.Table.Data.Value_Type import Value_Type, Auto
from Standard.Table.Data.Type.Value_Type import Value_Type, Auto
from Standard.Table.Errors import Floating_Point_Equality

import project.Data.SQL_Statement.SQL_Statement
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
from Standard.Base import all
import Standard.Base.Errors.Illegal_Argument.Illegal_Argument

from Standard.Base.Data.Ordering import all

import project.Data.Column.Column

polyglot java import java.sql.Types
Expand All @@ -15,7 +13,12 @@ type SQL_Type
Arguments:
- typeid: a numerical type id, as defined in `java.sql.Types`.
- name: a database-specific type name, used for pretty printing.
Value typeid name
- precision: For character types, specifies their length.
See `ResultSetMetaData.getPrecision`.
- nullable: Specifies if the given column is nullable. May be `Nothing`
if that is unknown / irrelevant for the type.
TODO: the precise meaning of this will be revised with #5872.
Value (typeid : Integer) (name : Text) (precision : Nothing | Integer = Nothing) (nullable : Boolean | Nothing = Nothing)

## The SQL representation of `Boolean` type.
boolean : SQL_Type
Expand Down Expand Up @@ -184,13 +187,3 @@ merge_number_type left right = if left.is_definitely_integer then merge_number_t
if right_index.is_nothing then left else
new_index = left_index.max right_index
[SQL_Type.numeric, SQL_Type.decimal, SQL_Type.real, SQL_Type.real, SQL_Type.double].at new_index

## PRIVATE
type SQL_Type_Comparator
compare x y =
if x.typeid == y.typeid then Ordering.Equal else
Nothing

hash x = x.typeid.hashCode

Comparable.from (_:SQL_Type) = SQL_Type_Comparator
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ import Standard.Table.Data.Join_Kind.Join_Kind
import Standard.Table.Data.Report_Unmatched.Report_Unmatched
import Standard.Table.Data.Row.Row
import Standard.Table.Data.Table.Table as Materialized_Table
import Standard.Table.Data.Value_Type.Auto
import Standard.Table.Data.Value_Type.Value_Type
import Standard.Table.Data.Type.Value_Type.Auto
import Standard.Table.Data.Type.Value_Type.Value_Type
import Standard.Table.Internal.Aggregate_Column_Helper
import Standard.Table.Internal.Java_Exports
import Standard.Table.Internal.Table_Helpers
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@ from Standard.Base import all
import Standard.Base.Errors.Illegal_State.Illegal_State
import Standard.Base.Runtime.Managed_Resource.Managed_Resource

import Standard.Table.Data.Storage.Storage
import Standard.Table.Data.Type.Storage.Storage
import Standard.Table.Data.Table.Table as Materialized_Table

import project.Data.SQL.Builder
import project.Data.SQL_Statement.SQL_Statement
import project.Data.SQL_Type.SQL_Type
import project.Internal.Base_Generator
import project.Internal.SQL_Type_Mapping

import project.Data.Table.Table as Database_Table

Expand Down Expand Up @@ -92,10 +93,10 @@ type JDBC_Connection
metadata = stmt.executeQuery.getMetaData

resolve_column ix =
name = metadata.getColumnName ix+1
typeid = metadata.getColumnType ix+1
typename = metadata.getColumnTypeName ix+1
[name, SQL_Type.Value typeid typename]
# Todo test edge case with AS
name = metadata.getColumnLabel ix+1
sql_type = SQL_Type_Mapping.from_metadata metadata ix+1
[name, sql_type]

Vector.new metadata.getColumnCount resolve_column

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import Standard.Table.Data.Column.Column as Materialized_Column
import Standard.Table.Internal.Java_Exports

import project.Data.SQL_Type.SQL_Type
import project.Internal.SQL_Type_Mapping

polyglot java import java.sql.ResultSet

Expand Down Expand Up @@ -32,9 +33,7 @@ result_set_to_table result_set expected_types=Nothing last_row_only=False =
column_names = Vector.new ncols ix-> metadata.getColumnName ix+1
column_types = if expected_types.is_nothing.not then expected_types else
Vector.new ncols ix->
typeid = metadata.getColumnType ix+1
name = metadata.getColumnTypeName ix+1
SQL_Type.Value typeid name
SQL_Type_Mapping.from_metadata metadata ix+1
column_builders = column_types.map create_builder
case last_row_only of
True ->
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
from Standard.Base import all

import project.Data.SQL_Type.SQL_Type

polyglot java import java.sql.ResultSetMetaData

type SQL_Type_Mapping
## Converts the given Value_Type to its corresponding SQL_Type.

Some SQL dialects may not support all Value_Types (in fact most will
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.

If the conversion is exact, it should be reversible, i.e.
`sql_type_to_value_type (value_type_to_sql x) = x`.
value_type_to_sql : Value_Type -> Problem_Behavior -> SQL_Type
value_type_to_sql =
unimplemented "This is an interface only."

## Converts the given SQL_Type to its corresponding Value_Type.
sql_type_to_value_type : SQL_Type -> Value_Type
sql_type_to_value_type =
unimplemented "This is an interface only."

# TODO not sure if this is needed, instead we could allow to construct SQL types only in context of a specific dialect, then the correct typename would be baked into the type
to_dialect_specific_name : SQL_Type -> Text
to_dialect_specific_name =
unimplemented "This is an interface only."

## PRIVATE
from_metadata metadata ix =
typeid = metadata.getColumnType ix
typename = metadata.getColumnTypeName ix
precision = case metadata.getPrecision ix of
0 -> Nothing
p : Integer -> p
nullable_id =
nullable = if nullable_id == ResultSetMetaData.columnNoNulls then False else
if nullable_id == ResultSetMetaData.columnNullable then True else
Nothing
SQL_Type.Value typeid typename precision nullable
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,16 @@ import Standard.Base.Errors.Illegal_State.Illegal_State
import Standard.Base.Data.Index_Sub_Range as Index_Sub_Range_Module

import project.Data.Data_Formatter.Data_Formatter
import project.Data.Storage.Storage
import project.Data.Type.Storage.Storage
import project.Data.Table.Table
import project.Data.Value_Type.Value_Type
import project.Data.Type.Value_Type.Value_Type
import project.Internal.Java_Problems
import project.Internal.Naming_Helpers.Naming_Helpers
import project.Internal.Parse_Values_Helper
import project.Internal.Widget_Helpers

from project.Data.Table import print_table
from project.Data.Value_Type import Auto, ensure_valid_parse_target
from project.Data.Type.Value_Type import Auto, ensure_valid_parse_target
from project.Errors import No_Index_Set_Error, Floating_Point_Equality

polyglot java import org.enso.table.data.column.operation.map.MapOperationProblemBuilder
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from Standard.Base import all
import Standard.Base.Errors.Illegal_Argument.Illegal_Argument

import project.Data.Value_Type.Auto
import project.Data.Storage.Storage
import project.Data.Type.Value_Type.Auto
import project.Data.Type.Storage.Storage
import project.Internal.Parse_Values_Helper

polyglot java import org.enso.table.parsing.IntegerParser
Expand Down
6 changes: 3 additions & 3 deletions distribution/lib/Standard/Table/0.0.0-dev/src/Data/Table.enso
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ import project.Data.Report_Unmatched.Report_Unmatched
import project.Data.Row.Row
import project.Data.Set_Mode.Set_Mode
import project.Data.Sort_Column.Sort_Column
import project.Data.Storage.Storage
import project.Data.Value_Type.Value_Type
import project.Data.Type.Storage.Storage
import project.Data.Type.Value_Type.Value_Type
import project.Internal.Aggregate_Column_Helper
import project.Internal.Java_Problems
import project.Internal.Join_Helpers
Expand All @@ -39,7 +39,7 @@ import project.Data.Expression.Expression
import project.Data.Expression.Expression_Error
import project.Delimited.Delimited_Format.Delimited_Format

from project.Data.Value_Type import Auto, ensure_valid_parse_target
from project.Data.Type.Value_Type import Auto, ensure_valid_parse_target
from project.Internal.Rows_View import Rows_View
from project.Errors import all

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ from Standard.Base import all
import Standard.Base.Errors.Common.Index_Out_Of_Bounds
import Standard.Base.Errors.Illegal_State.Illegal_State

import Standard.Table.Data.Value_Type.Value_Type
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
Expand Down Expand Up @@ -65,13 +65,13 @@ type Storage
Converts this storage type to a value type closest representing it.
to_approximate_value_type : Value_Type
to_approximate_value_type self = case self of
Storage.Text -> Value_Type.Char
Storage.Integer -> Value_Type.Integer
Storage.Decimal -> Value_Type.Float
Storage.Text -> Value_Type.Char size=Nothing variable=True
Storage.Integer -> Value_Type.Integer Bits.Bits_64
Storage.Decimal -> Value_Type.Float Bits.Bits_64
Storage.Boolean -> Value_Type.Boolean
Storage.Date -> Value_Type.Date
Storage.Time_Of_Day -> Value_Type.Time
Storage.Date_Time -> Value_Type.Date_Time
Storage.Date_Time -> Value_Type.Date_Time with_timezone=True
Storage.Any -> Value_Type.Mixed

## PRIVATE
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
## 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
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import Standard.Base.System.File.Output_Stream
import project.Data.Table.Table
import project.Data.Data_Formatter.Data_Formatter
import project.Data.Match_Columns.Match_Columns
import project.Data.Storage.Storage
import project.Data.Type.Storage.Storage
import project.Delimited.Delimited_Format.Delimited_Format
import project.Delimited.Quote_Style.Quote_Style
import project.Internal.Delimited_Reader
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ from Standard.Base import all
import Standard.Base.Errors.Common.No_Such_Method
import Standard.Base.Errors.Common.Type_Error

import project.Data.Value_Type.Value_Type
import project.Data.Type.Value_Type.Value_Type

from Standard.Base.Data.Filter_Condition.Filter_Condition import all

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import Standard.Base.Errors.Illegal_State.Illegal_State

from project.Errors import Invalid_Value_Type, No_Such_Column, Missing_Input_Columns, Column_Indexes_Out_Of_Range
import project.Data.Join_Condition.Join_Condition
import project.Data.Value_Type.Value_Type
import project.Data.Type.Value_Type.Value_Type
import project.Internal.Problem_Builder.Problem_Builder

type Join_Condition_Resolver
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import project.Data.Column_Selector.Column_Selector
import project.Data.Position.Position
import project.Data.Sort_Column.Sort_Column
import project.Data.Table.Table
import project.Data.Value_Type.Value_Type
import project.Data.Type.Value_Type.Value_Type
import project.Internal.Problem_Builder.Problem_Builder
import project.Internal.Unique_Name_Strategy.Unique_Name_Strategy

Expand Down
4 changes: 2 additions & 2 deletions distribution/lib/Standard/Table/0.0.0-dev/src/Main.enso
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ from Standard.Base import all
import project.Data.Aggregate_Column.Aggregate_Column
import project.Data.Column.Column
import project.Data.Column_Selector.Column_Selector
import project.Data.Value_Type.Auto
import project.Data.Type.Value_Type.Auto
import project.Data.Data_Formatter.Data_Formatter
import project.Data.Join_Condition.Join_Condition
import project.Data.Join_Kind.Join_Kind
Expand All @@ -24,7 +24,7 @@ import project.Excel.Excel_Workbook.Excel_Workbook
export project.Data.Aggregate_Column.Aggregate_Column
export project.Data.Column.Column
export project.Data.Column_Selector.Column_Selector
export project.Data.Value_Type.Auto
export project.Data.Type.Value_Type.Auto
export project.Data.Data_Formatter.Data_Formatter
export project.Data.Join_Condition.Join_Condition
export project.Data.Join_Kind.Join_Kind
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ from Standard.Base.Data.Json import render

from Standard.Table import Table, Column
import Standard.Table.Data.Row.Row
import Standard.Table.Data.Storage.Storage
import Standard.Table.Data.Type.Storage.Storage

import project.Id.Id
from project.Text import get_lazy_visualisation_text_window
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import Standard.Base.Errors.Common.Type_Error
import Standard.Base.Errors.Illegal_Argument.Illegal_Argument
import Standard.Base.Errors.Illegal_State.Illegal_State

import Standard.Table.Data.Value_Type.Value_Type
import Standard.Table.Data.Type.Value_Type.Value_Type
import Standard.Table.Data.Expression.Expression_Error
from Standard.Table.Errors import all

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import Standard.Base.Errors.Illegal_State.Illegal_State

from Standard.Table import all hiding Table
from Standard.Table.Errors import all
import Standard.Table.Data.Value_Type.Value_Type
import Standard.Table.Data.Type.Value_Type.Value_Type

from Standard.Database.Errors import Unsupported_Database_Operation

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ from Standard.Base import all

from Standard.Table import all
from Standard.Table.Errors import all
import Standard.Table.Data.Value_Type.Value_Type
import Standard.Table.Data.Type.Value_Type.Value_Type

from Standard.Database.Errors import Unsupported_Database_Operation

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import Standard.Base.Errors.Illegal_State.Illegal_State

from Standard.Table import all hiding Table
from Standard.Table.Errors import all
import Standard.Table.Data.Value_Type.Value_Type
import Standard.Table.Data.Type.Value_Type.Value_Type

from Standard.Database.Errors import Unsupported_Database_Operation

Expand Down
2 changes: 1 addition & 1 deletion test/Table_Tests/src/Formatting/Parse_Values_Spec.enso
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ from Standard.Base import all
import Standard.Base.Errors.Illegal_Argument.Illegal_Argument

from Standard.Table import Table, Data_Formatter, Column, Column_Selector
from Standard.Table.Data.Value_Type import Auto, Value_Type
from Standard.Table.Data.Type.Value_Type import Auto, Value_Type
from Standard.Table.Errors import all

from Standard.Test import Test, Test_Suite, Problems
Expand Down
2 changes: 1 addition & 1 deletion test/Table_Tests/src/In_Memory/Column_Spec.enso
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import Standard.Base.Errors.Common.Index_Out_Of_Bounds
import Standard.Base.Errors.Illegal_Argument.Illegal_Argument

from Standard.Table import Column
import Standard.Table.Data.Storage.Storage
import Standard.Table.Data.Type.Storage.Storage

import Standard.Examples

Expand Down
2 changes: 1 addition & 1 deletion test/Table_Tests/src/In_Memory/Table_Date_Spec.enso
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ from Standard.Base import all

from Standard.Table import Table, Column, Delimited, Data_Formatter
import Standard.Table.Data.Table_Conversions
import Standard.Table.Data.Storage.Storage
import Standard.Table.Data.Type.Storage.Storage

from Standard.Test import Test, Test_Suite
import Standard.Test.Extensions
Expand Down
2 changes: 1 addition & 1 deletion test/Table_Tests/src/In_Memory/Table_Date_Time_Spec.enso
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ from Standard.Base import all

from Standard.Table import Table, Delimited, Column, Data_Formatter
import Standard.Table.Data.Table_Conversions
import Standard.Table.Data.Storage.Storage
import Standard.Table.Data.Type.Storage.Storage

from Standard.Test import Test, Test_Suite
import Standard.Test.Extensions
Expand Down
4 changes: 2 additions & 2 deletions test/Table_Tests/src/In_Memory/Table_Spec.enso
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import Standard.Base.Errors.Illegal_Argument.Illegal_Argument
from Standard.Table import Table, Column, Sort_Column, Column_Selector, Aggregate_Column
import Standard.Table.Main as Table_Module
from Standard.Table.Data.Aggregate_Column.Aggregate_Column import all hiding First, Last
from Standard.Table.Data.Storage import Storage
import Standard.Table.Data.Value_Type.Value_Type
from Standard.Table.Data.Type.Storage import Storage
import Standard.Table.Data.Type.Value_Type.Value_Type
from Standard.Table.Errors import Invalid_Output_Column_Names, Duplicate_Output_Column_Names, No_Input_Columns_Selected, Missing_Input_Columns, No_Such_Column, Floating_Point_Equality, Invalid_Value_Type

import Standard.Visualization
Expand Down
2 changes: 1 addition & 1 deletion test/Table_Tests/src/In_Memory/Table_Time_Of_Day_Spec.enso
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ from Standard.Base import all

from Standard.Table import Table, Delimited, Column, Data_Formatter
import Standard.Table.Data.Table_Conversions
import Standard.Table.Data.Storage.Storage
import Standard.Table.Data.Type.Storage.Storage

from Standard.Test import Test, Test_Suite
import Standard.Test.Extensions
Expand Down

0 comments on commit 188dc04

Please sign in to comment.