[#128,misc][s]: final wiring up to have everything working again -- fixes #128.

This commit is contained in:
Rufus Pollock
2012-05-26 18:26:47 +01:00
parent feaaf78639
commit 72ed877ae2
3 changed files with 97 additions and 171 deletions

View File

@@ -157,7 +157,7 @@
<select name="backend_type"> <select name="backend_type">
<option value="csv">CSV</option> <option value="csv">CSV</option>
<option vlaue="excel">Excel</option> <option vlaue="excel">Excel</option>
<option value="gdoc">Google Spreadsheet</option> <option value="gdocs">Google Spreadsheet</option>
<option value="elasticsearch">ElasticSearch</option> <option value="elasticsearch">ElasticSearch</option>
</select> </select>
</div> </div>

View File

@@ -6,15 +6,10 @@
this.recline = this.recline || {}; this.recline = this.recline || {};
this.recline.Backend = this.recline.Backend || {}; this.recline.Backend = this.recline.Backend || {};
(function($, my) { // ## recline.Backend.Base
// ## recline.Backend.Base //
// // Exemplar 'class' for backends showing what a base class would look like.
// Base class for backends providing a template and convenience functions. this.recline.Backend.Base = function() {
// You do not have to inherit from this class but even when not it does
// provide guidance on the functions you must implement.
//
// Note also that while this (and other Backends) are implemented as Backbone models this is just a convenience.
my.Base = Backbone.Model.extend({
// ### __type__ // ### __type__
// //
// 'type' of this backend. This should be either the class path for this // 'type' of this backend. This should be either the class path for this
@@ -23,14 +18,13 @@ this.recline.Backend = this.recline.Backend || {};
// //
// This value is used as an identifier for this backend when initializing // This value is used as an identifier for this backend when initializing
// backends (see recline.Model.Dataset.initialize). // backends (see recline.Model.Dataset.initialize).
__type__: 'base', this.__type__ = 'base';
// ### readonly // ### readonly
// //
// Class level attribute indicating that this backend is read-only (that // Class level attribute indicating that this backend is read-only (that
// is, cannot be written to). // is, cannot be written to).
readonly: true, this.readonly = true;
// ### sync // ### sync
// //
@@ -45,7 +39,7 @@ this.recline.Backend = this.recline.Backend || {};
// For backends supporting write operations you must implement update and delete support for Document objects. // For backends supporting write operations you must implement update and delete support for Document objects.
// //
// All code paths should return an object conforming to the jquery promise API. // All code paths should return an object conforming to the jquery promise API.
sync: function(method, model, options) { this.sync = function(method, model, options) {
}, },
// ### query // ### query
@@ -89,21 +83,20 @@ this.recline.Backend = this.recline.Backend || {};
// } // }
// } // }
// </pre> // </pre>
query: function(model, queryObj) { this.query = function(model, queryObj) {}
}, };
// ### _makeRequest // ### makeRequest
// //
// Just $.ajax but in any headers in the 'headers' attribute of this // Just $.ajax but in any headers in the 'headers' attribute of this
// Backend instance. Example: // Backend instance. Example:
// //
// <pre> // <pre>
// var jqxhr = this._makeRequest({ // var jqxhr = this._makeRequest({
// url: the-url // url: the-url
// }); // });
// </pre> // </pre>
_makeRequest: function(data) { this.recline.Backend.makeRequest = function(data, headers) {
var headers = this.get('headers');
var extras = {}; var extras = {};
if (headers) { if (headers) {
extras = { extras = {
@@ -116,70 +109,5 @@ this.recline.Backend = this.recline.Backend || {};
} }
var data = _.extend(extras, data); var data = _.extend(extras, data);
return $.ajax(data); return $.ajax(data);
}, };
// convenience method to convert simple set of documents / rows to a QueryResult
_docsToQueryResult: function(rows) {
var hits = _.map(rows, function(row) {
return { _source: row };
});
return {
total: null,
hits: hits
};
},
// ## _wrapInTimeout
//
// Convenience method providing a crude way to catch backend errors on JSONP calls.
// Many of backends use JSONP and so will not get error messages and this is
// a crude way to catch those errors.
_wrapInTimeout: function(ourFunction) {
var dfd = $.Deferred();
var timeout = 5000;
var timer = setTimeout(function() {
dfd.reject({
message: 'Request Error: Backend did not respond after ' + (timeout / 1000) + ' seconds'
});
}, timeout);
ourFunction.done(function(arguments) {
clearTimeout(timer);
dfd.resolve(arguments);
})
.fail(function(arguments) {
clearTimeout(timer);
dfd.reject(arguments);
})
;
return dfd.promise();
}
});
// ### makeRequest
//
// Just $.ajax but in any headers in the 'headers' attribute of this
// Backend instance. Example:
//
// <pre>
// var jqxhr = this._makeRequest({
// url: the-url
// });
// </pre>
my.makeRequest = function(data, headers) {
var extras = {};
if (headers) {
extras = {
beforeSend: function(req) {
_.each(headers, function(value, key) {
req.setRequestHeader(key, value);
});
}
};
}
var data = _.extend(extras, data);
return $.ajax(data);
};
}(jQuery, this.recline.Backend));

View File

@@ -44,8 +44,6 @@ my.Dataset = Backbone.Model.extend({
initialize: function(model, backend) { initialize: function(model, backend) {
_.bindAll(this, 'query'); _.bindAll(this, 'query');
this.backend = backend; this.backend = backend;
this.backendType = 'memory';
this.backendURL = null;
if (typeof(backend) === 'string') { if (typeof(backend) === 'string') {
this.backend = this._backendFromString(backend); this.backend = this._backendFromString(backend);
} }
@@ -135,7 +133,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](); backend = new recline.Backend[name].Backbone();
} }
}); });
} }