Skip to content

Commit 792279b

Browse files
committed
Adds support for descending ordering using "-property" (dresende#115)
1 parent e980ea5 commit 792279b

7 files changed

Lines changed: 67 additions & 5 deletions

File tree

lib/ChainFind.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@ function ChainFind(opts) {
2525
return this;
2626
},
2727
order: function (property, order) {
28-
opts.order = [ property, order ];
28+
if (!Array.isArray(opts.order)) {
29+
opts.order = [];
30+
}
31+
opts.order.push([ property, (order && order.toUpperCase() == "Z" ? "Z" : "A") ]);
2932
return this;
3033
},
3134
count: function (cb) {

lib/Drivers/DML/mysql.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,9 @@ Driver.prototype.find = function (fields, table, conditions, opts, cb) {
9999
q.limit('18446744073709551615');
100100
}
101101
if (opts.order) {
102-
q.order(opts.order[0], opts.order[1]);
102+
for (var i = 0; i < opts.order.length; i++) {
103+
q.order(opts.order[i][0], opts.order[i][1]);
104+
}
103105
}
104106

105107
if (opts.merge) {

lib/Drivers/DML/postgres.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,9 @@ Driver.prototype.find = function (fields, table, conditions, opts, cb) {
7474
q.limit(opts.limit);
7575
}
7676
if (opts.order) {
77-
q.order(opts.order[0], opts.order[1]);
77+
for (var i = 0; i < opts.order.length; i++) {
78+
q.order(opts.order[i][0], opts.order[i][1]);
79+
}
7880
}
7981

8082
if (opts.merge) {

lib/Drivers/DML/postgresaxomic.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,9 @@ Driver.prototype.find = function (fields, table, conditions, opts, cb) {
7373
q.limit(opts.limit);
7474
}
7575
if (opts.order) {
76-
q.order(opts.order[0], opts.order[1]);
76+
for (var i = 0; i < opts.order.length; i++) {
77+
q.order(opts.order[i][0], opts.order[i][1]);
78+
}
7779
}
7880

7981
if (opts.merge) {

lib/Drivers/DML/sqlite.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,9 @@ Driver.prototype.find = function (fields, table, conditions, opts, cb) {
7474
q.limit('9223372036854775807');
7575
}
7676
if (opts.order) {
77-
q.order(opts.order[0], opts.order[1]);
77+
for (var i = 0; i < opts.order.length; i++) {
78+
q.order(opts.order[i][0], opts.order[i][1]);
79+
}
7880
}
7981

8082
if (opts.merge) {

lib/Model.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ var OneAssociation = require("./Associations/One");
44
var ManyAssociation = require("./Associations/Many");
55
var ChainFind = require("./ChainFind");
66
var LazyLoad = require("./LazyLoad");
7+
var Utilities = require("./Utilities");
78

89
exports.Model = Model;
910

@@ -224,6 +225,10 @@ function Model(opts) {
224225
options.cache = opts.cache;
225226
}
226227

228+
if (order) {
229+
order = Utilities.standardizeOrder(order);
230+
}
231+
227232
var chain = new ChainFind({
228233
only : options.only || model_fields,
229234
id : opts.id,

lib/Utilities.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/**
2+
* Order should be a String (with the property name assumed ascending)
3+
* or an Array or property String names.
4+
*
5+
* Examples:
6+
*
7+
* 1. 'property1' (ORDER BY property1 ASC)
8+
* 2. '-property1' (ORDER BY property1 DESC)
9+
* 3. [ 'property1' ] (ORDER BY property1 ASC)
10+
* 4. [ '-property1' ] (ORDER BY property1 DESC)
11+
* 5. [ 'property1', 'A' ] (ORDER BY property1 ASC)
12+
* 6. [ 'property1', 'Z' ] (ORDER BY property1 DESC)
13+
* 7. [ '-property1', 'A' ] (ORDER BY property1 ASC)
14+
* 8. [ 'property1', 'property2' ] (ORDER BY property1 ASC, property2 ASC)
15+
* 9. [ 'property1', '-property2' ] (ORDER BY property1 ASC, property2 DESC)
16+
* ...
17+
*/
18+
19+
exports.standardizeOrder = function (order) {
20+
if (typeof order == "string") {
21+
if (order[0] == "-") {
22+
return [ [ order.substr(1), "Z" ] ];
23+
}
24+
return [ [ order, "A" ] ];
25+
}
26+
27+
var new_order = [], minus;
28+
29+
for (var i = 0; i < order.length; i++) {
30+
minus = (order[i][0] == "-");
31+
32+
if (i < order.length - 1 && [ "A", "Z" ].indexOf(order[i + 1].toUpperCase()) >= 0) {
33+
new_order.push([
34+
(minus ? order[i].substr(1) : order[i]),
35+
order[i + 1]
36+
]);
37+
i += 1;
38+
} else if (minus) {
39+
new_order.push([ order[i].substr(1), "Z" ]);
40+
} else {
41+
new_order.push([ order[i], "A" ]);
42+
}
43+
}
44+
45+
return new_order;
46+
};

0 commit comments

Comments
 (0)