diff --git a/src/backend.memory.js b/src/backend.memory.js index 53556463..b77ac7a8 100644 --- a/src/backend.memory.js +++ b/src/backend.memory.js @@ -63,8 +63,10 @@ this.recline.Backend.Memory = this.recline.Backend.Memory || {}; var numRows = queryObj.size || this.data.length; var start = queryObj.from || 0; var results = this.data; + results = this._applyFilters(results, queryObj); results = this._applyFreeTextQuery(results, queryObj); + // not complete sorting! _.each(queryObj.sort, function(sortObj) { var fieldName = _.keys(sortObj)[0]; @@ -89,11 +91,25 @@ this.recline.Backend.Memory = this.recline.Backend.Memory || {}; // in place filtering this._applyFilters = function(results, queryObj) { _.each(queryObj.filters, function(filter) { - // if a term filter ... - if (filter.type === 'term') { - results = _.filter(results, function(doc) { - return (doc[filter.field] == filter.term); - }); + switch (filter.type) { + case 'term': + results = _.filter(results, function(doc) { + return (doc[filter.field] === filter.term); + }); + break; + case 'range': + results = _.filter(results, function (doc) { + var start = filter.start; + var stop = filter.stop; + var value = doc[filter.field]; + + // implicit string to number casting is done in JS if needed + return (value >= start && value <= stop); + }); + break; + case 'geo_distance': + // TODO code here + break; } }); return results; diff --git a/src/model.js b/src/model.js index 7d9be16f..9d17ba68 100644 --- a/src/model.js +++ b/src/model.js @@ -495,9 +495,15 @@ my.Query = Backbone.Model.extend({ _filterTemplates: { term: { type: 'term', + // TODO do we need this attribute here? field: '', term: '' }, + range: { + type: 'range', + start: '', + stop: '' + }, geo_distance: { distance: 10, unit: 'km', diff --git a/src/widget.filtereditor.js b/src/widget.filtereditor.js index 4ae2eafd..6c7f98c9 100644 --- a/src/widget.filtereditor.js +++ b/src/widget.filtereditor.js @@ -16,6 +16,7 @@ my.FilterEditor = Backbone.View.extend({ \ \ \ @@ -49,6 +50,20 @@ my.FilterEditor = Backbone.View.extend({ \ \ ', + range: ' \ +
\ +
\ + \ + {{field}} {{type}} \ + × \ + \ + \ + \ + \ + \ +
\ +
\ + ', geo_distance: ' \
\
\ @@ -124,19 +139,27 @@ my.FilterEditor = Backbone.View.extend({ var $form = $(e.target); _.each($form.find('input'), function(input) { var $input = $(input); - var filterType = $input.attr('data-filter-type'); - var fieldId = $input.attr('data-filter-field'); + var filterType = $input.attr('data-filter-type'); + var fieldId = $input.attr('data-filter-field'); var filterIndex = parseInt($input.attr('data-filter-id')); - var name = $input.attr('name'); - var value = $input.val(); - if (filterType === 'term') { - filters[filterIndex].term = value; - } else if (filterType === 'geo_distance') { - if (name === 'distance') { - filters[filterIndex].distance = parseFloat(value); - } else { - filters[filterIndex].point[name] = parseFloat(value); - } + var name = $input.attr('name'); + var value = $input.val(); + + switch (filterType) { + case 'term': + filters[filterIndex].term = value; + break; + case 'range': + filters[filterIndex][name] = value; + break; + case 'geo_distance': + if(name === 'distance') { + filters[filterIndex].distance = parseFloat(value); + } + else { + filters[filterIndex].point[name] = parseFloat(value); + } + break; } }); self.model.queryState.set({filters: filters});