@@ -6,12 +6,11 @@ package sqlbuilder
66const (
77 cteMarkerInit injectionMarker = iota
88 cteMarkerAfterWith
9- cteMarkerAfterAs
109)
1110
1211// With creates a new CTE builder with default flavor.
13- func With (name string , cols ... string ) * CTEBuilder {
14- return DefaultFlavor .NewCTEBuilder ().With (name , cols ... )
12+ func With (tables ... * CTETableBuilder ) * CTEBuilder {
13+ return DefaultFlavor .NewCTEBuilder ().With (tables ... )
1514}
1615
1716func newCTEBuilder () * CTEBuilder {
@@ -23,9 +22,8 @@ func newCTEBuilder() *CTEBuilder {
2322
2423// CTEBuilder is a CTE (Common Table Expression) builder.
2524type CTEBuilder struct {
26- name string
27- cols []string
28- builderVar string
25+ tableNames []string
26+ tableBuilderVars []string
2927
3028 args * Args
3129
@@ -36,17 +34,18 @@ type CTEBuilder struct {
3634var _ Builder = new (CTEBuilder )
3735
3836// With sets the CTE name and columns.
39- func (cteb * CTEBuilder ) With (name string , cols ... string ) * CTEBuilder {
40- cteb .name = name
41- cteb .cols = cols
42- cteb .marker = cteMarkerAfterWith
43- return cteb
44- }
37+ func (cteb * CTEBuilder ) With (tables ... * CTETableBuilder ) * CTEBuilder {
38+ tableNames := make ([]string , 0 , len (tables ))
39+ tableBuilderVars := make ([]string , 0 , len (tables ))
4540
46- // As sets the builder to select data.
47- func (cteb * CTEBuilder ) As (builder Builder ) * CTEBuilder {
48- cteb .builderVar = cteb .args .Add (builder )
49- cteb .marker = cteMarkerAfterAs
41+ for _ , table := range tables {
42+ tableNames = append (tableNames , table .TableName ())
43+ tableBuilderVars = append (tableBuilderVars , cteb .args .Add (table ))
44+ }
45+
46+ cteb .tableNames = tableNames
47+ cteb .tableBuilderVars = tableBuilderVars
48+ cteb .marker = cteMarkerAfterWith
5049 return cteb
5150}
5251
@@ -72,27 +71,12 @@ func (cteb *CTEBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{}
7271 buf := newStringBuilder ()
7372 cteb .injection .WriteTo (buf , cteMarkerInit )
7473
75- if cteb .name != "" {
74+ if len ( cteb .tableBuilderVars ) > 0 {
7675 buf .WriteLeadingString ("WITH " )
77- buf .WriteString (cteb .name )
78-
79- if len (cteb .cols ) > 0 {
80- buf .WriteLeadingString ("(" )
81- buf .WriteStrings (cteb .cols , ", " )
82- buf .WriteString (")" )
83- }
84-
85- cteb .injection .WriteTo (buf , cteMarkerAfterWith )
86- }
87-
88- if cteb .builderVar != "" {
89- buf .WriteLeadingString ("AS (" )
90- buf .WriteString (cteb .builderVar )
91- buf .WriteRune (')' )
92-
93- cteb .injection .WriteTo (buf , cteMarkerAfterAs )
76+ buf .WriteStrings (cteb .tableBuilderVars , ", " )
9477 }
9578
79+ cteb .injection .WriteTo (buf , cteMarkerAfterWith )
9680 return cteb .args .CompileWithFlavor (buf .String (), flavor , initialArg ... )
9781}
9882
@@ -103,18 +87,13 @@ func (cteb *CTEBuilder) SetFlavor(flavor Flavor) (old Flavor) {
10387 return
10488}
10589
106- // Var returns a placeholder for value.
107- func (cteb * CTEBuilder ) Var (arg interface {}) string {
108- return cteb .args .Add (arg )
109- }
110-
11190// SQL adds an arbitrary sql to current position.
11291func (cteb * CTEBuilder ) SQL (sql string ) * CTEBuilder {
11392 cteb .injection .SQL (cteb .marker , sql )
11493 return cteb
11594}
11695
117- // TableName returns the CTE table name .
118- func (cteb * CTEBuilder ) TableName () string {
119- return cteb .name
96+ // TableNames returns all table names in a CTE .
97+ func (cteb * CTEBuilder ) TableNames () [] string {
98+ return cteb .tableNames
12099}
0 commit comments