inputDataSource = getDataSource(jsonParam['urlSource'])
targetTable = Document.Data.Tables[jsonParam['dataTableTarget']]
addColumnsSettings = None
columnsToReplace = jsonParam['columnsToReplace']
otherColumnsMatching = jsonParam['otherColumnsMatching']
ignoredColumns = []
sourceConnection = inputDataSource.Connect(Document, DataSourcePromptMode.RequiredOnly)
sourceRowReader = sourceConnection.ExecuteQuery2()
try:
    if(jsonParam['targetIdColumn'] != None and jsonParam['sourceIdColumn'] != None):
        leftColumnId = DataColumnSignature(targetTable.Columns[jsonParam['targetIdColumn']])
        rightColumnId = DataColumnSignature(sourceRowReader.Columns[jsonParam['sourceIdColumn']])
        map = { leftColumnId: rightColumnId }
        for mapping in otherColumnsMatching:
            leftColumn = DataColumnSignature(targetTable.Columns[mapping['targetColumn']])
            rightColumn = DataColumnSignature(sourceRowReader.Columns[mapping['sourceColumn']])
            map[leftColumn] = rightColumn
        addColumnsSettings = AddColumnsSettings(map, JoinType.LeftOuterJoin, ignoredColumns)
    elif len(otherColumnsMatching) > 0:
        map = {}
        for mapping in otherColumnsMatching:
            leftColumn = DataColumnSignature(targetTable.Columns[mapping['targetColumn']])
            rightColumn = DataColumnSignature(sourceRowReader.Columns[mapping['sourceColumn']])
            map[leftColumn] = rightColumn
        addColumnsSettings = AddColumnsSettings(map, JoinType.LeftOuterJoin, ignoredColumns)
    else:
        addColumnsSettings = AddColumnsSettings(targetTable, inputDataSource, JoinType.LeftOuterJoin)
    if(jsonParam['replaceCommonColumns']):
        if(len(columnsToReplace) == 0):
            for replacementCol in sourceRowReader.Columns:
                columnsToReplace.append(replacementCol.Name)
        for replacementCol in sourceRowReader.Columns:
            toBeReplaced = (targetTable.Columns.Contains(replacementCol.Name) and (replacementCol.Name in columnsToReplace))
            if(toBeReplaced):
                for key in map:
                    if(map[key].Name == replacementCol.Name):
                        toBeReplaced = False
                        break
            if(toBeReplaced):
                targetTable.Columns.Remove(replacementCol.Name)
    targetTable.AddColumns(inputDataSource, addColumnsSettings)
finally:
    sourceRowReader.Dispose()
    sourceConnection.Dispose()