@prisma/orm-family-sql 8.0.0-rc.11-dev.2 → 8.0.0-rc.11-dev.4

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.
@@ -481,6 +481,13 @@ function stripHiddenMappedFields(contract, namespaceId, modelName, mapped, hidde
481
481
  function mapStorageRowToModelFields(contract, namespaceId, modelName, row) {
482
482
  const columnToField = getColumnToFieldMap(contract, namespaceId, modelName);
483
483
  if (Object.keys(columnToField).length === 0) return { ...row };
484
+ return mapColumnNames(row, columnToField);
485
+ }
486
+ function createStorageRowMapper(contract, namespaceId, modelName) {
487
+ const columnToField = getColumnToFieldMap(contract, namespaceId, modelName);
488
+ return Object.keys(columnToField).length === 0 ? (row) => ({ ...row }) : (row) => mapColumnNames(row, columnToField);
489
+ }
490
+ function mapColumnNames(row, columnToField) {
484
491
  const mapped = {};
485
492
  for (const [columnName, value] of Object.entries(row)) mapped[columnToField[columnName] ?? columnName] = value;
486
493
  return mapped;
@@ -1972,7 +1979,8 @@ function dispatchWithIncludes(options) {
1972
1979
  mapped: polyInfo ? mapPolymorphicRow(contract, namespaceId, modelName, polyInfo, row, state.variantName) : mapStorageRowToModelFields(contract, namespaceId, modelName, row)
1973
1980
  };
1974
1981
  });
1975
- for (const parent of parentRows) for (const include of state.includes) parent.mapped[include.relationName] = await decodeIncludePayload(contract, context, include, parent.raw[include.relationName]);
1982
+ const bindings = /* @__PURE__ */ new WeakMap();
1983
+ for (const parent of parentRows) for (const include of state.includes) parent.mapped[include.relationName] = await decodeIncludePayload(contract, context, include, parent.raw[include.relationName], bindings);
1976
1984
  for (const row of parentRows) yield blindCast(row.mapped);
1977
1985
  };
1978
1986
  return new AsyncIterableResult(generator());
@@ -2055,42 +2063,53 @@ function buildIdentityInFilter(contract, namespaceId, tableName, identityColumns
2055
2063
  * each branch is dispatched to the row or scalar decoder per its
2056
2064
  * declared shape (see `decodeCombineIncludePayload`).
2057
2065
  */
2058
- async function decodeIncludePayload(contract, context, include, raw) {
2066
+ async function decodeIncludePayload(contract, context, include, raw, bindings) {
2059
2067
  if (include.scalar) return Promise.resolve(decodeScalarIncludePayload(contract, context, include, include.scalar, raw));
2060
- if (include.combine) return decodeCombineIncludePayload(contract, context, include, include.combine, raw);
2068
+ if (include.combine) return decodeCombineIncludePayload(contract, context, include, include.combine, raw, bindings);
2061
2069
  const rawChildren = parseIncludedRows(include, raw);
2062
2070
  const polyInfo = resolvePolymorphismInfo(contract, include.relatedNamespaceId, include.relatedModelName);
2063
- const mapChildRow = polyInfo ? (childRow) => mapPolymorphicRow(contract, include.relatedNamespaceId, include.relatedModelName, polyInfo, childRow, include.nested.variantName) : (childRow) => mapStorageRowToModelFields(contract, include.relatedNamespaceId, include.relatedModelName, childRow);
2071
+ const mapChildRow = polyInfo ? (childRow) => mapPolymorphicRow(contract, include.relatedNamespaceId, include.relatedModelName, polyInfo, childRow, include.nested.variantName) : createStorageRowMapper(contract, include.relatedNamespaceId, include.relatedModelName);
2072
+ let columns = bindings.get(include);
2073
+ if (!columns) {
2074
+ columns = /* @__PURE__ */ new Map();
2075
+ bindings.set(include, columns);
2076
+ }
2064
2077
  const mappedChildren = [];
2065
2078
  for (const childRow of rawChildren) {
2066
- const decodedChildRow = await decodeIncludedStorageRow(contract, context, include, childRow);
2079
+ const decodedChildRow = decodeIncludedStorageRow(contract, context, include, childRow, columns);
2067
2080
  const mapped = mapChildRow(decodedChildRow);
2068
- for (const nestedInclude of include.nested.includes) mapped[nestedInclude.relationName] = await decodeIncludePayload(contract, context, nestedInclude, decodedChildRow[nestedInclude.relationName]);
2081
+ for (const nestedInclude of include.nested.includes) mapped[nestedInclude.relationName] = await decodeIncludePayload(contract, context, nestedInclude, decodedChildRow[nestedInclude.relationName], bindings);
2069
2082
  mappedChildren.push(mapped);
2070
2083
  }
2071
2084
  return coerceSingleQueryIncludeResult(mappedChildren, include.cardinality);
2072
2085
  }
2073
- async function decodeIncludedStorageRow(contract, context, include, row) {
2086
+ function decodeIncludedStorageRow(contract, context, include, row, bindings) {
2074
2087
  const decoded = {};
2075
2088
  for (const [key, value] of Object.entries(row)) {
2076
2089
  if (value === null || value === void 0) {
2077
2090
  decoded[key] = value;
2078
2091
  continue;
2079
2092
  }
2080
- const ref = resolveIncludedColumnRef(contract, include, key);
2081
- if (!ref) {
2082
- decoded[key] = value;
2083
- continue;
2093
+ let binding = bindings.get(key);
2094
+ if (binding === void 0) {
2095
+ binding = resolveIncludedColumnBinding(contract, context, include, key);
2096
+ bindings.set(key, binding);
2084
2097
  }
2085
- const codec = context.contractCodecs.forColumn(include.relatedNamespaceId, ref.table, ref.column);
2086
- if (!codec) {
2087
- decoded[key] = value;
2088
- continue;
2089
- }
2090
- decoded[key] = await decodeIncludedColumnValue(ref, context.codecDescriptors.codecRefForColumn(include.relatedNamespaceId, ref.table, ref.column)?.codecId ?? ref.storageColumn.codecId, codec, value);
2098
+ decoded[key] = binding ? decodeIncludedColumnValue(binding.ref, binding.codecId, binding.codec, value) : value;
2091
2099
  }
2092
2100
  return decoded;
2093
2101
  }
2102
+ function resolveIncludedColumnBinding(contract, context, include, key) {
2103
+ const ref = resolveIncludedColumnRef(contract, include, key);
2104
+ if (!ref) return null;
2105
+ const codec = context.contractCodecs.forColumn(include.relatedNamespaceId, ref.table, ref.column);
2106
+ if (!codec) return null;
2107
+ return {
2108
+ ref,
2109
+ codec,
2110
+ codecId: context.codecDescriptors.codecRefForColumn(include.relatedNamespaceId, ref.table, ref.column)?.codecId ?? ref.storageColumn.codecId
2111
+ };
2112
+ }
2094
2113
  function resolveIncludedColumnRef(contract, include, key) {
2095
2114
  const baseColumn = resolveStorageColumn(contract, include.relatedNamespaceId, include.relatedTableName, key);
2096
2115
  if (baseColumn) return {
@@ -2115,7 +2134,7 @@ function resolveIncludedColumnRef(contract, include, key) {
2115
2134
  function resolveStorageColumn(contract, namespaceId, tableName, columnName) {
2116
2135
  return contract.storage.namespaces[namespaceId]?.entries.table?.[tableName]?.columns[columnName];
2117
2136
  }
2118
- async function decodeIncludedColumnValue(ref, codecId, codec, value) {
2137
+ function decodeIncludedColumnValue(ref, codecId, codec, value) {
2119
2138
  if (ref.storageColumn.many === true) {
2120
2139
  if (!Array.isArray(value)) wrapIncludedDecodeFailure(/* @__PURE__ */ new TypeError(`expected an array from the driver for many-typed column, got ${typeof value}`), ref, codecId);
2121
2140
  const decoded = [];
@@ -2169,7 +2188,7 @@ function wrapIncludedDecodeFailure(error, ref, codecId) {
2169
2188
  * bug — `parseCombineEnvelope` throws loudly rather than papering over
2170
2189
  * it with an empty shape.
2171
2190
  */
2172
- async function decodeCombineIncludePayload(contract, context, include, branches, raw) {
2191
+ async function decodeCombineIncludePayload(contract, context, include, branches, raw, bindings) {
2173
2192
  const parsed = parseCombineEnvelope(include, raw);
2174
2193
  const result = {};
2175
2194
  for (const [branchName, branch] of Object.entries(branches)) {
@@ -2179,7 +2198,7 @@ async function decodeCombineIncludePayload(contract, context, include, branches,
2179
2198
  nested: branch.state,
2180
2199
  scalar: void 0,
2181
2200
  combine: void 0
2182
- }, branchRaw);
2201
+ }, branchRaw, bindings);
2183
2202
  else result[branchName] = decodeScalarIncludePayload(contract, context, include, branch.selector, branchRaw);
2184
2203
  }
2185
2204
  return result;