@voltro/plugin-duckdb 0.33.0 → 0.35.0

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.
Files changed (3) hide show
  1. package/CHANGELOG.md +1968 -0
  2. package/dist/index.js +40 -18
  3. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -54,38 +54,60 @@ var r = "duckdb", i = "voltro_events", a = null, o = () => a === null ? e.tryPro
54
54
  params: l,
55
55
  types: u
56
56
  };
57
- }, C = (t, n, r) => {
57
+ }, C = (e, t, n, r, i) => [
58
+ `INSERT INTO ${e} (id, data, version, is_deleted) VALUES (?, ?::JSON, ?::BIGINT, ?) ON CONFLICT (id) DO UPDATE SET data = EXCLUDED.data, version = EXCLUDED.version, is_deleted = EXCLUDED.is_deleted WHERE EXCLUDED.version > ${e}.version`,
59
+ [
60
+ t,
61
+ n,
62
+ String(r),
63
+ i
64
+ ],
65
+ [
66
+ a.VARCHAR,
67
+ a.VARCHAR,
68
+ a.VARCHAR,
69
+ a.BOOLEAN
70
+ ]
71
+ ], w = (t, n, r) => {
58
72
  let i = /* @__PURE__ */ new Set(), o = (n, r) => e.gen(function* () {
59
73
  if (i.has(r)) return;
60
74
  u(n, r, "mirror table name");
61
75
  let a = yield* g(t), o = c(r);
62
76
  yield* e.tryPromise({
63
- try: () => a.run(`CREATE TABLE IF NOT EXISTS ${o} (id VARCHAR PRIMARY KEY, data JSON NOT NULL)`),
77
+ try: () => a.run(`CREATE TABLE IF NOT EXISTS ${o} (id VARCHAR PRIMARY KEY, data JSON NOT NULL, version BIGINT NOT NULL DEFAULT 0, is_deleted BOOLEAN NOT NULL DEFAULT false)`),
64
78
  catch: (e) => e
65
79
  }), i.add(r);
66
80
  });
67
81
  return {
68
82
  tables: n,
69
83
  primaryKey: r,
70
- upsert: (n, i) => e.gen(function* () {
84
+ upsert: ({ table: n, row: i, version: a }) => e.gen(function* () {
71
85
  yield* o("mirror.upsert", n);
72
- let s = yield* g(t), { VARCHAR: l } = a, u = c(n), d = String(i[r]), f = JSON.stringify(i);
86
+ let s = yield* g(t), l = c(n), u = String(i[r]);
73
87
  yield* e.tryPromise({
74
- try: () => s.run(`INSERT INTO ${u} (id, data) VALUES (?, ?::JSON) ON CONFLICT (id) DO UPDATE SET data = EXCLUDED.data`, [d, f], [l, l]),
88
+ try: () => s.run(...C(l, u, JSON.stringify(i), a, !1)),
75
89
  catch: (e) => e
76
90
  });
77
91
  }).pipe(h("mirror.upsert")),
78
- remove: (n, r) => e.gen(function* () {
92
+ remove: ({ table: n, primaryKeyValue: r, version: i }) => e.gen(function* () {
79
93
  yield* o("mirror.remove", n);
80
- let i = yield* g(t), { VARCHAR: s } = a, l = c(n), u = String(r);
94
+ let a = yield* g(t), s = c(n), l = String(r);
81
95
  yield* e.tryPromise({
82
- try: () => i.run(`DELETE FROM ${l} WHERE id = ?`, [u], [s]),
96
+ try: () => a.run(...C(s, l, "{}", i, !0)),
83
97
  catch: (e) => e
84
98
  });
85
- }).pipe(h("mirror.remove"))
99
+ }).pipe(h("mirror.remove")),
100
+ maxVersion: ({ table: n, primaryKeyValue: r }) => e.gen(function* () {
101
+ yield* o("mirror.maxVersion", n);
102
+ let i = yield* g(t), s = c(n), l = (yield* e.tryPromise({
103
+ try: () => i.runAndReadAll(`SELECT version FROM ${s} WHERE id = ?`, [String(r)], [a.VARCHAR]),
104
+ catch: (e) => e
105
+ })).getRowObjectsJS()[0]?.version;
106
+ return l == null ? null : Number(l);
107
+ }).pipe(h("mirror.maxVersion"))
86
108
  };
87
- }, w = (t, n) => {
88
- let o = n.mirrorTables ?? [], c = o.length > 0 ? C(t, o, n.mirrorPrimaryKey ?? "id") : void 0;
109
+ }, T = (t, n) => {
110
+ let o = n.mirrorTables ?? [], c = o.length > 0 ? w(t, o, n.mirrorPrimaryKey ?? "id") : void 0;
89
111
  return {
90
112
  info: {
91
113
  provider: r,
@@ -162,7 +184,7 @@ var r = "duckdb", i = "voltro_events", a = null, o = () => a === null ? e.tryPro
162
184
  }).pipe(h("topN")),
163
185
  ...c === void 0 ? {} : { mirror: c }
164
186
  };
165
- }, T = (t, i) => e.gen(function* () {
187
+ }, E = (t, i) => e.gen(function* () {
166
188
  if (t.conn !== null) return;
167
189
  let a = yield* o(), s = yield* e.tryPromise({
168
190
  try: async () => {
@@ -179,7 +201,7 @@ var r = "duckdb", i = "voltro_events", a = null, o = () => a === null ? e.tryPro
179
201
  })
180
202
  });
181
203
  t.instance = s.instance, t.conn = s.connection;
182
- }), E = (t) => e.gen(function* () {
204
+ }), D = (t) => e.gen(function* () {
183
205
  let { conn: n, instance: i } = t;
184
206
  t.conn = null, t.instance = null, !(n === null && i === null) && (yield* e.try(() => {
185
207
  n?.closeSync(), i?.closeSync();
@@ -187,17 +209,17 @@ var r = "duckdb", i = "voltro_events", a = null, o = () => a === null ? e.tryPro
187
209
  provider: r,
188
210
  err: t
189
211
  }))));
190
- }), D = (e = {}) => {
212
+ }), O = (e = {}) => {
191
213
  let t = {
192
214
  conn: null,
193
215
  instance: null
194
216
  };
195
217
  return {
196
218
  kind: "duckdb",
197
- build: (n) => w(t, e),
198
- initialize: () => T(t, e),
199
- dispose: () => E(t)
219
+ build: (n) => T(t, e),
220
+ initialize: () => E(t, e),
221
+ dispose: () => D(t)
200
222
  };
201
223
  };
202
224
  //#endregion
203
- export { D as duckdbAnalytics };
225
+ export { O as duckdbAnalytics };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voltro/plugin-duckdb",
3
- "version": "0.33.0",
3
+ "version": "0.35.0",
4
4
  "description": "Embedded DuckDB AnalyticsSink. Runs DuckDB in-process for real OLAP performance without an external service. Events land in a DuckDB column-store table; aggregate / timeseries / topN queries execute vectorized.",
5
5
  "keywords": [
6
6
  "voltro",
@@ -33,7 +33,7 @@
33
33
  "node": ">=24.0.0"
34
34
  },
35
35
  "dependencies": {
36
- "@voltro/runtime": "0.33.0"
36
+ "@voltro/runtime": "0.35.0"
37
37
  },
38
38
  "optionalDependencies": {
39
39
  "@duckdb/node-api": "1.5.5-r.2"