@lokalise/prisma-utils 7.0.0 → 7.0.1

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/README.md CHANGED
@@ -154,10 +154,10 @@ import { prismaBulkUpdate } from '@lokalise/prisma-utils'
154
154
 
155
155
  await prismaBulkUpdate(prisma, 'segment', {
156
156
  dbDriver: 'CockroachDb',
157
- typeByColumn: { id: 'uuid', value: 'text', words_count: 'int4' },
157
+ typeByColumn: { project_id: 'uuid', id: 'uuid', value: 'text', words_count: 'int4' },
158
158
  }, [
159
- { where: { id: id1 }, data: { value: 'a', words_count: 1 } },
160
- { where: { id: id2 }, data: { value: 'b', words_count: 2 } },
159
+ { where: { project_id: projectId, id: id1 }, data: { value: 'a', words_count: 1 } },
160
+ { where: { project_id: projectId, id: id2 }, data: { value: 'b', words_count: 2 } },
161
161
  ])
162
162
  ```
163
163
 
@@ -168,9 +168,11 @@ UPDATE "segment"
168
168
  SET "value" = updates."value"::text, "words_count" = updates."words_count"::int4
169
169
  FROM (VALUES ($1::uuid, $2::text, $3::int4), ($4::uuid, $5::text, $6::int4))
170
170
  AS updates("id", "value", "words_count")
171
- WHERE "segment"."id" = updates."id"::uuid
171
+ WHERE "segment"."project_id" = $7::uuid AND "segment"."id" = updates."id"::uuid
172
172
  ```
173
173
 
174
+ `project_id` has the same value on every entry, so it is emitted as a constant predicate instead of a `VALUES` column (see "Constant `where` columns" below).
175
+
174
176
  #### Parameters
175
177
 
176
178
  - **`prisma`** — a Prisma client or a transaction client (e.g. the `tx` passed to `prismaTransaction`'s callback).
@@ -200,5 +202,6 @@ const updated = await prismaBulkUpdate<{ id: string; value: string }>(
200
202
  )
201
203
  ```
202
204
 
203
- - **Limits** — at most 1000 entries per call, and the total bound parameters (`entries × (where columns + data columns)`) must not exceed 65535 — the shared protocol limit for PostgreSQL and CockroachDB. Both are validated up front. A column may not appear in both `where` and `data`.
205
+ - **Constant `where` columns**: a `where` column whose value is the same on every entry becomes `"tbl"."col" = $n::type` instead of a `VALUES` column. With a tenant column such as `project_id` joined from `VALUES`, CockroachDB can pick a lookup join on a primary key that starts with it and read every row of the tenant; as a constant, the planner uses the index on the other key. A value counts as the same only when it is a string, number, boolean or bigint and is `===` to the first entry's value; `null`, `Date`, `Buffer` and objects stay in `VALUES`. When every `where` column is constant, `VALUES` holds only the `data` columns.
206
+ - **Limits**: at most 1000 entries per call, and the total bound parameters (`entries × (VALUES where columns + data columns) + constant where columns`) must not exceed 65535, the shared protocol limit for PostgreSQL and CockroachDB. Both are validated up front. A column may not appear in both `where` and `data`.
204
207
  - **Trusted identifiers** — `tableName`, all column names, the column types, and the `returning` keys/aliases are interpolated as raw SQL identifiers (only row values are bound). They must be static, trusted configuration, never end-user input.
@@ -9,18 +9,27 @@ import type { BulkUpdateEntry, PrismaBulkUpdateOptions } from './types.ts';
9
9
  *
10
10
  * The executed query follows the below structure for provided example data:
11
11
  * [
12
- * { where: { id: 1 }, data: { col1: 11, col2: 12 } },
13
- * { where: { id: 2 }, data: { col1: 21, col2: 22 } },
12
+ * { where: { tenant_id: 7, id: 1 }, data: { col1: 11, col2: 12 } },
13
+ * { where: { tenant_id: 7, id: 2 }, data: { col1: 21, col2: 22 } },
14
14
  * ]
15
15
  *
16
16
  * UPDATE "tbl"
17
- * SET "col1" = updates."col1", "col2" = updates."col2"
17
+ * SET "col1" = updates."col1"::int4, "col2" = updates."col2"::int4
18
18
  * FROM (
19
19
  * VALUES
20
- * (1, 11, 12),
21
- * (2, 21, 22)
20
+ * ($1::int4, $2::int4, $3::int4),
21
+ * ($4::int4, $5::int4, $6::int4)
22
22
  * ) AS updates("id", "col1", "col2")
23
- * WHERE "tbl"."id" = updates."id"
23
+ * WHERE "tbl"."tenant_id" = $7::int4 AND "tbl"."id" = updates."id"::int4
24
+ *
25
+ * A "where" column whose value is the same on every entry (`tenant_id` above) is
26
+ * emitted as a constant predicate instead of a `VALUES` column. Joining a tenant
27
+ * column from `VALUES` lets CockroachDB plan a lookup join on a primary key that
28
+ * starts with it and read every row of the tenant; a constant lets it use the
29
+ * index on the other key. A value counts as the same only when it is a string,
30
+ * number, boolean or bigint and is `===` to the first entry's value. Anything else
31
+ * (`null`, `Date`, `Buffer`, objects) stays in `VALUES`. When every "where" column
32
+ * is constant, `VALUES` holds only the "data" columns.
24
33
  *
25
34
  * "data" values follow Prisma's convention: an `undefined` value leaves the
26
35
  * column untouched (it is dropped from the statement), while `null` sets it to
@@ -1,13 +1,15 @@
1
1
  import { join, raw, sqltag as sql } from '@prisma/client/runtime/client';
2
2
  const JSON_COLUMN_TYPES = new Set(['json', 'jsonb']);
3
+ // `typeof` results for which `a === b` guarantees both bind to the same SQL value.
4
+ const COMPARABLE_VALUE_TYPES = new Set(['string', 'number', 'boolean', 'bigint']);
3
5
  const ENTRIES_LIMIT = 1000;
4
6
  /**
5
- * Every value (each "where" and each defined "data" cell) becomes one bound
6
- * placeholder in the `VALUES` list, so the statement uses
7
- * `entries × (whereColumns + dataColumns)` parameters. PostgreSQL caps a single
8
- * statement at 65535 bound parameters and CockroachDB has its own ceiling, so we
9
- * guard the total up front to fail with a clear message instead of an opaque
10
- * driver error. The effective row cap therefore shrinks as the statement widens.
7
+ * Every "data" cell and every "where" cell in the `VALUES` list is one bound
8
+ * placeholder, and each constant "where" predicate adds one more, so the
9
+ * statement uses `entries × (valuesWhereColumns + dataColumns) + constantWhereColumns`
10
+ * parameters. PostgreSQL caps a single statement at 65535 bound parameters and
11
+ * CockroachDB has its own ceiling, so we guard the total up front to fail with a
12
+ * clear message instead of an opaque driver error.
11
13
  */
12
14
  const BIND_PARAMETERS_LIMIT = 65535;
13
15
  /**
@@ -18,18 +20,27 @@ const BIND_PARAMETERS_LIMIT = 65535;
18
20
  *
19
21
  * The executed query follows the below structure for provided example data:
20
22
  * [
21
- * { where: { id: 1 }, data: { col1: 11, col2: 12 } },
22
- * { where: { id: 2 }, data: { col1: 21, col2: 22 } },
23
+ * { where: { tenant_id: 7, id: 1 }, data: { col1: 11, col2: 12 } },
24
+ * { where: { tenant_id: 7, id: 2 }, data: { col1: 21, col2: 22 } },
23
25
  * ]
24
26
  *
25
27
  * UPDATE "tbl"
26
- * SET "col1" = updates."col1", "col2" = updates."col2"
28
+ * SET "col1" = updates."col1"::int4, "col2" = updates."col2"::int4
27
29
  * FROM (
28
30
  * VALUES
29
- * (1, 11, 12),
30
- * (2, 21, 22)
31
+ * ($1::int4, $2::int4, $3::int4),
32
+ * ($4::int4, $5::int4, $6::int4)
31
33
  * ) AS updates("id", "col1", "col2")
32
- * WHERE "tbl"."id" = updates."id"
34
+ * WHERE "tbl"."tenant_id" = $7::int4 AND "tbl"."id" = updates."id"::int4
35
+ *
36
+ * A "where" column whose value is the same on every entry (`tenant_id` above) is
37
+ * emitted as a constant predicate instead of a `VALUES` column. Joining a tenant
38
+ * column from `VALUES` lets CockroachDB plan a lookup join on a primary key that
39
+ * starts with it and read every row of the tenant; a constant lets it use the
40
+ * index on the other key. A value counts as the same only when it is a string,
41
+ * number, boolean or bigint and is `===` to the first entry's value. Anything else
42
+ * (`null`, `Date`, `Buffer`, objects) stays in `VALUES`. When every "where" column
43
+ * is constant, `VALUES` holds only the "data" columns.
33
44
  *
34
45
  * "data" values follow Prisma's convention: an `undefined` value leaves the
35
46
  * column untouched (it is dropped from the statement), while `null` sets it to
@@ -88,10 +99,14 @@ export const prismaBulkUpdate = (prisma, tableName, options, entries) => {
88
99
  if (overlappingColumn) {
89
100
  throw new Error(`Column "${overlappingColumn.name}" must not appear in both "where" and "data"`);
90
101
  }
91
- const bindParametersCount = entries.length * (whereColumns.length + dataColumns.length);
102
+ const constantWhereColumns = resolveConstantWhereColumns(whereColumns, entries);
103
+ const valuesWhereColumns = whereColumns.filter((column) => !constantWhereColumns.has(column));
104
+ const valuesColumns = [...valuesWhereColumns, ...dataColumns];
105
+ const bindParametersCount = entries.length * valuesColumns.length + constantWhereColumns.size;
92
106
  if (bindParametersCount > BIND_PARAMETERS_LIMIT) {
107
+ const constantsBreakdown = constantWhereColumns.size > 0 ? ` + ${constantWhereColumns.size} constant "where" values` : '';
93
108
  throw new Error(`Bulk update would use ${bindParametersCount} bind parameters ` +
94
- `(${entries.length} entries × ${whereColumns.length + dataColumns.length} columns), ` +
109
+ `(${entries.length} entries × ${valuesColumns.length} columns${constantsBreakdown}), ` +
95
110
  `exceeding the limit of ${BIND_PARAMETERS_LIMIT}`);
96
111
  }
97
112
  // Quote each part of a (possibly schema-qualified) table name separately,
@@ -104,12 +119,15 @@ export const prismaBulkUpdate = (prisma, tableName, options, entries) => {
104
119
  const sqlSetExpressions = dataColumns.map((column) => {
105
120
  return sql([`"${column.name}" = updates."${column.name}"::${column.type}`]);
106
121
  });
107
- const sqlValuesExpressions = entries.map((entry, index) => prepareSqlValuesExpression(entry, index, whereColumns, dataColumns));
108
- const sqlValuesColumnAliases = [...whereColumns, ...dataColumns].map((column) => {
122
+ const sqlValuesExpressions = entries.map((entry, index) => prepareSqlValuesExpression(entry, index, whereColumns, valuesWhereColumns, dataColumns));
123
+ const sqlValuesColumnAliases = valuesColumns.map((column) => {
109
124
  return sql([`"${column.name}"`]);
110
125
  });
111
126
  const sqlWhereConditions = whereColumns.map((column) => {
112
- return sql([`${quotedTableName}."${column.name}" = updates."${column.name}"::${column.type}`]);
127
+ const qualifiedColumn = `${quotedTableName}."${column.name}"`;
128
+ return constantWhereColumns.has(column)
129
+ ? sql `${raw(qualifiedColumn)} = ${renderTypedValue(firstEntry.where[column.name], column.type)}`
130
+ : sql([`${qualifiedColumn} = updates."${column.name}"::${column.type}`]);
113
131
  });
114
132
  const updateStatement = sql `
115
133
  UPDATE ${sql([quotedTableName])}
@@ -128,23 +146,22 @@ export const prismaBulkUpdate = (prisma, tableName, options, entries) => {
128
146
  return prisma.$queryRaw(sql `${updateStatement} RETURNING ${join(sqlReturningExpressions, ', ')}`);
129
147
  };
130
148
  /**
131
- * Builds the parenthesized `(where..., set...)` tuple for a single entry — one
132
- * row of the `VALUES` source. The entry must supply exactly the given `where`
133
- * columns and the same set of defined `data` columns (the shape established by
134
- * the first entry); a mismatch throws so the generated `VALUES` list stays
135
- * rectangular and aligned with the column aliases.
149
+ * Builds the parenthesized `(where..., set...)` tuple for a single entry: one row
150
+ * of the `VALUES` source, holding the `valuesWhereColumns` subset of the "where"
151
+ * columns. The entry must supply exactly the given `where` columns and the same
152
+ * set of defined `data` columns (the shape established by the first entry); a
153
+ * mismatch throws so the generated `VALUES` list stays rectangular and aligned
154
+ * with the column aliases.
136
155
  */
137
- const prepareSqlValuesExpression = (entry, index, whereColumns, dataColumns) => {
156
+ const prepareSqlValuesExpression = (entry, index, whereColumns, valuesWhereColumns, dataColumns) => {
138
157
  if (whereColumns.length !== Object.keys(entry.where).length) {
139
158
  throw new Error(`Entry "where" columns are not the same (at index ${index})`);
140
159
  }
141
- const sqlWhereValues = whereColumns.map((whereConditionColumn) => {
142
- const whereConditionValue = entry.where[whereConditionColumn.name];
143
- if (whereConditionValue === undefined) {
144
- throw new Error(`Entry "where" column "${whereConditionColumn.name}" was not found (at index ${index})`);
145
- }
146
- return renderTypedValue(whereConditionValue, whereConditionColumn.type);
147
- });
160
+ const missingWhereColumn = whereColumns.find((column) => entry.where[column.name] === undefined);
161
+ if (missingWhereColumn) {
162
+ throw new Error(`Entry "where" column "${missingWhereColumn.name}" was not found (at index ${index})`);
163
+ }
164
+ const sqlWhereValues = valuesWhereColumns.map((column) => renderTypedValue(entry.where[column.name], column.type));
148
165
  if (dataColumns.length !== definedColumnNames(entry.data).length) {
149
166
  throw new Error(`Entry "data" columns are not the same (at index ${index})`);
150
167
  }
@@ -155,8 +172,17 @@ const prepareSqlValuesExpression = (entry, index, whereColumns, dataColumns) =>
155
172
  }
156
173
  return renderTypedValue(setExpressionValue, setExpressionColumn.type);
157
174
  });
158
- return sql `(${join(sqlWhereValues, ',')},${join(sqlSetValues, ',')})`;
175
+ return sql `(${join([...sqlWhereValues, ...sqlSetValues], ',')})`;
159
176
  };
177
+ /**
178
+ * Picks the "where" columns to emit as constant predicates, following the rule in
179
+ * the `prismaBulkUpdate` docblock.
180
+ */
181
+ const resolveConstantWhereColumns = (whereColumns, entries) => new Set(whereColumns.filter((column) => {
182
+ const firstValue = entries[0]?.where[column.name];
183
+ return (COMPARABLE_VALUE_TYPES.has(typeof firstValue) &&
184
+ entries.every((entry) => entry.where[column.name] === firstValue));
185
+ }));
160
186
  /**
161
187
  * Pairs each requested column name with its SQL type from `typeByColumn`,
162
188
  * throwing when a column has no type mapping (it would otherwise produce an
@@ -1 +1 @@
1
- {"version":3,"file":"prismaBulkUpdate.js","sourceRoot":"","sources":["../../src/bulk-update/prismaBulkUpdate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prismaBulkUpdate.js","sourceRoot":"","sources":["../../src/bulk-update/prismaBulkUpdate.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lokalise/prisma-utils",
3
- "version": "7.0.0",
3
+ "version": "7.0.1",
4
4
  "type": "module",
5
5
  "license": "Apache-2.0",
6
6
  "files": [
@@ -26,18 +26,18 @@
26
26
  "prisma": "^7.0.0"
27
27
  },
28
28
  "devDependencies": {
29
- "@biomejs/biome": "^2.5.9",
29
+ "@biomejs/biome": "^2.5.12",
30
30
  "dotenv": "^17.0.0",
31
+ "@lokalise/biome-config": "^3.1.1",
32
+ "@lokalise/tsconfig": "^5.0.0",
31
33
  "@prisma/adapter-pg": "^7.4.0",
32
- "@prisma/client": "^7.4.0",
34
+ "@prisma/client": "^7.10.0",
33
35
  "@vitest/coverage-v8": "^4.1.11",
34
36
  "cross-env": "^10.0.0",
35
37
  "prisma": "^7.10.0",
36
38
  "rimraf": "^6.1.3",
37
39
  "typescript": "7.0.2",
38
- "vitest": "^4.1.11",
39
- "@lokalise/biome-config": "^3.1.1",
40
- "@lokalise/tsconfig": "^5.0.0"
40
+ "vitest": "^4.1.11"
41
41
  },
42
42
  "scripts": {
43
43
  "build": "rimraf dist && pnpm run db:update-client && tsc --project tsconfig.build.json",
@@ -51,6 +51,8 @@
51
51
  "pretest:ci": "docker compose up -d --wait && pnpm run test:migrate",
52
52
  "test:ci": "pnpm run test",
53
53
  "posttest:ci": "docker compose down",
54
+ "bench:seed": "vitest run --config vitest.bench.config.ts",
55
+ "bench": "vitest bench --run --config vitest.bench.config.ts",
54
56
  "package-version": "echo $npm_package_version",
55
57
  "postversion": "biome check --write package.json"
56
58
  }