[#61,backend/elasticsearch][m]: create, update and delete support in elasticsearch backend -- fixes #61.
This commit is contained in:
@@ -21,7 +21,7 @@ this.recline.Backend = this.recline.Backend || {};
|
|||||||
// <pre>http://localhost:9200/twitter/tweet</pre>
|
// <pre>http://localhost:9200/twitter/tweet</pre>
|
||||||
my.ElasticSearch = my.Base.extend({
|
my.ElasticSearch = my.Base.extend({
|
||||||
__type__: 'elasticsearch',
|
__type__: 'elasticsearch',
|
||||||
readonly: true,
|
readonly: false,
|
||||||
_getESUrl: function(dataset) {
|
_getESUrl: function(dataset) {
|
||||||
var out = dataset.get('elasticsearch_url');
|
var out = dataset.get('elasticsearch_url');
|
||||||
if (out) return out;
|
if (out) return out;
|
||||||
@@ -55,9 +55,36 @@ this.recline.Backend = this.recline.Backend || {};
|
|||||||
dfd.reject(arguments);
|
dfd.reject(arguments);
|
||||||
});
|
});
|
||||||
return dfd.promise();
|
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) {
|
_normalizeQuery: function(queryObj) {
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ var sample_data = {
|
|||||||
"took": 2
|
"took": 2
|
||||||
};
|
};
|
||||||
|
|
||||||
test("ElasticSearch", function() {
|
test("ElasticSearch query", function() {
|
||||||
var backend = new recline.Backend.ElasticSearch();
|
var backend = new recline.Backend.ElasticSearch();
|
||||||
var dataset = new recline.Model.Dataset({
|
var dataset = new recline.Model.Dataset({
|
||||||
url: 'https://localhost:9200/my-es-db/my-es-type'
|
url: 'https://localhost:9200/my-es-db/my-es-type'
|
||||||
@@ -149,4 +149,64 @@ test("ElasticSearch", function() {
|
|||||||
$.ajax.restore();
|
$.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);
|
})(this.jQuery);
|
||||||
|
|||||||
Reference in New Issue
Block a user