gravita

package module
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 15, 2022 License: MIT Imports: 6 Imported by: 2

README

gravita

A go package for Redshift Lambda UDF Multiplexer

GoDoc Github Actions test Go Report Card License

Install

go get -u github.com/mashiike/gravita

Examples

most simple case:

func main() {
    mux := gravita.NewMux()
    mux.HandleFunc("*", func(ctx context.Context, args [][]interface{}) ([]interface{}, error) {
        ret := make([]interface{}, 0, len(args))
        // anything do
        return ret, nil
    })
    lambda.Start(mux.HandleLambdaEvent)
}

If each row is independent, can also do the following:

func main() {
    mux := gravita.NewMux()
    mux.HandleRowFunc("*", func(_ context.Context, args []interface{}) (interface{}, error) {
        return fmt.Sprint(args...), nil
    })
    lambda.Start(mux.HandleLambdaEvent)
}

If you want to do batch processing, you can do the following:

func main() {
    mux := gravita.NewMux()
    handler := gravita.NewBatchProcessHandler(
        100, //batchSize 
        gravita.LambdaUDFHandlerFunc(func(ctx context.Context, args [][]interface{}) ([]interface{}, error) {
            //Called in small batches, len(args) == batchSize
            ret := make([]interface{}, 0, len(args))
            // anything do
            return ret, nil
        }),
    )
    mux.Handle("*", handler)
    lambda.Start(mux.HandleLambdaEvent)
}

LICENSE

MIT License

Copyright (c) 2022 IKEDA Masashi

Documentation

Overview

Package gravita implements the LambdaUDF dispatcher.

a simple usecase:

```

mux := gravita.NewMux()
mux.HandleFunc("*", func(ctx context.Context, args [][]interface{}) ([]interface{}, error) {
	ret := make([]interface{}, 0, len(args))
	// anything do
	return ret, nil
})
lambda.Start(mux.HandleLambdaEvent)

````

more complex usecase ```

mux := gravita.NewMux()
mux.HandleFunc("*func1*", func(ctx context.Context, args [][]interface{}) ([]interface{}, error) {
	ret := make([]interface{}, 0, len(args))
	// anything do
	return ret, nil
})
mux.HandleFunc("*func2*", func(ctx context.Context, args [][]interface{}) ([]interface{}, error) {
	ret := make([]interface{}, 0, len(args))
	// anything do
	return ret, nil
})
lambda.Start(mux.HandleLambdaEvent)

````

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type BatchProcessHandler

type BatchProcessHandler struct {
	// contains filtered or unexported fields
}

func NewBatchProcessHandler

func NewBatchProcessHandler(batchSize int, handler LambdaUDFHandler) *BatchProcessHandler

func (*BatchProcessHandler) BatchSize

func (h *BatchProcessHandler) BatchSize(s int)

func (*BatchProcessHandler) Distinct

func (h *BatchProcessHandler) Distinct(enable bool)

func (*BatchProcessHandler) ExecuteUDF

func (h *BatchProcessHandler) ExecuteUDF(ctx context.Context, args [][]interface{}) ([]interface{}, error)

func (*BatchProcessHandler) MaxBatchCount

func (h *BatchProcessHandler) MaxBatchCount(m int)

type Entry

type Entry struct {
	// contains filtered or unexported fields
}

Entry represents a single LambdaUDFHandler matching rule in Mux

func (*Entry) Cluster

func (e *Entry) Cluster(cluster string) *Entry

Cluster matches by LambdaUDF cluster name. You can use * as a wildcard

func (*Entry) ClusterRegexp

func (e *Entry) ClusterRegexp(expr string) *Entry

ClusterRegexp matches a LambdaUDF cluster name with a regular expression

func (*Entry) Database

func (e *Entry) Database(database string) *Entry

Database matches by LambdaUDF database name. You can use * as a wildcard

func (*Entry) DatabaseRegexp

func (e *Entry) DatabaseRegexp(expr string) *Entry

DatabaseRegexp matches a LambdaUDF database name with a regular expression

func (*Entry) ExternalFunction

func (e *Entry) ExternalFunction(exFunc string) *Entry

ExternalFunction matches by LambdaUDF function name. You can use * as a wildcard

func (*Entry) ExternalFunctionRegexp

func (e *Entry) ExternalFunctionRegexp(expr string) *Entry

ExternalFunctionRegexp matches a LambdaUDF function name with a regular expression

func (*Entry) GetHandler

func (e *Entry) GetHandler() LambdaUDFHandler

GetHandler returns the Handler registered in the Entry

func (*Entry) Handler

func (e *Entry) Handler(handler LambdaUDFHandler) *Entry

Handler registers a LambdaUDFHandler with Entry

func (*Entry) HandlerFunc

func (e *Entry) HandlerFunc(f func(context.Context, [][]interface{}) ([]interface{}, error)) *Entry

HandlerFunc registers a function that is the entity of LambdaUDF in Entry

func (*Entry) Match

func (e *Entry) Match(event *LambdaUDFEvent) bool

Match determines if the given event matches this Entry

func (*Entry) User

func (e *Entry) User(user string) *Entry

User matches by LambdaUDF user name. You can use * as a wildcard

func (*Entry) UserRegexp

func (e *Entry) UserRegexp(expr string) *Entry

UserRegexp matches a LambdaUDF user name with a regular expression

type LambdaUDFEvent

type LambdaUDFEvent struct {
	LambdaUDFEventMetadata `json:",inline"`

	Arguments [][]interface{} `json:"arguments,omitempty"`
}

LambdaUDFEvent represents the Event parameter when Redshift invokes as LambdaUDF see also: https://docs.aws.amazon.com/redshift/latest/dg/udf-creating-a-lambda-sql-udf.html

type LambdaUDFEventMetadata

type LambdaUDFEventMetadata struct {
	RequestID        string `json:"request_id,omitempty"`
	Cluster          string `json:"cluster,omitempty"`
	User             string `json:"user,omitempty"`
	Database         string `json:"database,omitempty"`
	ExternalFunction string `json:"external_function,omitempty"`
	QueryID          int    `json:"query_id,omitempty"`
	NumRecords       int    `json:"num_records,omitempty"`
}

LambdaUDFEventMetadata represents the metadata of an Invoke in a LambdaUDFEvent

func Metadata

func Metadata(ctx context.Context) *LambdaUDFEventMetadata

Metadata retrieves LambdaUDFEvent metadata from Context

type LambdaUDFHandler

type LambdaUDFHandler interface {
	ExecuteUDF(context.Context, [][]interface{}) ([]interface{}, error)
}

LambdaUDFHandler is an interface for handling the actual state of LambdaUDF

type LambdaUDFHandlerFunc

type LambdaUDFHandlerFunc func(context.Context, [][]interface{}) ([]interface{}, error)

LambdaUDFHandlerFunc is a type of function that satisfies LambdaUDFHandler

func (LambdaUDFHandlerFunc) ExecuteUDF

func (f LambdaUDFHandlerFunc) ExecuteUDF(ctx context.Context, args [][]interface{}) ([]interface{}, error)

type LambdaUDFRowHandler

type LambdaUDFRowHandler interface {
	ExecuteUDFRow(context.Context, []interface{}) (interface{}, error)
}

LambdaUDFRowHandler is an interface for handling the actual state of LambdaUDF Row

type LambdaUDFRowHandlerFunc

type LambdaUDFRowHandlerFunc func(context.Context, []interface{}) (interface{}, error)

LambdaUDFRowHandlerFunc is a type of function that satisfies LambdaUDFRowHandler

func (LambdaUDFRowHandlerFunc) ExecuteUDFRow

func (f LambdaUDFRowHandlerFunc) ExecuteUDFRow(ctx context.Context, args []interface{}) (interface{}, error)

type Mux

type Mux struct {
	NotMatchHandler LambdaUDFHandler
	// contains filtered or unexported fields
}

func NewMux

func NewMux() *Mux

func (*Mux) Handle

func (mux *Mux) Handle(exFunc string, handler LambdaUDFHandler) *Entry

func (*Mux) HandleFunc

func (mux *Mux) HandleFunc(exFunc string, f func(context.Context, [][]interface{}) ([]interface{}, error)) *Entry

func (*Mux) HandleLambdaEvent

func (mux *Mux) HandleLambdaEvent(ctx context.Context, event *LambdaUDFEvent) (jsonStr string, funcErr error)

func (*Mux) HandleRow

func (mux *Mux) HandleRow(exFunc string, handler LambdaUDFRowHandler) *Entry

func (*Mux) HandleRowFunc

func (mux *Mux) HandleRowFunc(exFunc string, f func(context.Context, []interface{}) (interface{}, error)) *Entry

func (*Mux) NewEntry

func (mux *Mux) NewEntry() *Entry

type ParallelRowProcessHandler

type ParallelRowProcessHandler struct {
	RowHandler LambdaUDFRowHandler
}

ParallelRowProcessHandler is a LambdaUDFHandler that can be used when each row is independent and processes rows in parallel

func (ParallelRowProcessHandler) ExecuteUDF

func (h ParallelRowProcessHandler) ExecuteUDF(ctx context.Context, args [][]interface{}) ([]interface{}, error)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL