Skip to content

Commit 0d25f49

Browse files
committed
refactor more operations to share code
1 parent 9e41724 commit 0d25f49

3 files changed

Lines changed: 100 additions & 140 deletions

File tree

src/client/index.ts

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,6 @@ type BufferedOperation =
7171
summand?: number;
7272
namespace?: any;
7373
newNamespace?: any;
74-
}
75-
| {
76-
type: "insertIfDoesNotExist";
77-
key: any;
78-
value: any;
79-
summand?: number;
80-
namespace?: any;
8174
};
8275

8376
/**
@@ -556,16 +549,6 @@ export class Aggregate<
556549
id: ID,
557550
summand?: number,
558551
): Promise<void> {
559-
if (this.isBuffering) {
560-
this.operationQueue.push({
561-
type: "insertIfDoesNotExist",
562-
key: keyToPosition(key, id),
563-
value: id,
564-
summand,
565-
namespace,
566-
});
567-
return;
568-
}
569552
await this._replaceOrInsert(
570553
ctx,
571554
namespace,

src/component/_generated/component.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -202,13 +202,6 @@ export type ComponentApi<Name extends string | undefined = string | undefined> =
202202
type: "replaceOrInsert";
203203
value: any;
204204
}
205-
| {
206-
key: any;
207-
namespace?: any;
208-
summand?: number;
209-
type: "insertIfDoesNotExist";
210-
value: any;
211-
}
212205
>;
213206
},
214207
null,

src/component/public.ts

Lines changed: 100 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
1-
import { ConvexError, v } from "convex/values";
2-
import { mutation } from "./_generated/server.js";
1+
import { ConvexError, v, type Value } from "convex/values";
2+
import { mutation, type DatabaseWriter } from "./_generated/server.js";
33
import {
44
DEFAULT_MAX_NODE_SIZE,
55
deleteHandler,
66
getOrCreateTree,
77
getTree,
88
insertHandler,
9+
type Key,
10+
type Namespace,
911
} from "./btree.js";
1012
import { internal } from "./_generated/api.js";
13+
import type { Doc } from "./_generated/dataModel.js";
1114

1215
export const init = mutation({
1316
args: {
@@ -78,34 +81,62 @@ export const replace = mutation({
7881
newNamespace: v.optional(v.any()),
7982
},
8083
returns: v.null(),
81-
handler: async (ctx, args) => {
82-
await deleteHandler(ctx, {
84+
handler: replaceHandler,
85+
});
86+
87+
async function replaceHandler(
88+
ctx: { db: DatabaseWriter },
89+
args: {
90+
currentKey: Key;
91+
newKey: Key;
92+
value: Value;
93+
summand?: number;
94+
namespace?: Namespace;
95+
newNamespace?: Namespace;
96+
},
97+
treeArg?: Doc<"btree">,
98+
newTreeArg?: Doc<"btree">,
99+
) {
100+
await deleteHandler(
101+
ctx,
102+
{
83103
key: args.currentKey,
84104
namespace: args.namespace,
85-
});
86-
await insertHandler(ctx, {
105+
},
106+
treeArg,
107+
);
108+
await insertHandler(
109+
ctx,
110+
{
87111
key: args.newKey,
88112
value: args.value,
89113
summand: args.summand,
90114
namespace: args.newNamespace,
91-
});
92-
},
93-
});
115+
},
116+
newTreeArg,
117+
);
118+
}
94119

95120
export const deleteIfExists = mutation({
96121
args: { key: v.any(), namespace: v.optional(v.any()) },
97-
handler: async (ctx, { key, namespace }) => {
98-
try {
99-
await deleteHandler(ctx, { key, namespace });
100-
} catch (e) {
101-
if (e instanceof ConvexError && e.data?.code === "DELETE_MISSING_KEY") {
102-
return;
103-
}
104-
throw e;
105-
}
106-
},
122+
handler: deleteIfExistsHandler,
107123
});
108124

125+
async function deleteIfExistsHandler(
126+
ctx: { db: DatabaseWriter },
127+
args: { key: Key; namespace?: Namespace },
128+
treeArg?: Doc<"btree">,
129+
) {
130+
try {
131+
await deleteHandler(ctx, args, treeArg);
132+
} catch (e) {
133+
if (e instanceof ConvexError && e.data?.code === "DELETE_MISSING_KEY") {
134+
return;
135+
}
136+
throw e;
137+
}
138+
}
139+
109140
export const replaceOrInsert = mutation({
110141
args: {
111142
currentKey: v.any(),
@@ -115,27 +146,47 @@ export const replaceOrInsert = mutation({
115146
namespace: v.optional(v.any()),
116147
newNamespace: v.optional(v.any()),
117148
},
118-
handler: async (ctx, args) => {
119-
try {
120-
await deleteHandler(ctx, {
149+
handler: replaceOrInsertHandler,
150+
});
151+
152+
async function replaceOrInsertHandler(
153+
ctx: { db: DatabaseWriter },
154+
args: {
155+
currentKey: Key;
156+
newKey: Key;
157+
value: Value;
158+
summand?: number;
159+
namespace?: Namespace;
160+
newNamespace?: Namespace;
161+
},
162+
treeArg?: Doc<"btree">,
163+
newTreeArg?: Doc<"btree">,
164+
) {
165+
try {
166+
await deleteHandler(
167+
ctx,
168+
{
121169
key: args.currentKey,
122170
namespace: args.namespace,
123-
});
124-
} catch (e) {
125-
if (
126-
!(e instanceof ConvexError && e.data?.code === "DELETE_MISSING_KEY")
127-
) {
128-
throw e;
129-
}
171+
},
172+
treeArg,
173+
);
174+
} catch (e) {
175+
if (!(e instanceof ConvexError && e.data?.code === "DELETE_MISSING_KEY")) {
176+
throw e;
130177
}
131-
await insertHandler(ctx, {
178+
}
179+
await insertHandler(
180+
ctx,
181+
{
132182
key: args.newKey,
133183
value: args.value,
134184
summand: args.summand,
135185
namespace: args.newNamespace,
136-
});
137-
},
138-
});
186+
},
187+
newTreeArg,
188+
);
189+
}
139190

140191
/**
141192
* Reinitialize the aggregate data structure, clearing all data.
@@ -215,13 +266,6 @@ export const batch = mutation({
215266
namespace: v.optional(v.any()),
216267
newNamespace: v.optional(v.any()),
217268
}),
218-
v.object({
219-
type: v.literal("insertIfDoesNotExist"),
220-
key: v.any(),
221-
value: v.any(),
222-
summand: v.optional(v.number()),
223-
namespace: v.optional(v.any()),
224-
}),
225269
),
226270
),
227271
},
@@ -271,102 +315,42 @@ export const batch = mutation({
271315
} else if (op.type === "replace") {
272316
// Handle delete from original namespace
273317
const deleteTree = await getTreeForNamespace(op.namespace);
274-
await deleteHandler(
275-
ctx,
276-
{
277-
key: op.currentKey,
278-
namespace: op.namespace,
279-
},
280-
deleteTree,
281-
);
282318
// Handle insert to new namespace (which might be different)
283319
const insertTree = await getTreeForNamespace(op.newNamespace);
284-
await insertHandler(
320+
await replaceHandler(
285321
ctx,
286322
{
287-
key: op.newKey,
323+
currentKey: op.currentKey,
324+
newKey: op.newKey,
288325
value: op.value,
289326
summand: op.summand,
290-
namespace: op.newNamespace,
291327
},
328+
deleteTree,
292329
insertTree,
293330
);
294331
} else if (op.type === "deleteIfExists") {
295332
const tree = await getTreeForNamespace(op.namespace);
296-
try {
297-
await deleteHandler(
298-
ctx,
299-
{ key: op.key, namespace: op.namespace },
300-
tree,
301-
);
302-
} catch (e) {
303-
if (
304-
e instanceof ConvexError &&
305-
e.data?.code === "DELETE_MISSING_KEY"
306-
) {
307-
continue;
308-
}
309-
throw e;
310-
}
333+
await deleteIfExistsHandler(
334+
ctx,
335+
{ key: op.key, namespace: op.namespace },
336+
tree,
337+
);
311338
} else if (op.type === "replaceOrInsert") {
312339
// Handle delete from original namespace
313340
const deleteTree = await getTreeForNamespace(op.namespace);
314-
try {
315-
await deleteHandler(
316-
ctx,
317-
{
318-
key: op.currentKey,
319-
namespace: op.namespace,
320-
},
321-
deleteTree,
322-
);
323-
} catch (e) {
324-
if (
325-
!(e instanceof ConvexError && e.data?.code === "DELETE_MISSING_KEY")
326-
) {
327-
throw e;
328-
}
329-
}
330-
// Handle insert to new namespace (which might be different)
331-
const insertTree = await getTreeForNamespace(op.newNamespace);
332-
await insertHandler(
333-
ctx,
334-
{
335-
key: op.newKey,
336-
value: op.value,
337-
summand: op.summand,
338-
namespace: op.newNamespace,
339-
},
340-
insertTree,
341-
);
342-
} else if (op.type === "insertIfDoesNotExist") {
343-
const tree = await getTreeForNamespace(op.namespace);
344-
// insertIfDoesNotExist is implemented as replaceOrInsert
345-
try {
346-
await deleteHandler(
347-
ctx,
348-
{
349-
key: op.key,
350-
namespace: op.namespace,
351-
},
352-
tree,
353-
);
354-
} catch (e) {
355-
if (
356-
!(e instanceof ConvexError && e.data?.code === "DELETE_MISSING_KEY")
357-
) {
358-
throw e;
359-
}
360-
}
361-
await insertHandler(
341+
const newTree = await getTreeForNamespace(op.newNamespace);
342+
await replaceOrInsertHandler(
362343
ctx,
363344
{
364-
key: op.key,
345+
currentKey: op.currentKey,
346+
newKey: op.newKey,
365347
value: op.value,
366348
summand: op.summand,
367349
namespace: op.namespace,
350+
newNamespace: op.newNamespace,
368351
},
369-
tree,
352+
deleteTree,
353+
newTree,
370354
);
371355
}
372356
}

0 commit comments

Comments
 (0)