diff --git a/src/backend/elasticsearch.js b/src/backend/elasticsearch.js index 36a7c1a4..7bcd338e 100644 --- a/src/backend/elasticsearch.js +++ b/src/backend/elasticsearch.js @@ -47,9 +47,33 @@ this.recline.Backend = this.recline.Backend || {}; alert('This backend currently only supports read operations'); } }, + _normalizeQuery: function(queryObj) { + if (queryObj.toJSON) { + var out = queryObj.toJSON(); + } else { + var out = _.extend({}, queryObj); + } + if (out.q != undefined && out.q.trim() === '') { + delete out.q; + } + if (!out.q) { + out.query = { + match_all: {} + } + } else { + out.query = { + query_string: { + query: out.q + } + } + delete out.q; + } + return out; + }, query: function(model, queryObj) { + var queryNormalized = this._normalizeQuery(queryObj); + var data = {source: JSON.stringify(queryNormalized)}; var base = this._getESUrl(model); - var data = _.extend({}, queryObj); var jqxhr = $.ajax({ url: base + '/_search', data: data, diff --git a/test/backend.elasticsearch.test.js b/test/backend.elasticsearch.test.js index d3822c16..4fc931cb 100644 --- a/test/backend.elasticsearch.test.js +++ b/test/backend.elasticsearch.test.js @@ -1,6 +1,27 @@ (function ($) { module("Backend ElasticSearch"); +test("ElasticSearch queryNormalize", function() { + var backend = new recline.Backend.ElasticSearch(); + var in_ = new recline.Model.Query(); + in_.set({q: ''}); + var out = backend._normalizeQuery(in_); + equal(out.q, undefined); + deepEqual(out.query.match_all, {}); + + var backend = new recline.Backend.ElasticSearch(); + var in_ = new recline.Model.Query().toJSON(); + in_.q = ''; + var out = backend._normalizeQuery(in_); + equal(out.q, undefined); + deepEqual(out.query.match_all, {}); + + var in_ = new recline.Model.Query().toJSON(); + in_.q = 'abc'; + var out = backend._normalizeQuery(in_); + equal(out.query.query_string.query, 'abc'); +}); + var mapping_data = { "note": { "properties": {