Simple range filter added to Memory backend

This commit is contained in:
Krzysztof Trzewiczek 2012-08-08 17:44:47 +02:00
parent 51c81a5a7e
commit d445629318
3 changed files with 62 additions and 17 deletions

View File

@ -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;

View File

@ -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',

View File

@ -16,6 +16,7 @@ my.FilterEditor = Backbone.View.extend({
<label>Filter type</label> \
<select class="filterType"> \
<option value="term">Term (text)</option> \
<option value="range">Range</option> \
<option value="geo_distance">Geo distance</option> \
</select> \
<label>Field</label> \
@ -49,6 +50,20 @@ my.FilterEditor = Backbone.View.extend({
</fieldset> \
</div> \
',
range: ' \
<div class="filter-{{type}} filter"> \
<fieldset> \
<legend> \
{{field}} <small>{{type}}</small> \
<a class="js-remove-filter" href="#" title="Remove this filter">&times;</a> \
</legend> \
<label class="control-label" for="">From</label> \
<input type="text" value="{{start}}" name="start" data-filter-field="{{field}}" data-filter-id="{{id}}" data-filter-type="{{type}}" /> \
<label class="control-label" for="">To</label> \
<input type="text" value="{{stop}}" name="stop" data-filter-field="{{field}}" data-filter-id="{{id}}" data-filter-type="{{type}}" /> \
</fieldset> \
</div> \
',
geo_distance: ' \
<div class="filter-{{type}} filter"> \
<fieldset> \
@ -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});