@nicia-ai/typegraph 0.21.0 → 0.22.0

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.
Files changed (43) hide show
  1. package/dist/backend/postgres/index.cjs +33 -33
  2. package/dist/backend/postgres/index.js +4 -4
  3. package/dist/backend/sqlite/index.cjs +14 -14
  4. package/dist/backend/sqlite/index.d.cts +11 -0
  5. package/dist/backend/sqlite/index.d.ts +11 -0
  6. package/dist/backend/sqlite/index.js +4 -4
  7. package/dist/backend/sqlite/libsql.cjs +7 -7
  8. package/dist/backend/sqlite/libsql.js +4 -4
  9. package/dist/backend/sqlite/local.cjs +26 -9
  10. package/dist/backend/sqlite/local.cjs.map +1 -1
  11. package/dist/backend/sqlite/local.js +21 -5
  12. package/dist/backend/sqlite/local.js.map +1 -1
  13. package/dist/{chunk-FQCQM3KG.cjs → chunk-3JK66E3I.cjs} +4 -2
  14. package/dist/chunk-3JK66E3I.cjs.map +1 -0
  15. package/dist/{chunk-SMMOAVJ5.js → chunk-3PPEHLGK.js} +3 -3
  16. package/dist/{chunk-SMMOAVJ5.js.map → chunk-3PPEHLGK.js.map} +1 -1
  17. package/dist/{chunk-UQVBVBVG.js → chunk-5ZMMHUWR.js} +53 -7
  18. package/dist/chunk-5ZMMHUWR.js.map +1 -0
  19. package/dist/{chunk-4XNE2JG3.js → chunk-753F33CV.js} +4 -2
  20. package/dist/chunk-753F33CV.js.map +1 -0
  21. package/dist/{chunk-CQL6FOTT.cjs → chunk-GUYI6VAS.cjs} +43 -24
  22. package/dist/chunk-GUYI6VAS.cjs.map +1 -0
  23. package/dist/{chunk-NRNJ52AA.js → chunk-NSLTDXVH.js} +26 -7
  24. package/dist/chunk-NSLTDXVH.js.map +1 -0
  25. package/dist/{chunk-2X7P7AD5.cjs → chunk-PEE4EWXZ.cjs} +22 -22
  26. package/dist/{chunk-2X7P7AD5.cjs.map → chunk-PEE4EWXZ.cjs.map} +1 -1
  27. package/dist/{chunk-Q73OWTJY.cjs → chunk-SCXOGKLD.cjs} +112 -66
  28. package/dist/chunk-SCXOGKLD.cjs.map +1 -0
  29. package/dist/index.cjs +135 -54
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.d.cts +45 -1
  32. package/dist/index.d.ts +45 -1
  33. package/dist/index.js +115 -36
  34. package/dist/index.js.map +1 -1
  35. package/dist/indexes/index.cjs +16 -16
  36. package/dist/indexes/index.js +2 -2
  37. package/package.json +1 -1
  38. package/dist/chunk-4XNE2JG3.js.map +0 -1
  39. package/dist/chunk-CQL6FOTT.cjs.map +0 -1
  40. package/dist/chunk-FQCQM3KG.cjs.map +0 -1
  41. package/dist/chunk-NRNJ52AA.js.map +0 -1
  42. package/dist/chunk-Q73OWTJY.cjs.map +0 -1
  43. package/dist/chunk-UQVBVBVG.js.map +0 -1
package/dist/index.cjs CHANGED
@@ -3,7 +3,7 @@
3
3
  var chunkHRNQ3DVJ_cjs = require('./chunk-HRNQ3DVJ.cjs');
4
4
  var chunkWRWVWKQL_cjs = require('./chunk-WRWVWKQL.cjs');
5
5
  var chunkO5PST6TB_cjs = require('./chunk-O5PST6TB.cjs');
6
- var chunkFQCQM3KG_cjs = require('./chunk-FQCQM3KG.cjs');
6
+ var chunk3JK66E3I_cjs = require('./chunk-3JK66E3I.cjs');
7
7
  var chunkUVZHTBZ5_cjs = require('./chunk-UVZHTBZ5.cjs');
8
8
  var zod = require('zod');
9
9
  var drizzleOrm = require('drizzle-orm');
@@ -1930,9 +1930,9 @@ function validateTableName(name, label) {
1930
1930
  if (!name || name.length === 0) {
1931
1931
  throw new chunkO5PST6TB_cjs.ConfigurationError(`${label} table name cannot be empty`);
1932
1932
  }
1933
- if (name.length > chunkFQCQM3KG_cjs.MAX_PG_IDENTIFIER_LENGTH) {
1933
+ if (name.length > chunk3JK66E3I_cjs.MAX_PG_IDENTIFIER_LENGTH) {
1934
1934
  throw new chunkO5PST6TB_cjs.ConfigurationError(
1935
- `${label} table name exceeds maximum length of ${chunkFQCQM3KG_cjs.MAX_PG_IDENTIFIER_LENGTH} characters`
1935
+ `${label} table name exceeds maximum length of ${chunk3JK66E3I_cjs.MAX_PG_IDENTIFIER_LENGTH} characters`
1936
1936
  );
1937
1937
  }
1938
1938
  if (!VALID_IDENTIFIER_PATTERN.test(name)) {
@@ -2104,6 +2104,7 @@ function buildStandardStartCte(input) {
2104
2104
  const { ast, ctx, graphId, predicateIndex, requiredColumnsByAlias } = input;
2105
2105
  const alias = ast.start.alias;
2106
2106
  const kinds = ast.start.kinds;
2107
+ const cteMaterialization = ctx.dialect.capabilities.emitNotMaterializedHint ? drizzleOrm.sql`NOT MATERIALIZED ` : drizzleOrm.sql``;
2107
2108
  const kindFilter = compileKindFilter(drizzleOrm.sql.raw("kind"), kinds);
2108
2109
  const temporalFilter = input.temporalFilterPass.forAlias();
2109
2110
  const cteContext = { ...ctx, cteColumnPrefix: "" };
@@ -2118,14 +2119,19 @@ function buildStandardStartCte(input) {
2118
2119
  ...predicateClauses
2119
2120
  ];
2120
2121
  const effectiveRequiredColumns = requiredColumnsByAlias ? requiredColumnsByAlias.get(alias) ?? EMPTY_REQUIRED_COLUMNS : void 0;
2122
+ const limitClause = input.limitOffset === void 0 ? drizzleOrm.sql`` : input.limitOffset.offset === void 0 ? drizzleOrm.sql`
2123
+ LIMIT ${input.limitOffset.limit}
2124
+ ` : drizzleOrm.sql`
2125
+ LIMIT ${input.limitOffset.limit} OFFSET ${input.limitOffset.offset}
2126
+ `;
2121
2127
  return drizzleOrm.sql`
2122
- cte_${drizzleOrm.sql.raw(alias)} AS (
2128
+ cte_${drizzleOrm.sql.raw(alias)} AS ${cteMaterialization}(
2123
2129
  SELECT ${drizzleOrm.sql.join(
2124
2130
  compileNodeSelectColumns(void 0, alias, effectiveRequiredColumns),
2125
2131
  drizzleOrm.sql`, `
2126
2132
  )}
2127
2133
  FROM ${ctx.schema.nodesTable}
2128
- WHERE ${drizzleOrm.sql.join(whereClauses, drizzleOrm.sql` AND `)}
2134
+ WHERE ${drizzleOrm.sql.join(whereClauses, drizzleOrm.sql` AND `)}${limitClause}
2129
2135
  )
2130
2136
  `;
2131
2137
  }
@@ -2189,7 +2195,7 @@ function buildStandardTraversalCte(input) {
2189
2195
  ...compileEdgeSelectColumns("e", edgeAlias, requiredEdgeColumns),
2190
2196
  ...compileNodeSelectColumns("n", nodeAlias, requiredNodeColumns)
2191
2197
  ];
2192
- const cteMaterialization = materializeCte ? drizzleOrm.sql`MATERIALIZED ` : drizzleOrm.sql``;
2198
+ const cteMaterialization = materializeCte ? drizzleOrm.sql`MATERIALIZED ` : ctx.dialect.capabilities.emitNotMaterializedHint ? drizzleOrm.sql`NOT MATERIALIZED ` : drizzleOrm.sql``;
2193
2199
  function compileTraversalBranch(branch) {
2194
2200
  const whereClauses = [
2195
2201
  ...baseWhereClauses,
@@ -3170,7 +3176,7 @@ function lowerComposableQueryToLogicalPlanNode(query, dialect, graphId, nextPlan
3170
3176
  nextPlanNodeId
3171
3177
  });
3172
3178
  }
3173
- const dialectAdapter = chunkFQCQM3KG_cjs.getDialect(dialect);
3179
+ const dialectAdapter = chunk3JK66E3I_cjs.getDialect(dialect);
3174
3180
  const vectorPredicate = runVectorPredicatePass(
3175
3181
  query,
3176
3182
  dialectAdapter
@@ -4000,9 +4006,9 @@ function truncateToBytes(value, maxBytes) {
4000
4006
  }
4001
4007
  function projectionAlias(entityPrefix, kind, field2) {
4002
4008
  const prefix = entityPrefix === "node" ? "sg_n" : "sg_e";
4003
- const hash = chunkFQCQM3KG_cjs.fnv1aBase36(`${kind}\0${field2}`);
4009
+ const hash = chunk3JK66E3I_cjs.fnv1aBase36(`${kind}\0${field2}`);
4004
4010
  const fixedBytes = prefix.length + 1 + 1 + hash.length;
4005
- const maxKindBytes = chunkFQCQM3KG_cjs.MAX_PG_IDENTIFIER_LENGTH - fixedBytes;
4011
+ const maxKindBytes = chunk3JK66E3I_cjs.MAX_PG_IDENTIFIER_LENGTH - fixedBytes;
4006
4012
  const truncatedKind = truncateToBytes(kind, maxKindBytes);
4007
4013
  return `${prefix}_${truncatedKind}_${hash}`;
4008
4014
  }
@@ -5245,7 +5251,7 @@ function compileSetOperation2(op, graphId, options = "sqlite") {
5245
5251
  );
5246
5252
  }
5247
5253
  function resolveDialectAdapter(dialect, fulltextStrategy) {
5248
- const baseAdapter = chunkFQCQM3KG_cjs.getDialect(dialect);
5254
+ const baseAdapter = chunk3JK66E3I_cjs.getDialect(dialect);
5249
5255
  if (fulltextStrategy === void 0 || fulltextStrategy === baseAdapter.fulltext) {
5250
5256
  return baseAdapter;
5251
5257
  }
@@ -5279,8 +5285,10 @@ function resolveCountAggregateFastPath(ast) {
5279
5285
  if (groupField.alias !== ast.start.alias || !isIdFieldRef(groupField)) {
5280
5286
  return void 0;
5281
5287
  }
5282
- let requiresCount = false;
5283
- let requiresCountDistinct = false;
5288
+ let requiresNodeCount = false;
5289
+ let requiresNodeCountDistinct = false;
5290
+ let requiresEdgeCount = false;
5291
+ let requiresEdgeCountDistinct = false;
5284
5292
  for (const projectedField of ast.projection.fields) {
5285
5293
  const source = projectedField.source;
5286
5294
  if (!isAggregateExpr(source)) {
@@ -5289,26 +5297,35 @@ function resolveCountAggregateFastPath(ast) {
5289
5297
  }
5290
5298
  continue;
5291
5299
  }
5292
- if (source.field.alias !== traversal.nodeAlias || !isIdFieldRef(source.field)) {
5300
+ if (!isIdFieldRef(source.field)) {
5301
+ return void 0;
5302
+ }
5303
+ const isNodeTarget = source.field.alias === traversal.nodeAlias;
5304
+ const isEdgeTarget = source.field.alias === traversal.edgeAlias;
5305
+ if (!isNodeTarget && !isEdgeTarget) {
5293
5306
  return void 0;
5294
5307
  }
5295
5308
  if (source.function === "count") {
5296
- requiresCount = true;
5309
+ if (isNodeTarget) requiresNodeCount = true;
5310
+ else requiresEdgeCount = true;
5297
5311
  continue;
5298
5312
  }
5299
5313
  if (source.function === "countDistinct") {
5300
- requiresCountDistinct = true;
5314
+ if (isNodeTarget) requiresNodeCountDistinct = true;
5315
+ else requiresEdgeCountDistinct = true;
5301
5316
  continue;
5302
5317
  }
5303
5318
  return void 0;
5304
5319
  }
5305
- if (!requiresCount && !requiresCountDistinct) {
5320
+ if (!requiresNodeCount && !requiresNodeCountDistinct && !requiresEdgeCount && !requiresEdgeCountDistinct) {
5306
5321
  return void 0;
5307
5322
  }
5308
5323
  return {
5309
5324
  traversal,
5310
- requiresCount,
5311
- requiresCountDistinct
5325
+ requiresNodeCount,
5326
+ requiresNodeCountDistinct,
5327
+ requiresEdgeCount,
5328
+ requiresEdgeCountDistinct
5312
5329
  };
5313
5330
  }
5314
5331
  function compileCountAggregateFastPath(ast, graphId, ctx, logicalPlan, requiredColumnsByAlias, predicateIndex, temporalFilterPass) {
@@ -5316,15 +5333,23 @@ function compileCountAggregateFastPath(ast, graphId, ctx, logicalPlan, requiredC
5316
5333
  if (!plan) {
5317
5334
  return void 0;
5318
5335
  }
5319
- const { traversal, requiresCount, requiresCountDistinct } = plan;
5336
+ const {
5337
+ traversal,
5338
+ requiresNodeCount,
5339
+ requiresNodeCountDistinct,
5340
+ requiresEdgeCount,
5341
+ requiresEdgeCountDistinct
5342
+ } = plan;
5320
5343
  const { dialect } = ctx;
5321
5344
  const startAlias = ast.start.alias;
5322
5345
  const previousAlias = traversal.joinFromAlias;
5323
5346
  const previousAliasIdColumn = `${previousAlias}_id`;
5324
5347
  const previousAliasKindColumn = `${previousAlias}_kind`;
5325
5348
  const countCteAlias = `cte_${traversal.nodeAlias}_counts`;
5326
- const countColumn = `${traversal.nodeAlias}_count`;
5327
- const countDistinctColumn = `${traversal.nodeAlias}_count_distinct`;
5349
+ const nodeCountColumn = `${traversal.nodeAlias}_count`;
5350
+ const nodeCountDistinctColumn = `${traversal.nodeAlias}_count_distinct`;
5351
+ const edgeCountColumn = `${traversal.edgeAlias}_count`;
5352
+ const edgeCountDistinctColumn = `${traversal.edgeAlias}_count_distinct`;
5328
5353
  const previousNodeKinds = getNodeKindsForAlias(ast, traversal.joinFromAlias);
5329
5354
  const edgeKinds = [...new Set(traversal.edgeKinds)];
5330
5355
  const nodeKinds = traversal.nodeKinds;
@@ -5350,34 +5375,68 @@ function compileCountAggregateFastPath(ast, graphId, ctx, logicalPlan, requiredC
5350
5375
  const targetField = traversal.direction === "out" ? "to_id" : "from_id";
5351
5376
  const joinKindField = traversal.direction === "out" ? "from_kind" : "to_kind";
5352
5377
  const targetKindField = traversal.direction === "out" ? "to_kind" : "from_kind";
5378
+ const hasNodePredicates = nodePredicateClauses.length > 0;
5379
+ const requiresNodeJoin = requiresNodeCount || requiresNodeCountDistinct || hasNodePredicates;
5380
+ const useInnerJoin = hasNodePredicates;
5353
5381
  const whereClauses = [
5354
5382
  drizzleOrm.sql`e.graph_id = ${graphId}`,
5355
5383
  compileKindFilter(drizzleOrm.sql.raw("e.kind"), edgeKinds),
5356
5384
  compileKindFilter(drizzleOrm.sql.raw(`e.${joinKindField}`), previousNodeKinds),
5357
5385
  compileKindFilter(drizzleOrm.sql.raw(`e.${targetKindField}`), nodeKinds),
5358
- compileKindFilter(drizzleOrm.sql.raw("n.kind"), nodeKinds),
5359
5386
  edgeTemporalFilter,
5360
- nodeTemporalFilter,
5361
- ...nodePredicateClauses,
5362
- ...edgePredicateClauses
5387
+ ...edgePredicateClauses,
5388
+ // INNER JOIN mode: node-side filters in WHERE constrain every aggregate.
5389
+ ...requiresNodeJoin && useInnerJoin ? [
5390
+ compileKindFilter(drizzleOrm.sql.raw("n.kind"), nodeKinds),
5391
+ nodeTemporalFilter,
5392
+ ...nodePredicateClauses
5393
+ ] : []
5363
5394
  ];
5395
+ const nodeJoinOnClauses = requiresNodeJoin ? useInnerJoin ? (
5396
+ // INNER JOIN: only the key conditions; filters live in WHERE.
5397
+ [
5398
+ drizzleOrm.sql`n.graph_id = e.graph_id`,
5399
+ drizzleOrm.sql`n.id = e.${drizzleOrm.sql.raw(targetField)}`,
5400
+ drizzleOrm.sql`n.kind = e.${drizzleOrm.sql.raw(targetKindField)}`
5401
+ ]
5402
+ ) : [
5403
+ drizzleOrm.sql`n.graph_id = e.graph_id`,
5404
+ drizzleOrm.sql`n.id = e.${drizzleOrm.sql.raw(targetField)}`,
5405
+ drizzleOrm.sql`n.kind = e.${drizzleOrm.sql.raw(targetKindField)}`,
5406
+ compileKindFilter(drizzleOrm.sql.raw("n.kind"), nodeKinds),
5407
+ nodeTemporalFilter
5408
+ ] : [];
5364
5409
  const aggregateColumns = [];
5365
- if (requiresCount) {
5366
- aggregateColumns.push(drizzleOrm.sql`COUNT(n.id) AS ${drizzleOrm.sql.raw(countColumn)}`);
5410
+ if (requiresNodeCount) {
5411
+ aggregateColumns.push(drizzleOrm.sql`COUNT(n.id) AS ${drizzleOrm.sql.raw(nodeCountColumn)}`);
5412
+ }
5413
+ if (requiresNodeCountDistinct) {
5414
+ aggregateColumns.push(
5415
+ drizzleOrm.sql`COUNT(DISTINCT n.id) AS ${drizzleOrm.sql.raw(nodeCountDistinctColumn)}`
5416
+ );
5417
+ }
5418
+ if (requiresEdgeCount) {
5419
+ aggregateColumns.push(drizzleOrm.sql`COUNT(e.id) AS ${drizzleOrm.sql.raw(edgeCountColumn)}`);
5367
5420
  }
5368
- if (requiresCountDistinct) {
5421
+ if (requiresEdgeCountDistinct) {
5369
5422
  aggregateColumns.push(
5370
- drizzleOrm.sql`COUNT(DISTINCT n.id) AS ${drizzleOrm.sql.raw(countDistinctColumn)}`
5423
+ drizzleOrm.sql`COUNT(DISTINCT e.id) AS ${drizzleOrm.sql.raw(edgeCountDistinctColumn)}`
5371
5424
  );
5372
5425
  }
5426
+ const startCteLimit = traversal.optional && ast.orderBy === void 0 && ast.limit !== void 0 ? { limit: ast.limit, offset: ast.offset } : void 0;
5373
5427
  const startCte = buildStandardStartCte({
5374
5428
  ast,
5375
5429
  ctx,
5376
5430
  graphId,
5377
5431
  predicateIndex,
5378
5432
  requiredColumnsByAlias,
5379
- temporalFilterPass
5433
+ temporalFilterPass,
5434
+ ...startCteLimit === void 0 ? {} : { limitOffset: startCteLimit }
5380
5435
  });
5436
+ const targetNodeJoinKeyword = useInnerJoin ? "JOIN" : "LEFT JOIN";
5437
+ const targetNodeJoin = requiresNodeJoin ? drizzleOrm.sql`
5438
+ ${drizzleOrm.sql.raw(targetNodeJoinKeyword)} ${ctx.schema.nodesTable} n ON ${drizzleOrm.sql.join(nodeJoinOnClauses, drizzleOrm.sql` AND `)}
5439
+ ` : drizzleOrm.sql``;
5381
5440
  const countCte = drizzleOrm.sql`
5382
5441
  ${drizzleOrm.sql.raw(countCteAlias)} AS (
5383
5442
  SELECT
@@ -5386,16 +5445,20 @@ function compileCountAggregateFastPath(ast, graphId, ctx, logicalPlan, requiredC
5386
5445
  ${drizzleOrm.sql.join(aggregateColumns, drizzleOrm.sql`, `)}
5387
5446
  FROM cte_${drizzleOrm.sql.raw(previousAlias)}
5388
5447
  JOIN ${ctx.schema.edgesTable} e ON cte_${drizzleOrm.sql.raw(previousAlias)}.${drizzleOrm.sql.raw(previousAliasIdColumn)} = e.${drizzleOrm.sql.raw(joinField)}
5389
- AND cte_${drizzleOrm.sql.raw(previousAlias)}.${drizzleOrm.sql.raw(previousAliasKindColumn)} = e.${drizzleOrm.sql.raw(joinKindField)}
5390
- JOIN ${ctx.schema.nodesTable} n ON n.graph_id = e.graph_id
5391
- AND n.id = e.${drizzleOrm.sql.raw(targetField)}
5392
- AND n.kind = e.${drizzleOrm.sql.raw(targetKindField)}
5448
+ AND cte_${drizzleOrm.sql.raw(previousAlias)}.${drizzleOrm.sql.raw(previousAliasKindColumn)} = e.${drizzleOrm.sql.raw(joinKindField)}${targetNodeJoin}
5393
5449
  WHERE ${drizzleOrm.sql.join(whereClauses, drizzleOrm.sql` AND `)}
5394
5450
  GROUP BY
5395
5451
  cte_${drizzleOrm.sql.raw(previousAlias)}.${drizzleOrm.sql.raw(previousAliasIdColumn)},
5396
5452
  cte_${drizzleOrm.sql.raw(previousAlias)}.${drizzleOrm.sql.raw(previousAliasKindColumn)}
5397
5453
  )
5398
5454
  `;
5455
+ function resolveCountColumn(source) {
5456
+ const isEdge = source.field.alias === traversal.edgeAlias;
5457
+ if (source.function === "countDistinct") {
5458
+ return isEdge ? edgeCountDistinctColumn : nodeCountDistinctColumn;
5459
+ }
5460
+ return isEdge ? edgeCountColumn : nodeCountColumn;
5461
+ }
5399
5462
  const projection = drizzleOrm.sql.join(
5400
5463
  ast.projection.fields.map((projectedField) => {
5401
5464
  const source = projectedField.source;
@@ -5408,7 +5471,7 @@ function compileCountAggregateFastPath(ast, graphId, ctx, logicalPlan, requiredC
5408
5471
  );
5409
5472
  return drizzleOrm.sql`${value} AS ${quoteIdentifier2(projectedField.outputName)}`;
5410
5473
  }
5411
- const projectedCountColumn = source.function === "countDistinct" ? countDistinctColumn : countColumn;
5474
+ const projectedCountColumn = resolveCountColumn(source);
5412
5475
  const countValue = drizzleOrm.sql`${drizzleOrm.sql.raw(countCteAlias)}.${drizzleOrm.sql.raw(projectedCountColumn)}`;
5413
5476
  const aggregateValue = traversal.optional ? drizzleOrm.sql`COALESCE(${countValue}, 0)` : countValue;
5414
5477
  return drizzleOrm.sql`${aggregateValue} AS ${quoteIdentifier2(projectedField.outputName)}`;
@@ -5423,19 +5486,29 @@ function compileCountAggregateFastPath(ast, graphId, ctx, logicalPlan, requiredC
5423
5486
  AND ${drizzleOrm.sql.raw(countCteAlias)}.${drizzleOrm.sql.raw(previousAliasKindColumn)} = cte_${drizzleOrm.sql.raw(previousAlias)}.${drizzleOrm.sql.raw(previousAliasKindColumn)}
5424
5487
  `;
5425
5488
  const orderBy = buildStandardOrderBy({ ast, dialect });
5426
- const limitOffset = buildLimitOffsetClause({
5427
- limit: ast.limit,
5428
- offset: ast.offset
5429
- });
5489
+ const emittedLogicalPlan = startCteLimit === void 0 ? logicalPlan : stripLimitOffsetFromPlan(logicalPlan);
5490
+ const limitOffset = startCteLimit === void 0 ? buildLimitOffsetClause({ limit: ast.limit, offset: ast.offset }) : void 0;
5430
5491
  return emitStandardQuerySql({
5431
5492
  ctes: [startCte, countCte],
5432
5493
  fromClause,
5433
5494
  ...orderBy === void 0 ? {} : { orderBy },
5434
5495
  ...limitOffset === void 0 ? {} : { limitOffset },
5435
- logicalPlan,
5496
+ logicalPlan: emittedLogicalPlan,
5436
5497
  projection
5437
5498
  });
5438
5499
  }
5500
+ function stripLimitOffsetFromPlan(plan) {
5501
+ return { ...plan, root: stripLimitOffsetFromPlanNode(plan.root) };
5502
+ }
5503
+ function stripLimitOffsetFromPlanNode(node) {
5504
+ if (node.op === "limit_offset") {
5505
+ return stripLimitOffsetFromPlanNode(node.input);
5506
+ }
5507
+ if ("input" in node) {
5508
+ return { ...node, input: stripLimitOffsetFromPlanNode(node.input) };
5509
+ }
5510
+ return node;
5511
+ }
5439
5512
  var STANDARD_QUERY_STRATEGY_HANDLERS = {
5440
5513
  cte_project: compileStandardQueryWithCteStrategy
5441
5514
  };
@@ -5776,14 +5849,14 @@ function generateId() {
5776
5849
 
5777
5850
  // src/utils/path.ts
5778
5851
  function parseSqlitePath(path) {
5779
- const emptyPath = `${chunkFQCQM3KG_cjs.SQLITE_PATH_DELIMITER}${chunkFQCQM3KG_cjs.SQLITE_PATH_DELIMITER}`;
5852
+ const emptyPath = `${chunk3JK66E3I_cjs.SQLITE_PATH_DELIMITER}${chunk3JK66E3I_cjs.SQLITE_PATH_DELIMITER}`;
5780
5853
  if (!path || path === emptyPath) return [];
5781
5854
  const trimmed = path.slice(1, -1);
5782
5855
  if (trimmed === "") return [];
5783
- return trimmed.split(chunkFQCQM3KG_cjs.SQLITE_PATH_DELIMITER);
5856
+ return trimmed.split(chunk3JK66E3I_cjs.SQLITE_PATH_DELIMITER);
5784
5857
  }
5785
5858
  function isSqlitePath(value) {
5786
- return typeof value === "string" && value.startsWith(chunkFQCQM3KG_cjs.SQLITE_PATH_DELIMITER) && value.endsWith(chunkFQCQM3KG_cjs.SQLITE_PATH_DELIMITER);
5859
+ return typeof value === "string" && value.startsWith(chunk3JK66E3I_cjs.SQLITE_PATH_DELIMITER) && value.endsWith(chunk3JK66E3I_cjs.SQLITE_PATH_DELIMITER);
5787
5860
  }
5788
5861
  function normalizePath(value) {
5789
5862
  if (Array.isArray(value)) {
@@ -5798,12 +5871,12 @@ function normalizePath(value) {
5798
5871
  return [];
5799
5872
  }
5800
5873
  function isPostgresTextArray(value) {
5801
- return typeof value === "string" && value.startsWith(chunkFQCQM3KG_cjs.PG_ARRAY_START) && value.endsWith(chunkFQCQM3KG_cjs.PG_ARRAY_END);
5874
+ return typeof value === "string" && value.startsWith(chunk3JK66E3I_cjs.PG_ARRAY_START) && value.endsWith(chunk3JK66E3I_cjs.PG_ARRAY_END);
5802
5875
  }
5803
5876
  function parsePostgresTextArray(value) {
5804
5877
  const inner = value.slice(1, -1);
5805
5878
  if (inner === "") return [];
5806
- return inner.split(chunkFQCQM3KG_cjs.PG_PATH_ELEMENT_SEPARATOR);
5879
+ return inner.split(chunk3JK66E3I_cjs.PG_PATH_ELEMENT_SEPARATOR);
5807
5880
  }
5808
5881
 
5809
5882
  // src/query/execution/result-mapper.ts
@@ -6040,7 +6113,7 @@ async function* createStreamIterable(batchSize, paginate) {
6040
6113
  }
6041
6114
  }
6042
6115
  function getStreamBatchSize(options) {
6043
- return options?.batchSize ?? chunkFQCQM3KG_cjs.DEFAULT_STREAM_BATCH_SIZE;
6116
+ return options?.batchSize ?? chunk3JK66E3I_cjs.DEFAULT_STREAM_BATCH_SIZE;
6044
6117
  }
6045
6118
 
6046
6119
  // src/query/execution/field-tracker.ts
@@ -6122,7 +6195,7 @@ function createNodeTrackingProxy(alias, kindNames, tracker, options) {
6122
6195
  return getPlaceholderForSystemField(property, options.mode);
6123
6196
  }
6124
6197
  if (property === "meta") {
6125
- for (const key of chunkFQCQM3KG_cjs.NODE_META_KEYS) {
6198
+ for (const key of chunk3JK66E3I_cjs.NODE_META_KEYS) {
6126
6199
  tracker.record(alias, `meta.${key}`, true);
6127
6200
  }
6128
6201
  return buildNodeMetaPlaceholder(options.mode);
@@ -6155,7 +6228,7 @@ function createEdgeTrackingProxy(alias, edgeKindNames, tracker, options) {
6155
6228
  return getPlaceholderForSystemField(property, options.mode);
6156
6229
  }
6157
6230
  if (property === "meta") {
6158
- for (const key of chunkFQCQM3KG_cjs.EDGE_META_KEYS) {
6231
+ for (const key of chunk3JK66E3I_cjs.EDGE_META_KEYS) {
6159
6232
  tracker.record(alias, `meta.${key}`, true);
6160
6233
  }
6161
6234
  return buildEdgeMetaPlaceholder(options.mode);
@@ -6924,7 +6997,7 @@ function substituteParameters(ast, bindings) {
6924
6997
  };
6925
6998
  }
6926
6999
  function fillPlaceholders(params, bindings, dialect) {
6927
- const adapter = chunkFQCQM3KG_cjs.getDialect(dialect);
7000
+ const adapter = chunk3JK66E3I_cjs.getDialect(dialect);
6928
7001
  return params.map((parameter) => {
6929
7002
  if (parameter instanceof drizzleOrm.Placeholder) {
6930
7003
  const name = parameter.name;
@@ -8019,7 +8092,7 @@ var ExecutableQuery = class _ExecutableQuery {
8019
8092
  );
8020
8093
  }
8021
8094
  const isBackward = options.last !== void 0 || options.before !== void 0;
8022
- const limit = options.first ?? options.last ?? chunkFQCQM3KG_cjs.DEFAULT_PAGINATION_LIMIT;
8095
+ const limit = options.first ?? options.last ?? chunk3JK66E3I_cjs.DEFAULT_PAGINATION_LIMIT;
8023
8096
  const cursor = options.after ?? options.before;
8024
8097
  let cursorData;
8025
8098
  if (cursor) {
@@ -9360,6 +9433,12 @@ function countDistinct(alias, field2) {
9360
9433
  }
9361
9434
  };
9362
9435
  }
9436
+ function countEdges(edgeAlias) {
9437
+ return count(edgeAlias);
9438
+ }
9439
+ function countDistinctEdges(edgeAlias) {
9440
+ return countDistinct(edgeAlias);
9441
+ }
9363
9442
  function sum(alias, field2) {
9364
9443
  return {
9365
9444
  __type: "aggregate",
@@ -9765,7 +9844,7 @@ function createGraphAlgorithms(params) {
9765
9844
  const ctx = {
9766
9845
  graphId: params.graphId,
9767
9846
  backend: params.backend,
9768
- dialect: chunkFQCQM3KG_cjs.getDialect(params.backend.dialect),
9847
+ dialect: chunk3JK66E3I_cjs.getDialect(params.backend.dialect),
9769
9848
  schema: params.schema ?? (params.backend.tableNames ? createSqlSchema(params.backend.tableNames) : createSqlSchema()),
9770
9849
  defaultTemporalMode: params.defaultTemporalMode
9771
9850
  };
@@ -13495,7 +13574,7 @@ var Store = class {
13495
13574
  graphId: this.graphId,
13496
13575
  rootId,
13497
13576
  backend: this.#backend,
13498
- dialect: chunkFQCQM3KG_cjs.getDialect(this.#backend.dialect),
13577
+ dialect: chunk3JK66E3I_cjs.getDialect(this.#backend.dialect),
13499
13578
  schema: this.#schema,
13500
13579
  options
13501
13580
  });
@@ -13807,11 +13886,11 @@ Object.defineProperty(exports, "isUserRecoverable", {
13807
13886
  });
13808
13887
  Object.defineProperty(exports, "fts5Strategy", {
13809
13888
  enumerable: true,
13810
- get: function () { return chunkFQCQM3KG_cjs.fts5Strategy; }
13889
+ get: function () { return chunk3JK66E3I_cjs.fts5Strategy; }
13811
13890
  });
13812
13891
  Object.defineProperty(exports, "tsvectorStrategy", {
13813
13892
  enumerable: true,
13814
- get: function () { return chunkFQCQM3KG_cjs.tsvectorStrategy; }
13893
+ get: function () { return chunk3JK66E3I_cjs.tsvectorStrategy; }
13815
13894
  });
13816
13895
  Object.defineProperty(exports, "DEFAULT_SEARCHABLE_LANGUAGE", {
13817
13896
  enumerable: true,
@@ -13876,6 +13955,8 @@ exports.composeFragments = composeFragments;
13876
13955
  exports.core = core;
13877
13956
  exports.count = count;
13878
13957
  exports.countDistinct = countDistinct;
13958
+ exports.countDistinctEdges = countDistinctEdges;
13959
+ exports.countEdges = countEdges;
13879
13960
  exports.createExternalRef = createExternalRef;
13880
13961
  exports.createFragment = createFragment;
13881
13962
  exports.createQueryBuilder = createQueryBuilder;