@reachy/audience-module 1.0.16 → 1.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CODEOWNERS +1 -0
- package/dist/builders/RfmSegmentBuilder.d.ts +44 -0
- package/dist/builders/RfmSegmentBuilder.d.ts.map +1 -0
- package/dist/builders/RfmSegmentBuilder.js +232 -0
- package/dist/builders/RfmSegmentBuilder.js.map +1 -0
- package/dist/engine/RfmEngine.d.ts +67 -0
- package/dist/engine/RfmEngine.d.ts.map +1 -0
- package/dist/engine/RfmEngine.js +335 -0
- package/dist/engine/RfmEngine.js.map +1 -0
- package/dist/engine/V2AudienceEngine.d.ts.map +1 -1
- package/dist/engine/V2AudienceEngine.js +30 -14
- package/dist/engine/V2AudienceEngine.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/builders/RfmSegmentBuilder.ts +279 -0
- package/src/engine/RfmEngine.ts +418 -0
- package/src/engine/V2AudienceEngine.ts +34 -17
- package/src/index.ts +2 -0
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RfmEngine = void 0;
|
|
4
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
5
|
+
const SEGMENTS_REF = [
|
|
6
|
+
{ segment_key: 'cannot_lose_them', segment_name: 'Cannot Lose Them', segment_order: 1 },
|
|
7
|
+
{ segment_key: 'at_risk', segment_name: 'At Risk', segment_order: 2 },
|
|
8
|
+
{ segment_key: 'hibernating', segment_name: 'Hibernating', segment_order: 3 },
|
|
9
|
+
{ segment_key: 'about_to_sleep', segment_name: 'About to Sleep', segment_order: 4 },
|
|
10
|
+
{ segment_key: 'needing_attention', segment_name: 'Needing Attention', segment_order: 5 },
|
|
11
|
+
{ segment_key: 'promising', segment_name: 'Promising', segment_order: 6 },
|
|
12
|
+
{ segment_key: 'new_users', segment_name: 'New Users', segment_order: 7 },
|
|
13
|
+
{ segment_key: 'potential_loyalists', segment_name: 'Potential Loyalists', segment_order: 8 },
|
|
14
|
+
{ segment_key: 'loyal_users', segment_name: 'Loyal Users', segment_order: 9 },
|
|
15
|
+
{ segment_key: 'champions', segment_name: 'Champions', segment_order: 10 },
|
|
16
|
+
];
|
|
17
|
+
function toDate(input) {
|
|
18
|
+
if (input instanceof Date)
|
|
19
|
+
return input;
|
|
20
|
+
const d = new Date(String(input || ''));
|
|
21
|
+
if (Number.isNaN(d.getTime()))
|
|
22
|
+
throw new Error(`Data inválida: ${String(input)}`);
|
|
23
|
+
return d;
|
|
24
|
+
}
|
|
25
|
+
function utcDay(d) {
|
|
26
|
+
return new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate(), 0, 0, 0, 0));
|
|
27
|
+
}
|
|
28
|
+
function recencyDays(to, last) {
|
|
29
|
+
const a = utcDay(to).getTime();
|
|
30
|
+
const b = utcDay(last).getTime();
|
|
31
|
+
return Math.max(0, Math.floor((a - b) / DAY_MS));
|
|
32
|
+
}
|
|
33
|
+
function normalizeSet(ids) {
|
|
34
|
+
if (!ids)
|
|
35
|
+
return null;
|
|
36
|
+
if (ids instanceof Set)
|
|
37
|
+
return new Set(Array.from(ids).map((s) => String(s)));
|
|
38
|
+
return new Set((ids || []).map((s) => String(s)));
|
|
39
|
+
}
|
|
40
|
+
function percentileDisc(values, p) {
|
|
41
|
+
const n = values.length;
|
|
42
|
+
if (n <= 0)
|
|
43
|
+
return Number.NaN;
|
|
44
|
+
const pp = Math.max(0, Math.min(1, p));
|
|
45
|
+
const k = Math.ceil(pp * n);
|
|
46
|
+
const idx = Math.min(n - 1, Math.max(0, k - 1));
|
|
47
|
+
return values[idx];
|
|
48
|
+
}
|
|
49
|
+
function percentileDiscCuts(valuesRaw) {
|
|
50
|
+
const values = [...valuesRaw].sort((a, b) => a - b);
|
|
51
|
+
return [
|
|
52
|
+
percentileDisc(values, 0.2),
|
|
53
|
+
percentileDisc(values, 0.4),
|
|
54
|
+
percentileDisc(values, 0.6),
|
|
55
|
+
percentileDisc(values, 0.8),
|
|
56
|
+
];
|
|
57
|
+
}
|
|
58
|
+
function scoreRecency(days, cuts) {
|
|
59
|
+
if (days <= cuts[0])
|
|
60
|
+
return 5;
|
|
61
|
+
if (days <= cuts[1])
|
|
62
|
+
return 4;
|
|
63
|
+
if (days <= cuts[2])
|
|
64
|
+
return 3;
|
|
65
|
+
if (days <= cuts[3])
|
|
66
|
+
return 2;
|
|
67
|
+
return 1;
|
|
68
|
+
}
|
|
69
|
+
function scoreFrequency(count, cuts) {
|
|
70
|
+
if (count <= cuts[0])
|
|
71
|
+
return 1;
|
|
72
|
+
if (count <= cuts[1])
|
|
73
|
+
return 2;
|
|
74
|
+
if (count <= cuts[2])
|
|
75
|
+
return 3;
|
|
76
|
+
if (count <= cuts[3])
|
|
77
|
+
return 4;
|
|
78
|
+
return 5;
|
|
79
|
+
}
|
|
80
|
+
function computeSegmentKey(r, f) {
|
|
81
|
+
if (r >= 4 && f >= 4)
|
|
82
|
+
return 'champions';
|
|
83
|
+
if (r === 3 && f >= 4)
|
|
84
|
+
return 'loyal_users';
|
|
85
|
+
if (r >= 4 && f >= 2 && f <= 3)
|
|
86
|
+
return 'potential_loyalists';
|
|
87
|
+
if (r === 5 && f === 1)
|
|
88
|
+
return 'new_users';
|
|
89
|
+
if (r === 4 && f === 1)
|
|
90
|
+
return 'promising';
|
|
91
|
+
if (r === 3 && f === 3)
|
|
92
|
+
return 'needing_attention';
|
|
93
|
+
if (r === 3 && f <= 2)
|
|
94
|
+
return 'about_to_sleep';
|
|
95
|
+
if (r <= 2 && f === 5)
|
|
96
|
+
return 'cannot_lose_them';
|
|
97
|
+
if (r <= 2 && f >= 3 && f <= 4)
|
|
98
|
+
return 'at_risk';
|
|
99
|
+
return 'hibernating';
|
|
100
|
+
}
|
|
101
|
+
function channelsArray(prefs) {
|
|
102
|
+
const ch = prefs && typeof prefs === 'object' ? prefs?.channels : undefined;
|
|
103
|
+
return Array.isArray(ch) ? ch : [];
|
|
104
|
+
}
|
|
105
|
+
function hasChannel(prefs, channel) {
|
|
106
|
+
const arr = channelsArray(prefs);
|
|
107
|
+
return arr.some((c) => String(c?.channel || '').trim().toLowerCase() === channel);
|
|
108
|
+
}
|
|
109
|
+
function isChannelSubscribed(prefs, channel) {
|
|
110
|
+
const arr = channelsArray(prefs);
|
|
111
|
+
return arr.some((c) => {
|
|
112
|
+
if (String(c?.channel || '').trim().toLowerCase() !== channel)
|
|
113
|
+
return false;
|
|
114
|
+
const sub = c?.subscribed;
|
|
115
|
+
return String(sub ?? 'false').trim().toLowerCase() === 'true';
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
function reachableBy(prefs, channel) {
|
|
119
|
+
const rb = prefs && typeof prefs === 'object' ? prefs?.reachable_by : undefined;
|
|
120
|
+
const raw = rb && typeof rb === 'object' ? rb?.[channel] : undefined;
|
|
121
|
+
return String(raw ?? '').trim().toLowerCase() === 'true';
|
|
122
|
+
}
|
|
123
|
+
function emailOk(contact) {
|
|
124
|
+
const prefs = contact.communication_preferences || {};
|
|
125
|
+
if (contact.is_subscribed === false)
|
|
126
|
+
return 0;
|
|
127
|
+
if (hasChannel(prefs, 'email'))
|
|
128
|
+
return isChannelSubscribed(prefs, 'email') ? 1 : 0;
|
|
129
|
+
if (reachableBy(prefs, 'email'))
|
|
130
|
+
return 1;
|
|
131
|
+
const email = contact.email ? String(contact.email).trim() : '';
|
|
132
|
+
return email ? 1 : 0;
|
|
133
|
+
}
|
|
134
|
+
function smsOk(contact) {
|
|
135
|
+
const prefs = contact.communication_preferences || {};
|
|
136
|
+
if (contact.is_subscribed === false)
|
|
137
|
+
return 0;
|
|
138
|
+
if (hasChannel(prefs, 'sms'))
|
|
139
|
+
return isChannelSubscribed(prefs, 'sms') ? 1 : 0;
|
|
140
|
+
if (reachableBy(prefs, 'sms'))
|
|
141
|
+
return 1;
|
|
142
|
+
const phone = contact.phone ? String(contact.phone).trim() : '';
|
|
143
|
+
return phone ? 1 : 0;
|
|
144
|
+
}
|
|
145
|
+
class RfmEngine {
|
|
146
|
+
static aggregateFromEvents(contacts, events, opts) {
|
|
147
|
+
const from = toDate(opts.from).getTime();
|
|
148
|
+
const to = toDate(opts.to).getTime();
|
|
149
|
+
const evName = String(opts.rfEventName || '').trim();
|
|
150
|
+
const filterSet = normalizeSet(opts.filterContactIds);
|
|
151
|
+
const contactById = new Map();
|
|
152
|
+
const reachyToContactId = new Map();
|
|
153
|
+
for (const c of contacts || []) {
|
|
154
|
+
const cid = c?.id ? String(c.id).trim() : '';
|
|
155
|
+
if (cid)
|
|
156
|
+
contactById.set(cid, c);
|
|
157
|
+
const rid = c?.reachy_id ? String(c.reachy_id).trim() : '';
|
|
158
|
+
if (rid && cid && !reachyToContactId.has(rid))
|
|
159
|
+
reachyToContactId.set(rid, cid);
|
|
160
|
+
}
|
|
161
|
+
const acc = new Map();
|
|
162
|
+
for (const e of events || []) {
|
|
163
|
+
const name = e?.event_name != null ? String(e.event_name) : '';
|
|
164
|
+
if (evName && name !== evName)
|
|
165
|
+
continue;
|
|
166
|
+
const ts = toDate(e.event_timestamp).getTime();
|
|
167
|
+
if (ts < from || ts > to)
|
|
168
|
+
continue;
|
|
169
|
+
const rawCid = e?.contact_id ? String(e.contact_id).trim() : '';
|
|
170
|
+
const rawRid = e?.reachy_id ? String(e.reachy_id).trim() : '';
|
|
171
|
+
if (!rawCid && !rawRid)
|
|
172
|
+
continue;
|
|
173
|
+
const mappedCid = (() => {
|
|
174
|
+
if (rawCid && contactById.has(rawCid))
|
|
175
|
+
return rawCid;
|
|
176
|
+
if (rawRid) {
|
|
177
|
+
const mapped = reachyToContactId.get(rawRid);
|
|
178
|
+
if (mapped && contactById.has(mapped))
|
|
179
|
+
return mapped;
|
|
180
|
+
}
|
|
181
|
+
return '';
|
|
182
|
+
})();
|
|
183
|
+
if (!mappedCid)
|
|
184
|
+
continue;
|
|
185
|
+
if (filterSet && !filterSet.has(mappedCid))
|
|
186
|
+
continue;
|
|
187
|
+
const cur = acc.get(mappedCid);
|
|
188
|
+
if (!cur) {
|
|
189
|
+
acc.set(mappedCid, { last: ts, count: 1 });
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
cur.count += 1;
|
|
193
|
+
if (ts > cur.last)
|
|
194
|
+
cur.last = ts;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
const out = [];
|
|
198
|
+
acc.forEach((v, contactId) => {
|
|
199
|
+
out.push({
|
|
200
|
+
contact_id: contactId,
|
|
201
|
+
last_ts: new Date(v.last),
|
|
202
|
+
event_count: Math.max(0, Math.trunc(v.count)),
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
return out;
|
|
206
|
+
}
|
|
207
|
+
static scoreAggregates(contacts, aggregates, opts) {
|
|
208
|
+
const to = toDate(opts.to);
|
|
209
|
+
const contactById = new Map();
|
|
210
|
+
for (const c of contacts || []) {
|
|
211
|
+
const cid = c?.id ? String(c.id).trim() : '';
|
|
212
|
+
if (cid)
|
|
213
|
+
contactById.set(cid, c);
|
|
214
|
+
}
|
|
215
|
+
const rows = [];
|
|
216
|
+
const recencyValues = [];
|
|
217
|
+
const freqValues = [];
|
|
218
|
+
for (const a of aggregates || []) {
|
|
219
|
+
const cid = a?.contact_id ? String(a.contact_id).trim() : '';
|
|
220
|
+
if (!cid)
|
|
221
|
+
continue;
|
|
222
|
+
if (!contactById.has(cid))
|
|
223
|
+
continue;
|
|
224
|
+
const days = recencyDays(to, a.last_ts);
|
|
225
|
+
rows.push({ agg: a, days });
|
|
226
|
+
recencyValues.push(days);
|
|
227
|
+
freqValues.push(Math.max(0, Math.trunc(a.event_count)));
|
|
228
|
+
}
|
|
229
|
+
const rCuts = percentileDiscCuts(recencyValues);
|
|
230
|
+
const fCuts = percentileDiscCuts(freqValues);
|
|
231
|
+
const scored = [];
|
|
232
|
+
for (const r of rows) {
|
|
233
|
+
const c = contactById.get(r.agg.contact_id);
|
|
234
|
+
const rScore = scoreRecency(r.days, rCuts);
|
|
235
|
+
const fScore = scoreFrequency(Math.max(0, Math.trunc(r.agg.event_count)), fCuts);
|
|
236
|
+
scored.push({
|
|
237
|
+
contact_id: r.agg.contact_id,
|
|
238
|
+
last_ts: r.agg.last_ts,
|
|
239
|
+
event_count: Math.max(0, Math.trunc(r.agg.event_count)),
|
|
240
|
+
recency_days: r.days,
|
|
241
|
+
r_score: rScore,
|
|
242
|
+
f_score: fScore,
|
|
243
|
+
segment_key: computeSegmentKey(rScore, fScore),
|
|
244
|
+
email_ok: emailOk(c),
|
|
245
|
+
sms_ok: smsOk(c),
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
return { scored, r_days_cuts: rCuts, f_count_cuts: fCuts };
|
|
249
|
+
}
|
|
250
|
+
static thresholdsFromScored(scored) {
|
|
251
|
+
const rMin = new Map();
|
|
252
|
+
const rMax = new Map();
|
|
253
|
+
const fMin = new Map();
|
|
254
|
+
const fMax = new Map();
|
|
255
|
+
for (const s of scored || []) {
|
|
256
|
+
const rScore = s.r_score;
|
|
257
|
+
const fScore = s.f_score;
|
|
258
|
+
const rVal = Math.max(0, Math.trunc(s.recency_days));
|
|
259
|
+
const fVal = Math.max(0, Math.trunc(s.event_count));
|
|
260
|
+
const rMinPrev = rMin.get(rScore);
|
|
261
|
+
if (rMinPrev == null || rVal < rMinPrev)
|
|
262
|
+
rMin.set(rScore, rVal);
|
|
263
|
+
const rMaxPrev = rMax.get(rScore);
|
|
264
|
+
if (rMaxPrev == null || rVal > rMaxPrev)
|
|
265
|
+
rMax.set(rScore, rVal);
|
|
266
|
+
const fMinPrev = fMin.get(fScore);
|
|
267
|
+
if (fMinPrev == null || fVal < fMinPrev)
|
|
268
|
+
fMin.set(fScore, fVal);
|
|
269
|
+
const fMaxPrev = fMax.get(fScore);
|
|
270
|
+
if (fMaxPrev == null || fVal > fMaxPrev)
|
|
271
|
+
fMax.set(fScore, fVal);
|
|
272
|
+
}
|
|
273
|
+
const out = [];
|
|
274
|
+
const scores = [1, 2, 3, 4, 5];
|
|
275
|
+
for (const score of scores) {
|
|
276
|
+
if (rMin.has(score) && rMax.has(score)) {
|
|
277
|
+
out.push({
|
|
278
|
+
kind: 'r',
|
|
279
|
+
score,
|
|
280
|
+
min_value: rMin.get(score),
|
|
281
|
+
max_value: rMax.get(score),
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
for (const score of scores) {
|
|
286
|
+
if (fMin.has(score) && fMax.has(score)) {
|
|
287
|
+
out.push({
|
|
288
|
+
kind: 'f',
|
|
289
|
+
score,
|
|
290
|
+
min_value: fMin.get(score),
|
|
291
|
+
max_value: fMax.get(score),
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
out.sort((a, b) => (a.kind === b.kind ? a.score - b.score : a.kind.localeCompare(b.kind)));
|
|
296
|
+
return out;
|
|
297
|
+
}
|
|
298
|
+
static previewFromScored(scored) {
|
|
299
|
+
const totalUsers = scored.length;
|
|
300
|
+
const agg = new Map();
|
|
301
|
+
for (const s of scored || []) {
|
|
302
|
+
const key = String(s.segment_key || '').trim() || 'hibernating';
|
|
303
|
+
const cur = agg.get(key) || { users: 0, email_reachability: 0, sms_reachability: 0, segment_spend: 0 };
|
|
304
|
+
cur.users += 1;
|
|
305
|
+
cur.email_reachability += s.email_ok;
|
|
306
|
+
cur.sms_reachability += s.sms_ok;
|
|
307
|
+
agg.set(key, cur);
|
|
308
|
+
}
|
|
309
|
+
const out = [];
|
|
310
|
+
for (const seg of SEGMENTS_REF) {
|
|
311
|
+
const a = agg.get(seg.segment_key) || { users: 0, email_reachability: 0, sms_reachability: 0, segment_spend: 0 };
|
|
312
|
+
const percent = totalUsers > 0 ? Math.round((a.users * 10000) / totalUsers) / 100 : 0;
|
|
313
|
+
const avm = a.users > 0 ? 0 : 0;
|
|
314
|
+
out.push({
|
|
315
|
+
segment_key: seg.segment_key,
|
|
316
|
+
segment_name: seg.segment_name,
|
|
317
|
+
users: a.users,
|
|
318
|
+
percent,
|
|
319
|
+
avm,
|
|
320
|
+
email_reachability: a.email_reachability,
|
|
321
|
+
sms_reachability: a.sms_reachability,
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
return out;
|
|
325
|
+
}
|
|
326
|
+
static computeFromEvents(contacts, events, opts) {
|
|
327
|
+
const aggregates = this.aggregateFromEvents(contacts, events, opts);
|
|
328
|
+
const { scored } = this.scoreAggregates(contacts, aggregates, { to: opts.to });
|
|
329
|
+
const thresholds = this.thresholdsFromScored(scored);
|
|
330
|
+
const segments = this.previewFromScored(scored);
|
|
331
|
+
return { segments, thresholds, scored };
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
exports.RfmEngine = RfmEngine;
|
|
335
|
+
//# sourceMappingURL=RfmEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RfmEngine.js","sourceRoot":"","sources":["../../src/engine/RfmEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"V2AudienceEngine.d.ts","sourceRoot":"","sources":["../../src/engine/V2AudienceEngine.ts"],"names":[],"mappings":"AAGA,KAAK,MAAM,GAAG;IACZ,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;IAC7B,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;IAC9B,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;CAChC,CAAA;AAgRD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAQ;gBAEV,MAAM,EAAE;QAAE,cAAc,EAAE,GAAG,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IAMvE,iCAAiC,CACrC,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,GAAG,GACf,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"V2AudienceEngine.d.ts","sourceRoot":"","sources":["../../src/engine/V2AudienceEngine.ts"],"names":[],"mappings":"AAGA,KAAK,MAAM,GAAG;IACZ,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;IAC7B,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;IAC9B,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;CAChC,CAAA;AAgRD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAQ;gBAEV,MAAM,EAAE;QAAE,cAAc,EAAE,GAAG,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IAMvE,iCAAiC,CACrC,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,GAAG,GACf,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IA05BjB,kCAAkC,CACtC,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,GAAG,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC;IAwqBnB,OAAO,CAAC,IAAI;CAIb"}
|
|
@@ -351,11 +351,27 @@ class V2AudienceEngine {
|
|
|
351
351
|
return new Set();
|
|
352
352
|
}
|
|
353
353
|
const typeId = String(criteria?.type || '');
|
|
354
|
-
const
|
|
354
|
+
const fetchAll = async (baseQuery, pageSize) => {
|
|
355
|
+
let offset = 0;
|
|
356
|
+
let out = [];
|
|
357
|
+
while (true) {
|
|
358
|
+
const { data, error } = await baseQuery.range(offset, offset + pageSize - 1);
|
|
359
|
+
if (error)
|
|
360
|
+
throw error;
|
|
361
|
+
if (!data || data.length === 0)
|
|
362
|
+
break;
|
|
363
|
+
out = out.concat(data);
|
|
364
|
+
if (data.length < pageSize)
|
|
365
|
+
break;
|
|
366
|
+
offset += pageSize;
|
|
367
|
+
}
|
|
368
|
+
return out;
|
|
369
|
+
};
|
|
370
|
+
const allContacts = await fetchAll(this.supabase
|
|
355
371
|
.from('contacts')
|
|
356
372
|
.select('id, reachy_id, email')
|
|
357
373
|
.eq('organization_id', organizationId)
|
|
358
|
-
.eq('project_id', projectId);
|
|
374
|
+
.eq('project_id', projectId), 1000);
|
|
359
375
|
const allContactIds = new Set((allContacts || []).map((c) => c.id));
|
|
360
376
|
const reachyIdToContactId = new Map();
|
|
361
377
|
const contactIdToReachyId = new Map();
|
|
@@ -606,10 +622,10 @@ class V2AudienceEngine {
|
|
|
606
622
|
if (this.debug)
|
|
607
623
|
this.logger.warn('[AUDIENCE_MODULE_ENGINE] event attributes filter error');
|
|
608
624
|
}
|
|
609
|
-
const
|
|
610
|
-
if (
|
|
625
|
+
const data = await fetchAll(query, 500);
|
|
626
|
+
if (!data || data.length === 0)
|
|
611
627
|
return new Set();
|
|
612
|
-
let rows =
|
|
628
|
+
let rows = data;
|
|
613
629
|
const ruleFiltersAll = Array.isArray(rule.filters) ? rule.filters : [];
|
|
614
630
|
const hasFirstTime = ruleFiltersAll.some((f) => String(f?.type || '').trim() === 'first_time');
|
|
615
631
|
const hasLastTime = ruleFiltersAll.some((f) => String(f?.type || '').trim() === 'last_time');
|
|
@@ -959,11 +975,11 @@ class V2AudienceEngine {
|
|
|
959
975
|
if (op === 'between' && a > b)
|
|
960
976
|
return new Set();
|
|
961
977
|
query = query.not(dbField, 'is', null).neq(dbField, '');
|
|
962
|
-
const
|
|
963
|
-
if (
|
|
978
|
+
const data = await fetchAll(query, 1000);
|
|
979
|
+
if (!data || data.length === 0)
|
|
964
980
|
return new Set();
|
|
965
981
|
const res = new Set();
|
|
966
|
-
for (const row of
|
|
982
|
+
for (const row of data) {
|
|
967
983
|
const raw = row?.properties?.[field];
|
|
968
984
|
const n = Number(raw);
|
|
969
985
|
if (!Number.isFinite(n))
|
|
@@ -982,13 +998,13 @@ class V2AudienceEngine {
|
|
|
982
998
|
return res;
|
|
983
999
|
}
|
|
984
1000
|
if (shouldManualJsonbNegation) {
|
|
985
|
-
const
|
|
986
|
-
if (
|
|
1001
|
+
const data = await fetchAll(query, 1000);
|
|
1002
|
+
if (!data || data.length === 0)
|
|
987
1003
|
return new Set();
|
|
988
1004
|
const expected = value == null ? '' : String(value);
|
|
989
1005
|
const expectedLower = expected.toLowerCase();
|
|
990
1006
|
const res = new Set();
|
|
991
|
-
for (const row of
|
|
1007
|
+
for (const row of data) {
|
|
992
1008
|
const raw = row?.properties?.[field];
|
|
993
1009
|
const id = row?.id;
|
|
994
1010
|
if (!id)
|
|
@@ -1187,10 +1203,10 @@ class V2AudienceEngine {
|
|
|
1187
1203
|
}
|
|
1188
1204
|
};
|
|
1189
1205
|
apply(dbField, isJsonb);
|
|
1190
|
-
const
|
|
1191
|
-
if (
|
|
1206
|
+
const data = await fetchAll(query, 1000);
|
|
1207
|
+
if (!data || data.length === 0)
|
|
1192
1208
|
return new Set();
|
|
1193
|
-
return new Set(
|
|
1209
|
+
return new Set(data.map((r) => r.id));
|
|
1194
1210
|
};
|
|
1195
1211
|
const evalGroup = async (group) => {
|
|
1196
1212
|
let acc = null;
|