Skip to content

Commit 6f25f16

Browse files
committed
fixes a problem with sorting dates
1 parent 2ac513d commit 6f25f16

File tree

4 files changed

+59
-17
lines changed

4 files changed

+59
-17
lines changed

src/helpers.js

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
var defaultCompare = {
2+
$gt: function(valueA, valueB) {
3+
return valueA > valueB;
4+
},
5+
$lt: function(valueA, valueB) {
6+
return valueA < valueB;
7+
}
8+
};
9+
110
var helpers = {
211
// given two arrays of items, combines and only returns the unique ones
312
uniqueConcat: function(itemsA, itemsB, getId) {
@@ -49,25 +58,30 @@ var helpers = {
4958
return {prop: sortPropValue, desc: false};
5059
}
5160
},
52-
sorter: function (sortPropValue) {
61+
sorter: function (sortPropValue, sorters) {
5362
var data = helpers.sortData(sortPropValue);
63+
var compare;
64+
if(sorters && sorters[data.prop]) {
65+
compare = sorters[data.prop];
66+
} else {
67+
compare = defaultCompare;
68+
}
5469
return function(item1, item2){
5570
var item1Value = item1[data.prop];
5671
var item2Value = item2[data.prop];
5772
var temp;
5873

59-
6074
if(data.desc) {
6175
temp = item1Value;
6276
item1Value = item2Value;
6377
item2Value = temp;
6478
}
6579

66-
if(item1Value < item2Value) {
80+
if( compare.$lt( item1Value, item2Value) ) {
6781
return -1;
6882
}
6983

70-
if(item1Value > item2Value) {
84+
if( compare.$gt( item1Value, item2Value)) {
7185
return 1;
7286
}
7387

src/serializers/basic-query.js

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,25 @@ module.exports = function(schema) {
265265
];
266266

267267

268-
268+
var sorters = {};
269+
canReflect.eachKey(keys, function(schemaProp, key){
270+
271+
sorters[key] = {
272+
// valueA is GT valueB
273+
$gt: function(valueA, valueB) {
274+
var $gt = hydrateAndValue({$gt: valueB}, key, schemaProp, function(){
275+
debugger;
276+
});
277+
return $gt.isMember(valueA);
278+
},
279+
$lt: function( valueA, valueB ){
280+
var $lt = hydrateAndValue({$lt: valueB}, key, schemaProp, function(){
281+
debugger;
282+
});
283+
return $lt.isMember(valueA);
284+
}
285+
};
286+
});
269287

270288

271289
var serializer = new Serializer(serializeMap);
@@ -309,7 +327,7 @@ module.exports = function(schema) {
309327
} else {
310328
query.sort = id;
311329
}
312-
return new BasicQuery(query);
330+
return new BasicQuery(query, sorters);
313331
},
314332
serializer: serializer
315333
};

src/types/basic-query.js

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ var RecordRange = makeRealNumberRangeInclusive(0, Infinity);
1616

1717

1818
// Define the BasicQuery type
19-
function BasicQuery(query) {
19+
function BasicQuery(query, sorters) {
20+
this._sorters = sorters;
2021
assign(this, query);
2122
if (!this.filter) {
2223
this.filter = set.UNIVERSAL;
@@ -43,7 +44,7 @@ canReflect.assignMap(BasicQuery.prototype, {
4344
return this.page.end - this.page.start + 1;
4445
},
4546
sortData: function(data) {
46-
var sort = helpers.sorter(this.sort);
47+
var sort = helpers.sorter(this.sort, this._sorters);
4748
return data.slice(0).sort(sort);
4849
},
4950
filterMembersAndGetCount: function(bData, parentQuery) {
@@ -214,25 +215,22 @@ function metaInformation(queryA, queryB) {
214215
set.defineComparison(BasicQuery, BasicQuery, {
215216
union: function(queryA, queryB) {
216217

217-
var pageIsEqual = set.isEqual(queryA.page, queryB.page);
218-
var pagesAreUniversal = pageIsEqual && set.isEqual(queryA.page, set.UNIVERSAL);
218+
var meta = metaInformation(queryA, queryB);
219+
219220

220221
var filterUnion = set.union(queryA.filter, queryB.filter);
221222

222-
var sortIsEqual = set.isEqual(queryA.sort, queryB.sort);
223-
224-
if (pagesAreUniversal) {
223+
if (meta.pagesAreUniversal) {
225224
// We ignore the sort.
226225
return new BasicQuery({
227226
filter: filterUnion,
228-
sort: sortIsEqual ? queryA.sort : undefined
227+
sort: meta.sortIsEqual ? queryA.sort : undefined
229228
});
230229
}
231230

232-
var filterIsEqual = set.isEqual(queryA.filter, queryB.filter);
233231

234-
if (filterIsEqual) {
235-
if (sortIsEqual) {
232+
if (meta.filterIsEqual) {
233+
if (meta.sortIsEqual) {
236234
return new BasicQuery({
237235
filter: queryA.filter,
238236
sort: queryA.sort,

test/special-comparison-logic-test.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,4 +232,16 @@ QUnit.test("value type", function(){
232232
}
233233
);
234234

235+
var result = queryLogic.filterMembers({
236+
sort: "date"
237+
},[
238+
{id: 2, date: new Date(1982,9,20).toString()},
239+
{id: 1, date: new Date(1981,9,20).toString()},
240+
{id: 4, date: new Date(1984,9,20).toString()},
241+
{id: 3, date: new Date(1983,9,20).toString()}
242+
]);
243+
244+
var ids = result.map(function(item){ return item.id});
245+
QUnit.deepEqual(ids,[1,2,3,4], "sorted correctly");
246+
235247
});

0 commit comments

Comments
 (0)