data_processor.ts 6.6 KB

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