getSeriesRequestData.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import trimStart from 'lodash/trimStart';
  2. import type {EventsStatsOptions} from 'sentry/actionCreators/events';
  3. import type {PageFilters} from 'sentry/types/core';
  4. import type {Organization} from 'sentry/types/organization';
  5. import {isEquation, isEquationAlias} from 'sentry/utils/discover/fields';
  6. import type {DiscoverDatasets} from 'sentry/utils/discover/types';
  7. import {TOP_N} from 'sentry/utils/discover/types';
  8. import {DisplayType, type Widget} from 'sentry/views/dashboards/types';
  9. import {getNumEquations, getWidgetInterval} from 'sentry/views/dashboards/utils';
  10. /**
  11. * This function is used to generate the request data for timeseries widgets
  12. * and is intended to be used eventually by doEventsRequest
  13. */
  14. export function getSeriesRequestData(
  15. widget: Widget,
  16. queryIndex: number,
  17. organization: Organization,
  18. pageFilters: PageFilters,
  19. dataset: DiscoverDatasets,
  20. referrer?: string
  21. ): EventsStatsOptions<true> {
  22. const widgetQuery = widget.queries[queryIndex];
  23. const {displayType, limit} = widget;
  24. const {environments, projects} = pageFilters;
  25. const {start, end, period: statsPeriod} = pageFilters.datetime;
  26. const interval = getWidgetInterval(
  27. displayType,
  28. {start, end, period: statsPeriod},
  29. '1m'
  30. );
  31. let requestData: EventsStatsOptions<true>;
  32. if (displayType === DisplayType.TOP_N) {
  33. requestData = {
  34. organization,
  35. interval,
  36. start,
  37. end,
  38. project: projects,
  39. environment: environments,
  40. period: statsPeriod,
  41. query: widgetQuery.conditions,
  42. yAxis: widgetQuery.aggregates[widgetQuery.aggregates.length - 1],
  43. includePrevious: false,
  44. referrer,
  45. partial: true,
  46. field: [...widgetQuery.columns, ...widgetQuery.aggregates],
  47. includeAllArgs: true,
  48. topEvents: TOP_N,
  49. dataset,
  50. };
  51. if (widgetQuery.orderby) {
  52. requestData.orderby = widgetQuery.orderby;
  53. }
  54. } else {
  55. requestData = {
  56. organization,
  57. interval,
  58. start,
  59. end,
  60. project: projects,
  61. environment: environments,
  62. period: statsPeriod,
  63. query: widgetQuery.conditions,
  64. yAxis: widgetQuery.aggregates,
  65. orderby: widgetQuery.orderby,
  66. includePrevious: false,
  67. referrer,
  68. partial: true,
  69. includeAllArgs: true,
  70. dataset,
  71. };
  72. if (widgetQuery.columns?.length !== 0) {
  73. requestData.topEvents = limit ?? TOP_N;
  74. requestData.field = [...widgetQuery.columns, ...widgetQuery.aggregates];
  75. // Compare field and orderby as aliases to ensure requestData has
  76. // the orderby selected
  77. // If the orderby is an equation alias, do not inject it
  78. const orderby = trimStart(widgetQuery.orderby, '-');
  79. if (
  80. widgetQuery.orderby &&
  81. !isEquationAlias(orderby) &&
  82. !requestData.field.includes(orderby)
  83. ) {
  84. requestData.field.push(orderby);
  85. }
  86. // The "Other" series is only included when there is one
  87. // y-axis and one widgetQuery
  88. requestData.excludeOther =
  89. widgetQuery.aggregates.length !== 1 || widget.queries.length !== 1;
  90. if (isEquation(trimStart(widgetQuery.orderby, '-'))) {
  91. const nextEquationIndex = getNumEquations(widgetQuery.aggregates);
  92. const isDescending = widgetQuery.orderby.startsWith('-');
  93. const prefix = isDescending ? '-' : '';
  94. // Construct the alias form of the equation and inject it into the request
  95. requestData.orderby = `${prefix}equation[${nextEquationIndex}]`;
  96. requestData.field = [
  97. ...widgetQuery.columns,
  98. ...widgetQuery.aggregates,
  99. trimStart(widgetQuery.orderby, '-'),
  100. ];
  101. }
  102. }
  103. }
  104. return requestData;
  105. }