@@ -111,18 +111,76 @@ const buildStepQuery = (
111111 const whereCondition = buildWhereCondition ( step , params ) ;
112112 const referrerSelect = includeReferrer ? ', any(referrer) as referrer' : '' ;
113113
114+ // For PAGE_VIEW, only query analytics.events
115+ if ( step . type === 'PAGE_VIEW' ) {
116+ return `
117+ SELECT
118+ ${ stepIndex + 1 } as step_number,
119+ {${ stepNameKey } :String} as step_name,
120+ session_id,
121+ MIN(time) as first_occurrence${ referrerSelect }
122+ FROM analytics.events
123+ WHERE client_id = {websiteId:String}
124+ AND time >= parseDateTimeBestEffort({startDate:String})
125+ AND time <= parseDateTimeBestEffort({endDate:String})
126+ AND ${ whereCondition } ${ filterConditions }
127+ GROUP BY session_id` ;
128+ }
129+
130+ // For custom EVENT, query both analytics.events and analytics.custom_events
131+ const targetKey = `target_${ step . step_number - 1 } ` ;
132+ const referrerSelectCustom = includeReferrer ? ", '' as referrer" : '' ;
133+
114134 return `
135+ WITH filtered_sessions AS (
136+ SELECT DISTINCT session_id
137+ FROM analytics.events
138+ WHERE client_id = {websiteId:String}
139+ AND time >= parseDateTimeBestEffort({startDate:String})
140+ AND time <= parseDateTimeBestEffort({endDate:String})
141+ AND event_name = {${ targetKey } :String}${ filterConditions }
142+ ),
143+ session_referrers AS (
144+ SELECT
145+ session_id,
146+ argMin(referrer, time) as session_referrer
147+ FROM analytics.events
148+ WHERE client_id = {websiteId:String}
149+ AND time >= parseDateTimeBestEffort({startDate:String})
150+ AND time <= parseDateTimeBestEffort({endDate:String})
151+ AND event_name = 'screen_view'
152+ AND referrer != ''
153+ GROUP BY session_id
154+ )
115155 SELECT
116156 ${ stepIndex + 1 } as step_number,
117157 {${ stepNameKey } :String} as step_name,
118158 session_id,
119- MIN(time) as first_occurrence${ referrerSelect }
120- FROM analytics.events
121- WHERE client_id = {websiteId:String}
122- AND time >= parseDateTimeBestEffort({startDate:String})
123- AND time <= parseDateTimeBestEffort({endDate:String})
124- AND ${ whereCondition } ${ filterConditions }
125- GROUP BY session_id` ;
159+ MIN(first_occurrence) as first_occurrence${ includeReferrer ? ', COALESCE(sr.session_referrer, \'\') as referrer' : '' }
160+ FROM (
161+ SELECT
162+ session_id,
163+ time as first_occurrence
164+ FROM analytics.events
165+ WHERE client_id = {websiteId:String}
166+ AND time >= parseDateTimeBestEffort({startDate:String})
167+ AND time <= parseDateTimeBestEffort({endDate:String})
168+ AND event_name = {${ targetKey } :String}${ filterConditions }
169+
170+ UNION ALL
171+
172+ SELECT
173+ ce.session_id,
174+ ce.timestamp as first_occurrence
175+ FROM analytics.custom_events ce
176+ INNER JOIN filtered_sessions fs ON ce.session_id = fs.session_id
177+ WHERE ce.client_id = {websiteId:String}
178+ AND ce.timestamp >= parseDateTimeBestEffort({startDate:String})
179+ AND ce.timestamp <= parseDateTimeBestEffort({endDate:String})
180+ AND ce.event_name = {${ targetKey } :String}
181+ )${ includeReferrer ? `
182+ LEFT JOIN session_referrers sr ON session_id = sr.session_id` : '' }
183+ GROUP BY session_id${ includeReferrer ? ', sr.session_referrer' : '' } ` ;
126184} ;
127185
128186const processSessionEvents = (
@@ -184,7 +242,7 @@ const calculateStepCounts = (
184242) : Map < number , Set < string > > => {
185243 const stepCounts = new Map < number , Set < string > > ( ) ;
186244
187- for ( const [ sessionId , events ] of sessionEvents ) {
245+ for ( const [ sessionId , events ] of Array . from ( sessionEvents . entries ( ) ) ) {
188246 events . sort ( ( a , b ) => a . first_occurrence - b . first_occurrence ) ;
189247 let currentStep = 1 ;
190248
@@ -638,7 +696,7 @@ const calculateReferrerStepCounts = (
638696) : Map < number , Set < string > > => {
639697 const stepCounts = new Map < number , Set < string > > ( ) ;
640698
641- for ( const sessionId of group . sessionIds ) {
699+ for ( const sessionId of Array . from ( group . sessionIds ) ) {
642700 const events = sessionEvents
643701 . get ( sessionId )
644702 ?. sort ( ( a , b ) => a . first_occurrence - b . first_occurrence ) ;
@@ -827,7 +885,7 @@ export const processFunnelAnalyticsByReferrer = async (
827885 }
828886 > ( ) ;
829887
830- for ( const [ sessionId , events ] of sessionEvents ) {
888+ for ( const [ sessionId , events ] of Array . from ( sessionEvents . entries ( ) ) ) {
831889 if ( events . length > 0 ) {
832890 const referrer = events [ 0 ] . referrer || 'Direct' ;
833891 const parsed = parseReferrer ( referrer ) ;
@@ -842,7 +900,7 @@ export const processFunnelAnalyticsByReferrer = async (
842900
843901 const referrerAnalytics : ReferrerAnalytics [ ] = [ ] ;
844902
845- for ( const [ groupKey , group ] of referrerGroups ) {
903+ for ( const [ groupKey , group ] of Array . from ( referrerGroups . entries ( ) ) ) {
846904 const analytics = processReferrerGroup (
847905 groupKey ,
848906 group ,
@@ -857,4 +915,4 @@ export const processFunnelAnalyticsByReferrer = async (
857915 const referrer_analytics = aggregateReferrerAnalytics ( referrerAnalytics ) ;
858916
859917 return { referrer_analytics } ;
860- } ;
918+ } ;
0 commit comments