// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com). // All rights reserved. // operator-join.go package expr import ( "fmt" "io" "git.portale-stac.it/go-pkg/expr/kern" ) //-------- join term func newJoinTerm(tk *Token) (inst *term) { return &term{ tk: *tk, children: make([]*term, 0, 2), position: posInfix, priority: priIterOp, evalFunc: evalJoin, } } func evalJoin(ctx kern.ExprContext, opTerm *term) (v any, err error) { var leftValue, rightValue any var itLeft, itRight kern.Iterator var item any if err = opTerm.checkOperands(); err != nil { return } if leftValue, err = opTerm.children[0].Compute(ctx); err != nil { return } if rightValue, err = opTerm.children[1].Compute(ctx); err != nil { return } if itLeft, err = NewIterator(leftValue); err != nil { return nil, fmt.Errorf("left operand of JOIN must be an iterable data-source; got %s", kern.TypeName(leftValue)) } if itRight, err = NewIterator(rightValue); err != nil { return nil, fmt.Errorf("right operand of JOIN must be an iterable data-source; got %s", kern.TypeName(rightValue)) } values := kern.NewListA() for _, it := range []kern.Iterator{itLeft, itRight} { for item, err = it.Next(); err == nil; item, err = it.Next() { values.AppendItem(item) } } if err == io.EOF { err = nil } v = values return } // init func init() { registerTermConstructor(SymKwJoin, newJoinTerm) }