From ef1064b8881659cd4f038eea7f5d80eb989ce45f Mon Sep 17 00:00:00 2001 From: kielni Date: Fri, 6 Sep 2013 11:40:31 -0700 Subject: [PATCH 1/3] add method to replace a filter --- src/model.js | 17 +++++++++++++++++ test/model.test.js | 20 ++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/model.js b/src/model.js index 5649b1d8..c18aa2fb 100644 --- a/src/model.js +++ b/src/model.js @@ -510,6 +510,23 @@ my.Query = Backbone.Model.extend({ filters.push(ourfilter); this.trigger('change:filters:new-blank'); }, + replaceFilter: function(filter) { + // delete filter on the same field, then add + var filters = this.get('filters'); + var idx = -1; + _.each(this.get('filters'), function(filter, key, list) { + if (filter.field == filter.field) { + idx = key; + } + }); + // trigger just one event (change:filters:new-blank) instead of one for remove and + // one for add + if (idx >= 0) { + filters.splice(idx, 1); + this.set({filters: filters}); + } + this.addFilter(filter); + }, updateFilter: function(index, value) { }, // ### removeFilter diff --git a/test/model.test.js b/test/model.test.js index 00797ef0..506ef2bd 100644 --- a/test/model.test.js +++ b/test/model.test.js @@ -374,4 +374,24 @@ test('Query.addFilter', function () { deepEqual(exp, query.get('filters')[2]); }); +test('Query.replaceFilter', function () { + var query = new recline.Model.Query(); + query.addFilter({type: 'term', field: 'xyz'}); + var exp = { + field: 'xyz', + type: 'term', + term: '' + }; + deepEqual(query.get('filters')[0], exp); + + query.replaceFilter({type: 'term', field: 'abc'}); + exp = { + field: 'abc', + type: 'term', + term: '' + }; + deepEqual(query.get('filters')[0], exp); + +}); + })(this.jQuery); From 95fab060c3a989bb7b60079918d6dfcc0a9f4e46 Mon Sep 17 00:00:00 2001 From: kielni Date: Fri, 6 Sep 2013 11:58:23 -0700 Subject: [PATCH 2/3] add options to addFacet for size and silent --- src/model.js | 9 +++++++-- test/model.test.js | 6 ++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/model.js b/src/model.js index c18aa2fb..d72bfa8d 100644 --- a/src/model.js +++ b/src/model.js @@ -543,7 +543,7 @@ my.Query = Backbone.Model.extend({ // Add a Facet to this query // // See - addFacet: function(fieldId) { + addFacet: function(fieldId, size, silent) { var facets = this.get('facets'); // Assume id and fieldId should be the same (TODO: this need not be true if we want to add two different type of facets on same field) if (_.contains(_.keys(facets), fieldId)) { @@ -552,8 +552,13 @@ my.Query = Backbone.Model.extend({ facets[fieldId] = { terms: { field: fieldId } }; + if (!_.isUndefined(size)) { + facets[fieldId].terms.size = size; + } this.set({facets: facets}, {silent: true}); - this.trigger('facet:add', this); + if (!silent) { + this.trigger('facet:add', this); + } }, addHistogramFacet: function(fieldId) { var facets = this.get('facets'); diff --git a/test/model.test.js b/test/model.test.js index 506ef2bd..b1ed0744 100644 --- a/test/model.test.js +++ b/test/model.test.js @@ -347,6 +347,12 @@ test('Query', function () { deepEqual({terms: {field: 'xyz'}}, query.get('facets')['xyz']); }); +test('Query.addFacet', function () { + var query = new recline.Model.Query(); + query.addFacet('xyz', 25); + deepEqual({terms: {field: 'xyz', "size": 25}}, query.get('facets')['xyz']); +}); + test('Query.addFilter', function () { var query = new recline.Model.Query(); query.addFilter({type: 'term', field: 'xyz'}); From f7f010ea33186e5c603e9927956dec65b802c5e5 Mon Sep 17 00:00:00 2001 From: kielni Date: Fri, 6 Sep 2013 13:51:17 -0700 Subject: [PATCH 3/3] add new methods for facets: removeFacet, clearFacets, and refreshFacets --- src/model.js | 23 +++++++++++++++++++++++ test/model.test.js | 18 ++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/src/model.js b/src/model.js index d72bfa8d..721a0c42 100644 --- a/src/model.js +++ b/src/model.js @@ -570,7 +570,30 @@ my.Query = Backbone.Model.extend({ }; this.set({facets: facets}, {silent: true}); this.trigger('facet:add', this); + }, + removeFacet: function(fieldId) { + var facets = this.get('facets'); + // Assume id and fieldId should be the same (TODO: this need not be true if we want to add two different type of facets on same field) + if (!_.contains(_.keys(facets), fieldId)) { + return; + } + delete facets[fieldId]; + this.set({facets: facets}, {silent: true}); + this.trigger('facet:remove', this); + }, + clearFacets: function() { + var facets = this.get('facets'); + _.each(_.keys(facets), function(fieldId) { + delete facets[fieldId]; + }); + this.trigger('facet:remove', this); + }, + // trigger a facet add; use this to trigger a single event after adding + // multiple facets + refreshFacets: function() { + this.trigger('facet:add', this); } + }); diff --git a/test/model.test.js b/test/model.test.js index b1ed0744..e052a391 100644 --- a/test/model.test.js +++ b/test/model.test.js @@ -353,6 +353,24 @@ test('Query.addFacet', function () { deepEqual({terms: {field: 'xyz', "size": 25}}, query.get('facets')['xyz']); }); +test('Query.removeFacet', function () { + var query = new recline.Model.Query(); + query.addFacet('xyz'); + deepEqual({terms: {field: 'xyz'}}, query.get('facets')['xyz']); + query.removeFacet('xyz'); + equal(undefined, query.get('facets')['xyz']); +}); + +test('Query.clearFacets', function () { + var query = new recline.Model.Query(); + query.addFacet('abc'); + query.addFacet('xyz'); + deepEqual({terms: {field: 'xyz'}}, query.get('facets')['xyz']); + deepEqual({terms: {field: 'abc'}}, query.get('facets')['abc']); + query.clearFacets(); + deepEqual({}, query.get('facets')); +}); + test('Query.addFilter', function () { var query = new recline.Model.Query(); query.addFilter({type: 'term', field: 'xyz'});