Lateral - initial commit.
This commit is contained in:
parent
1146afe343
commit
0cba1f6401
4 changed files with 73 additions and 2 deletions
|
|
@ -13,8 +13,8 @@ type selectTableImpl struct {
|
|||
}
|
||||
|
||||
// NewSelectTable func
|
||||
func NewSelectTable(selectStmt SerializerStatement, alias string) SelectTable {
|
||||
selectTable := &selectTableImpl{selectStmt: selectStmt, alias: alias}
|
||||
func NewSelectTable(selectStmt SerializerStatement, alias string) selectTableImpl {
|
||||
selectTable := selectTableImpl{selectStmt: selectStmt, alias: alias}
|
||||
return selectTable
|
||||
}
|
||||
|
||||
|
|
@ -38,3 +38,21 @@ func (s selectTableImpl) serialize(statement StatementType, out *SQLBuilder, opt
|
|||
out.WriteString("AS")
|
||||
out.WriteIdentifier(s.alias)
|
||||
}
|
||||
|
||||
// --------------------------------------
|
||||
|
||||
type lateralImpl struct {
|
||||
selectTableImpl
|
||||
}
|
||||
|
||||
func NewLateral(selectStmt SerializerStatement, alias string) SelectTable {
|
||||
return lateralImpl{selectTableImpl: NewSelectTable(selectStmt, alias)}
|
||||
}
|
||||
|
||||
func (s lateralImpl) serialize(statement StatementType, out *SQLBuilder, options ...SerializeOption) {
|
||||
out.WriteString("LATERAL")
|
||||
s.selectStmt.serialize(statement, out)
|
||||
|
||||
out.WriteString("AS")
|
||||
out.WriteIdentifier(s.alias)
|
||||
}
|
||||
|
|
|
|||
13
postgres/lateral.go
Normal file
13
postgres/lateral.go
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
package postgres
|
||||
|
||||
import "github.com/go-jet/jet/v2/internal/jet"
|
||||
|
||||
func LATERAL(selectStmt SelectStatement, alias string) SelectTable {
|
||||
subQuery := &selectTableImpl{
|
||||
SelectTable: jet.NewLateral(selectStmt, alias),
|
||||
}
|
||||
|
||||
subQuery.readableTableInterfaceImpl.parent = subQuery
|
||||
|
||||
return subQuery
|
||||
}
|
||||
9
postgres/lateral_test.go
Normal file
9
postgres/lateral_test.go
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
package postgres
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestLATERAL(t *testing.T) {
|
||||
assertSerialize(t, LATERAL(SELECT(Int(1)), "lat1"), `LATERAL (
|
||||
SELECT $1
|
||||
) AS lat1`)
|
||||
}
|
||||
|
|
@ -1893,3 +1893,34 @@ WHERE ($1 AND (customer.customer_id = $2)) AND (customer.activebool = $3);
|
|||
require.Len(t, dest, 1)
|
||||
testutils.AssertDeepEqual(t, dest[0], customer0)
|
||||
}
|
||||
|
||||
func TestLateral(t *testing.T) {
|
||||
|
||||
languages := LATERAL(
|
||||
SELECT(
|
||||
Language.AllColumns,
|
||||
).FROM(
|
||||
Language,
|
||||
).WHERE(
|
||||
Language.Name.NOT_IN(String("spanish")).
|
||||
AND(Film.LanguageID.EQ(Language.LanguageID)),
|
||||
),
|
||||
"films")
|
||||
|
||||
stmt := SELECT(
|
||||
Film.AllColumns,
|
||||
languages.AllColumns(),
|
||||
).FROM(
|
||||
Film.CROSS_JOIN(languages),
|
||||
).WHERE(
|
||||
Film.FilmID.EQ(Int(1)),
|
||||
)
|
||||
|
||||
var dest []struct {
|
||||
model.Film
|
||||
model.Language
|
||||
}
|
||||
|
||||
err := stmt.Query(db, &dest)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue