Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
B
beego
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
go
beego
Commits
3731088b
Commit
3731088b
authored
Jan 10, 2015
by
Peter Fern
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add GroupBy to QuerySeter
Adds support for GroupBy to QuerySeter SELECT operations.
parent
5d8187d0
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
59 additions
and
3 deletions
+59
-3
db.go
orm/db.go
+6
-3
db_tables.go
orm/db_tables.go
+24
-0
orm_queryset.go
orm/orm_queryset.go
+7
-0
orm_test.go
orm/orm_test.go
+21
-0
types.go
orm/types.go
+1
-0
No files found.
orm/db.go
View file @
3731088b
...
...
@@ -800,6 +800,7 @@ func (d *dbBase) ReadBatch(q dbQuerier, qs *querySet, mi *modelInfo, cond *Condi
tables
.
parseRelated
(
qs
.
related
,
qs
.
relDepth
)
where
,
args
:=
tables
.
getCondSql
(
cond
,
false
,
tz
)
groupBy
:=
tables
.
getGroupSql
(
qs
.
groups
)
orderBy
:=
tables
.
getOrderSql
(
qs
.
orders
)
limit
:=
tables
.
getLimitSql
(
mi
,
offset
,
rlimit
)
join
:=
tables
.
getJoinSql
()
...
...
@@ -812,7 +813,7 @@ func (d *dbBase) ReadBatch(q dbQuerier, qs *querySet, mi *modelInfo, cond *Condi
}
}
query
:=
fmt
.
Sprintf
(
"SELECT %s FROM %s%s%s T0 %s%s%s%s
"
,
sels
,
Q
,
mi
.
table
,
Q
,
join
,
where
,
orderBy
,
limit
)
query
:=
fmt
.
Sprintf
(
"SELECT %s FROM %s%s%s T0 %s%s%s%s
%s"
,
sels
,
Q
,
mi
.
table
,
Q
,
join
,
where
,
groupBy
,
orderBy
,
limit
)
d
.
ins
.
ReplaceMarks
(
&
query
)
...
...
@@ -936,12 +937,13 @@ func (d *dbBase) Count(q dbQuerier, qs *querySet, mi *modelInfo, cond *Condition
tables
.
parseRelated
(
qs
.
related
,
qs
.
relDepth
)
where
,
args
:=
tables
.
getCondSql
(
cond
,
false
,
tz
)
groupBy
:=
tables
.
getGroupSql
(
qs
.
groups
)
tables
.
getOrderSql
(
qs
.
orders
)
join
:=
tables
.
getJoinSql
()
Q
:=
d
.
ins
.
TableQuote
()
query
:=
fmt
.
Sprintf
(
"SELECT COUNT(*) FROM %s%s%s T0 %s%s
"
,
Q
,
mi
.
table
,
Q
,
join
,
where
)
query
:=
fmt
.
Sprintf
(
"SELECT COUNT(*) FROM %s%s%s T0 %s%s
%s"
,
Q
,
mi
.
table
,
Q
,
join
,
where
,
groupBy
)
d
.
ins
.
ReplaceMarks
(
&
query
)
...
...
@@ -1442,13 +1444,14 @@ func (d *dbBase) ReadValues(q dbQuerier, qs *querySet, mi *modelInfo, cond *Cond
}
where
,
args
:=
tables
.
getCondSql
(
cond
,
false
,
tz
)
groupBy
:=
tables
.
getGroupSql
(
qs
.
groups
)
orderBy
:=
tables
.
getOrderSql
(
qs
.
orders
)
limit
:=
tables
.
getLimitSql
(
mi
,
qs
.
offset
,
qs
.
limit
)
join
:=
tables
.
getJoinSql
()
sels
:=
strings
.
Join
(
cols
,
", "
)
query
:=
fmt
.
Sprintf
(
"SELECT %s FROM %s%s%s T0 %s%s%s%s
"
,
sels
,
Q
,
mi
.
table
,
Q
,
join
,
where
,
orderBy
,
limit
)
query
:=
fmt
.
Sprintf
(
"SELECT %s FROM %s%s%s T0 %s%s%s%s
%s"
,
sels
,
Q
,
mi
.
table
,
Q
,
join
,
where
,
groupBy
,
orderBy
,
limit
)
d
.
ins
.
ReplaceMarks
(
&
query
)
...
...
orm/db_tables.go
View file @
3731088b
...
...
@@ -390,6 +390,30 @@ func (t *dbTables) getCondSql(cond *Condition, sub bool, tz *time.Location) (whe
return
}
// generate group sql.
func
(
t
*
dbTables
)
getGroupSql
(
groups
[]
string
)
(
groupSql
string
)
{
if
len
(
groups
)
==
0
{
return
}
Q
:=
t
.
base
.
TableQuote
()
groupSqls
:=
make
([]
string
,
0
,
len
(
groups
))
for
_
,
group
:=
range
groups
{
exprs
:=
strings
.
Split
(
group
,
ExprSep
)
index
,
_
,
fi
,
suc
:=
t
.
parseExprs
(
t
.
mi
,
exprs
)
if
suc
==
false
{
panic
(
fmt
.
Errorf
(
"unknown field/column name `%s`"
,
strings
.
Join
(
exprs
,
ExprSep
)))
}
groupSqls
=
append
(
groupSqls
,
fmt
.
Sprintf
(
"%s.%s%s%s"
,
index
,
Q
,
fi
.
column
,
Q
))
}
groupSql
=
fmt
.
Sprintf
(
"GROUP BY %s "
,
strings
.
Join
(
groupSqls
,
", "
))
return
}
// generate order sql.
func
(
t
*
dbTables
)
getOrderSql
(
orders
[]
string
)
(
orderSql
string
)
{
if
len
(
orders
)
==
0
{
...
...
orm/orm_queryset.go
View file @
3731088b
...
...
@@ -60,6 +60,7 @@ type querySet struct {
relDepth
int
limit
int64
offset
int64
groups
[]
string
orders
[]
string
orm
*
orm
}
...
...
@@ -105,6 +106,12 @@ func (o querySet) Offset(offset interface{}) QuerySeter {
return
&
o
}
// add GROUP expression.
func
(
o
querySet
)
GroupBy
(
exprs
...
string
)
QuerySeter
{
o
.
groups
=
exprs
return
&
o
}
// add ORDER expression.
// "column" means ASC, "-column" means DESC.
func
(
o
querySet
)
OrderBy
(
exprs
...
string
)
QuerySeter
{
...
...
orm/orm_test.go
View file @
3731088b
...
...
@@ -845,6 +845,27 @@ func TestOffset(t *testing.T) {
throwFail
(
t
,
AssertIs
(
num
,
2
))
}
func
TestGroupBy
(
t
*
testing
.
T
)
{
var
users
[]
*
User
var
maps
[]
Params
qs
:=
dORM
.
QueryTable
(
"user"
)
num
,
err
:=
qs
.
GroupBy
(
"is_staff"
)
.
Filter
(
"user_name"
,
"nobody"
)
.
Count
()
throwFail
(
t
,
err
)
throwFail
(
t
,
AssertIs
(
num
,
1
))
num
,
err
=
qs
.
GroupBy
(
"is_staff"
)
.
Count
()
throwFail
(
t
,
err
)
throwFail
(
t
,
AssertIs
(
num
,
2
))
num
,
err
=
qs
.
GroupBy
(
"is_staff"
)
.
Values
(
&
maps
)
throwFail
(
t
,
err
)
throwFail
(
t
,
AssertIs
(
num
,
2
))
num
,
err
=
qs
.
GroupBy
(
"profile__age"
)
.
Filter
(
"user_name"
,
"astaxie"
)
.
All
(
&
users
)
throwFail
(
t
,
err
)
throwFail
(
t
,
AssertIs
(
num
,
1
))
}
func
TestOrderBy
(
t
*
testing
.
T
)
{
qs
:=
dORM
.
QueryTable
(
"user"
)
num
,
err
:=
qs
.
OrderBy
(
"-status"
)
.
Filter
(
"user_name"
,
"nobody"
)
.
Count
()
...
...
orm/types.go
View file @
3731088b
...
...
@@ -67,6 +67,7 @@ type QuerySeter interface {
SetCond
(
*
Condition
)
QuerySeter
Limit
(
interface
{},
...
interface
{})
QuerySeter
Offset
(
interface
{})
QuerySeter
GroupBy
(
...
string
)
QuerySeter
OrderBy
(
...
string
)
QuerySeter
RelatedSel
(
...
interface
{})
QuerySeter
Count
()
(
int64
,
error
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment