github.com/aacfactory/fns-contrib/databases/sql@v1.2.84/dac/specifications/subquery.go (about) 1 package specifications 2 3 import ( 4 "fmt" 5 "github.com/aacfactory/errors" 6 "github.com/aacfactory/fns-contrib/databases/sql/dac/conditions" 7 "github.com/aacfactory/fns/commons/bytex" 8 "io" 9 ) 10 11 type QueryExpr struct { 12 conditions.QueryExpr 13 } 14 15 func (expr QueryExpr) Render(ctx Context, w io.Writer) (argument []any, err error) { 16 switch query := expr.Query.(type) { 17 case string: 18 if expr.Cond.Exist() { 19 err = errors.Warning("sql: sub query render failed").WithCause(fmt.Errorf("literal sub query can not has condition")) 20 return 21 } 22 _, _ = w.Write(LB) 23 _, _ = w.Write(bytex.FromString(query)) 24 _, _ = w.Write(RB) 25 if err != nil { 26 err = errors.Warning("sql: sub query render failed").WithCause(err) 27 return 28 } 29 break 30 default: 31 tableNames, hasTableNames := ctx.Localization(query) 32 if !hasTableNames { 33 err = errors.Warning("sql: sub query render failed").WithCause(fmt.Errorf("%s was not found in localization", query)) 34 return 35 } 36 tableName := tableNames[0] 37 if len(tableNames) == 2 { 38 tableName = fmt.Sprintf("%s.%s", tableNames[0], tableNames[1]) 39 } 40 ctx = SwitchKey(ctx, query) 41 column, hasColumn := ctx.Localization(expr.Field) 42 if !hasColumn { 43 err = errors.Warning("sql: sub query render failed").WithCause(fmt.Errorf("%s was not found in localization", expr.Field)) 44 return 45 } 46 _, _ = w.Write(LB) 47 _, _ = w.Write(SELECT) 48 _, _ = w.Write(SPACE) 49 if expr.Aggregate == "" { 50 _, _ = w.Write(bytex.FromString(column[0])) 51 } else { 52 _, _ = w.Write(bytex.FromString(expr.Aggregate)) 53 _, _ = w.Write(LB) 54 _, _ = w.Write(bytex.FromString(column[0])) 55 _, _ = w.Write(RB) 56 } 57 _, _ = w.Write(SPACE) 58 _, _ = w.Write(FROM) 59 _, _ = w.Write(SPACE) 60 _, _ = w.Write(bytex.FromString(tableName)) 61 if expr.Cond.Exist() { 62 _, _ = w.Write(SPACE) 63 _, _ = w.Write(WHERE) 64 _, _ = w.Write(SPACE) 65 argument, err = Condition{expr.Cond}.Render(ctx, w) 66 if err != nil { 67 err = errors.Warning("sql: sub query render failed").WithCause(err) 68 return 69 } 70 } 71 _, _ = w.Write(RB) 72 break 73 } 74 return 75 }