getSeriesRequestData.tsx 3.7 KB

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