Skip to content

Commit

Permalink
more Where() tests
Browse files Browse the repository at this point in the history
  • Loading branch information
wangzuo committed Sep 21, 2023
1 parent 9795802 commit 9e03242
Show file tree
Hide file tree
Showing 13 changed files with 100 additions and 62 deletions.
6 changes: 3 additions & 3 deletions .github/workflows/integration.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-go@v3
- uses: actions/checkout@v4
- uses: actions/setup-go@v4
with:
go-version: 1.19
go-version: "1.20"
- name: Test
run: |
go test $(go list ./... | grep -Ev "generator|internal") -race -coverprofile=coverage.txt -covermode=atomic
Expand Down
24 changes: 12 additions & 12 deletions .github/workflows/migrate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-go@v3
- uses: actions/checkout@v4
- uses: actions/setup-go@v4
with:
go-version: 1.19
go-version: "1.20"
- name: Build
run: go build -o /usr/local/bin/queryx cmd/queryx/main.go
- uses: actions/upload-artifact@v3
Expand All @@ -18,10 +18,10 @@ jobs:
needs: [build]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-go@v3
- uses: actions/checkout@v4
- uses: actions/setup-go@v4
with:
go-version: 1.19
go-version: "1.20"
- uses: actions/download-artifact@v3
with:
name: bin
Expand Down Expand Up @@ -59,10 +59,10 @@ jobs:
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v3
- uses: actions/setup-go@v3
- uses: actions/checkout@v4
- uses: actions/setup-go@v4
with:
go-version: 1.19
go-version: "1.20"
- uses: actions/download-artifact@v3
with:
name: bin
Expand Down Expand Up @@ -99,10 +99,10 @@ jobs:
--health-timeout 5s
--health-retries 10
steps:
- uses: actions/checkout@v3
- uses: actions/setup-go@v3
- uses: actions/checkout@v4
- uses: actions/setup-go@v4
with:
go-version: 1.19
go-version: "1.20"
- uses: actions/download-artifact@v3
with:
name: bin
Expand Down
4 changes: 2 additions & 2 deletions generator/client/golang/templates/queryx.gotmpl
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,8 @@ func (c *QXClient) Query{{ $m.Name }}() *{{ $m.Name }}Query {
}
{{- end }}

func (c *QXClient) Raw(fragment string, args ...interface{}) *queryx.Clause {
return queryx.NewClause(fragment , args)
func (c *QXClient) Raw(fragment string, args ...interface{}) *queryx.Clause {
return queryx.NewClause(fragment, args)
}

type Tx struct {
Expand Down
18 changes: 10 additions & 8 deletions generator/client/golang/templates/queryx/clause.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,10 @@ func (c *Clause) Err() error {
}

func (c *Clause) And(clauses ...*Clause) *Clause {
if len(clauses) == 0 {
return c
}

var fragments []string
var args []interface{}
clauses = append([]*Clause{c}, clauses...)
Expand All @@ -33,13 +37,14 @@ func (c *Clause) And(clauses ...*Clause) *Clause {
args = append(args, clause.args...)
}

return &Clause{
fragment: strings.Join(fragments, " AND "),
args: args,
}
return NewClause(strings.Join(fragments, " AND "), args)
}

func (c *Clause) Or(clauses ...*Clause) *Clause {
if len(clauses) == 0 {
return c
}

var fragments []string
var args []interface{}
clauses = append([]*Clause{c}, clauses...)
Expand All @@ -48,8 +53,5 @@ func (c *Clause) Or(clauses ...*Clause) *Clause {
args = append(args, clause.args...)
}

return &Clause{
fragment: strings.Join(fragments, " OR "),
args: args,
}
return NewClause(strings.Join(fragments, " OR "), args)
}
22 changes: 9 additions & 13 deletions generator/client/golang/templates/queryx/select.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,21 +34,17 @@ func (s *SelectStatement) From(from string) *SelectStatement {
return s
}

func (s *SelectStatement) Where(expr ...*Clause) *SelectStatement {
var fragments []string
var args []interface{}
if s.where != nil {
fragments = append(fragments, fmt.Sprintf("(%s)", s.where.fragment))
args = append(args, s.where.args...)
}
for _, clause := range expr {
fragments = append(fragments, fmt.Sprintf("(%s)", clause.fragment))
args = append(args, clause.args...)
func (s *SelectStatement) Where(clauses ...*Clause) *SelectStatement {
if len(clauses) == 0 {
return s
}
s.where = &Clause{
fragment: strings.Join(fragments, " AND "),
args: args,

if s.where == nil {
s.where = clauses[0].And(clauses[1:]...)
} else {
s.where = s.where.And(clauses...)
}

return s
}

Expand Down
12 changes: 12 additions & 0 deletions generator/client/golang/templates/queryx/select_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,15 @@ func TestSelect(t *testing.T) {
require.Equal(t, `SELECT users.* FROM users LIMIT ?`, sql)
require.Equal(t, []interface{}{1}, args)
}

func TestSelectWhere(t *testing.T) {
s1 := NewSelect().Select("users.*").From("users").Where(NewClause("id = ?", []interface{}{1}))
sql, args := s1.ToSQL()
require.Equal(t, `SELECT users.* FROM users WHERE id = ?`, sql)
require.Equal(t, []interface{}{1}, args)

s1.Where(NewClause("name = ?", []interface{}{"test"}))
sql, args = s1.ToSQL()
require.Equal(t, `SELECT users.* FROM users WHERE (id = ?) AND (name = ?)`, sql)
require.Equal(t, []interface{}{1, "test"}, args)
}
Original file line number Diff line number Diff line change
Expand Up @@ -143,8 +143,8 @@ export class {{ $.model.Name }}Query {
}

where(...clauses: Clause[]) {
this.selectStatement.where(...clauses);
return this;
this.selectStatement.where(...clauses);
return this;
}

select(...selection: string[]) {
Expand Down
8 changes: 8 additions & 0 deletions generator/client/typescript/templates/queryx/clause.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ export class Clause {
}

and(...clauses: Clause[]) {
if (clauses.length === 0) {
return this;
}

let fragment = this.fragment;
let args = this.args;

Expand All @@ -21,6 +25,10 @@ export class Clause {
}

or(...clauses: Clause[]) {
if (clauses.length === 0) {
return this;
}

let fragment = this.fragment;
let args = this.args;

Expand Down
2 changes: 1 addition & 1 deletion generator/client/typescript/templates/queryx/client.tstmpl
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ export class QXClient {
}
{{- end }}

raw(fragment : string, ...args: any[]) {
raw(fragment: string, ...args: any[]) {
return new Clause(fragment, args)
}

Expand Down
15 changes: 15 additions & 0 deletions generator/client/typescript/templates/queryx/select.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,22 @@
import { test, expect } from "vitest";
import { newSelect } from "./select";
import { Clause } from "./clause";

test("select", () => {
let s = newSelect().select("users.*").from("users");
expect(s.toSQL()).toEqual(["SELECT users.* FROM users", []]);
});

test("select where", () => {
let s1 = newSelect()
.select("users.*")
.from("users")
.where(new Clause("id = ?", [1]));
expect(s1.toSQL()).toEqual(["SELECT users.* FROM users WHERE id = ?", [1]]);

s1.where(new Clause("name = ?", ["test"]));
expect(s1.toSQL()).toEqual([
"SELECT users.* FROM users WHERE (id = ?) AND (name = ?)",
[1, "test"],
]);
});
19 changes: 9 additions & 10 deletions generator/client/typescript/templates/queryx/select.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,18 +31,17 @@ export class SelectStatement {
return this;
}

where(...expr: Clause[]) {
let fragments:string[]=[];
let args=[];
if (this._where !== undefined) {
fragments.push(`(${this._where.fragment})`);
args.push(...this._where.args);
where(...clauses: Clause[]) {
if (clauses.length === 0) {
return this;
}
for (let i = 0; i < expr.length; i++) {
fragments.push(`(${expr[i].fragment})`);
args.push(...expr[i].args);

if (this._where === undefined) {
this._where = clauses[0].and(...clauses.slice(1));
} else {
this._where = this._where.and(...clauses);
}
this._where=new Clause(fragments.join(" AND "),args)

return this;
}

Expand Down
18 changes: 12 additions & 6 deletions internal/integration/client.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -251,13 +251,19 @@ test("inEmpty", async () => {
});

test("where", async () => {
let user = await c.queryUser().create({ weight:"98.0",name: "name" ,type:"type"});
let users = await c.queryUser().where(c.userID.eq(user.id)).where(c.userName.eq("name"),c.userType.eq("type")).all()
expect(users.length).toEqual(1);
let user = await c.queryUser().create({ name: "name", type: "type" });
let users = await c
.queryUser()
.where(c.userID.eq(user.id))
.where(c.userName.eq("name"), c.userType.eq("type"))
.all();
expect(users).toEqual([user]);

let u = await c.queryUser().where(c.raw("name = ? and type = ?", "name","type")).all();
expect(u[0].name).toEqual("name");
expect(u[0].type).toEqual("type");
users = await c
.queryUser()
.where(c.raw("name = ? and type = ?", "name", "type"))
.all();
expect(users).toEqual([user]);
});

test("hasManyEmpty", async () => {
Expand Down
10 changes: 5 additions & 5 deletions internal/integration/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -326,17 +326,17 @@ func TestInEmpty(t *testing.T) {
}

func TestWhere(t *testing.T) {
user, err := c.QueryUser().Create(c.ChangeUser().SetWeight(98.0).SetName("name").SetType("type"))
user, err := c.QueryUser().Create(c.ChangeUser().SetName("name").SetType("type"))
require.NoError(t, err)
users, err := c.QueryUser().Where(c.UserID.EQ(user.ID)).Where(c.UserName.EQ("name"), c.UserType.EQ("type")).All()
require.NoError(t, err)
require.NotNil(t, users)
require.Equal(t, 1, len(users))
require.Equal(t, user, users[0])

user, err = c.QueryUser().Where(c.Raw("name = ? and type = ?", "name", "type")).First()
users, err = c.QueryUser().Where(c.Raw("name = ? and type = ?", "name", "type")).All()
require.NoError(t, err)
require.Equal(t, "name", user.Name.Val)
require.Equal(t, "type", user.Type.Val)
require.Equal(t, 1, len(users))
require.Equal(t, user, users[0])
}

func TestHasManyEmpty(t *testing.T) {
Expand Down

0 comments on commit 9e03242

Please sign in to comment.