Simple range filter added to Memory backend
This commit is contained in:
parent
51c81a5a7e
commit
d445629318
@ -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;
|
||||
|
||||
@ -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',
|
||||
|
||||
@ -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">×</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});
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user