Skip to content
This repository was archived by the owner on Jun 13, 2025. It is now read-only.

Commit bd9d052

Browse files
author
DanLee
authored
Merge pull request #10 from dataform-co/dataform_add_screens
Allow users to toggle Screens, Pages, Tracks
2 parents d2feaba + 7684e05 commit bd9d052

12 files changed

Lines changed: 340 additions & 149 deletions

definitions/example.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ const segmentModels = segment({
1010
},
1111
customPageFields: ["url_hash", "category"],
1212
customUserFields: ["email", "name", "company_name", "created_at"],
13+
includeScreens: false
1314
});
1415

1516
declare({
@@ -18,6 +19,12 @@ declare({
1819
name: "pages"
1920
});
2021

22+
declare({
23+
database: "tada-analytics",
24+
schema: "javascript",
25+
name: "screens"
26+
});
27+
2128
declare({
2229
database: "tada-analytics",
2330
schema: "javascript",

includes/common.js

Lines changed: 71 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,81 @@
22

33
// From here: https://segment.com/docs/connections/spec/page/
44
let PAGE_FIELDS = {
5-
url: "url",
6-
referrer: "referrer",
7-
title: "title",
8-
name: "name",
9-
search: "search",
10-
path: "path",
11-
context_campaign_content: "utm_content",
12-
context_campaign_medium: "utm_medium",
13-
context_campaign_source: "utm_source",
14-
context_campaign_name: "utm_campaign",
15-
context_campaign_term: "utm_term"};
5+
url: "url",
6+
referrer: "referrer",
7+
title: "title",
8+
name: "name",
9+
search: "search",
10+
path: "path",
11+
context_campaign_content: "utm_content",
12+
context_campaign_medium: "utm_medium",
13+
context_campaign_source: "utm_source",
14+
context_campaign_name: "utm_campaign",
15+
context_campaign_term: "utm_term"
16+
};
1617

1718
// From here: https://segment.com/docs/connections/spec/track/
1819
let TRACK_FIELDS = {
1920
event: "event"
2021
};
2122

23+
// From here: https://segment.com/docs/connections/spec/screen/
24+
let SCREEN_FIELDS = {
25+
event: "name"
26+
};
27+
28+
function allPageFields(params) {
29+
const customPageFieldsObj = params.customPageFields.reduce((acc, item) => ({
30+
...acc,
31+
[item]: item
32+
}), {});
33+
return {
34+
...PAGE_FIELDS,
35+
...customPageFieldsObj
36+
};
37+
}
38+
39+
function allTrackFields(params) {
40+
const customTrackFieldsObj = params.customTrackFields.reduce((acc, item) => ({
41+
...acc,
42+
[item]: item
43+
}), {});
44+
return {
45+
...TRACK_FIELDS,
46+
...customTrackFieldsObj
47+
};
48+
}
49+
50+
function allScreenFields(params) {
51+
const customScreenFieldsObj = params.customScreenFields.reduce((acc, item) => ({
52+
...acc,
53+
[item]: item
54+
}), {});
55+
return {
56+
...SCREEN_FIELDS,
57+
...customScreenFieldsObj
58+
};
59+
}
60+
61+
function enabledEvents(params) {
62+
const events = [];
63+
64+
if (params.includeTracks) {
65+
events.push("track");
66+
}
67+
if (params.includePages) {
68+
events.push("page");
69+
}
70+
if (params.includeScreens) {
71+
events.push("screen");
72+
}
73+
74+
return events;
75+
}
76+
2277
module.exports = {
23-
PAGE_FIELDS,
24-
TRACK_FIELDS
25-
}
78+
allTrackFields,
79+
allPageFields,
80+
allScreenFields,
81+
enabledEvents
82+
}

includes/page_events.js

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,17 @@ const segmentCommon = require("./common");
22

33
module.exports = (params) => {
44

5-
const customPageFieldsObj = params.customPageFields.reduce((acc, item) => ({...acc, [item]: item }), {});
6-
7-
const customTrackFieldsObj = params.customTrackFields.reduce((acc, item) => ({...acc, [item]: item }), {});
8-
95
return publish("segment_page_events", {
106
...params.defaultConfig
117
}).query(ctx => `
128
13-
-- format page calls into a format suitable to join with track calls
9+
-- format page calls into a format suitable to join with all other events
1410
select distinct
1511
pages.timestamp,
1612
user_id,
1713
anonymous_id,
1814
id as page_id,
19-
${Object.entries({...segmentCommon.PAGE_FIELDS, ...customPageFieldsObj}).map(
15+
${Object.entries(segmentCommon.allPageFields(params)).map(
2016
([key, value]) => `${key} as ${value}`).join(",\n ")}
2117
from
2218
${ctx.ref(params.segmentSchema, "pages")} as pages

includes/screen_events.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
const segmentCommon = require("./common");
2+
3+
module.exports = (params) => {
4+
5+
return publish("segment_screen_events", {
6+
...params.defaultConfig
7+
}).query(ctx => `
8+
9+
-- format screen calls into a format suitable to join with other events
10+
select distinct
11+
screens.timestamp,
12+
user_id,
13+
anonymous_id,
14+
id as screen_id,
15+
${Object.entries(segmentCommon.allScreenFields(params)).map(
16+
([key, value]) => `${key} as ${value}`).join(",\n ")}
17+
from
18+
${ctx.ref(params.segmentSchema, "screens")} as screens
19+
20+
`)
21+
}

includes/sessionized_events.js

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const crossdb = require("./crossdb");
2+
const segmentCommon = require("./common");
23

34
module.exports = (params) => {
45

@@ -7,24 +8,16 @@ module.exports = (params) => {
78
}).query(ctx => `
89
910
with segment_events_combined as (
10-
-- combine page and track tables into a full events table
11-
select
12-
track_events.timestamp,
13-
user_id,
14-
anonymous_id,
15-
track_id,
16-
null as page_id
17-
from
18-
${params.segmentSchema, ctx.ref("segment_track_events")} as track_events
19-
union all
20-
select
21-
page_events.timestamp,
11+
-- combine all enabled events tables into one combined events tables
12+
${segmentCommon.enabledEvents(params).map((event) =>
13+
`select
14+
${event}_events.timestamp,
2215
user_id,
2316
anonymous_id,
24-
null as track_id,
25-
page_id
17+
${segmentCommon.enabledEvents(params).map((event_id) =>
18+
`${event==event_id ? `` : `null as `}${event_id}_id`).join(`,\n `)}
2619
from
27-
${params.segmentSchema, ctx.ref("segment_page_events")} as page_events
20+
${params.segmentSchema, ctx.ref(`segment_${event}_events`)} as ${event}_events`).join(`\nunion all \n`)}
2821
),
2922
3023
segment_events_mapped as (
@@ -36,8 +29,7 @@ select
3629
segment_user_anonymous_map.user_id,
3730
segment_events_combined.anonymous_id
3831
) as user_id,
39-
track_id,
40-
page_id
32+
${segmentCommon.enabledEvents(params).map((event) => `${event}_id`).join(`,\n `)}
4133
from
4234
segment_events_combined
4335
left join ${ctx.ref(params.defaultConfig.schema, "segment_user_map")} as segment_user_anonymous_map

includes/sessionized_pages.js

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,18 @@ const segmentCommon = require("./common");
22

33
module.exports = (params) => {
44

5-
const customPageFieldsObj = params.customPageFields.reduce((acc, item) => ({...acc, [item]: item }), {});
6-
7-
const customTrackFieldsObj = params.customTrackFields.reduce((acc, item) => ({...acc, [item]: item }), {});
8-
95
return publish("segment_sessionized_pages", {
106
...params.defaultConfig
117
}).query(ctx => `
128
13-
-- annotate track records with session details
9+
-- annotate page records with session details
1410
select
1511
segment_sessionized_events.timestamp,
1612
segment_sessionized_events.user_id,
1713
segment_sessionized_events.page_id,
1814
segment_sessionized_events.session_index,
1915
segment_sessionized_events.session_id,
20-
${Object.entries({...segmentCommon.PAGE_FIELDS, ...customPageFieldsObj}).map(
16+
${Object.entries(segmentCommon.allPageFields(params)).map(
2117
([key, value]) => `segment_page_events.${value}`).join(",\n ")}
2218
from
2319
${params.segmentSchema, ctx.ref("segment_sessionized_events")} as segment_sessionized_events

includes/sessionized_screens.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
const segmentCommon = require("./common");
2+
3+
module.exports = (params) => {
4+
5+
return publish("segment_sessionized_screens", {
6+
...params.defaultConfig
7+
}).query(ctx => `
8+
9+
-- annotate screen records with session details
10+
select
11+
segment_sessionized_events.timestamp,
12+
segment_sessionized_events.user_id,
13+
segment_sessionized_events.screen_id,
14+
segment_sessionized_events.session_index,
15+
segment_sessionized_events.session_id,
16+
${Object.entries(segmentCommon.allScreenFields(params)).map(
17+
([key, value]) => `segment_screen_events.${value}`).join(",\n ")}
18+
from
19+
${params.segmentSchema, ctx.ref("segment_sessionized_events")} as segment_sessionized_events
20+
left join ${params.segmentSchema, ctx.ref("segment_screen_events")} as segment_screen_events
21+
on segment_sessionized_events.screen_id = segment_screen_events.screen_id
22+
where
23+
segment_sessionized_events.screen_id is not null
24+
25+
`)
26+
}

includes/sessionized_tracks.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,6 @@ const segmentCommon = require("./common");
22

33
module.exports = (params) => {
44

5-
const customPageFieldsObj = params.customPageFields.reduce((acc, item) => ({...acc, [item]: item }), {});
6-
7-
const customTrackFieldsObj = params.customTrackFields.reduce((acc, item) => ({...acc, [item]: item }), {});
8-
95
return publish("segment_sessionized_tracks", {
106
...params.defaultConfig
117
}).query(ctx => `
@@ -17,7 +13,7 @@ select
1713
segment_sessionized_events.track_id,
1814
segment_sessionized_events.session_index,
1915
segment_sessionized_events.session_id,
20-
${Object.entries({...segmentCommon.TRACK_FIELDS, ...customTrackFieldsObj}).map(
16+
${Object.entries(segmentCommon.allTrackFields(params)).map(
2117
([key, value]) => `segment_track_events.${value}`).join(",\n ")}
2218
from
2319
${params.segmentSchema, ctx.ref("segment_sessionized_events")} as segment_sessionized_events

0 commit comments

Comments
 (0)