diff --git a/distribution/lib/Standard/Database/0.0.0-dev/src/Internal/Column_Fetcher.enso b/distribution/lib/Standard/Database/0.0.0-dev/src/Internal/Column_Fetcher.enso index a61eaee704215..5cf1bf2384520 100644 --- a/distribution/lib/Standard/Database/0.0.0-dev/src/Internal/Column_Fetcher.enso +++ b/distribution/lib/Standard/Database/0.0.0-dev/src/Internal/Column_Fetcher.enso @@ -151,7 +151,7 @@ default_fetcher_for_value_type value_type = ## PRIVATE seal_java_builder java_builder column_name = storage = java_builder.seal - Java_Exports.make_column column_name storage + Materialized_Column.from_storage column_name storage ## PRIVATE make_builder_from_java_object_builder java_builder = diff --git a/distribution/lib/Standard/Table/0.0.0-dev/src/Data/Table.enso b/distribution/lib/Standard/Table/0.0.0-dev/src/Data/Table.enso index 8449694c77c47..89cf52af963db 100644 --- a/distribution/lib/Standard/Table/0.0.0-dev/src/Data/Table.enso +++ b/distribution/lib/Standard/Table/0.0.0-dev/src/Data/Table.enso @@ -28,6 +28,7 @@ import project.Data.Set_Mode.Set_Mode import project.Data.Sort_Column.Sort_Column import project.Data.Table_Conversions import project.Delimited.Delimited_Format.Delimited_Format +import project.Internal.Add_Row_Number import project.Internal.Aggregate_Column_Helper import project.Internal.Java_Problems import project.Internal.Join_Helpers @@ -1218,7 +1219,7 @@ type Table existing column is renamed to avoid the clash. add_row_number : Text -> Integer -> Integer -> (Column_Selector | Vector Text) -> Vector (Text | Sort_Column) | Text | Sort_Column -> Problem_Behavior -> Table add_row_number self name="Row" from=1 step=1 group_by=[] order_by=[] on_problems=Problem_Behavior.Report_Warning = - Error.throw "TODO" + Add_Row_Number.add_row_number self name from step group_by order_by on_problems ## UNSTABLE ALIAS Add Column, Update Column @@ -1279,14 +1280,15 @@ type Table renamed = case new_name of Nothing -> resolved _ : Text -> resolved.rename new_name - to_add = case set_mode of + check_add_mode = case set_mode of Set_Mode.Add_Or_Update -> True Set_Mode.Add -> if self.java_table.getColumnByName renamed.name . is_nothing then True else Error.throw (Existing_Column.Error renamed.name) Set_Mode.Update -> if self.java_table.getColumnByName renamed.name . is_nothing . not then True else Error.throw (Missing_Column.Error renamed.name) - if to_add then Table.Value (self.java_table.addOrReplaceColumn renamed.java_column) else to_add + check_add_mode.if_not_error <| + Table.Value (self.java_table.addOrReplaceColumn renamed.java_column) ## Given an expression, create a derived column where each value is the result of evaluating the expression for the row. diff --git a/distribution/lib/Standard/Table/0.0.0-dev/src/Internal/Add_Row_Number.enso b/distribution/lib/Standard/Table/0.0.0-dev/src/Internal/Add_Row_Number.enso new file mode 100644 index 0000000000000..8b4679ba252f9 --- /dev/null +++ b/distribution/lib/Standard/Table/0.0.0-dev/src/Internal/Add_Row_Number.enso @@ -0,0 +1,47 @@ +from Standard.Base import all + +import project.Data.Column.Column +import project.Data.Column_Selector.Column_Selector +import project.Data.Sort_Column.Sort_Column +import project.Data.Set_Mode.Set_Mode +import project.Data.Table.Table +import project.Internal.Problem_Builder.Problem_Builder +import project.Internal.Table_Helpers +import project.Internal.Unique_Name_Strategy.Unique_Name_Strategy + +from project.Errors import Duplicate_Output_Column_Names +from project.Internal.Java_Exports import make_long_builder + +## PRIVATE +add_row_number : Table -> Text -> Integer -> Integer -> (Column_Selector | Vector Text) -> Vector (Text | Sort_Column) | Text | Sort_Column -> Problem_Behavior -> Table +add_row_number table name="Row" from=1 step=1 group_by=[] order_by=[] on_problems=Problem_Behavior.Report_Warning = + problem_builder = Problem_Builder.new error_on_missing_columns=True + grouping_columns = table.columns_helper.select_columns_helper group_by True problem_builder + ordering_columns = Table_Helpers.resolve_order_by table.columns order_by problem_builder + problem_builder.attach_problems_before on_problems <| + new_column = case ordering_columns.is_empty of + True -> + case grouping_columns.is_empty of + True -> make_range_column name from step table.row_count + False -> Error.throw "TODO: not implemented yet" + False -> Error.throw "TODO: not implemented yet" + + column_names = table.column_names + renamed_table = if column_names.contains name . not then table else + problems = [Duplicate_Output_Column_Names.Error [name]] + on_problems.attach_problems_before problems <| + unique_name_strategy = Unique_Name_Strategy.new + unique_name_strategy.mark_used column_names + new_name = unique_name_strategy.make_unique name + new_columns = table.columns.map column-> + if column.name == name then column.rename new_name else column + Table.new new_columns + renamed_table.set new_column name set_mode=Set_Mode.Add + +## PRIVATE +make_range_column name start step length = + builder = make_long_builder length + 0.up_to length . each ix-> + builder.appendLong (start + ix*step) + storage = builder.seal + Column.from_storage name storage diff --git a/distribution/lib/Standard/Table/0.0.0-dev/src/Internal/Java_Exports.enso b/distribution/lib/Standard/Table/0.0.0-dev/src/Internal/Java_Exports.enso index 76808aeb9b6f6..b93b349c71cee 100644 --- a/distribution/lib/Standard/Table/0.0.0-dev/src/Internal/Java_Exports.enso +++ b/distribution/lib/Standard/Table/0.0.0-dev/src/Internal/Java_Exports.enso @@ -42,7 +42,3 @@ make_date_time_builder initial_size = DateTimeBuilder.new initial_size ## PRIVATE make_inferred_builder : Integer -> InferredBuilder make_inferred_builder initial_size = InferredBuilder.new initial_size - -## PRIVATE -make_column : Text -> Storage -> Column -make_column name storage = Column.Value (Java_Column.new name storage) diff --git a/distribution/lib/Standard/Table/0.0.0-dev/src/Internal/Table_Helpers.enso b/distribution/lib/Standard/Table/0.0.0-dev/src/Internal/Table_Helpers.enso index 59be059e8b200..9c648a2f5dde9 100644 --- a/distribution/lib/Standard/Table/0.0.0-dev/src/Internal/Table_Helpers.enso +++ b/distribution/lib/Standard/Table/0.0.0-dev/src/Internal/Table_Helpers.enso @@ -355,8 +355,20 @@ type Column_Transform_Element Value column associated_selector ## PRIVATE + Resolves the `Sort_Column` selectors and ensures that at least one column was + selected. prepare_order_by : Vector -> Text | Sort_Column | Vector (Text | Sort_Column) -> Problem_Builder -> Vector Column_Transform_Element prepare_order_by internal_columns column_selectors problem_builder = + selected_elements = resolve_order_by internal_columns column_selectors problem_builder + if selected_elements.is_empty then + problem_builder.report_other_warning No_Input_Columns_Selected + selected_elements + +## PRIVATE + Resolves the `Sort_Column` selectors and returns a list of elements + containing the original selector and the selected column. +resolve_order_by : Vector -> Text | Sort_Column | Vector (Text | Sort_Column) -> Problem_Builder -> Vector Column_Transform_Element +resolve_order_by internal_columns column_selectors problem_builder = resolve_selector selector = case selector of name : Text -> resolve_selector (Sort_Column.Name name) ix : Integer -> resolve_selector (Sort_Column.Index ix) @@ -373,10 +385,7 @@ prepare_order_by internal_columns column_selectors problem_builder = selectors_vec = case column_selectors of _ : Vector -> column_selectors _ -> [column_selectors] - selected_elements = selectors_vec.flat_map resolve_selector - if selected_elements.is_empty then - problem_builder.report_other_warning No_Input_Columns_Selected - selected_elements + selectors_vec.flat_map resolve_selector ## PRIVATE A helper method gathering the common logic for constructing expressions that diff --git a/test/Table_Tests/src/Common_Table_Operations/Add_Row_Number_Spec.enso b/test/Table_Tests/src/Common_Table_Operations/Add_Row_Number_Spec.enso index b7135e716abf7..132fb3614aa6d 100644 --- a/test/Table_Tests/src/Common_Table_Operations/Add_Row_Number_Spec.enso +++ b/test/Table_Tests/src/Common_Table_Operations/Add_Row_Number_Spec.enso @@ -66,7 +66,7 @@ spec setup = Test.specify "should allow to assign row numbers separately within scattered groups, preserving the row layout" <| v = ['a', 'b', 'a', 'b', 'b', 'b', 'c', 'a'] t = table_builder [["X", v]] - t1 = t.add_row_number + t1 = t.add_row_number group_by=["X"] # No reordering of elements: t1.at "X" . to_vector . should_equal v t1.at "Row" . to_vector . should_equal [1, 1, 2, 2, 3, 4, 1, 3] diff --git a/test/Table_Tests/src/In_Memory/Builders_Spec.enso b/test/Table_Tests/src/In_Memory/Builders_Spec.enso index 8725cf1406520..33f1aa9479f2b 100644 --- a/test/Table_Tests/src/In_Memory/Builders_Spec.enso +++ b/test/Table_Tests/src/In_Memory/Builders_Spec.enso @@ -1,5 +1,6 @@ from Standard.Base import all +from Standard.Table import Column import Standard.Table.Internal.Java_Exports from Standard.Test import Test, Test_Suite @@ -27,5 +28,5 @@ spec = Test.group "[In-Memory] Storage Builders" <| 0.up_to 5 . each _-> builder.append e storage = builder.seal - column = Java_Exports.make_column "X" storage + column = Column.from_storage "X" storage column.to_vector . should_equal vector