data_processor.ts 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. ///<reference path="../../../headers/common.d.ts" />
  2. import kbn from 'app/core/utils/kbn';
  3. import _ from 'lodash';
  4. import TimeSeries from 'app/core/time_series2';
  5. import {colors} from 'app/core/core';
  6. export class DataProcessor {
  7. constructor(private panel) {
  8. }
  9. getSeriesList(options) {
  10. if (!options.dataList || options.dataList.length === 0) {
  11. return [];
  12. }
  13. // auto detect xaxis mode
  14. var firstItem;
  15. if (options.dataList && options.dataList.length > 0) {
  16. firstItem = options.dataList[0];
  17. if (firstItem.type === 'docs') {
  18. this.panel.xaxis.mode = 'custom';
  19. }
  20. }
  21. switch (this.panel.xaxis.mode) {
  22. case 'series':
  23. case 'time': {
  24. return options.dataList.map(this.timeSeriesHandler.bind(this));
  25. }
  26. case 'custom': {
  27. return this.customHandler(firstItem);
  28. }
  29. }
  30. }
  31. seriesHandler(seriesData, index, datapoints, alias) {
  32. var colorIndex = index % colors.length;
  33. var color = this.panel.aliasColors[alias] || colors[colorIndex];
  34. var series = new TimeSeries({datapoints: datapoints, alias: alias, color: color, unit: seriesData.unit});
  35. // if (datapoints && datapoints.length > 0) {
  36. // var last = moment.utc(datapoints[datapoints.length - 1][1]);
  37. // var from = moment.utc(this.range.from);
  38. // if (last - from < -10000) {
  39. // this.datapointsOutside = true;
  40. // }
  41. //
  42. // this.datapointsCount += datapoints.length;
  43. // this.panel.tooltip.msResolution = this.panel.tooltip.msResolution || series.isMsResolutionNeeded();
  44. // }
  45. return series;
  46. }
  47. timeSeriesHandler(seriesData, index) {
  48. var datapoints = seriesData.datapoints;
  49. var alias = seriesData.target;
  50. return this.seriesHandler(seriesData, index, datapoints, alias);
  51. }
  52. customHandler(dataItem) {
  53. console.log('custom', dataItem);
  54. let nameField = this.panel.xaxis.name;
  55. if (!nameField) {
  56. throw {message: 'No field name specified to use for x-axis, check your axes settings'};
  57. }
  58. // let valueField = this.panel.xaxis.esValueField;
  59. // let datapoints = _.map(seriesData.datapoints, (doc) => {
  60. // return [
  61. // pluckDeep(doc, valueField), // Y value
  62. // pluckDeep(doc, xField) // X value
  63. // ];
  64. // });
  65. //
  66. // // Remove empty points
  67. // datapoints = _.filter(datapoints, (point) => {
  68. // return point[0] !== undefined;
  69. // });
  70. //
  71. // var alias = valueField;
  72. // re
  73. return [];
  74. }
  75. tableHandler(seriesData, index) {
  76. var xColumnIndex = Number(this.panel.xaxis.columnIndex);
  77. var valueColumnIndex = Number(this.panel.xaxis.valueColumnIndex);
  78. var datapoints = _.map(seriesData.rows, (row) => {
  79. var value = valueColumnIndex ? row[valueColumnIndex] : _.last(row);
  80. return [
  81. value, // Y value
  82. row[xColumnIndex] // X value
  83. ];
  84. });
  85. var alias = seriesData.columns[valueColumnIndex].text;
  86. return this.seriesHandler(seriesData, index, datapoints, alias);
  87. }
  88. // esRawDocHandler(seriesData, index) {
  89. // let xField = this.panel.xaxis.esField;
  90. // let valueField = this.panel.xaxis.esValueField;
  91. // let datapoints = _.map(seriesData.datapoints, (doc) => {
  92. // return [
  93. // pluckDeep(doc, valueField), // Y value
  94. // pluckDeep(doc, xField) // X value
  95. // ];
  96. // });
  97. //
  98. // // Remove empty points
  99. // datapoints = _.filter(datapoints, (point) => {
  100. // return point[0] !== undefined;
  101. // });
  102. //
  103. // var alias = valueField;
  104. // return this.seriesHandler(seriesData, index, datapoints, alias);
  105. // }
  106. //
  107. validateXAxisSeriesValue() {
  108. switch (this.panel.xaxis.mode) {
  109. case 'series': {
  110. if (this.panel.xaxis.values.length === 0) {
  111. this.panel.xaxis.values = ['total'];
  112. return;
  113. }
  114. var validOptions = this.getXAxisValueOptions({});
  115. var found = _.find(validOptions, {value: this.panel.xaxis.values[0]});
  116. if (!found) {
  117. this.panel.xaxis.values = ['total'];
  118. }
  119. return;
  120. }
  121. }
  122. }
  123. getDocProperties(dataList) {
  124. if (dataList.length === 0) {
  125. return [];
  126. }
  127. var firstItem = dataList[0];
  128. if (firstItem.type === 'docs'){
  129. if (firstItem.datapoints.length === 0) {
  130. return [];
  131. }
  132. return this.getPropertiesFromDoc(firstItem.datapoints[0]);
  133. }
  134. }
  135. getXAxisValueOptions(options) {
  136. switch (this.panel.xaxis.mode) {
  137. case 'time': {
  138. return [];
  139. }
  140. case 'series': {
  141. return [
  142. {text: 'Avg', value: 'avg'},
  143. {text: 'Min', value: 'min'},
  144. {text: 'Max', value: 'min'},
  145. {text: 'Total', value: 'total'},
  146. {text: 'Count', value: 'count'},
  147. ];
  148. }
  149. }
  150. }
  151. getPropertiesFromDoc(doc) {
  152. let props = [];
  153. let propParts = [];
  154. function getPropertiesRecursive(obj) {
  155. _.forEach(obj, (value, key) => {
  156. if (_.isObject(value)) {
  157. propParts.push(key);
  158. getPropertiesRecursive(value);
  159. } else {
  160. let field = propParts.concat(key).join('.');
  161. props.push(field);
  162. }
  163. });
  164. propParts.pop();
  165. }
  166. getPropertiesRecursive(doc);
  167. return props;
  168. }
  169. pluckDeep(obj: any, property: string) {
  170. let propertyParts = property.split('.');
  171. let value = obj;
  172. for (let i = 0; i < propertyParts.length; ++i) {
  173. if (value[propertyParts[i]]) {
  174. value = value[propertyParts[i]];
  175. } else {
  176. return undefined;
  177. }
  178. }
  179. return value;
  180. }
  181. }