Skip to content
Toggle navigation
Projects
Groups
Snippets
Help
public
/
sequelize
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
不要怂,就是干,撸起袖子干!
Commit 8dfed0a3
authored
Sep 17, 2013
by
Daniel Durante
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #882 from janmeier/ordering
Make ordering consistent across all dialects
2 parents
8b92d1dc
c075cacb
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
359 additions
and
21 deletions
lib/dialects/query-generator.js → lib/dialects/abstract/query-generator.js
lib/dialects/mysql/query-generator.js
lib/dialects/postgres/query-generator.js
lib/dialects/sqlite/query-generator.js
lib/sequelize.js
lib/utils.js
test/dao-factory.test.js
test/mysql/query-generator.test.js
test/postgres/query-generator.test.js
test/sqlite/query-generator.test.js
lib/dialects/query-generator.js
→
lib/dialects/
abstract/
query-generator.js
View file @
8dfed0a
var
Utils
=
require
(
"../../utils"
)
module
.
exports
=
(
function
()
{
var
QueryGenerator
=
{
addSchema
:
function
(
opts
)
{
...
...
@@ -268,7 +270,35 @@ module.exports = (function() {
Globally disable foreign key constraints
*/
disableForeignKeyConstraintsQuery
:
function
()
{
throwMethodUndefined
(
'disableForeignKeyConstraintsQuery'
)
throwMethodUndefined
(
'disableForeignKeyConstraintsQuery'
)
},
/*
Quote an object based on its type. This is a more general version of quoteIdentifiers
Strings: should proxy to quoteIdentifiers
Arrays: First argument should be qouted, second argument should be append without quoting
Objects:
* If raw is set, that value should be returned verbatim, without quoting
* If fn is set, the string should start with the value of fn, starting paren, followed by
the values of cols (which is assumed to be an array), quoted and joined with ', ',
unless they are themselves objects
* If direction is set, should be prepended
Currently this function is only used for ordering / grouping columns, but it could
potentially also be used for other places where we want to be able to call SQL functions (e.g. as default values)
*/
quote
:
function
(
obj
,
force
)
{
if
(
Utils
.
_
.
isString
(
obj
))
{
return
this
.
quoteIdentifiers
(
obj
,
force
)
}
else
if
(
Array
.
isArray
(
obj
))
{
return
this
.
quote
(
obj
[
0
],
force
)
+
' '
+
obj
[
1
]
}
else
if
(
obj
instanceof
Utils
.
fn
||
obj
instanceof
Utils
.
col
)
{
return
obj
.
toString
(
this
)
}
else
if
(
Utils
.
_
.
isObject
(
obj
)
&&
'raw'
in
obj
)
{
return
obj
.
raw
}
else
{
throw
new
Error
(
'Unknown structure passed to order / group: '
+
JSON
.
stringify
(
ojb
))
}
},
/*
...
...
lib/dialects/mysql/query-generator.js
View file @
8dfed0a
...
...
@@ -228,11 +228,12 @@ module.exports = (function() {
}
if
(
options
.
group
)
{
options
.
group
=
Array
.
isArray
(
options
.
group
)
?
options
.
group
.
map
(
function
(
t
)
{
return
this
.
quoteIdentifiers
(
t
)}.
bind
(
this
)).
join
(
', '
)
:
this
.
quoteIdentifiers
(
options
.
group
)
options
.
group
=
Array
.
isArray
(
options
.
group
)
?
options
.
group
.
map
(
function
(
t
)
{
return
this
.
quote
(
t
)
}.
bind
(
this
)).
join
(
', '
)
:
options
.
group
query
+=
" GROUP BY "
+
options
.
group
}
if
(
options
.
order
)
{
options
.
order
=
Array
.
isArray
(
options
.
order
)
?
options
.
order
.
map
(
function
(
t
)
{
return
this
.
quote
(
t
)
}.
bind
(
this
)).
join
(
', '
)
:
options
.
order
query
+=
" ORDER BY "
+
options
.
order
}
...
...
@@ -612,5 +613,5 @@ module.exports = (function() {
}
return
Utils
.
_
.
extend
(
Utils
.
_
.
clone
(
require
(
"../query-generator"
)),
QueryGenerator
)
return
Utils
.
_
.
extend
(
Utils
.
_
.
clone
(
require
(
"../
abstract/
query-generator"
)),
QueryGenerator
)
})()
lib/dialects/postgres/query-generator.js
View file @
8dfed0a
...
...
@@ -300,14 +300,12 @@ module.exports = (function() {
}
if
(
options
.
group
)
{
options
.
group
=
Array
.
isArray
(
options
.
group
)
?
options
.
group
.
map
(
function
(
t
)
{
return
this
.
quoteIdentifiers
(
t
)
}.
bind
(
this
)).
join
(
', '
)
:
this
.
quoteIdentifiers
(
options
.
group
)
options
.
group
=
Array
.
isArray
(
options
.
group
)
?
options
.
group
.
map
(
function
(
t
)
{
return
this
.
quote
(
t
)
}.
bind
(
this
)).
join
(
', '
)
:
options
.
group
query
+=
" GROUP BY <%= group %>"
}
if
(
options
.
order
)
{
options
.
order
=
options
.
order
.
replace
(
/
([^
]
+
)(
.*
)
/
,
function
(
m
,
g1
,
g2
)
{
return
this
.
quoteIdentifiers
(
g1
)
+
g2
}.
bind
(
this
))
options
.
order
=
Array
.
isArray
(
options
.
order
)
?
options
.
order
.
map
(
function
(
t
)
{
return
this
.
quote
(
t
)
}.
bind
(
this
)).
join
(
', '
)
:
options
.
order
query
+=
" ORDER BY <%= order %>"
}
...
...
@@ -886,5 +884,5 @@ module.exports = (function() {
return
returning
;
}
return
Utils
.
_
.
extend
(
Utils
.
_
.
clone
(
require
(
"../query-generator"
)),
QueryGenerator
)
return
Utils
.
_
.
extend
(
Utils
.
_
.
clone
(
require
(
"../
abstract/
query-generator"
)),
QueryGenerator
)
})()
lib/dialects/sqlite/query-generator.js
View file @
8dfed0a
...
...
@@ -3,7 +3,7 @@ var Utils = require("../../utils")
,
SqlString
=
require
(
"../../sql-string"
)
var
MySqlQueryGenerator
=
Utils
.
_
.
extend
(
Utils
.
_
.
clone
(
require
(
"../query-generator"
)),
Utils
.
_
.
clone
(
require
(
"../
abstract/
query-generator"
)),
Utils
.
_
.
clone
(
require
(
"../mysql/query-generator"
))
)
...
...
@@ -211,11 +211,12 @@ module.exports = (function() {
}
if
(
options
.
group
)
{
options
.
group
=
Array
.
isArray
(
options
.
group
)
?
options
.
group
.
map
(
function
(
t
)
{
return
this
.
quoteIdentifiers
(
t
)}.
bind
(
this
)).
join
(
', '
)
:
qa
(
options
.
group
)
options
.
group
=
Array
.
isArray
(
options
.
group
)
?
options
.
group
.
map
(
function
(
t
)
{
return
this
.
quote
(
t
)
}.
bind
(
this
)).
join
(
', '
)
:
options
.
group
query
+=
" GROUP BY "
+
options
.
group
}
if
(
options
.
order
)
{
options
.
order
=
Array
.
isArray
(
options
.
order
)
?
options
.
order
.
map
(
function
(
t
)
{
return
this
.
quote
(
t
)
}.
bind
(
this
)).
join
(
', '
)
:
options
.
order
query
+=
" ORDER BY "
+
options
.
order
}
...
...
lib/sequelize.js
View file @
8dfed0a
...
...
@@ -318,5 +318,13 @@ module.exports = (function() {
}).
run
()
}
Sequelize
.
prototype
.
fn
=
function
(
fn
)
{
return
new
Utils
.
fn
(
fn
,
Array
.
prototype
.
slice
.
call
(
arguments
,
1
))
}
Sequelize
.
prototype
.
col
=
function
(
col
)
{
return
new
Utils
.
col
(
col
)
}
return
Sequelize
})()
lib/utils.js
View file @
8dfed0a
...
...
@@ -469,9 +469,33 @@ var Utils = module.exports = {
removeTicks
:
function
(
s
,
tickChar
)
{
tickChar
=
tickChar
||
Utils
.
TICK_CHAR
return
s
.
replace
(
new
RegExp
(
tickChar
,
'g'
),
""
)
},
/*
* Utility functions for representing SQL functions, and columns that should be escaped.
* Please do not use these functions directly, use Sequelize.fn and Sequelize.col instead.
*/
fn
:
function
(
fn
,
args
)
{
this
.
fn
=
fn
this
.
args
=
args
},
col
:
function
(
col
)
{
this
.
col
=
col
}
}
Utils
.
fn
.
prototype
.
toString
=
function
(
queryGenerator
)
{
return
this
.
fn
+
'('
+
this
.
args
.
map
(
function
(
arg
)
{
if
(
arg
instanceof
Utils
.
fn
||
arg
instanceof
Utils
.
col
)
{
return
arg
.
toString
(
queryGenerator
)
}
else
{
return
queryGenerator
.
escape
(
arg
)
}
}).
join
(
', '
)
+
')'
}
Utils
.
col
.
prototype
.
toString
=
function
(
queryGenerator
)
{
return
queryGenerator
.
quote
(
this
.
col
)
}
Utils
.
CustomEventEmitter
=
require
(
__dirname
+
"/emitters/custom-event-emitter"
)
Utils
.
QueryChainer
=
require
(
__dirname
+
"/query-chainer"
)
Utils
.
Lingo
=
require
(
"lingo"
)
test/dao-factory.test.js
View file @
8dfed0a
...
...
@@ -2555,7 +2555,7 @@ describe(Support.getTestDialectTeaser("DAOFactory"), function () {
it
(
"sorts the results via a date column"
,
function
(
done
)
{
var
self
=
this
self
.
User
.
create
({
username
:
'user3'
,
data
:
'bar'
,
theDate
:
moment
().
add
(
'hours'
,
2
).
toDate
()}).
success
(
function
(){
self
.
User
.
findAll
({
order
:
'theDate DESC'
}).
success
(
function
(
users
)
{
self
.
User
.
findAll
({
order
:
[[
'theDate'
,
'DESC'
]]
}).
success
(
function
(
users
)
{
expect
(
users
[
0
].
id
).
to
.
be
.
above
(
users
[
2
].
id
)
done
()
})
...
...
test/mysql/query-generator.test.js
View file @
8dfed0a
...
...
@@ -163,20 +163,77 @@ if (dialect.match(/^mysql/)) {
expectation
:
"SELECT * FROM `myTable` ORDER BY id DESC;"
,
context
:
QueryGenerator
},
{
arguments
:
[
'myTable'
,
{
order
:
[
"id"
]}],
expectation
:
"SELECT * FROM `myTable` ORDER BY `id`;"
,
context
:
QueryGenerator
},
{
arguments
:
[
'myTable'
,
{
order
:
[
"myTable.id"
]}],
expectation
:
"SELECT * FROM `myTable` ORDER BY `myTable`.`id`;"
,
context
:
QueryGenerator
},
{
arguments
:
[
'myTable'
,
{
order
:
[[
"id"
,
'DESC'
]]}],
expectation
:
"SELECT * FROM `myTable` ORDER BY `id` DESC;"
,
context
:
QueryGenerator
},
{
title
:
'raw arguments are neither quoted nor escaped'
,
arguments
:
[
'myTable'
,
{
order
:
[[{
raw
:
'f1(f2(id))'
},
'DESC'
]]}],
expectation
:
"SELECT * FROM `myTable` ORDER BY f1(f2(id)) DESC;"
,
context
:
QueryGenerator
},
{
title
:
'functions can take functions as arguments'
,
arguments
:
[
'myTable'
,
function
(
sequelize
)
{
return
{
order
:
[[
sequelize
.
fn
(
'f1'
,
sequelize
.
fn
(
'f2'
,
sequelize
.
col
(
'id'
))),
'DESC'
]]
}
}],
expectation
:
"SELECT * FROM `myTable` ORDER BY f1(f2(`id`)) DESC;"
,
context
:
QueryGenerator
,
needsSequelize
:
true
},
{
title
:
'functions can take all types as arguments'
,
arguments
:
[
'myTable'
,
function
(
sequelize
)
{
return
{
order
:
[
[
sequelize
.
fn
(
'f1'
,
sequelize
.
col
(
'myTable.id'
)),
'DESC'
],
[
sequelize
.
fn
(
'f2'
,
12
,
'lalala'
,
new
Date
(
Date
.
UTC
(
2011
,
2
,
27
,
10
,
1
,
55
))),
'ASC'
]
]
}
}],
expectation
:
"SELECT * FROM `myTable` ORDER BY f1(`myTable`.`id`) DESC, f2(12, 'lalala', '2011-03-27 10:01:55') ASC;"
,
context
:
QueryGenerator
,
needsSequelize
:
true
},
{
title
:
'single string argument is not quoted'
,
arguments
:
[
'myTable'
,
{
group
:
"name"
}],
expectation
:
"SELECT * FROM `myTable` GROUP BY
`name`
;"
,
expectation
:
"SELECT * FROM `myTable` GROUP BY
name
;"
,
context
:
QueryGenerator
},
{
arguments
:
[
'myTable'
,
{
group
:
[
"name"
]
}],
arguments
:
[
'myTable'
,
{
group
:
[
"name"
]
}],
expectation
:
"SELECT * FROM `myTable` GROUP BY `name`;"
,
context
:
QueryGenerator
},
{
arguments
:
[
'myTable'
,
{
group
:
[
"name"
,
"title"
]}],
expectation
:
"SELECT * FROM `myTable` GROUP BY `name`, `title`;"
,
context
:
QueryGenerator
title
:
'functions work for group by'
,
arguments
:
[
'myTable'
,
function
(
sequelize
)
{
return
{
group
:
[
sequelize
.
fn
(
'YEAR'
,
sequelize
.
col
(
'createdAt'
))]
}
}],
expectation
:
"SELECT * FROM `myTable` GROUP BY YEAR(`createdAt`);"
,
context
:
QueryGenerator
,
needsSequelize
:
true
},
{
title
:
'It is possible to mix sequelize.fn and string arguments to group by'
,
arguments
:
[
'myTable'
,
function
(
sequelize
)
{
return
{
group
:
[
sequelize
.
fn
(
'YEAR'
,
sequelize
.
col
(
'createdAt'
)),
'title'
]
}
}],
expectation
:
"SELECT * FROM `myTable` GROUP BY YEAR(`createdAt`), `title`;"
,
context
:
QueryGenerator
,
needsSequelize
:
true
},
{
arguments
:
[
'myTable'
,
{
group
:
"name"
,
order
:
"id DESC"
}],
expectation
:
"SELECT * FROM `myTable` GROUP BY
`name`
ORDER BY id DESC;"
,
expectation
:
"SELECT * FROM `myTable` GROUP BY
name
ORDER BY id DESC;"
,
context
:
QueryGenerator
},
{
arguments
:
[
'myTable'
,
{
limit
:
10
}],
...
...
@@ -423,9 +480,12 @@ if (dialect.match(/^mysql/)) {
describe
(
suiteTitle
,
function
()
{
tests
.
forEach
(
function
(
test
)
{
var
title
=
test
.
title
||
'MySQL correctly returns '
+
test
.
expectation
+
' for '
+
util
.
inspect
(
test
.
arguments
)
it
(
title
,
function
(
done
)
{
it
(
title
,
function
(
done
)
{
// Options would normally be set by the query interface that instantiates the query-generator, but here we specify it explicitly
var
context
=
test
.
context
||
{
options
:
{}};
if
(
test
.
needsSequelize
)
{
test
.
arguments
[
1
]
=
test
.
arguments
[
1
](
this
.
sequelize
)
}
QueryGenerator
.
options
=
context
.
options
var
conditions
=
QueryGenerator
[
suiteTitle
].
apply
(
QueryGenerator
,
test
.
arguments
)
expect
(
conditions
).
to
.
deep
.
equal
(
test
.
expectation
)
...
...
test/postgres/query-generator.test.js
View file @
8dfed0a
...
...
@@ -247,13 +247,73 @@ if (dialect.match(/^postgres/)) {
expectation
:
"SELECT * FROM \"myTable\" WHERE foo='bar';"
},
{
arguments
:
[
'myTable'
,
{
order
:
"id DESC"
}],
expectation
:
"SELECT * FROM \"myTable\" ORDER BY \"id\" DESC;"
},
{
expectation
:
"SELECT * FROM \"myTable\" ORDER BY id DESC;"
},
{
arguments
:
[
'myTable'
,
{
order
:
[
"id"
]}],
expectation
:
'SELECT * FROM "myTable" ORDER BY "id";'
,
context
:
QueryGenerator
},
{
arguments
:
[
'myTable'
,
{
order
:
[
"myTable.id"
]}],
expectation
:
'SELECT * FROM "myTable" ORDER BY "myTable"."id";'
,
context
:
QueryGenerator
},
{
arguments
:
[
'myTable'
,
{
order
:
[[
"id"
,
'DESC'
]]}],
expectation
:
'SELECT * FROM "myTable" ORDER BY "id" DESC;'
,
context
:
QueryGenerator
},
{
title
:
'raw arguments are neither quoted nor escaped'
,
arguments
:
[
'myTable'
,
{
order
:
[[{
raw
:
'f1(f2(id))'
},
'DESC'
]]}],
expectation
:
'SELECT * FROM "myTable" ORDER BY f1(f2(id)) DESC;'
,
context
:
QueryGenerator
},
{
title
:
'functions can take functions as arguments'
,
arguments
:
[
'myTable'
,
function
(
sequelize
)
{
return
{
order
:
[[
sequelize
.
fn
(
'f1'
,
sequelize
.
fn
(
'f2'
,
sequelize
.
col
(
'id'
))),
'DESC'
]]
}
}],
expectation
:
'SELECT * FROM "myTable" ORDER BY f1(f2("id")) DESC;'
,
context
:
QueryGenerator
,
needsSequelize
:
true
},
{
title
:
'functions can take all types as arguments'
,
arguments
:
[
'myTable'
,
function
(
sequelize
)
{
return
{
order
:
[
[
sequelize
.
fn
(
'f1'
,
sequelize
.
col
(
'myTable.id'
)),
'DESC'
],
[
sequelize
.
fn
(
'f2'
,
12
,
'lalala'
,
new
Date
(
Date
.
UTC
(
2011
,
2
,
27
,
10
,
1
,
55
))),
'ASC'
]
]
}
}],
expectation
:
'SELECT * FROM "myTable" ORDER BY f1("myTable"."id") DESC, f2(12, \'lalala\', \'2011-03-27 10:01:55.000 +00:00\') ASC;'
,
context
:
QueryGenerator
,
needsSequelize
:
true
},
{
title
:
'single string argument is not quoted'
,
arguments
:
[
'myTable'
,
{
group
:
"name"
}],
expectation
:
"SELECT * FROM \"myTable\" GROUP BY
\"name\"
;"
expectation
:
"SELECT * FROM \"myTable\" GROUP BY
name
;"
},
{
arguments
:
[
'myTable'
,
{
group
:
[
"name"
]}],
expectation
:
"SELECT * FROM \"myTable\" GROUP BY \"name\";"
},
{
title
:
'functions work for group by'
,
arguments
:
[
'myTable'
,
function
(
sequelize
)
{
return
{
group
:
[
sequelize
.
fn
(
'YEAR'
,
sequelize
.
col
(
'createdAt'
))]
}
}],
expectation
:
"SELECT * FROM \"myTable\" GROUP BY YEAR(\"createdAt\");"
,
needsSequelize
:
true
},{
title
:
'It is possible to mix sequelize.fn and string arguments to group by'
,
arguments
:
[
'myTable'
,
function
(
sequelize
)
{
return
{
group
:
[
sequelize
.
fn
(
'YEAR'
,
sequelize
.
col
(
'createdAt'
)),
'title'
]
}
}],
expectation
:
"SELECT * FROM \"myTable\" GROUP BY YEAR(\"createdAt\"), \"title\";"
,
context
:
QueryGenerator
,
needsSequelize
:
true
},
{
arguments
:
[
'myTable'
,
{
group
:
[
"name"
,
"title"
]}],
expectation
:
"SELECT * FROM \"myTable\" GROUP BY \"name\", \"title\";"
...
...
@@ -807,6 +867,9 @@ if (dialect.match(/^postgres/)) {
it
(
title
,
function
(
done
)
{
// Options would normally be set by the query interface that instantiates the query-generator, but here we specify it explicitly
var
context
=
test
.
context
||
{
options
:
{}};
if
(
test
.
needsSequelize
)
{
test
.
arguments
[
1
]
=
test
.
arguments
[
1
](
this
.
sequelize
)
}
QueryGenerator
.
options
=
context
.
options
var
conditions
=
QueryGenerator
[
suiteTitle
].
apply
(
QueryGenerator
,
test
.
arguments
)
expect
(
conditions
).
to
.
deep
.
equal
(
test
.
expectation
)
...
...
test/sqlite/query-generator.test.js
View file @
8dfed0a
...
...
@@ -104,6 +104,156 @@ if (dialect === 'sqlite') {
}
],
selectQuery
:
[
{
arguments
:
[
'myTable'
],
expectation
:
"SELECT * FROM `myTable`;"
,
context
:
QueryGenerator
},
{
arguments
:
[
'myTable'
,
{
attributes
:
[
'id'
,
'name'
]}],
expectation
:
"SELECT `id`, `name` FROM `myTable`;"
,
context
:
QueryGenerator
},
{
arguments
:
[
'myTable'
,
{
where
:
{
id
:
2
}}],
expectation
:
"SELECT * FROM `myTable` WHERE `myTable`.`id`=2;"
,
context
:
QueryGenerator
},
{
arguments
:
[
'myTable'
,
{
where
:
{
name
:
'foo'
}}],
expectation
:
"SELECT * FROM `myTable` WHERE `myTable`.`name`='foo';"
,
context
:
QueryGenerator
},
{
arguments
:
[
'myTable'
,
{
where
:
{
name
:
"foo';DROP TABLE myTable;"
}}],
expectation
:
"SELECT * FROM `myTable` WHERE `myTable`.`name`='foo\'\';DROP TABLE myTable;';"
,
context
:
QueryGenerator
},
{
arguments
:
[
'myTable'
,
{
where
:
2
}],
expectation
:
"SELECT * FROM `myTable` WHERE `myTable`.`id`=2;"
,
context
:
QueryGenerator
},
{
arguments
:
[
'foo'
,
{
attributes
:
[[
'count(*)'
,
'count'
]]
}],
expectation
:
'SELECT count(*) as `count` FROM `foo`;'
,
context
:
QueryGenerator
},
{
arguments
:
[
'myTable'
,
{
where
:
"foo='bar'"
}],
expectation
:
"SELECT * FROM `myTable` WHERE foo='bar';"
,
context
:
QueryGenerator
},
{
arguments
:
[
'myTable'
,
{
order
:
"id DESC"
}],
expectation
:
"SELECT * FROM `myTable` ORDER BY id DESC;"
,
context
:
QueryGenerator
},
{
arguments
:
[
'myTable'
,
{
order
:
[
"id"
]}],
expectation
:
"SELECT * FROM `myTable` ORDER BY `id`;"
,
context
:
QueryGenerator
},
{
arguments
:
[
'myTable'
,
{
order
:
[
"myTable.id"
]}],
expectation
:
"SELECT * FROM `myTable` ORDER BY `myTable`.`id`;"
,
context
:
QueryGenerator
},
{
arguments
:
[
'myTable'
,
{
order
:
[[
"id"
,
'DESC'
]]}],
expectation
:
"SELECT * FROM `myTable` ORDER BY `id` DESC;"
,
context
:
QueryGenerator
},
{
title
:
'raw arguments are neither quoted nor escaped'
,
arguments
:
[
'myTable'
,
{
order
:
[[{
raw
:
'f1(f2(id))'
},
'DESC'
]]}],
expectation
:
"SELECT * FROM `myTable` ORDER BY f1(f2(id)) DESC;"
,
context
:
QueryGenerator
},
{
title
:
'functions can take functions as arguments'
,
arguments
:
[
'myTable'
,
function
(
sequelize
)
{
return
{
order
:
[[
sequelize
.
fn
(
'f1'
,
sequelize
.
fn
(
'f2'
,
sequelize
.
col
(
'id'
))),
'DESC'
]]
}
}],
expectation
:
"SELECT * FROM `myTable` ORDER BY f1(f2(`id`)) DESC;"
,
context
:
QueryGenerator
,
needsSequelize
:
true
},
{
title
:
'functions can take all types as arguments'
,
arguments
:
[
'myTable'
,
function
(
sequelize
)
{
return
{
order
:
[
[
sequelize
.
fn
(
'f1'
,
sequelize
.
col
(
'myTable.id'
)),
'DESC'
],
[
sequelize
.
fn
(
'f2'
,
12
,
'lalala'
,
new
Date
(
Date
.
UTC
(
2011
,
2
,
27
,
10
,
1
,
55
))),
'ASC'
]
]
}
}],
expectation
:
"SELECT * FROM `myTable` ORDER BY f1(`myTable`.`id`) DESC, f2(12, 'lalala', '2011-03-27 10:01:55') ASC;"
,
context
:
QueryGenerator
,
needsSequelize
:
true
},
{
title
:
'single string argument is not quoted'
,
arguments
:
[
'myTable'
,
{
group
:
"name"
}],
expectation
:
"SELECT * FROM `myTable` GROUP BY name;"
,
context
:
QueryGenerator
},
{
arguments
:
[
'myTable'
,
{
group
:
[
"name"
]}],
expectation
:
"SELECT * FROM `myTable` GROUP BY `name`;"
,
context
:
QueryGenerator
},
{
title
:
'functions work for group by'
,
arguments
:
[
'myTable'
,
function
(
sequelize
)
{
return
{
group
:
[
sequelize
.
fn
(
'YEAR'
,
sequelize
.
col
(
'createdAt'
))]
}
}],
expectation
:
"SELECT * FROM `myTable` GROUP BY YEAR(`createdAt`);"
,
context
:
QueryGenerator
,
needsSequelize
:
true
},
{
title
:
'It is possible to mix sequelize.fn and string arguments to group by'
,
arguments
:
[
'myTable'
,
function
(
sequelize
)
{
return
{
group
:
[
sequelize
.
fn
(
'YEAR'
,
sequelize
.
col
(
'createdAt'
)),
'title'
]
}
}],
expectation
:
"SELECT * FROM `myTable` GROUP BY YEAR(`createdAt`), `title`;"
,
context
:
QueryGenerator
,
needsSequelize
:
true
},
{
arguments
:
[
'myTable'
,
{
group
:
[
"name"
,
"title"
]}],
expectation
:
"SELECT * FROM `myTable` GROUP BY `name`, `title`;"
,
context
:
QueryGenerator
},
{
arguments
:
[
'myTable'
,
{
group
:
"name"
,
order
:
"id DESC"
}],
expectation
:
"SELECT * FROM `myTable` GROUP BY name ORDER BY id DESC;"
,
context
:
QueryGenerator
},
{
arguments
:
[
'myTable'
,
{
limit
:
10
}],
expectation
:
"SELECT * FROM `myTable` LIMIT 10;"
,
context
:
QueryGenerator
},
{
arguments
:
[
'myTable'
,
{
limit
:
10
,
offset
:
2
}],
expectation
:
"SELECT * FROM `myTable` LIMIT 2, 10;"
,
context
:
QueryGenerator
},
{
title
:
'uses default limit if only offset is specified'
,
arguments
:
[
'myTable'
,
{
offset
:
2
}],
expectation
:
"SELECT * FROM `myTable` LIMIT 2, 10000000000000;"
,
context
:
QueryGenerator
},
{
title
:
'multiple where arguments'
,
arguments
:
[
'myTable'
,
{
where
:
{
boat
:
'canoe'
,
weather
:
'cold'
}}],
expectation
:
"SELECT * FROM `myTable` WHERE `myTable`.`boat`='canoe' AND `myTable`.`weather`='cold';"
,
context
:
QueryGenerator
},
{
title
:
'no where arguments (object)'
,
arguments
:
[
'myTable'
,
{
where
:
{}}],
expectation
:
"SELECT * FROM `myTable` WHERE 1=1;"
,
context
:
QueryGenerator
},
{
title
:
'no where arguments (string)'
,
arguments
:
[
'myTable'
,
{
where
:
''
}],
expectation
:
"SELECT * FROM `myTable` WHERE 1=1;"
,
context
:
QueryGenerator
},
{
title
:
'no where arguments (null)'
,
arguments
:
[
'myTable'
,
{
where
:
null
}],
expectation
:
"SELECT * FROM `myTable` WHERE 1=1;"
,
context
:
QueryGenerator
}
],
insertQuery
:
[
{
arguments
:
[
'myTable'
,
{
name
:
'foo'
}],
...
...
@@ -257,6 +407,9 @@ if (dialect === 'sqlite') {
it
(
title
,
function
(
done
)
{
// Options would normally be set by the query interface that instantiates the query-generator, but here we specify it explicitly
var
context
=
test
.
context
||
{
options
:
{}};
if
(
test
.
needsSequelize
)
{
test
.
arguments
[
1
]
=
test
.
arguments
[
1
](
this
.
sequelize
)
}
QueryGenerator
.
options
=
context
.
options
var
conditions
=
QueryGenerator
[
suiteTitle
].
apply
(
QueryGenerator
,
test
.
arguments
)
expect
(
conditions
).
to
.
deep
.
equal
(
test
.
expectation
)
...
...
Write
Preview
Markdown
is supported
Attach a file
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 post a comment