func whereFilter(where expr.Node, task TaskRunner, cols map[string]*expr.Column) MessageHandler { out := task.MessageOut() evaluator := vm.Evaluator(where) return func(ctx *Context, msg datasource.Message) bool { var whereValue value.Value var ok bool switch mt := msg.(type) { case *datasource.SqlDriverMessage: //u.Debugf("WHERE: T:%T vals:%#v", msg, mt.Vals) //u.Debugf("cols: %#v", cols) msgReader := datasource.NewValueContextWrapper(mt, cols) whereValue, ok = evaluator(msgReader) case *datasource.SqlDriverMessageMap: whereValue, ok = evaluator(mt) //u.Debugf("WHERE: result:%v T:%T vals:%#v", whereValue, msg, mt.Values()) //u.Debugf("cols: %#v", cols) default: if msgReader, ok := msg.(expr.ContextReader); ok { whereValue, ok = evaluator(msgReader) } else { u.Errorf("could not convert to message reader: %T", msg) } } //u.Debugf("msg: %#v", msgReader) //u.Infof("evaluating: ok?%v result=%v where expr:%v", ok, whereValue.ToString(), where.StringAST()) if !ok { u.Debugf("could not evaluate: %v", msg) return false } switch whereVal := whereValue.(type) { case value.BoolValue: if whereVal.Val() == false { //u.Debugf("Filtering out: T:%T v:%#v", whereVal, whereVal) return true } case nil: return false default: if whereVal.Nil() { return false } } //u.Debugf("about to send from where to forward: %#v", msg) select { case out <- msg: return true case <-task.SigChan(): return false } } }
func joinValue(ctx *Context, node expr.Node, msg datasource.Message, cols map[string]*expr.Column) (string, bool) { if msg == nil { u.Warnf("got nil message?") } //u.Infof("got message: %T %#v", msg, cols) switch mt := msg.(type) { case *datasource.SqlDriverMessage: msgReader := datasource.NewValueContextWrapper(mt, cols) joinVal, ok := vm.Eval(msgReader, node) //u.Debugf("msg: %#v", msgReader) //u.Debugf("evaluating: ok?%v T:%T result=%v node '%v'", ok, joinVal, joinVal.ToString(), node.String()) if !ok { u.Errorf("could not evaluate: %T %#v %v", joinVal, joinVal, msg) return "", false } switch val := joinVal.(type) { case value.StringValue: return val.Val(), true default: u.Warnf("unknown type? %T", joinVal) } default: if msgReader, ok := msg.Body().(expr.ContextReader); ok { joinVal, ok := vm.Eval(msgReader, node) //u.Debugf("msg: %#v", msgReader) //u.Infof("evaluating: ok?%v T:%T result=%v node expr:%v", ok, joinVal, joinVal.ToString(), node.StringAST()) if !ok { u.Errorf("could not evaluate: %v", msg) return "", false } switch val := joinVal.(type) { case value.StringValue: return val.Val(), true default: u.Warnf("unknown type? %T", joinVal) } } else { u.Errorf("could not convert to message reader: %T", msg.Body()) } } return "", false }