diff --git a/packages/web/src/designer/Designer.js b/packages/web/src/designer/Designer.js index b345ed28d..4622dc94f 100644 --- a/packages/web/src/designer/Designer.js +++ b/packages/web/src/designer/Designer.js @@ -6,6 +6,7 @@ import _ from 'lodash'; import useTheme from '../theme/useTheme'; import DesignerReference from './DesignerReference'; import cleanupDesignColumns from './cleanupDesignColumns'; +import { isConnectedByReference } from './generateDesignedQuery'; const Wrapper = styled.div` flex: 1; @@ -130,7 +131,7 @@ export default function Designer({ value, onChange }) { designerId: uuidv1(), sourceId: source.designerId, targetId: target.designerId, - joinType: 'INNER JOIN', + joinType: isConnectedByReference(current, source, target, null) ? 'CROSS JOIN' : 'INNER JOIN', columns: [ { source: source.columnName, @@ -172,6 +173,7 @@ export default function Designer({ value, onChange }) { reference={ref} onChangeReference={changeReference} onRemoveReference={removeReference} + designer={value} /> ))} {(tables || []).map((table) => ( diff --git a/packages/web/src/designer/DesignerReference.js b/packages/web/src/designer/DesignerReference.js index a02ab63d9..fb4d5d135 100644 --- a/packages/web/src/designer/DesignerReference.js +++ b/packages/web/src/designer/DesignerReference.js @@ -5,6 +5,7 @@ import _ from 'lodash'; import useTheme from '../theme/useTheme'; import { useShowMenu } from '../modals/showMenu'; import { DropDownMenuDivider, DropDownMenuItem } from '../modals/DropDownMenu'; +import { isConnectedByReference } from './generateDesignedQuery'; const StyledSvg = styled.svg` position: absolute; @@ -37,18 +38,22 @@ const ReferenceText = styled.span` background-color: ${(props) => props.theme.designer_background}; `; -function ReferenceContextMenu({ remove, setJoinType }) { +function ReferenceContextMenu({ remove, setJoinType, isConnected }) { return ( <> Remove - - setJoinType('INNER JOIN')}>Set INNER JOIN - setJoinType('LEFT JOIN')}>Set LEFT JOIN - setJoinType('RIGHT JOIN')}>Set RIGHT JOIN - setJoinType('FULL OUTER JOIN')}>Set FULL OUTER JOIN - setJoinType('CROSS JOIN')}>Set CROSS JOIN - setJoinType('WHERE EXISTS')}>Set WHERE EXISTS - setJoinType('WHERE NOT EXISTS')}>Set WHERE NOT EXISTS + {!isConnected && ( + <> + + setJoinType('INNER JOIN')}>Set INNER JOIN + setJoinType('LEFT JOIN')}>Set LEFT JOIN + setJoinType('RIGHT JOIN')}>Set RIGHT JOIN + setJoinType('FULL OUTER JOIN')}>Set FULL OUTER JOIN + setJoinType('CROSS JOIN')}>Set CROSS JOIN + setJoinType('WHERE EXISTS')}>Set WHERE EXISTS + setJoinType('WHERE NOT EXISTS')}>Set WHERE NOT EXISTS + + )} ); } @@ -59,6 +64,7 @@ export default function DesignerReference({ changeToken, onRemoveReference, onChangeReference, + designer, }) { const { designerId, sourceId, targetId, columns, joinType } = reference; const theme = useTheme(); @@ -104,6 +110,7 @@ export default function DesignerReference({ event.pageY, onRemoveReference({ designerId })} + isConnected={isConnectedByReference(designer, { designerId: sourceId }, { designerId: targetId }, reference)} setJoinType={(joinType) => { onChangeReference({ ...reference, diff --git a/packages/web/src/designer/generateDesignedQuery.ts b/packages/web/src/designer/generateDesignedQuery.ts index c95aa5862..3f03ffd5f 100644 --- a/packages/web/src/designer/generateDesignedQuery.ts +++ b/packages/web/src/designer/generateDesignedQuery.ts @@ -26,6 +26,9 @@ class DesignerComponent { get parentTables() { return this.parentComponent ? this.parentComponent.myAndParentTables : []; } + get thisAndSubComponentsTables() { + return [...this.tables, ..._.flatten(this.subComponents.map((x) => x.thisAndSubComponentsTables))]; + } } function referenceIsConnecting( @@ -221,7 +224,6 @@ function findPrimaryTable(tables: DesignerTableInfo[]) { return _.minBy(tables, (x) => x.top); } - function getReferenceConditions(reference: DesignerReferenceInfo, designer: DesignerInfo): Condition[] { const sourceTable = designer.tables.find((x) => x.designerId == reference.sourceId); const targetTable = designer.tables.find((x) => x.designerId == reference.targetId); @@ -260,3 +262,21 @@ export default function generateDesignedQuery(designer: DesignerInfo, engine: En dumpSqlSelect(dmp, select); return dmp.s; } + +export function isConnectedByReference( + designer: DesignerInfo, + table1: { designerId: string }, + table2: { designerId: string }, + withoutRef: { designerId: string } +) { + const creator = new DesignerComponentCreator({ + ...designer, + references: withoutRef + ? designer.references.filter((x) => x.designerId != withoutRef.designerId) + : designer.references, + }); + const arrays = creator.components.map((x) => x.thisAndSubComponentsTables); + const array1 = arrays.find((a) => a.find((x) => x.designerId == table1.designerId)); + const array2 = arrays.find((a) => a.find((x) => x.designerId == table2.designerId)); + return array1 == array2; +}