From b2cdabb8a090221bb0fa7801f179d383a2c0384a Mon Sep 17 00:00:00 2001 From: Zheng Yang Date: Mon, 8 Sep 2014 17:37:01 +0800 Subject: [PATCH 1/5] added query builder for orm --- orm/qb.go | 30 +++++++++++++++++ orm/qb_mysql.go | 85 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+) create mode 100644 orm/qb.go create mode 100644 orm/qb_mysql.go diff --git a/orm/qb.go b/orm/qb.go new file mode 100644 index 00000000..ceb4b59e --- /dev/null +++ b/orm/qb.go @@ -0,0 +1,30 @@ +// Copyright 2014 beego Author. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package orm + +type QueryBuilder interface { + Select(fields ...string) QueryWriter + From(tables ...string) QueryWriter + Where(cond string) QueryWriter + LimitOffset(limit int, offset int) QueryWriter + InnerJoin(table string) QueryWriter + LeftJoin(table string) QueryWriter + On(cond string) QueryWriter + And(cond string) QueryWriter + Or(cond string) QueryWriter + In(vals ...string) QueryWriter + Subquery(query string, rename string) string + String() string +} diff --git a/orm/qb_mysql.go b/orm/qb_mysql.go new file mode 100644 index 00000000..1dadda2b --- /dev/null +++ b/orm/qb_mysql.go @@ -0,0 +1,85 @@ +// Copyright 2014 beego Author. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package orm + +import ( + "fmt" + "strings" +) + +type MySQLQueryBuilder struct { + QueryString []string +} + +func (qw *MySQLQueryBuilder) Select(fields ...string) QueryWriter { + segment := fmt.Sprintf("SELECT %s", strings.Join(fields, ", ")) + qw.QueryString = append(qw.QueryString, segment) + return qw +} + +func (qw *MySQLQueryBuilder) From(tables ...string) QueryWriter { + segment := fmt.Sprintf("FROM %s", strings.Join(tables, ", ")) + qw.QueryString = append(qw.QueryString, segment) + return qw +} + +func (qw *MySQLQueryBuilder) Where(cond string) QueryWriter { + qw.QueryString = append(qw.QueryString, "WHERE "+cond) + return qw +} + +func (qw *MySQLQueryBuilder) LimitOffset(limit int, offset int) QueryWriter { + qw.QueryString = append(qw.QueryString, fmt.Sprintf("LIMIT %d OFFSET %d", limit, offset)) + return qw +} + +func (qw *MySQLQueryBuilder) InnerJoin(table string) QueryWriter { + qw.QueryString = append(qw.QueryString, "INNER JOIN "+table) + return qw +} + +func (qw *MySQLQueryBuilder) LeftJoin(table string) QueryWriter { + qw.QueryString = append(qw.QueryString, "LEFT JOIN "+table) + return qw +} + +func (qw *MySQLQueryBuilder) On(cond string) QueryWriter { + qw.QueryString = append(qw.QueryString, "ON "+cond) + return qw +} + +func (qw *MySQLQueryBuilder) And(cond string) QueryWriter { + qw.QueryString = append(qw.QueryString, "AND "+cond) + return qw +} + +func (qw *MySQLQueryBuilder) Or(cond string) QueryWriter { + qw.QueryString = append(qw.QueryString, "OR "+cond) + return qw +} + +func (qw *MySQLQueryBuilder) In(vals ...string) QueryWriter { + segment := fmt.Sprintf("IN (%s)", strings.Join(vals, ", ")) + qw.QueryString = append(qw.QueryString, segment) + return qw +} + +func (qw *MySQLQueryBuilder) Subquery(sub string, alias string) string { + return fmt.Sprintf("(%s) AS %s", sub, alias) +} + +func (qw *MySQLQueryBuilder) String() string { + return strings.Join(qw.QueryString, " ") +} From c667895ce5fb9a09eb227b794ad2e9fb2dc27a78 Mon Sep 17 00:00:00 2001 From: Zheng Yang Date: Mon, 8 Sep 2014 17:47:15 +0800 Subject: [PATCH 2/5] added new querybuilder --- orm/qb.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/orm/qb.go b/orm/qb.go index ceb4b59e..8869a68c 100644 --- a/orm/qb.go +++ b/orm/qb.go @@ -28,3 +28,8 @@ type QueryBuilder interface { Subquery(query string, rename string) string String() string } + +func NewQueryBuilder() (qb QueryBuilder) { + qb = new(MySQLQueryBuilder) + return +} From f9a9b5a9058e218818dbef2de114c270a82d12a4 Mon Sep 17 00:00:00 2001 From: Zheng Yang Date: Mon, 8 Sep 2014 17:56:55 +0800 Subject: [PATCH 3/5] new query builder based on driver --- orm/qb.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/orm/qb.go b/orm/qb.go index 8869a68c..c85902b3 100644 --- a/orm/qb.go +++ b/orm/qb.go @@ -14,6 +14,8 @@ package orm +import "errors" + type QueryBuilder interface { Select(fields ...string) QueryWriter From(tables ...string) QueryWriter @@ -29,7 +31,15 @@ type QueryBuilder interface { String() string } -func NewQueryBuilder() (qb QueryBuilder) { - qb = new(MySQLQueryBuilder) +func NewQueryBuilder(driver string) (qb QueryBuilder, err error) { + if driver == "mysql" { + qb = new(MySQLQueryBuilder) + } else if driver == "postgres" { + err = errors.New("postgres querybuilder is not supported yet!") + } else if driver == "sqlite" { + err = errors.New("sqlite querybuilder is not supported yet!") + } else { + err = errors.New("unknown driver for query builder!") + } return } From cca0a3f76d34f6ae1ffdb84fae42ca7950dc0720 Mon Sep 17 00:00:00 2001 From: Zheng Yang Date: Mon, 8 Sep 2014 18:31:32 +0800 Subject: [PATCH 4/5] name correction: QueryBuilder instead of QueryWriter --- orm/qb.go | 20 ++++++++++---------- orm/qb_mysql.go | 20 ++++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/orm/qb.go b/orm/qb.go index c85902b3..6822259a 100644 --- a/orm/qb.go +++ b/orm/qb.go @@ -17,16 +17,16 @@ package orm import "errors" type QueryBuilder interface { - Select(fields ...string) QueryWriter - From(tables ...string) QueryWriter - Where(cond string) QueryWriter - LimitOffset(limit int, offset int) QueryWriter - InnerJoin(table string) QueryWriter - LeftJoin(table string) QueryWriter - On(cond string) QueryWriter - And(cond string) QueryWriter - Or(cond string) QueryWriter - In(vals ...string) QueryWriter + Select(fields ...string) QueryBuilder + From(tables ...string) QueryBuilder + Where(cond string) QueryBuilder + LimitOffset(limit int, offset int) QueryBuilder + InnerJoin(table string) QueryBuilder + LeftJoin(table string) QueryBuilder + On(cond string) QueryBuilder + And(cond string) QueryBuilder + Or(cond string) QueryBuilder + In(vals ...string) QueryBuilder Subquery(query string, rename string) string String() string } diff --git a/orm/qb_mysql.go b/orm/qb_mysql.go index 1dadda2b..4aa3f88c 100644 --- a/orm/qb_mysql.go +++ b/orm/qb_mysql.go @@ -23,54 +23,54 @@ type MySQLQueryBuilder struct { QueryString []string } -func (qw *MySQLQueryBuilder) Select(fields ...string) QueryWriter { +func (qw *MySQLQueryBuilder) Select(fields ...string) QueryBuilder { segment := fmt.Sprintf("SELECT %s", strings.Join(fields, ", ")) qw.QueryString = append(qw.QueryString, segment) return qw } -func (qw *MySQLQueryBuilder) From(tables ...string) QueryWriter { +func (qw *MySQLQueryBuilder) From(tables ...string) QueryBuilder { segment := fmt.Sprintf("FROM %s", strings.Join(tables, ", ")) qw.QueryString = append(qw.QueryString, segment) return qw } -func (qw *MySQLQueryBuilder) Where(cond string) QueryWriter { +func (qw *MySQLQueryBuilder) Where(cond string) QueryBuilder { qw.QueryString = append(qw.QueryString, "WHERE "+cond) return qw } -func (qw *MySQLQueryBuilder) LimitOffset(limit int, offset int) QueryWriter { +func (qw *MySQLQueryBuilder) LimitOffset(limit int, offset int) QueryBuilder { qw.QueryString = append(qw.QueryString, fmt.Sprintf("LIMIT %d OFFSET %d", limit, offset)) return qw } -func (qw *MySQLQueryBuilder) InnerJoin(table string) QueryWriter { +func (qw *MySQLQueryBuilder) InnerJoin(table string) QueryBuilder { qw.QueryString = append(qw.QueryString, "INNER JOIN "+table) return qw } -func (qw *MySQLQueryBuilder) LeftJoin(table string) QueryWriter { +func (qw *MySQLQueryBuilder) LeftJoin(table string) QueryBuilder { qw.QueryString = append(qw.QueryString, "LEFT JOIN "+table) return qw } -func (qw *MySQLQueryBuilder) On(cond string) QueryWriter { +func (qw *MySQLQueryBuilder) On(cond string) QueryBuilder { qw.QueryString = append(qw.QueryString, "ON "+cond) return qw } -func (qw *MySQLQueryBuilder) And(cond string) QueryWriter { +func (qw *MySQLQueryBuilder) And(cond string) QueryBuilder { qw.QueryString = append(qw.QueryString, "AND "+cond) return qw } -func (qw *MySQLQueryBuilder) Or(cond string) QueryWriter { +func (qw *MySQLQueryBuilder) Or(cond string) QueryBuilder { qw.QueryString = append(qw.QueryString, "OR "+cond) return qw } -func (qw *MySQLQueryBuilder) In(vals ...string) QueryWriter { +func (qw *MySQLQueryBuilder) In(vals ...string) QueryBuilder { segment := fmt.Sprintf("IN (%s)", strings.Join(vals, ", ")) qw.QueryString = append(qw.QueryString, segment) return qw From 38eb29fa7bc51c0c697a84a0ee018373682d6247 Mon Sep 17 00:00:00 2001 From: Zheng Yang Date: Mon, 8 Sep 2014 18:41:42 +0800 Subject: [PATCH 5/5] err msg spell correction --- orm/qb.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/orm/qb.go b/orm/qb.go index 6822259a..82cad51a 100644 --- a/orm/qb.go +++ b/orm/qb.go @@ -35,9 +35,9 @@ func NewQueryBuilder(driver string) (qb QueryBuilder, err error) { if driver == "mysql" { qb = new(MySQLQueryBuilder) } else if driver == "postgres" { - err = errors.New("postgres querybuilder is not supported yet!") + err = errors.New("postgres query builder is not supported yet!") } else if driver == "sqlite" { - err = errors.New("sqlite querybuilder is not supported yet!") + err = errors.New("sqlite query builder is not supported yet!") } else { err = errors.New("unknown driver for query builder!") }