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  }