Skip to content

Commit 38d50c6

Browse files
Bill LeoutsakosBill Leoutsakos
authored andcommitted
fix(powerbi): preserve nested query diagnostics
1 parent b7ef1b1 commit 38d50c6

3 files changed

Lines changed: 240 additions & 205 deletions

File tree

‎apps/sim/tools/powerbi/execute-query.test.ts‎

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,19 @@ const params = {
1212
describe('Power BI DAX result handling', () => {
1313
it('preserves partial rows and identifies errors at every documented scope', async () => {
1414
const response = jsonResponse({
15-
error: { code: 'ResponseLimit', message: 'Limited result.' },
15+
error: {
16+
'pbi.error': { code: 'ResponseLimit', message: 'Limited result.' },
17+
},
1618
results: [
1719
{
18-
error: { code: 'QueryLimit', message: 'One result table allowed.' },
20+
error: {
21+
'pbi.error': { code: 'QueryLimit', message: 'One result table allowed.' },
22+
},
1923
tables: [
2024
{
21-
error: { code: 'TableLimit', message: 'More than the allowed rows.' },
25+
error: {
26+
'pbi.error': { code: 'TableLimit', message: 'More than the allowed rows.' },
27+
},
2228
rows: [{ 'Sales[Amount]': 0, '[Blank]': null }],
2329
},
2430
],
@@ -103,12 +109,21 @@ describe('Power BI DAX result handling', () => {
103109
})
104110
})
105111

106-
it('keeps nested Microsoft error details when the direct message is absent', async () => {
112+
it.each(['direct', 'wrapped'])('normalizes %s Microsoft error diagnostics', async (kind) => {
113+
const details =
114+
kind === 'direct'
115+
? { diagnostic: 'DAX query failure' }
116+
: [
117+
{ code: 'AnalysisServicesErrorCode', detail: { type: 1, value: '3238920194' } },
118+
{ code: 'DetailsMessage', detail: { type: 1, value: 'The DAX query is invalid.' } },
119+
]
107120
const result = await powerbiExecuteQueryTool.transformResponse!(
108121
jsonResponse({
109122
error: {
110123
code: 'DatasetExecuteQueriesError',
111-
details: { diagnostic: 'DAX query failure' },
124+
...(kind === 'direct'
125+
? { details }
126+
: { 'pbi.error': { code: 'DatasetExecuteQueriesError', details } }),
112127
},
113128
}),
114129
params
@@ -118,10 +133,13 @@ describe('Power BI DAX result handling', () => {
118133
{
119134
scope: 'response',
120135
code: 'DatasetExecuteQueriesError',
121-
message: null,
122-
details: { diagnostic: 'DAX query failure' },
136+
message: kind === 'direct' ? null : 'The DAX query is invalid.',
137+
details,
123138
},
124139
])
140+
expect(result.error).toBe(
141+
kind === 'direct' ? 'DatasetExecuteQueriesError' : 'The DAX query is invalid.'
142+
)
125143
})
126144

127145
it.each(['declared', 'streamed'])(

‎apps/sim/tools/powerbi/utils.ts‎

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,10 +175,27 @@ export function appendPowerBIQueryError(
175175
): void {
176176
if (value === undefined || value === null) return
177177
const error = powerBIRecord(value, 'query error')
178+
const diagnostic = isRecordLike(error['pbi.error']) ? error['pbi.error'] : null
179+
const details = error.details ?? diagnostic?.details ?? null
180+
let message = toStringOrNull(error.message) ?? toStringOrNull(diagnostic?.message)
181+
if (message === null && Array.isArray(details)) {
182+
for (const entry of details) {
183+
if (
184+
isRecordLike(entry) &&
185+
entry.code === 'DetailsMessage' &&
186+
isRecordLike(entry.detail) &&
187+
typeof entry.detail.value === 'string' &&
188+
entry.detail.value.trim()
189+
) {
190+
message = entry.detail.value
191+
break
192+
}
193+
}
194+
}
178195
errors.push({
179196
scope,
180-
code: toStringOrNull(error.code),
181-
message: toStringOrNull(error.message),
182-
details: error.details ?? null,
197+
code: toStringOrNull(error.code) ?? toStringOrNull(diagnostic?.code),
198+
message,
199+
details,
183200
})
184201
}

0 commit comments

Comments
 (0)