diff --git a/CustomAnalytics/DataFlowVersion/PVA_Analytics_Export_Transform.json b/CustomAnalytics/DataFlowVersion/PVA_Analytics_Export_Transform.json new file mode 100644 index 00000000..a2a527f7 --- /dev/null +++ b/CustomAnalytics/DataFlowVersion/PVA_Analytics_Export_Transform.json @@ -0,0 +1 @@ +{"name":"PVA_Analytics_Export_Transform","description":"This dataflow extracts data PVA Chatbot data from Dataverse using an Azure SQL Connection. The base trace tables stored in the export are extracted from the ConversationTranscript table, for use in Power BI.","version":"1.0","culture":"en-US","modifiedTime":"2021-09-28T16:30:10.5967707+00:00","pbi:mashup":{"fastCombine":false,"allowNativeQueries":false,"queriesMetadata":{"bot":{"queryId":"884e3eab-a464-4fb5-be6c-5b09fd6f5437","queryName":"bot","loadEnabled":true},"botcomponent":{"queryId":"53adf37f-3095-4f34-bc1a-5480c7acb92c","queryName":"botcomponent","loadEnabled":true},"conversationtranscript":{"queryId":"14dd783b-a591-455e-b406-1094d9bd86a9","queryName":"conversationtranscript","loadEnabled":true},"SessionInfo":{"queryId":"263251e4-5fff-4fd4-b678-a425a0e488d3","queryName":"SessionInfo","queryGroupId":"a2cfa954-0ad9-4463-afc0-169f3004c729","loadEnabled":true},"ConversationInfo":{"queryId":"04b0729a-6b1d-4eb8-b487-2fe229b7fb59","queryName":"ConversationInfo","queryGroupId":"a2cfa954-0ad9-4463-afc0-169f3004c729","loadEnabled":true},"CSATSurveyRequest":{"queryId":"c34a0b29-c9c8-46b9-b537-f41d5e1bca0c","queryName":"CSATSurveyRequest","queryGroupId":"a2cfa954-0ad9-4463-afc0-169f3004c729","loadEnabled":true},"CSATSurveyResponse":{"queryId":"b172b853-799a-4939-9012-891e84bcb82e","queryName":"CSATSurveyResponse","queryGroupId":"a2cfa954-0ad9-4463-afc0-169f3004c729","loadEnabled":true},"DialogRedirect":{"queryId":"d1adb89c-6e18-487a-a23a-a9a258ce4f16","queryName":"DialogRedirect","queryGroupId":"a2cfa954-0ad9-4463-afc0-169f3004c729","loadEnabled":true},"ImpliedSuccess":{"queryId":"e6924e87-3d35-468c-9a6f-edb294e7b3d7","queryName":"ImpliedSuccess","queryGroupId":"a2cfa954-0ad9-4463-afc0-169f3004c729","loadEnabled":true},"IntentRecognition":{"queryId":"22987ca4-bc4b-4aff-aa67-9c1fa9dee4cb","queryName":"IntentRecognition","queryGroupId":"a2cfa954-0ad9-4463-afc0-169f3004c729","loadEnabled":true},"PRRSurveyRequest":{"queryId":"4b660003-7eb1-44f0-a997-56373b314c7f","queryName":"PRRSurveyRequest","queryGroupId":"a2cfa954-0ad9-4463-afc0-169f3004c729","loadEnabled":true},"PRRSurveyResponse":{"queryId":"292ecaef-0c98-41e5-b147-8855ffa8e447","queryName":"PRRSurveyResponse","queryGroupId":"a2cfa954-0ad9-4463-afc0-169f3004c729","loadEnabled":true},"VariableAssignment":{"queryId":"e6e43cae-6ad3-4573-9b39-493126c948cf","queryName":"VariableAssignment","queryGroupId":"a2cfa954-0ad9-4463-afc0-169f3004c729","loadEnabled":true},"CSATSurveyResponseConversationSum":{"queryId":"c4420ebd-ee17-4e0f-bb46-b00a35d524b6","queryName":"CSATSurveyResponseConversationSum","queryGroupId":"59f08598-00b7-4a1b-9e50-b4721149cb70","loadEnabled":true},"PRRSurveyResponseConversationSum":{"queryId":"bd6a7f7a-b519-49b0-a8e8-03de719569c1","queryName":"PRRSurveyResponseConversationSum","queryGroupId":"59f08598-00b7-4a1b-9e50-b4721149cb70","loadEnabled":true}},"document":"section Section1;\r\nshared bot = let\r\n Source = Sql.Database(\"yourdataverse.crm.dynamics.com\", \"yourdataverse\"),\r\n #\"Navigation 1\" = Source{[Schema = \"dbo\", Item = \"bot\"]}[Data],\r\n #\"Remove columns\" = Table.RemoveColumns(#\"Navigation 1\", Table.ColumnsOfType(#\"Navigation 1\", {type table, type record, type list, type nullable binary, type binary, type function}))\r\nin\r\n #\"Remove columns\";\r\nshared botcomponent = let\r\n Source = Sql.Database(\"yourdataverse.crm.dynamics.com\", \"yourdataverse\"),\r\n #\"Navigation 1\" = Source{[Schema = \"dbo\", Item = \"botcomponent\"]}[Data],\r\n #\"Remove columns\" = Table.RemoveColumns(#\"Navigation 1\", Table.ColumnsOfType(#\"Navigation 1\", {type table, type record, type list, type nullable binary, type binary, type function}))\r\nin\r\n #\"Remove columns\";\r\nshared conversationtranscript = let\r\n Source = Sql.Database(\"yourdataverse.crm.dynamics.com\", \"yourdataverse\"),\r\n #\"Navigation 1\" = Source{[Schema = \"dbo\", Item = \"conversationtranscript\"]}[Data],\r\n #\"Remove columns\" = Table.RemoveColumns(#\"Navigation 1\", Table.ColumnsOfType(#\"Navigation 1\", {type table, type record, type list, type nullable binary, type binary, type function}))\r\nin\r\n #\"Remove columns\";\r\nshared SessionInfo = let\r\n Source = conversationtranscript,\r\n #\"Parsed JSON\" = Table.TransformColumns(Source, {{\"content\", each Json.Document(_), type any}}),\r\n #\"Parsed JSON 1\" = Table.TransformColumns(#\"Parsed JSON\", {{\"metadata\", each Json.Document(_), type any}}),\r\n #\"Expanded content\" = Table.ExpandRecordColumn(#\"Parsed JSON 1\", \"content\", {\"activities\"}, {\"content.activities\"}),\r\n #\"Expanded metadata\" = Table.ExpandRecordColumn(#\"Expanded content\", \"metadata\", {\"BotId\", \"AADTenantId\", \"BotName\"}, {\"metadata.BotId\", \"metadata.AADTenantId\", \"metadata.BotName\"}),\r\n #\"Expanded content.activities\" = Table.ExpandListColumn(#\"Expanded metadata\", \"content.activities\"),\r\n #\"Expanded content.activities 1\" = Table.ExpandRecordColumn(#\"Expanded content.activities\", \"content.activities\", {\"valueType\", \"id\", \"type\", \"timestamp\", \"from\", \"channelId\", \"value\", \"textFormat\", \"text\", \"attachments\", \"channeldata\"}, {\"content.activities.valueType\", \"content.activities.id\", \"content.activities.type\", \"content.activities.timestamp\", \"content.activities.from\", \"content.activities.channelId\", \"content.activities.value\", \"content.activities.textFormat\", \"content.activities.text\", \"content.activities.attachments\", \"content.activities.channeldata\"}),\r\n #\"Filtered rows\" = Table.SelectRows(#\"Expanded content.activities 1\", each [content.activities.valueType] = \"SessionInfo\"),\r\n #\"Expanded content.activities.from\" = Table.ExpandRecordColumn(#\"Filtered rows\", \"content.activities.from\", {\"id\", \"role\"}, {\"content.activities.from.id\", \"content.activities.from.role\"}),\r\n #\"Expanded content.activities.value\" = Table.ExpandRecordColumn(#\"Expanded content.activities.from\", \"content.activities.value\", {\"startTimeUtc\", \"endTimeUtc\", \"type\", \"outcome\", \"turnCount\", \"lastTriggeredIntentId\", \"impliedSuccess\"}, {\"content.activities.value.startTimeUtc\", \"content.activities.value.endTimeUtc\", \"content.activities.value.type\", \"content.activities.value.outcome\", \"content.activities.value.turnCount\", \"content.activities.value.lastTriggeredIntentId\", \"content.activities.value.impliedSuccess\"}),\r\n #\"Choose columns\" = Table.SelectColumns(#\"Expanded content.activities.value\", {\"content.activities.valueType\", \"content.activities.id\", \"content.activities.type\", \"content.activities.timestamp\", \"content.activities.from.id\", \"content.activities.from.role\", \"content.activities.channelId\", \"content.activities.value.startTimeUtc\", \"content.activities.value.endTimeUtc\", \"content.activities.value.type\", \"content.activities.value.outcome\", \"content.activities.value.turnCount\", \"content.activities.value.lastTriggeredIntentId\", \"content.activities.value.impliedSuccess\", \"conversationtranscriptid\", \"metadata.BotId\", \"metadata.AADTenantId\", \"metadata.BotName\"}),\r\n #\"Transform columns\" = Table.TransformColumnTypes(#\"Choose columns\", {{\"content.activities.valueType\", type text}, {\"content.activities.id\", type text}, {\"content.activities.type\", type text}, {\"content.activities.timestamp\", type text}, {\"content.activities.from.id\", type text}, {\"content.activities.from.role\", type text}, {\"content.activities.channelId\", type text}, {\"content.activities.value.startTimeUtc\", type text}, {\"content.activities.value.endTimeUtc\", type text}, {\"content.activities.value.type\", type text}, {\"content.activities.value.outcome\", type text}, {\"content.activities.value.turnCount\", type text}, {\"content.activities.value.lastTriggeredIntentId\", type text}, {\"content.activities.value.impliedSuccess\", type text}}),\r\n #\"Replace errors\" = Table.ReplaceErrorValues(#\"Transform columns\", {{\"content.activities.valueType\", null}, {\"content.activities.id\", null}, {\"content.activities.type\", null}, {\"content.activities.timestamp\", null}, {\"content.activities.from.id\", null}, {\"content.activities.from.role\", null}, {\"content.activities.channelId\", null}, {\"content.activities.value.startTimeUtc\", null}, {\"content.activities.value.endTimeUtc\", null}, {\"content.activities.value.type\", null}, {\"content.activities.value.outcome\", null}, {\"content.activities.value.turnCount\", null}, {\"content.activities.value.lastTriggeredIntentId\", null}, {\"content.activities.value.impliedSuccess\", null}}),\r\n #\"Transform columns 1\" = Table.TransformColumnTypes(#\"Replace errors\", {{\"metadata.BotId\", type text}, {\"metadata.AADTenantId\", type text}, {\"metadata.BotName\", type text}}),\r\n #\"Replace errors 1\" = Table.ReplaceErrorValues(#\"Transform columns 1\", {{\"metadata.BotId\", null}, {\"metadata.AADTenantId\", null}, {\"metadata.BotName\", null}})\r\nin\r\n #\"Replace errors 1\";\r\nshared ConversationInfo = let\r\n Source = conversationtranscript,\r\n #\"Duplicated Column\" = Table.DuplicateColumn(Source, \"content\", \"content - Copy\"),\r\n #\"Parsed JSON\" = Table.TransformColumns(#\"Duplicated Column\",{{\"metadata\", Json.Document}}),\r\n #\"Renamed Columns\" = Table.RenameColumns(#\"Parsed JSON\", {{\"content - Copy\", \"raw content\"}}),\r\n #\"Expanded metadata\" = Table.ExpandRecordColumn(#\"Renamed Columns\", \"metadata\", {\"BotId\", \"AADTenantId\", \"BotName\"}, {\"metadata.BotId\", \"metadata.AADTenantId\", \"metadata.BotName\"}),\r\n #\"Parsed JSON1\" = Table.TransformColumns(#\"Expanded metadata\",{{\"content\", Json.Document}}),\r\n #\"Expanded content\" = Table.ExpandRecordColumn(#\"Parsed JSON1\", \"content\", {\"activities\"}, {\"content.activities\"}),\r\n #\"Expanded content.activities\" = Table.ExpandListColumn(#\"Expanded content\", \"content.activities\"),\r\n #\"Expanded content.activities1\" = Table.ExpandRecordColumn(#\"Expanded content.activities\", \"content.activities\", {\"id\", \"type\", \"timestamp\", \"from\", \"channelId\", \"textFormat\", \"text\", \"attachments\", \"channeldata\", \"valueType\", \"replyToId\", \"value\", \"speak\", \"name\"}, {\"content.activities.id\", \"content.activities.type\", \"content.activities.timestamp\", \"content.activities.from\", \"content.activities.channelId\", \"content.activities.textFormat\", \"content.activities.text\", \"content.activities.attachments\", \"content.activities.channeldata\", \"content.activities.valueType\", \"content.activities.replyToId\", \"content.activities.value\", \"content.activities.speak\", \"content.activities.name\"}),\r\n #\"Filtered rows\" = Table.SelectRows(#\"Expanded content.activities1\", each [content.activities.valueType] = \"ConversationInfo\"),\r\n #\"Expanded content.activities.value\" = Table.ExpandRecordColumn(#\"Filtered rows\", \"content.activities.value\", {\"isDesignMode\", \"locale\"}, {\"content.activities.value.isDesignMode\", \"content.activities.value.locale\"}),\r\n #\"Choose columns\" = Table.SelectColumns(#\"Expanded content.activities.value\", {\"conversationtranscriptid\", \"createdon\", \"createdby\", \"modifiedon\", \"modifiedby\", \"createdonbehalfby\", \"modifiedonbehalfby\", \"ownerid\", \"owningbusinessunit\", \"owninguser\", \"owningteam\", \"statecode\", \"statecodename\", \"statuscode\", \"importsequencenumber\", \"overriddencreatedon\", \"timezoneruleversionnumber\", \"utcconversiontimezonecode\", \"name\", \"content.activities.id\", \"content.activities.type\", \"content.activities.timestamp\", \"content.activities.from\", \"content.activities.channelId\", \"content.activities.attachments\", \"content.activities.channeldata\", \"content.activities.valueType\", \"content.activities.replyToId\", \"content.activities.value.isDesignMode\", \"content.activities.value.locale\", \"conversationstarttime\", \"metadata.BotId\", \"metadata.AADTenantId\", \"metadata.BotName\", \"schematype\", \"schemaversion\", \"bot_conversationtranscriptid\", \"raw content\"}),\r\n #\"Transform columns\" = Table.TransformColumnTypes(#\"Choose columns\", {{\"content.activities.id\", type text}, {\"content.activities.type\", type text}, {\"content.activities.timestamp\", type text}, {\"content.activities.from\", type text}, {\"content.activities.channelId\", type text}, {\"content.activities.attachments\", type text}, {\"content.activities.channeldata\", type text}, {\"content.activities.valueType\", type text}, {\"content.activities.replyToId\", type text}, {\"content.activities.value.isDesignMode\", type text}, {\"content.activities.value.locale\", type text}, {\"metadata.BotId\", type text}, {\"metadata.AADTenantId\", type text}, {\"metadata.BotName\", type text}}),\r\n #\"Replace errors\" = Table.ReplaceErrorValues(#\"Transform columns\", {{\"content.activities.id\", null}, {\"content.activities.type\", null}, {\"content.activities.timestamp\", null}, {\"content.activities.from\", null}, {\"content.activities.channelId\", null}, {\"content.activities.attachments\", null}, {\"content.activities.channeldata\", null}, {\"content.activities.valueType\", null}, {\"content.activities.replyToId\", null}, {\"content.activities.value.isDesignMode\", null}, {\"content.activities.value.locale\", null}, {\"metadata.BotId\", null}, {\"metadata.AADTenantId\", null}, {\"metadata.BotName\", null}}),\r\n #\"Split Column by Position\" = Table.SplitColumn(#\"Replace errors\", \"raw content\", Splitter.SplitTextByPositions({0, 32000}, false), {\"raw content.1\", \"raw content.2\"}),\r\n #\"Changed Type\" = Table.TransformColumnTypes(#\"Split Column by Position\", {{\"raw content.1\", type text}, {\"raw content.2\", type text}}),\r\n #\"Renamed Columns1\" = Table.RenameColumns(#\"Changed Type\", {{\"raw content.1\", \"raw_content.1\"}, {\"raw content.2\", \"raw_content.2\"}}),\r\n #\"Merged Queries\" = Table.NestedJoin(#\"Renamed Columns1\", {\"conversationtranscriptid\"}, CSATSurveyResponseConversationSum, {\"conversationtranscriptid\"}, \"CSATSurveyResponseConversationSum\", JoinKind.LeftOuter),\r\n #\"Expanded CSATSurveyResponseConversationSum\" = Table.ExpandTableColumn(#\"Merged Queries\", \"CSATSurveyResponseConversationSum\", {\"LowestCSAT\"}, {\"LowestCSAT\"}),\r\n #\"Merged Queries1\" = Table.NestedJoin(#\"Expanded CSATSurveyResponseConversationSum\", {\"conversationtranscriptid\"}, PRRSurveyResponseConversationSum, {\"conversationtranscriptid\"}, \"PRRSurveyResponseConversationSum\", JoinKind.LeftOuter),\r\n #\"Expanded PRRSurveyResponseConversationSum\" = Table.ExpandTableColumn(#\"Merged Queries1\", \"PRRSurveyResponseConversationSum\", {\"LastPRRSurveyResponse\"}, {\"LastPRRSurveyResponse\"})\r\nin\r\n #\"Expanded PRRSurveyResponseConversationSum\";\r\nshared CSATSurveyRequest = let\r\n Source = conversationtranscript,\r\n #\"Parsed JSON\" = Table.TransformColumns(Source,{{\"metadata\", Json.Document}}),\r\n #\"Expanded metadata\" = Table.ExpandRecordColumn(#\"Parsed JSON\", \"metadata\", {\"BotId\", \"AADTenantId\", \"BotName\"}, {\"metadata.BotId\", \"metadata.AADTenantId\", \"metadata.BotName\"}),\r\n #\"Parsed JSON1\" = Table.TransformColumns(#\"Expanded metadata\",{{\"content\", Json.Document}}),\r\n #\"Expanded content\" = Table.ExpandRecordColumn(#\"Parsed JSON1\", \"content\", {\"activities\"}, {\"content.activities\"}),\r\n #\"Expanded content.activities\" = Table.ExpandListColumn(#\"Expanded content\", \"content.activities\"),\r\n #\"Expanded content.activities1\" = Table.ExpandRecordColumn(#\"Expanded content.activities\", \"content.activities\", {\"id\", \"type\", \"timestamp\", \"from\", \"channelId\", \"textFormat\", \"text\", \"attachments\", \"channeldata\", \"valueType\", \"replyToId\", \"value\", \"speak\", \"name\"}, {\"content.activities.id\", \"content.activities.type\", \"content.activities.timestamp\", \"content.activities.from\", \"content.activities.channelId\", \"content.activities.textFormat\", \"content.activities.text\", \"content.activities.attachments\", \"content.activities.channeldata\", \"content.activities.valueType\", \"content.activities.replyToId\", \"content.activities.value\", \"content.activities.speak\", \"content.activities.name\"}),\r\n #\"Filtered Rows\" = Table.SelectRows(#\"Expanded content.activities1\", each [content.activities.valueType] = \"CSATSurveyRequest\"),\r\n #\"Removed Other Columns\" = Table.SelectColumns(#\"Filtered Rows\", {\"content.activities.id\", \"content.activities.type\", \"content.activities.timestamp\", \"content.activities.from\", \"content.activities.channelId\", \"content.activities.attachments\", \"content.activities.valueType\", \"content.activities.replyToId\", \"content.activities.value\", \"conversationstarttime\", \"conversationtranscriptid\", \"metadata.BotId\"}),\r\n #\"Expanded content.activities.from\" = Table.ExpandRecordColumn(#\"Removed Other Columns\", \"content.activities.from\", {\"id\", \"role\"}, {\"content.activities.from.id\", \"content.activities.from.role\"}),\r\n #\"Expanded content.activities.value\" = Table.ExpandRecordColumn(#\"Expanded content.activities.from\", \"content.activities.value\", {\"type\"}, {\"content.activities.value.type\"}),\r\n #\"Transform columns\" = Table.TransformColumnTypes(#\"Expanded content.activities.value\", {{\"content.activities.id\", type text}, {\"content.activities.type\", type text}, {\"content.activities.timestamp\", type text}, {\"content.activities.from.id\", type text}, {\"content.activities.from.role\", type text}, {\"content.activities.channelId\", type text}, {\"content.activities.attachments\", type text}, {\"content.activities.valueType\", type text}, {\"content.activities.replyToId\", type text}, {\"content.activities.value.type\", type text}}),\r\n #\"Replace errors\" = Table.ReplaceErrorValues(#\"Transform columns\", {{\"content.activities.id\", null}, {\"content.activities.type\", null}, {\"content.activities.timestamp\", null}, {\"content.activities.from.id\", null}, {\"content.activities.from.role\", null}, {\"content.activities.channelId\", null}, {\"content.activities.attachments\", null}, {\"content.activities.valueType\", null}, {\"content.activities.replyToId\", null}, {\"content.activities.value.type\", null}}),\r\n #\"Transform columns 1\" = Table.TransformColumnTypes(#\"Replace errors\", {{\"metadata.BotId\", type text}}),\r\n #\"Replace errors 1\" = Table.ReplaceErrorValues(#\"Transform columns 1\", {{\"metadata.BotId\", null}})\r\nin\r\n #\"Replace errors 1\";\r\nshared CSATSurveyResponse = let\r\n Source = conversationtranscript,\r\n #\"Parsed JSON\" = Table.TransformColumns(Source,{{\"metadata\", Json.Document}}),\r\n #\"Expanded metadata\" = Table.ExpandRecordColumn(#\"Parsed JSON\", \"metadata\", {\"BotId\", \"AADTenantId\", \"BotName\"}, {\"metadata.BotId\", \"metadata.AADTenantId\", \"metadata.BotName\"}),\r\n #\"Parsed JSON1\" = Table.TransformColumns(#\"Expanded metadata\",{{\"content\", Json.Document}}),\r\n #\"Expanded content\" = Table.ExpandRecordColumn(#\"Parsed JSON1\", \"content\", {\"activities\"}, {\"content.activities\"}),\r\n #\"Expanded content.activities\" = Table.ExpandListColumn(#\"Expanded content\", \"content.activities\"),\r\n #\"Expanded content.activities1\" = Table.ExpandRecordColumn(#\"Expanded content.activities\", \"content.activities\", {\"id\", \"type\", \"timestamp\", \"from\", \"channelId\", \"textFormat\", \"text\", \"attachments\", \"channeldata\", \"valueType\", \"replyToId\", \"value\", \"speak\", \"name\"}, {\"content.activities.id\", \"content.activities.type\", \"content.activities.timestamp\", \"content.activities.from\", \"content.activities.channelId\", \"content.activities.textFormat\", \"content.activities.text\", \"content.activities.attachments\", \"content.activities.channeldata\", \"content.activities.valueType\", \"content.activities.replyToId\", \"content.activities.value\", \"content.activities.speak\", \"content.activities.name\"}),\r\n #\"Filtered Rows\" = Table.SelectRows(#\"Expanded content.activities1\", each [content.activities.valueType] = \"CSATSurveyResponse\"),\r\n #\"Expanded content.activities.from\" = Table.ExpandRecordColumn(#\"Filtered Rows\", \"content.activities.from\", {\"id\", \"role\"}, {\"content.activities.from.id\", \"content.activities.from.role\"}),\r\n #\"Expanded content.activities.value\" = Table.ExpandRecordColumn(#\"Expanded content.activities.from\", \"content.activities.value\", {\"type\", \"response\"}, {\"content.activities.value.type\", \"content.activities.value.response\"}),\r\n #\"Removed Other Columns\" = Table.SelectColumns(#\"Expanded content.activities.value\", {\"content.activities.id\", \"content.activities.type\", \"content.activities.timestamp\", \"content.activities.from.id\", \"content.activities.from.role\", \"content.activities.channelId\", \"content.activities.attachments\", \"content.activities.valueType\", \"content.activities.replyToId\", \"content.activities.value.type\", \"content.activities.value.response\", \"conversationtranscriptid\", \"createdon\", \"metadata.BotId\"}),\r\n #\"Transform columns\" = Table.TransformColumnTypes(#\"Removed Other Columns\", {{\"content.activities.id\", type text}, {\"content.activities.type\", type text}, {\"content.activities.timestamp\", type text}, {\"content.activities.from.id\", type text}, {\"content.activities.from.role\", type text}, {\"content.activities.channelId\", type text}, {\"content.activities.attachments\", type text}, {\"content.activities.valueType\", type text}, {\"content.activities.replyToId\", type text}, {\"content.activities.value.type\", type text}, {\"content.activities.value.response\", type text}}),\r\n #\"Replace errors\" = Table.ReplaceErrorValues(#\"Transform columns\", {{\"content.activities.id\", null}, {\"content.activities.type\", null}, {\"content.activities.timestamp\", null}, {\"content.activities.from.id\", null}, {\"content.activities.from.role\", null}, {\"content.activities.channelId\", null}, {\"content.activities.attachments\", null}, {\"content.activities.valueType\", null}, {\"content.activities.replyToId\", null}, {\"content.activities.value.type\", null}, {\"content.activities.value.response\", null}}),\r\n #\"Transform columns 1\" = Table.TransformColumnTypes(#\"Replace errors\", {{\"metadata.BotId\", type text}}),\r\n #\"Replace errors 1\" = Table.ReplaceErrorValues(#\"Transform columns 1\", {{\"metadata.BotId\", null}})\r\nin\r\n #\"Replace errors 1\";\r\nshared DialogRedirect = let\r\n Source = conversationtranscript,\r\n #\"Parsed JSON\" = Table.TransformColumns(Source,{{\"metadata\", Json.Document}}),\r\n #\"Expanded metadata\" = Table.ExpandRecordColumn(#\"Parsed JSON\", \"metadata\", {\"BotId\", \"AADTenantId\", \"BotName\"}, {\"metadata.BotId\", \"metadata.AADTenantId\", \"metadata.BotName\"}),\r\n #\"Parsed JSON1\" = Table.TransformColumns(#\"Expanded metadata\",{{\"content\", Json.Document}}),\r\n #\"Expanded content\" = Table.ExpandRecordColumn(#\"Parsed JSON1\", \"content\", {\"activities\"}, {\"content.activities\"}),\r\n #\"Expanded content.activities\" = Table.ExpandListColumn(#\"Expanded content\", \"content.activities\"),\r\n #\"Expanded content.activities1\" = Table.ExpandRecordColumn(#\"Expanded content.activities\", \"content.activities\", {\"id\", \"type\", \"timestamp\", \"from\", \"channelId\", \"textFormat\", \"text\", \"attachments\", \"channeldata\", \"valueType\", \"replyToId\", \"value\", \"speak\", \"name\"}, {\"content.activities.id\", \"content.activities.type\", \"content.activities.timestamp\", \"content.activities.from\", \"content.activities.channelId\", \"content.activities.textFormat\", \"content.activities.text\", \"content.activities.attachments\", \"content.activities.channeldata\", \"content.activities.valueType\", \"content.activities.replyToId\", \"content.activities.value\", \"content.activities.speak\", \"content.activities.name\"}),\r\n #\"Filtered Rows\" = Table.SelectRows(#\"Expanded content.activities1\", each [content.activities.valueType] = \"DialogRedirect\"),\r\n #\"Expanded content.activities.value\" = Table.ExpandRecordColumn(#\"Filtered Rows\", \"content.activities.value\", {\"targetDialogId\", \"targetDialogType\"}, {\"content.activities.value.targetDialogId\", \"content.activities.value.targetDialogType\"}),\r\n #\"Expanded content.activities.from\" = Table.ExpandRecordColumn(#\"Expanded content.activities.value\", \"content.activities.from\", {\"id\", \"role\"}, {\"content.activities.from.id\", \"content.activities.from.role\"}),\r\n #\"Removed Other Columns\" = Table.SelectColumns(#\"Expanded content.activities.from\", {\"content.activities.id\", \"content.activities.type\", \"content.activities.timestamp\", \"content.activities.from.id\", \"content.activities.from.role\", \"content.activities.channelId\", \"content.activities.attachments\", \"content.activities.channeldata\", \"content.activities.valueType\", \"content.activities.replyToId\", \"content.activities.value.targetDialogId\", \"content.activities.value.targetDialogType\", \"conversationtranscriptid\"}),\r\n #\"Transform columns\" = Table.TransformColumnTypes(#\"Removed Other Columns\", {{\"content.activities.id\", type text}, {\"content.activities.type\", type text}, {\"content.activities.timestamp\", type text}, {\"content.activities.from.id\", type text}, {\"content.activities.from.role\", type text}, {\"content.activities.channelId\", type text}, {\"content.activities.attachments\", type text}, {\"content.activities.channeldata\", type text}, {\"content.activities.valueType\", type text}, {\"content.activities.replyToId\", type text}, {\"content.activities.value.targetDialogId\", type text}, {\"content.activities.value.targetDialogType\", type text}}),\r\n #\"Replace errors\" = Table.ReplaceErrorValues(#\"Transform columns\", {{\"content.activities.id\", null}, {\"content.activities.type\", null}, {\"content.activities.timestamp\", null}, {\"content.activities.from.id\", null}, {\"content.activities.from.role\", null}, {\"content.activities.channelId\", null}, {\"content.activities.attachments\", null}, {\"content.activities.channeldata\", null}, {\"content.activities.valueType\", null}, {\"content.activities.replyToId\", null}, {\"content.activities.value.targetDialogId\", null}, {\"content.activities.value.targetDialogType\", null}})\r\nin\r\n #\"Replace errors\";\r\nshared ImpliedSuccess = let\r\n Source = conversationtranscript,\r\n #\"Parsed JSON\" = Table.TransformColumns(Source,{{\"metadata\", Json.Document}}),\r\n #\"Expanded metadata\" = Table.ExpandRecordColumn(#\"Parsed JSON\", \"metadata\", {\"BotId\", \"AADTenantId\", \"BotName\"}, {\"metadata.BotId\", \"metadata.AADTenantId\", \"metadata.BotName\"}),\r\n #\"Parsed JSON1\" = Table.TransformColumns(#\"Expanded metadata\",{{\"content\", Json.Document}}),\r\n #\"Expanded content\" = Table.ExpandRecordColumn(#\"Parsed JSON1\", \"content\", {\"activities\"}, {\"content.activities\"}),\r\n #\"Expanded content.activities\" = Table.ExpandListColumn(#\"Expanded content\", \"content.activities\"),\r\n #\"Expanded content.activities1\" = Table.ExpandRecordColumn(#\"Expanded content.activities\", \"content.activities\", {\"id\", \"type\", \"timestamp\", \"from\", \"channelId\", \"textFormat\", \"text\", \"attachments\", \"channeldata\", \"valueType\", \"replyToId\", \"value\", \"speak\", \"name\"}, {\"content.activities.id\", \"content.activities.type\", \"content.activities.timestamp\", \"content.activities.from\", \"content.activities.channelId\", \"content.activities.textFormat\", \"content.activities.text\", \"content.activities.attachments\", \"content.activities.channeldata\", \"content.activities.valueType\", \"content.activities.replyToId\", \"content.activities.value\", \"content.activities.speak\", \"content.activities.name\"}),\r\n #\"Filtered Rows\" = Table.SelectRows(#\"Expanded content.activities1\", each [content.activities.valueType] = \"ImpliedSuccess\"),\r\n #\"Expanded content.activities.from\" = Table.ExpandRecordColumn(#\"Filtered Rows\", \"content.activities.from\", {\"id\", \"role\"}, {\"content.activities.from.id\", \"content.activities.from.role\"}),\r\n #\"Expanded content.activities.value\" = Table.ExpandRecordColumn(#\"Expanded content.activities.from\", \"content.activities.value\", {\"type\"}, {\"content.activities.value.type\"}),\r\n #\"Removed Other Columns\" = Table.SelectColumns(#\"Expanded content.activities.value\", {\"content.activities.id\", \"content.activities.type\", \"content.activities.timestamp\", \"content.activities.from.id\", \"content.activities.from.role\", \"content.activities.channelId\", \"content.activities.attachments\", \"content.activities.channeldata\", \"content.activities.valueType\", \"content.activities.replyToId\", \"content.activities.value.type\", \"conversationtranscriptid\"}),\r\n #\"Transform columns\" = Table.TransformColumnTypes(#\"Removed Other Columns\", {{\"content.activities.id\", type text}, {\"content.activities.type\", type text}, {\"content.activities.timestamp\", type text}, {\"content.activities.from.id\", type text}, {\"content.activities.from.role\", type text}, {\"content.activities.channelId\", type text}, {\"content.activities.attachments\", type text}, {\"content.activities.channeldata\", type text}, {\"content.activities.valueType\", type text}, {\"content.activities.replyToId\", type text}, {\"content.activities.value.type\", type text}}),\r\n #\"Replace errors\" = Table.ReplaceErrorValues(#\"Transform columns\", {{\"content.activities.id\", null}, {\"content.activities.type\", null}, {\"content.activities.timestamp\", null}, {\"content.activities.from.id\", null}, {\"content.activities.from.role\", null}, {\"content.activities.channelId\", null}, {\"content.activities.attachments\", null}, {\"content.activities.channeldata\", null}, {\"content.activities.valueType\", null}, {\"content.activities.replyToId\", null}, {\"content.activities.value.type\", null}})\r\nin\r\n #\"Replace errors\";\r\nshared IntentRecognition = let\r\n Source = conversationtranscript,\r\n #\"Parsed JSON\" = Table.TransformColumns(Source,{{\"metadata\", Json.Document}}),\r\n #\"Expanded metadata\" = Table.ExpandRecordColumn(#\"Parsed JSON\", \"metadata\", {\"BotId\", \"AADTenantId\", \"BotName\"}, {\"metadata.BotId\", \"metadata.AADTenantId\", \"metadata.BotName\"}),\r\n #\"Parsed JSON1\" = Table.TransformColumns(#\"Expanded metadata\",{{\"content\", Json.Document}}),\r\n #\"Expanded content\" = Table.ExpandRecordColumn(#\"Parsed JSON1\", \"content\", {\"activities\"}, {\"content.activities\"}),\r\n #\"Expanded content.activities\" = Table.ExpandListColumn(#\"Expanded content\", \"content.activities\"),\r\n #\"Expanded content.activities1\" = Table.ExpandRecordColumn(#\"Expanded content.activities\", \"content.activities\", {\"id\", \"type\", \"timestamp\", \"from\", \"channelId\", \"textFormat\", \"text\", \"attachments\", \"channeldata\", \"valueType\", \"replyToId\", \"value\", \"speak\", \"name\"}, {\"content.activities.id\", \"content.activities.type\", \"content.activities.timestamp\", \"content.activities.from\", \"content.activities.channelId\", \"content.activities.textFormat\", \"content.activities.text\", \"content.activities.attachments\", \"content.activities.channeldata\", \"content.activities.valueType\", \"content.activities.replyToId\", \"content.activities.value\", \"content.activities.speak\", \"content.activities.name\"}),\r\n #\"Filtered Rows\" = Table.SelectRows(#\"Expanded content.activities1\", each [content.activities.valueType] = \"IntentRecognition\"),\r\n #\"Removed Other Columns\" = Table.SelectColumns(#\"Filtered Rows\", {\"content.activities.id\", \"content.activities.type\", \"content.activities.timestamp\", \"content.activities.from\", \"content.activities.channelId\", \"content.activities.attachments\", \"content.activities.channeldata\", \"content.activities.valueType\", \"content.activities.replyToId\", \"content.activities.value\", \"conversationtranscriptid\", \"createdon\", \"metadata.BotId\"}),\r\n #\"Expanded content.activities.from\" = Table.ExpandRecordColumn(#\"Removed Other Columns\", \"content.activities.from\", {\"id\", \"role\"}, {\"content.activities.from.id\", \"content.activities.from.role\"}),\r\n #\"Expanded content.activities.value\" = Table.ExpandRecordColumn(#\"Expanded content.activities.from\", \"content.activities.value\", {\"intentId\", \"intentScore\", \"triggerUtterance\", \"normalizedTriggerUtterance\"}, {\"content.activities.value.intentId\", \"content.activities.value.intentScore\", \"content.activities.value.triggerUtterance\", \"content.activities.value.normalizedTriggerUtterance\"}),\r\n #\"Expanded content.activities.value.intentScore\" = Table.ExpandRecordColumn(#\"Expanded content.activities.value\", \"content.activities.value.intentScore\", {\"score\", \"Type\", \"Title\"}, {\"content.activities.value.intentScore.score\", \"content.activities.value.intentScore.Type\", \"content.activities.value.intentScore.Title\"}),\r\n #\"Transform columns\" = Table.TransformColumnTypes(#\"Expanded content.activities.value.intentScore\", {{\"content.activities.id\", type text}, {\"content.activities.type\", type text}, {\"content.activities.timestamp\", type text}, {\"content.activities.from.id\", type text}, {\"content.activities.from.role\", type text}, {\"content.activities.channelId\", type text}, {\"content.activities.attachments\", type text}, {\"content.activities.channeldata\", type text}, {\"content.activities.valueType\", type text}, {\"content.activities.replyToId\", type text}, {\"content.activities.value.intentId\", type text}, {\"content.activities.value.intentScore.score\", type text}, {\"content.activities.value.intentScore.Type\", type text}, {\"content.activities.value.intentScore.Title\", type text}, {\"content.activities.value.triggerUtterance\", type text}, {\"content.activities.value.normalizedTriggerUtterance\", type text}}),\r\n #\"Replace errors\" = Table.ReplaceErrorValues(#\"Transform columns\", {{\"content.activities.id\", null}, {\"content.activities.type\", null}, {\"content.activities.timestamp\", null}, {\"content.activities.from.id\", null}, {\"content.activities.from.role\", null}, {\"content.activities.channelId\", null}, {\"content.activities.attachments\", null}, {\"content.activities.channeldata\", null}, {\"content.activities.valueType\", null}, {\"content.activities.replyToId\", null}, {\"content.activities.value.intentId\", null}, {\"content.activities.value.intentScore.score\", null}, {\"content.activities.value.intentScore.Type\", null}, {\"content.activities.value.intentScore.Title\", null}, {\"content.activities.value.triggerUtterance\", null}, {\"content.activities.value.normalizedTriggerUtterance\", null}}),\r\n #\"Transform columns 1\" = Table.TransformColumnTypes(#\"Replace errors\", {{\"metadata.BotId\", type text}}),\r\n #\"Replace errors 1\" = Table.ReplaceErrorValues(#\"Transform columns 1\", {{\"metadata.BotId\", null}})\r\nin\r\n #\"Replace errors 1\";\r\nshared PRRSurveyRequest = let\r\n Source = conversationtranscript,\r\n #\"Parsed JSON\" = Table.TransformColumns(Source,{{\"metadata\", Json.Document}}),\r\n #\"Expanded metadata\" = Table.ExpandRecordColumn(#\"Parsed JSON\", \"metadata\", {\"BotId\", \"AADTenantId\", \"BotName\"}, {\"metadata.BotId\", \"metadata.AADTenantId\", \"metadata.BotName\"}),\r\n #\"Parsed JSON1\" = Table.TransformColumns(#\"Expanded metadata\",{{\"content\", Json.Document}}),\r\n #\"Expanded content\" = Table.ExpandRecordColumn(#\"Parsed JSON1\", \"content\", {\"activities\"}, {\"content.activities\"}),\r\n #\"Expanded content.activities\" = Table.ExpandListColumn(#\"Expanded content\", \"content.activities\"),\r\n #\"Expanded content.activities1\" = Table.ExpandRecordColumn(#\"Expanded content.activities\", \"content.activities\", {\"id\", \"type\", \"timestamp\", \"from\", \"channelId\", \"textFormat\", \"text\", \"attachments\", \"channeldata\", \"valueType\", \"replyToId\", \"value\", \"speak\", \"name\"}, {\"content.activities.id\", \"content.activities.type\", \"content.activities.timestamp\", \"content.activities.from\", \"content.activities.channelId\", \"content.activities.textFormat\", \"content.activities.text\", \"content.activities.attachments\", \"content.activities.channeldata\", \"content.activities.valueType\", \"content.activities.replyToId\", \"content.activities.value\", \"content.activities.speak\", \"content.activities.name\"}),\r\n #\"Filtered Rows\" = Table.SelectRows(#\"Expanded content.activities1\", each [content.activities.valueType] = \"PRRSurveyRequest\"),\r\n #\"Expanded content.activities.from\" = Table.ExpandRecordColumn(#\"Filtered Rows\", \"content.activities.from\", {\"id\", \"role\"}, {\"content.activities.from.id\", \"content.activities.from.role\"}),\r\n #\"Removed Other Columns\" = Table.SelectColumns(#\"Expanded content.activities.from\", {\"content.activities.id\", \"content.activities.type\", \"content.activities.timestamp\", \"content.activities.from.id\", \"content.activities.from.role\", \"content.activities.channelId\", \"content.activities.attachments\", \"content.activities.channeldata\", \"content.activities.valueType\", \"content.activities.replyToId\", \"content.activities.value\", \"conversationtranscriptid\", \"createdon\", \"metadata.BotId\"}),\r\n #\"Transform columns\" = Table.TransformColumnTypes(#\"Removed Other Columns\", {{\"content.activities.id\", type text}, {\"content.activities.type\", type text}, {\"content.activities.timestamp\", type text}, {\"content.activities.from.id\", type text}, {\"content.activities.from.role\", type text}, {\"content.activities.channelId\", type text}, {\"content.activities.attachments\", type text}, {\"content.activities.channeldata\", type text}, {\"content.activities.valueType\", type text}, {\"content.activities.replyToId\", type text}, {\"content.activities.value\", type text}}),\r\n #\"Replace errors\" = Table.ReplaceErrorValues(#\"Transform columns\", {{\"content.activities.id\", null}, {\"content.activities.type\", null}, {\"content.activities.timestamp\", null}, {\"content.activities.from.id\", null}, {\"content.activities.from.role\", null}, {\"content.activities.channelId\", null}, {\"content.activities.attachments\", null}, {\"content.activities.channeldata\", null}, {\"content.activities.valueType\", null}, {\"content.activities.replyToId\", null}, {\"content.activities.value\", null}}),\r\n #\"Transform columns 1\" = Table.TransformColumnTypes(#\"Replace errors\", {{\"metadata.BotId\", type text}}),\r\n #\"Replace errors 1\" = Table.ReplaceErrorValues(#\"Transform columns 1\", {{\"metadata.BotId\", null}})\r\nin\r\n #\"Replace errors 1\";\r\nshared PRRSurveyResponse = let\r\n Source = conversationtranscript,\r\n #\"Parsed JSON\" = Table.TransformColumns(Source,{{\"metadata\", Json.Document}}),\r\n #\"Expanded metadata\" = Table.ExpandRecordColumn(#\"Parsed JSON\", \"metadata\", {\"BotId\", \"AADTenantId\", \"BotName\"}, {\"metadata.BotId\", \"metadata.AADTenantId\", \"metadata.BotName\"}),\r\n #\"Parsed JSON1\" = Table.TransformColumns(#\"Expanded metadata\",{{\"content\", Json.Document}}),\r\n #\"Expanded content\" = Table.ExpandRecordColumn(#\"Parsed JSON1\", \"content\", {\"activities\"}, {\"content.activities\"}),\r\n #\"Expanded content.activities\" = Table.ExpandListColumn(#\"Expanded content\", \"content.activities\"),\r\n #\"Expanded content.activities1\" = Table.ExpandRecordColumn(#\"Expanded content.activities\", \"content.activities\", {\"id\", \"type\", \"timestamp\", \"from\", \"channelId\", \"textFormat\", \"text\", \"attachments\", \"channeldata\", \"valueType\", \"replyToId\", \"value\", \"speak\", \"name\"}, {\"content.activities.id\", \"content.activities.type\", \"content.activities.timestamp\", \"content.activities.from\", \"content.activities.channelId\", \"content.activities.textFormat\", \"content.activities.text\", \"content.activities.attachments\", \"content.activities.channeldata\", \"content.activities.valueType\", \"content.activities.replyToId\", \"content.activities.value\", \"content.activities.speak\", \"content.activities.name\"}),\r\n #\"Filtered Rows\" = Table.SelectRows(#\"Expanded content.activities1\", each [content.activities.valueType] = \"PRRSurveyResponse\"),\r\n #\"Expanded content.activities.from\" = Table.ExpandRecordColumn(#\"Filtered Rows\", \"content.activities.from\", {\"id\", \"role\"}, {\"content.activities.from.id\", \"content.activities.from.role\"}),\r\n #\"Expanded content.activities.value\" = Table.ExpandRecordColumn(#\"Expanded content.activities.from\", \"content.activities.value\", {\"type\", \"response\"}, {\"content.activities.value.type\", \"content.activities.value.response\"}),\r\n #\"Removed Other Columns\" = Table.SelectColumns(#\"Expanded content.activities.value\", {\"content.activities.id\", \"content.activities.type\", \"content.activities.timestamp\", \"content.activities.from.id\", \"content.activities.from.role\", \"content.activities.channelId\", \"content.activities.attachments\", \"content.activities.channeldata\", \"content.activities.valueType\", \"content.activities.replyToId\", \"content.activities.value.type\", \"content.activities.value.response\", \"conversationtranscriptid\", \"createdon\", \"metadata.BotId\"}),\r\n #\"Transform columns\" = Table.TransformColumnTypes(#\"Removed Other Columns\", {{\"content.activities.id\", type text}, {\"content.activities.type\", type text}, {\"content.activities.timestamp\", type text}, {\"content.activities.from.id\", type text}, {\"content.activities.from.role\", type text}, {\"content.activities.channelId\", type text}, {\"content.activities.attachments\", type text}, {\"content.activities.channeldata\", type text}, {\"content.activities.valueType\", type text}, {\"content.activities.replyToId\", type text}, {\"content.activities.value.type\", type text}, {\"content.activities.value.response\", type text}}),\r\n #\"Replace errors\" = Table.ReplaceErrorValues(#\"Transform columns\", {{\"content.activities.id\", null}, {\"content.activities.type\", null}, {\"content.activities.timestamp\", null}, {\"content.activities.from.id\", null}, {\"content.activities.from.role\", null}, {\"content.activities.channelId\", null}, {\"content.activities.attachments\", null}, {\"content.activities.channeldata\", null}, {\"content.activities.valueType\", null}, {\"content.activities.replyToId\", null}, {\"content.activities.value.type\", null}, {\"content.activities.value.response\", null}}),\r\n #\"Transform columns 1\" = Table.TransformColumnTypes(#\"Replace errors\", {{\"metadata.BotId\", type text}}),\r\n #\"Replace errors 1\" = Table.ReplaceErrorValues(#\"Transform columns 1\", {{\"metadata.BotId\", null}})\r\nin\r\n #\"Replace errors 1\";\r\nshared VariableAssignment = let\r\n Source = conversationtranscript,\r\n #\"Parsed JSON\" = Table.TransformColumns(Source,{{\"metadata\", Json.Document}}),\r\n #\"Expanded metadata\" = Table.ExpandRecordColumn(#\"Parsed JSON\", \"metadata\", {\"BotId\", \"AADTenantId\", \"BotName\"}, {\"metadata.BotId\", \"metadata.AADTenantId\", \"metadata.BotName\"}),\r\n #\"Parsed JSON1\" = Table.TransformColumns(#\"Expanded metadata\",{{\"content\", Json.Document}}),\r\n #\"Expanded content\" = Table.ExpandRecordColumn(#\"Parsed JSON1\", \"content\", {\"activities\"}, {\"content.activities\"}),\r\n #\"Expanded content.activities\" = Table.ExpandListColumn(#\"Expanded content\", \"content.activities\"),\r\n #\"Expanded content.activities1\" = Table.ExpandRecordColumn(#\"Expanded content.activities\", \"content.activities\", {\"id\", \"type\", \"timestamp\", \"from\", \"channelId\", \"textFormat\", \"text\", \"attachments\", \"channeldata\", \"valueType\", \"replyToId\", \"value\", \"speak\", \"name\"}, {\"content.activities.id\", \"content.activities.type\", \"content.activities.timestamp\", \"content.activities.from\", \"content.activities.channelId\", \"content.activities.textFormat\", \"content.activities.text\", \"content.activities.attachments\", \"content.activities.channeldata\", \"content.activities.valueType\", \"content.activities.replyToId\", \"content.activities.value\", \"content.activities.speak\", \"content.activities.name\"}),\r\n #\"Filtered Rows\" = Table.SelectRows(#\"Expanded content.activities1\", each [content.activities.valueType] = \"VariableAssignment\"),\r\n #\"Expanded content.activities.from\" = Table.ExpandRecordColumn(#\"Filtered Rows\", \"content.activities.from\", {\"id\", \"role\"}, {\"content.activities.from.id\", \"content.activities.from.role\"}),\r\n #\"Removed Other Columns\" = Table.SelectColumns(#\"Expanded content.activities.from\", {\"content.activities.id\", \"content.activities.type\", \"content.activities.timestamp\", \"content.activities.from.id\", \"content.activities.from.role\", \"content.activities.channelId\", \"content.activities.attachments\", \"content.activities.channeldata\", \"content.activities.valueType\", \"content.activities.replyToId\", \"content.activities.value\", \"conversationtranscriptid\"}),\r\n #\"Transform columns\" = Table.TransformColumnTypes(#\"Removed Other Columns\", {{\"content.activities.id\", type text}, {\"content.activities.type\", type text}, {\"content.activities.timestamp\", type text}, {\"content.activities.from.id\", type text}, {\"content.activities.from.role\", type text}, {\"content.activities.channelId\", type text}, {\"content.activities.attachments\", type text}, {\"content.activities.channeldata\", type text}, {\"content.activities.valueType\", type text}, {\"content.activities.replyToId\", type text}, {\"content.activities.value\", type text}}),\r\n #\"Replace errors\" = Table.ReplaceErrorValues(#\"Transform columns\", {{\"content.activities.id\", null}, {\"content.activities.type\", null}, {\"content.activities.timestamp\", null}, {\"content.activities.from.id\", null}, {\"content.activities.from.role\", null}, {\"content.activities.channelId\", null}, {\"content.activities.attachments\", null}, {\"content.activities.channeldata\", null}, {\"content.activities.valueType\", null}, {\"content.activities.replyToId\", null}, {\"content.activities.value\", null}})\r\nin\r\n #\"Replace errors\";\r\nshared CSATSurveyResponseConversationSum = let\r\n Source = conversationtranscript,\r\n #\"Parsed JSON\" = Table.TransformColumns(Source,{{\"metadata\", Json.Document}}),\r\n #\"Expanded metadata\" = Table.ExpandRecordColumn(#\"Parsed JSON\", \"metadata\", {\"BotId\", \"AADTenantId\", \"BotName\"}, {\"metadata.BotId\", \"metadata.AADTenantId\", \"metadata.BotName\"}),\r\n #\"Parsed JSON1\" = Table.TransformColumns(#\"Expanded metadata\",{{\"content\", Json.Document}}),\r\n #\"Expanded content\" = Table.ExpandRecordColumn(#\"Parsed JSON1\", \"content\", {\"activities\"}, {\"content.activities\"}),\r\n #\"Expanded content.activities\" = Table.ExpandListColumn(#\"Expanded content\", \"content.activities\"),\r\n #\"Expanded content.activities1\" = Table.ExpandRecordColumn(#\"Expanded content.activities\", \"content.activities\", {\"id\", \"type\", \"timestamp\", \"from\", \"channelId\", \"textFormat\", \"text\", \"attachments\", \"channeldata\", \"valueType\", \"replyToId\", \"value\", \"speak\", \"name\"}, {\"content.activities.id\", \"content.activities.type\", \"content.activities.timestamp\", \"content.activities.from\", \"content.activities.channelId\", \"content.activities.textFormat\", \"content.activities.text\", \"content.activities.attachments\", \"content.activities.channeldata\", \"content.activities.valueType\", \"content.activities.replyToId\", \"content.activities.value\", \"content.activities.speak\", \"content.activities.name\"}),\r\n #\"Filtered Rows\" = Table.SelectRows(#\"Expanded content.activities1\", each [content.activities.valueType] = \"CSATSurveyResponse\"),\r\n #\"Expanded content.activities.from\" = Table.ExpandRecordColumn(#\"Filtered Rows\", \"content.activities.from\", {\"id\", \"role\"}, {\"content.activities.from.id\", \"content.activities.from.role\"}),\r\n #\"Expanded content.activities.value\" = Table.ExpandRecordColumn(#\"Expanded content.activities.from\", \"content.activities.value\", {\"type\", \"response\"}, {\"content.activities.value.type\", \"content.activities.value.response\"}),\r\n #\"Removed Other Columns\" = Table.SelectColumns(#\"Expanded content.activities.value\", {\"content.activities.id\", \"content.activities.type\", \"content.activities.timestamp\", \"content.activities.from.id\", \"content.activities.from.role\", \"content.activities.channelId\", \"content.activities.attachments\", \"content.activities.valueType\", \"content.activities.replyToId\", \"content.activities.value.type\", \"content.activities.value.response\", \"conversationtranscriptid\", \"createdon\", \"metadata.BotId\"}),\r\n #\"Transform columns\" = Table.TransformColumnTypes(#\"Removed Other Columns\", {{\"content.activities.id\", type text}, {\"content.activities.type\", type text}, {\"content.activities.timestamp\", type text}, {\"content.activities.from.id\", type text}, {\"content.activities.from.role\", type text}, {\"content.activities.channelId\", type text}, {\"content.activities.attachments\", type text}, {\"content.activities.valueType\", type text}, {\"content.activities.replyToId\", type text}, {\"content.activities.value.type\", type text}, {\"content.activities.value.response\", type text}}),\r\n #\"Replace errors\" = Table.ReplaceErrorValues(#\"Transform columns\", {{\"content.activities.id\", null}, {\"content.activities.type\", null}, {\"content.activities.timestamp\", null}, {\"content.activities.from.id\", null}, {\"content.activities.from.role\", null}, {\"content.activities.channelId\", null}, {\"content.activities.attachments\", null}, {\"content.activities.valueType\", null}, {\"content.activities.replyToId\", null}, {\"content.activities.value.type\", null}, {\"content.activities.value.response\", null}}),\r\n #\"Transform columns 1\" = Table.TransformColumnTypes(#\"Replace errors\", {{\"metadata.BotId\", type text}}),\r\n #\"Replace errors 1\" = Table.ReplaceErrorValues(#\"Transform columns 1\", {{\"metadata.BotId\", null}}),\r\n #\"Grouped Rows\" = Table.Group(#\"Replace errors 1\", {\"conversationtranscriptid\"}, {{\"LowestCSAT\", each List.Min([content.activities.value.response]), type nullable text}}),\r\n #\"Changed Type\" = Table.TransformColumnTypes(#\"Grouped Rows\", {{\"LowestCSAT\", Int64.Type}})\r\nin\r\n #\"Changed Type\";\r\nshared PRRSurveyResponseConversationSum = let\r\n Source = conversationtranscript,\r\n #\"Parsed JSON\" = Table.TransformColumns(Source,{{\"metadata\", Json.Document}}),\r\n #\"Expanded metadata\" = Table.ExpandRecordColumn(#\"Parsed JSON\", \"metadata\", {\"BotId\", \"AADTenantId\", \"BotName\"}, {\"metadata.BotId\", \"metadata.AADTenantId\", \"metadata.BotName\"}),\r\n #\"Parsed JSON1\" = Table.TransformColumns(#\"Expanded metadata\",{{\"content\", Json.Document}}),\r\n #\"Expanded content\" = Table.ExpandRecordColumn(#\"Parsed JSON1\", \"content\", {\"activities\"}, {\"content.activities\"}),\r\n #\"Expanded content.activities\" = Table.ExpandListColumn(#\"Expanded content\", \"content.activities\"),\r\n #\"Expanded content.activities1\" = Table.ExpandRecordColumn(#\"Expanded content.activities\", \"content.activities\", {\"id\", \"type\", \"timestamp\", \"from\", \"channelId\", \"textFormat\", \"text\", \"attachments\", \"channeldata\", \"valueType\", \"replyToId\", \"value\", \"speak\", \"name\"}, {\"content.activities.id\", \"content.activities.type\", \"content.activities.timestamp\", \"content.activities.from\", \"content.activities.channelId\", \"content.activities.textFormat\", \"content.activities.text\", \"content.activities.attachments\", \"content.activities.channeldata\", \"content.activities.valueType\", \"content.activities.replyToId\", \"content.activities.value\", \"content.activities.speak\", \"content.activities.name\"}),\r\n #\"Filtered Rows\" = Table.SelectRows(#\"Expanded content.activities1\", each [content.activities.valueType] = \"PRRSurveyResponse\"),\r\n #\"Expanded content.activities.from\" = Table.ExpandRecordColumn(#\"Filtered Rows\", \"content.activities.from\", {\"id\", \"role\"}, {\"content.activities.from.id\", \"content.activities.from.role\"}),\r\n #\"Expanded content.activities.value\" = Table.ExpandRecordColumn(#\"Expanded content.activities.from\", \"content.activities.value\", {\"type\", \"response\"}, {\"content.activities.value.type\", \"content.activities.value.response\"}),\r\n #\"Removed Other Columns\" = Table.SelectColumns(#\"Expanded content.activities.value\", {\"content.activities.id\", \"content.activities.type\", \"content.activities.timestamp\", \"content.activities.from.id\", \"content.activities.from.role\", \"content.activities.channelId\", \"content.activities.attachments\", \"content.activities.channeldata\", \"content.activities.valueType\", \"content.activities.replyToId\", \"content.activities.value.type\", \"content.activities.value.response\", \"conversationtranscriptid\", \"createdon\", \"metadata.BotId\"}),\r\n #\"Transform columns\" = Table.TransformColumnTypes(#\"Removed Other Columns\", {{\"content.activities.id\", type text}, {\"content.activities.type\", type text}, {\"content.activities.timestamp\", type text}, {\"content.activities.from.id\", type text}, {\"content.activities.from.role\", type text}, {\"content.activities.channelId\", type text}, {\"content.activities.attachments\", type text}, {\"content.activities.channeldata\", type text}, {\"content.activities.valueType\", type text}, {\"content.activities.replyToId\", type text}, {\"content.activities.value.type\", type text}, {\"content.activities.value.response\", type text}}),\r\n #\"Replace errors\" = Table.ReplaceErrorValues(#\"Transform columns\", {{\"content.activities.id\", null}, {\"content.activities.type\", null}, {\"content.activities.timestamp\", null}, {\"content.activities.from.id\", null}, {\"content.activities.from.role\", null}, {\"content.activities.channelId\", null}, {\"content.activities.attachments\", null}, {\"content.activities.channeldata\", null}, {\"content.activities.valueType\", null}, {\"content.activities.replyToId\", null}, {\"content.activities.value.type\", null}, {\"content.activities.value.response\", null}}),\r\n #\"Transform columns 1\" = Table.TransformColumnTypes(#\"Replace errors\", {{\"metadata.BotId\", type text}}),\r\n #\"Replace errors 1\" = Table.ReplaceErrorValues(#\"Transform columns 1\", {{\"metadata.BotId\", null}}),\r\n #\"Grouped Rows\" = Table.Group(#\"Replace errors 1\", {\"conversationtranscriptid\"}, {{\"LastPRRSurveyResponse\", each List.Min([content.activities.value.response]), type nullable text}})\r\nin\r\n #\"Grouped Rows\";\r\n"},"annotations":[{"name":"pbi:QueryGroups","value":"[{\"id\":\"a2cfa954-0ad9-4463-afc0-169f3004c729\",\"name\":\"Trace data\",\"description\":\"\",\"parentId\":null,\"order\":0},{\"id\":\"59f08598-00b7-4a1b-9e50-b4721149cb70\",\"name\":\"Aggregates\",\"description\":\"\",\"parentId\":null,\"order\":0}]"}],"entities":[{"$type":"LocalEntity","name":"bot","description":"","pbi:refreshPolicy":{"$type":"FullRefreshPolicy","location":"bot.csv"},"attributes":[{"name":"botid","dataType":"string"},{"name":"createdon","dataType":"dateTime"},{"name":"createdby","dataType":"string"},{"name":"modifiedon","dataType":"dateTime"},{"name":"modifiedby","dataType":"string"},{"name":"createdonbehalfby","dataType":"string"},{"name":"modifiedonbehalfby","dataType":"string"},{"name":"createdbyname","dataType":"string"},{"name":"createdbyyominame","dataType":"string"},{"name":"createdonbehalfbyname","dataType":"string"},{"name":"createdonbehalfbyyominame","dataType":"string"},{"name":"modifiedbyname","dataType":"string"},{"name":"modifiedbyyominame","dataType":"string"},{"name":"modifiedonbehalfbyname","dataType":"string"},{"name":"modifiedonbehalfbyyominame","dataType":"string"},{"name":"ownerid","dataType":"string"},{"name":"owneridname","dataType":"string"},{"name":"owneridyominame","dataType":"string"},{"name":"owningbusinessunit","dataType":"string"},{"name":"owninguser","dataType":"string"},{"name":"owningteam","dataType":"string"},{"name":"statecode","dataType":"int64"},{"name":"statecodename","dataType":"string"},{"name":"statuscode","dataType":"int64"},{"name":"statuscodename","dataType":"string"},{"name":"importsequencenumber","dataType":"int64"},{"name":"overriddencreatedon","dataType":"dateTime"},{"name":"timezoneruleversionnumber","dataType":"int64"},{"name":"utcconversiontimezonecode","dataType":"int64"},{"name":"name","dataType":"string"},{"name":"overwritetime","dataType":"dateTime"},{"name":"solutionid","dataType":"string"},{"name":"componentstate","dataType":"int64"},{"name":"componentstatename","dataType":"string"},{"name":"componentidunique","dataType":"string"},{"name":"ismanaged","dataType":"boolean"},{"name":"ismanagedname","dataType":"string"},{"name":"accesscontrolpolicy","dataType":"int64"},{"name":"accesscontrolpolicyname","dataType":"string"},{"name":"applicationmanifestinformation","dataType":"string"},{"name":"authenticationmode","dataType":"int64"},{"name":"authenticationmodename","dataType":"string"},{"name":"authenticationtrigger","dataType":"int64"},{"name":"authenticationtriggername","dataType":"string"},{"name":"authorizedsecuritygroupids","dataType":"string"},{"name":"iconbase64","dataType":"string"},{"name":"language","dataType":"int64"},{"name":"languagename","dataType":"string"},{"name":"configuration","dataType":"string"},{"name":"publishedby","dataType":"string"},{"name":"publishedon","dataType":"dateTime"},{"name":"schemaname","dataType":"string"},{"name":"publishedbyname","dataType":"string"},{"name":"publishedbyyominame","dataType":"string"}],"partitions":[{"name":"FullRefreshPolicyPartition","refreshTime":"2021-09-28T14:47:09.5837876+00:00","location":"https://wabiusw2cdsa.blob.core.windows.net:443/8123155c-ac05-4b1e-8b2c-854bd69ad5cf/bot.csv?snapshot=2021-09-28T14%3A47%3A09.5284972Z"}]},{"$type":"LocalEntity","name":"botcomponent","description":"","pbi:refreshPolicy":{"$type":"FullRefreshPolicy","location":"botcomponent.csv"},"attributes":[{"name":"botcomponentid","dataType":"string"},{"name":"createdon","dataType":"dateTime"},{"name":"createdby","dataType":"string"},{"name":"modifiedon","dataType":"dateTime"},{"name":"modifiedby","dataType":"string"},{"name":"createdonbehalfby","dataType":"string"},{"name":"modifiedonbehalfby","dataType":"string"},{"name":"createdbyname","dataType":"string"},{"name":"createdbyyominame","dataType":"string"},{"name":"createdonbehalfbyname","dataType":"string"},{"name":"createdonbehalfbyyominame","dataType":"string"},{"name":"modifiedbyname","dataType":"string"},{"name":"modifiedbyyominame","dataType":"string"},{"name":"modifiedonbehalfbyname","dataType":"string"},{"name":"modifiedonbehalfbyyominame","dataType":"string"},{"name":"ownerid","dataType":"string"},{"name":"owneridname","dataType":"string"},{"name":"owneridyominame","dataType":"string"},{"name":"owningbusinessunit","dataType":"string"},{"name":"owninguser","dataType":"string"},{"name":"owningteam","dataType":"string"},{"name":"statecode","dataType":"int64"},{"name":"statecodename","dataType":"string"},{"name":"statuscode","dataType":"int64"},{"name":"statuscodename","dataType":"string"},{"name":"importsequencenumber","dataType":"int64"},{"name":"overriddencreatedon","dataType":"dateTime"},{"name":"timezoneruleversionnumber","dataType":"int64"},{"name":"utcconversiontimezonecode","dataType":"int64"},{"name":"name","dataType":"string"},{"name":"overwritetime","dataType":"dateTime"},{"name":"solutionid","dataType":"string"},{"name":"componentstate","dataType":"int64"},{"name":"componentstatename","dataType":"string"},{"name":"componentidunique","dataType":"string"},{"name":"ismanaged","dataType":"boolean"},{"name":"ismanagedname","dataType":"string"},{"name":"componenttype","dataType":"int64"},{"name":"componenttypename","dataType":"string"},{"name":"content","dataType":"string"},{"name":"category","dataType":"string"},{"name":"data","dataType":"string"},{"name":"description","dataType":"string"},{"name":"language","dataType":"int64"},{"name":"languagename","dataType":"string"},{"name":"parentbotcomponentid","dataType":"string"},{"name":"schemaname","dataType":"string"},{"name":"parentbotcomponentidname","dataType":"string"},{"name":"reusepolicy","dataType":"int64"},{"name":"reusepolicyname","dataType":"string"},{"name":"helplink","dataType":"string"},{"name":"iconurl","dataType":"string"},{"name":"accentcolor","dataType":"string"}],"partitions":[{"name":"FullRefreshPolicyPartition","refreshTime":"2021-09-28T14:47:08.7400422+00:00","location":"https://wabiusw2cdsa.blob.core.windows.net:443/8123155c-ac05-4b1e-8b2c-854bd69ad5cf/botcomponent.csv?snapshot=2021-09-28T14%3A47%3A08.6819752Z"}]},{"$type":"LocalEntity","name":"conversationtranscript","description":"","pbi:refreshPolicy":{"$type":"FullRefreshPolicy","location":"conversationtranscript.csv"},"attributes":[{"name":"conversationtranscriptid","dataType":"string"},{"name":"createdon","dataType":"dateTime"},{"name":"createdby","dataType":"string"},{"name":"modifiedon","dataType":"dateTime"},{"name":"modifiedby","dataType":"string"},{"name":"createdonbehalfby","dataType":"string"},{"name":"modifiedonbehalfby","dataType":"string"},{"name":"createdbyname","dataType":"string"},{"name":"createdbyyominame","dataType":"string"},{"name":"createdonbehalfbyname","dataType":"string"},{"name":"createdonbehalfbyyominame","dataType":"string"},{"name":"modifiedbyname","dataType":"string"},{"name":"modifiedbyyominame","dataType":"string"},{"name":"modifiedonbehalfbyname","dataType":"string"},{"name":"modifiedonbehalfbyyominame","dataType":"string"},{"name":"ownerid","dataType":"string"},{"name":"owneridname","dataType":"string"},{"name":"owneridyominame","dataType":"string"},{"name":"owningbusinessunit","dataType":"string"},{"name":"owninguser","dataType":"string"},{"name":"owningteam","dataType":"string"},{"name":"statecode","dataType":"int64"},{"name":"statecodename","dataType":"string"},{"name":"statuscode","dataType":"int64"},{"name":"statuscodename","dataType":"string"},{"name":"importsequencenumber","dataType":"int64"},{"name":"overriddencreatedon","dataType":"dateTime"},{"name":"timezoneruleversionnumber","dataType":"int64"},{"name":"utcconversiontimezonecode","dataType":"int64"},{"name":"name","dataType":"string"},{"name":"content","dataType":"string"},{"name":"conversationstarttime","dataType":"dateTime"},{"name":"metadata","dataType":"string"},{"name":"schematype","dataType":"string"},{"name":"schemaversion","dataType":"string"},{"name":"bot_conversationtranscriptid","dataType":"string"},{"name":"bot_conversationtranscriptidname","dataType":"string"}],"partitions":[{"name":"FullRefreshPolicyPartition","refreshTime":"2021-09-28T14:47:11.8876018+00:00","location":"https://wabiusw2cdsa.blob.core.windows.net:443/8123155c-ac05-4b1e-8b2c-854bd69ad5cf/conversationtranscript.csv?snapshot=2021-09-28T14%3A47%3A11.2655174Z"}]},{"$type":"LocalEntity","name":"SessionInfo","description":"","pbi:refreshPolicy":{"$type":"FullRefreshPolicy","location":"SessionInfo.csv"},"annotations":[{"name":"pbi:EntityTypeDisplayHint","value":"CalculatedEntity"}],"attributes":[{"name":"content.activities.valueType","dataType":"string"},{"name":"content.activities.id","dataType":"string"},{"name":"content.activities.type","dataType":"string"},{"name":"content.activities.timestamp","dataType":"string"},{"name":"content.activities.from.id","dataType":"string"},{"name":"content.activities.from.role","dataType":"string"},{"name":"content.activities.channelId","dataType":"string"},{"name":"content.activities.value.startTimeUtc","dataType":"string"},{"name":"content.activities.value.endTimeUtc","dataType":"string"},{"name":"content.activities.value.type","dataType":"string"},{"name":"content.activities.value.outcome","dataType":"string"},{"name":"content.activities.value.turnCount","dataType":"string"},{"name":"content.activities.value.lastTriggeredIntentId","dataType":"string"},{"name":"content.activities.value.impliedSuccess","dataType":"string"},{"name":"conversationtranscriptid","dataType":"string"},{"name":"metadata.BotId","dataType":"string"},{"name":"metadata.AADTenantId","dataType":"string"},{"name":"metadata.BotName","dataType":"string"}],"partitions":[{"name":"FullRefreshPolicyPartition","refreshTime":"2021-09-28T14:47:16.2722449+00:00","location":"https://wabiusw2cdsa.blob.core.windows.net:443/8123155c-ac05-4b1e-8b2c-854bd69ad5cf/SessionInfo.csv?snapshot=2021-09-28T14%3A47%3A16.2367112Z"}]},{"$type":"LocalEntity","name":"ConversationInfo","description":"","pbi:refreshPolicy":{"$type":"FullRefreshPolicy","location":"ConversationInfo.csv"},"annotations":[{"name":"pbi:EntityTypeDisplayHint","value":"CalculatedEntity"}],"attributes":[{"name":"conversationtranscriptid","dataType":"string"},{"name":"createdon","dataType":"dateTime"},{"name":"createdby","dataType":"string"},{"name":"modifiedon","dataType":"dateTime"},{"name":"modifiedby","dataType":"string"},{"name":"createdonbehalfby","dataType":"string"},{"name":"modifiedonbehalfby","dataType":"string"},{"name":"ownerid","dataType":"string"},{"name":"owningbusinessunit","dataType":"string"},{"name":"owninguser","dataType":"string"},{"name":"owningteam","dataType":"string"},{"name":"statecode","dataType":"int64"},{"name":"statecodename","dataType":"string"},{"name":"statuscode","dataType":"int64"},{"name":"importsequencenumber","dataType":"int64"},{"name":"overriddencreatedon","dataType":"dateTime"},{"name":"timezoneruleversionnumber","dataType":"int64"},{"name":"utcconversiontimezonecode","dataType":"int64"},{"name":"name","dataType":"string"},{"name":"content.activities.id","dataType":"string"},{"name":"content.activities.type","dataType":"string"},{"name":"content.activities.timestamp","dataType":"string"},{"name":"content.activities.from","dataType":"string"},{"name":"content.activities.channelId","dataType":"string"},{"name":"content.activities.attachments","dataType":"string"},{"name":"content.activities.channeldata","dataType":"string"},{"name":"content.activities.valueType","dataType":"string"},{"name":"content.activities.replyToId","dataType":"string"},{"name":"content.activities.value.isDesignMode","dataType":"string"},{"name":"content.activities.value.locale","dataType":"string"},{"name":"conversationstarttime","dataType":"dateTime"},{"name":"metadata.BotId","dataType":"string"},{"name":"metadata.AADTenantId","dataType":"string"},{"name":"metadata.BotName","dataType":"string"},{"name":"schematype","dataType":"string"},{"name":"schemaversion","dataType":"string"},{"name":"bot_conversationtranscriptid","dataType":"string"},{"name":"raw_content.1","dataType":"string"},{"name":"raw_content.2","dataType":"string"},{"name":"LowestCSAT","dataType":"int64"},{"name":"LastPRRSurveyResponse","dataType":"string"}]},{"$type":"LocalEntity","name":"CSATSurveyRequest","description":"","pbi:refreshPolicy":{"$type":"FullRefreshPolicy","location":"CSATSurveyRequest.csv"},"annotations":[{"name":"pbi:EntityTypeDisplayHint","value":"CalculatedEntity"}],"attributes":[{"name":"content.activities.id","dataType":"string"},{"name":"content.activities.type","dataType":"string"},{"name":"content.activities.timestamp","dataType":"string"},{"name":"content.activities.from.id","dataType":"string"},{"name":"content.activities.from.role","dataType":"string"},{"name":"content.activities.channelId","dataType":"string"},{"name":"content.activities.attachments","dataType":"string"},{"name":"content.activities.valueType","dataType":"string"},{"name":"content.activities.replyToId","dataType":"string"},{"name":"content.activities.value.type","dataType":"string"},{"name":"conversationstarttime","dataType":"dateTime"},{"name":"conversationtranscriptid","dataType":"string"},{"name":"metadata.BotId","dataType":"string"}],"partitions":[{"name":"FullRefreshPolicyPartition","refreshTime":"2021-09-28T14:47:15.9268763+00:00","location":"https://wabiusw2cdsa.blob.core.windows.net:443/8123155c-ac05-4b1e-8b2c-854bd69ad5cf/CSATSurveyRequest.csv?snapshot=2021-09-28T14%3A47%3A15.8799132Z"}]},{"$type":"LocalEntity","name":"CSATSurveyResponse","description":"","pbi:refreshPolicy":{"$type":"FullRefreshPolicy","location":"CSATSurveyResponse.csv"},"annotations":[{"name":"pbi:EntityTypeDisplayHint","value":"CalculatedEntity"}],"attributes":[{"name":"content.activities.id","dataType":"string"},{"name":"content.activities.type","dataType":"string"},{"name":"content.activities.timestamp","dataType":"string"},{"name":"content.activities.from.id","dataType":"string"},{"name":"content.activities.from.role","dataType":"string"},{"name":"content.activities.channelId","dataType":"string"},{"name":"content.activities.attachments","dataType":"string"},{"name":"content.activities.valueType","dataType":"string"},{"name":"content.activities.replyToId","dataType":"string"},{"name":"content.activities.value.type","dataType":"string"},{"name":"content.activities.value.response","dataType":"string"},{"name":"conversationtranscriptid","dataType":"string"},{"name":"createdon","dataType":"dateTime"},{"name":"metadata.BotId","dataType":"string"}],"partitions":[{"name":"FullRefreshPolicyPartition","refreshTime":"2021-09-28T14:47:13.2054972+00:00","location":"https://wabiusw2cdsa.blob.core.windows.net:443/8123155c-ac05-4b1e-8b2c-854bd69ad5cf/CSATSurveyResponse.csv?snapshot=2021-09-28T14%3A47%3A13.1214697Z"}]},{"$type":"LocalEntity","name":"DialogRedirect","description":"","pbi:refreshPolicy":{"$type":"FullRefreshPolicy","location":"DialogRedirect.csv"},"annotations":[{"name":"pbi:EntityTypeDisplayHint","value":"CalculatedEntity"}],"attributes":[{"name":"content.activities.id","dataType":"string"},{"name":"content.activities.type","dataType":"string"},{"name":"content.activities.timestamp","dataType":"string"},{"name":"content.activities.from.id","dataType":"string"},{"name":"content.activities.from.role","dataType":"string"},{"name":"content.activities.channelId","dataType":"string"},{"name":"content.activities.attachments","dataType":"string"},{"name":"content.activities.channeldata","dataType":"string"},{"name":"content.activities.valueType","dataType":"string"},{"name":"content.activities.replyToId","dataType":"string"},{"name":"content.activities.value.targetDialogId","dataType":"string"},{"name":"content.activities.value.targetDialogType","dataType":"string"},{"name":"conversationtranscriptid","dataType":"string"}],"partitions":[{"name":"FullRefreshPolicyPartition","refreshTime":"2021-09-28T14:47:13.1273821+00:00","location":"https://wabiusw2cdsa.blob.core.windows.net:443/8123155c-ac05-4b1e-8b2c-854bd69ad5cf/DialogRedirect.csv?snapshot=2021-09-28T14%3A47%3A13.0854902Z"}]},{"$type":"LocalEntity","name":"ImpliedSuccess","description":"","pbi:refreshPolicy":{"$type":"FullRefreshPolicy","location":"ImpliedSuccess.csv"},"annotations":[{"name":"pbi:EntityTypeDisplayHint","value":"CalculatedEntity"}],"attributes":[{"name":"content.activities.id","dataType":"string"},{"name":"content.activities.type","dataType":"string"},{"name":"content.activities.timestamp","dataType":"string"},{"name":"content.activities.from.id","dataType":"string"},{"name":"content.activities.from.role","dataType":"string"},{"name":"content.activities.channelId","dataType":"string"},{"name":"content.activities.attachments","dataType":"string"},{"name":"content.activities.channeldata","dataType":"string"},{"name":"content.activities.valueType","dataType":"string"},{"name":"content.activities.replyToId","dataType":"string"},{"name":"content.activities.value.type","dataType":"string"},{"name":"conversationtranscriptid","dataType":"string"}],"partitions":[{"name":"FullRefreshPolicyPartition","refreshTime":"2021-09-28T14:47:16.6628731+00:00","location":"https://wabiusw2cdsa.blob.core.windows.net:443/8123155c-ac05-4b1e-8b2c-854bd69ad5cf/ImpliedSuccess.csv?snapshot=2021-09-28T14%3A47%3A16.5265483Z"}]},{"$type":"LocalEntity","name":"IntentRecognition","description":"","pbi:refreshPolicy":{"$type":"FullRefreshPolicy","location":"IntentRecognition.csv"},"annotations":[{"name":"pbi:EntityTypeDisplayHint","value":"CalculatedEntity"}],"attributes":[{"name":"content.activities.id","dataType":"string"},{"name":"content.activities.type","dataType":"string"},{"name":"content.activities.timestamp","dataType":"string"},{"name":"content.activities.from.id","dataType":"string"},{"name":"content.activities.from.role","dataType":"string"},{"name":"content.activities.channelId","dataType":"string"},{"name":"content.activities.attachments","dataType":"string"},{"name":"content.activities.channeldata","dataType":"string"},{"name":"content.activities.valueType","dataType":"string"},{"name":"content.activities.replyToId","dataType":"string"},{"name":"content.activities.value.intentId","dataType":"string"},{"name":"content.activities.value.intentScore.score","dataType":"string"},{"name":"content.activities.value.intentScore.Type","dataType":"string"},{"name":"content.activities.value.intentScore.Title","dataType":"string"},{"name":"content.activities.value.triggerUtterance","dataType":"string"},{"name":"content.activities.value.normalizedTriggerUtterance","dataType":"string"},{"name":"conversationtranscriptid","dataType":"string"},{"name":"createdon","dataType":"dateTime"},{"name":"metadata.BotId","dataType":"string"}],"partitions":[{"name":"FullRefreshPolicyPartition","refreshTime":"2021-09-28T14:47:16.6785352+00:00","location":"https://wabiusw2cdsa.blob.core.windows.net:443/8123155c-ac05-4b1e-8b2c-854bd69ad5cf/IntentRecognition.csv?snapshot=2021-09-28T14%3A47%3A16.6204949Z"}]},{"$type":"LocalEntity","name":"PRRSurveyRequest","description":"","pbi:refreshPolicy":{"$type":"FullRefreshPolicy","location":"PRRSurveyRequest.csv"},"annotations":[{"name":"pbi:EntityTypeDisplayHint","value":"CalculatedEntity"}],"attributes":[{"name":"content.activities.id","dataType":"string"},{"name":"content.activities.type","dataType":"string"},{"name":"content.activities.timestamp","dataType":"string"},{"name":"content.activities.from.id","dataType":"string"},{"name":"content.activities.from.role","dataType":"string"},{"name":"content.activities.channelId","dataType":"string"},{"name":"content.activities.attachments","dataType":"string"},{"name":"content.activities.channeldata","dataType":"string"},{"name":"content.activities.valueType","dataType":"string"},{"name":"content.activities.replyToId","dataType":"string"},{"name":"content.activities.value","dataType":"string"},{"name":"conversationtranscriptid","dataType":"string"},{"name":"createdon","dataType":"dateTime"},{"name":"metadata.BotId","dataType":"string"}],"partitions":[{"name":"FullRefreshPolicyPartition","refreshTime":"2021-09-28T14:47:16.6941105+00:00","location":"https://wabiusw2cdsa.blob.core.windows.net:443/8123155c-ac05-4b1e-8b2c-854bd69ad5cf/PRRSurveyRequest.csv?snapshot=2021-09-28T14%3A47%3A16.6284906Z"}]},{"$type":"LocalEntity","name":"PRRSurveyResponse","description":"","pbi:refreshPolicy":{"$type":"FullRefreshPolicy","location":"PRRSurveyResponse.csv"},"annotations":[{"name":"pbi:EntityTypeDisplayHint","value":"CalculatedEntity"}],"attributes":[{"name":"content.activities.id","dataType":"string"},{"name":"content.activities.type","dataType":"string"},{"name":"content.activities.timestamp","dataType":"string"},{"name":"content.activities.from.id","dataType":"string"},{"name":"content.activities.from.role","dataType":"string"},{"name":"content.activities.channelId","dataType":"string"},{"name":"content.activities.attachments","dataType":"string"},{"name":"content.activities.channeldata","dataType":"string"},{"name":"content.activities.valueType","dataType":"string"},{"name":"content.activities.replyToId","dataType":"string"},{"name":"content.activities.value.type","dataType":"string"},{"name":"content.activities.value.response","dataType":"string"},{"name":"conversationtranscriptid","dataType":"string"},{"name":"createdon","dataType":"dateTime"},{"name":"metadata.BotId","dataType":"string"}],"partitions":[{"name":"FullRefreshPolicyPartition","refreshTime":"2021-09-28T14:47:16.4599838+00:00","location":"https://wabiusw2cdsa.blob.core.windows.net:443/8123155c-ac05-4b1e-8b2c-854bd69ad5cf/PRRSurveyResponse.csv?snapshot=2021-09-28T14%3A47%3A16.4296026Z"}]},{"$type":"LocalEntity","name":"VariableAssignment","description":"","pbi:refreshPolicy":{"$type":"FullRefreshPolicy","location":"VariableAssignment.csv"},"annotations":[{"name":"pbi:EntityTypeDisplayHint","value":"CalculatedEntity"}],"attributes":[{"name":"content.activities.id","dataType":"string"},{"name":"content.activities.type","dataType":"string"},{"name":"content.activities.timestamp","dataType":"string"},{"name":"content.activities.from.id","dataType":"string"},{"name":"content.activities.from.role","dataType":"string"},{"name":"content.activities.channelId","dataType":"string"},{"name":"content.activities.attachments","dataType":"string"},{"name":"content.activities.channeldata","dataType":"string"},{"name":"content.activities.valueType","dataType":"string"},{"name":"content.activities.replyToId","dataType":"string"},{"name":"content.activities.value","dataType":"string"},{"name":"conversationtranscriptid","dataType":"string"}],"partitions":[{"name":"FullRefreshPolicyPartition","refreshTime":"2021-09-28T14:47:16.2878772+00:00","location":"https://wabiusw2cdsa.blob.core.windows.net:443/8123155c-ac05-4b1e-8b2c-854bd69ad5cf/VariableAssignment.csv?snapshot=2021-09-28T14%3A47%3A16.1627533Z"}]},{"$type":"LocalEntity","name":"CSATSurveyResponseConversationSum","description":"","pbi:refreshPolicy":{"$type":"FullRefreshPolicy","location":"CSATSurveyResponseConversationSum.csv"},"annotations":[{"name":"pbi:EntityTypeDisplayHint","value":"CalculatedEntity"}],"attributes":[{"name":"conversationtranscriptid","dataType":"string"},{"name":"LowestCSAT","dataType":"int64"}]},{"$type":"LocalEntity","name":"PRRSurveyResponseConversationSum","description":"","pbi:refreshPolicy":{"$type":"FullRefreshPolicy","location":"PRRSurveyResponseConversationSum.csv"},"annotations":[{"name":"pbi:EntityTypeDisplayHint","value":"CalculatedEntity"}],"attributes":[{"name":"conversationtranscriptid","dataType":"string"},{"name":"LastPRRSurveyResponse","dataType":"string"}]}],"relationships":[{"$type":"SingleKeyRelationship","fromAttribute":{"entityName":"CSATSurveyResponseConversationSum","attributeName":"conversationtranscriptid"},"toAttribute":{"entityName":"ConversationInfo","attributeName":"conversationtranscriptid"}},{"$type":"SingleKeyRelationship","fromAttribute":{"entityName":"PRRSurveyResponseConversationSum","attributeName":"conversationtranscriptid"},"toAttribute":{"entityName":"ConversationInfo","attributeName":"conversationtranscriptid"}}]} \ No newline at end of file diff --git a/CustomAnalytics/DataFlowVersion/PVA_Dashboard_DataFlow.pbit b/CustomAnalytics/DataFlowVersion/PVA_Dashboard_DataFlow.pbit new file mode 100644 index 00000000..fb131692 Binary files /dev/null and b/CustomAnalytics/DataFlowVersion/PVA_Dashboard_DataFlow.pbit differ diff --git a/CustomAnalytics/DataFlowVersion/readme.md b/CustomAnalytics/DataFlowVersion/readme.md new file mode 100644 index 00000000..6dea605f --- /dev/null +++ b/CustomAnalytics/DataFlowVersion/readme.md @@ -0,0 +1,63 @@ +# Custom analytics solution for Power Virtual Agents - DataFlows version for higher scale bots + +If your Bot has significant numbers of monthly sessions, using this version of the report provides improved scalibility. This version does require additional setup, and a Power BI Premium license . The report uses Power BI DataFlows to connect to DataVerse and pre-process some of the compute-intensive transformations of the data. + +## Solution components + +- Microsoft Dataverse +- Microsoft Power BI DataFlows +- Microsoft Power BI Desktop +- Chat Transcripts control for Power BI - available at +- (Optional) Azure Data Lake Storage v2 + +## Solution files + +- PVA_Analytics_Export_Transform.json - this is the template for a PowerBI DataFlow +- PVA_Dashboard.pbit - Power BI template file + +## Installation + +### Installation requirements + +- One or more Power Virtual Agents bots +- A Power BI account +- [Power BI Desktop](https://powerbi.microsoft.com/en-us/downloads/) + +### Installation steps + +1. **Edit the DataFlow template** + 1. [Find your Dataverse environment URL](https://docs.microsoft.com/en-us/powerapps/maker/data-platform/data-platform-powerbi-connector#find-your-dataverse-environment-url), the URL will be in the format: https://yourenvironmentid.crm.dynamics.com/. You will just need the 'yourenvironmentid' part of the URL + 2. Download the file [PVA Analytics_Export_Transform.json](PVA_Analytics_Export_Transform.json?plain=1) and open it in a text editor, e.g. Visual Studio Code. + 3. Perform a find and replace on the file - swapping the placeholder `yourdataverse` with your Dataverse environment URL. + +2. **Create the DataFlow from the template** + 1. Log in to Power BI at + 2. Select the Workspace you wish to deploy the DataFlow to or create a new workspace. Please note that you cannot use 'My Workspace' for this purpose. + 3. Select New > DataFlow + 4. Select Import Model + 5. Select the edited file 'PVA Analytics_Export_Transform.json'. Your DataFlow job should now be ready - test refreshing the data. + 6. You should be prompted for credentials, if not go to Settings -> Data source credentials and select organizational account. You can now login with an Azure Active Directory account that has access to the Dataverse environment. + 7. Whilst in Settings for your DataFlow, be sure to select 'Enhanced compute engine settings' and select 'On'. + 8. If you want to refresh the content periodically, go to Settings -> Scheduled refresh and select the preferred period. + +3. **Create your Power BI report** + 1. Download the file [PVA_Dashboard_DataFlow.pbit](PVA_Dashboard_DataFlow.pbit?plain=1) + 2. Enter the parameters you are prompted for. These are: + 1. The name of the Power BI workspace + 2. The name of the DataFlow you created + 3. The report should pull in the data and render it + 4. You can now [publish the report from Power BI Desktop](https://docs.microsoft.com/en-us/power-bi/create-reports/desktop-upload-desktop-files) so that other users can access it. + +## Connecting Azure Data Lake Storage for data archival + +Please follow the instructions in the main [readme] (../readme.md) for details of setting this up. Instead of consuming the DataFlow containing the ConversationTranscript records (stored in Azure Data Lake) in the Power BI report, it should be consumed in the PVA Analytics_Export_Transform DataFlow (change the source of ConversationTranscript from Dataverse to point the Azure Data Lake DataFlow). + +## Troubleshooting + +There are a few places where the pipeline may break - troublshooting can normally isolate the problem using these steps: + +1. Ensure that data is being pulled in to your DataFlow correctly. Open the DataFlow for editing (select 'edit entities'), and on each of the tables, select refresh to ensure that data is being populated. +2. Ensure that your Power BI report is connecting to DataFlows. If an error happens when you first pull in data, select 'Transform data' in the navigation menu to open Power Query + 1. Refresh each table in the 'Raw Data' folder - these correspond to the data in the DataFlow. + 2. If this fails also, test you have permissions to the DataFlow. An easy way to do this is to open the 'bot' query at the top of the query list, and select 'Source' at the top of the 'Applied steps' control. This lists all the DataFlows you have access to. +3. If both of the steps above succeed, but you still have errors, please raise an issue in this repo. diff --git a/CustomAnalytics/readme.md b/CustomAnalytics/readme.md index 4464c9b0..ec14a09c 100644 --- a/CustomAnalytics/readme.md +++ b/CustomAnalytics/readme.md @@ -1,6 +1,6 @@ # Custom analytics solution for Power Virtual Agents -This solution allows customers to create a Power BI dashboard for their Power Virtual Agents chatbots, and includes pre-created screens to show all-up performance, customer satisfaction, topics and transcripts. +This solution allows customers to create a Power BI dashboard for their Power Virtual Agents chatbots, and includes pre-created screens to show all-up performance, customer satisfaction, topics and transcripts. There are two versions of the solution, the base report found here (most users should start with this), and a version using [Power BI DataFlows](DataFlowVersion/readme.md) for additional scalability with large datasets. Custom Analytics example screenshot @@ -9,7 +9,6 @@ This solution allows customers to create a Power BI dashboard for their Power Vi - Microsoft Dataverse - Microsoft Power BI Desktop - Chat Transcripts control for Power BI - available at - many thanks to Mick Vleeshouwer -- (Optional) Microsoft Power BI DataFlows - (Optional) Azure Data Lake Storage v2 ## Solution files @@ -73,4 +72,4 @@ The report is based on what is shared through the Power Virtual Agents portal, b ## Troubleshooting 1. Ensure you have permission to access the TDS endpoint in Dataverse. Empty data tables may indicate a permissions problem. -2. Please raise issues in the repo for other problems. +2. Please raise issues in the repo for other