Merge branch 'dev' into brian/um-16-clickhouse-support

This commit is contained in:
Brian Cao 2022-07-22 17:03:42 -07:00
commit 304314fff0
114 changed files with 1474 additions and 1019 deletions

View file

@ -1,12 +1,11 @@
import { CLICKHOUSE, RELATIONAL } from 'lib/constants';
import {
rawQueryClickhouse,
getBetweenDatesClickhouse,
getDateQuery,
getDateQueryClickhouse,
getDateStringQuery,
getFilterQuery,
rawQuery,
rawQueryClickhouse,
runAnalyticsQuery,
} from 'lib/db';
@ -31,7 +30,7 @@ async function relationalQuery(
`
select
event_value x,
${getDateStringQuery(getDateQuery('created_at', unit, timezone), unit)} t,
${getDateQuery('created_at', unit, timezone)} t,
count(*) y
from event
where website_id=$1

View file

@ -14,24 +14,25 @@ export async function getPageviewMetrics(...args) {
});
}
async function relationalQuery(website_id, start_at, end_at, field, table, filters = {}) {
async function relationalQuery(website_id, start_at, end_at, column, table, filters = {}) {
const params = [website_id, start_at, end_at];
const { pageviewQuery, sessionQuery, eventQuery, joinSession } = parseFilters(
table,
column,
filters,
params,
);
return rawQuery(
`
select ${field} x, count(*) y
select ${column} x, count(*) y
from ${table}
${joinSession}
where ${table}.website_id=$1
and ${table}.created_at between $2 and $3
${pageviewQuery}
${joinSession && sessionQuery}
${eventQuery}
and ${table}.created_at between $2 and $3
${pageviewQuery}
${joinSession && sessionQuery}
${eventQuery}
group by 1
order by 2 desc
`,
@ -39,10 +40,11 @@ async function relationalQuery(website_id, start_at, end_at, field, table, filte
);
}
async function clickhouseQuery(website_id, start_at, end_at, field, table, filters = {}) {
async function clickhouseQuery(website_id, start_at, end_at, column, table, filters = {}) {
const params = [website_id];
const { pageviewQuery, sessionQuery, eventQuery, joinSession } = parseFilters(
table,
column,
filters,
params,
'session_uuid',
@ -50,7 +52,7 @@ async function clickhouseQuery(website_id, start_at, end_at, field, table, filte
return rawQueryClickhouse(
`
select ${field} x, count(*) y
select ${column} x, count(*) y
from ${table}
${joinSession}
where ${table}.website_id= $1

View file

@ -0,0 +1,45 @@
import { getDatabase, parseFilters, rawQuery } from 'lib/db';
import { MYSQL, POSTGRESQL } from 'lib/constants';
export function getPageviewParams(
param,
website_id,
start_at,
end_at,
column,
table,
filters = {},
) {
const params = [param, website_id, start_at, end_at];
const { pageviewQuery, sessionQuery, eventQuery, joinSession } = parseFilters(
table,
column,
filters,
params,
);
let splitFn;
let db = getDatabase();
if (db === MYSQL) splitFn = 'substring_index';
if (db === POSTGRESQL) splitFn = 'split_part';
if (!splitFn) return Promise.reject(new Error('Unknown database.'));
return rawQuery(
`select * from (
select
url, ${splitFn}(${splitFn}(url, concat($1, '='), 2), '&', 1) param
from
pageview
${joinSession}
where
${table}.website_id=$2 and ${table}.created_at between $3 and $4
${pageviewQuery}
${joinSession && sessionQuery}
${eventQuery}
group by 1, 2
order by 2 desc
) q
where q.param <> ''`,
params,
);
}

View file

@ -1,13 +1,12 @@
import { CLICKHOUSE, RELATIONAL } from 'lib/constants';
import {
rawQueryClickhouse,
getBetweenDatesClickhouse,
getDateQuery,
getDateQueryClickhouse,
getDateStringQuery,
getDateStringQueryClickhouse,
parseFilters,
rawQuery,
rawQueryClickhouse,
runAnalyticsQuery,
} from 'lib/db';
@ -29,24 +28,24 @@ async function relationalQuery(
sessionKey = 'session_id',
) {
const params = [website_id, start_at, end_at];
const { pageviewQuery, sessionQuery, joinSession } = parseFilters('pageview', filters, params);
const { pageviewQuery, sessionQuery, joinSession } = parseFilters(
'pageview',
null,
filters,
params,
);
return rawQuery(
`
select
${getDateStringQuery('g.t', unit)} as t,
g.y as y
from
(select ${getDateQuery('pageview.created_at', unit, timezone)} t,
select ${getDateQuery('pageview.created_at', unit, timezone)} t,
count(${count != '*' ? `${count}${sessionKey}` : count}) y
from pageview
${joinSession}
where pageview.website_id=$1
and pageview.created_at between $2 and $3
${pageviewQuery}
${sessionQuery}
group by 1) g
order by 1
and pageview.created_at between $2 and $3
${pageviewQuery}
${sessionQuery}
group by 1
`,
params,
);
@ -82,9 +81,9 @@ async function clickhouseQuery(
from pageview
${joinSession}
where pageview.website_id= $1
and ${getBetweenDatesClickhouse('pageview.created_at', start_at, end_at)}
${pageviewQuery}
${sessionQuery}
and ${getBetweenDatesClickhouse('pageview.created_at', start_at, end_at)}
${pageviewQuery}
${sessionQuery}
group by t) g
order by t
`,

View file

@ -16,7 +16,12 @@ export async function getSessionMetrics(...args) {
async function relationalQuery(website_id, start_at, end_at, field, filters = {}) {
const params = [website_id, start_at, end_at];
const { pageviewQuery, sessionQuery, joinSession } = parseFilters('pageview', filters, params);
const { pageviewQuery, sessionQuery, joinSession } = parseFilters(
'pageview',
null,
filters,
params,
);
return rawQuery(
`

View file

@ -19,7 +19,12 @@ export async function getWebsiteStats(...args) {
async function relationalQuery(website_id, start_at, end_at, filters = {}) {
const params = [website_id, start_at, end_at];
const { pageviewQuery, sessionQuery, joinSession } = parseFilters('pageview', filters, params);
const { pageviewQuery, sessionQuery, joinSession } = parseFilters(
'pageview',
null,
filters,
params,
);
return rawQuery(
`