diff --git a/bower.json b/bower.json index 8161b48b0ff78..aa6b5d35cf058 100644 --- a/bower.json +++ b/bower.json @@ -23,7 +23,7 @@ "angular": "1.2.28", "angular-bindonce": "~0.3.1", "angular-bootstrap": "~0.10.0", - "angular-elastic": "~2.3.3", + "angular-elastic": "~2.4.2", "angular-mocks": "~1.2.14", "angular-route": "~1.2.14", "angular-ui-ace": "~0.2.3", diff --git a/src/kibana/components/courier/fetch/request/_segmented_handle.js b/src/kibana/components/courier/fetch/request/_segmented_handle.js index 3af37cba8e088..58d407f8bd026 100644 --- a/src/kibana/components/courier/fetch/request/_segmented_handle.js +++ b/src/kibana/components/courier/fetch/request/_segmented_handle.js @@ -17,24 +17,12 @@ define(function (require) { _(SegmentedHandle).inherits(Events); function SegmentedHandle(req) { SegmentedHandle.Super.call(this); - this._req = req; - } - /** - * Set the sort direction for the request. - * - * @param {string} dir - one of 'asc' or 'desc' - */ - SegmentedHandle.prototype.setDirection = function (dir) { - switch (dir) { - case 'asc': - case 'desc': - return (this._req._direction = dir); - default: - throw new TypeError('unkown sort direction "' + dir + '"'); - } - }; + // export a couple methods from the request + this.setDirection = _.bindKey(req, 'setDirection'); + this.setSize = _.bindKey(req, 'setSize'); + } return SegmentedHandle; }; -}); \ No newline at end of file +}); diff --git a/src/kibana/components/courier/fetch/request/segmented.js b/src/kibana/components/courier/fetch/request/segmented.js index 540e26bd12c33..9377c98e527f4 100644 --- a/src/kibana/components/courier/fetch/request/segmented.js +++ b/src/kibana/components/courier/fetch/request/segmented.js @@ -17,8 +17,8 @@ define(function (require) { // segmented request specific state this._initFn = initFn; - this._totalSize = false; - this._remainingSize = false; + this._desiredSize = false; + this._hitsReceived = 0; this._direction = 'desc'; this._handle = new SegmentedHandle(this); @@ -70,15 +70,8 @@ define(function (require) { var index = self._active = self._queue.shift(); params.index = index; - - // Only subtract from remaining size if dealing with the indexPattern's timefield - var timefield = self.source.get('index').timeFieldName; - if (_.keys(params.body.sort)[0] !== timefield) { - self._remainingSize = false; - } - - if (self._remainingSize !== false) { - params.body.size = self._remainingSize; + if (self._desiredSize !== false) { + params.body.size = Math.max(self._desiredSize - self._hitsReceived, 0); } return params; @@ -115,6 +108,35 @@ define(function (require) { ** SegmentedReq specific methods *********/ + /** + * Set the sort direction for the request. + * + * @param {string} dir - one of 'asc' or 'desc' + */ + SegmentedReq.prototype.setDirection = function (dir) { + switch (dir) { + case 'asc': + case 'desc': + return (this._direction = dir); + default: + throw new TypeError('unkown sort direction "' + dir + '"'); + } + }; + + /** + * Set the sort total number of documents to + * emit + * + * Setting to false will not limit the documents, + * if a number is set the size of the request to es + * will be updated on each new request + * + * @param {number|false} + */ + SegmentedReq.prototype.setSize = function (totalSize) { + this._desiredSize = _.parseInt(totalSize) || false; + }; + SegmentedReq.prototype._createQueue = function () { var timeBounds = timefilter.getBounds(); var indexPattern = this.source.get('index'); @@ -135,18 +157,9 @@ define(function (require) { hitCount: this._mergedResp.hits.hits.length }); }; - SegmentedReq.prototype._getFlattenedSource = function () { - var self = this; - - return self.source._flatten() - .then(function (flatSource) { - var size = _.parseInt(_.deepGet(flatSource, 'body.size')); - if (_.isNumber(size)) { - self._totalSize = self._remainingSize = size; - } - return flatSource; - }); + SegmentedReq.prototype._getFlattenedSource = function () { + return this.source._flatten(); }; SegmentedReq.prototype._consumeSegment = function (seg) { @@ -161,10 +174,7 @@ define(function (require) { this._mergeSegment(seg); this.resp = _.omit(this._mergedResp, '_bucketIndex'); - - if (this._remainingSize !== false) { - this._remainingSize -= seg.hits.hits.length; - } + this._hitsReceived += seg.hits.hits.length; if (firstHits) this._handle.emit('first', seg); if (gotHits) this._handle.emit('segment', seg); @@ -212,4 +222,4 @@ define(function (require) { return SegmentedReq; }; -}); \ No newline at end of file +}); diff --git a/src/kibana/components/doc_table/components/table_row.js b/src/kibana/components/doc_table/components/table_row.js index a7640bcd7b509..15952844b0038 100644 --- a/src/kibana/components/doc_table/components/table_row.js +++ b/src/kibana/components/doc_table/components/table_row.js @@ -23,10 +23,11 @@ define(function (require) { * ``` */ module.directive('kbnTableRow', function ($compile) { + var noWhiteSpace = require('utils/no_white_space'); var openRowHtml = require('text!components/doc_table/components/table_row/open.html'); var detailsHtml = require('text!components/doc_table/components/table_row/details.html'); - var cellTemplate = _.template(require('text!components/doc_table/components/table_row/cell.html')); - var truncateByHeightTemplate = _.template(require('text!partials/truncate_by_height.html')); + var cellTemplate = _.template(noWhiteSpace(require('text!components/doc_table/components/table_row/cell.html'))); + var truncateByHeightTemplate = _.template(noWhiteSpace(require('text!partials/truncate_by_height.html'))); return { restrict: 'A', @@ -106,6 +107,7 @@ define(function (require) { $scope.columns.forEach(function (column) { newHtmls.push(cellTemplate({ timefield: false, + sourcefield: (column === '_source'), formatted: _displayField(row, column, true) })); }); diff --git a/src/kibana/components/doc_table/components/table_row/cell.html b/src/kibana/components/doc_table/components/table_row/cell.html index 69964385f72fa..55f1e17f0cde5 100644 --- a/src/kibana/components/doc_table/components/table_row/cell.html +++ b/src/kibana/components/doc_table/components/table_row/cell.html @@ -1,3 +1,13 @@ -> +<% +var attributes = ''; +if (timefield) { + attributes='class="discover-table-timefield" width="1%"'; +} else if (sourcefield) { + attributes='class="discover-table-sourcefield"'; +} else { + attributes='class="discover-table-datafield"'; +} +%> +> <%= formatted %> - \ No newline at end of file + diff --git a/src/kibana/components/doc_table/doc_table.less b/src/kibana/components/doc_table/doc_table.less index 6954b401b0901..699a66f948bfa 100644 --- a/src/kibana/components/doc_table/doc_table.less +++ b/src/kibana/components/doc_table/doc_table.less @@ -7,6 +7,10 @@ doc-table { margin: 5px; .flex(1, 1, 100%); + .discover-table-datafield { + white-space: pre; + } + .loading { opacity: @loading-opacity; } diff --git a/src/kibana/components/errors.js b/src/kibana/components/errors.js index e69cb7e93cabf..6cec8bf1af74f 100644 --- a/src/kibana/components/errors.js +++ b/src/kibana/components/errors.js @@ -257,5 +257,13 @@ define(function (require) { }; inherits(errors.InvalidLogScaleValues, KbnError); + /** error thrown when wiggle chart is selected for non linear data */ + errors.InvalidWiggleSelection = function InvalidWiggleSelection() { + KbnError.call(this, + 'In wiggle mode the area chart requires ordered values on the x-axis. Try using a Histogram or Date Histogram aggregation.', + errors.InvalidWiggleSelection); + }; + inherits(errors.InvalidWiggleSelection, KbnError); + return errors; }); diff --git a/src/kibana/components/vislib/vis.js b/src/kibana/components/vislib/vis.js index 0fecf0ac7b282..dc3aaea11c63a 100644 --- a/src/kibana/components/vislib/vis.js +++ b/src/kibana/components/vislib/vis.js @@ -82,6 +82,7 @@ define(function (require) { // Because we have to wait for the DOM element to initialize, we do not // want to throw an error when the DOM `el` is zero if (error instanceof errors.ContainerTooSmall || + error instanceof errors.InvalidWiggleSelection || error instanceof errors.InvalidLogScaleValues || error instanceof errors.PieContainsAllZeros || error instanceof errors.NotEnoughData || diff --git a/src/kibana/components/vislib/visualizations/area_chart.js b/src/kibana/components/vislib/visualizations/area_chart.js index 722be6b6fc7fd..8fbab7df26c4c 100644 --- a/src/kibana/components/vislib/visualizations/area_chart.js +++ b/src/kibana/components/vislib/visualizations/area_chart.js @@ -249,6 +249,13 @@ define(function (require) { } }; + AreaChart.prototype.validateWiggleSelection = function () { + var isWiggle = this._attr.mode === 'wiggle'; + var ordered = this.handler.data.get('ordered'); + + if (isWiggle && !ordered) throw new errors.InvalidWiggleSelection(); + }; + /** * Renders d3 visualization * @@ -294,6 +301,7 @@ define(function (require) { if (width < minWidth || height < minHeight) { throw new errors.ContainerTooSmall(); } + self.validateWiggleSelection(); // Select the current DOM element div = d3.select(this); diff --git a/src/kibana/plugins/discover/controllers/discover.js b/src/kibana/plugins/discover/controllers/discover.js index 36a77eda6381a..f24f7602c138c 100644 --- a/src/kibana/plugins/discover/controllers/discover.js +++ b/src/kibana/plugins/discover/controllers/discover.js @@ -333,6 +333,7 @@ define(function (require) { $scope.updateTime(); segmented.setDirection(sortBy === 'time' ? (sort[1] || 'desc') : 'desc'); + segmented.setSize(sortBy === 'time' ? $scope.opts.sampleSize : false); // triggered when the status updated segmented.on('status', function (status) { diff --git a/src/kibana/plugins/settings/sections/objects/_view.html b/src/kibana/plugins/settings/sections/objects/_view.html index 2ae81e43228a2..7c9202280c309 100644 --- a/src/kibana/plugins/settings/sections/objects/_view.html +++ b/src/kibana/plugins/settings/sections/objects/_view.html @@ -21,7 +21,7 @@

Proceed with caution

-