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.data.tableName} -{' '}
+ {getRelationshipLine(
+ obj.data.isObjRel,
+ obj.data.lcol,
+ obj.data.rcol,
+ obj.data.rTable
+ )}
- );
- });
+
+ );
});
return (
@@ -109,7 +76,7 @@ class AutoAddRelations extends Component {
)}
Track All Relations
-
{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 };
};
|