Skip to content

Commit 99f3483

Browse files
committed
progress toward adding an and all and not
1 parent cf00ac7 commit 99f3483

File tree

6 files changed

+142
-32
lines changed

6 files changed

+142
-32
lines changed

src/serializers/basic-query-test.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,3 +245,23 @@ QUnit.skip("nested properties within ors", function(){
245245
}), "adds nested ands");
246246
});
247247
*/
248+
249+
250+
QUnit.test("mongo things", function(assert) {
251+
var query = {
252+
filter: {
253+
$and: [
254+
{foo: "bar"},
255+
{zed: "ted "}
256+
]
257+
}
258+
};
259+
260+
var converter = makeBasicQueryConvert(EmptySchema);
261+
262+
var basicQuery = converter.hydrate(query);
263+
264+
var returnedQuery = converter.serializer.serialize(basicQuery);
265+
266+
assert.deepEqual(returnedQuery, query, "got back what we give");
267+
});

src/serializers/comparisons-test.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
var QUnit = require("steal-qunit");
22
var comparisons = require("./comparisons");
33
var canReflect = require("can-reflect");
4+
var is = require("../types/comparisons");
5+
var ValuesNot = require("../types/values-not");
46

57
QUnit.module("can-query-logic/serializers/comparisons");
68

7-
QUnit.test("hydrate and serialize", function(assert) {
9+
QUnit.test("hydrate and serialize with custom types that work with operators", function(assert) {
810
var Type = function(value){
911
this.value = value;
1012
};
@@ -44,3 +46,17 @@ QUnit.test("unknown hydrator is called in all cases", function(assert) {
4446

4547
assert.deepEqual(hydrated, [1,2, "abc","x","y"], "hydrated called with the right stuff");
4648
});
49+
50+
51+
QUnit.only("$not and $all can work recursively", function(assert){
52+
53+
54+
var hydrated = comparisons.hydrate( {$not: {$all: ['def']}}, function(value){
55+
return value;
56+
} );
57+
58+
console.log(hydrated);
59+
60+
assert.ok(hydrated instanceof ValuesNot, "is an instance");
61+
62+
})

src/serializers/comparisons.js

Lines changed: 41 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
var is = require("../types/comparisons");
22
var Serializer = require("../serializer");
33
var canReflect = require("can-reflect");
4+
var ValuesNot = require("../types/values-not");
45

56
function makeNew(Constructor) {
67
return function(value){
@@ -47,6 +48,13 @@ addHydrateFrom("$gte", makeNew(is.GreaterThanEqual));
4748
addHydrateFromValues("$in", makeNew(is.In));
4849
addHydrateFrom("$lt", makeNew(is.LessThan));
4950
addHydrateFrom("$lte", makeNew(is.LessThanEqual));
51+
52+
addHydrateFromValues("$all", makeNew(is.All));
53+
54+
hydrateMap["$not"] = function(value, unknownHydrator) {
55+
return new ValuesNot(hydrateValue(value["$not"], unknownHydrator));
56+
};
57+
5058
addHydrateFromValues("$nin", makeNew(is.GreaterThan));
5159

5260

@@ -83,41 +91,44 @@ var serializer = new Serializer([
8391
}]*/
8492
]);
8593

86-
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-
}
94+
function hydrateValue(value, hydrateUnknown){
95+
if(!hydrateUnknown) {
96+
hydrateUnknown = function(){
97+
throw new Error("can-query-logic doesn't recognize operator: "+JSON.stringify(value));
9298
}
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]
99+
}
100+
if(Array.isArray(value)) {
101+
return new is.In(value.map(function(value){
102+
return hydrateUnknown(value);
103+
}));
104+
}
105+
else if(value && typeof value === "object") {
106+
var keys = Object.keys(value);
107+
var allKeysAreComparisons = keys.every(function(key){
108+
return hydrateMap[key]
109+
});
110+
if(allKeysAreComparisons) {
111+
var andClauses = keys.map(function(key){
112+
var part = {};
113+
part[key] = value[key];
114+
var hydrator = hydrateMap[key];
115+
return hydrator(part, hydrateUnknown);
102116
});
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-
}
117+
if(andClauses.length > 1) {
118+
return new is.And(andClauses);
115119
} else {
116-
return hydrateUnknown(value);
120+
return andClauses[0];
117121
}
118122
} else {
119-
return new is.In([hydrateUnknown(value)]);
123+
return hydrateUnknown(value);
120124
}
121-
},
125+
} else {
126+
return new is.In([hydrateUnknown(value)]);
127+
}
128+
}
129+
130+
module.exports = {
131+
// value - something from a query, for example {$in: [1,2]}
132+
hydrate: hydrateValue,
122133
serializer: serializer
123134
};

src/types/comparisons-test.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
var compare = require("./comparisons");
22
var set = require("../set");
33
var is = compare;
4+
var ValuesNot = require("./values-not");
45

56
QUnit.module("can-query-logic/types/comparisons")
67

@@ -3968,3 +3969,43 @@ QUnit.test("Able to do membership, union, difference with $in", function(assert)
39683969
new is.And([gt1980, lte1990]),
39693970
"difference");*/
39703971
});
3972+
3973+
QUnit.test("All on arrays", function(assert){
3974+
3975+
var arrayHasAbc = new is.All(["abc"]);
3976+
3977+
assert.equal( arrayHasAbc.isMember(["abc"]), true );
3978+
assert.equal( arrayHasAbc.isMember(["abc", "def"]), true );
3979+
assert.equal( arrayHasAbc.isMember(["def"]), false );
3980+
assert.equal( arrayHasAbc.isMember([]), false );
3981+
3982+
var hasAbcAndDef = new is.And([
3983+
new is.All(["abc"]),
3984+
new is.All(["def"])
3985+
]);
3986+
3987+
3988+
assert.equal( hasAbcAndDef.isMember(["abc"]), false );
3989+
assert.equal( hasAbcAndDef.isMember(["abc", "def"]), true );
3990+
assert.equal( hasAbcAndDef.isMember(["def"]), false );
3991+
assert.equal( hasAbcAndDef.isMember([]), false );
3992+
3993+
var hasAbcAndNotDef = new is.And([
3994+
new is.All(["abc"]),
3995+
new ValuesNot( new is.All(["def"]) )
3996+
]);
3997+
3998+
assert.equal( hasAbcAndNotDef.isMember(["abc"]), true );
3999+
assert.equal( hasAbcAndNotDef.isMember(["abc", "def"]), false );
4000+
assert.equal( hasAbcAndNotDef.isMember(["def"]), false );
4001+
assert.equal( hasAbcAndNotDef.isMember([]), false );
4002+
// Future tests
4003+
// arrayHasAbc.isMember(null), false
4004+
//
4005+
// {$all: ["10-20-22"]}.isMember( ["yesterday"])
4006+
// new is.All([new DateStrSet(date1990)]).isMember(new DateStrSet(date1990))
4007+
/*
4008+
*/
4009+
4010+
4011+
})

src/types/comparisons.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,25 @@ var comparisons = {
4545
// These are all value comparisons.
4646
Or: function ValueOr(ors) {
4747
this.values = ors;
48+
},
49+
All: function(values){
50+
this.values = values;
4851
}
4952
};
5053

5154
comparisons.Or.prototype.orValues = function() {
5255
return this.values;
5356
};
5457

58+
comparisons.All.test = function(allValues, recordValues) {
59+
60+
return allValues.every(function(allValue) {
61+
return recordValues.some(function(recordValue){
62+
var values = set.ownAndMemberValue(allValue, recordValue);
63+
return values.own === values.member;
64+
});
65+
});
66+
}
5567

5668
comparisons.In.test = function(values, b) {
5769
return values.some(function(value) {
@@ -115,7 +127,7 @@ function isMemberThatUsesTest(value) {
115127
function isMemberThatUsesTestOnValues(value) {
116128
return this.constructor.test(this.values, value);
117129
}
118-
[comparisons.In, comparisons.NotIn].forEach(function(Type) {
130+
[comparisons.In, comparisons.NotIn, comparisons.All].forEach(function(Type) {
119131
Type.prototype.isMember = isMemberThatUsesTestOnValues;
120132
});
121133

src/types/values-not.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,14 @@ set.defineComparison(Identity, NotIdentity,{
8282
}
8383
});
8484

85+
NotIdentity.prototype.isMember = function(value){
86+
if(this.value && typeof this.value.isMember === "function") {
87+
return !this.value.isMember(value);
88+
} else {
89+
var values = set.ownAndMemberValue(this.value, value)
90+
return values.own !== values.member;
91+
}
92+
93+
}
94+
8595
module.exports = keysLogic.Not = NotIdentity;

0 commit comments

Comments
 (0)