[#61,backend/elasticsearch][m]: create, update and delete support in elasticsearch backend -- fixes #61.

This commit is contained in:
Rufus Pollock 2012-04-22 22:17:47 +01:00
parent d19337eda4
commit 1bf64c5f94
2 changed files with 91 additions and 4 deletions

View File

@ -21,7 +21,7 @@ this.recline.Backend = this.recline.Backend || {};
// <pre>http://localhost:9200/twitter/tweet</pre>
my.ElasticSearch = my.Base.extend({
__type__: 'elasticsearch',
readonly: true,
readonly: false,
_getESUrl: function(dataset) {
var out = dataset.get('elasticsearch_url');
if (out) return out;
@ -55,9 +55,36 @@ this.recline.Backend = this.recline.Backend || {};
dfd.reject(arguments);
});
return dfd.promise();
} else if (model.__type__ == 'Document') {
var base = this._getESUrl(model.dataset) + '/' + model.id;
return $.ajax({
url: base,
dataType: 'json'
});
}
} else if (method === 'update') {
if (model.__type__ == 'Document') {
var data = JSON.stringify(model.toJSON());
var base = this._getESUrl(model.dataset);
if (model.id) {
base += '/' + model.id;
}
return $.ajax({
url: base,
type: 'POST',
data: data,
dataType: 'json'
});
}
} else if (method === 'delete') {
if (model.__type__ == 'Document') {
var base = this._getESUrl(model.dataset) + '/' + model.id;
return $.ajax({
url: base,
type: 'DELETE',
dataType: 'json'
});
}
} else {
alert('This backend currently only supports read operations');
}
},
_normalizeQuery: function(queryObj) {

View File

@ -107,7 +107,7 @@ var sample_data = {
"took": 2
};
test("ElasticSearch", function() {
test("ElasticSearch query", function() {
var backend = new recline.Backend.ElasticSearch();
var dataset = new recline.Model.Dataset({
url: 'https://localhost:9200/my-es-db/my-es-type'
@ -149,4 +149,64 @@ test("ElasticSearch", function() {
$.ajax.restore();
});
test("ElasticSearch write", function() {
var backend = new recline.Backend.ElasticSearch();
var dataset = new recline.Model.Dataset({
url: 'http://localhost:9200/recline-test/es-write'
},
backend
);
stop();
var id = parseInt(Math.random()*100000000).toString();
var doc = new recline.Model.Document({
id: id,
title: 'my title'
});
doc.backend = backend;
doc.dataset = dataset;
dataset.currentDocuments.add(doc);
var jqxhr = doc.save();
jqxhr.done(function(data) {
ok(data.ok);
equal(data._id, id);
equal(data._type, 'es-write');
equal(data._version, 1);
// update
doc.set({title: 'new title'});
var jqxhr = doc.save();
jqxhr.done(function(data) {
equal(data._version, 2);
// delete
var jqxhr = doc.destroy();
jqxhr.done(function(data) {
ok(data.ok);
doc = null;
// try to get ...
var olddoc = new recline.Model.Document({id: id});
equal(olddoc.get('title'), null);
olddoc.dataset = dataset;
olddoc.backend = backend;
var jqxhr = olddoc.fetch();
jqxhr.done(function(data) {
// should not be here
ok(false, 'Should have got 404');
}).error(function(error) {
equal(error.status, 404);
equal(typeof olddoc.get('title'), 'undefined');
start();
});
});
});
}).fail(function(error) {
console.log(error);
ok(false, 'Basic request failed - is ElasticSearch running locally on port 9200 (required for this test!)');
start();
});
});
})(this.jQuery);