Skip to content

Commit 265e119

Browse files
committed
Adds most code for $and, $all, $not
This implements $and, $all, and $not. Needs more tests and logic for comparisons between these types.
1 parent 926c6df commit 265e119

15 files changed

+150
-33
lines changed

.editorconfig

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,8 @@ end_of_line = LF
44
indent_style = tab
55
trim_trailing_whitespace = false
66
insert_final_newline = true
7+
indent_size = 4
8+
9+
[{*.json,*.yml,*.md}]
10+
indent_style = space
11+
indent_size = 2

can-query-logic-test.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@ require("./src/types/make-real-number-range-inclusive-test");
44
require("./src/types/comparisons-test");
55
require("./src/types/and-or-not-test");
66
require("./src/types/values-or-test");
7+
require("./src/types/basic-query-test");
78
require("./src/types/basic-query-sorting-test");
89
require("./src/types/basic-query-filter-from-test");
910
require("./src/types/basic-query-merge-test");
1011
require("./src/serializers/basic-query-test");
1112
require("./src/serializers/comparisons-test");
1213
require("./src/types/make-maybe-test");
1314
require("./src/types/make-enum-test");
15+
require("./src/types/values-and-test");
1416
require("./compat/compat-test");
1517
require("./test/special-comparison-logic-test");
1618
require("./test/make-enum-logic-test");

package.json

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,6 @@
2929
"donejs-plugin"
3030
],
3131
"steal": {
32-
"configDependencies": [
33-
"live-reload"
34-
],
3532
"npmIgnore": [
3633
"testee",
3734
"generator-donejs",

src/serializers/basic-query-test.js

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ var logicTypes = require("../types/and-or-not");
55
var is = require("../types/comparisons");
66
var makeMaybe = require("../types/make-maybe");
77
var testHelpers = require("can-test-helpers");
8+
var ValuesAnd = require("../types/values-and");
89

910
QUnit.module("can-query-logic/serializers/basic-query");
1011

@@ -246,20 +247,21 @@ QUnit.skip("nested properties within ors", function(){
246247
});
247248
*/
248249

249-
250-
QUnit.test("mongo things", function(assert) {
251-
var query = {
252-
filter: {
250+
QUnit.test("Complex queries with nested $not, $all", function(assert) {
251+
var query = {
252+
filter: {
253253
$and: [
254-
{tags: {$all: ['sbux']}},
255-
{tags: {$not: {$all: ['dfw']}}}
256-
]
254+
{tags: {$all: ['sbux']}},
255+
{tags: {$not: {$all: ['dfw']}}}
256+
]
257257
}
258-
};
258+
};
259259

260-
var converter = makeBasicQueryConvert(EmptySchema);
260+
var converter = makeBasicQueryConvert(EmptySchema);
261+
var basicQuery = converter.hydrate(query);
261262

262-
var basicQuery = converter.hydrate(query);
263+
assert.ok(basicQuery.filter instanceof ValuesAnd);
263264

264-
assert(basicQuery.filter instanceof )
265+
var res = converter.serializer.serialize(basicQuery);
266+
assert.deepEqual(res, query);
265267
});

src/serializers/basic-query.js

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,11 @@ function getSchemaProperties(value) {
2727
}
2828

2929
function hydrateFilter(values, schemaProperties, hydrateUnknown) {
30-
if (values && typeof values === "object" && ("$or" in values)) {
30+
var valuesIsObject = values && typeof values === "object";
31+
if (valuesIsObject && ("$or" in values)) {
3132
return hydrateOrs(values.$or, schemaProperties, hydrateUnknown);
33+
} else if(valuesIsObject && ("$and" in values)) {
34+
return hydrateAnds(values.$and, schemaProperties, hydrateUnknown);
3235
} else {
3336
return hydrateAndValues(values, schemaProperties, hydrateUnknown);
3437
}
@@ -194,6 +197,13 @@ function hydrateOrs(values, schemaProperties, hydrateUnknown) {
194197
return new BasicQuery.Or(comparisons);
195198
}
196199

200+
function hydrateAnds(values, schemaProperties, hydrateUnknown) {
201+
var comparisons = values.map(function(value) {
202+
return hydrateAndValues(value, schemaProperties, hydrateUnknown);
203+
});
204+
return new BasicQuery.And(comparisons);
205+
}
206+
197207
function recursivelyAddOrs(ors, value, serializer, key){
198208
value.orValues().forEach(function(orValue){
199209
if(typeof orValue.orValues === "function") {
@@ -217,6 +227,14 @@ module.exports = function(schema) {
217227
return serializer(value);
218228
});
219229
}],
230+
[BasicQuery.And, function(and, serializer) {
231+
return { $and: and.values.map(function(value) {
232+
return serializer(value);
233+
}) };
234+
}],
235+
[BasicQuery.Not, function(nots, serializer) {
236+
return { $not: serializer(nots.value) };
237+
}],
220238
// this destructures ANDs with OR-like clauses
221239
[BasicQuery.KeysAnd, function(and, serializer) {
222240
var ors = [];
@@ -230,6 +248,7 @@ module.exports = function(schema) {
230248
result[key] = serializer(value);
231249
}
232250
});
251+
233252
if (ors.length) {
234253
if (ors.length === 1) {
235254
return ors[0];

src/serializers/comparisons-test.js

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ QUnit.test("hydrate and serialize with custom types that work with operators", f
3434
});
3535

3636
QUnit.test("unknown hydrator is called in all cases", function(assert) {
37-
3837
var hydrated = [];
3938
var addToHydrated = function(value){
4039
hydrated.push(value);
@@ -48,15 +47,11 @@ QUnit.test("unknown hydrator is called in all cases", function(assert) {
4847
});
4948

5049

51-
QUnit.only("$not and $all can work recursively", function(assert){
52-
50+
QUnit.test("$not and $all can work recursively", function(assert){
5351
// WHat if {$not: 1} //-> is.NotIn([1]) | new is.ValuesNot(new is.In([1]))
5452
var hydrated = comparisons.hydrate( {$not: {$all: ['def']}}, function(value){
5553
return value;
5654
} );
5755

58-
console.log(hydrated);
59-
6056
assert.ok(hydrated instanceof ValuesNot, "is an instance");
61-
62-
})
57+
});

src/serializers/comparisons.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ var is = require("../types/comparisons");
22
var Serializer = require("../serializer");
33
var canReflect = require("can-reflect");
44
var ValuesNot = require("../types/values-not");
5+
var ValuesAnd = require("../types/values-and");
56

67
function makeNew(Constructor) {
78
return function(value){
@@ -58,9 +59,6 @@ hydrateMap["$not"] = function(value, unknownHydrator) {
5859
addHydrateFromValues("$nin", makeNew(is.GreaterThan));
5960

6061

61-
62-
63-
6462
var serializer = new Serializer([
6563
[is.In,function(isIn, serialize){
6664
return isIn.values.length === 1 ?
@@ -81,7 +79,8 @@ var serializer = new Serializer([
8179
canReflect.assignMap(obj, serialize(clause) );
8280
});
8381
return obj;
84-
}]
82+
}],
83+
[is.All, function(all, serialize) { return {$all: serialize(all.values)}}]
8584
/*[is.Or, function(or, serialize){
8685
return {
8786
$or: or.values.map(function(value){

src/types/and-or-not.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
var ValuesOr = require("./values-or");
22
var ValuesNot = require("./values-not");
3+
var ValuesAnd = require("./values-and");
34
var KeysAnd = require("./keys-and");
45

56
module.exports = {
67
KeysAnd: KeysAnd,
78
ValuesOr: ValuesOr,
8-
ValuesNot: ValuesNot
9+
ValuesNot: ValuesNot,
10+
ValuesAnd: ValuesAnd
911
};

src/types/basic-query-test.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
var BasicQuery = require("./basic-query");
2+
var canSymbol = require("can-symbol");
3+
var QUnit = require("steal-qunit");
4+
var KeysAnd = require("./keys-and");
5+
var ValuesAnd = require("./values-and");
6+
7+
QUnit.module("can-query-logic/types/basic-query filterMembersAndGetCount");
8+
9+
QUnit.test("Able to filter on a universal set", function(assert) {
10+
var parent = new BasicQuery({
11+
filter: new KeysAnd({})
12+
})
13+
var bData = [{},{}];
14+
15+
var FooType = function(value) { this.value = value; };
16+
FooType.prototype.isMember = function() {
17+
return true;
18+
};
19+
20+
var root = new BasicQuery({
21+
filter: new ValuesAnd([
22+
new FooType()
23+
])
24+
});
25+
26+
var res = root.filterMembersAndGetCount(bData, parent);
27+
assert.equal(res.count, 2, "got all members");
28+
});

src/types/basic-query.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ var isMemberSymbol = canSymbol.for("can.isMember");
1111
// TYPES FOR FILTERING
1212
var KeysAnd = andOrNot.KeysAnd,
1313
Or = andOrNot.ValuesOr,
14-
Not = andOrNot.ValuesNot;
14+
Not = andOrNot.ValuesNot,
15+
And = andOrNot.ValuesAnd;
1516

1617
// TYPES FOR PAGINATION
1718
var RecordRange = makeRealNumberRangeInclusive(0, Infinity);
@@ -155,6 +156,7 @@ function BasicQuery(query) {
155156
BasicQuery.KeysAnd = KeysAnd;
156157
BasicQuery.Or = Or;
157158
BasicQuery.Not = Not;
159+
BasicQuery.And = And;
158160
BasicQuery.RecordRange = RecordRange;
159161
BasicQuery.makeSort = makeSort;
160162

@@ -170,7 +172,8 @@ canReflect.assignMap(BasicQuery.prototype, {
170172
},
171173
filterMembersAndGetCount: function(bData, parentQuery) {
172174
if (parentQuery) {
173-
if (!set.isSubset(this, parentQuery)) {
175+
if (!set.isEqual(set.UNIVERSAL, parentQuery.filter) &&
176+
!set.isSubset(this, parentQuery)) {
174177
throw new Error("can-query-logic: Unable to get members from a set that is not a superset of the current set.");
175178
}
176179
} else {

0 commit comments

Comments
 (0)