Skip to content

Instantly share code, notes, and snippets.

@huafu
Created October 7, 2014 10:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save huafu/c87892a9db028a8e5997 to your computer and use it in GitHub Desktop.
Save huafu/c87892a9db028a8e5997 to your computer and use it in GitHub Desktop.
Application ficture adapter with queryFixtures implementing limits, order and filters (requires momentjs)
import Ember from 'ember';
import DS from 'ember-data';
function hasOwn(o, p) {
return {}.hasOwnProperty.call(o, p);
}
function castId(r) {
return '' + (r && r instanceof DS.Model ? r.get('id') : r);
}
export default DS.FixtureAdapter.extend({
queryFixtures: function (fixture, query, type) {
var m, q, res, limit, order, offset, self = this;
q = Ember.merge({offset: 0, limit: null, order: []}, query);
limit = q.limit;
delete q.limit;
offset = q.offset;
delete q.offset;
order = q.order.slice();
delete q.order;
res = fixture.filter(function (record) {
for (var key in q) {
if (hasOwn(q, key) && self.compareAttr(q[key], record[key], type, key) !== 0) {
return false;
}
}
return true;
});
if (limit) {
res = res.slice(offset, limit);
}
else {
res = res.slice(offset);
}
if (order.length) {
for (var i = 0; i < order.length; i++) {
if ((m = order[i].match(/^([^:]+):(desc|asc)$/))) {
order[i] = {key: m[1], sortAscending: m[2] !== 'desc'};
}
else {
order[i] = {key: order[i], sortAscending: true};
}
}
res = res.sort(function (item1, item2) {
var d;
for (var j = 0; j < order.length; j++) {
if (order[j].sortAscending) {
d = self.compareAttr(item1[order.key], item2[order.key], type, order.key);
}
else {
d = self.compareAttr(item2[order.key], item1[order.key], type, order.key);
}
if (d !== 0) {
return d;
}
}
return 0;
});
}
return res;
},
compareAttr: function (value1, value2, type, attrName) {
if (attrName === 'id') {
value1 = castId(value1);
value2 = castId(value2);
}
else {
var meta = type.metaForProperty(attrName);
if (meta.isRelationship) {
if (meta.kind === 'belongsTo') {
value1 = castId(value1);
value2 = castId(value2);
}
else {
value1 = (value1 || []).map(castId);
value2 = (value2 || []).map(castId);
}
}
else if (meta.type === 'date') {
value1 = +moment(value1);
value2 = +moment(value2);
}
else if (meta.type === 'number') {
value1 = Number(value1);
value2 = Number(value2);
}
}
return Ember.compare(value1, value2);
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment