Skip to content

Commit

Permalink
Merge pull request #3012 from ccrvlh/feat/url-pattern
Browse files Browse the repository at this point in the history
feat: allow for URL pattern matching on funnels
  • Loading branch information
mikecao authored Dec 4, 2024
2 parents 6b1c183 + d99b822 commit ffd27ab
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 6 deletions.
5 changes: 4 additions & 1 deletion src/pages/api/reports/funnel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,10 @@ const schema = {
.of(
yup.object().shape({
type: yup.string().required(),
value: yup.string().required(),
value: yup
.string()
.matches(/^[a-zA-Z0-9/*-_]+$/, 'Invalid URL pattern')
.required(),
}),
)
.min(2)
Expand Down
37 changes: 32 additions & 5 deletions src/queries/analytics/reports/getFunnel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,9 +70,19 @@ async function relationalQuery(
(pv, cv, i) => {
const levelNumber = i + 1;
const startSum = i > 0 ? 'union ' : '';
const operator = cv.type === 'url' && cv.value.endsWith('*') ? 'like' : '=';
const column = cv.type === 'url' ? 'url_path' : 'event_name';
const paramValue = cv.value.endsWith('*') ? cv.value.replace('*', '%') : cv.value;
const isURL = cv.type === 'url';
const column = isURL ? 'url_path' : 'event_name';

let operator = '=';
let paramValue = cv.value;

if (isURL && cv.value.includes('*')) {
operator = '~';
paramValue = cv.value.replace(/\*/g, '.*');
} else if (isURL && cv.value.endsWith('*')) {
operator = 'like';
paramValue = cv.value.replace('*', '%');
}

if (levelNumber === 1) {
pv.levelOneQuery = `
Expand Down Expand Up @@ -167,9 +177,26 @@ async function clickhouseQuery(
const levelNumber = i + 1;
const startSum = i > 0 ? 'union all ' : '';
const startFilter = i > 0 ? 'or' : '';
const operator = cv.type === 'url' && cv.value.endsWith('*') ? 'like' : '=';
const column = cv.type === 'url' ? 'url_path' : 'event_name';
const paramValue = cv.value.endsWith('*') ? cv.value.replace('*', '%') : cv.value;

let operator: string;
let paramValue: string;

if (cv.type === 'url') {
if (cv.value.includes('*')) {
operator = 'match';
paramValue = cv.value.replace(/\*/g, '.*');
} else if (cv.value.endsWith('*')) {
operator = 'like';
paramValue = cv.value.replace('*', '%');
} else {
operator = '=';
paramValue = cv.value;
}
} else {
operator = '=';
paramValue = cv.value;
}

if (levelNumber === 1) {
pv.levelOneQuery = `\n
Expand Down

0 comments on commit ffd27ab

Please sign in to comment.