Files
pgm/example/qry_select_test.go
2025-07-26 18:34:56 +05:30

91 lines
2.7 KiB
Go

package example
import (
"testing"
"code.patial.tech/go/pgm"
"code.patial.tech/go/pgm/example/db"
"code.patial.tech/go/pgm/example/db/branchuser"
"code.patial.tech/go/pgm/example/db/employee"
"code.patial.tech/go/pgm/example/db/user"
"code.patial.tech/go/pgm/example/db/usersession"
)
func TestQryBuilder2(t *testing.T) {
got := db.User.Debug().Select(user.Email, user.FirstName).
Join(db.UserSession, user.ID, usersession.UserID).
Join(db.BranchUser, user.ID, branchuser.UserID).
Where(
user.ID.Eq(1),
pgm.Or(
user.StatusID.Eq(2),
user.UpdatedAt.Eq(3),
),
user.MfaKind.Eq(4),
pgm.Or(
user.FirstName.Eq(5),
user.MiddleName.Eq(6),
),
).
Where(
user.LastName.NEq(7),
user.Phone.Like("%123%"),
user.Email.NotInSubQuery(db.User.Select(user.ID).Where(user.ID.Eq(123))),
).
Limit(10).
Offset(100).
String()
expected := "SELECT users.email, users.first_name FROM users JOIN user_sessions ON users.id = user_sessions.user_id" +
" JOIN branch_users ON users.id = branch_users.user_id WHERE users.id = $1 AND (users.status_id = $2 OR users.updated_at = $3)" +
" AND users.mfa_kind = $4 AND (users.first_name = $5 OR users.middle_name = $6) AND users.last_name != $7 AND users.phone" +
" LIKE $8 AND users.email NOT IN(SELECT users.id FROM users WHERE users.id = $9) LIMIT 10 OFFSET 100"
if expected != got {
t.Errorf("\nexpected: %q\ngot: %q", expected, got)
}
}
func TestSelectWithHaving(t *testing.T) {
expected := "SELECT employees.department, AVG(employees.salary), COUNT(employees.id)" +
" FROM employees GROUP BY employees.department HAVING AVG(employees.salary) > $1 AND COUNT(employees.id) > $2"
got := db.Employee.
Select(employee.Department, employee.Salary.Avg(), employee.ID.Count()).
GroupBy(employee.Department).
Having(employee.Salary.Avg().Gt(50000), employee.ID.Count().Gt(5)).
String()
if expected != got {
t.Errorf("\nexpected: %q\ngot: %q", expected, got)
}
}
// BenchmarkSelect-12 668817 1753 ns/op 4442 B/op 59 allocs/op
// BenchmarkSelect-12 638901 1860 ns/op 4266 B/op 61 allocs/op
func BenchmarkSelect(b *testing.B) {
for b.Loop() {
_ = db.User.Select(user.Email, user.FirstName).
Join(db.UserSession, user.ID, usersession.UserID).
Join(db.BranchUser, user.ID, branchuser.UserID).
Where(
user.ID.Eq(1),
pgm.Or(
user.StatusID.Eq(2),
user.UpdatedAt.Eq(3),
),
user.MfaKind.Eq(4),
pgm.Or(
user.FirstName.Eq(5),
user.MiddleName.Eq(6),
),
).
Where(
user.LastName.NEq(7),
user.Phone.Like("%123%"),
user.Email.NotInSubQuery(db.User.Select(user.ID).Where(user.ID.Eq(123))),
).
Limit(10).
Offset(100).
String()
}
}