blob: db4041f9d0d94723001a48ac4fdefa62ca5aab5a [file] [log] [blame]
'use strict';
testCases.push(function (dbType, context) {
describe(dbType + ': test.array.js', function () {
beforeEach(function () {
return context.db.bulkDocs([
{ name: 'James', _id: 'james', favorites: ['Mario', 'Pokemon'], age: 20 },
{ name: 'Mary', _id: 'mary', favorites: ['Pokemon'], age: 21 },
{ name: 'Link', _id: 'link', favorites: ['Zelda', 'Pokemon'], age: 22},
{ name: 'William', _id: 'william', favorites: ['Mario'], age: 23}
]).then(function () {
var index = {
"index": {
"fields": ["name"]
},
"name": "name-index",
"type": "json"
};
return context.db.createIndex(index);
});
});
describe('$in', function () {
it('should return docs match single value in array', function () {
var selector = {
selector: {
favorites: {
$in: ["Mario"]
}
},
};
var db = context.db;
return db.find(selector)
.then(function (resp) {
var docs = resp.docs.map(function (doc) {
delete doc._rev;
return doc;
});
docs.should.deep.equal([
{ name: 'James', _id: 'james', favorites: ['Mario', 'Pokemon'], age: 20},
{ name: 'William', _id: 'william', favorites: ['Mario'], age: 23 }
]);
return db.explain(selector);
})
.then(function (resp) {
resp.index.name.should.deep.equal('_all_docs');
});
});
it('should use name index', function () {
var db = context.db;
var selector = {
selector: {
name: {
$in: ['James', 'Link']
},
age: {
$gt: 21
}
},
};
return db.explain(selector)
.then(function (resp) {
resp.index.name.should.deep.equal('name-index');
return db.find(selector);
}).then(function (resp) {
var docs = resp.docs.map(function (doc) {
delete doc._rev;
return doc;
});
docs.should.deep.equal([
{ name: 'Link', _id: 'link', favorites: ['Zelda', 'Pokemon'], age: 22},
]);
});
});
it('should return docs match single value in array with defined index', function () {
var db = context.db;
var index = {
"index": {
"fields": ["name", "favorites"]
},
"type": "json"
};
return db.createIndex(index)
.then(function () {
return db.find({
selector: {
name: {
$eq: 'James'
},
favorites: {
$in: ["Mario"]
}
},
});
}).then(function (resp) {
var docs = resp.docs.map(function (doc) {
delete doc._rev;
return doc;
});
docs.should.deep.equal([
{ name: 'James', _id: 'james', favorites: ['Mario', 'Pokemon'], age: 20}
]);
});
});
it('should return docs match single field that is not an array', function () {
var db = context.db;
return db.find({
selector: {
_id: {
$gt: 'a'
},
name: {
$in: ['James', 'William']
}
},
}).then(function (resp) {
var docs = resp.docs.map(function (doc) {
delete doc._rev;
return doc;
});
docs.should.deep.equal([
{ name: 'James', _id: 'james', favorites: ['Mario', 'Pokemon'], age: 20 },
{ name: 'William', _id: 'william', favorites: ['Mario'], age: 23 }
]);
});
});
it('should return docs match single field that is not an array and number', function () {
var db = context.db;
return db.find({
selector: {
age: {
$in: [20, 23]
}
},
}).then(function (resp) {
var docs = resp.docs.map(function (doc) {
delete doc._rev;
return doc;
});
docs.should.deep.equal([
{ name: 'James', _id: 'james', favorites: ['Mario', 'Pokemon'], age: 20 },
{ name: 'William', _id: 'william', favorites: ['Mario'], age: 23 }
]);
});
});
it('should return docs match two values in array', function () {
var db = context.db;
return db.find({
selector: {
favorites: {
$in: ["Mario", "Zelda"]
}
},
}).then(function (resp) {
var docs = resp.docs.map(function (doc) {
delete doc._rev;
return doc;
});
docs.should.deep.equal([
{ name: 'James', _id: 'james', favorites: ['Mario', 'Pokemon'], age: 20 },
{ name: 'Link', _id: 'link', favorites: ['Zelda', 'Pokemon'], age: 22},
{ name: 'William', _id: 'william', favorites: ['Mario'], age: 23 }
]);
});
});
it('should return no docs for no $in match', function () {
var db = context.db;
return db.find({
selector: {
favorites: {
$in: ["TMNT"]
}
},
}).then(function (resp) {
resp.docs.should.have.length(0);
});
});
});
describe('$all', function () {
it('should return docs that match single value in $all array', function () {
var db = context.db;
return db.find({
selector: {
favorites: {
$all: ["Mario"]
}
},
}).then(function (resp) {
var docs = resp.docs.map(function (doc) {
delete doc._rev;
return doc;
});
docs.should.deep.equal([
{ name: 'James', _id: 'james', favorites: ['Mario', 'Pokemon'], age: 20},
{ name: 'William', _id: 'william', favorites: ['Mario'], age: 23}
]);
});
});
it('should return docs match two values in $all array', function () {
var db = context.db;
return db.find({
selector: {
favorites: {
$all: ['Mario', 'Pokemon']
}
},
}).then(function (resp) {
var docs = resp.docs.map(function (doc) {
delete doc._rev;
return doc;
});
docs.should.deep.equal([
{ name: 'James', _id: 'james', favorites: ['Mario', 'Pokemon'], age: 20},
]);
});
});
it('should return no docs for no match for $all', function () {
var db = context.db;
return db.find({
selector: {
favorites: {
$all: ["Mario", "Zelda"]
}
},
}).then(function (resp) {
resp.docs.should.have.length(0);
});
});
});
describe('$size', function () {
it('should return docs with array length 1', function () {
var db = context.db;
return db.find({
selector: {
favorites: {
$size: 1
}
},
}).then(function (resp) {
var docs = resp.docs.map(function (doc) {
delete doc._rev;
return doc;
});
docs.should.deep.equal([
{ name: 'Mary', _id: 'mary', favorites: ['Pokemon'], age: 21 },
{ name: 'William', _id: 'william', favorites: ['Mario'], age: 23 }
]);
});
});
it('should return docs array length 2', function () {
var db = context.db;
return db.find({
selector: {
favorites: {
$size: 2
}
},
}).then(function (resp) {
var docs = resp.docs.map(function (doc) {
delete doc._rev;
return doc;
});
docs.should.deep.equal([
{ name: 'James', _id: 'james', favorites: ['Mario', 'Pokemon'], age: 20 },
{ name: 'Link', _id: 'link', favorites: ['Zelda', 'Pokemon'], age: 22 },
]);
});
});
it('should return no docs for length 5', function () {
var db = context.db;
return db.find({
selector: {
favorites: {
$size: 5
}
},
}).then(function (resp) {
resp.docs.should.have.length(0);
});
});
});
describe('$nin', function () {
it('should return docs match single value $nin array', function () {
var db = context.db;
return db.find({
selector: {
favorites: {
$nin: ["Mario"]
}
},
}).then(function (resp) {
var docs = resp.docs.map(function (doc) {
delete doc._rev;
return doc;
});
docs.should.deep.equal([
{ name: 'Link', _id: 'link', favorites: ['Zelda', 'Pokemon'], age: 22},
{ name: 'Mary', _id: 'mary', favorites: ['Pokemon'], age: 21 },
]);
});
});
it('should return docs that do not match single field that is not an array', function () {
var db = context.db;
return db.find({
selector: {
name: {
$nin: ['James', 'William']
}
},
}).then(function (resp) {
var docs = resp.docs.map(function (doc) {
delete doc._rev;
return doc;
});
docs.should.deep.equal([
{ name: 'Link', _id: 'link', favorites: ['Zelda', 'Pokemon'], age: 22},
{ name: 'Mary', _id: 'mary', favorites: ['Pokemon'], age: 21 },
]);
});
});
it('should return docs with single field that is not an array and number', function () {
var db = context.db;
return db.find({
selector: {
age: {
$nin: [20, 23]
}
},
}).then(function (resp) {
var docs = resp.docs.map(function (doc) {
delete doc._rev;
return doc;
});
docs.should.deep.equal([
{ name: 'Link', _id: 'link', favorites: ['Zelda', 'Pokemon'], age: 22},
{ name: 'Mary', _id: 'mary', favorites: ['Pokemon'], age: 21 },
]);
});
});
it('should return docs that do not match two values $nin array', function () {
var db = context.db;
return db.find({
selector: {
favorites: {
$nin: ["Pokemon", "Zelda"]
}
},
}).then(function (resp) {
var docs = resp.docs.map(function (doc) {
delete doc._rev;
return doc;
});
docs.should.deep.equal([
{ name: 'William', _id: 'william', favorites: ['Mario'], age: 23 }
]);
});
});
it('should return all docs for no match for $nin', function () {
var db = context.db;
return db.find({
selector: {
favorites: {
$nin: ["TMNT"]
}
},
}).then(function (resp) {
resp.docs.should.have.length(4);
});
});
it('should work for _id field', function () {
var db = context.db;
return db.find({
selector: {
_id: {
$nin: ['james', 'mary']
}
},
fields: ["_id"]
}).then(function (resp) {
resp.docs.should.deep.equal([
{_id: 'link'},
{_id: 'william'},
]);
});
});
it('$nin work with complex array #6280', function () {
var db = context.db;
return context.db.bulkDocs([
{
_id: 'smith',
lastName: 'Smith',
absents: ['10/10/15', '10/10/16'],
year: 2016,
type: 'person'
},
{
_id: 'roberts',
lastName: 'Roberts',
absents: ['10/10/10', '10/10/16'],
year: 2017,
type: 'person'
},
{
_id: 'jones',
lastName: 'Jones',
absents: ['10/10/12', '10/10/20'],
year: 2013,
type: 'person'
}
])
.then(function () {
return db.createIndex({
index: {
fields: ['lastName','absents','year','type'],
name: 'myIndex',
ddoc: 'myIndex'
}
});
})
.then(function () {
return db.find({
selector: {
lastName: {$gt: null},
year: {$gt: null},
type: 'person',
absents: {
$nin: ['10/10/15']
}
},
fields: ["_id"]
});
})
.then(function (resp) {
resp.docs.should.deep.equal([
{_id: 'jones'},
{_id: 'roberts'},
]);
});
});
});
describe("$allMatch", function () {
it("returns zero docs for field that is not an array", function () {
var db = context.db;
return db.find({
selector: {
name: {
$allMatch: {
_id: "mary"
}
}
}
})
.then(function (resp) {
resp.docs.length.should.equal(0);
});
});
//CouchDB is returing a different result
it.skip("returns false if field isn't in doc", function () {
var docs = [
{
"user_id": "a",
"bang": []
}
];
var db = context.db;
return db.bulkDocs(docs)
.then(function () {
return db.find({
selector: {
bang: {
"$allMatch": {
"$eq": "Pokemon",
}
}
}
});
})
.then(function (resp) {
resp.docs.length.should.equal(0);
});
});
it("matches against array", function () {
var db = context.db;
return db.find({
selector: {
favorites: {
$allMatch: {
$eq: "Pokemon"
}
}
},
fields: ["_id"]
})
.then(function (resp) {
resp.docs.should.deep.equal([
{_id: 'mary'},
]);
});
});
it("works with object array", function () {
var docs = [
{
"user_id": "a",
"bang": [
{
"foo": 1,
"bar": 2
},
{
"foo": 3,
"bar": 4
}
]
},
{
"user_id": "b",
"bang": [
{
"foo": 1,
"bar": 2
},
{
"foo": 4,
"bar": 4
}
]
}
];
var db = context.db;
return db.bulkDocs(docs)
.then(function () {
return db.find({
selector: {
bang: {
"$allMatch": {
"foo": {"$mod": [2,1]},
"bar": {"$mod": [2,0]}
}
}
},
fields: ["user_id"]
});
})
.then(function (resp) {
resp.docs.should.deep.equal([
{user_id: "a"}
]);
});
});
});
});
});