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" ;
33import {
44 DEFAULT_MAX_NODE_SIZE ,
55 deleteHandler ,
66 getOrCreateTree ,
77 getTree ,
88 insertHandler ,
9+ type Key ,
10+ type Namespace ,
911} from "./btree.js" ;
1012import { internal } from "./_generated/api.js" ;
13+ import type { Doc } from "./_generated/dataModel.js" ;
1114
1215export 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
95120export 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+
109140export 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