diff --git a/console/src/components/Services/Data/DataState.js b/console/src/components/Services/Data/DataState.js index ba9060c9b075a..87bfd05891a95 100644 --- a/console/src/components/Services/Data/DataState.js +++ b/console/src/components/Services/Data/DataState.js @@ -86,9 +86,9 @@ const defaultModifyState = { name: '', tableName: '', isObjRel: null, - lcol: '', + lcol: [], rTable: null, - rcol: '', + rcol: [], manualColumns: [], isManualExpanded: false, manualRelInfo: { diff --git a/console/src/components/Services/Data/Schema/AutoAddRelations.js b/console/src/components/Services/Data/Schema/AutoAddRelations.js index 831a1cdd810d6..6a399fb02d8eb 100644 --- a/console/src/components/Services/Data/Schema/AutoAddRelations.js +++ b/console/src/components/Services/Data/Schema/AutoAddRelations.js @@ -9,14 +9,13 @@ import { autoAddRelName, } from '../TableRelationships/Actions'; import { getRelationshipLine } from '../TableRelationships/Relationships'; -import suggestedRelationshipsRaw from '../TableRelationships/autoRelations'; class AutoAddRelations extends Component { - trackAllRelations = () => { - this.props.dispatch(autoTrackRelations()); + trackAllRelations = untrackedData => { + this.props.dispatch(autoTrackRelations(untrackedData)); }; render() { - const { schema, untrackedRelations, dispatch } = this.props; + const { untrackedRelations, dispatch } = this.props; const styles = require('../PageContainer/PageContainer.scss'); const handleAutoAddIndivRel = obj => { dispatch(autoAddRelName(obj)); @@ -32,64 +31,32 @@ class AutoAddRelations extends Component { ); } - const untrackedIndivHtml = []; - schema.map(table => { - const currentTable = table.table_name; - const currentTableRel = suggestedRelationshipsRaw(currentTable, schema); - currentTableRel.objectRel.map(obj => { - untrackedIndivHtml.push( -
- -
- {obj.tableName} -{' '} - {getRelationshipLine( - obj.isObjRel, - obj.lcol, - obj.rcol, - obj.rTable - )} -
-
- ); - }); - currentTableRel.arrayRel.map(obj => { - untrackedIndivHtml.push( -
{ + return ( +
+ -
- {obj.tableName} -{' '} - {getRelationshipLine( - obj.isObjRel, - obj.lcol, - obj.rcol, - obj.rTable - )} -
+ Add + +
+ {obj.data.tableName} -{' '} + {getRelationshipLine( + obj.data.isObjRel, + obj.data.lcol, + obj.data.rcol, + obj.data.rTable + )}
- ); - }); +
+ ); }); return (
@@ -109,7 +76,7 @@ class AutoAddRelations extends Component {
)} -
{untrackedIndivHtml}
+
{untrackData}
); } diff --git a/console/src/components/Services/Data/TableCommon/TableReducer.js b/console/src/components/Services/Data/TableCommon/TableReducer.js index 72d05d5b3e879..8b73f6a310231 100644 --- a/console/src/components/Services/Data/TableCommon/TableReducer.js +++ b/console/src/components/Services/Data/TableCommon/TableReducer.js @@ -161,9 +161,9 @@ const modifyReducer = (tableName, schemas, modifyStateOrig, action) => { tableName: '', name: '', isObjRel: null, - lcol: '', + lcol: [], rTable: null, - rcol: '', + rcol: [], manualColumns: [], }, }; diff --git a/console/src/components/Services/Data/TableRelationships/Actions.js b/console/src/components/Services/Data/TableRelationships/Actions.js index 2e8820424c6d0..c542136e8e8f6 100644 --- a/console/src/components/Services/Data/TableRelationships/Actions.js +++ b/console/src/components/Services/Data/TableRelationships/Actions.js @@ -36,39 +36,125 @@ const relTypeChange = isObjRel => ({ }); const relRTableChange = rTable => ({ type: REL_SET_RTABLE, rTable }); -const deleteRelMigrate = (tableName, relName, lcol, rtable, rcol, isObjRel) => ( - dispatch, - getState +const generateRelationshipsQuery = ( + tableName, + relName, + lcol, + rTable, + rcol, + isObjRel, + currentSchema ) => { - const currentSchema = getState().tables.currentSchema; - const relChangesUp = [ - { + if (isObjRel) { + const upQuery = { + type: 'create_object_relationship', + args: { + name: relName, + table: { + name: tableName, + schema: currentSchema, + }, + using: {}, + }, + }; + const columnMaps = lcol.map((column, index) => ({ + lcol: column, + rcol: rcol[index], + })); + if (columnMaps.length === 1) { + upQuery.args.using = { + foreign_key_constraint_on: lcol[0], + }; + } else { + const columnReducer = (accumulator, val) => ({ + ...accumulator, + [val.lcol]: val.rcol, + }); + upQuery.args.using = { + manual_configuration: { + remote_table: { + name: rTable, + schema: currentSchema, + }, + column_mapping: columnMaps.reduce(columnReducer, {}), + }, + }; + } + const downQuery = { type: 'drop_relationship', args: { table: { name: tableName, schema: currentSchema }, relationship: relName, }, + }; + return { upQuery, downQuery }; + } + const upQuery = { + type: 'create_array_relationship', + args: { + name: relName, + table: { + name: tableName, + schema: currentSchema, + }, + using: {}, }, - ]; - const relChangesDown = [ - { - type: isObjRel - ? 'create_object_relationship' - : 'create_array_relationship', - args: { - name: relName, - table: { name: tableName, schema: currentSchema }, - using: isObjRel - ? { foreign_key_constraint_on: lcol } - : { - foreign_key_constraint_on: { - table: { name: rtable, schema: currentSchema }, - column: rcol, - }, - }, + }; + const columnMaps = rcol.map((column, index) => ({ + rcol: column, + lcol: lcol[index], + })); + if (columnMaps.length === 1) { + upQuery.args.using = { + foreign_key_constraint_on: { + table: { + name: rTable, + schema: currentSchema, + }, + column: rcol[0], + }, + }; + } else { + const columnReducer = (accumulator, val) => ({ + ...accumulator, + [val.rcol]: val.lcol, + }); + upQuery.args.using = { + manual_configuration: { + remote_table: { + name: rTable, + schema: currentSchema, + }, + column_mapping: columnMaps.reduce(columnReducer, {}), }, + }; + } + const downQuery = { + type: 'drop_relationship', + args: { + table: { name: tableName, schema: currentSchema }, + relationship: relName, }, - ]; + }; + return { upQuery, downQuery }; +}; + +const deleteRelMigrate = (tableName, relName, lcol, rtable, rcol, isObjRel) => ( + dispatch, + getState +) => { + const currentSchema = getState().tables.currentSchema; + const { upQuery, downQuery } = generateRelationshipsQuery( + tableName, + relName, + lcol, + rtable, + rcol, + isObjRel, + currentSchema + ); + const relChangesUp = [downQuery]; + const relChangesDown = [upQuery]; // Apply migrations const migrationName = `drop_relationship_${relName}_${currentSchema}_table_${tableName}`; @@ -97,35 +183,16 @@ const deleteRelMigrate = (tableName, relName, lcol, rtable, rcol, isObjRel) => ( const addRelNewFromStateMigrate = () => (dispatch, getState) => { const state = getState().tables.modify.relAdd; const currentSchema = getState().tables.currentSchema; - const isObjRel = state.isObjRel; - const relChangesUp = [ - { - type: isObjRel - ? 'create_object_relationship' - : 'create_array_relationship', - args: { - name: state.name, - table: { name: state.tableName, schema: currentSchema }, - using: isObjRel - ? { foreign_key_constraint_on: state.lcol } - : { - foreign_key_constraint_on: { - table: { name: state.rTable, schema: currentSchema }, - column: state.rcol, - }, - }, - }, - }, - ]; - const relChangesDown = [ - { - type: 'drop_relationship', - args: { - table: { name: state.tableName, schema: currentSchema }, - relationship: state.name, - }, - }, - ]; + const { upQuery, downQuery } = generateRelationshipsQuery( + state.tableName, + state.name, + state.lcol, + state.rTable, + state.rcol, + state.isObjRel + ); + const relChangesUp = [upQuery]; + const relChangesDown = [downQuery]; // Apply migrations const migrationName = `add_relationship_${ @@ -272,10 +339,10 @@ const formRelName = relMeta => { // remove special chars and change first letter after underscore to uppercase const targetTable = sanitizeRelName(relMeta.rTable); if (relMeta.isObjRel) { - const objLCol = sanitizeRelName(relMeta.lcol); + const objLCol = sanitizeRelName(relMeta.lcol.join(',')); finalRelName = `${targetTable}By${objLCol}`; } else { - const arrRCol = sanitizeRelName(relMeta.rcol); + const arrRCol = sanitizeRelName(relMeta.rcol.join(',')); finalRelName = `${ targetTable @@ -296,67 +363,49 @@ const getAllUnTrackedRelations = (allSchemas, currentSchema) => { // check relations.obj and relations.arr length and form queries if (table.relations.objectRel.length) { table.relations.objectRel.map(indivObjectRel => { - bulkRelTrack.push({ - type: 'create_object_relationship', - args: { - name: formRelName(indivObjectRel), // name logic - table: { - name: indivObjectRel.tableName, - schema: currentSchema, - }, - using: { foreign_key_constraint_on: indivObjectRel.lcol }, - }, - }); - bulkRelTrackDown.push({ - type: 'drop_relationship', - args: { - table: { name: indivObjectRel.tableName, schema: currentSchema }, - relationship: formRelName(indivObjectRel), - }, - }); + const { upQuery, downQuery } = generateRelationshipsQuery( + indivObjectRel.tableName, + formRelName(indivObjectRel), + indivObjectRel.lcol, + indivObjectRel.rTable, + indivObjectRel.rcol, + true, + currentSchema + ); + const objTrack = { + upQuery, + downQuery, + data: indivObjectRel, + }; + bulkRelTrack.push(objTrack); }); } if (table.relations.arrayRel.length) { table.relations.arrayRel.map(indivArrayRel => { - bulkRelTrack.push({ - type: 'create_array_relationship', - args: { - name: formRelName(indivArrayRel), // name logic - table: { - name: indivArrayRel.tableName, - schema: currentSchema, - }, - using: { - foreign_key_constraint_on: { - table: { - name: indivArrayRel.rTable, - schema: currentSchema, - }, - column: indivArrayRel.rcol, - }, - }, - }, - }); - bulkRelTrackDown.push({ - type: 'drop_relationship', - args: { - table: { name: indivArrayRel.tableName, schema: currentSchema }, - relationship: formRelName(indivArrayRel), - }, - }); + const { upQuery, downQuery } = generateRelationshipsQuery( + indivArrayRel.tableName, + formRelName(indivArrayRel), + indivArrayRel.lcol, + indivArrayRel.rTable, + indivArrayRel.rcol, + false, + currentSchema + ); + const arrTrack = { + upQuery, + downQuery, + data: indivArrayRel, + }; + bulkRelTrack.push(arrTrack); }); } }); return { bulkRelTrack: bulkRelTrack, bulkRelTrackDown: bulkRelTrackDown }; }; -const autoTrackRelations = () => (dispatch, getState) => { - const allSchemas = getState().tables.allSchemas; - const currentSchema = getState().tables.currentSchema; - const relChangesUp = getAllUnTrackedRelations(allSchemas, currentSchema) - .bulkRelTrack; - const relChangesDown = getAllUnTrackedRelations(allSchemas, currentSchema) - .bulkRelTrackDown; +const autoTrackRelations = autoTrackData => (dispatch, getState) => { + const relChangesUp = autoTrackData.map(data => data.upQuery); + const relChangesDown = autoTrackData.map(data => data.downQuery); // Apply migrations const migrationName = 'track_all_relationships'; @@ -384,41 +433,14 @@ const autoTrackRelations = () => (dispatch, getState) => { const autoAddRelName = obj => (dispatch, getState) => { const currentSchema = getState().tables.currentSchema; - const isObjRel = obj.isObjRel; - const relName = formRelName(obj); + const relName = obj.upQuery.args.name; - const relChangesUp = [ - { - type: isObjRel - ? 'create_object_relationship' - : 'create_array_relationship', - args: { - name: relName, - table: { name: obj.tableName, schema: currentSchema }, - using: isObjRel - ? { foreign_key_constraint_on: obj.lcol } - : { - foreign_key_constraint_on: { - table: { name: obj.rTable, schema: currentSchema }, - column: obj.rcol, - }, - }, - }, - }, - ]; - const relChangesDown = [ - { - type: 'drop_relationship', - args: { - table: { name: obj.tableName, schema: currentSchema }, - relationship: relName, - }, - }, - ]; + const relChangesUp = [obj.upQuery]; + const relChangesDown = [obj.downQuery]; // Apply migrations const migrationName = `add_relationship_${relName}_table_${currentSchema}_${ - obj.tableName + obj.data.tableName }`; const requestMsg = 'Adding Relationship...'; diff --git a/console/src/components/Services/Data/TableRelationships/Relationships.js b/console/src/components/Services/Data/TableRelationships/Relationships.js index 4bc360ac772dd..ef1311fbbfa8d 100644 --- a/console/src/components/Services/Data/TableRelationships/Relationships.js +++ b/console/src/components/Services/Data/TableRelationships/Relationships.js @@ -17,6 +17,7 @@ import { setTable } from '../DataActions'; import gqlPattern, { gqlRelErrorNotif } from '../Common/GraphQLValidation'; import AddManualRelationship from './AddManualRelationship'; +import suggestedRelationshipsRaw from './autoRelations'; /* Gets the complete list of relationships and converts it to a list of object, which looks like so : { @@ -46,16 +47,16 @@ const getRelationshipLine = (isObjRel, lcol, rcol, rTable) => { return isObjRel ? (   - {lcol} + {lcol.join(',')}   →   - {rTable} :: {rcol} + {rTable} :: {rcol.join(',')} ) : (   - {finalRTable} :: {rcol} + {finalRTable} :: {rcol.join(',')}   →   - {lcol} + {lcol.join(',')} ); }; @@ -97,149 +98,6 @@ const relationshipView = ( ); }; -/* Returns all the possible relationships in the format -{ -objRel: {}, -arrRel: {} -} */ -const suggestedRelationships = (tableName, allSchemas) => { - const suggestedRelationshipArray = []; - const objRels = []; - const arrRels = []; - const currentTableSchema = allSchemas.find(t => t.table_name === tableName); - const currentTableRelationships = currentTableSchema.relationships; - const currentObjRels = currentTableRelationships.filter( - r => r.rel_type === 'object' - ); - const currentArrRels = currentTableRelationships.filter( - r => r.rel_type !== 'object' - ); - for (let i = 0; i < allSchemas.length; i++) { - const schema = allSchemas[i]; - const foreignKeyConstraints = schema.foreign_key_constraints; - for (let j = 0; j < foreignKeyConstraints.length; j++) { - const constraint = foreignKeyConstraints[j]; - if (constraint.table_name === tableName) { - /* Object Relationships */ - const lcol = Object.keys(constraint.column_mapping)[0]; - let isExistingObjRel = false; - for (let k = 0; k < currentObjRels.length; k++) { - // check if this is already an existing relationship - if (currentObjRels[k].rel_def.foreign_key_constraint_on === lcol) { - // existing relationship - isExistingObjRel = true; - } - } - if (!isExistingObjRel) { - objRels.push({ - tableName, - isObjRel: true, - name: null, - lcol, - rcol: - constraint.column_mapping[ - Object.keys(constraint.column_mapping)[0] - ], - rTable: constraint.ref_table, - }); - } - } else if (constraint.ref_table === tableName) { - /* Array Relationships */ - const rcol = Object.keys(constraint.column_mapping)[0]; - const rTable = constraint.table_name; - let isExistingArrayRel = false; - - for (let k = 0; k < currentArrRels.length; k++) { - // check if this is already an existing relationship - const relDef = currentArrRels[k].rel_def; - let currTable = null; - let currRCol = null; - - if (relDef.foreign_key_constraint_on) { - const tempTable = relDef.foreign_key_constraint_on.table; - currTable = tempTable.name - ? relDef.foreign_key_constraint_on.table.name - : tempTable; - currRCol = relDef.foreign_key_constraint_on.column; - } else { - currTable = relDef.manual_configuration.remote_table; - currRCol = Object.values( - relDef.manual_configuration.column_mapping - )[0]; - } - - if (currRCol === rcol && currTable === constraint.table_name) { - // existing relationship - isExistingArrayRel = true; - } - } - if (!isExistingArrayRel) { - arrRels.push({ - tableName, - isObjRel: false, - name: null, - rcol, - lcol: - constraint.column_mapping[ - Object.keys(constraint.column_mapping)[0] - ], - rTable, - }); - } - } - - /* Self Referencing Array Relationships */ - if ( - constraint.ref_table === tableName && - constraint.table_name === tableName - ) { - const rcol = Object.keys(constraint.column_mapping)[0]; - const rTable = constraint.table_name; - let isExistingArrayRel = false; - - for (let k = 0; k < currentArrRels.length; k++) { - // check if this is already an existing relationship - if ( - currentArrRels[k].rel_def.foreign_key_constraint_on.column === - rcol && - currentArrRels[k].rel_def.foreign_key_constraint_on.table === - constraint.table_name - ) { - // existing relationship - isExistingArrayRel = true; - } - } - if (!isExistingArrayRel) { - arrRels.push({ - tableName, - isObjRel: false, - name: null, - rcol, - lcol: - constraint.column_mapping[ - Object.keys(constraint.column_mapping)[0] - ], - rTable, - }); - } - } - } - } - - const length = - objRels.length > arrRels.length ? objRels.length : arrRels.length; - for (let i = 0; i < length; i++) { - const objRel = objRels[i] ? objRels[i] : null; - const arrRel = arrRels[i] ? arrRels[i] : null; - suggestedRelationshipArray.push({ - objRel, - arrRel, - }); - } - - return suggestedRelationshipArray; -}; - const addRelationshipCellView = ( dispatch, rel, @@ -283,7 +141,6 @@ const addRelationshipCellView = ( dispatch(addRelNewFromStateMigrate()); }; const styles = require('../TableModify/Modify.scss'); - return (
@@ -341,12 +198,15 @@ const AddRelationship = ({ tableStyles, }) => { // eslint-disable-line no-unused-vars - const suggestedRelationshipsArray = suggestedRelationships( + const suggestedRelationshipsData = suggestedRelationshipsRaw( tableName, allSchemas ); const styles = require('../TableModify/Modify.scss'); - if (suggestedRelationshipsArray.length < 1) { + if ( + suggestedRelationshipsData.objectRel.length < 1 && + suggestedRelationshipsData.arrayRel.length < 1 + ) { return (
); } + let selectedRelationship; // Finding the object from the suggestedRelationshipsArray which is currently selected - let selectedRelationship = suggestedRelationshipsArray.find(rel => { - let r = rel.arrRel; - if (cachedRelationshipData.isObjRel) { - r = rel.objRel; - } - if (!r) { - return false; - } - return ( - r.lcol === cachedRelationshipData.lcol && - r.rcol === cachedRelationshipData.rcol && - r.rTable === cachedRelationshipData.rTable && - r.tableName === cachedRelationshipData.tableName - ); - }); + if (cachedRelationshipData.isObjRel) { + selectedRelationship = suggestedRelationshipsData.objectRel.find(rel => { + return ( + rel.lcol.join(',') === cachedRelationshipData.lcol.join(',') && + rel.rcol.join(',') === cachedRelationshipData.rcol.join(',') && + rel.rTable === cachedRelationshipData.rTable && + rel.tableName === cachedRelationshipData.tableName + ); + }); + } else { + selectedRelationship = suggestedRelationshipsData.arrayRel.find(rel => { + return ( + rel.lcol.join(',') === cachedRelationshipData.lcol.join(',') && + rel.rcol.join(',') === cachedRelationshipData.rcol.join(',') && + rel.rTable === cachedRelationshipData.rTable && + rel.tableName === cachedRelationshipData.tableName + ); + }); + } /* selectedRelationship right now equals : { @@ -380,16 +245,55 @@ const AddRelationship = ({ arrRel: {SomeValue} } This strips it down to either objRel or arrRel */ - if (selectedRelationship) { - selectedRelationship = cachedRelationshipData.isObjRel - ? selectedRelationship.objRel - : selectedRelationship.arrRel; - } const relName = cachedRelationshipData.name ? cachedRelationshipData.name : ''; - + const column1 = []; + const column2 = []; + suggestedRelationshipsData.objectRel.map((rel, i) => { + column1.push( + rel.isObjRel ? ( + addRelationshipCellView( + dispatch, + rel, + selectedRelationship, + relName, + tableStyles, + ['object', i] + ) + ) : ( + + ) + ); + }); + suggestedRelationshipsData.arrayRel.map((rel, i) => { + column2.push( + rel.isObjRel ? ( + + ) : ( + addRelationshipCellView( + dispatch, + rel, + selectedRelationship, + relName, + tableStyles, + ['array', i] + ) + ) + ); + }); + const length = + column1.length > column2.length ? column1.length : column2.length; + const combinedRels = []; + for (let i = 0; i < length; i++) { + const objRel = column1[i] ? column1[i] : ; + const arrRel = column2[i] ? column2[i] : ; + combinedRels.push({ + objRel, + arrRel, + }); + } return (
@@ -412,35 +316,11 @@ const AddRelationship = ({ - {suggestedRelationshipsArray.map((rel, i) => { - const column1 = rel.objRel ? ( - addRelationshipCellView( - dispatch, - rel.objRel, - selectedRelationship, - relName, - tableStyles, - ['object', i] - ) - ) : ( - - ); - const column2 = rel.arrRel ? ( - addRelationshipCellView( - dispatch, - rel.arrRel, - selectedRelationship, - relName, - tableStyles, - ['array', i] - ) - ) : ( - - ); + {combinedRels.map((rel, i) => { return ( - {column1} - {column2} + {rel.objRel} + {rel.arrRel} ); })} @@ -510,7 +390,6 @@ class Relationships extends Component {
); } - const addedRelationshipsView = getObjArrayRelationshipList(tableSchema.relationships).length > 0 ? (
@@ -677,4 +556,4 @@ const relationshipsConnector = connect => export default relationshipsConnector; -export { suggestedRelationships, getRelationshipLine }; +export { getRelationshipLine }; diff --git a/console/src/components/Services/Data/TableRelationships/autoRelations.js b/console/src/components/Services/Data/TableRelationships/autoRelations.js index b77af604dc84f..e17a26e915640 100644 --- a/console/src/components/Services/Data/TableRelationships/autoRelations.js +++ b/console/src/components/Services/Data/TableRelationships/autoRelations.js @@ -16,13 +16,29 @@ const suggestedRelationshipsRaw = (tableName, allSchemas) => { const constraint = foreignKeyConstraints[j]; if (constraint.table_name === tableName) { /* Object Relationships */ - const lcol = Object.keys(constraint.column_mapping)[0]; + const lcol = Object.keys(constraint.column_mapping); let isExistingObjRel = false; for (let k = 0; k < currentObjRels.length; k++) { - // check if this is already an existing relationship - if (currentObjRels[k].rel_def.foreign_key_constraint_on === lcol) { - // existing relationship - isExistingObjRel = true; + if (currentObjRels[k].rel_def.foreign_key_constraint_on) { + // check if this is already an existing relationship + if ( + currentObjRels[k].rel_def.foreign_key_constraint_on === lcol[0] + ) { + // existing relationship + isExistingObjRel = true; + } + } else { + // check if this is already an existing relationship + if ( + Object.keys( + currentObjRels[k].rel_def.manual_configuration.column_mapping + ) + .sort() + .join(',') === lcol.sort().join(',') + ) { + // existing relationship + isExistingObjRel = true; + } } } if (!isExistingObjRel) { @@ -31,16 +47,13 @@ const suggestedRelationshipsRaw = (tableName, allSchemas) => { isObjRel: true, name: null, lcol: lcol, - rcol: - constraint.column_mapping[ - Object.keys(constraint.column_mapping)[0] - ], + rcol: lcol.map(column => constraint.column_mapping[column]), rTable: constraint.ref_table, }); } } else if (constraint.ref_table === tableName) { /* Array Relationships */ - const rcol = Object.keys(constraint.column_mapping)[0]; + const rcol = Object.keys(constraint.column_mapping); const rTable = constraint.table_name; let isExistingArrayRel = false; @@ -52,15 +65,18 @@ const suggestedRelationshipsRaw = (tableName, allSchemas) => { if (relDef.foreign_key_constraint_on) { currTable = relDef.foreign_key_constraint_on.table; - currRCol = relDef.foreign_key_constraint_on.column; + currRCol = [relDef.foreign_key_constraint_on.column]; } else { currTable = relDef.manual_configuration.remote_table; currRCol = Object.values( relDef.manual_configuration.column_mapping - )[0]; + ); } - if (currRCol === rcol && currTable === constraint.table_name) { + if ( + currRCol.sort().join(',') === rcol.sort().join(',') && + currTable === constraint.table_name + ) { // existing relationship isExistingArrayRel = true; } @@ -71,10 +87,7 @@ const suggestedRelationshipsRaw = (tableName, allSchemas) => { isObjRel: false, name: null, rcol: rcol, - lcol: - constraint.column_mapping[ - Object.keys(constraint.column_mapping)[0] - ], + lcol: rcol.map(column => constraint.column_mapping[column]), rTable: rTable, }); } @@ -85,7 +98,7 @@ const suggestedRelationshipsRaw = (tableName, allSchemas) => { constraint.ref_table === tableName && constraint.table_name === tableName ) { - const rcol = Object.keys(constraint.column_mapping)[0]; + const rcol = Object.keys(constraint.column_mapping); const rTable = constraint.table_name; let isExistingArrayRel = false; @@ -107,10 +120,7 @@ const suggestedRelationshipsRaw = (tableName, allSchemas) => { isObjRel: false, name: null, rcol: rcol, - lcol: - constraint.column_mapping[ - Object.keys(constraint.column_mapping)[0] - ], + lcol: rcol.map(column => constraint.column_mapping[column]), rTable: rTable, }); } diff --git a/console/src/components/Services/Data/utils.js b/console/src/components/Services/Data/utils.js index e27a01d686d80..0ab0553da89ce 100644 --- a/console/src/components/Services/Data/utils.js +++ b/console/src/components/Services/Data/utils.js @@ -10,11 +10,10 @@ const ordinalColSort = (a, b) => { const findFKConstraint = (curTable, column) => { const fkConstraints = curTable.foreign_key_constraints; - return fkConstraints.find( fk => - Object.keys(fk.column_mapping).length === 1 && - Object.keys(fk.column_mapping)[0] === column + Object.keys(fk.column_mapping).length === column.length && + Object.keys(fk.column_mapping).join(',') === column.join(',') ); }; @@ -33,7 +32,7 @@ const findTableFromRel = (schemas, curTable, rel) => { if (rel.rel_def.foreign_key_constraint_on !== undefined) { // for object relationship if (rel.rel_type === 'object') { - const column = rel.rel_def.foreign_key_constraint_on; + const column = [rel.rel_def.foreign_key_constraint_on]; const fkc = findFKConstraint(curTable, column); if (fkc) { rtable = fkc.ref_table; @@ -48,7 +47,6 @@ const findTableFromRel = (schemas, curTable, rel) => { } } } - return schemas.find(x => x.table_name === rtable); }; @@ -67,27 +65,27 @@ const findAllFromRel = (schemas, curTable, rel) => { rtable = rtable.name; } const columnMapping = rel.rel_def.manual_configuration.column_mapping; - lcol = Object.keys(columnMapping)[0]; - rcol = columnMapping[lcol]; + lcol = Object.keys(columnMapping); + rcol = lcol.map(column => columnMapping[column]); } // for table if (foreignKeyConstraintOn !== undefined) { // for object relationship if (rel.rel_type === 'object') { - lcol = foreignKeyConstraintOn; + lcol = [foreignKeyConstraintOn]; const fkc = findFKConstraint(curTable, lcol); if (fkc) { rtable = fkc.ref_table; - rcol = fkc.column_mapping[lcol]; + rcol = [fkc.column_mapping[lcol]]; } } // for array relationship if (rel.rel_type === 'array') { rtable = foreignKeyConstraintOn.table; - rcol = foreignKeyConstraintOn.column; + rcol = [foreignKeyConstraintOn.column]; if (rtable.schema) { // if schema exists, its not public schema rtable = rtable.name; @@ -95,10 +93,9 @@ const findAllFromRel = (schemas, curTable, rel) => { const rtableSchema = schemas.find(x => x.table_name === rtable); const rfkc = findFKConstraint(rtableSchema, rcol); - lcol = rfkc.column_mapping[rcol]; + lcol = [rfkc.column_mapping[rcol]]; } } - return { lcol, rtable, rcol }; };