Updated filter processing logic.
parent
fb2dc9f5ab
commit
df1ddf3e73
|
@ -1,12 +1,12 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { FormattedMessage } from 'react-intl';
|
import { FormattedMessage } from 'react-intl';
|
||||||
import MetricsTable from './MetricsTable';
|
import FilterLink from 'components/common/FilterLink';
|
||||||
import { browserFilter } from 'lib/filters';
|
import MetricsTable from 'components/metrics/MetricsTable';
|
||||||
import FilterLink from '../common/FilterLink';
|
import { BROWSERS } from 'lib/constants';
|
||||||
|
|
||||||
export default function BrowsersTable({ websiteId, ...props }) {
|
export default function BrowsersTable({ websiteId, ...props }) {
|
||||||
function renderLink({ x: browser }) {
|
function renderLink({ x: browser }) {
|
||||||
return <FilterLink id="browser" value={browser} />;
|
return <FilterLink id="browser" value={browser} label={BROWSERS[browser] || browser} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
@ -16,7 +16,6 @@ export default function BrowsersTable({ websiteId, ...props }) {
|
||||||
type="browser"
|
type="browser"
|
||||||
metric={<FormattedMessage id="metrics.visitors" defaultMessage="Visitors" />}
|
metric={<FormattedMessage id="metrics.visitors" defaultMessage="Visitors" />}
|
||||||
websiteId={websiteId}
|
websiteId={websiteId}
|
||||||
dataFilter={browserFilter}
|
|
||||||
renderLabel={renderLink}
|
renderLabel={renderLink}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
import { BROWSERS } from './constants';
|
|
||||||
import { removeTrailingSlash, removeWWW, getDomainName } from './url';
|
import { removeTrailingSlash, removeWWW, getDomainName } from './url';
|
||||||
|
|
||||||
export const urlFilter = (data, { raw }) => {
|
export const urlFilter = (data, { raw }) => {
|
||||||
|
@ -113,8 +112,6 @@ export const refFilter = (data, { domain, domainOnly, raw }) => {
|
||||||
return Object.keys(map).map(key => ({ x: key, y: map[key], w: links[key] }));
|
return Object.keys(map).map(key => ({ x: key, y: map[key], w: links[key] }));
|
||||||
};
|
};
|
||||||
|
|
||||||
export const browserFilter = data => data.map(({ x, y }) => ({ x: BROWSERS[x] ?? x, y }));
|
|
||||||
|
|
||||||
export const eventTypeFilter = (data, types) => {
|
export const eventTypeFilter = (data, types) => {
|
||||||
if (!types || types.length === 0) {
|
if (!types || types.length === 0) {
|
||||||
return data;
|
return data;
|
||||||
|
|
|
@ -109,6 +109,28 @@ export function getFilterQuery(table, filters = {}, params = []) {
|
||||||
return query.join('\n');
|
return query.join('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function parseFilters(table, filters = {}, params = []) {
|
||||||
|
const { domain, url, referrer, os, browser, device, country, event_type } = filters;
|
||||||
|
|
||||||
|
const pageviewFilters = { domain, url, referrer };
|
||||||
|
const sessionFilters = { os, browser, device, country };
|
||||||
|
const eventFilters = { event_type };
|
||||||
|
|
||||||
|
return {
|
||||||
|
pageviewFilters,
|
||||||
|
sessionFilters,
|
||||||
|
eventFilters,
|
||||||
|
event: { event_type },
|
||||||
|
joinSession:
|
||||||
|
os || browser || device || country
|
||||||
|
? `inner join session on ${table}.session_id = session.session_id`
|
||||||
|
: '',
|
||||||
|
pageviewQuery: getFilterQuery('pageview', pageviewFilters, params),
|
||||||
|
sessionQuery: getFilterQuery('session', sessionFilters, params),
|
||||||
|
eventQuery: getFilterQuery('event', eventFilters, params),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
export async function runQuery(query) {
|
export async function runQuery(query) {
|
||||||
return query.catch(e => {
|
return query.catch(e => {
|
||||||
throw e;
|
throw e;
|
||||||
|
@ -399,12 +421,7 @@ export async function getEvents(websites, start_at) {
|
||||||
|
|
||||||
export function getWebsiteStats(website_id, start_at, end_at, filters = {}) {
|
export function getWebsiteStats(website_id, start_at, end_at, filters = {}) {
|
||||||
const params = [website_id, start_at, end_at];
|
const params = [website_id, start_at, end_at];
|
||||||
const { url, referrer, os, browser, device, country } = filters;
|
const { pageviewQuery, sessionQuery, joinSession } = parseFilters('pageview', filters, params);
|
||||||
|
|
||||||
const joinSession =
|
|
||||||
os || browser || device || country
|
|
||||||
? 'inner join session on session.session_id = pageview.session_id'
|
|
||||||
: '';
|
|
||||||
|
|
||||||
return rawQuery(
|
return rawQuery(
|
||||||
`
|
`
|
||||||
|
@ -421,8 +438,8 @@ export function getWebsiteStats(website_id, start_at, end_at, filters = {}) {
|
||||||
${joinSession}
|
${joinSession}
|
||||||
where pageview.website_id=$1
|
where pageview.website_id=$1
|
||||||
and pageview.created_at between $2 and $3
|
and pageview.created_at between $2 and $3
|
||||||
${getFilterQuery('pageview', { url, referrer }, params)}
|
${pageviewQuery}
|
||||||
${getFilterQuery('session', { os, browser, device, country }, params)}
|
${sessionQuery}
|
||||||
group by 1, 2
|
group by 1, 2
|
||||||
) t
|
) t
|
||||||
`,
|
`,
|
||||||
|
@ -440,11 +457,7 @@ export function getPageviewStats(
|
||||||
filters = {},
|
filters = {},
|
||||||
) {
|
) {
|
||||||
const params = [website_id, start_at, end_at];
|
const params = [website_id, start_at, end_at];
|
||||||
const { url, referrer, os, browser, device, country } = filters;
|
const { pageviewQuery, sessionQuery, joinSession } = parseFilters('pageview', filters, params);
|
||||||
const joinSession =
|
|
||||||
os || browser || device || country
|
|
||||||
? 'inner join session on session.session_id = pageview.session_id'
|
|
||||||
: '';
|
|
||||||
|
|
||||||
return rawQuery(
|
return rawQuery(
|
||||||
`
|
`
|
||||||
|
@ -454,8 +467,8 @@ export function getPageviewStats(
|
||||||
${joinSession}
|
${joinSession}
|
||||||
where pageview.website_id=$1
|
where pageview.website_id=$1
|
||||||
and pageview.created_at between $2 and $3
|
and pageview.created_at between $2 and $3
|
||||||
${getFilterQuery('pageview', { url, referrer }, params)}
|
${pageviewQuery}
|
||||||
${getFilterQuery('session', { os, browser, device, country }, params)}
|
${sessionQuery}
|
||||||
group by 1
|
group by 1
|
||||||
order by 1
|
order by 1
|
||||||
`,
|
`,
|
||||||
|
@ -465,11 +478,7 @@ export function getPageviewStats(
|
||||||
|
|
||||||
export function getSessionMetrics(website_id, start_at, end_at, field, filters = {}) {
|
export function getSessionMetrics(website_id, start_at, end_at, field, filters = {}) {
|
||||||
const params = [website_id, start_at, end_at];
|
const params = [website_id, start_at, end_at];
|
||||||
const { url, referrer, os, browser, device, country } = filters;
|
const { pageviewQuery, sessionQuery, joinSession } = parseFilters('pageview', filters, params);
|
||||||
const joinSession =
|
|
||||||
os || browser || device || country
|
|
||||||
? 'inner join session on session.session_id = pageview.session_id'
|
|
||||||
: '';
|
|
||||||
|
|
||||||
return rawQuery(
|
return rawQuery(
|
||||||
`
|
`
|
||||||
|
@ -481,8 +490,8 @@ export function getSessionMetrics(website_id, start_at, end_at, field, filters =
|
||||||
${joinSession}
|
${joinSession}
|
||||||
where pageview.website_id=$1
|
where pageview.website_id=$1
|
||||||
and pageview.created_at between $2 and $3
|
and pageview.created_at between $2 and $3
|
||||||
${getFilterQuery('pageview', { url, referrer }, params)}
|
${pageviewQuery}
|
||||||
${getFilterQuery('session', { os, browser, device, country }, params)}
|
${sessionQuery}
|
||||||
)
|
)
|
||||||
group by 1
|
group by 1
|
||||||
order by 2 desc
|
order by 2 desc
|
||||||
|
@ -493,11 +502,8 @@ export function getSessionMetrics(website_id, start_at, end_at, field, filters =
|
||||||
|
|
||||||
export function getPageviewMetrics(website_id, start_at, end_at, field, table, filters = {}) {
|
export function getPageviewMetrics(website_id, start_at, end_at, field, table, filters = {}) {
|
||||||
const params = [website_id, start_at, end_at];
|
const params = [website_id, start_at, end_at];
|
||||||
const { domain, url, referrer, os, browser, device, country } = filters;
|
console.log({ table, filters });
|
||||||
const joinSession =
|
const { pageviewQuery, sessionQuery, joinSession } = parseFilters(table, filters, params);
|
||||||
(os || browser || device || country) && table === 'pageview'
|
|
||||||
? 'inner join session on session.session_id = pageview.session_id'
|
|
||||||
: '';
|
|
||||||
|
|
||||||
return rawQuery(
|
return rawQuery(
|
||||||
`
|
`
|
||||||
|
@ -506,8 +512,8 @@ export function getPageviewMetrics(website_id, start_at, end_at, field, table, f
|
||||||
${joinSession}
|
${joinSession}
|
||||||
where ${table}.website_id=$1
|
where ${table}.website_id=$1
|
||||||
and ${table}.created_at between $2 and $3
|
and ${table}.created_at between $2 and $3
|
||||||
${getFilterQuery(table, { domain, url, referrer }, params)}
|
${pageviewQuery}
|
||||||
${joinSession && getFilterQuery('session', { os, browser, device, country }, params)}
|
${joinSession && sessionQuery}
|
||||||
group by 1
|
group by 1
|
||||||
order by 2 desc
|
order by 2 desc
|
||||||
`,
|
`,
|
||||||
|
|
|
@ -78,22 +78,18 @@ export default async (req, res) => {
|
||||||
domain = website.domain;
|
domain = website.domain;
|
||||||
}
|
}
|
||||||
|
|
||||||
const data = await getPageviewMetrics(
|
const column = getColumn(type);
|
||||||
websiteId,
|
const table = getTable(type);
|
||||||
startDate,
|
|
||||||
endDate,
|
const data = await getPageviewMetrics(websiteId, startDate, endDate, column, table, {
|
||||||
getColumn(type),
|
domain,
|
||||||
getTable(type),
|
url: type !== 'url' ? url : undefined,
|
||||||
{
|
referrer: type !== 'referrer' ? referrer : undefined,
|
||||||
domain,
|
os: type !== 'os' ? os : undefined,
|
||||||
url: type !== 'url' ? url : undefined,
|
browser: type !== 'browser' ? browser : undefined,
|
||||||
referrer: type !== 'referrer' ? referrer : undefined,
|
device: type !== 'device' ? device : undefined,
|
||||||
os: type !== 'os' ? os : undefined,
|
country: type !== 'country' ? country : undefined,
|
||||||
browser: type !== 'browser' ? browser : undefined,
|
});
|
||||||
device: type !== 'device' ? device : undefined,
|
|
||||||
country: type !== 'country' ? country : undefined,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
return ok(res, data);
|
return ok(res, data);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue