Skip to content

Commit

Permalink
Rework user ops
Browse files Browse the repository at this point in the history
Rework user ops in the following ways:
- User ops take either a const or path as an argument.
- The this value of the parent is carried through when a user op is
  invoked.
  • Loading branch information
mattnibs committed Jun 21, 2023
1 parent 45f3a37 commit ad08b11
Show file tree
Hide file tree
Showing 24 changed files with 6,420 additions and 7,106 deletions.
33 changes: 4 additions & 29 deletions compiler/ast/ast.go
Expand Up @@ -28,10 +28,6 @@ type Expr interface {
ExprAST()
}

type Param interface {
ParamAST()
}

type ID struct {
Kind string `json:"kind" unpack:""`
Name string `json:"name"`
Expand Down Expand Up @@ -216,10 +212,10 @@ type FuncDecl struct {
}

type OpDecl struct {
Kind string `json:"kind" unpack:""`
Name string `json:"name"`
Params []Param `json:"params"`
Body Seq `json:"body"`
Kind string `json:"kind" unpack:""`
Name string `json:"name"`
Params []string `json:"params"`
Body Seq `json:"body"`
}

func (*ConstDecl) DeclAST() {}
Expand Down Expand Up @@ -540,24 +536,3 @@ type Agg struct {
Expr Expr `json:"expr"`
Where Expr `json:"where"`
}

// ----------------------------------------------------------------------------
// Params

type (
ConstParam struct {
Kind string `json:"kind" unpack:""`
Name string `json:"name"`
}
NamedParam struct {
Kind string `json:"kind" unpack:""`
Name string `json:"name"`
}
SpreadParam struct {
Kind string `json:"kind" unpack:""`
}
)

func (*ConstParam) ParamAST() {}
func (*NamedParam) ParamAST() {}
func (*SpreadParam) ParamAST() {}
23 changes: 0 additions & 23 deletions compiler/ast/dag/expr.go
Expand Up @@ -10,9 +10,6 @@ type (
VectorElem interface {
vectorElem()
}
Param interface {
paramDAG()
}
)

// Exprs
Expand Down Expand Up @@ -191,23 +188,3 @@ func TopLevelField(e Expr) (string, bool) {
}
return "", false
}

// Params

type (
ConstParam struct {
Kind string `json:"kind" unpack:""`
Name string `json:"name"`
}
NamedParam struct {
Kind string `json:"kind" unpack:""`
Name string `json:"name"`
}
SpreadParam struct {
Kind string `json:"kind" unpack:""`
}
)

func (*ConstParam) paramDAG() {}
func (*NamedParam) paramDAG() {}
func (*SpreadParam) paramDAG() {}
17 changes: 8 additions & 9 deletions compiler/ast/dag/op.go
Expand Up @@ -145,17 +145,16 @@ type (
Cflag bool `json:"cflag"`
}
UserOp struct {
Kind string `json:"kind" unpack:""`
Name string `json:"id"`
Params []Param `json:"params"`
Body Seq `json:"body"`
Kind string `json:"kind" unpack:""`
Name string `json:"id"`
Params []string `json:"params"`
Body Seq `json:"body"`
}
UserOpCall struct {
Kind string `json:"kind" unpack:""`
Name string `json:"name"`
Exprs []Expr `json:"exprs"`
Consts []*Literal `json:"consts"`
UserOp *UserOp `json:"user_op"`
Kind string `json:"kind" unpack:""`
Name string `json:"name"`
Exprs []Expr `json:"exprs"`
Body Seq `json:"body"`
}
Yield struct {
Kind string `json:"kind" unpack:""`
Expand Down
3 changes: 0 additions & 3 deletions compiler/ast/dag/unpack.go
Expand Up @@ -14,7 +14,6 @@ var unpacker = unpack.New(
Call{},
Combine{},
Conditional{},
ConstParam{},
Cut{},
Deleter{},
Dot{},
Expand All @@ -34,7 +33,6 @@ var unpacker = unpack.New(
Load{},
MapExpr{},
Merge{},
NamedParam{},
Over{},
OverExpr{},
Pass{},
Expand All @@ -53,7 +51,6 @@ var unpacker = unpack.New(
Slicer{},
Sort{},
Spread{},
SpreadParam{},
Summarize{},
Switch{},
Tail{},
Expand Down
3 changes: 0 additions & 3 deletions compiler/ast/unpack.go
Expand Up @@ -20,7 +20,6 @@ var unpacker = unpack.New(
astzed.CastValue{},
Conditional{},
ConstDecl{},
ConstParam{},
Cut{},
astzed.DefValue{},
Drop{},
Expand All @@ -41,7 +40,6 @@ var unpacker = unpack.New(
Join{},
Load{},
Merge{},
NamedParam{},
Over{},
Trunk{},
astzed.Map{},
Expand Down Expand Up @@ -91,7 +89,6 @@ var unpacker = unpack.New(
Where{},
Yield{},
Sample{},
SpreadParam{},
)

// UnmarshalOp transforms a JSON representation of an operator into an Op.
Expand Down
42 changes: 3 additions & 39 deletions compiler/kernel/op.go
Expand Up @@ -385,52 +385,16 @@ func (b *Builder) compileOver(parent zbuf.Puller, over *dag.Over) (zbuf.Puller,
}

func (b *Builder) compileUserOpCall(parent zbuf.Puller, u *dag.UserOpCall) (zbuf.Puller, error) {
// Construct the "this" record value.
var elems []expr.RecordElem
for i, p := range u.UserOp.Params {
if _, ok := p.(*dag.ConstParam); ok {
continue
}
val, err := compileExpr(u.Exprs[i])
if err != nil {
return nil, err
}
switch p := p.(type) {
case *dag.NamedParam:
elems = append(elems, expr.RecordElem{Name: p.Name, Field: val})
case *dag.SpreadParam:
elems = append(elems, expr.RecordElem{Spread: val})
default:
return nil, fmt.Errorf("internal error: unknown DAG param type: %#v", p)
}
}
this, err := expr.NewRecordExpr(b.octx.Zctx, elems)
if err != nil {
return nil, err
}
consts := make([]zed.Value, len(u.Consts))
for i, c := range u.Consts {
val, err := EvalAtCompileTime(b.octx.Zctx, c)
if err != nil {
return nil, err
}
consts[i] = *val
}
apply := op.NewApplier(b.octx, parent, this)
enter := op.NewEnterScope(apply, consts)
exits, err := b.compileSeq(u.UserOp.Body, []zbuf.Puller{enter})
exits, err := b.compileSeq(u.Body, []zbuf.Puller{parent})
if err != nil {
return nil, err
}
var exit zbuf.Puller
if len(exits) > 1 {
// This can happen when output of the body
// is a fork or switch.
exit = combine.New(b.octx, exits)
} else {
exit = exits[0]
return combine.New(b.octx, exits), nil
}
return op.NewExitScope(exit, len(consts)), nil
return exits[0], nil
}

func (b *Builder) compileAssignments(assignments []dag.Assignment) ([]expr.Assignment, error) {
Expand Down
2 changes: 1 addition & 1 deletion compiler/optimizer/optimizer.go
Expand Up @@ -87,7 +87,7 @@ func walk(seq dag.Seq, over bool, post func(dag.Seq) dag.Seq) dag.Seq {
case *dag.Scope:
op.Body = walk(op.Body, over, post)
case *dag.UserOpCall:
op.UserOp.Body = walk(op.UserOp.Body, over, post)
op.Body = walk(op.Body, over, post)
}
}
return post(seq)
Expand Down

0 comments on commit ad08b11

Please sign in to comment.