query_def.ts 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  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. { text: 'Raw Document', value: 'raw_document', requiresField: false },
  67. ];
  68. export const bucketAggTypes = [
  69. { text: 'Terms', value: 'terms', requiresField: true },
  70. { text: 'Filters', value: 'filters' },
  71. { text: 'Geo Hash Grid', value: 'geohash_grid', requiresField: true },
  72. { text: 'Date Histogram', value: 'date_histogram', requiresField: true },
  73. { text: 'Histogram', value: 'histogram', requiresField: true },
  74. ];
  75. export const orderByOptions = [{ text: 'Doc Count', value: '_count' }, { text: 'Term value', value: '_term' }];
  76. export const orderOptions = [{ text: 'Top', value: 'desc' }, { text: 'Bottom', value: 'asc' }];
  77. export const sizeOptions = [
  78. { text: 'No limit', value: '0' },
  79. { text: '1', value: '1' },
  80. { text: '2', value: '2' },
  81. { text: '3', value: '3' },
  82. { text: '5', value: '5' },
  83. { text: '10', value: '10' },
  84. { text: '15', value: '15' },
  85. { text: '20', value: '20' },
  86. ];
  87. export const extendedStats = [
  88. { text: 'Avg', value: 'avg' },
  89. { text: 'Min', value: 'min' },
  90. { text: 'Max', value: 'max' },
  91. { text: 'Sum', value: 'sum' },
  92. { text: 'Count', value: 'count' },
  93. { text: 'Std Dev', value: 'std_deviation' },
  94. { text: 'Std Dev Upper', value: 'std_deviation_bounds_upper' },
  95. { text: 'Std Dev Lower', value: 'std_deviation_bounds_lower' },
  96. ];
  97. export const intervalOptions = [
  98. { text: 'auto', value: 'auto' },
  99. { text: '10s', value: '10s' },
  100. { text: '1m', value: '1m' },
  101. { text: '5m', value: '5m' },
  102. { text: '10m', value: '10m' },
  103. { text: '20m', value: '20m' },
  104. { text: '1h', value: '1h' },
  105. { text: '1d', value: '1d' },
  106. ];
  107. export const movingAvgModelOptions = [
  108. { text: 'Simple', value: 'simple' },
  109. { text: 'Linear', value: 'linear' },
  110. { text: 'Exponentially Weighted', value: 'ewma' },
  111. { text: 'Holt Linear', value: 'holt' },
  112. { text: 'Holt Winters', value: 'holt_winters' },
  113. ];
  114. export const pipelineOptions = {
  115. moving_avg: [
  116. { text: 'window', default: 5 },
  117. { text: 'model', default: 'simple' },
  118. { text: 'predict', default: undefined },
  119. { text: 'minimize', default: false },
  120. ],
  121. derivative: [{ text: 'unit', default: undefined }],
  122. };
  123. export const movingAvgModelSettings = {
  124. simple: [],
  125. linear: [],
  126. ewma: [{ text: 'Alpha', value: 'alpha', default: undefined }],
  127. holt: [{ text: 'Alpha', value: 'alpha', default: undefined }, { text: 'Beta', value: 'beta', default: undefined }],
  128. holt_winters: [
  129. { text: 'Alpha', value: 'alpha', default: undefined },
  130. { text: 'Beta', value: 'beta', default: undefined },
  131. { text: 'Gamma', value: 'gamma', default: undefined },
  132. { text: 'Period', value: 'period', default: undefined },
  133. { text: 'Pad', value: 'pad', default: undefined, isCheckbox: true },
  134. ],
  135. };
  136. export function getMetricAggTypes(esVersion) {
  137. return _.filter(metricAggTypes, f => {
  138. if (f.minVersion) {
  139. return f.minVersion <= esVersion;
  140. } else {
  141. return true;
  142. }
  143. });
  144. }
  145. export function getPipelineOptions(metric) {
  146. if (!isPipelineAgg(metric.type)) {
  147. return [];
  148. }
  149. return pipelineOptions[metric.type];
  150. }
  151. export function isPipelineAgg(metricType) {
  152. if (metricType) {
  153. const po = pipelineOptions[metricType];
  154. return po !== null && po !== undefined;
  155. }
  156. return false;
  157. }
  158. export function getPipelineAggOptions(targets) {
  159. const result = [];
  160. _.each(targets.metrics, metric => {
  161. if (!isPipelineAgg(metric.type)) {
  162. result.push({ text: describeMetric(metric), value: metric.id });
  163. }
  164. });
  165. return result;
  166. }
  167. export function getMovingAvgSettings(model, filtered) {
  168. const filteredResult = [];
  169. if (filtered) {
  170. _.each(movingAvgModelSettings[model], setting => {
  171. if (!setting.isCheckbox) {
  172. filteredResult.push(setting);
  173. }
  174. });
  175. return filteredResult;
  176. }
  177. return movingAvgModelSettings[model];
  178. }
  179. export function getOrderByOptions(target) {
  180. const metricRefs = [];
  181. _.each(target.metrics, metric => {
  182. if (metric.type !== 'count') {
  183. metricRefs.push({ text: describeMetric(metric), value: metric.id });
  184. }
  185. });
  186. return orderByOptions.concat(metricRefs);
  187. }
  188. export function describeOrder(order) {
  189. const def = _.find(orderOptions, { value: order });
  190. return def.text;
  191. }
  192. export function describeMetric(metric) {
  193. const def = _.find(metricAggTypes, { value: metric.type });
  194. return def.text + ' ' + metric.field;
  195. }
  196. export function describeOrderBy(orderBy, target) {
  197. const def = _.find(orderByOptions, { value: orderBy });
  198. if (def) {
  199. return def.text;
  200. }
  201. const metric = _.find(target.metrics, { id: orderBy });
  202. if (metric) {
  203. return describeMetric(metric);
  204. } else {
  205. return 'metric not found';
  206. }
  207. }
  208. export function defaultMetricAgg() {
  209. return { type: 'count', id: '1' };
  210. }
  211. export function defaultBucketAgg() {
  212. return { type: 'date_histogram', id: '2', settings: { interval: 'auto' } };
  213. }