1 | 'use strict';
|
2 |
|
3 | var testUtils = require('../test-utils');
|
4 | var should = testUtils.should;
|
5 |
|
6 | module.exports = function (dbType, context) {
|
7 | describe(dbType + ': Combinational', function () {
|
8 |
|
9 | describe('$or', function () {
|
10 |
|
11 | it('does $or queries', function () {
|
12 | var db = context.db;
|
13 | var index = {
|
14 | "index": {
|
15 | "fields": ["age"]
|
16 | },
|
17 | "name": "age-index",
|
18 | "type": "json"
|
19 | };
|
20 |
|
21 | return db.createIndex(index).then(function () {
|
22 | return db.bulkDocs([
|
23 | { _id: '1', age: 75, name: {first: 'Nancy', surname: 'Sinatra'}},
|
24 | { _id: '2', age: 40, name: {first: 'Eddie', surname: 'Vedder'}},
|
25 | { _id: '3', age: 80, name: {first: 'John', surname: 'Fogerty'}},
|
26 | { _id: '4', age: 76, name: {first: 'Mick', surname: 'Jagger'}},
|
27 | ]);
|
28 | }).then(function () {
|
29 | return db.find({
|
30 | selector: {
|
31 | $and:[
|
32 | {age:{$gte: 75}},
|
33 | {$or: [
|
34 | {"name.first": "Nancy"},
|
35 | {"name.first": "Mick"}
|
36 | ]}
|
37 | ]
|
38 | }
|
39 | });
|
40 | }).then(function (resp) {
|
41 | var docs = resp.docs.map(function (doc) {
|
42 | delete doc._rev;
|
43 | return doc;
|
44 | });
|
45 |
|
46 | docs.should.deep.equal([
|
47 | { _id: '1', age: 75, name: {first: 'Nancy', surname: 'Sinatra'}},
|
48 | { _id: '4', age: 76, name: {first: 'Mick', surname: 'Jagger'}}
|
49 | ]);
|
50 | });
|
51 | });
|
52 |
|
53 | it('does $or queries 2', function () {
|
54 | var db = context.db;
|
55 | var index = {
|
56 | "index": {
|
57 | "fields": ["_id"]
|
58 | },
|
59 | "name": "age-index",
|
60 | "type": "json"
|
61 | };
|
62 |
|
63 | return db.createIndex(index).then(function () {
|
64 | return db.bulkDocs([
|
65 | { _id: '1', age: 75, name: {first: 'Nancy', surname: 'Sinatra'}},
|
66 | { _id: '2', age: 40, name: {first: 'Eddie', surname: 'Vedder'}},
|
67 | { _id: '3', age: 80, name: {first: 'John', surname: 'Fogerty'}},
|
68 | { _id: '4', age: 76, name: {first: 'Mick', surname: 'Jagger'}},
|
69 | { _id: '5', age: 40, name: {first: 'Dave', surname: 'Grohl'}}
|
70 | ]);
|
71 | }).then(function () {
|
72 | return db.find({
|
73 | selector: {
|
74 | $and:[
|
75 | {_id:{$gte: '0'}},
|
76 | {$or: [
|
77 | {"name.first": "Nancy"},
|
78 | {age : {$lte: 40}}
|
79 | ]}
|
80 | ]
|
81 | }
|
82 | });
|
83 | }).then(function (resp) {
|
84 | var docs = resp.docs.map(function (doc) {
|
85 | delete doc._rev;
|
86 | return doc;
|
87 | });
|
88 |
|
89 | docs.should.deep.equal([
|
90 | { _id: '1', age: 75, name: {first: 'Nancy', surname: 'Sinatra'}},
|
91 | { _id: '2', age: 40, name: {first: 'Eddie', surname: 'Vedder'}},
|
92 | { _id: '5', age: 40, name: {first: 'Dave', surname: 'Grohl'}}
|
93 | ]);
|
94 | });
|
95 | });
|
96 |
|
97 | });
|
98 |
|
99 | describe('$nor', function () {
|
100 |
|
101 | it('does $nor queries', function () {
|
102 | var db = context.db;
|
103 | var index = {
|
104 | "index": {
|
105 | "fields": ["age"]
|
106 | },
|
107 | "name": "age-index",
|
108 | "type": "json"
|
109 | };
|
110 |
|
111 | return db.createIndex(index).then(function () {
|
112 | return db.bulkDocs([
|
113 | { _id: '1', age: 75, name: {first: 'Nancy', surname: 'Sinatra'}},
|
114 | { _id: '2', age: 40, name: {first: 'Eddie', surname: 'Vedder'}},
|
115 | { _id: '3', age: 80, name: {first: 'John', surname: 'Fogerty'}},
|
116 | { _id: '4', age: 76, name: {first: 'Mick', surname: 'Jagger'}},
|
117 | ]);
|
118 | }).then(function () {
|
119 | return db.find({
|
120 | selector: {
|
121 | $and:[
|
122 | {age:{$gte: 75}},
|
123 | {$nor: [
|
124 | {"name.first": "Nancy"},
|
125 | {"name.first": "Mick"}
|
126 | ]}
|
127 | ]
|
128 | }
|
129 | });
|
130 | }).then(function (resp) {
|
131 | var docs = resp.docs.map(function (doc) {
|
132 | delete doc._rev;
|
133 | return doc;
|
134 | });
|
135 |
|
136 | docs.should.deep.equal([
|
137 | { _id: '3', age: 80, name: {first: 'John', surname: 'Fogerty'}},
|
138 | ]);
|
139 | });
|
140 | });
|
141 |
|
142 | it('does $nor queries 2', function () {
|
143 | var db = context.db;
|
144 | var index = {
|
145 | "index": {
|
146 | "fields": ["_id"]
|
147 | },
|
148 | "name": "age-index",
|
149 | "type": "json"
|
150 | };
|
151 |
|
152 | return db.createIndex(index).then(function () {
|
153 | return db.bulkDocs([
|
154 | { _id: '1', age: 75, name: {first: 'Nancy', surname: 'Sinatra'}},
|
155 | { _id: '2', age: 40, name: {first: 'Eddie', surname: 'Vedder'}},
|
156 | { _id: '3', age: 80, name: {first: 'John', surname: 'Fogerty'}},
|
157 | { _id: '4', age: 76, name: {first: 'Mick', surname: 'Jagger'}},
|
158 | { _id: '5', age: 40, name: {first: 'Dave', surname: 'Grohl'}}
|
159 | ]);
|
160 | }).then(function () {
|
161 | return db.find({
|
162 | selector: {
|
163 | $and:[
|
164 | {_id:{$lte: '6'}},
|
165 | {$nor: [
|
166 | {"name.first": "Nancy"},
|
167 | {age : {$lte: 40}}
|
168 | ]}
|
169 | ]
|
170 | }
|
171 | });
|
172 | }).then(function (resp) {
|
173 | var docs = resp.docs.map(function (doc) {
|
174 | delete doc._rev;
|
175 | return doc;
|
176 | });
|
177 |
|
178 | docs.should.deep.equal([
|
179 | { _id: '3', age: 80, name: {first: 'John', surname: 'Fogerty'}},
|
180 | { _id: '4', age: 76, name: {first: 'Mick', surname: 'Jagger'}},
|
181 | ]);
|
182 | });
|
183 | });
|
184 |
|
185 | it('handles $or/$nor typos', function () {
|
186 | var db = context.db;
|
187 | var index = {
|
188 | "index": {
|
189 | "fields": ["_id"]
|
190 | },
|
191 | "name": "age-index",
|
192 | "type": "json"
|
193 | };
|
194 |
|
195 | return db.createIndex(index).then(function () {
|
196 | return db.bulkDocs([
|
197 | { _id: '1', age: 75, name: {first: 'Nancy', surname: 'Sinatra'}},
|
198 | { _id: '2', age: 40, name: {first: 'Eddie', surname: 'Vedder'}},
|
199 | { _id: '3', age: 80, name: {first: 'John', surname: 'Fogerty'}},
|
200 | { _id: '4', age: 76, name: {first: 'Mick', surname: 'Jagger'}},
|
201 | { _id: '5', age: 40, name: {first: 'Dave', surname: 'Grohl'}}
|
202 | ]);
|
203 | }).then(function () {
|
204 | return db.find({
|
205 | selector: {
|
206 | $and:[
|
207 | {_id:{$lte: '6'}},
|
208 | {$noor: [
|
209 | {"name.first": "Nancy"},
|
210 | {age : {$lte: 40}}
|
211 | ]}
|
212 | ]
|
213 | }
|
214 | });
|
215 | }).then(function () {
|
216 | throw new Error('expected an error');
|
217 | }, function (err) {
|
218 | should.exist(err);
|
219 | });
|
220 | });
|
221 |
|
222 | });
|
223 | });
|
224 |
|
225 | };
|