data_processor.ts 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  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. let autoDetectMode = this.getAutoDetectXAxisMode(firstItem);
  18. if (this.panel.xaxis.mode !== autoDetectMode) {
  19. this.panel.xaxis.mode = autoDetectMode;
  20. this.setPanelDefaultsForNewXAxisMode();
  21. }
  22. }
  23. switch (this.panel.xaxis.mode) {
  24. case 'series':
  25. case 'time': {
  26. return options.dataList.map(this.timeSeriesHandler.bind(this));
  27. }
  28. case 'field': {
  29. return this.customHandler(firstItem);
  30. }
  31. }
  32. }
  33. getAutoDetectXAxisMode(firstItem) {
  34. switch (firstItem.type) {
  35. case 'docs': return 'field';
  36. case 'table': return 'field';
  37. default: {
  38. if (this.panel.xaxis.mode === 'series') {
  39. return 'series';
  40. }
  41. return 'time';
  42. }
  43. }
  44. }
  45. setPanelDefaultsForNewXAxisMode() {
  46. switch (this.panel.xaxis.mode) {
  47. case 'time': {
  48. this.panel.bars = false;
  49. this.panel.lines = true;
  50. this.panel.points = false;
  51. this.panel.legend.show = true;
  52. this.panel.tooltip.shared = true;
  53. this.panel.xaxis.values = [];
  54. break;
  55. }
  56. case 'series': {
  57. this.panel.bars = true;
  58. this.panel.lines = false;
  59. this.panel.points = false;
  60. this.panel.stack = false;
  61. this.panel.legend.show = false;
  62. this.panel.tooltip.shared = false;
  63. this.panel.xaxis.values = ['total'];
  64. break;
  65. }
  66. }
  67. }
  68. seriesHandler(seriesData, index, datapoints, alias) {
  69. var colorIndex = index % colors.length;
  70. var color = this.panel.aliasColors[alias] || colors[colorIndex];
  71. var series = new TimeSeries({datapoints: datapoints, alias: alias, color: color, unit: seriesData.unit});
  72. // if (datapoints && datapoints.length > 0) {
  73. // var last = moment.utc(datapoints[datapoints.length - 1][1]);
  74. // var from = moment.utc(this.range.from);
  75. // if (last - from < -10000) {
  76. // this.datapointsOutside = true;
  77. // }
  78. //
  79. // this.datapointsCount += datapoints.length;
  80. // this.panel.tooltip.msResolution = this.panel.tooltip.msResolution || series.isMsResolutionNeeded();
  81. // }
  82. return series;
  83. }
  84. timeSeriesHandler(seriesData, index) {
  85. var datapoints = seriesData.datapoints;
  86. var alias = seriesData.target;
  87. return this.seriesHandler(seriesData, index, datapoints, alias);
  88. }
  89. customHandler(dataItem) {
  90. console.log('custom', dataItem);
  91. let nameField = this.panel.xaxis.name;
  92. if (!nameField) {
  93. throw {message: 'No field name specified to use for x-axis, check your axes settings'};
  94. }
  95. // let valueField = this.panel.xaxis.esValueField;
  96. // let datapoints = _.map(seriesData.datapoints, (doc) => {
  97. // return [
  98. // pluckDeep(doc, valueField), // Y value
  99. // pluckDeep(doc, xField) // X value
  100. // ];
  101. // });
  102. //
  103. // // Remove empty points
  104. // datapoints = _.filter(datapoints, (point) => {
  105. // return point[0] !== undefined;
  106. // });
  107. //
  108. // var alias = valueField;
  109. // re
  110. return [];
  111. }
  112. tableHandler(seriesData, index) {
  113. var xColumnIndex = Number(this.panel.xaxis.columnIndex);
  114. var valueColumnIndex = Number(this.panel.xaxis.valueColumnIndex);
  115. var datapoints = _.map(seriesData.rows, (row) => {
  116. var value = valueColumnIndex ? row[valueColumnIndex] : _.last(row);
  117. return [
  118. value, // Y value
  119. row[xColumnIndex] // X value
  120. ];
  121. });
  122. var alias = seriesData.columns[valueColumnIndex].text;
  123. return this.seriesHandler(seriesData, index, datapoints, alias);
  124. }
  125. // esRawDocHandler(seriesData, index) {
  126. // let xField = this.panel.xaxis.esField;
  127. // let valueField = this.panel.xaxis.esValueField;
  128. // let datapoints = _.map(seriesData.datapoints, (doc) => {
  129. // return [
  130. // pluckDeep(doc, valueField), // Y value
  131. // pluckDeep(doc, xField) // X value
  132. // ];
  133. // });
  134. //
  135. // // Remove empty points
  136. // datapoints = _.filter(datapoints, (point) => {
  137. // return point[0] !== undefined;
  138. // });
  139. //
  140. // var alias = valueField;
  141. // return this.seriesHandler(seriesData, index, datapoints, alias);
  142. // }
  143. //
  144. validateXAxisSeriesValue() {
  145. switch (this.panel.xaxis.mode) {
  146. case 'series': {
  147. if (this.panel.xaxis.values.length === 0) {
  148. this.panel.xaxis.values = ['total'];
  149. return;
  150. }
  151. var validOptions = this.getXAxisValueOptions({});
  152. var found = _.find(validOptions, {value: this.panel.xaxis.values[0]});
  153. if (!found) {
  154. this.panel.xaxis.values = ['total'];
  155. }
  156. return;
  157. }
  158. }
  159. }
  160. getDataFieldNames(dataList, onlyNumbers) {
  161. if (dataList.length === 0) {
  162. return [];
  163. }
  164. let fields = [];
  165. var firstItem = dataList[0];
  166. if (firstItem.type === 'docs'){
  167. if (firstItem.datapoints.length === 0) {
  168. return [];
  169. }
  170. let fieldParts = [];
  171. function getPropertiesRecursive(obj) {
  172. _.forEach(obj, (value, key) => {
  173. if (_.isObject(value)) {
  174. fieldParts.push(key);
  175. getPropertiesRecursive(value);
  176. } else {
  177. if (!onlyNumbers || _.isNumber(value)) {
  178. let field = fieldParts.concat(key).join('.');
  179. fields.push(field);
  180. }
  181. }
  182. });
  183. fieldParts.pop();
  184. }
  185. getPropertiesRecursive(firstItem.datapoints[0]);
  186. return fields;
  187. }
  188. }
  189. getXAxisValueOptions(options) {
  190. switch (this.panel.xaxis.mode) {
  191. case 'time': {
  192. return [];
  193. }
  194. case 'series': {
  195. return [
  196. {text: 'Avg', value: 'avg'},
  197. {text: 'Min', value: 'min'},
  198. {text: 'Max', value: 'min'},
  199. {text: 'Total', value: 'total'},
  200. {text: 'Count', value: 'count'},
  201. ];
  202. }
  203. }
  204. }
  205. pluckDeep(obj: any, property: string) {
  206. let propertyParts = property.split('.');
  207. let value = obj;
  208. for (let i = 0; i < propertyParts.length; ++i) {
  209. if (value[propertyParts[i]]) {
  210. value = value[propertyParts[i]];
  211. } else {
  212. return undefined;
  213. }
  214. }
  215. return value;
  216. }
  217. }