Skip to content

Commit

Permalink
added paginate function, fixed sort bug
Browse files Browse the repository at this point in the history
  • Loading branch information
colinskow committed May 25, 2016
1 parent e86fff6 commit 15c9b73
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 25 deletions.
3 changes: 2 additions & 1 deletion gulpfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ var gulp = require('gulp'),

gulp.task('lint', function() {
return gulp.src(['./lib/*.js', './test/*.js', './examples/*.js'])
.pipe(jshint({node: true, browser: true, validthis: true, globals: {Promise: true}}))
.pipe(jshint({node: true, browser: true, validthis: true,
eqnull: true, globals: {Promise: true}}))
.pipe(jshint.reporter(stylish))
.pipe(jshint.reporter('fail'));
});
Expand Down
45 changes: 34 additions & 11 deletions lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ var helpers = require('./helpers');
var collate = require('pouchdb-collate').collate;
var utils = require('pouchdb-find/lib/utils');
var localUtils = require('pouchdb-find/lib/adapters/local/utils');
var getValue = localUtils.getValue;
var massageSelector = localUtils.massageSelector;
var massageSort = localUtils.massageSort;

Expand Down Expand Up @@ -39,23 +40,19 @@ function liveFind(requestDef) {
if(requestDef.selector) {
selector = massageSelector(requestDef.selector);
}
var sort;
var sort, sortFn;
if(requestDef.sort) {
sort = massageSort(requestDef.sort);
sortFn = helpers.createFieldSorter(sort);
}
var skip = requestDef.skip || 0;
var limit = requestDef.limit;
var skip = parseInt(requestDef.skip, 10) || 0;
var limit = parseInt(requestDef.limit, 10) || 0;
var findRequest = {
selector: selector,
sort: sort,
fields: fields
};

var sortFn;
if(sort) {
sortFn = helpers.createFieldSorter(sort);
}

var ready = db.find(findRequest)
.then(function(results) {
results.docs.forEach(function(doc) {
Expand Down Expand Up @@ -95,10 +92,10 @@ function liveFind(requestDef) {
if(!sort) {
return list;
}
return list.sort(sortFn);
return sortList(list);
};


emitter.paginate = paginate;

function changeHandler(change) {
ready.then(function() {
Expand Down Expand Up @@ -226,10 +223,19 @@ function liveFind(requestDef) {
emitter.emit('update', { action: 'UPDATE', id: id, rev: rev, doc: doc }, list);
}

function sortList(list) {
list = list.sort(sortFn);
if (typeof sort[0] !== 'string' &&
getValue(sort[0]) === 'desc') {
list = list.reverse();
}
return list;
}

// Applies sort, skip, and limit to a list
function formatList(list) {
if(sort) {
list = list.sort(sortFn);
list = sortList(list);
}
if(skip || limit) {
if(limit) {
Expand All @@ -241,6 +247,23 @@ function liveFind(requestDef) {
return list;
}

function paginate(options) {
if(!aggregate || !options || typeof options !== 'object') {
return;
}
if(options.skip != null) {
skip = parseInt(options.skip, 10) || 0;
}
if(options.limit != null) {
limit = parseInt(options.limit, 10) || 0;
}
if(options.sort && options.sort instanceof Array) {
sort = massageSort(options.sort);
sortFn = helpers.createFieldSorter(sort);
}
return formatList(docList);
}

return emitter;

}
Expand Down
60 changes: 47 additions & 13 deletions test/live-find.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,7 @@ describe('PouchDB LiveFind', function() {
return watcher4.fetchListUpdates(2);
})
.then(function(aggregates) {
expect(aggregates).to.deep.equal([ ['mario'], ['dk', 'mario'] ]);
expect(aggregates).to.deep.equal([ ['mario'], ['mario', 'dk'] ]);
return Promise.all([
watcher4.fetchListUpdates(2),
db.bulkDocs(smashers2)
Expand All @@ -303,8 +303,8 @@ describe('PouchDB LiveFind', function() {
// Testing add to list
var aggregates = result[0];
expect(aggregates).to.deep.equal([
[ 'dk', 'luigi', 'mario' ],
[ 'dk', 'luigi', 'mario', 'yoshi' ] ]
[ 'mario', 'luigi', 'dk' ],
[ 'yoshi', 'mario', 'luigi', 'dk' ] ]
);
return db.get('luigi');
})
Expand All @@ -317,7 +317,7 @@ describe('PouchDB LiveFind', function() {
})
.then(function(result) {
var aggregates = result[0];
expect(aggregates).to.deep.equal([ [ 'dk', 'mario', 'yoshi' ] ]);
expect(aggregates).to.deep.equal([ [ 'yoshi', 'mario', 'dk' ] ]);
return db.get('yoshi');
})
.then(function(yoshi) {
Expand All @@ -330,7 +330,7 @@ describe('PouchDB LiveFind', function() {
})
.then(function(result) {
var aggregates = result[0];
expect(aggregates).to.deep.equal([ [ 'yoshi', 'dk', 'mario' ] ]);
expect(aggregates).to.deep.equal([ [ 'mario', 'dk', 'yoshi' ] ]);
feed4.cancel();
});
});
Expand Down Expand Up @@ -389,20 +389,50 @@ describe('PouchDB LiveFind', function() {
expect(aggregates).to.deep.equal([
[],
[],
[ 'link' ],
[ 'pikachu', 'link' ],
[ 'puff', 'pikachu', 'link' ],
[ 'mario', 'puff', 'pikachu' ] ]);
[ 'puff' ],
[ 'puff', 'mario' ],
[ 'puff', 'mario', 'dk' ],
[ 'puff', 'mario', 'dk' ] ]);
});
});

it('should have a working custom sort function', function() {
return previous
.then(function() {
var sorted = feed6.sort(smashers1).map(function(item) {
return item._id;
});
expect(sorted).to.deep.equal([ 'falcon', 'dk', 'mario', 'puff', 'pikachu', 'link' ]);
var sorted = feed6.sort(smashers1).map(mapById);
expect(sorted).to.deep.equal([ 'link', 'pikachu', 'puff', 'mario', 'dk', 'falcon' ]);
});
});

it('paginate should set a different sort, skip and limit', function() {
return previous
.then(function() {
var result1 = feed6.paginate({
sort: [{series: 'desc'}, {name: 'desc'}],
skip: 0,
limit: 0
}).map(mapById);
expect(result1).to.deep.equal(['link', 'pikachu', 'puff', 'mario', 'dk', 'falcon']);
var result2 = feed6.paginate({
sort: [{series: 'asc'}, {name: 'asc'}],
skip: 0,
limit: 0
}).map(mapById);
expect(result2).to.deep.equal(['falcon', 'dk', 'mario', 'puff', 'pikachu', 'link']);
var result3 = feed6.paginate({
skip: 2,
limit: 3
}).map(mapById);
expect(result3).to.deep.equal(['mario', 'puff', 'pikachu']);
// Now we'll make sure that updates keep the new pagination
return Promise.all( [
watcher6.fetchListUpdates(1),
db.put({ name: 'Bulbasaur', _id: 'bulb', series: 'Pokemon', debut: 1996 })
]);
})
.then(function(results) {
var update = results[0][0];
expect(update).to.deep.equal(['mario', 'bulb', 'puff']);
feed6.cancel();
});
});
Expand All @@ -429,4 +459,8 @@ function createDB(name) {
return new PouchDB(name, {db: memdown});
}
return new PouchDB(name, {adapter: 'memory'});
}

function mapById(item) {
return item._id;
}

0 comments on commit 15c9b73

Please sign in to comment.