[#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:
30
src/model.js
30
src/model.js
@@ -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 id="record">A Record</a>
|
||||||
//
|
//
|
||||||
// A single record (or row) in the dataset
|
// A single record (or row) in the dataset
|
||||||
|
|||||||
@@ -345,6 +345,7 @@ my.MultiView = Backbone.View.extend({
|
|||||||
'view-graph': graphState,
|
'view-graph': graphState,
|
||||||
backend: this.model.backend.__type__,
|
backend: this.model.backend.__type__,
|
||||||
url: this.model.get('url'),
|
url: this.model.get('url'),
|
||||||
|
dataset: this.model.toJSON(),
|
||||||
currentView: null,
|
currentView: null,
|
||||||
readOnly: false
|
readOnly: false
|
||||||
},
|
},
|
||||||
@@ -437,8 +438,33 @@ my.MultiView = Backbone.View.extend({
|
|||||||
// ### MultiView.restore
|
// ### MultiView.restore
|
||||||
//
|
//
|
||||||
// Restore a MultiView instance from a serialized state including the associated dataset
|
// 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) {
|
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({
|
var explorer = new my.MultiView({
|
||||||
model: dataset,
|
model: dataset,
|
||||||
state: state
|
state: state
|
||||||
@@ -446,7 +472,6 @@ my.MultiView.restore = function(state) {
|
|||||||
return explorer;
|
return explorer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ## Miscellaneous Utilities
|
// ## Miscellaneous Utilities
|
||||||
var urlPathRegex = /^([^?]+)(\?.*)?/;
|
var urlPathRegex = /^([^?]+)(\?.*)?/;
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ test('get State', function () {
|
|||||||
equal(state.get('query').size, 100);
|
equal(state.get('query').size, 100);
|
||||||
deepEqual(state.get('view-graph').group, null);
|
deepEqual(state.get('view-graph').group, null);
|
||||||
equal(state.get('backend'), 'memory');
|
equal(state.get('backend'), 'memory');
|
||||||
|
equal(state.get('dataset').url, 'xyz');
|
||||||
ok(state.get('url') === url);
|
ok(state.get('url') === url);
|
||||||
$el.remove();
|
$el.remove();
|
||||||
});
|
});
|
||||||
@@ -78,8 +79,22 @@ test('restore (from serialized state)', function() {
|
|||||||
});
|
});
|
||||||
var state = explorer.state.toJSON();
|
var state = explorer.state.toJSON();
|
||||||
var explorerNew = recline.View.MultiView.restore(state);
|
var explorerNew = recline.View.MultiView.restore(state);
|
||||||
|
equal(explorerNew.model.get('backend'), 'memory');
|
||||||
var out = explorerNew.state.toJSON();
|
var out = explorerNew.state.toJSON();
|
||||||
equal(out.backend, state.backend);
|
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);
|
})(this.jQuery);
|
||||||
|
|||||||
Reference in New Issue
Block a user