Merge branch 'master' into gh-pages
This commit is contained in:
@@ -79,6 +79,19 @@ this.recline.Backend = this.recline.Backend || {};
|
||||
}
|
||||
delete out.q;
|
||||
}
|
||||
// now do filters (note the *plural*)
|
||||
if (out.filters && out.filters.length) {
|
||||
if (!out.filter) {
|
||||
out.filter = {}
|
||||
}
|
||||
if (!out.filter.and) {
|
||||
out.filter.and = [];
|
||||
}
|
||||
out.filter.and = out.filter.and.concat(out.filters);
|
||||
}
|
||||
if (out.filters != undefined) {
|
||||
delete out.filters;
|
||||
}
|
||||
return out;
|
||||
},
|
||||
query: function(model, queryObj) {
|
||||
|
||||
@@ -120,6 +120,12 @@ this.recline.Backend = this.recline.Backend || {};
|
||||
var numRows = queryObj.size;
|
||||
var start = queryObj.from;
|
||||
results = this.datasets[model.id].documents;
|
||||
_.each(queryObj.filters, function(filter) {
|
||||
results = _.filter(results, function(doc) {
|
||||
var fieldId = _.keys(filter.term)[0];
|
||||
return (doc[fieldId] == filter.term[fieldId]);
|
||||
});
|
||||
});
|
||||
// not complete sorting!
|
||||
_.each(queryObj.sort, function(sortObj) {
|
||||
var fieldName = _.keys(sortObj)[0];
|
||||
|
||||
45
src/model.js
45
src/model.js
@@ -131,14 +131,27 @@ my.FieldList = Backbone.Collection.extend({
|
||||
|
||||
// ## A Query object storing Dataset Query state
|
||||
my.Query = Backbone.Model.extend({
|
||||
defaults: {
|
||||
size: 100
|
||||
, from: 0
|
||||
, facets: {}
|
||||
defaults: function() {
|
||||
return {
|
||||
size: 100
|
||||
, from: 0
|
||||
, facets: {}
|
||||
// http://www.elasticsearch.org/guide/reference/query-dsl/and-filter.html
|
||||
// , filter: {}
|
||||
// list of simple filters which will be add to 'add' filter of filter
|
||||
, filters: []
|
||||
}
|
||||
},
|
||||
// Set (update or add) a terms filter
|
||||
// http://www.elasticsearch.org/guide/reference/query-dsl/terms-filter.html
|
||||
setFilter: function(fieldId, values) {
|
||||
addTermFilter: function(fieldId, value) {
|
||||
var filters = this.get('filters');
|
||||
var filter = { term: {} };
|
||||
filter.term[fieldId] = value;
|
||||
filters.push(filter);
|
||||
this.set({filters: filters});
|
||||
// change does not seem to be triggered ...
|
||||
this.trigger('change');
|
||||
},
|
||||
addFacet: function(fieldId) {
|
||||
var facets = this.get('facets');
|
||||
@@ -157,16 +170,18 @@ my.Query = Backbone.Model.extend({
|
||||
|
||||
// ## A Facet (Result)
|
||||
my.Facet = Backbone.Model.extend({
|
||||
defaults: {
|
||||
_type: 'terms',
|
||||
// total number of tokens in the facet
|
||||
total: 0,
|
||||
// number of facet values not included in the returned facets
|
||||
other: 0,
|
||||
// number of documents which have no value for the field
|
||||
missing: 0,
|
||||
// term object ({term: , count: ...})
|
||||
terms: []
|
||||
defaults: function() {
|
||||
return {
|
||||
_type: 'terms',
|
||||
// total number of tokens in the facet
|
||||
total: 0,
|
||||
// number of facet values not included in the returned facets
|
||||
other: 0,
|
||||
// number of documents which have no value for the field
|
||||
missing: 0,
|
||||
// term object ({term: , count: ...})
|
||||
terms: []
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
12
src/view.js
12
src/view.js
@@ -292,7 +292,7 @@ my.FacetViewer = Backbone.View.extend({
|
||||
<a class="btn dropdown-toggle" data-toggle="dropdown" href="#"><i class="icon-chevron-down"></i> {{id}} {{label}}</a> \
|
||||
<ul class="facet-items dropdown-menu"> \
|
||||
{{#terms}} \
|
||||
<li><input type="checkbox" class="facet-choice" value="{{term}}" name="{{term}}" /> <label for="{{term}}">{{term}} ({{count}})</label></li> \
|
||||
<li><input type="checkbox" class="facet-choice js-facet-filter" value="{{term}}" name="{{term}}" /> <label for="{{term}}">{{term}} ({{count}})</label></li> \
|
||||
{{/terms}} \
|
||||
</ul> \
|
||||
</div> \
|
||||
@@ -301,7 +301,8 @@ my.FacetViewer = Backbone.View.extend({
|
||||
',
|
||||
|
||||
events: {
|
||||
'click .js-hide': 'onHide'
|
||||
'click .js-hide': 'onHide',
|
||||
'change .js-facet-filter': 'onFacetFilter'
|
||||
},
|
||||
initialize: function(model) {
|
||||
_.bindAll(this, 'render');
|
||||
@@ -327,6 +328,13 @@ my.FacetViewer = Backbone.View.extend({
|
||||
onHide: function(e) {
|
||||
e.preventDefault();
|
||||
this.el.hide();
|
||||
},
|
||||
onFacetFilter: function(e) {
|
||||
// todo: uncheck
|
||||
var $checkbox = $(e.target);
|
||||
var fieldId = $checkbox.closest('.facet-summary').attr('data-facet');
|
||||
var value = $checkbox.val();
|
||||
this.model.queryState.addTermFilter(fieldId, value);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -20,6 +20,12 @@ test("ElasticSearch queryNormalize", function() {
|
||||
in_.q = 'abc';
|
||||
var out = backend._normalizeQuery(in_);
|
||||
equal(out.query.query_string.query, 'abc');
|
||||
|
||||
var in_ = new recline.Model.Query();
|
||||
in_.addTermFilter('xyz', 'XXX');
|
||||
in_ = in_.toJSON();
|
||||
var out = backend._normalizeQuery(in_);
|
||||
deepEqual(out.filter.and[0], {term: { xyz: 'XXX'}});
|
||||
});
|
||||
|
||||
var mapping_data = {
|
||||
|
||||
@@ -79,7 +79,17 @@ test('Memory Backend: query sort', function () {
|
||||
});
|
||||
});
|
||||
|
||||
test('Memory Backend: filters', function () {
|
||||
var dataset = makeBackendDataset();
|
||||
dataset.queryState.addTermFilter('country', 'UK');
|
||||
dataset.query().then(function() {
|
||||
equal(dataset.currentDocuments.length, 3);
|
||||
deepEqual(dataset.currentDocuments.pluck('country'), ['UK', 'UK', 'UK']);
|
||||
});
|
||||
});
|
||||
|
||||
test('Memory Backend: facet', function () {
|
||||
console.log('here');
|
||||
var dataset = makeBackendDataset();
|
||||
dataset.queryState.addFacet('country');
|
||||
dataset.query().then(function() {
|
||||
|
||||
@@ -69,4 +69,10 @@ test('Query', function () {
|
||||
deepEqual({terms: {field: 'xyz'}}, query.get('facets')['xyz']);
|
||||
});
|
||||
|
||||
test('Query.addFilter', function () {
|
||||
var query = new recline.Model.Query();
|
||||
query.addTermFilter('xyz', 'this-value');
|
||||
deepEqual({term: {xyz: 'this-value'}}, query.get('filters')[0]);
|
||||
});
|
||||
|
||||
})(this.jQuery);
|
||||
|
||||
Reference in New Issue
Block a user