From 6344ca5181f21e320502517565c7a16805b6ec57 Mon Sep 17 00:00:00 2001 From: Aravind Shankar Date: Thu, 18 Oct 2018 19:24:09 +0530 Subject: [PATCH 1/7] added support for composite relationship suggestions in schema page --- .../Services/Data/Schema/AutoAddRelations.js | 91 +++------ .../Data/TableRelationships/Actions.js | 173 ++++++++++-------- .../Data/TableRelationships/Relationships.js | 8 +- .../Data/TableRelationships/autoRelations.js | 54 +++--- 4 files changed, 161 insertions(+), 165 deletions(-) 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/TableRelationships/Actions.js b/console/src/components/Services/Data/TableRelationships/Actions.js index 2e8820424c6d0..d8e6287e6a723 100644 --- a/console/src/components/Services/Data/TableRelationships/Actions.js +++ b/console/src/components/Services/Data/TableRelationships/Actions.js @@ -272,10 +272,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 +296,113 @@ 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, + const objTrack = { + upQuery: { + type: 'create_object_relationship', + args: { + name: formRelName(indivObjectRel), + table: { + name: indivObjectRel.tableName, + schema: currentSchema, + }, + using: {}, }, - using: { foreign_key_constraint_on: indivObjectRel.lcol }, }, - }); - bulkRelTrackDown.push({ - type: 'drop_relationship', - args: { - table: { name: indivObjectRel.tableName, schema: currentSchema }, - relationship: formRelName(indivObjectRel), + downQuery: { + type: 'drop_relationship', + args: { + table: { name: indivObjectRel.tableName, schema: currentSchema }, + relationship: formRelName(indivObjectRel), + }, }, - }); + data: indivObjectRel, + }; + + const columnMaps = indivObjectRel.lcol.map((column, index) => ({ + lcol: column, + rcol: indivObjectRel.rcol[index], + })); + if (columnMaps.length === 1) { + objTrack.upQuery.args.using = { + foreign_key_constraint_on: indivObjectRel.lcol[0], + }; + } else { + const columnReducer = (accumulator, val) => ({ + ...accumulator, + [val.lcol]: val.rcol, + }); + objTrack.upQuery.args.using = { + manual_configuration: { + remote_table: indivObjectRel.rTable, + column_mapping: columnMaps.reduce(columnReducer, {}), + }, + }; + } + 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, + const arrTrack = { + upQuery: { + type: 'create_array_relationship', + args: { + name: formRelName(indivArrayRel), // generate name + table: { + name: indivArrayRel.tableName, + schema: currentSchema, }, + using: {}, }, }, - }); - bulkRelTrackDown.push({ - type: 'drop_relationship', - args: { - table: { name: indivArrayRel.tableName, schema: currentSchema }, - relationship: formRelName(indivArrayRel), + downQuery: { + type: 'drop_relationship', + args: { + table: { name: indivArrayRel.tableName, schema: currentSchema }, + relationship: formRelName(indivArrayRel), + }, }, - }); + data: indivArrayRel, + }; + const columnMaps = indivArrayRel.rcol.map((column, index) => ({ + rcol: column, + lcol: indivArrayRel.lcol[index], + })); + if (columnMaps.length === 1) { + arrTrack.upQuery.args.using = { + foreign_key_constraint_on: { + table: { + name: indivArrayRel.rTable, + schema: currentSchema, + }, + column: indivArrayRel.rcol[0], + }, + }; + } else { + const columnReducer = (accumulator, val) => ({ + ...accumulator, + [val.rcol]: val.lcol, + }); + arrTrack.upQuery.args.using = { + manual_configuration: { + remote_table: { + name: indivArrayRel.rTable, + schema: currentSchema, + }, + column_mapping: columnMaps.reduce(columnReducer, {}), + }, + }; + } + 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 +430,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..17a5b152e21b2 100644 --- a/console/src/components/Services/Data/TableRelationships/Relationships.js +++ b/console/src/components/Services/Data/TableRelationships/Relationships.js @@ -46,16 +46,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(',')} ); }; 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, }); } From 1960cd3d698caab24defe0225c73fb1fef4f05ef Mon Sep 17 00:00:00 2001 From: Aravind Shankar Date: Mon, 22 Oct 2018 03:15:01 +0530 Subject: [PATCH 2/7] added support for composite relationship suggestions in relationships tab --- .../src/components/Services/Data/DataState.js | 4 +- .../Services/Data/TableCommon/TableReducer.js | 4 +- .../Data/TableRelationships/Actions.js | 277 +++++++++--------- .../Data/TableRelationships/Relationships.js | 270 +++++------------ console/src/components/Services/Data/utils.js | 13 +- 5 files changed, 223 insertions(+), 345 deletions(-) diff --git a/console/src/components/Services/Data/DataState.js b/console/src/components/Services/Data/DataState.js index 54c5925500651..37ff8f6e536f6 100644 --- a/console/src/components/Services/Data/DataState.js +++ b/console/src/components/Services/Data/DataState.js @@ -74,9 +74,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/TableCommon/TableReducer.js b/console/src/components/Services/Data/TableCommon/TableReducer.js index 83b17b3fb4dd5..cb4f916381a0f 100644 --- a/console/src/components/Services/Data/TableCommon/TableReducer.js +++ b/console/src/components/Services/Data/TableCommon/TableReducer.js @@ -152,9 +152,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 d8e6287e6a723..99b918d53dc05 100644 --- a/console/src/components/Services/Data/TableRelationships/Actions.js +++ b/console/src/components/Services/Data/TableRelationships/Actions.js @@ -36,39 +36,121 @@ 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: rTable, + 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, + }, + }, + }; + } 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 +179,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_${ @@ -296,103 +359,39 @@ const getAllUnTrackedRelations = (allSchemas, currentSchema) => { // check relations.obj and relations.arr length and form queries if (table.relations.objectRel.length) { table.relations.objectRel.map(indivObjectRel => { + const { upQuery, downQuery } = generateRelationshipsQuery( + indivObjectRel.tableName, + formRelName(indivObjectRel), + indivObjectRel.lcol, + indivObjectRel.rTable, + indivObjectRel.rcol, + true, + currentSchema + ); const objTrack = { - upQuery: { - type: 'create_object_relationship', - args: { - name: formRelName(indivObjectRel), - table: { - name: indivObjectRel.tableName, - schema: currentSchema, - }, - using: {}, - }, - }, - downQuery: { - type: 'drop_relationship', - args: { - table: { name: indivObjectRel.tableName, schema: currentSchema }, - relationship: formRelName(indivObjectRel), - }, - }, + upQuery, + downQuery, data: indivObjectRel, }; - - const columnMaps = indivObjectRel.lcol.map((column, index) => ({ - lcol: column, - rcol: indivObjectRel.rcol[index], - })); - if (columnMaps.length === 1) { - objTrack.upQuery.args.using = { - foreign_key_constraint_on: indivObjectRel.lcol[0], - }; - } else { - const columnReducer = (accumulator, val) => ({ - ...accumulator, - [val.lcol]: val.rcol, - }); - objTrack.upQuery.args.using = { - manual_configuration: { - remote_table: indivObjectRel.rTable, - column_mapping: columnMaps.reduce(columnReducer, {}), - }, - }; - } bulkRelTrack.push(objTrack); }); } if (table.relations.arrayRel.length) { table.relations.arrayRel.map(indivArrayRel => { + const { upQuery, downQuery } = generateRelationshipsQuery( + indivArrayRel.tableName, + formRelName(indivArrayRel), + indivArrayRel.lcol, + indivArrayRel.rTable, + indivArrayRel.rcol, + false, + currentSchema + ); const arrTrack = { - upQuery: { - type: 'create_array_relationship', - args: { - name: formRelName(indivArrayRel), // generate name - table: { - name: indivArrayRel.tableName, - schema: currentSchema, - }, - using: {}, - }, - }, - downQuery: { - type: 'drop_relationship', - args: { - table: { name: indivArrayRel.tableName, schema: currentSchema }, - relationship: formRelName(indivArrayRel), - }, - }, + upQuery, + downQuery, data: indivArrayRel, }; - const columnMaps = indivArrayRel.rcol.map((column, index) => ({ - rcol: column, - lcol: indivArrayRel.lcol[index], - })); - if (columnMaps.length === 1) { - arrTrack.upQuery.args.using = { - foreign_key_constraint_on: { - table: { - name: indivArrayRel.rTable, - schema: currentSchema, - }, - column: indivArrayRel.rcol[0], - }, - }; - } else { - const columnReducer = (accumulator, val) => ({ - ...accumulator, - [val.rcol]: val.lcol, - }); - arrTrack.upQuery.args.using = { - manual_configuration: { - remote_table: { - name: indivArrayRel.rTable, - schema: currentSchema, - }, - column_mapping: columnMaps.reduce(columnReducer, {}), - }, - }; - } bulkRelTrack.push(arrTrack); }); } diff --git a/console/src/components/Services/Data/TableRelationships/Relationships.js b/console/src/components/Services/Data/TableRelationships/Relationships.js index 17a5b152e21b2..5d96708dfd0ae 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 : { @@ -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} ); })} @@ -677,4 +557,4 @@ const relationshipsConnector = connect => export default relationshipsConnector; -export { suggestedRelationships, getRelationshipLine }; +export { getRelationshipLine }; diff --git a/console/src/components/Services/Data/utils.js b/console/src/components/Services/Data/utils.js index e27a01d686d80..5e37f2f8cbd73 100644 --- a/console/src/components/Services/Data/utils.js +++ b/console/src/components/Services/Data/utils.js @@ -67,27 +67,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 +95,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 }; }; From 7c7b1849f1fd492408803dbfe5fc251c6c15da70 Mon Sep 17 00:00:00 2001 From: Aravind Shankar Date: Mon, 22 Oct 2018 13:07:39 +0530 Subject: [PATCH 3/7] add column key to create_array_relationship args --- .../src/components/Services/Data/TableRelationships/Actions.js | 1 + 1 file changed, 1 insertion(+) diff --git a/console/src/components/Services/Data/TableRelationships/Actions.js b/console/src/components/Services/Data/TableRelationships/Actions.js index 99b918d53dc05..4bd984b71885a 100644 --- a/console/src/components/Services/Data/TableRelationships/Actions.js +++ b/console/src/components/Services/Data/TableRelationships/Actions.js @@ -108,6 +108,7 @@ const generateRelationshipsQuery = ( name: rTable, schema: currentSchema, }, + column: rcol[0], }, }; } else { From b92aa07ac5d21ab1be41dd722a8dcba1df3ea30e Mon Sep 17 00:00:00 2001 From: Aravind Shankar Date: Mon, 22 Oct 2018 13:09:14 +0530 Subject: [PATCH 4/7] fixed an issue with finding fkconstrant --- .../Services/Data/TableRelationships/Relationships.js | 1 - console/src/components/Services/Data/utils.js | 5 ++--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/console/src/components/Services/Data/TableRelationships/Relationships.js b/console/src/components/Services/Data/TableRelationships/Relationships.js index 5d96708dfd0ae..ef1311fbbfa8d 100644 --- a/console/src/components/Services/Data/TableRelationships/Relationships.js +++ b/console/src/components/Services/Data/TableRelationships/Relationships.js @@ -390,7 +390,6 @@ class Relationships extends Component {
); } - const addedRelationshipsView = getObjArrayRelationshipList(tableSchema.relationships).length > 0 ? (
diff --git a/console/src/components/Services/Data/utils.js b/console/src/components/Services/Data/utils.js index 5e37f2f8cbd73..7a85a2fec931f 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(',') ); }; From f45df22522339eb09da008457042277fe68c9e37 Mon Sep 17 00:00:00 2001 From: Aravind Shankar Date: Mon, 22 Oct 2018 14:45:00 +0530 Subject: [PATCH 5/7] fix column type to array --- console/src/components/Services/Data/utils.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/console/src/components/Services/Data/utils.js b/console/src/components/Services/Data/utils.js index 7a85a2fec931f..0ab0553da89ce 100644 --- a/console/src/components/Services/Data/utils.js +++ b/console/src/components/Services/Data/utils.js @@ -32,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; @@ -47,7 +47,6 @@ const findTableFromRel = (schemas, curTable, rel) => { } } } - return schemas.find(x => x.table_name === rtable); }; From f1c6280765cc95bae4bfa39f941ecf5c9f009e26 Mon Sep 17 00:00:00 2001 From: Aravind Shankar Date: Thu, 25 Oct 2018 15:19:23 +0530 Subject: [PATCH 6/7] add schema to remote_table --- .../components/Services/Data/TableRelationships/Actions.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/console/src/components/Services/Data/TableRelationships/Actions.js b/console/src/components/Services/Data/TableRelationships/Actions.js index 4bd984b71885a..27edd9ce190ad 100644 --- a/console/src/components/Services/Data/TableRelationships/Actions.js +++ b/console/src/components/Services/Data/TableRelationships/Actions.js @@ -72,7 +72,10 @@ const generateRelationshipsQuery = ( }); upQuery.args.using = { manual_configuration: { - remote_table: rTable, + remote_table: { + table: rTable, + schema: currentSchema, + }, column_mapping: columnMaps.reduce(columnReducer, {}), }, }; From 5537cfa36b2cfe961e6fdf84012282da13a80087 Mon Sep 17 00:00:00 2001 From: Aravind Shankar Date: Fri, 26 Oct 2018 19:45:40 +0530 Subject: [PATCH 7/7] change table to name in remote_table --- .../src/components/Services/Data/TableRelationships/Actions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/console/src/components/Services/Data/TableRelationships/Actions.js b/console/src/components/Services/Data/TableRelationships/Actions.js index 27edd9ce190ad..c542136e8e8f6 100644 --- a/console/src/components/Services/Data/TableRelationships/Actions.js +++ b/console/src/components/Services/Data/TableRelationships/Actions.js @@ -73,7 +73,7 @@ const generateRelationshipsQuery = ( upQuery.args.using = { manual_configuration: { remote_table: { - table: rTable, + name: rTable, schema: currentSchema, }, column_mapping: columnMaps.reduce(columnReducer, {}),