Skip to content

Commit 0165217

Browse files
authored
Merge pull request #271 from rush-db/feat/merge-upsert-imports
Add merge/upsert functionality
2 parents c93a45f + dbe720f commit 0165217

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+2308
-312
lines changed

.changeset/lovely-panthers-drop.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
'@rushdb/javascript-sdk': minor
3+
'@rushdb/mcp-server': minor
4+
'rushdb-dashboard': minor
5+
'rushdb-core': minor
6+
'rushdb-website': minor
7+
'rushdb-docs': minor
8+
---
9+
10+
Add merge/upsert for bulk importing or single record creation

docs/docs/mcp-server/tools.mdx

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,18 @@ Arguments:
122122
| label | string | yes || Label for the record |
123123
| data | object | yes || Record data to insert |
124124
| transactionId | string | no || Optional transaction ID for atomic creation |
125+
| options.mergeStrategy | `append|rewrite` | no | append | Upsert strategy: `append` keeps unspecified existing properties; `rewrite` replaces existing property relations |
126+
| options.mergeBy | array of strings | no | all keys (if empty array provided) | Fields used to match an existing record. Presence (even empty array) triggers upsert semantics |
127+
128+
Upsert behavior:
129+
- Provide either `options.mergeStrategy` or `options.mergeBy` (or both) to switch from pure create to upsert.
130+
- If `mergeBy` is omitted and `mergeStrategy` is present, all incoming keys are used to match.
131+
- Empty `mergeBy: []` explicitly means "use all keys".
132+
- `append` merges new properties while retaining existing unspecified ones; `rewrite` deletes prior property value relationships first.
125133

126134
Example prompt:
127135

128-
> Call `CreateRecord` with `label="Task"` and `data={"title":"Write docs","status":"open"}`.
136+
> Call `CreateRecord` with `label="User"`, `data={"email":"[email protected]","name":"Ann"}`, and `options={"mergeBy":["email"],"mergeStrategy":"append"}` to upsert by email.
129137
130138
---
131139

@@ -342,12 +350,20 @@ Arguments:
342350
| Name | Type | Required | Default | Description |
343351
|---------------|------------------|----------|---------|-------------|
344352
| label | string | yes || Label for all records |
345-
| data | array of objects | yes || Array of record payloads |
353+
| data | array of objects | yes || Array of record payloads (flat objects use batch create; nested objects use JSON import path) |
346354
| transactionId | string | no || Optional transaction ID |
355+
| options.mergeStrategy | `append|rewrite` | no | append | Upsert strategy applied globally: `append` merges, `rewrite` replaces existing property relations |
356+
| options.mergeBy | array of strings | no | all keys (if empty array) | Global match fields; empty array means all keys per record; presence triggers upsert |
357+
| options.returnResult | boolean | no | true | Return created/upserted records (IDs always returned separately) |
358+
359+
Upsert notes:
360+
- Same semantics as `CreateRecord`, but applied across the batch.
361+
- If records are flat objects, uses the `createMany` path; otherwise falls back to JSON import BFS with upsert.
362+
- For large batches consider reducing the size or increasing transaction TTL if timeouts occur.
347363

348364
Example prompt:
349365

350-
> Call `BulkCreateRecords` for `label="Task"` with `data=[{"title":"A"},{"title":"B"}]`.
366+
> Call `BulkCreateRecords` for `label="User"` with `data=[{"email":"[email protected]","name":"Ann"},{"email":"[email protected]","name":"Bill"}]` and `options={"mergeBy":["email"],"mergeStrategy":"append"}`.
351367
352368
---
353369

0 commit comments

Comments
 (0)