util.ts 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. /*
  2. * <<
  3. * Davinci
  4. * ==
  5. * Copyright (C) 2016 - 2017 EDP
  6. * ==
  7. * Licensed under the Apache License, Version 2.0 (the "License");
  8. * you may not use this file except in compliance with the License.
  9. * You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing, software
  14. * distributed under the License is distributed on an "AS IS" BASIS,
  15. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. * See the License for the specific language governing permissions and
  17. * limitations under the License.
  18. * >>
  19. */
  20. import { IDashboardRaw, IDashboardNode } from './types'
  21. import { IWidgetConfig, RenderType } from '../Widget/components/Widget'
  22. import { FieldSortTypes } from '../Widget/components/Config/Sort'
  23. import { IQueryConditions } from '../Dashboard/types'
  24. import { decodeMetricName } from '../Widget/components/util'
  25. type MapDashboardNodes = { [parentId: number]: IDashboardNode[] }
  26. export function getDashboardNodes(dashboards: IDashboardRaw[]): IDashboardNode[] {
  27. if (!Array.isArray(dashboards)) {
  28. return []
  29. }
  30. const mapDashboardNodes = dashboards.reduce<MapDashboardNodes>(
  31. (map, node) => {
  32. if (!map[node.parentId]) {
  33. map[node.parentId] = []
  34. }
  35. map[node.parentId].push(node)
  36. return map
  37. },
  38. {}
  39. )
  40. const dashboardNodes = dashboards as IDashboardNode[]
  41. dashboardNodes.forEach((currentNode) => {
  42. const childNodes = mapDashboardNodes[currentNode.id]
  43. if (Array.isArray(childNodes)) {
  44. currentNode.children = childNodes
  45. }
  46. })
  47. const ancestorNodes = dashboardNodes.filter(({ parentId }) => !parentId)
  48. return ancestorNodes
  49. }
  50. export function getRequestParamsByWidgetConfig(
  51. renderType: RenderType,
  52. widgetConfig: IWidgetConfig,
  53. prevQueryConditions: Partial<IQueryConditions>,
  54. queryConditions?: Partial<IQueryConditions>
  55. ) {
  56. const {
  57. cols,
  58. rows,
  59. metrics,
  60. secondaryMetrics,
  61. filters,
  62. color,
  63. label,
  64. size,
  65. xAxis,
  66. tip,
  67. orders,
  68. limit,
  69. cache,
  70. expired
  71. } = widgetConfig
  72. const customOrders = cols
  73. .concat(rows)
  74. .filter(({ sort }) => sort && sort.sortType === FieldSortTypes.Custom)
  75. .map(({ name, sort }) => ({
  76. name,
  77. list: sort[FieldSortTypes.Custom].sortList
  78. }))
  79. let tempFilters // @TODO combine widget static filters with local filters
  80. let linkageFilters
  81. let globalFilters
  82. let tempOrders
  83. let variables
  84. let linkageVariables
  85. let globalVariables
  86. let pagination
  87. let nativeQuery
  88. if (queryConditions) {
  89. tempFilters =
  90. queryConditions.tempFilters !== void 0
  91. ? queryConditions.tempFilters
  92. : prevQueryConditions.tempFilters
  93. linkageFilters =
  94. queryConditions.linkageFilters !== void 0
  95. ? queryConditions.linkageFilters
  96. : prevQueryConditions.linkageFilters
  97. globalFilters =
  98. queryConditions.globalFilters !== void 0
  99. ? queryConditions.globalFilters
  100. : prevQueryConditions.globalFilters
  101. tempOrders =
  102. queryConditions.orders !== void 0
  103. ? queryConditions.orders
  104. : prevQueryConditions.orders
  105. variables = queryConditions.variables || prevQueryConditions.variables
  106. linkageVariables =
  107. queryConditions.linkageVariables || prevQueryConditions.linkageVariables
  108. globalVariables =
  109. queryConditions.globalVariables || prevQueryConditions.globalVariables
  110. pagination = queryConditions.pagination || prevQueryConditions.pagination
  111. nativeQuery = queryConditions.nativeQuery || prevQueryConditions.nativeQuery
  112. } else {
  113. tempFilters = prevQueryConditions.tempFilters
  114. linkageFilters = prevQueryConditions.linkageFilters
  115. globalFilters = prevQueryConditions.globalFilters
  116. tempOrders = prevQueryConditions.orders
  117. variables = prevQueryConditions.variables
  118. linkageVariables = prevQueryConditions.linkageVariables
  119. globalVariables = prevQueryConditions.globalVariables
  120. pagination = prevQueryConditions.pagination
  121. nativeQuery = prevQueryConditions.nativeQuery
  122. }
  123. let groups = cols
  124. .concat(rows)
  125. .filter((g) => g.name !== '指标名称')
  126. .map((g) => g.name)
  127. let aggregators = metrics.map((m) => ({
  128. column: decodeMetricName(m.name),
  129. func: m.agg
  130. }))
  131. if (secondaryMetrics && secondaryMetrics.length) {
  132. aggregators = aggregators.concat(
  133. secondaryMetrics.map((second) => ({
  134. column: decodeMetricName(second.name),
  135. func: second.agg
  136. }))
  137. )
  138. }
  139. if (color) {
  140. groups = groups.concat(color.items.map((c) => c.name))
  141. }
  142. if (label) {
  143. groups = groups.concat(
  144. label.items.filter((l) => l.type === 'category').map((l) => l.name)
  145. )
  146. aggregators = aggregators.concat(
  147. label.items
  148. .filter((l) => l.type === 'value')
  149. .map((l) => ({
  150. column: decodeMetricName(l.name),
  151. func: l.agg
  152. }))
  153. )
  154. }
  155. if (size) {
  156. aggregators = aggregators.concat(
  157. size.items.map((s) => ({
  158. column: decodeMetricName(s.name),
  159. func: s.agg
  160. }))
  161. )
  162. }
  163. if (xAxis) {
  164. aggregators = aggregators.concat(
  165. xAxis.items.map((l) => ({
  166. column: decodeMetricName(l.name),
  167. func: l.agg
  168. }))
  169. )
  170. }
  171. if (tip) {
  172. aggregators = aggregators.concat(
  173. tip.items.map((t) => ({
  174. column: decodeMetricName(t.name),
  175. func: t.agg
  176. }))
  177. )
  178. }
  179. const requestParamsFilters = filters.reduce((a, b) => {
  180. return a.concat(b.config.sqlModel)
  181. }, [])
  182. const requestParams = {
  183. groups,
  184. aggregators,
  185. filters: requestParamsFilters,
  186. tempFilters,
  187. linkageFilters,
  188. globalFilters,
  189. variables,
  190. linkageVariables,
  191. globalVariables,
  192. orders,
  193. limit,
  194. cache,
  195. expired,
  196. flush: renderType === 'flush',
  197. pagination,
  198. nativeQuery,
  199. customOrders
  200. }
  201. if (tempOrders) {
  202. requestParams.orders = requestParams.orders.concat(tempOrders)
  203. }
  204. return requestParams
  205. }