select improvements
This commit is contained in:
@@ -0,0 +1,7 @@
|
|||||||
|
package simql
|
||||||
|
|
||||||
|
type OrderBy string
|
||||||
|
|
||||||
|
func (o OrderBy) String() string {
|
||||||
|
return string(o)
|
||||||
|
}
|
||||||
@@ -5,15 +5,22 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// https://www.sqlite.org/lang_select.html
|
||||||
type SelectQuery struct {
|
type SelectQuery struct {
|
||||||
|
distinct bool
|
||||||
|
|
||||||
columns []Column
|
columns []Column
|
||||||
|
|
||||||
// (from|join type), table, as, A, operator, B
|
|
||||||
tables []SelectTable
|
tables []SelectTable
|
||||||
|
|
||||||
where []Where
|
where []Where
|
||||||
args []any
|
args []any
|
||||||
|
|
||||||
|
// group // TODO
|
||||||
|
// having // TODO
|
||||||
|
|
||||||
|
orderBy []OrderBy
|
||||||
|
|
||||||
limit int
|
limit int
|
||||||
offset int
|
offset int
|
||||||
}
|
}
|
||||||
@@ -22,12 +29,6 @@ func (s *SelectQuery) Args() []any {
|
|||||||
return s.args
|
return s.args
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *SelectQuery) Column(def string) *SelectQuery {
|
|
||||||
s.columns = append(s.columns, Column(def))
|
|
||||||
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *SelectQuery) Columns(defs ...string) *SelectQuery {
|
func (s *SelectQuery) Columns(defs ...string) *SelectQuery {
|
||||||
for _, def := range defs {
|
for _, def := range defs {
|
||||||
s.columns = append(s.columns, Column(def))
|
s.columns = append(s.columns, Column(def))
|
||||||
@@ -36,6 +37,12 @@ func (s *SelectQuery) Columns(defs ...string) *SelectQuery {
|
|||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *SelectQuery) Distinct(distinct bool) *SelectQuery {
|
||||||
|
s.distinct = distinct
|
||||||
|
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
func (s *SelectQuery) IsValid() bool {
|
func (s *SelectQuery) IsValid() bool {
|
||||||
for _, c := range s.columns {
|
for _, c := range s.columns {
|
||||||
if !c.IsValid() {
|
if !c.IsValid() {
|
||||||
@@ -83,13 +90,29 @@ func (s *SelectQuery) Offset(limit int) *SelectQuery {
|
|||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *SelectQuery) OrderBy(defs ...string) *SelectQuery {
|
||||||
|
if s.orderBy == nil {
|
||||||
|
s.orderBy = []OrderBy{}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, def := range defs {
|
||||||
|
s.orderBy = append(s.orderBy, OrderBy(def))
|
||||||
|
}
|
||||||
|
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
func (s *SelectQuery) String() string {
|
func (s *SelectQuery) String() string {
|
||||||
strs := []string{"select"}
|
strs := []string{"select"}
|
||||||
|
|
||||||
|
if s.distinct {
|
||||||
|
strs = append(strs, "distinct")
|
||||||
|
}
|
||||||
|
|
||||||
if len(s.columns) > 0 {
|
if len(s.columns) > 0 {
|
||||||
for i, column := range s.columns {
|
for i, column := range s.columns {
|
||||||
if i < len(s.columns)-1 {
|
if i < len(s.columns)-1 {
|
||||||
strs = append(strs, fmt.Sprintf("%s,", column.String()))
|
strs = append(strs, fmt.Sprintf("%s,", column))
|
||||||
} else {
|
} else {
|
||||||
strs = append(strs, column.String())
|
strs = append(strs, column.String())
|
||||||
}
|
}
|
||||||
@@ -110,9 +133,21 @@ func (s *SelectQuery) String() string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(s.orderBy) > 0 {
|
||||||
|
strs = append(strs, "order by")
|
||||||
|
|
||||||
|
for i, o := range s.orderBy {
|
||||||
|
if i < len(s.orderBy)-1 {
|
||||||
|
strs = append(strs, fmt.Sprintf("%s,", o))
|
||||||
|
} else {
|
||||||
|
strs = append(strs, o.String())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if s.limit > 0 {
|
if s.limit > 0 {
|
||||||
if s.offset > 0 {
|
if s.offset > 0 {
|
||||||
strs = append(strs, fmt.Sprintf("limit %d, %d", s.offset, s.limit))
|
strs = append(strs, fmt.Sprintf("limit %d offset %d", s.offset, s.limit))
|
||||||
} else {
|
} else {
|
||||||
strs = append(strs, fmt.Sprintf("limit %d", s.limit))
|
strs = append(strs, fmt.Sprintf("limit %d", s.limit))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,6 +45,15 @@ func TestSelect(t *testing.T) {
|
|||||||
Args: []any{1234},
|
Args: []any{1234},
|
||||||
String: "select name, email from customer where id = ?",
|
String: "select name, email from customer where id = ?",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
In: Select("customer").Where("age > ?", 18).OrderBy("age desc", "name asc"),
|
||||||
|
Args: []any{18},
|
||||||
|
String: "select * from customer where age > ? order by age desc, name asc",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
In: Select("customer").Distinct(true).Columns("age"),
|
||||||
|
String: "select distinct age from customer",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, testCase := range testCases {
|
for _, testCase := range testCases {
|
||||||
|
|||||||
Reference in New Issue
Block a user