From 1bf64c5f9475c73ec1d5306731eeb54ae3c0fc5f Mon Sep 17 00:00:00 2001 From: Rufus Pollock Date: Sun, 22 Apr 2012 22:17:47 +0100 Subject: [PATCH] [#61,backend/elasticsearch][m]: create, update and delete support in elasticsearch backend -- fixes #61. --- src/backend/elasticsearch.js | 33 ++++++++++++++-- test/backend.elasticsearch.test.js | 62 +++++++++++++++++++++++++++++- 2 files changed, 91 insertions(+), 4 deletions(-) diff --git a/src/backend/elasticsearch.js b/src/backend/elasticsearch.js index 0ccb5295..03448277 100644 --- a/src/backend/elasticsearch.js +++ b/src/backend/elasticsearch.js @@ -21,7 +21,7 @@ this.recline.Backend = this.recline.Backend || {}; //
http://localhost:9200/twitter/tweet
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) { diff --git a/test/backend.elasticsearch.test.js b/test/backend.elasticsearch.test.js index 0a132d0c..9a0206fc 100644 --- a/test/backend.elasticsearch.test.js +++ b/test/backend.elasticsearch.test.js @@ -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);