Merge pull request #377 from kielni/store-range-filter
make backend memory store work with from/to filters
This commit is contained in:
10
dist/recline.js
vendored
10
dist/recline.js
vendored
@@ -524,12 +524,14 @@ this.recline.Backend.Memory = this.recline.Backend.Memory || {};
|
|||||||
}
|
}
|
||||||
|
|
||||||
function range(record, filter) {
|
function range(record, filter) {
|
||||||
var startnull = (filter.start === null || filter.start === '');
|
var filterStart = filter.start || filter.from;
|
||||||
var stopnull = (filter.stop === null || filter.stop === '');
|
var filterStop = filter.stop || filter.to;
|
||||||
|
var startnull = (_.isUndefined(filterStart) || filterStart === null || filterStart === '');
|
||||||
|
var stopnull = (_.isUndefined(filterStop) || filterStop === null || filterStop === '');
|
||||||
var parse = getDataParser(filter);
|
var parse = getDataParser(filter);
|
||||||
var value = parse(record[filter.field]);
|
var value = parse(record[filter.field]);
|
||||||
var start = parse(filter.start);
|
var start = parse(startnull ? '' : filterStart);
|
||||||
var stop = parse(filter.stop);
|
var stop = parse(stopnull ? '' : filterStop);
|
||||||
|
|
||||||
// if at least one end of range is set do not allow '' to get through
|
// if at least one end of range is set do not allow '' to get through
|
||||||
// note that for strings '' <= {any-character} e.g. '' <= 'a'
|
// note that for strings '' <= {any-character} e.g. '' <= 'a'
|
||||||
|
|||||||
@@ -141,19 +141,19 @@ this.recline.Backend.Memory = this.recline.Backend.Memory || {};
|
|||||||
}
|
}
|
||||||
|
|
||||||
function range(record, filter) {
|
function range(record, filter) {
|
||||||
var startnull = (filter.start === null || filter.start === '');
|
var fromnull = (_.isUndefined(filter.from) || filter.from === null || filter.from === '');
|
||||||
var stopnull = (filter.stop === null || filter.stop === '');
|
var tonull = (_.isUndefined(filter.to) || filter.to === null || filter.to === '');
|
||||||
var parse = getDataParser(filter);
|
var parse = getDataParser(filter);
|
||||||
var value = parse(record[filter.field]);
|
var value = parse(record[filter.field]);
|
||||||
var start = parse(filter.start);
|
var from = parse(fromnull ? '' : filter.from);
|
||||||
var stop = parse(filter.stop);
|
var to = parse(tonull ? '' : filter.to);
|
||||||
|
|
||||||
// if at least one end of range is set do not allow '' to get through
|
// if at least one end of range is set do not allow '' to get through
|
||||||
// note that for strings '' <= {any-character} e.g. '' <= 'a'
|
// note that for strings '' <= {any-character} e.g. '' <= 'a'
|
||||||
if ((!startnull || !stopnull) && value === '') {
|
if ((!fromnull || !tonull) && value === '') {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return ((startnull || value >= start) && (stopnull || value <= stop));
|
return ((fromnull || value >= from) && (tonull || value <= to));
|
||||||
}
|
}
|
||||||
|
|
||||||
function geo_distance() {
|
function geo_distance() {
|
||||||
|
|||||||
@@ -485,8 +485,8 @@ my.Query = Backbone.Model.extend({
|
|||||||
},
|
},
|
||||||
range: {
|
range: {
|
||||||
type: 'range',
|
type: 'range',
|
||||||
start: '',
|
from: '',
|
||||||
stop: ''
|
to: ''
|
||||||
},
|
},
|
||||||
geo_distance: {
|
geo_distance: {
|
||||||
type: 'geo_distance',
|
type: 'geo_distance',
|
||||||
|
|||||||
@@ -59,9 +59,9 @@ my.FilterEditor = Backbone.View.extend({
|
|||||||
<a class="js-remove-filter" href="#" title="Remove this filter" data-filter-id="{{id}}">×</a> \
|
<a class="js-remove-filter" href="#" title="Remove this filter" data-filter-id="{{id}}">×</a> \
|
||||||
</legend> \
|
</legend> \
|
||||||
<label class="control-label" for="">From</label> \
|
<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}}" /> \
|
<input type="text" value="{{from}}" name="from" data-filter-field="{{field}}" data-filter-id="{{id}}" data-filter-type="{{type}}" /> \
|
||||||
<label class="control-label" for="">To</label> \
|
<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}}" /> \
|
<input type="text" value="{{to}}" name="to" data-filter-field="{{field}}" data-filter-id="{{id}}" data-filter-type="{{type}}" /> \
|
||||||
</fieldset> \
|
</fieldset> \
|
||||||
</div> \
|
</div> \
|
||||||
',
|
',
|
||||||
|
|||||||
@@ -100,18 +100,19 @@ test('filters', function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
query = new recline.Model.Query();
|
query = new recline.Model.Query();
|
||||||
query.addFilter({type: 'range', field: 'date', start: '2011-01-01', stop: '2011-05-01'});
|
query.addFilter({type: 'range', field: 'date', from: '2011-01-01', to: '2011-05-01'});
|
||||||
data.query(query.toJSON()).then(function(out) {
|
data.query(query.toJSON()).then(function(out) {
|
||||||
equal(out.total, 3);
|
equal(out.total, 3);
|
||||||
deepEqual(_.pluck(out.hits, 'date'), ['2011-01-01','2011-02-03','2011-04-05']);
|
deepEqual(_.pluck(out.hits, 'date'), ['2011-01-01','2011-02-03','2011-04-05']);
|
||||||
});
|
});
|
||||||
|
|
||||||
query = new recline.Model.Query();
|
query = new recline.Model.Query();
|
||||||
query.addFilter({type: 'range', field: 'z', start: '0', stop: '10'});
|
query.addFilter({type: 'range', field: 'z', from: '0', to: '10'});
|
||||||
data.query(query.toJSON()).then(function(out) {
|
data.query(query.toJSON()).then(function(out) {
|
||||||
equal(out.total, 3);
|
equal(out.total, 3);
|
||||||
deepEqual(_.pluck(out.hits, 'z'), [3,6,9]);
|
deepEqual(_.pluck(out.hits, 'z'), [3,6,9]);
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
@@ -119,35 +120,37 @@ test('filters with nulls', function () {
|
|||||||
var data = _wrapData();
|
var data = _wrapData();
|
||||||
|
|
||||||
query = new recline.Model.Query();
|
query = new recline.Model.Query();
|
||||||
query.addFilter({type: 'range', field: 'z', start: '', stop: null});
|
query.addFilter({type: 'range', field: 'z', from: '', to: null});
|
||||||
data.query(query.toJSON()).then(function(out) {
|
data.query(query.toJSON()).then(function(out) {
|
||||||
equal(out.total, 6);
|
equal(out.total, 6);
|
||||||
});
|
});
|
||||||
|
|
||||||
query = new recline.Model.Query();
|
query = new recline.Model.Query();
|
||||||
query.addFilter({type: 'range', field: 'x', start: '', stop: '3'});
|
query.addFilter({type: 'range', field: 'x', from: '', to: '3'});
|
||||||
data.query(query.toJSON()).then(function(out) {
|
data.query(query.toJSON()).then(function(out) {
|
||||||
equal(out.total, 3);
|
equal(out.total, 3);
|
||||||
});
|
});
|
||||||
|
|
||||||
query = new recline.Model.Query();
|
query = new recline.Model.Query();
|
||||||
query.addFilter({type: 'range', field: 'x', start: '3', stop: ''});
|
query.addFilter({type: 'range', field: 'x', from: '3', to: ''});
|
||||||
data.query(query.toJSON()).then(function(out) {
|
data.query(query.toJSON()).then(function(out) {
|
||||||
equal(out.total, 4);
|
equal(out.total, 4);
|
||||||
});
|
});
|
||||||
|
|
||||||
data.records[5].country = '';
|
data.records[5].country = '';
|
||||||
|
|
||||||
query = new recline.Model.Query();
|
query = new recline.Model.Query();
|
||||||
query.addFilter({type: 'range', field: 'country', start: '', stop: 'Z'});
|
query.addFilter({type: 'range', field: 'country', from: '', to: 'Z'});
|
||||||
data.query(query.toJSON()).then(function(out) {
|
data.query(query.toJSON()).then(function(out) {
|
||||||
equal(out.total, 5);
|
equal(out.total, 5);
|
||||||
});
|
});
|
||||||
|
|
||||||
query = new recline.Model.Query();
|
query = new recline.Model.Query();
|
||||||
query.addFilter({type: 'range', field: 'x', start: '', stop: ''});
|
query.addFilter({type: 'range', field: 'x', from: '', to: ''});
|
||||||
data.query(query.toJSON()).then(function(out) {
|
data.query(query.toJSON()).then(function(out) {
|
||||||
equal(out.total, 6);
|
equal(out.total, 6);
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test('facet', function () {
|
test('facet', function () {
|
||||||
@@ -305,14 +308,14 @@ test('filters', function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
dataset = makeBackendDataset();
|
dataset = makeBackendDataset();
|
||||||
dataset.queryState.addFilter({type: 'range', field: 'date', start: '2011-01-01', stop: '2011-05-01'});
|
dataset.queryState.addFilter({type: 'range', field: 'date', from: '2011-01-01', to: '2011-05-01'});
|
||||||
dataset.query().then(function() {
|
dataset.query().then(function() {
|
||||||
equal(dataset.records.length, 3);
|
equal(dataset.records.length, 3);
|
||||||
deepEqual(dataset.records.pluck('date'), ['2011-01-01','2011-02-03','2011-04-05']);
|
deepEqual(dataset.records.pluck('date'), ['2011-01-01','2011-02-03','2011-04-05']);
|
||||||
});
|
});
|
||||||
|
|
||||||
dataset = makeBackendDataset();
|
dataset = makeBackendDataset();
|
||||||
dataset.queryState.addFilter({type: 'range', field: 'z', start: '0', stop: '10'});
|
dataset.queryState.addFilter({type: 'range', field: 'z', from: '0', to: '10'});
|
||||||
dataset.query().then(function() {
|
dataset.query().then(function() {
|
||||||
equal(dataset.records.length, 3);
|
equal(dataset.records.length, 3);
|
||||||
deepEqual(dataset.records.pluck('z'), [3,6,9]);
|
deepEqual(dataset.records.pluck('z'), [3,6,9]);
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ test('basics', function () {
|
|||||||
$editForm.find('.filter-range input').last().val('4');
|
$editForm.find('.filter-range input').last().val('4');
|
||||||
$editForm.submit();
|
$editForm.submit();
|
||||||
equal(dataset.queryState.attributes.filters[0].term, 'UK');
|
equal(dataset.queryState.attributes.filters[0].term, 'UK');
|
||||||
equal(dataset.queryState.attributes.filters[1].start, 2);
|
equal(dataset.queryState.attributes.filters[1].from, 2);
|
||||||
equal(dataset.records.length, 2);
|
equal(dataset.records.length, 2);
|
||||||
|
|
||||||
// now remove filter
|
// now remove filter
|
||||||
|
|||||||
Reference in New Issue
Block a user