// Execute applies a dml sql select expression to the specified context's // // writeContext in the case of sql query is similar to a recordset for selects, // or for delete, insert, update it is like the storage layer // func (m *SqlVm) ExecuteSelect(writeContext datasource.ContextWriter, readContext datasource.ContextReader) (err error) { //defer errRecover(&err) s := &State{ ExprVm: m, ContextReader: readContext, } s.rv = reflect.ValueOf(s) // Check and see if we are where Guarded if m.sel.Where != nil { //u.Debugf("Has a Where: %v", m.Request.Where.Root.StringAST()) whereValue, ok := s.Walk(m.sel.Where) if !ok { return SqlEvalError } switch whereVal := whereValue.(type) { case value.BoolValue: if whereVal == value.BoolValueFalse { u.Debugf("Filtering out") return nil } } //u.Debugf("Matched where: %v", whereValue) } for _, col := range m.sel.Columns { if col.Guard != nil { // TODO: evaluate if guard } if col.Star { for k, v := range readContext.Row() { writeContext.Put(&expr.Column{As: k}, nil, v) } } else { //u.Debugf("tree.Root: as?%v %#v", col.As, col.Tree.Root) v, ok := s.Walk(col.Tree.Root) if ok { writeContext.Put(col, readContext, v) } } } //writeContext.Put() return }