[#196,bugfix][s]: add back in support for serializing *all* dataset info into state object (and restoring from it) - fixes #196.

* Also minor refactor move dataset restore functionality into multiview (it makes more sense as it is multiview which does the serializing in the first place)
* Improved tests for this!
This commit is contained in:
Rufus Pollock 2012-08-16 14:28:44 +01:00
parent 211fe9d3ec
commit 70c2676fc0
3 changed files with 42 additions and 32 deletions

View File

@ -291,36 +291,6 @@ my.Dataset = Backbone.Model.extend({
});
// ### Dataset.restore
//
// Restore a Dataset instance from a serialized state. Serialized state for a
// Dataset is an Object like:
//
// <pre>
// {
// backend: {backend type - i.e. value of dataset.backend.__type__}
// dataset: {dataset info needed for loading -- result of dataset.toJSON() would be sufficient but can be simpler }
// // convenience - if url provided and dataste not this be used as dataset url
// url: {dataset url}
// ...
// }
my.Dataset.restore = function(state) {
var dataset = null;
// hack-y - restoring a memory dataset does not mean much ...
if (state.backend === 'memory') {
var datasetInfo = {
records: [{stub: 'this is a stub dataset because we do not restore memory datasets'}]
};
} else {
var datasetInfo = {
url: state.url,
backend: state.backend
};
}
dataset = new recline.Model.Dataset(datasetInfo);
return dataset;
};
// ## <a id="record">A Record</a>
//
// A single record (or row) in the dataset

View File

@ -345,6 +345,7 @@ my.MultiView = Backbone.View.extend({
'view-graph': graphState,
backend: this.model.backend.__type__,
url: this.model.get('url'),
dataset: this.model.toJSON(),
currentView: null,
readOnly: false
},
@ -437,8 +438,33 @@ my.MultiView = Backbone.View.extend({
// ### MultiView.restore
//
// Restore a MultiView instance from a serialized state including the associated dataset
//
// This inverts the state serialization process in Multiview
my.MultiView.restore = function(state) {
var dataset = recline.Model.Dataset.restore(state);
// <pre>
// {
// backend: {backend type - i.e. value of dataset.backend.__type__}
// dataset: {dataset info needed for loading -- result of dataset.toJSON() would be sufficient but can be simpler }
// // convenience - if url provided and dataste not this be used as dataset url
// url: {dataset url}
// ...
// }
var dataset = null;
// hack-y - restoring a memory dataset does not mean much ... (but useful for testing!)
if (state.backend === 'memory') {
var datasetInfo = {
backend: 'memory',
records: [{stub: 'this is a stub dataset because we do not restore memory datasets'}]
};
} else {
var datasetInfo = _.extend({
url: state.url,
backend: state.backend
},
state.dataset
);
}
dataset = new recline.Model.Dataset(datasetInfo);
var explorer = new my.MultiView({
model: dataset,
state: state
@ -446,7 +472,6 @@ my.MultiView.restore = function(state) {
return explorer;
}
// ## Miscellaneous Utilities
var urlPathRegex = /^([^?]+)(\?.*)?/;

View File

@ -32,6 +32,7 @@ test('get State', function () {
equal(state.get('query').size, 100);
deepEqual(state.get('view-graph').group, null);
equal(state.get('backend'), 'memory');
equal(state.get('dataset').url, 'xyz');
ok(state.get('url') === url);
$el.remove();
});
@ -78,8 +79,22 @@ test('restore (from serialized state)', function() {
});
var state = explorer.state.toJSON();
var explorerNew = recline.View.MultiView.restore(state);
equal(explorerNew.model.get('backend'), 'memory');
var out = explorerNew.state.toJSON();
equal(out.backend, state.backend);
var dataset = new recline.Model.Dataset({
url: 'http://data.london.gov.uk/datafiles/transport/tfl_passengers.csv',
format: 'csv',
backend: 'dataproxy'
});
var explorer = new recline.View.MultiView({
model: dataset,
});
var state = explorer.state.toJSON();
var explorerNew = recline.View.MultiView.restore(state);
equal(explorerNew.model.get('backend'), 'dataproxy');
equal(explorerNew.model.get('format'), 'csv');
});
})(this.jQuery);