in js/projection/column-queryable.js [19:79]
update: function (options) {
if (Model.__super__.update.call(this, options)) {
var model = this.src.data;
var take = this.get('column.take');
var skip = this.get('column.skip');
var lock = this.get('column.lock') || [];
var filter = this.get('column.filter');
// todo [akamel] consider renaming to column.select
var $in = this.get('column.in');
var select = _.size(model.get('columns')) ? _.map(model.get('columns'), function (i) {
return i.property;
}) : model.get('select');
var unlocked = _.isFunction(filter) ? _.filter($in || select, filter) : ($in || select);
var lookup = model.get('columns');
var set = _.chain(unlocked).difference(lock).value();
var col = set;
if (!_.isNumber(take)) {
take = Number.MAX_VALUE;
}
take = Math.max(take - _.size(lock), 0);
if (_.size(set) < skip) {
skip = 0;
// this.set({ 'columns.skip' : 0 }, { silent : true });
}
// start query
var skipped = _.first(set, skip);
if (skip) {
col = _.rest(set, skip);
}
var remaining = _.rest(col, take);
col = _.union(lock, _.first(col, take));
// end query
_.each(col, function (element) {
if (!lookup[element]) {
lookup[element] = { property: element };
}
lookup[element].$lock = _.contains(lock, element);
});
this.patch({
'select': col,
// todo [akamel] rename to column.in???
// , 'columns.select' : set
'columns.skipped': skipped,
'columns.remaining': remaining,
// , 'columns.count' : _.size(res)
// todo [akamel] do we still need to update skip?
'column.skip': skip,
});
} else {
// todo [akamel] unset our properties only
// this.unset();
}
},