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 +}