Skip to content

Commit

Permalink
the general framework, simple case passing
Browse files Browse the repository at this point in the history
  • Loading branch information
radeusgd committed May 31, 2023
1 parent 208bda8 commit 3021538
Show file tree
Hide file tree
Showing 7 changed files with 69 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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 =
Expand Down
8 changes: 5 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 @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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.
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
3 changes: 2 additions & 1 deletion test/Table_Tests/src/In_Memory/Builders_Spec.enso
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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

0 comments on commit 3021538

Please sign in to comment.