From f0a88b68a9710342e6260a1befad2cf3d44c292a Mon Sep 17 00:00:00 2001 From: Jinzhu Date: Sat, 3 Mar 2018 14:29:07 +0800 Subject: [PATCH] Add limit, order builder --- dialects/common/sqlbuilder/limit.go | 26 +++++++++++++++++++++++++ dialects/common/sqlbuilder/order.go | 30 +++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 dialects/common/sqlbuilder/limit.go create mode 100644 dialects/common/sqlbuilder/order.go diff --git a/dialects/common/sqlbuilder/limit.go b/dialects/common/sqlbuilder/limit.go new file mode 100644 index 00000000..519cdf95 --- /dev/null +++ b/dialects/common/sqlbuilder/limit.go @@ -0,0 +1,26 @@ +package sqlbuilder + +import ( + "fmt" + + "github.com/jinzhu/gorm" +) + +// BuildLimitCondition build limit condition +func BuildLimitCondition(tx *gorm.DB) chan *Builder { + limitChan := make(chan *Builder) + + go func() { + builder := &Builder{} + if limit := tx.Statement.Limit; limit.Limit != nil { + builder.SQL.WriteString(fmt.Sprintf(" LIMIT %d", *limit.Limit)) + + if limit.Offset != nil { + builder.SQL.WriteString(fmt.Sprintf(" OFFSET %d", *limit.Offset)) + } + } + limitChan <- builder + }() + + return limitChan +} diff --git a/dialects/common/sqlbuilder/order.go b/dialects/common/sqlbuilder/order.go new file mode 100644 index 00000000..57241623 --- /dev/null +++ b/dialects/common/sqlbuilder/order.go @@ -0,0 +1,30 @@ +package sqlbuilder + +import "github.com/jinzhu/gorm" + +// BuildOrderCondition build order condition +func BuildOrderCondition(tx *gorm.DB) chan *Builder { + orderChan := make(chan *Builder) + + go func() { + builder := &Builder{} + + if orderBy := tx.Statement.OrderBy; len(orderBy) > 0 { + builder.SQL.WriteString(" ORDER BY ") + for i, by := range orderBy { + if i > 0 { + builder.SQL.WriteString(", ") + } + if str, ok := by.(string); ok { + builder.SQL.WriteString(str) + } else { + buildCondition(tx, by, builder) + } + } + } + + orderChan <- builder + }() + + return orderChan +}