query_def.ts 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. import _ from 'lodash';
  2. export const metricAggTypes = [
  3. { text: 'Count', value: 'count', requiresField: false },
  4. {
  5. text: 'Average',
  6. value: 'avg',
  7. requiresField: true,
  8. supportsInlineScript: true,
  9. supportsMissing: true,
  10. },
  11. {
  12. text: 'Sum',
  13. value: 'sum',
  14. requiresField: true,
  15. supportsInlineScript: true,
  16. supportsMissing: true,
  17. },
  18. {
  19. text: 'Max',
  20. value: 'max',
  21. requiresField: true,
  22. supportsInlineScript: true,
  23. supportsMissing: true,
  24. },
  25. {
  26. text: 'Min',
  27. value: 'min',
  28. requiresField: true,
  29. supportsInlineScript: true,
  30. supportsMissing: true,
  31. },
  32. {
  33. text: 'Extended Stats',
  34. value: 'extended_stats',
  35. requiresField: true,
  36. supportsMissing: true,
  37. supportsInlineScript: true,
  38. },
  39. {
  40. text: 'Percentiles',
  41. value: 'percentiles',
  42. requiresField: true,
  43. supportsMissing: true,
  44. supportsInlineScript: true,
  45. },
  46. {
  47. text: 'Unique Count',
  48. value: 'cardinality',
  49. requiresField: true,
  50. supportsMissing: true,
  51. },
  52. {
  53. text: 'Moving Average',
  54. value: 'moving_avg',
  55. requiresField: false,
  56. isPipelineAgg: true,
  57. minVersion: 2,
  58. },
  59. {
  60. text: 'Derivative',
  61. value: 'derivative',
  62. requiresField: false,
  63. isPipelineAgg: true,
  64. minVersion: 2,
  65. },
  66. {
  67. text: 'Bucket Script',
  68. value: 'bucket_script',
  69. requiresField: false,
  70. isPipelineAgg: true,
  71. supportsMultipleBucketPaths: true,
  72. minVersion: 2,
  73. },
  74. { text: 'Raw Document', value: 'raw_document', requiresField: false },
  75. ];
  76. export const bucketAggTypes = [
  77. { text: 'Terms', value: 'terms', requiresField: true },
  78. { text: 'Filters', value: 'filters' },
  79. { text: 'Geo Hash Grid', value: 'geohash_grid', requiresField: true },
  80. { text: 'Date Histogram', value: 'date_histogram', requiresField: true },
  81. { text: 'Histogram', value: 'histogram', requiresField: true },
  82. ];
  83. export const orderByOptions = [{ text: 'Doc Count', value: '_count' }, { text: 'Term value', value: '_term' }];
  84. export const orderOptions = [{ text: 'Top', value: 'desc' }, { text: 'Bottom', value: 'asc' }];
  85. export const sizeOptions = [
  86. { text: 'No limit', value: '0' },
  87. { text: '1', value: '1' },
  88. { text: '2', value: '2' },
  89. { text: '3', value: '3' },
  90. { text: '5', value: '5' },
  91. { text: '10', value: '10' },
  92. { text: '15', value: '15' },
  93. { text: '20', value: '20' },
  94. ];
  95. export const extendedStats = [
  96. { text: 'Avg', value: 'avg' },
  97. { text: 'Min', value: 'min' },
  98. { text: 'Max', value: 'max' },
  99. { text: 'Sum', value: 'sum' },
  100. { text: 'Count', value: 'count' },
  101. { text: 'Std Dev', value: 'std_deviation' },
  102. { text: 'Std Dev Upper', value: 'std_deviation_bounds_upper' },
  103. { text: 'Std Dev Lower', value: 'std_deviation_bounds_lower' },
  104. ];
  105. export const intervalOptions = [
  106. { text: 'auto', value: 'auto' },
  107. { text: '10s', value: '10s' },
  108. { text: '1m', value: '1m' },
  109. { text: '5m', value: '5m' },
  110. { text: '10m', value: '10m' },
  111. { text: '20m', value: '20m' },
  112. { text: '1h', value: '1h' },
  113. { text: '1d', value: '1d' },
  114. ];
  115. export const movingAvgModelOptions = [
  116. { text: 'Simple', value: 'simple' },
  117. { text: 'Linear', value: 'linear' },
  118. { text: 'Exponentially Weighted', value: 'ewma' },
  119. { text: 'Holt Linear', value: 'holt' },
  120. { text: 'Holt Winters', value: 'holt_winters' },
  121. ];
  122. export const pipelineOptions = {
  123. moving_avg: [
  124. { text: 'window', default: 5 },
  125. { text: 'model', default: 'simple' },
  126. { text: 'predict', default: undefined },
  127. { text: 'minimize', default: false },
  128. ],
  129. derivative: [{ text: 'unit', default: undefined }],
  130. bucket_script: [],
  131. };
  132. export const movingAvgModelSettings = {
  133. simple: [],
  134. linear: [],
  135. ewma: [{ text: 'Alpha', value: 'alpha', default: undefined }],
  136. holt: [{ text: 'Alpha', value: 'alpha', default: undefined }, { text: 'Beta', value: 'beta', default: undefined }],
  137. holt_winters: [
  138. { text: 'Alpha', value: 'alpha', default: undefined },
  139. { text: 'Beta', value: 'beta', default: undefined },
  140. { text: 'Gamma', value: 'gamma', default: undefined },
  141. { text: 'Period', value: 'period', default: undefined },
  142. { text: 'Pad', value: 'pad', default: undefined, isCheckbox: true },
  143. ],
  144. };
  145. export function getMetricAggTypes(esVersion) {
  146. return _.filter(metricAggTypes, f => {
  147. if (f.minVersion) {
  148. return f.minVersion <= esVersion;
  149. } else {
  150. return true;
  151. }
  152. });
  153. }
  154. export function getPipelineOptions(metric) {
  155. if (!isPipelineAgg(metric.type)) {
  156. return [];
  157. }
  158. return pipelineOptions[metric.type];
  159. }
  160. export function isPipelineAgg(metricType) {
  161. if (metricType) {
  162. const po = pipelineOptions[metricType];
  163. return po !== null && po !== undefined;
  164. }
  165. return false;
  166. }
  167. export function isPipelineAggWithMultipleBucketPaths(metricType) {
  168. if (metricType) {
  169. return metricAggTypes.find(t => t.value === metricType && t.supportsMultipleBucketPaths) !== undefined;
  170. }
  171. return false;
  172. }
  173. export function getPipelineAggOptions(targets) {
  174. const result = [];
  175. _.each(targets.metrics, metric => {
  176. if (!isPipelineAgg(metric.type)) {
  177. result.push({ text: describeMetric(metric), value: metric.id });
  178. }
  179. });
  180. return result;
  181. }
  182. export function getMovingAvgSettings(model, filtered) {
  183. const filteredResult = [];
  184. if (filtered) {
  185. _.each(movingAvgModelSettings[model], setting => {
  186. if (!setting.isCheckbox) {
  187. filteredResult.push(setting);
  188. }
  189. });
  190. return filteredResult;
  191. }
  192. return movingAvgModelSettings[model];
  193. }
  194. export function getOrderByOptions(target) {
  195. const metricRefs = [];
  196. _.each(target.metrics, metric => {
  197. if (metric.type !== 'count') {
  198. metricRefs.push({ text: describeMetric(metric), value: metric.id });
  199. }
  200. });
  201. return orderByOptions.concat(metricRefs);
  202. }
  203. export function describeOrder(order) {
  204. const def = _.find(orderOptions, { value: order });
  205. return def.text;
  206. }
  207. export function describeMetric(metric) {
  208. const def = _.find(metricAggTypes, { value: metric.type });
  209. if (!def.requiresField && !isPipelineAgg(metric.type)) {
  210. return def.text;
  211. }
  212. return def.text + ' ' + metric.field;
  213. }
  214. export function describeOrderBy(orderBy, target) {
  215. const def = _.find(orderByOptions, { value: orderBy });
  216. if (def) {
  217. return def.text;
  218. }
  219. const metric = _.find(target.metrics, { id: orderBy });
  220. if (metric) {
  221. return describeMetric(metric);
  222. } else {
  223. return 'metric not found';
  224. }
  225. }
  226. export function defaultMetricAgg() {
  227. return { type: 'count', id: '1' };
  228. }
  229. export function defaultBucketAgg() {
  230. return { type: 'date_histogram', id: '2', settings: { interval: 'auto' } };
  231. }
  232. export const findMetricById = (metrics: any[], id: any) => {
  233. return _.find(metrics, { id: id });
  234. };