diff --git a/src/app/minicharts/d3fns/many.js b/src/app/minicharts/d3fns/many.js index d9b445dc1b0..4030a1712a3 100644 --- a/src/app/minicharts/d3fns/many.js +++ b/src/app/minicharts/d3fns/many.js @@ -66,7 +66,7 @@ var minicharts_d3fns_many = function() { function brushed() { var bars = d3.selectAll(options.view.queryAll('rect.selectable')); - var numSelected = options.view.queryAll('rect.selectable.selected').length; + // var numSelected = options.view.queryAll('rect.selectable.selected').length; var s = brush.extent(); bars.classed('selected', function(d) { @@ -83,14 +83,16 @@ var minicharts_d3fns_many = function() { if (!options.view) { return; } - if (numSelected !== options.view.queryAll('rect.selectable.selected').length) { - // number of selected items has changed, trigger querybuilder event - var evt = { - type: 'drag', - source: 'many' - }; - options.view.trigger('querybuilder', evt); - } + var openLeft = d3.mouse(this)[0] <= 0; + var openRight = d3.mouse(this)[0] >= width; + // number of selected items has changed, trigger querybuilder event + var evt = { + type: 'drag', + source: 'many', + openLeft: openLeft, + openRight: openRight + }; + options.view.trigger('querybuilder', evt); } function brushend() { @@ -104,9 +106,13 @@ var minicharts_d3fns_many = function() { if (!options.view) { return; } + var openLeft = d3.mouse(this)[0] <= 0; + var openRight = d3.mouse(this)[0] >= width; var evt = { type: 'drag', - source: 'many' + source: 'many', + openLeft: openLeft, + openRight: openRight }; options.view.trigger('querybuilder', evt); } diff --git a/src/app/minicharts/querybuilder.js b/src/app/minicharts/querybuilder.js index bcd9ed62860..c2dbd6bb7a1 100644 --- a/src/app/minicharts/querybuilder.js +++ b/src/app/minicharts/querybuilder.js @@ -6,6 +6,7 @@ var app = require('ampersand-app'); var LeafValue = require('mongodb-language-model').LeafValue; var LeafClause = require('mongodb-language-model').LeafClause; var ListOperator = require('mongodb-language-model').ListOperator; +var ValueOperator = require('mongodb-language-model').ValueOperator; var GeoOperator = require('mongodb-language-model').GeoOperator; var Range = require('mongodb-language-model').helpers.Range; var metrics = require('mongodb-js-metrics')(); @@ -287,6 +288,23 @@ module.exports = { throw new Error('message.selected should never be longer than 2 elements here!'); } + var q; + // in case one of the bounds is open + if (message.data.openLeft) { + message.upperOp = message.dx > 0 ? '$lt' : '$lte'; + q = {}; + q[message.upperOp] = message.selected[1]; + message.value = new ValueOperator(q, {parse: true}); + return message; + } + + // in case one of the bounds is open + if (message.data.openRight) { + message.lowerOp = '$gte'; + message.value = new ValueOperator({$gte: message.selected[0]}, {parse: true}); + return message; + } + // at this point we definitely have 2 selected values to build a range message.lowerOp = '$gte'; message.upperOp = message.dx > 0 ? '$lt' : '$lte'; @@ -324,7 +342,6 @@ module.exports = { return message; }, - /** * update the UI after a distinct query and mark appropriate elements with .select class. *