From 64056da3aac28a9aca6b765916af4483951b894b Mon Sep 17 00:00:00 2001 From: Rufus Pollock Date: Tue, 28 Feb 2012 21:08:18 +0000 Subject: [PATCH] [backend/elasticsearch][s]: ES backend supports full text queries and sorting. --- src/backend/elasticsearch.js | 26 +++++++++++++++++++++++++- test/backend.elasticsearch.test.js | 21 +++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) 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": {