influxdb/query/functions/yield.go

82 lines
1.8 KiB
Go

package functions
import (
"fmt"
"github.com/influxdata/platform/query"
"github.com/influxdata/platform/query/plan"
"github.com/influxdata/platform/query/semantic"
)
const YieldKind = "yield"
type YieldOpSpec struct {
Name string `json:"name"`
}
var yieldSignature = semantic.FunctionSignature{
Params: map[string]semantic.Type{
query.TableParameter: query.TableObjectType,
"name": semantic.String,
},
ReturnType: query.TableObjectType,
PipeArgument: query.TableParameter,
}
func init() {
query.RegisterFunctionWithSideEffect(YieldKind, createYieldOpSpec, yieldSignature)
query.RegisterOpSpec(YieldKind, newYieldOp)
plan.RegisterProcedureSpec(YieldKind, newYieldProcedure, YieldKind)
}
func createYieldOpSpec(args query.Arguments, a *query.Administration) (query.OperationSpec, error) {
if err := a.AddParentFromArgs(args); err != nil {
return nil, err
}
spec := new(YieldOpSpec)
name, ok, err := args.GetString("name")
if err != nil {
return nil, err
} else if ok {
spec.Name = name
} else {
spec.Name = "_result"
}
return spec, nil
}
func newYieldOp() query.OperationSpec {
return new(YieldOpSpec)
}
func (s *YieldOpSpec) Kind() query.OperationKind {
return YieldKind
}
type YieldProcedureSpec struct {
Name string `json:"name"`
}
func newYieldProcedure(qs query.OperationSpec, _ plan.Administration) (plan.ProcedureSpec, error) {
if spec, ok := qs.(*YieldOpSpec); ok {
return &YieldProcedureSpec{Name: spec.Name}, nil
}
return nil, fmt.Errorf("invalid spec type %T", qs)
}
func (s *YieldProcedureSpec) Kind() plan.ProcedureKind {
return YieldKind
}
func (s *YieldProcedureSpec) Copy() plan.ProcedureSpec {
return &YieldProcedureSpec{Name: s.Name}
}
func (s *YieldProcedureSpec) YieldName() string {
return s.Name
}