Files
chaisql/internal/stream/rows/emit.go
2024-02-17 17:56:41 +04:00

64 lines
1.1 KiB
Go

package rows
import (
"strings"
"github.com/chaisql/chai/internal/environment"
"github.com/chaisql/chai/internal/expr"
"github.com/chaisql/chai/internal/stream"
)
type EmitOperator struct {
stream.BaseOperator
Rows []expr.Row
}
// Emit creates an operator that iterates over the given expressions.
// Each expression must evaluate to an row.
func Emit(rows ...expr.Row) *EmitOperator {
return &EmitOperator{Rows: rows}
}
func (op *EmitOperator) Iterate(in *environment.Environment, fn func(out *environment.Environment) error) error {
var newEnv environment.Environment
newEnv.SetOuter(in)
for _, e := range op.Rows {
r, err := e.Eval(in)
if err != nil {
return err
}
newEnv.SetRow(r)
err = fn(&newEnv)
if err != nil {
return err
}
}
return nil
}
func (op *EmitOperator) Clone() stream.Operator {
return &EmitOperator{
BaseOperator: op.BaseOperator.Clone(),
Rows: op.Rows,
}
}
func (op *EmitOperator) String() string {
var sb strings.Builder
sb.WriteString("rows.Emit(")
for i, e := range op.Rows {
if i > 0 {
sb.WriteString(", ")
}
sb.WriteString(e.String())
}
sb.WriteByte(')')
return sb.String()
}