Enable special param values which supersede subquery params

This commit is contained in:
Tobie Morgan Hitchcock 2017-12-08 14:28:55 +00:00
parent 5357c93558
commit fd35a134ca
4 changed files with 20 additions and 32 deletions

View file

@ -194,7 +194,7 @@ func (d *document) event(ctx context.Context, when method) (err error) {
vars.Set(d.id, varKeyThis) vars.Set(d.id, varKeyThis)
vars.Set(d.current.Data(), varKeyAfter) vars.Set(d.current.Data(), varKeyAfter)
vars.Set(d.initial.Data(), varKeyBefore) vars.Set(d.initial.Data(), varKeyBefore)
ctx = context.WithValue(ctx, ctxKeySubs, vars) ctx = context.WithValue(ctx, ctxKeySpec, vars)
for _, ev := range evs { for _, ev := range evs {

View file

@ -90,38 +90,24 @@ func (e *executor) fetch(ctx context.Context, val interface{}, doc *data.Doc) (o
case *sql.Param: case *sql.Param:
if obj, ok := ctx.Value(ctxKeySubs).(*data.Doc); ok { for _, s := range paramSearchKeys {
obj.Fetch(func(key string, val interface{}) interface{} { if obj, ok := ctx.Value(s).(*data.Doc); ok {
switch res := val.(type) {
case *sql.Thing: obj.Fetch(func(key string, val interface{}) interface{} {
val, _ = e.fetchThing(ctx, res, doc) switch res := val.(type) {
return val case *sql.Thing:
default: val, _ = e.fetchThing(ctx, res, doc)
return val return val
default:
return val
}
})
if res := obj.Get(val.ID).Data(); res != nil {
return e.fetch(ctx, res, doc)
} }
})
if res := obj.Get(val.ID).Data(); res != nil {
return e.fetch(ctx, res, doc)
}
}
if obj, ok := ctx.Value(ctxKeyVars).(*data.Doc); ok {
obj.Fetch(func(key string, val interface{}) interface{} {
switch res := val.(type) {
case *sql.Thing:
val, _ = e.fetchThing(ctx, res, doc)
return val
default:
return val
}
})
if res := obj.Get(val.ID).Data(); res != nil {
return e.fetch(ctx, res, doc)
} }
} }

View file

@ -291,7 +291,7 @@ func (d *document) mrgFld(ctx context.Context) (err error) {
vars.Set(val, varKeyValue) vars.Set(val, varKeyValue)
vars.Set(val, varKeyAfter) vars.Set(val, varKeyAfter)
vars.Set(old, varKeyBefore) vars.Set(old, varKeyBefore)
ctx = context.WithValue(ctx, ctxKeySubs, vars) ctx = context.WithValue(ctx, ctxKeySpec, vars)
// We are setting the value of the field // We are setting the value of the field
@ -306,7 +306,7 @@ func (d *document) mrgFld(ctx context.Context) (err error) {
vars.Set(val, varKeyValue) vars.Set(val, varKeyValue)
vars.Set(val, varKeyAfter) vars.Set(val, varKeyAfter)
vars.Set(old, varKeyBefore) vars.Set(old, varKeyBefore)
ctx = context.WithValue(ctx, ctxKeySubs, vars) ctx = context.WithValue(ctx, ctxKeySpec, vars)
// We are checking the value of the field // We are checking the value of the field

View file

@ -40,6 +40,7 @@ const (
ctxKeyDb = "db" ctxKeyDb = "db"
ctxKeyVars = "vars" ctxKeyVars = "vars"
ctxKeySubs = "subs" ctxKeySubs = "subs"
ctxKeySpec = "spec"
ctxKeyAuth = "auth" ctxKeyAuth = "auth"
ctxKeyKind = "kind" ctxKeyKind = "kind"
ctxKeyScope = "scope" ctxKeyScope = "scope"
@ -63,4 +64,5 @@ var (
queryNotExecuted = errors.New("Query not executed") queryNotExecuted = errors.New("Query not executed")
queryIdentFailed = errors.New("Found ident but no doc available") queryIdentFailed = errors.New("Found ident but no doc available")
featureNotImplemented = errors.New("Feature is not yet implemented") featureNotImplemented = errors.New("Feature is not yet implemented")
paramSearchKeys = []string{ctxKeySpec, ctxKeySubs, ctxKeyVars}
) )