inital working metl

This commit is contained in:
2021-05-23 22:15:30 -06:00
commit 118ffd908f
15 changed files with 1168 additions and 0 deletions

102
action-modifycolumn.go Normal file
View File

@ -0,0 +1,102 @@
package main
import (
"errors"
"fmt"
"strings"
"github.com/google/uuid"
)
type ActionModifyColumn struct {
ActionID uuid.UUID
OutputSchema *Schema
InputSchema *Schema
Config ModifyColumnConfig
status ActionStatus
bus *Bus
}
type ModifyColumnConfig struct {
ActionConfig
}
func NewModifyColumn(config ModifyColumnConfig, b *Bus) (ActionModifyColumn, error) {
as := ActionModifyColumn{}
err := as.init(config, b)
if err != nil {
return ActionModifyColumn{}, err
}
return as, nil
}
func (s *ActionModifyColumn) init(config ModifyColumnConfig, b *Bus) error {
if len(config.Inputs) <= 0 {
return errors.New(fmt.Sprintf("error no input schema defined. ActionID: %v", config.ActionID.String()))
}
s.InputSchema = config.Inputs[0].InputSchema
s.OutputSchema = config.OutputSchema
s.ActionID = config.ActionID
s.Config = config
s.status = ActionStatus{
State: NotStarted,
HandledRows: 0,
ExpectedRows: -1,
}
s.bus = b
return nil
}
func (s *ActionModifyColumn) Run(contentRow ContentRow) error {
// convert the schema to the new one
newContentRow := ContentRow{
Schema: s.Config.OutputSchema,
Values: make(map[uuid.UUID]string),
Raw: "",
Source: &s.ActionID,
}
for _, col := range newContentRow.Schema.Columns {
value, ok := contentRow.Values[col.ID]
if !ok {
value = col.DefaultValue
}
newContentRow.Values[col.ID] = value
if strings.EqualFold(newContentRow.Raw, "") {
newContentRow.Raw = value
} else {
newContentRow.Raw = newContentRow.Raw + "," + value
}
}
return s.publishRow(newContentRow)
}
func (s *ActionModifyColumn) publishRow(row ContentRow) error {
// TODO: decide on the method of transporting data to the next action
return s.bus.Run(s.ActionID, row)
}
func (s *ActionModifyColumn) publishErrorRow(row ContentRow) error {
// TODO: decide on the method of transporting data to the next action
return nil
}
func (s *ActionModifyColumn) Validate() error {
if len(s.Config.Inputs) <= 0 {
return errors.New(fmt.Sprintf("error no input schema defined. ActionID: %v", s.ActionID.String()))
}
return nil
}
func (s *ActionModifyColumn) GetActionID() uuid.UUID {
return s.ActionID
}
func (s *ActionModifyColumn) Status() ActionStatus {
return s.status
}
func (s *ActionModifyColumn) GetActionConfig() ActionConfig {
return s.Config.ActionConfig
}