[be/dataproxy][m]: switch dataproxy to use Memory data store (fixes #164) and switch to new backend / model setup (#162).

This commit is contained in:
Rufus Pollock
2012-06-23 18:00:30 +01:00
parent 7141b7aafd
commit 1ed3b9f423
3 changed files with 82 additions and 97 deletions

View File

@@ -3,51 +3,21 @@ this.recline.Backend = this.recline.Backend || {};
this.recline.Backend.DataProxy = this.recline.Backend.DataProxy || {}; this.recline.Backend.DataProxy = this.recline.Backend.DataProxy || {};
(function($, my) { (function($, my) {
// ## DataProxy Backend my.__type__ = 'dataproxy';
// // URL for the dataproxy
// For connecting to [DataProxy-s](http://github.com/okfn/dataproxy). my.dataproxy_url = 'http://jsonpdataproxy.appspot.com';
//
// When initializing the DataProxy backend you can set the following
// attributes in the options object:
//
// * dataproxy: {url-to-proxy} (optional). Defaults to http://jsonpdataproxy.appspot.com
//
// Datasets using using this backend should set the following attributes:
//
// * url: (required) url-of-data-to-proxy
// * format: (optional) csv | xls (defaults to csv if not specified)
//
// Note that this is a **read-only** backend.
my.Backbone = function(options) {
var self = this;
this.__type__ = 'dataproxy';
this.readonly = true;
this.dataproxy_url = options && options.dataproxy_url ? options.dataproxy_url : 'http://jsonpdataproxy.appspot.com'; // ## load
//
this.sync = function(method, model, options) { // Load data from a URL via the [DataProxy](http://github.com/okfn/dataproxy).
if (method === "read") { my.fetch = function(dataset) {
if (model.__type__ == 'Dataset') {
// Do nothing as we will get fields in query step (and no metadata to
// retrieve)
var dfd = $.Deferred();
dfd.resolve(model);
return dfd.promise();
}
} else {
alert('This backend only supports read operations');
}
};
this.query = function(dataset, queryObj) {
var self = this;
var data = { var data = {
url: dataset.get('url'), url: dataset.get('url'),
'max-results': queryObj.size, 'max-results': dataset.get('size') || dataset.get('rows') || 1000,
type: dataset.get('format') type: dataset.get('format') || ''
}; };
var jqxhr = $.ajax({ var jqxhr = $.ajax({
url: this.dataproxy_url, url: my.dataproxy_url,
data: data, data: data,
dataType: 'jsonp' dataType: 'jsonp'
}); });
@@ -60,38 +30,51 @@ this.recline.Backend.DataProxy = this.recline.Backend.DataProxy || {};
// Rename duplicate fieldIds as each field name needs to be // Rename duplicate fieldIds as each field name needs to be
// unique. // unique.
var seen = {}; var seen = {};
_.map(results.fields, function(fieldId, index) { var fields = _.map(results.fields, function(field, index) {
if (fieldId in seen) { var fieldId = field;
seen[fieldId] += 1; while (fieldId in seen) {
results.fields[index] = fieldId + "("+seen[fieldId]+")"; seen[field] += 1;
} else { fieldId = field + seen[field];
seen[fieldId] = 1;
} }
if (!(field in seen)) {
seen[field] = 0;
}
return { id: fieldId, label: field }
}); });
dataset.fields.reset(_.map(results.fields, function(fieldId) { // data is provided as arrays so need to zip together with fields
return {id: fieldId}; var records = _.map(results.data, function(doc) {
})
);
var _out = _.map(results.data, function(doc) {
var tmp = {}; var tmp = {};
_.each(results.fields, function(key, idx) { _.each(results.fields, function(key, idx) {
tmp[key] = doc[idx]; tmp[key] = doc[idx];
}); });
return tmp; return tmp;
}); });
dfd.resolve({ var store = new recline.Backend.Memory.Store(records, fields);
total: null, dataset._dataCache = store;
hits: _.map(_out, function(row) { dataset.fields.reset(fields);
return { _source: row }; dataset.query();
}) dfd.resolve(dataset);
});
}) })
.fail(function(arguments) { .fail(function(arguments) {
dfd.reject(arguments); dfd.reject(arguments);
}); });
return dfd.promise(); return dfd.promise();
}; };
my.query = function(dataset, queryObj) {
var dfd = $.Deferred();
var results = dataset._dataCache.query(queryObj);
var hits = _.map(results.records, function(row) {
return { _source: row };
});
var out = {
total: results.total,
hits: hits,
facets: results.facets
};
dfd.resolve(out);
return dfd.promise();
}; };
// ## _wrapInTimeout // ## _wrapInTimeout

View File

@@ -179,7 +179,7 @@ my.Dataset = Backbone.Model.extend({
current = current[parts[ii]]; current = current[parts[ii]];
} }
if (current) { if (current) {
return new current(); return current;
} }
// alternatively we just had a simple string // alternatively we just had a simple string
@@ -187,7 +187,7 @@ my.Dataset = Backbone.Model.extend({
if (recline && recline.Backend) { if (recline && recline.Backend) {
_.each(_.keys(recline.Backend), function(name) { _.each(_.keys(recline.Backend), function(name) {
if (name.toLowerCase() === backendString.toLowerCase()) { if (name.toLowerCase() === backendString.toLowerCase()) {
backend = new recline.Backend[name].Backbone(); backend = recline.Backend[name];
} }
}); });
} }

View File

@@ -67,14 +67,13 @@ var dataProxyData = {
test('DataProxy Backend', function() { test('DataProxy Backend', function() {
// needed only if not stubbing // needed only if not stubbing
// stop(); // stop();
var backend = new recline.Backend.DataProxy.Backbone(); var backend = recline.Backend.DataProxy;
ok(backend.readonly);
equal(backend.__type__, 'dataproxy'); equal(backend.__type__, 'dataproxy');
var dataset = new recline.Model.Dataset({ var dataset = new recline.Model.Dataset({
url: 'http://webstore.thedatahub.org/rufuspollock/gold_prices/data.csv' url: 'http://webstore.thedatahub.org/rufuspollock/gold_prices/data.csv'
}, },
backend 'dataproxy'
); );
var stub = sinon.stub($, 'ajax', function(options) { var stub = sinon.stub($, 'ajax', function(options) {
@@ -92,15 +91,18 @@ test('DataProxy Backend', function() {
} }
}); });
dataset.fetch().done(function(dataset) { expect(6);
dataset.query().done(function(docList) { dataset.fetch().then(function() {
deepEqual(['__id__', 'date', 'price'], _.pluck(dataset.fields.toJSON(), 'id')); deepEqual(['__id__', 'date', 'price'], _.pluck(dataset.fields.toJSON(), 'id'));
equal(null, dataset.docCount) equal(10, dataset.docCount)
equal(10, docList.length) equal(dataset.currentRecords.models[0].get('date'), "1950-01");
equal("1950-01", docList.models[0].get('date'));
// needed only if not stubbing // needed only if not stubbing
start(); // start();
}); });
dataset.query({q: '1950-01'}).then(function() {
equal(dataset.docCount, 1);
equal(dataset.currentRecords.models[0].get('price'), '34.73');
}); });
$.ajax.restore(); $.ajax.restore();
}); });