Skip to content

Commit

Permalink
[FEATURE] Builder interfaces
Browse files Browse the repository at this point in the history
  • Loading branch information
Daniil Gavrilovsky committed Aug 30, 2019
1 parent fbfb5df commit 7f93156
Show file tree
Hide file tree
Showing 22 changed files with 464 additions and 240 deletions.
19 changes: 7 additions & 12 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@ notifications:
email: false

go:
- 1.8
- 1.9
- "1.10"
- "1.11"
- "1.12"

env:
- GO111MODULE=on

dist: trusty
sudo: required
Expand All @@ -24,15 +26,8 @@ before_install:
- docker run -d -p 127.0.0.1:8123:8123 --name dbr-clickhouse-server yandex/clickhouse-server

install:
- travis_retry go get -u github.com/golang/lint/golint
- travis_retry go get golang.org/x/tools/cmd/cover
- travis_retry go get github.com/mattn/goveralls
- travis_retry go get github.com/go-sql-driver/mysql
- travis_retry go get github.com/lib/pq
- travis_retry go get github.com/mailru/go-clickhouse
- travis_retry go get github.com/mattn/go-sqlite3
- travis_retry go get gopkg.in/DATA-DOG/go-sqlmock.v1
- travis_retry go get github.com/stretchr/testify
- travis_retry go get golang.org/x/lint/golint

- psql -c 'create database dbr_ci_test;' -U postgres
- mysql -e 'CREATE DATABASE dbr_ci_test;' -uroot
Expand All @@ -43,7 +38,7 @@ before_script:
- export DBR_TEST_CLICKHOUSE_DSN="http://localhost:8123/default"

script:
- golint ./...
- $HOME/gopath/bin/golint ./...
- go vet ./...
- test -z "$(gofmt -d -s . | tee /dev/stderr)"
- go test -v -covermode=count -coverprofile=coverage.out
Expand Down
3 changes: 2 additions & 1 deletion buffer.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ type Buffer interface {
Value() []interface{}
}

func newBuffer() Buffer {
// NewBuffer creates buffer
func NewBuffer() Buffer {
return &buffer{}
}

Expand Down
2 changes: 1 addition & 1 deletion condition_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ func TestCondition(t *testing.T) {
value: []interface{}{1, 2, 3},
},
} {
buf := newBuffer()
buf := NewBuffer()
err := test.cond.Build(dialect.MySQL, buf)
assert.NoError(t, err)
assert.Equal(t, test.query, buf.String())
Expand Down
32 changes: 22 additions & 10 deletions dbr.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,27 +82,39 @@ func (conn *Connection) beginTx() (*sql.Tx, error) {

// SessionRunner can do anything that a Session can except start a transaction.
type SessionRunner interface {
Select(column ...string) *SelectBuilder
SelectBySql(query string, value ...interface{}) *SelectBuilder
Select(column ...string) SelectBuilder
SelectBySql(query string, value ...interface{}) SelectBuilder

InsertInto(table string) *InsertBuilder
InsertBySql(query string, value ...interface{}) *InsertBuilder
InsertInto(table string) InsertBuilder
InsertBySql(query string, value ...interface{}) InsertBuilder

Update(table string) *UpdateBuilder
UpdateBySql(query string, value ...interface{}) *UpdateBuilder
Update(table string) UpdateBuilder
UpdateBySql(query string, value ...interface{}) UpdateBuilder

DeleteFrom(table string) *DeleteBuilder
DeleteBySql(query string, value ...interface{}) *DeleteBuilder
DeleteFrom(table string) DeleteBuilder
DeleteBySql(query string, value ...interface{}) DeleteBuilder
}

type runner interface {
Exec(query string, args ...interface{}) (sql.Result, error)
Query(query string, args ...interface{}) (*sql.Rows, error)
}

type executer interface {
Exec() (sql.Result, error)
}

type loader interface {
Load(value interface{}) (int, error)
LoadStruct(value interface{}) error
LoadStructs(value interface{}) (int, error)
LoadValue(value interface{}) error
LoadValues(value interface{}) (int, error)
}

func exec(runner runner, log EventReceiver, builder Builder, d Dialect) (sql.Result, error) {
i := interpolator{
Buffer: newBuffer(),
Buffer: NewBuffer(),
Dialect: d,
IgnoreBinary: true,
}
Expand Down Expand Up @@ -133,7 +145,7 @@ func exec(runner runner, log EventReceiver, builder Builder, d Dialect) (sql.Res

func query(runner runner, log EventReceiver, builder Builder, d Dialect, dest interface{}) (int, error) {
i := interpolator{
Buffer: newBuffer(),
Buffer: NewBuffer(),
Dialect: d,
IgnoreBinary: true,
}
Expand Down
30 changes: 21 additions & 9 deletions delete.go
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
package dbr

// DeleteStmt builds `DELETE ...`
type DeleteStmt struct {
raw
type DeleteStmt interface {
Builder
Where(query interface{}, value ...interface{}) DeleteStmt
}

Table string
type deleteStmt struct {
raw

Table string
WhereCond []Builder
}

// Build builds `DELETE ...` in dialect
func (b *DeleteStmt) Build(d Dialect, buf Buffer) error {
func (b *deleteStmt) Build(d Dialect, buf Buffer) error {
if b.raw.Query != "" {
return b.raw.Build(d, buf)
}
Expand All @@ -33,15 +37,23 @@ func (b *DeleteStmt) Build(d Dialect, buf Buffer) error {
}

// DeleteFrom creates a DeleteStmt
func DeleteFrom(table string) *DeleteStmt {
return &DeleteStmt{
func DeleteFrom(table string) DeleteStmt {
return createDeleteStmt(table)
}

func createDeleteStmt(table string) *deleteStmt {
return &deleteStmt{
Table: table,
}
}

// DeleteBySql creates a DeleteStmt from raw query
func DeleteBySql(query string, value ...interface{}) *DeleteStmt {
return &DeleteStmt{
func DeleteBySql(query string, value ...interface{}) DeleteStmt {
return createDeleteStmtBySQL(query, value)
}

func createDeleteStmtBySQL(query string, value []interface{}) *deleteStmt {
return &deleteStmt{
raw: raw{
Query: query,
Value: value,
Expand All @@ -50,7 +62,7 @@ func DeleteBySql(query string, value ...interface{}) *DeleteStmt {
}

// Where adds a where condition
func (b *DeleteStmt) Where(query interface{}, value ...interface{}) *DeleteStmt {
func (b *deleteStmt) Where(query interface{}, value ...interface{}) DeleteStmt {
switch query := query.(type) {
case string:
b.WhereCond = append(b.WhereCond, Expr(query, value...))
Expand Down
52 changes: 30 additions & 22 deletions delete_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,80 +6,88 @@ import (
)

// DeleteBuilder builds "DELETE ..." stmt
type DeleteBuilder struct {
runner
type DeleteBuilder interface {
Builder
EventReceiver
Dialect Dialect
executer

Where(query interface{}, value ...interface{}) DeleteBuilder
Limit(n uint64) DeleteBuilder
}

*DeleteStmt
type deleteBuilder struct {
runner
EventReceiver

Dialect Dialect
deleteStmt *deleteStmt
LimitCount int64
}

// DeleteFrom creates a DeleteBuilder
func (sess *Session) DeleteFrom(table string) *DeleteBuilder {
return &DeleteBuilder{
func (sess *Session) DeleteFrom(table string) DeleteBuilder {
return &deleteBuilder{
runner: sess,
EventReceiver: sess,
Dialect: sess.Dialect,
DeleteStmt: DeleteFrom(table),
deleteStmt: createDeleteStmt(table),
LimitCount: -1,
}
}

// DeleteFrom creates a DeleteBuilder
func (tx *Tx) DeleteFrom(table string) *DeleteBuilder {
return &DeleteBuilder{
func (tx *Tx) DeleteFrom(table string) DeleteBuilder {
return &deleteBuilder{
runner: tx,
EventReceiver: tx,
Dialect: tx.Dialect,
DeleteStmt: DeleteFrom(table),
deleteStmt: createDeleteStmt(table),
LimitCount: -1,
}
}

// DeleteBySql creates a DeleteBuilder from raw query
func (sess *Session) DeleteBySql(query string, value ...interface{}) *DeleteBuilder {
return &DeleteBuilder{
func (sess *Session) DeleteBySql(query string, value ...interface{}) DeleteBuilder {
return &deleteBuilder{
runner: sess,
EventReceiver: sess,
Dialect: sess.Dialect,
DeleteStmt: DeleteBySql(query, value...),
deleteStmt: createDeleteStmtBySQL(query, value),
LimitCount: -1,
}
}

// DeleteBySql creates a DeleteBuilder from raw query
func (tx *Tx) DeleteBySql(query string, value ...interface{}) *DeleteBuilder {
return &DeleteBuilder{
func (tx *Tx) DeleteBySql(query string, value ...interface{}) DeleteBuilder {
return &deleteBuilder{
runner: tx,
EventReceiver: tx,
Dialect: tx.Dialect,
DeleteStmt: DeleteBySql(query, value...),
deleteStmt: createDeleteStmtBySQL(query, value),
LimitCount: -1,
}
}

// Exec executes the stmt
func (b *DeleteBuilder) Exec() (sql.Result, error) {
func (b *deleteBuilder) Exec() (sql.Result, error) {
return exec(b.runner, b.EventReceiver, b, b.Dialect)
}

// Where adds condition to the stmt
func (b *DeleteBuilder) Where(query interface{}, value ...interface{}) *DeleteBuilder {
b.DeleteStmt.Where(query, value...)
func (b *deleteBuilder) Where(query interface{}, value ...interface{}) DeleteBuilder {
b.deleteStmt.Where(query, value...)
return b
}

// Limit adds LIMIT
func (b *DeleteBuilder) Limit(n uint64) *DeleteBuilder {
func (b *deleteBuilder) Limit(n uint64) DeleteBuilder {
b.LimitCount = int64(n)
return b
}

// Build builds `DELETE ...` in dialect
func (b *DeleteBuilder) Build(d Dialect, buf Buffer) error {
err := b.DeleteStmt.Build(b.Dialect, buf)
func (b *deleteBuilder) Build(d Dialect, buf Buffer) error {
err := b.deleteStmt.Build(b.Dialect, buf)
if err != nil {
return err
}
Expand Down
4 changes: 2 additions & 2 deletions delete_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (
)

func TestDeleteStmt(t *testing.T) {
buf := newBuffer()
buf := NewBuffer()
builder := DeleteFrom("table").Where(Eq("a", 1))
err := builder.Build(dialect.MySQL, buf)
assert.NoError(t, err)
Expand All @@ -17,7 +17,7 @@ func TestDeleteStmt(t *testing.T) {
}

func BenchmarkDeleteSQL(b *testing.B) {
buf := newBuffer()
buf := NewBuffer()
for i := 0; i < b.N; i++ {
DeleteFrom("table").Where(Eq("a", 1)).Build(dialect.MySQL, buf)
}
Expand Down
11 changes: 11 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
module github.com/mailru/dbr

require (
github.com/DATA-DOG/go-sqlmock v1.3.3
github.com/go-sql-driver/mysql v1.4.1
github.com/lib/pq v1.2.0
github.com/mailru/go-clickhouse v1.1.0
github.com/mattn/go-sqlite3 v1.11.0
github.com/stretchr/testify v1.4.0
google.golang.org/appengine v1.6.2 // indirect
)
37 changes: 37 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
github.com/DATA-DOG/go-sqlmock v1.3.3 h1:CWUqKXe0s8A2z6qCgkP4Kru7wC11YoAnoupUKFDnH08=
github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0=
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/mailru/go-clickhouse v1.1.0 h1:o23GiQ1CHyb/FnDizEOuKIq5l7HJFepCgLR8BV8v/I8=
github.com/mailru/go-clickhouse v1.1.0/go.mod h1:nJ671Q14775Y+SpWW28Km2gPSfIgLluZb5F1bUqX6PQ=
github.com/mattn/go-sqlite3 v1.11.0 h1:LDdKkqtYlom37fkvqs8rMPFKAMe8+SgjbwZ6ex1/A/Q=
github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
google.golang.org/appengine v1.6.2 h1:j8RI1yW0SkI+paT6uGwMlrMI/6zwYA6/CFil8rxOzGI=
google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
Loading

0 comments on commit 7f93156

Please sign in to comment.