Skip to content

Commit 37b0640

Browse files
committed
refactor: reduce intro of raw and sql from prisma
1 parent b8fa898 commit 37b0640

File tree

5 files changed

+100
-92
lines changed

5 files changed

+100
-92
lines changed

src/server/model/insights/aiGateway.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import { FilterInfoType, FilterInfoValue } from '@tianji/shared';
55
import { InsightsSqlBuilder } from './shared.js';
66
import { processGroupedTimeSeriesData } from './utils.js';
77

8+
const { sql, raw } = Prisma;
9+
810
export class AIGatewayInsightsSqlBuilder extends InsightsSqlBuilder {
911
getTableName() {
1012
return 'AIGatewayLogs';
@@ -15,18 +17,18 @@ export class AIGatewayInsightsSqlBuilder extends InsightsSqlBuilder {
1517
return metrics.map((item) => {
1618
if (item.math === 'events') {
1719
if (item.name === '$all_event') {
18-
return Prisma.sql`count(1) as "$all_event"`;
20+
return sql`count(1) as "$all_event"`;
1921
}
2022

2123
// For standard fields, directly count
2224
// TODO: maybe use other math functions
2325
if (['inputToken', 'outputToken', 'price'].includes(item.name)) {
24-
return Prisma.sql`sum("AIGatewayLogs"."${Prisma.raw(item.name)}") as ${Prisma.raw(`"${item.name}"`)}`;
26+
return sql`sum("AIGatewayLogs"."${raw(item.name)}") as ${raw(`"${item.name}"`)}`;
2527
}
2628
} else if (item.math === 'sessions') {
2729
// AIGatewayLogs has no concept of sessions, but can be grouped by gatewayId
2830
if (item.name === '$all_event') {
29-
return Prisma.sql`count(distinct "gatewayId") as "$all_event"`;
31+
return sql`count(distinct "gatewayId") as "$all_event"`;
3032
}
3133
}
3234

@@ -40,7 +42,7 @@ export class AIGatewayInsightsSqlBuilder extends InsightsSqlBuilder {
4042

4143
return [
4244
// gatewayId
43-
Prisma.sql`"AIGatewayLogs"."gatewayId" = ${insightId}`,
45+
sql`"AIGatewayLogs"."gatewayId" = ${insightId}`,
4446

4547
// date range
4648
this.buildDateRangeQuery('"AIGatewayLogs"."createdAt"', startAt, endAt),
@@ -76,7 +78,7 @@ export class AIGatewayInsightsSqlBuilder extends InsightsSqlBuilder {
7678
'price',
7779
].includes(name)
7880
) {
79-
const valueField = Prisma.sql`"AIGatewayLogs"."${Prisma.raw(name)}"${type === 'number' ? Prisma.empty : type === 'boolean' ? Prisma.empty : Prisma.empty}`;
81+
const valueField = sql`"AIGatewayLogs"."${raw(name)}"${type === 'number' ? Prisma.empty : type === 'boolean' ? Prisma.empty : Prisma.empty}`;
8082
return this.buildCommonFilterQueryOperator(
8183
type,
8284
operator,
@@ -87,7 +89,7 @@ export class AIGatewayInsightsSqlBuilder extends InsightsSqlBuilder {
8789
// Process JSON fields
8890
else if (name.startsWith('request.')) {
8991
const field = name.replace('request.', '');
90-
const valueField = Prisma.sql`("AIGatewayLogs"."requestPayload"->> '${field}')${type === 'number' ? Prisma.raw('::int') : type === 'boolean' ? Prisma.raw('::boolean') : Prisma.empty}`;
92+
const valueField = sql`("AIGatewayLogs"."requestPayload"->> '${field}')${type === 'number' ? raw('::int') : type === 'boolean' ? raw('::boolean') : Prisma.empty}`;
9193
return this.buildCommonFilterQueryOperator(
9294
type,
9395
operator,
@@ -96,7 +98,7 @@ export class AIGatewayInsightsSqlBuilder extends InsightsSqlBuilder {
9698
);
9799
} else if (name.startsWith('response.')) {
98100
const field = name.replace('response.', '');
99-
const valueField = Prisma.sql`("AIGatewayLogs"."responsePayload"->> '${field}')${type === 'number' ? Prisma.raw('::int') : type === 'boolean' ? Prisma.raw('::boolean') : Prisma.empty}`;
101+
const valueField = sql`("AIGatewayLogs"."responsePayload"->> '${field}')${type === 'number' ? raw('::int') : type === 'boolean' ? raw('::boolean') : Prisma.empty}`;
100102
return this.buildCommonFilterQueryOperator(
101103
type,
102104
operator,
@@ -105,7 +107,7 @@ export class AIGatewayInsightsSqlBuilder extends InsightsSqlBuilder {
105107
);
106108
}
107109

108-
return Prisma.sql`1 = 1`;
110+
return sql`1 = 1`;
109111
}
110112
}
111113

src/server/model/insights/survey.ts

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import {
88
processGroupedTimeSeriesData,
99
} from './utils.js';
1010

11+
const { sql, raw } = Prisma;
12+
1113
export class SurveyInsightsSqlBuilder extends InsightsSqlBuilder {
1214
getTableName() {
1315
return 'SurveyResult';
@@ -18,24 +20,24 @@ export class SurveyInsightsSqlBuilder extends InsightsSqlBuilder {
1820
return metrics.map((item) => {
1921
if (item.math === 'events') {
2022
if (item.name === '$all_event') {
21-
return Prisma.sql`count(1) as "$all_event"`;
23+
return sql`count(1) as "$all_event"`;
2224
}
2325

2426
if (insightsSurveyBuiltinFields.includes(item.name)) {
25-
return Prisma.sql`sum(case WHEN "SurveyResult"."${Prisma.raw(item.name)}" IS NOT NULL AND "SurveyResult"."${Prisma.raw(item.name)}" <> '' THEN 1 ELSE 0 END) as ${Prisma.raw(`"${item.name}"`)}`;
27+
return sql`sum(case WHEN "SurveyResult"."${raw(item.name)}" IS NOT NULL AND "SurveyResult"."${raw(item.name)}" <> '' THEN 1 ELSE 0 END) as ${raw(`"${item.name}"`)}`;
2628
}
2729

28-
return Prisma.sql`sum(case WHEN "SurveyResult"."payload"->>'${item.name}' IS NOT NULL AND "SurveyResult"."payload"->>'${item.name}' <> '' THEN 1 ELSE 0 END) as ${Prisma.raw(`"${item.name}"`)}`;
30+
return sql`sum(case WHEN "SurveyResult"."payload"->>'${item.name}' IS NOT NULL AND "SurveyResult"."payload"->>'${item.name}' <> '' THEN 1 ELSE 0 END) as ${raw(`"${item.name}"`)}`;
2931
} else if (item.math === 'sessions') {
3032
if (item.name === '$all_event') {
31-
return Prisma.sql`count(distinct "sessionId") as "$all_event"`;
33+
return sql`count(distinct "sessionId") as "$all_event"`;
3234
}
3335

3436
if (insightsSurveyBuiltinFields.includes(item.name)) {
35-
return Prisma.sql`count(distinct case WHEN "SurveyResult"."${Prisma.raw(item.name)}" IS NOT NULL AND "SurveyResult"."${Prisma.raw(item.name)}" <> '' THEN "sessionId" ELSE 0 END) as ${Prisma.raw(`"${item.name}"`)}`;
37+
return sql`count(distinct case WHEN "SurveyResult"."${raw(item.name)}" IS NOT NULL AND "SurveyResult"."${raw(item.name)}" <> '' THEN "sessionId" ELSE 0 END) as ${raw(`"${item.name}"`)}`;
3638
}
3739

38-
return Prisma.sql`count(distinct case WHEN "SurveyResult"."payload"->>'${item.name}' IS NOT NULL AND "SurveyResult"."payload"->>'${item.name}' <> '' THEN "sessionId" ELSE 0 END) as ${Prisma.raw(`"${item.name}"`)}`;
40+
return sql`count(distinct case WHEN "SurveyResult"."payload"->>'${item.name}' IS NOT NULL AND "SurveyResult"."payload"->>'${item.name}' <> '' THEN "sessionId" ELSE 0 END) as ${raw(`"${item.name}"`)}`;
3941
}
4042

4143
return null;
@@ -50,22 +52,22 @@ export class SurveyInsightsSqlBuilder extends InsightsSqlBuilder {
5052
if (!g.customGroups) {
5153
if (insightsSurveyBuiltinFields.includes(g.value)) {
5254
groupSelectQueryArr.push(
53-
Prisma.sql`"SurveyResult"."${Prisma.raw(g.value)}" as "%${Prisma.raw(g.value)}"`
55+
sql`"SurveyResult"."${raw(g.value)}" as "%${raw(g.value)}"`
5456
);
5557
} else {
5658
groupSelectQueryArr.push(
57-
Prisma.sql`"SurveyResult"."payload" ->> ${g.value} as "%${Prisma.raw(g.value)}"`
59+
sql`"SurveyResult"."payload" ->> ${g.value} as "%${raw(g.value)}"`
5860
);
5961
}
6062
} else if (g.customGroups && g.customGroups.length > 0) {
6163
for (const cg of g.customGroups) {
6264
groupSelectQueryArr.push(
63-
Prisma.sql`${this.buildFilterQueryOperator(
65+
sql`${this.buildFilterQueryOperator(
6466
g.value,
6567
g.type,
6668
cg.filterOperator,
6769
cg.filterValue
68-
)} as "%${Prisma.raw(`${g.value}|${cg.filterOperator}|${cg.filterValue}`)}"`
70+
)} as "%${raw(`${g.value}|${cg.filterOperator}|${cg.filterValue}`)}"`
6971
);
7072
}
7173
}
@@ -80,7 +82,7 @@ export class SurveyInsightsSqlBuilder extends InsightsSqlBuilder {
8082

8183
return [
8284
// survey id
83-
Prisma.sql`"SurveyResult"."surveyId" = ${insightId}`,
85+
sql`"SurveyResult"."surveyId" = ${insightId}`,
8486

8587
// date
8688
this.buildDateRangeQuery('"SurveyResult"."createdAt"', startAt, endAt),
@@ -107,11 +109,11 @@ export class SurveyInsightsSqlBuilder extends InsightsSqlBuilder {
107109
type,
108110
operator,
109111
value,
110-
Prisma.sql`"SurveyResult"."${Prisma.raw(name)}"` // this is safe because the name is defined in the `insightsSurveyBuiltinFields`
112+
sql`"SurveyResult"."${raw(name)}"` // this is safe because the name is defined in the `insightsSurveyBuiltinFields`
111113
);
112114
}
113115

114-
const valueField = Prisma.sql`("SurveyResult"."payload"->> ${name})${type === 'number' ? Prisma.raw('::int') : type === 'boolean' ? Prisma.raw('::boolean') : Prisma.empty}`;
116+
const valueField = sql`("SurveyResult"."payload"->> ${name})${type === 'number' ? raw('::int') : type === 'boolean' ? raw('::boolean') : Prisma.empty}`;
115117
return this.buildCommonFilterQueryOperator(
116118
type,
117119
operator,

src/server/model/insights/warehouse/longTable.ts

Lines changed: 32 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import {
1818
WarehouseLongTableInsightsApplication,
1919
} from './utils.js';
2020

21+
const { sql, raw } = Prisma;
22+
2123
export class WarehouseLongTableInsightsSqlBuilder extends InsightsSqlBuilder {
2224
getApplication(): WarehouseLongTableInsightsApplication {
2325
const name = this.query.insightId;
@@ -61,12 +63,12 @@ export class WarehouseLongTableInsightsSqlBuilder extends InsightsSqlBuilder {
6163

6264
const valueField =
6365
type === 'number'
64-
? Prisma.sql`"${Prisma.raw(eventParametersTable.name)}"."${Prisma.raw(eventParametersTable.paramsValueNumberField ?? eventParametersTable.paramsValueField)}"`
66+
? sql`"${raw(eventParametersTable.name)}"."${raw(eventParametersTable.paramsValueNumberField ?? eventParametersTable.paramsValueField)}"`
6567
: type === 'string'
66-
? Prisma.sql`"${Prisma.raw(eventParametersTable.name)}"."${Prisma.raw(eventParametersTable.paramsValueStringField ?? eventParametersTable.paramsValueField)}"`
68+
? sql`"${raw(eventParametersTable.name)}"."${raw(eventParametersTable.paramsValueStringField ?? eventParametersTable.paramsValueField)}"`
6769
: type === 'date'
68-
? Prisma.sql`"${Prisma.raw(eventParametersTable.name)}"."${Prisma.raw(eventParametersTable.paramsValueDateField ?? eventParametersTable.paramsValueField)}"`
69-
: Prisma.sql`"${Prisma.raw(eventParametersTable.name)}"."${Prisma.raw(eventParametersTable.paramsValueField)}"`;
70+
? sql`"${raw(eventParametersTable.name)}"."${raw(eventParametersTable.paramsValueDateField ?? eventParametersTable.paramsValueField)}"`
71+
: sql`"${raw(eventParametersTable.name)}"."${raw(eventParametersTable.paramsValueField)}"`;
7072

7173
return valueField;
7274
}
@@ -103,27 +105,27 @@ export class WarehouseLongTableInsightsSqlBuilder extends InsightsSqlBuilder {
103105
switch (type) {
104106
case 'timestamp':
105107
// Unix timestamp in seconds - convert to datetime first
106-
timeExpression = Prisma.sql`FROM_UNIXTIME(${Prisma.raw(field)})`;
108+
timeExpression = sql`FROM_UNIXTIME(${raw(field)})`;
107109
break;
108110
case 'timestampMs':
109111
// Unix timestamp in milliseconds - convert to seconds first, then to datetime
110-
timeExpression = Prisma.sql`FROM_UNIXTIME(${Prisma.raw(field)} / 1000)`;
112+
timeExpression = sql`FROM_UNIXTIME(${raw(field)} / 1000)`;
111113
break;
112114
case 'date':
113115
// Date string format (YYYY-MM-DD) - convert to datetime
114-
timeExpression = Prisma.sql`STR_TO_DATE(${Prisma.raw(field)}, '%Y-%m-%d')`;
116+
timeExpression = sql`STR_TO_DATE(${raw(field)}, '%Y-%m-%d')`;
115117
break;
116118
case 'datetime':
117119
// Datetime string format (YYYY-MM-DD HH:MM:SS) - use directly
118-
timeExpression = Prisma.sql`STR_TO_DATE(${Prisma.raw(field)}, '%Y-%m-%d %H:%i:%s')`;
120+
timeExpression = sql`STR_TO_DATE(${raw(field)}, '%Y-%m-%d %H:%i:%s')`;
119121
break;
120122
default:
121123
// Default to timestampMs for backwards compatibility
122-
timeExpression = Prisma.sql`FROM_UNIXTIME(${Prisma.raw(field)} / 1000)`;
124+
timeExpression = sql`FROM_UNIXTIME(${raw(field)} / 1000)`;
123125
break;
124126
}
125127

126-
return Prisma.sql`DATE_FORMAT(CONVERT_TZ(${timeExpression}, '+00:00', ${timezone}), '${Prisma.raw(format)}')`;
128+
return sql`DATE_FORMAT(CONVERT_TZ(${timeExpression}, '+00:00', ${timezone}), '${raw(format)}')`;
127129
}
128130

129131
protected buildOptimizedDateRangeQuery(): Prisma.Sql {
@@ -166,7 +168,7 @@ export class WarehouseLongTableInsightsSqlBuilder extends InsightsSqlBuilder {
166168
}
167169
}
168170

169-
return Prisma.sql`${Prisma.raw(field)} BETWEEN ${startTime} AND ${endTime}`;
171+
return sql`${raw(field)} BETWEEN ${startTime} AND ${endTime}`;
170172
}
171173

172174
protected getOptimizedDateQuery(): Prisma.Sql {
@@ -195,27 +197,27 @@ export class WarehouseLongTableInsightsSqlBuilder extends InsightsSqlBuilder {
195197
switch (type) {
196198
case 'timestamp':
197199
// Unix timestamp in seconds - convert to datetime first
198-
timeExpression = Prisma.sql`FROM_UNIXTIME(${Prisma.raw(field)})`;
200+
timeExpression = sql`FROM_UNIXTIME(${raw(field)})`;
199201
break;
200202
case 'timestampMs':
201203
// Unix timestamp in milliseconds - convert to seconds first, then to datetime
202-
timeExpression = Prisma.sql`FROM_UNIXTIME(${Prisma.raw(field)} / 1000)`;
204+
timeExpression = sql`FROM_UNIXTIME(${raw(field)} / 1000)`;
203205
break;
204206
case 'date':
205207
// Date string format (YYYY-MM-DD) - convert to datetime
206-
timeExpression = Prisma.sql`STR_TO_DATE(${Prisma.raw(field)}, '%Y-%m-%d')`;
208+
timeExpression = sql`STR_TO_DATE(${raw(field)}, '%Y-%m-%d')`;
207209
break;
208210
case 'datetime':
209211
// Datetime string format (YYYY-MM-DD HH:MM:SS) - use directly
210-
timeExpression = Prisma.sql`STR_TO_DATE(${Prisma.raw(field)}, '%Y-%m-%d %H:%i:%s')`;
212+
timeExpression = sql`STR_TO_DATE(${raw(field)}, '%Y-%m-%d %H:%i:%s')`;
211213
break;
212214
default:
213215
// Default to timestampMs for backwards compatibility
214-
timeExpression = Prisma.sql`FROM_UNIXTIME(${Prisma.raw(field)} / 1000)`;
216+
timeExpression = sql`FROM_UNIXTIME(${raw(field)} / 1000)`;
215217
break;
216218
}
217219

218-
return Prisma.sql`DATE_FORMAT(CONVERT_TZ(${timeExpression}, '+00:00', ${timezone}), '${Prisma.raw(format)}')`;
220+
return sql`DATE_FORMAT(CONVERT_TZ(${timeExpression}, '+00:00', ${timezone}), '${raw(format)}')`;
219221
}
220222

221223
protected buildOptimizedDateQuerySql(): Prisma.Sql {
@@ -231,9 +233,9 @@ export class WarehouseLongTableInsightsSqlBuilder extends InsightsSqlBuilder {
231233
const format =
232234
MYSQL_DATE_FORMATS[unit as keyof typeof MYSQL_DATE_FORMATS];
233235

234-
return Prisma.sql`DATE_FORMAT(${Prisma.raw(field)}, '${Prisma.raw(format)}') date`;
236+
return sql`DATE_FORMAT(${raw(field)}, '${raw(format)}') date`;
235237
} else {
236-
return Prisma.sql`${this.getDateQuery(
238+
return sql`${this.getDateQuery(
237239
`"${eventTable.name}"."${eventTable.createdAtField}"`,
238240
unit,
239241
timezone,
@@ -253,10 +255,10 @@ export class WarehouseLongTableInsightsSqlBuilder extends InsightsSqlBuilder {
253255
return metrics.map((item) => {
254256
if (item.math === 'events') {
255257
if (item.name === '$all_event') {
256-
return Prisma.sql`count(1) as "$all_event"`;
258+
return sql`count(1) as "$all_event"`;
257259
}
258260

259-
return Prisma.sql`sum(case WHEN "${Prisma.raw(eventTable.name)}"."${Prisma.raw(eventTable.eventNameField)}" = ${item.name} THEN 1 ELSE 0 END) as ${Prisma.raw(`"${item.name}"`)}`;
261+
return sql`sum(case WHEN "${raw(eventTable.name)}"."${raw(eventTable.eventNameField)}" = ${item.name} THEN 1 ELSE 0 END) as ${raw(`"${item.name}"`)}`;
260262
}
261263

262264
return null;
@@ -270,16 +272,16 @@ export class WarehouseLongTableInsightsSqlBuilder extends InsightsSqlBuilder {
270272
for (const g of groups) {
271273
if (!g.customGroups) {
272274
groupSelectQueryArr.push(
273-
Prisma.sql`${this.getValueField(g.type)} as "%${Prisma.raw(g.value)}"`
275+
sql`${this.getValueField(g.type)} as "%${raw(g.value)}"`
274276
);
275277
} else if (g.customGroups && g.customGroups.length > 0) {
276278
for (const cg of g.customGroups) {
277279
groupSelectQueryArr.push(
278-
Prisma.sql`${this.buildFilterQueryOperator(
280+
sql`${this.buildFilterQueryOperator(
279281
g.type,
280282
cg.filterOperator,
281283
cg.filterValue
282-
)} as "%${Prisma.raw(`${g.value}|${cg.filterOperator}|${cg.filterValue}`)}"`
284+
)} as "%${raw(`${g.value}|${cg.filterOperator}|${cg.filterValue}`)}"`
283285
);
284286
}
285287
}
@@ -295,10 +297,10 @@ export class WarehouseLongTableInsightsSqlBuilder extends InsightsSqlBuilder {
295297

296298
let innerJoinQuery = Prisma.empty;
297299
if (filters.length > 0 || groups.length > 0) {
298-
innerJoinQuery = Prisma.sql`INNER JOIN "${Prisma.raw(eventParametersTable.name)}" ON "${Prisma.raw(eventTable.name)}"."${Prisma.raw(eventTable.eventNameField)}" = "${Prisma.raw(eventParametersTable.name)}"."${Prisma.raw(eventParametersTable.eventNameField)}"`;
300+
innerJoinQuery = sql`INNER JOIN "${raw(eventParametersTable.name)}" ON "${raw(eventTable.name)}"."${raw(eventTable.eventNameField)}" = "${raw(eventParametersTable.name)}"."${raw(eventParametersTable.eventNameField)}"`;
299301

300302
if (filters.length > 0) {
301-
innerJoinQuery = Prisma.sql`${innerJoinQuery} AND ${Prisma.join(
303+
innerJoinQuery = sql`${innerJoinQuery} AND ${Prisma.join(
302304
filters.map((filter) =>
303305
this.buildFilterQueryOperator(
304306
filter.type,
@@ -313,9 +315,9 @@ export class WarehouseLongTableInsightsSqlBuilder extends InsightsSqlBuilder {
313315
if (groups.length > 0) {
314316
const groupConditions = groups.map(
315317
(g) =>
316-
Prisma.sql`"${Prisma.raw(eventParametersTable.name)}"."${Prisma.raw(eventParametersTable.eventNameField)}" = ${g.value}`
318+
sql`"${raw(eventParametersTable.name)}"."${raw(eventParametersTable.eventNameField)}" = ${g.value}`
317319
);
318-
innerJoinQuery = Prisma.sql`${innerJoinQuery} AND ${Prisma.join(
320+
innerJoinQuery = sql`${innerJoinQuery} AND ${Prisma.join(
319321
groupConditions,
320322
' OR '
321323
)}`;
@@ -337,10 +339,10 @@ export class WarehouseLongTableInsightsSqlBuilder extends InsightsSqlBuilder {
337339
Prisma.join(
338340
metrics.map((item) => {
339341
if (item.name === '$all_event') {
340-
return Prisma.sql`1 = 1`;
342+
return sql`1 = 1`;
341343
}
342344

343-
return Prisma.sql`"${Prisma.raw(eventTable.name)}"."${Prisma.raw(eventTable.eventNameField)}" = ${item.name}`;
345+
return sql`"${raw(eventTable.name)}"."${raw(eventTable.eventNameField)}" = ${item.name}`;
344346
}),
345347
' OR ',
346348
'(',

0 commit comments

Comments
 (0)