mirror of
https://github.com/umami-software/umami.git
synced 2026-02-07 14:17:13 +01:00
Refactor part 2: Electric Boogaloo. Standardize way of passing filter parameters.
This commit is contained in:
parent
f26f1b0581
commit
cdf391d5c2
90 changed files with 867 additions and 709 deletions
|
|
@ -17,7 +17,7 @@ async function relationalQuery(
|
|||
filters: QueryFilters & { propertyName?: string },
|
||||
) {
|
||||
const { rawQuery, parseFilters } = prisma;
|
||||
const { filterQuery, queryParams } = await parseFilters(filters, {
|
||||
const { filterQuery, queryParams } = parseFilters(filters, {
|
||||
columns: { propertyName: 'data_key' },
|
||||
});
|
||||
|
||||
|
|
@ -45,7 +45,7 @@ async function clickhouseQuery(
|
|||
filters: QueryFilters & { propertyName?: string },
|
||||
): Promise<{ propertyName: string; total: number }[]> {
|
||||
const { rawQuery, parseFilters } = clickhouse;
|
||||
const { filterQuery, queryParams } = await parseFilters(filters, {
|
||||
const { filterQuery, queryParams } = parseFilters(filters, {
|
||||
columns: { propertyName: 'data_key' },
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ async function relationalQuery(
|
|||
filters: QueryFilters & { propertyName?: string },
|
||||
) {
|
||||
const { rawQuery, parseFilters, getDateSQL } = prisma;
|
||||
const { filterQuery, queryParams } = await parseFilters(filters);
|
||||
const { filterQuery, queryParams } = parseFilters(filters);
|
||||
|
||||
return rawQuery(
|
||||
`
|
||||
|
|
@ -48,7 +48,7 @@ async function clickhouseQuery(
|
|||
filters: QueryFilters & { propertyName?: string },
|
||||
): Promise<{ propertyName: string; dataType: number; propertyValue: string; total: number }[]> {
|
||||
const { rawQuery, parseFilters } = clickhouse;
|
||||
const { filterQuery, queryParams } = await parseFilters(filters);
|
||||
const { filterQuery, queryParams } = parseFilters(filters);
|
||||
|
||||
return rawQuery(
|
||||
`
|
||||
|
|
|
|||
|
|
@ -4,14 +4,14 @@ import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db';
|
|||
import prisma from '@/lib/prisma';
|
||||
import { QueryFilters } from '@/lib/types';
|
||||
|
||||
export interface SessionMetricsParameters {
|
||||
type: string;
|
||||
limit: number | string;
|
||||
offset: number | string;
|
||||
}
|
||||
|
||||
export async function getSessionMetrics(
|
||||
...args: [
|
||||
websiteId: string,
|
||||
type: string,
|
||||
filters: QueryFilters,
|
||||
limit?: number | string,
|
||||
offset?: number | string,
|
||||
]
|
||||
...args: [websiteId: string, parameters: SessionMetricsParameters, filters: QueryFilters]
|
||||
) {
|
||||
return runQuery({
|
||||
[PRISMA]: () => relationalQuery(...args),
|
||||
|
|
@ -21,16 +21,16 @@ export async function getSessionMetrics(
|
|||
|
||||
async function relationalQuery(
|
||||
websiteId: string,
|
||||
type: string,
|
||||
parameters: SessionMetricsParameters,
|
||||
filters: QueryFilters,
|
||||
limit: number | string = 500,
|
||||
offset: number | string = 0,
|
||||
) {
|
||||
const { type, limit = 500, offset = 0 } = parameters;
|
||||
const column = FILTER_COLUMNS[type] || type;
|
||||
const { parseFilters, rawQuery } = prisma;
|
||||
const { filterQuery, joinSessionQuery, queryParams } = await parseFilters(
|
||||
const { filterQuery, joinSessionQuery, queryParams } = parseFilters(
|
||||
{
|
||||
...filters,
|
||||
websiteId,
|
||||
eventType: EVENT_TYPE.pageView,
|
||||
},
|
||||
{
|
||||
|
|
@ -57,21 +57,21 @@ async function relationalQuery(
|
|||
limit ${limit}
|
||||
offset ${offset}
|
||||
`,
|
||||
queryParams,
|
||||
{ ...queryParams, ...parameters },
|
||||
);
|
||||
}
|
||||
|
||||
async function clickhouseQuery(
|
||||
websiteId: string,
|
||||
type: string,
|
||||
parameters: SessionMetricsParameters,
|
||||
filters: QueryFilters,
|
||||
limit: number | string = 500,
|
||||
offset: number | string = 0,
|
||||
): Promise<{ x: string; y: number }[]> {
|
||||
const { type, limit = 500, offset = 0 } = parameters;
|
||||
const column = FILTER_COLUMNS[type] || type;
|
||||
const { parseFilters, rawQuery } = clickhouse;
|
||||
const { filterQuery, queryParams } = await parseFilters({
|
||||
const { filterQuery, queryParams } = parseFilters({
|
||||
...filters,
|
||||
websiteId,
|
||||
eventType: EVENT_TYPE.pageView,
|
||||
});
|
||||
const includeCountry = column === 'city' || column === 'region';
|
||||
|
|
@ -114,5 +114,5 @@ async function clickhouseQuery(
|
|||
`;
|
||||
}
|
||||
|
||||
return rawQuery(sql, queryParams);
|
||||
return rawQuery(sql, { ...queryParams, ...parameters });
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,8 +14,9 @@ export async function getSessionStats(...args: [websiteId: string, filters: Quer
|
|||
async function relationalQuery(websiteId: string, filters: QueryFilters) {
|
||||
const { timezone = 'utc', unit = 'day' } = filters;
|
||||
const { getDateSQL, parseFilters, rawQuery } = prisma;
|
||||
const { filterQuery, joinSessionQuery, queryParams } = await parseFilters({
|
||||
const { filterQuery, joinSessionQuery, queryParams } = parseFilters({
|
||||
...filters,
|
||||
websiteId,
|
||||
eventType: EVENT_TYPE.pageView,
|
||||
});
|
||||
|
||||
|
|
@ -43,8 +44,9 @@ async function clickhouseQuery(
|
|||
): Promise<{ x: string; y: number }[]> {
|
||||
const { timezone = 'utc', unit = 'day' } = filters;
|
||||
const { parseFilters, rawQuery, getDateSQL } = clickhouse;
|
||||
const { filterQuery, queryParams } = await parseFilters({
|
||||
const { filterQuery, queryParams } = parseFilters({
|
||||
...filters,
|
||||
websiteId,
|
||||
eventType: EVENT_TYPE.pageView,
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ async function relationalQuery(
|
|||
filters: QueryFilters,
|
||||
): Promise<WebsiteSessionStatsData[]> {
|
||||
const { parseFilters, rawQuery } = prisma;
|
||||
const { filterQuery, queryParams } = await parseFilters(filters);
|
||||
const { filterQuery, queryParams } = parseFilters({ ...filters, websiteId });
|
||||
|
||||
return rawQuery(
|
||||
`
|
||||
|
|
@ -50,7 +50,7 @@ async function clickhouseQuery(
|
|||
filters: QueryFilters,
|
||||
): Promise<WebsiteSessionStatsData[]> {
|
||||
const { rawQuery, parseFilters } = clickhouse;
|
||||
const { filterQuery, queryParams } = await parseFilters(filters);
|
||||
const { filterQuery, queryParams } = parseFilters({ ...filters, websiteId });
|
||||
|
||||
return rawQuery(
|
||||
`
|
||||
|
|
|
|||
|
|
@ -12,7 +12,14 @@ export async function getWebsiteSessions(...args: [websiteId: string, filters: Q
|
|||
|
||||
async function relationalQuery(websiteId: string, filters: QueryFilters) {
|
||||
const { pagedRawQuery, parseFilters } = prisma;
|
||||
const { filterQuery, dateQuery, queryParams } = await parseFilters(filters);
|
||||
const { search } = filters;
|
||||
const { filterQuery, dateQuery, queryParams } = parseFilters({
|
||||
...filters,
|
||||
websiteId,
|
||||
search: search ? `%${search}%` : undefined,
|
||||
});
|
||||
|
||||
const searchQuery = search ? `and session.distinct_id ilike {{search}}` : '';
|
||||
|
||||
return pagedRawQuery(
|
||||
`
|
||||
|
|
@ -38,6 +45,7 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
|
|||
where website_event.website_id = {{websiteId::uuid}}
|
||||
${dateQuery}
|
||||
${filterQuery}
|
||||
${searchQuery}
|
||||
group by session.session_id,
|
||||
session.website_id,
|
||||
website_event.hostname,
|
||||
|
|
@ -58,7 +66,13 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
|
|||
|
||||
async function clickhouseQuery(websiteId: string, filters: QueryFilters) {
|
||||
const { pagedRawQuery, parseFilters, getDateStringSQL } = clickhouse;
|
||||
const { filterQuery, dateQuery, queryParams } = await parseFilters(filters);
|
||||
const { search } = filters;
|
||||
const { filterQuery, dateQuery, queryParams } = parseFilters({
|
||||
...filters,
|
||||
websiteId,
|
||||
});
|
||||
|
||||
const searchQuery = search ? `and positionCaseInsensitive(distinct_id, {search:String}) > 0` : '';
|
||||
|
||||
return pagedRawQuery(
|
||||
`
|
||||
|
|
@ -83,6 +97,7 @@ async function clickhouseQuery(websiteId: string, filters: QueryFilters) {
|
|||
where website_id = {websiteId:UUID}
|
||||
${dateQuery}
|
||||
${filterQuery}
|
||||
${searchQuery}
|
||||
group by session_id, website_id, hostname, browser, os, device, screen, language, country, region, city
|
||||
order by lastAt desc
|
||||
`,
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ export async function getWebsiteSessionsWeekly(
|
|||
async function relationalQuery(websiteId: string, filters: QueryFilters) {
|
||||
const { timezone = 'utc' } = filters;
|
||||
const { rawQuery, getDateWeeklySQL, parseFilters } = prisma;
|
||||
const { queryParams } = await parseFilters(filters);
|
||||
const { queryParams } = parseFilters(filters);
|
||||
|
||||
return rawQuery(
|
||||
`
|
||||
|
|
@ -35,7 +35,7 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
|
|||
async function clickhouseQuery(websiteId: string, filters: QueryFilters) {
|
||||
const { timezone = 'utc' } = filters;
|
||||
const { rawQuery, parseFilters } = clickhouse;
|
||||
const { queryParams } = await parseFilters(filters);
|
||||
const { queryParams } = parseFilters(filters);
|
||||
|
||||
return rawQuery(
|
||||
`
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue