index.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import { QueryVariable } from 'containers/Dashboard/types'
  2. import { DEFAULT_SPLITER, SQL_NUMBER_TYPES } from 'app/globalConstants'
  3. import OperatorType from 'utils/operatorTypes'
  4. import { IFilter } from 'app/components/Control/types'
  5. import {getValidColumnValue} from 'app/components/Control/util'
  6. export type LinkageType = 'column' | 'variable'
  7. export interface ILinkage {
  8. key: string
  9. trigger: [number, string]
  10. linkager: [number, string]
  11. relation: OperatorType
  12. }
  13. export interface IMappingLinkage {
  14. [linkagerId: number]: Array<{
  15. triggerKey: string
  16. triggerSqlType: string
  17. triggerType: LinkageType
  18. linkagerKey: string
  19. linkagerSqlType: string
  20. linkagerType: LinkageType
  21. relation: OperatorType
  22. }>
  23. }
  24. export function getMappingLinkage (itemId: number, linkages: ILinkage[]) {
  25. const mappingLinkage: IMappingLinkage = {}
  26. if (linkages.length <= 0) { return mappingLinkage }
  27. linkages.forEach((l) => {
  28. const { trigger, linkager, relation } = l
  29. const triggerItemId = +trigger[0]
  30. const linkagerItemId = linkager[0]
  31. if (itemId === triggerItemId) {
  32. const [ triggerKey, triggerSqlType, triggerType ] = trigger[1].split(DEFAULT_SPLITER)
  33. const [ linkagerKey, linkagerSqlType, linkagerType ] = linkager[1].split(DEFAULT_SPLITER)
  34. if (!mappingLinkage[linkagerItemId]) {
  35. mappingLinkage[linkagerItemId] = []
  36. }
  37. mappingLinkage[linkagerItemId].push({
  38. triggerKey,
  39. triggerSqlType,
  40. triggerType: triggerType as LinkageType,
  41. linkagerKey,
  42. linkagerSqlType,
  43. linkagerType: linkagerType as LinkageType,
  44. relation
  45. })
  46. }
  47. })
  48. return mappingLinkage
  49. }
  50. export function processLinkage (itemId: number, triggerData, mappingLinkage: IMappingLinkage, interactingLinkage) {
  51. Object.keys(mappingLinkage).forEach((linkagerItemId) => {
  52. const linkage = mappingLinkage[+linkagerItemId]
  53. const linkageFilters: IFilter[] = []
  54. const linkageVariables: QueryVariable = []
  55. linkage.forEach((l) => {
  56. const { triggerKey, triggerSqlType, triggerType, linkagerKey, linkagerSqlType, linkagerType, relation } = l
  57. const actuallyData = Array.isArray(triggerData) ? triggerData[0][triggerKey] : triggerData[triggerKey]
  58. const interactValue = SQL_NUMBER_TYPES.includes(triggerSqlType)
  59. ? actuallyData
  60. : `'${actuallyData}'`
  61. if (linkagerType === 'column') {
  62. const validLinkagerKey = SQL_NUMBER_TYPES.includes(linkagerSqlType)
  63. ? linkagerKey.replace(/\w+\((\w+)\)/, '$1')
  64. : linkagerKey
  65. const filterJson: IFilter = {
  66. name : validLinkagerKey,
  67. type: 'filter',
  68. value: interactValue,
  69. sqlType: linkagerSqlType,
  70. operator: relation
  71. }
  72. linkageFilters.push(filterJson)
  73. // linkageFilters.push(`${validLinkagerKey} ${relation} ${interactValue}`) // 联动filter生成在此处
  74. } else if (linkagerType === 'variable') {
  75. linkageVariables.push({ name: linkagerKey, value: interactValue })
  76. }
  77. })
  78. const existedQueryConditions = interactingLinkage[linkagerItemId]
  79. if (existedQueryConditions) {
  80. const { filters, variables } = existedQueryConditions
  81. existedQueryConditions.filters = linkageFilters.length > 0 ? { ...filters, [itemId]: linkageFilters } : filters
  82. existedQueryConditions.variables = linkageVariables.length > 0 ? { ...variables, [itemId]: linkageVariables } : variables
  83. } else {
  84. interactingLinkage[linkagerItemId] = {
  85. filters: linkageFilters.length > 0 ? { [itemId]: linkageFilters } : {},
  86. variables: linkageVariables.length > 0 ? { [itemId]: linkageVariables } : {}
  87. }
  88. }
  89. })
  90. return interactingLinkage
  91. }
  92. export function removeLinkage (itemId: number, linkages: ILinkage[], interactingLinkage) {
  93. const refreshItemIds = []
  94. if (linkages.length <= 0) { return refreshItemIds }
  95. linkages.forEach((l) => {
  96. const { trigger, linkager } = l
  97. const triggerItemId = +trigger[0]
  98. const linkagerItemId = +linkager[0]
  99. if (itemId === triggerItemId) {
  100. if (interactingLinkage[linkagerItemId]) {
  101. ['filters', 'variables'].forEach((key) => {
  102. if (interactingLinkage[linkagerItemId][key][itemId]) {
  103. delete interactingLinkage[linkagerItemId][key][itemId]
  104. if (refreshItemIds.indexOf(linkagerItemId) < 0) {
  105. refreshItemIds.push(linkagerItemId)
  106. }
  107. }
  108. })
  109. }
  110. }
  111. })
  112. return refreshItemIds
  113. }