Skip to content

Commit b757e77

Browse files
committed
Fix sorting in NoSQL.
1 parent f6d9dc6 commit b757e77

3 files changed

Lines changed: 40 additions & 38 deletions

File tree

nosql.js

Lines changed: 20 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -961,62 +961,52 @@ function nosqlinlinesorter(item, builder, doc) {
961961
if (length < builder.$limit) {
962962
item.response.push(doc);
963963
length + 1 >= builder.$limit && item.response.quicksort(builder.$sort.name, builder.$sort.asc);
964-
} else {
965-
if (builder.$sort.asc)
966-
nosqlresort_asc(item.response, builder, doc); // inline sorter
967-
else
968-
nosqlresort_desc(item.response, builder, doc); // inline sorter
969-
}
964+
} else
965+
nosqlresort(item.response, builder, doc);
970966
}
971967

972968
function nosqlsortvalue(a, b, sorter) {
973969
var type = typeof(a);
974970
if (type === 'number')
975-
return sorter.asc ? a < b : a > b;
971+
return sorter.asc ? a > b : a < b;
976972
else if (type === 'string') {
977973
a = (a.length > 5 ? a.substring(0, 5) : a).toLowerCase().removeDiacritics();
978974
var c = a.localeCompare(b);
979-
return sorter.asc ? c === -1 : c === 1;
975+
return sorter.asc ? c === 1 : c === -1;
980976
} else if (a instanceof Date)
981-
return sorter.asc ? a < b : a > b;
982-
977+
return sorter.asc ? a > b : a < b;
983978
return false;
984979
}
985980

986-
function nosqlresort_asc(arr, builder, doc) {
981+
function nosqlresort(arr, builder, doc) {
987982
var b = doc[builder.$sort.name];
988983
if (typeof(b) === 'string')
989984
b = (b.length > 5 ? b.substring(0, 5) : b).toLowerCase().removeDiacritics();
985+
986+
var beg = 0;
990987
var length = arr.length;
991-
for (var i = 0, length = arr.length; i < length; i++) {
992-
// for (var i = length - 1; i > -1; i--) {
993-
var item = arr[i];
994-
var sort = nosqlsortvalue(item[builder.$sort.name], b, builder.$sort);
995-
console.log('CYCLES', JSON.stringify(arr), item[builder.$sort.name], b, sort);
996-
if (sort)
997-
continue;
998-
for (var j = length - 1; j > i; j--)
999-
arr[j] = arr[j - 1];
1000-
arr[i] = doc;
988+
var tmp = length - 1;
989+
990+
var sort = nosqlsortvalue(arr[tmp][builder.$sort.name], b, builder.$sort);
991+
if (!sort)
1001992
return;
1002-
}
1003-
}
1004993

1005-
function nosqlresort_desc(arr, builder, doc) {
1006-
var b = doc[builder.$sort.name];
1007-
if (typeof(b) === 'string')
1008-
b = (b.length > 5 ? b.substring(0, 5) : b).toLowerCase().removeDiacritics();
1009-
for (var i = 0, length = arr.length; i < length; i++) {
1010-
console.log('CYCLES');
994+
tmp = arr.length / 2 >> 0;
995+
sort = nosqlsortvalue(arr[tmp][builder.$sort.name], b, builder.$sort);
996+
if (!sort)
997+
beg = tmp + 1;
998+
999+
for (var i = beg; i < length; i++) {
10111000
var item = arr[i];
10121001
var sort = nosqlsortvalue(item[builder.$sort.name], b, builder.$sort);
1013-
if (sort)
1002+
if (!sort)
10141003
continue;
10151004
for (var j = length - 1; j > i; j--)
10161005
arr[j] = arr[j - 1];
10171006
arr[i] = doc;
10181007
return;
10191008
}
1009+
10201010
}
10211011

10221012
Database.prototype.$reader2_inmemory = function(name, items, callback) {

test/databases/pages.nosql

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,20 @@
1-
{"name":"b"}
2-
{"name":"g"}
3-
{"name":"h"}
1+
{"name":"o"}
2+
{"name":"s"}
43
{"name":"e"}
4+
{"name":"k"}
5+
{"name":"u"}
6+
{"name":"d"}
7+
{"name":"r"}
8+
{"name":"l"}
59
{"name":"f"}
10+
{"name":"t"}
11+
{"name":"i"}
12+
{"name":"h"}
13+
{"name":"b"}
14+
{"name":"n"}
15+
{"name":"g"}
16+
{"name":"m"}
617
{"name":"c"}
7-
{"name":"d"}
18+
{"name":"j"}
819
{"name":"a"}
20+
{"name":"p"}

test/test-tmp.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
require('../index');
22

33
var filter = NOSQL('pages').find();
4-
var page = 0;
4+
var page = 2;
55

66
filter.take(4);
77
filter.skip(page * 4);
88

99
filter.fields('name');
10-
filter.sort('name');
10+
filter.sort('name', true);
1111

12-
filter.callback(function(err, docs, count) {
13-
var a = []
12+
filter.callback(function(err, docs) {
13+
var a = [];
1414
docs.forEach(function(b) {
1515
a.push(b.name);
1616
});

0 commit comments

Comments
 (0)