-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathquery.js
166 lines (133 loc) · 5.55 KB
/
query.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
const { BigQuery } = require('@google-cloud/bigquery');
const bigquery = new BigQuery();
const _ = require('lodash');
const { TABLE_PREFIX } = require('./utils/constant');
const queryFBMetrics = async (date) => {
console.log('====================BEGIN queryFBMetrics====================');
console.log(`date=${date}`);
const metrics = {};
let result = {};
const activeUsersQuery = `SELECT COUNT(DISTINCT user_pseudo_id)
AS active_users_count FROM \`${TABLE_PREFIX}${date}\` AS T
CROSS JOIN T.event_params
WHERE event_params.key = 'engagement_time_msec'
AND event_params.value.int_value > 0
-- Pick events in the last N = 20 days.
AND event_timestamp >
UNIX_MICROS(TIMESTAMP_SUB(CURRENT_TIMESTAMP, INTERVAL 20 DAY))`;
// For all options, see https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/query
const activeUsersOptions = {
query: activeUsersQuery,
// Location must match that of the dataset(s) referenced in the query.
// location: 'asia',
};
const newUsersQuery = `select count (distinct user_pseudo_id)
AS new_users_count FROM \`${TABLE_PREFIX}${date}\`
where event_name = 'first_open'`;
const newUsersOptions = {
query: newUsersQuery,
// Location must match that of the dataset(s) referenced in the query.
// location: 'asia',
};
try {
// Run the query as a job
const [job] = await bigquery.createQueryJob(activeUsersOptions);
console.log(`Job ${job.id} for active users started.`);
// Wait for the query to finish
const [activeUsersResult] = await job.getQueryResults();
// Print the results
console.log('activeUsersResult:');
console.log(activeUsersResult?.[0]);
// Update the metrics
Object.assign(metrics, activeUsersResult[0]);
// Run the query as a job
const [newUsersJob] = await bigquery.createQueryJob(newUsersOptions);
console.log(`Job ${newUsersJob.id} for new users started.`);
// Wait for the query to finish
const [newUsersResult] = await newUsersJob.getQueryResults();
// Print the results
console.log('newUsersResult:');
console.log(newUsersResult?.[0]);
// Update the metrics
Object.assign(metrics, newUsersResult[0]);
} catch (err) {
console.log('Error in queryFBMetrics');
result = {
status: 'error',
body: 'No data found for given input!!',
};
return result;
}
result = (_.isEmpty(metrics)) ? {
status: 'error',
body: 'No data found for given input!!.',
} : {
status: 'success',
body: metrics,
};
return result;
};
const queryFBMetricsbyDateRange = async (fromDate, toDate) => {
console.log('========================BEGIN queryFBMetricsbyDateRange========================');
console.log(`fromDate=${fromDate} toDate=${toDate}`);
const metrics = {};
let result = {};
const activeUsersQuery = `SELECT COUNT(DISTINCT user_pseudo_id) AS active_users_count
FROM \`${TABLE_PREFIX}\*\` AS T
CROSS JOIN T.event_params
WHERE event_params.key = 'engagement_time_msec' AND event_params.value.int_value > 0
-- Pick events in the last N = 20 days.
AND event_timestamp > UNIX_MICROS(TIMESTAMP_SUB(CURRENT_TIMESTAMP, INTERVAL 20 DAY))
AND _TABLE_SUFFIX BETWEEN '${fromDate}' AND '${toDate}';`;
// For all options, see https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/query
const activeUsersOptions = {
query: activeUsersQuery,
// Location must match that of the dataset(s) referenced in the query.
// location: 'asia',
};
const newUsersQuery = `select count (distinct user_pseudo_id) AS new_users_count FROM \`${TABLE_PREFIX}\*\`
where event_name = 'first_open' AND _TABLE_SUFFIX BETWEEN '${fromDate}' AND '${toDate}';`;
const newUsersOptions = {
query: newUsersQuery,
// Location must match that of the dataset(s) referenced in the query.
// location: 'asia',
};
try {
// Run the query as a job
const [job] = await bigquery.createQueryJob(activeUsersOptions);
console.log(`Job ${job.id} for active users started.`);
// Wait for the query to finish
const [activeUsersResult] = await job.getQueryResults();
// Print the results
console.log('activeUsersResult:');
console.log(activeUsersResult?.[0]);
// Update the metrics
Object.assign(metrics, activeUsersResult[0]);
// Run the query as a job
const [newUsersJob] = await bigquery.createQueryJob(newUsersOptions);
console.log(`Job ${newUsersJob.id} for new users started.`);
// Wait for the query to finish
const [newUsersResult] = await newUsersJob.getQueryResults();
// Print the results
console.log('newUsersResult:');
console.log(newUsersResult?.[0]);
// Update the metrics
Object.assign(metrics, newUsersResult[0]);
} catch (err) {
console.log('Error in queryFBMetrics');
result = {
status: 'error',
body: 'No data found for given input!!',
};
return result;
}
result = (_.isEmpty(metrics)) ? {
status: 'error',
body: 'No data found for given input!!.',
} : {
status: 'success',
body: metrics,
};
return result;
};
module.exports = { queryFBMetrics, queryFBMetricsbyDateRange };