123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- import { QueryVariable } from 'containers/Dashboard/types'
- import { DEFAULT_SPLITER, SQL_NUMBER_TYPES } from 'app/globalConstants'
- import OperatorType from 'utils/operatorTypes'
- import { IFilter } from 'app/components/Control/types'
- import {getValidColumnValue} from 'app/components/Control/util'
- export type LinkageType = 'column' | 'variable'
- export interface ILinkage {
- key: string
- trigger: [number, string]
- linkager: [number, string]
- relation: OperatorType
- }
- export interface IMappingLinkage {
- [linkagerId: number]: Array<{
- triggerKey: string
- triggerSqlType: string
- triggerType: LinkageType
- linkagerKey: string
- linkagerSqlType: string
- linkagerType: LinkageType
- relation: OperatorType
- }>
- }
- export function getMappingLinkage (itemId: number, linkages: ILinkage[]) {
- const mappingLinkage: IMappingLinkage = {}
- if (linkages.length <= 0) { return mappingLinkage }
- linkages.forEach((l) => {
- const { trigger, linkager, relation } = l
- const triggerItemId = +trigger[0]
- const linkagerItemId = linkager[0]
- if (itemId === triggerItemId) {
- const [ triggerKey, triggerSqlType, triggerType ] = trigger[1].split(DEFAULT_SPLITER)
- const [ linkagerKey, linkagerSqlType, linkagerType ] = linkager[1].split(DEFAULT_SPLITER)
- if (!mappingLinkage[linkagerItemId]) {
- mappingLinkage[linkagerItemId] = []
- }
- mappingLinkage[linkagerItemId].push({
- triggerKey,
- triggerSqlType,
- triggerType: triggerType as LinkageType,
- linkagerKey,
- linkagerSqlType,
- linkagerType: linkagerType as LinkageType,
- relation
- })
- }
- })
- return mappingLinkage
- }
- export function processLinkage (itemId: number, triggerData, mappingLinkage: IMappingLinkage, interactingLinkage) {
- Object.keys(mappingLinkage).forEach((linkagerItemId) => {
- const linkage = mappingLinkage[+linkagerItemId]
- const linkageFilters: IFilter[] = []
- const linkageVariables: QueryVariable = []
- linkage.forEach((l) => {
- const { triggerKey, triggerSqlType, triggerType, linkagerKey, linkagerSqlType, linkagerType, relation } = l
- const actuallyData = Array.isArray(triggerData) ? triggerData[0][triggerKey] : triggerData[triggerKey]
- const interactValue = SQL_NUMBER_TYPES.includes(triggerSqlType)
- ? actuallyData
- : `'${actuallyData}'`
- if (linkagerType === 'column') {
- const validLinkagerKey = SQL_NUMBER_TYPES.includes(linkagerSqlType)
- ? linkagerKey.replace(/\w+\((\w+)\)/, '$1')
- : linkagerKey
- const filterJson: IFilter = {
- name : validLinkagerKey,
- type: 'filter',
- value: interactValue,
- sqlType: linkagerSqlType,
- operator: relation
- }
- linkageFilters.push(filterJson)
- // linkageFilters.push(`${validLinkagerKey} ${relation} ${interactValue}`) // 联动filter生成在此处
- } else if (linkagerType === 'variable') {
- linkageVariables.push({ name: linkagerKey, value: interactValue })
- }
- })
- const existedQueryConditions = interactingLinkage[linkagerItemId]
- if (existedQueryConditions) {
- const { filters, variables } = existedQueryConditions
- existedQueryConditions.filters = linkageFilters.length > 0 ? { ...filters, [itemId]: linkageFilters } : filters
- existedQueryConditions.variables = linkageVariables.length > 0 ? { ...variables, [itemId]: linkageVariables } : variables
- } else {
- interactingLinkage[linkagerItemId] = {
- filters: linkageFilters.length > 0 ? { [itemId]: linkageFilters } : {},
- variables: linkageVariables.length > 0 ? { [itemId]: linkageVariables } : {}
- }
- }
- })
- return interactingLinkage
- }
- export function removeLinkage (itemId: number, linkages: ILinkage[], interactingLinkage) {
- const refreshItemIds = []
- if (linkages.length <= 0) { return refreshItemIds }
- linkages.forEach((l) => {
- const { trigger, linkager } = l
- const triggerItemId = +trigger[0]
- const linkagerItemId = +linkager[0]
- if (itemId === triggerItemId) {
- if (interactingLinkage[linkagerItemId]) {
- ['filters', 'variables'].forEach((key) => {
- if (interactingLinkage[linkagerItemId][key][itemId]) {
- delete interactingLinkage[linkagerItemId][key][itemId]
- if (refreshItemIds.indexOf(linkagerItemId) < 0) {
- refreshItemIds.push(linkagerItemId)
- }
- }
- })
- }
- }
- })
- return refreshItemIds
- }
|