Simple range filter added to Memory backend
This commit is contained in:
@@ -63,8 +63,10 @@ this.recline.Backend.Memory = this.recline.Backend.Memory || {};
|
|||||||
var numRows = queryObj.size || this.data.length;
|
var numRows = queryObj.size || this.data.length;
|
||||||
var start = queryObj.from || 0;
|
var start = queryObj.from || 0;
|
||||||
var results = this.data;
|
var results = this.data;
|
||||||
|
|
||||||
results = this._applyFilters(results, queryObj);
|
results = this._applyFilters(results, queryObj);
|
||||||
results = this._applyFreeTextQuery(results, queryObj);
|
results = this._applyFreeTextQuery(results, queryObj);
|
||||||
|
|
||||||
// not complete sorting!
|
// not complete sorting!
|
||||||
_.each(queryObj.sort, function(sortObj) {
|
_.each(queryObj.sort, function(sortObj) {
|
||||||
var fieldName = _.keys(sortObj)[0];
|
var fieldName = _.keys(sortObj)[0];
|
||||||
@@ -89,11 +91,25 @@ this.recline.Backend.Memory = this.recline.Backend.Memory || {};
|
|||||||
// in place filtering
|
// in place filtering
|
||||||
this._applyFilters = function(results, queryObj) {
|
this._applyFilters = function(results, queryObj) {
|
||||||
_.each(queryObj.filters, function(filter) {
|
_.each(queryObj.filters, function(filter) {
|
||||||
// if a term filter ...
|
switch (filter.type) {
|
||||||
if (filter.type === 'term') {
|
case 'term':
|
||||||
results = _.filter(results, function(doc) {
|
results = _.filter(results, function(doc) {
|
||||||
return (doc[filter.field] == filter.term);
|
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;
|
return results;
|
||||||
|
|||||||
@@ -495,9 +495,15 @@ my.Query = Backbone.Model.extend({
|
|||||||
_filterTemplates: {
|
_filterTemplates: {
|
||||||
term: {
|
term: {
|
||||||
type: 'term',
|
type: 'term',
|
||||||
|
// TODO do we need this attribute here?
|
||||||
field: '',
|
field: '',
|
||||||
term: ''
|
term: ''
|
||||||
},
|
},
|
||||||
|
range: {
|
||||||
|
type: 'range',
|
||||||
|
start: '',
|
||||||
|
stop: ''
|
||||||
|
},
|
||||||
geo_distance: {
|
geo_distance: {
|
||||||
distance: 10,
|
distance: 10,
|
||||||
unit: 'km',
|
unit: 'km',
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ my.FilterEditor = Backbone.View.extend({
|
|||||||
<label>Filter type</label> \
|
<label>Filter type</label> \
|
||||||
<select class="filterType"> \
|
<select class="filterType"> \
|
||||||
<option value="term">Term (text)</option> \
|
<option value="term">Term (text)</option> \
|
||||||
|
<option value="range">Range</option> \
|
||||||
<option value="geo_distance">Geo distance</option> \
|
<option value="geo_distance">Geo distance</option> \
|
||||||
</select> \
|
</select> \
|
||||||
<label>Field</label> \
|
<label>Field</label> \
|
||||||
@@ -49,6 +50,20 @@ my.FilterEditor = Backbone.View.extend({
|
|||||||
</fieldset> \
|
</fieldset> \
|
||||||
</div> \
|
</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: ' \
|
geo_distance: ' \
|
||||||
<div class="filter-{{type}} filter"> \
|
<div class="filter-{{type}} filter"> \
|
||||||
<fieldset> \
|
<fieldset> \
|
||||||
@@ -124,19 +139,27 @@ my.FilterEditor = Backbone.View.extend({
|
|||||||
var $form = $(e.target);
|
var $form = $(e.target);
|
||||||
_.each($form.find('input'), function(input) {
|
_.each($form.find('input'), function(input) {
|
||||||
var $input = $(input);
|
var $input = $(input);
|
||||||
var filterType = $input.attr('data-filter-type');
|
var filterType = $input.attr('data-filter-type');
|
||||||
var fieldId = $input.attr('data-filter-field');
|
var fieldId = $input.attr('data-filter-field');
|
||||||
var filterIndex = parseInt($input.attr('data-filter-id'));
|
var filterIndex = parseInt($input.attr('data-filter-id'));
|
||||||
var name = $input.attr('name');
|
var name = $input.attr('name');
|
||||||
var value = $input.val();
|
var value = $input.val();
|
||||||
if (filterType === 'term') {
|
|
||||||
filters[filterIndex].term = value;
|
switch (filterType) {
|
||||||
} else if (filterType === 'geo_distance') {
|
case 'term':
|
||||||
if (name === 'distance') {
|
filters[filterIndex].term = value;
|
||||||
filters[filterIndex].distance = parseFloat(value);
|
break;
|
||||||
} else {
|
case 'range':
|
||||||
filters[filterIndex].point[name] = parseFloat(value);
|
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});
|
self.model.queryState.set({filters: filters});
|
||||||
|
|||||||
Reference in New Issue
Block a user