Skip to content

Commit 72403df

Browse files
committed
fixes #19 by making sure hydrate is called within comparisons
1 parent 7931b4d commit 72403df

File tree

4 files changed

+510
-485
lines changed

4 files changed

+510
-485
lines changed

src/serializers/comparisons-test.js

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,42 @@ var canReflect = require("can-reflect");
55
QUnit.module("can-query-logic/serializers/comparisons");
66

77
QUnit.test("hydrate and serialize", function(){
8-
var Type = function(value){
9-
this.value = value;
10-
};
8+
var Type = function(value){
9+
this.value = value;
10+
};
1111

12-
canReflect.assignSymbols(Type.prototype,{
12+
canReflect.assignSymbols(Type.prototype,{
1313
"can.serialize": function(){
1414
return this.value;
1515
}
1616
})
1717

18-
var hydrated = comparisons.hydrate({$in: [1,2]}, function(value){
19-
return new Type(value);
20-
});
18+
var hydrated = comparisons.hydrate({$in: [1,2]}, function(value){
19+
return new Type(value);
20+
});
2121

22-
QUnit.deepEqual(hydrated.values, [
23-
new Type(1),
24-
new Type(2)
25-
], "hydrated");
22+
QUnit.deepEqual(hydrated.values, [
23+
new Type(1),
24+
new Type(2)
25+
], "hydrated");
2626

27-
var serialized = comparisons.serializer.serialize(hydrated);
27+
var serialized = comparisons.serializer.serialize(hydrated);
2828

29-
QUnit.deepEqual(serialized,{
30-
$in: [1,2]
31-
}, "serialized");
29+
QUnit.deepEqual(serialized,{
30+
$in: [1,2]
31+
}, "serialized");
32+
});
33+
34+
QUnit.test("unknown hydrator is called in all cases", function(){
35+
36+
var hydrated = [];
37+
var addToHydrated = function(value){
38+
hydrated.push(value);
39+
}
40+
41+
comparisons.hydrate({$in: [1,2]}, addToHydrated);
42+
comparisons.hydrate("abc", addToHydrated);
43+
comparisons.hydrate(["x","y"], addToHydrated);
44+
45+
QUnit.deepEqual(hydrated, [1,2, "abc","x","y"], "hydrated called with the right stuff");
3246
});

src/serializers/comparisons.js

Lines changed: 82 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -3,43 +3,43 @@ var Serializer = require("../serializer");
33
var canReflect = require("can-reflect");
44

55
function makeNew(Constructor) {
6-
return function(value){
7-
return new Constructor(value);
8-
};
6+
return function(value){
7+
return new Constructor(value);
8+
};
99
}
1010
var hydrateMap = {};
1111
function addHydrateFrom(key, hydrate) {
12-
hydrateMap[key] = function(value, unknownHydrator) {
13-
return hydrate( unknownHydrator ? unknownHydrator(value[key]) : value[key]);
14-
};
15-
Object.defineProperty(hydrateMap[key], "name", {
12+
hydrateMap[key] = function(value, unknownHydrator) {
13+
return hydrate( unknownHydrator ? unknownHydrator(value[key]) : value[key]);
14+
};
15+
Object.defineProperty(hydrateMap[key], "name", {
1616
value: "hydrate "+key,
1717
writable: true
1818
});
1919
}
2020

2121
function addHydrateFromValues(key, hydrate) {
22-
hydrateMap[key] = function(value, unknownHydrator) {
23-
var clones = value[key];
24-
if(unknownHydrator) {
25-
clones = clones.map(function(value){
26-
return unknownHydrator(value);
27-
});
28-
}
29-
return hydrate( clones );
30-
};
31-
Object.defineProperty(hydrateMap[key], "name", {
22+
hydrateMap[key] = function(value, unknownHydrator) {
23+
var clones = value[key];
24+
if(unknownHydrator) {
25+
clones = clones.map(function(value){
26+
return unknownHydrator(value);
27+
});
28+
}
29+
return hydrate( clones );
30+
};
31+
Object.defineProperty(hydrateMap[key], "name", {
3232
value: "hydrate "+key,
3333
writable: true
3434
});
3535
}
3636

3737
// https://docs.mongodb.com/manual/reference/operator/query-comparison/
3838
addHydrateFrom("$eq", function(value){
39-
return new is.In([value]);
39+
return new is.In([value]);
4040
});
4141
addHydrateFrom("$ne", function(value){
42-
return new is.NotIn([value]);
42+
return new is.NotIn([value]);
4343
});
4444

4545
addHydrateFrom("$gt", makeNew(is.GreaterThan));
@@ -54,68 +54,70 @@ addHydrateFromValues("$nin", makeNew(is.GreaterThan));
5454

5555

5656
var serializer = new Serializer([
57-
[is.In,function(isIn, serialize){
58-
return isIn.values.length === 1 ?
59-
serialize(isIn.values[0]) :
60-
{$in: isIn.values.map(serialize)};
61-
}],
62-
[is.NotIn,function(notIn, serialize){
63-
return notIn.values.length === 1 ?
64-
{$ne: serialize(notIn.values[0])} : {$nin: notIn.values.map(serialize)};
65-
}],
66-
[is.GreaterThan, function(gt, serialize){ return {$gt: serialize(gt.value) }; }],
67-
[is.GreaterThanEqual, function(gte, serialize){ return {$gte: serialize(gte.value) }; }],
68-
[is.LessThan, function(lt, serialize){ return {$lt: serialize(lt.value) }; }],
69-
[is.LessThanEqual, function(lt, serialize){ return {$lte: serialize(lt.value) }; }],
70-
[is.And, function(and, serialize){
71-
var obj = {};
72-
and.values.forEach(function(clause){
73-
canReflect.assignMap(obj, serialize(clause) );
74-
});
75-
return obj;
76-
}]
77-
/*[is.Or, function(or, serialize){
78-
return {
79-
$or: or.values.map(function(value){
80-
return serialize(value, serialize);
81-
})
82-
};
83-
}]*/
57+
[is.In,function(isIn, serialize){
58+
return isIn.values.length === 1 ?
59+
serialize(isIn.values[0]) :
60+
{$in: isIn.values.map(serialize)};
61+
}],
62+
[is.NotIn,function(notIn, serialize){
63+
return notIn.values.length === 1 ?
64+
{$ne: serialize(notIn.values[0])} : {$nin: notIn.values.map(serialize)};
65+
}],
66+
[is.GreaterThan, function(gt, serialize){ return {$gt: serialize(gt.value) }; }],
67+
[is.GreaterThanEqual, function(gte, serialize){ return {$gte: serialize(gte.value) }; }],
68+
[is.LessThan, function(lt, serialize){ return {$lt: serialize(lt.value) }; }],
69+
[is.LessThanEqual, function(lt, serialize){ return {$lte: serialize(lt.value) }; }],
70+
[is.And, function(and, serialize){
71+
var obj = {};
72+
and.values.forEach(function(clause){
73+
canReflect.assignMap(obj, serialize(clause) );
74+
});
75+
return obj;
76+
}]
77+
/*[is.Or, function(or, serialize){
78+
return {
79+
$or: or.values.map(function(value){
80+
return serialize(value, serialize);
81+
})
82+
};
83+
}]*/
8484
]);
8585

8686
module.exports = {
87-
hydrate: function(value, hydrateUnknown){
88-
if(!hydrateUnknown) {
89-
hydrateUnknown = function(){
90-
throw new Error("can-query-logic doesn't recognize operator: "+JSON.stringify(value));
91-
}
92-
}
93-
if(Array.isArray(value)) {
94-
return new is.In(value);
95-
}
96-
else if(value && typeof value === "object") {
97-
var keys = Object.keys(value);
98-
var allKeysAreComparisons = keys.every(function(key){
99-
return hydrateMap[key]
100-
})
101-
if(allKeysAreComparisons) {
102-
var andClauses = keys.map(function(key){
103-
var part = {};
104-
part[key] = value[key];
105-
var hydrator = hydrateMap[key];
106-
return hydrator(part, hydrateUnknown);
107-
});
108-
if(andClauses.length > 1) {
109-
return new is.And(andClauses);
110-
} else {
111-
return andClauses[0];
112-
}
113-
} else {
114-
return hydrateUnknown(value);
115-
}
116-
} else {
117-
return new is.In([value]);
118-
}
119-
},
120-
serializer: serializer
87+
hydrate: function(value, hydrateUnknown){
88+
if(!hydrateUnknown) {
89+
hydrateUnknown = function(){
90+
throw new Error("can-query-logic doesn't recognize operator: "+JSON.stringify(value));
91+
}
92+
}
93+
if(Array.isArray(value)) {
94+
return new is.In(value.map(function(value){
95+
return hydrateUnknown(value);
96+
}));
97+
}
98+
else if(value && typeof value === "object") {
99+
var keys = Object.keys(value);
100+
var allKeysAreComparisons = keys.every(function(key){
101+
return hydrateMap[key]
102+
});
103+
if(allKeysAreComparisons) {
104+
var andClauses = keys.map(function(key){
105+
var part = {};
106+
part[key] = value[key];
107+
var hydrator = hydrateMap[key];
108+
return hydrator(part, hydrateUnknown);
109+
});
110+
if(andClauses.length > 1) {
111+
return new is.And(andClauses);
112+
} else {
113+
return andClauses[0];
114+
}
115+
} else {
116+
return hydrateUnknown(value);
117+
}
118+
} else {
119+
return new is.In([hydrateUnknown(value)]);
120+
}
121+
},
122+
serializer: serializer
121123
};

0 commit comments

Comments
 (0)