@nicia-ai/typegraph 0.21.0 → 0.23.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.
- package/dist/{ast-CSLbPIOC.d.ts → ast-C8S37w1A.d.ts} +1 -1
- package/dist/{ast-DogwbBqA.d.cts → ast-dgLhLOg0.d.cts} +1 -1
- package/dist/backend/postgres/index.cjs +169 -52
- package/dist/backend/postgres/index.cjs.map +1 -1
- package/dist/backend/postgres/index.d.cts +43 -6
- package/dist/backend/postgres/index.d.ts +43 -6
- package/dist/backend/postgres/index.js +140 -23
- package/dist/backend/postgres/index.js.map +1 -1
- package/dist/backend/sqlite/index.cjs +15 -14
- package/dist/backend/sqlite/index.d.cts +17 -6
- package/dist/backend/sqlite/index.d.ts +17 -6
- package/dist/backend/sqlite/index.js +5 -4
- package/dist/backend/sqlite/libsql.cjs +8 -7
- package/dist/backend/sqlite/libsql.cjs.map +1 -1
- package/dist/backend/sqlite/libsql.d.cts +4 -4
- package/dist/backend/sqlite/libsql.d.ts +4 -4
- package/dist/backend/sqlite/libsql.js +5 -4
- package/dist/backend/sqlite/libsql.js.map +1 -1
- package/dist/backend/sqlite/local.cjs +27 -9
- package/dist/backend/sqlite/local.cjs.map +1 -1
- package/dist/backend/sqlite/local.d.cts +4 -4
- package/dist/backend/sqlite/local.d.ts +4 -4
- package/dist/backend/sqlite/local.js +22 -5
- package/dist/backend/sqlite/local.js.map +1 -1
- package/dist/chunk-3EUKJEQ3.js +77 -0
- package/dist/chunk-3EUKJEQ3.js.map +1 -0
- package/dist/{chunk-FQCQM3KG.cjs → chunk-3JK66E3I.cjs} +4 -2
- package/dist/chunk-3JK66E3I.cjs.map +1 -0
- package/dist/{chunk-SMMOAVJ5.js → chunk-3PPEHLGK.js} +3 -3
- package/dist/{chunk-SMMOAVJ5.js.map → chunk-3PPEHLGK.js.map} +1 -1
- package/dist/{chunk-4XNE2JG3.js → chunk-753F33CV.js} +4 -2
- package/dist/chunk-753F33CV.js.map +1 -0
- package/dist/{chunk-Q73OWTJY.cjs → chunk-7OD2EPN4.cjs} +130 -106
- package/dist/chunk-7OD2EPN4.cjs.map +1 -0
- package/dist/chunk-7TU5EWQ7.js +47 -0
- package/dist/chunk-7TU5EWQ7.js.map +1 -0
- package/dist/{chunk-NRNJ52AA.js → chunk-EP2KSSD5.js} +41 -25
- package/dist/chunk-EP2KSSD5.js.map +1 -0
- package/dist/{chunk-UQVBVBVG.js → chunk-H2CAJ4ZV.js} +71 -45
- package/dist/chunk-H2CAJ4ZV.js.map +1 -0
- package/dist/chunk-HTGDWIDE.cjs +89 -0
- package/dist/chunk-HTGDWIDE.cjs.map +1 -0
- package/dist/{chunk-CQL6FOTT.cjs → chunk-O5BRZEIZ.cjs} +58 -42
- package/dist/chunk-O5BRZEIZ.cjs.map +1 -0
- package/dist/{chunk-2X7P7AD5.cjs → chunk-PEE4EWXZ.cjs} +22 -22
- package/dist/{chunk-2X7P7AD5.cjs.map → chunk-PEE4EWXZ.cjs.map} +1 -1
- package/dist/chunk-RNUNP5JD.cjs +52 -0
- package/dist/chunk-RNUNP5JD.cjs.map +1 -0
- package/dist/{ddl-BqkTShcR.d.ts → ddl-1tFIvt9V.d.ts} +3 -3
- package/dist/{ddl-Dk1NDN3M.d.cts → ddl-B_H8JM-E.d.cts} +3 -3
- package/dist/index.cjs +267 -198
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +53 -9
- package/dist/index.d.ts +53 -9
- package/dist/index.js +209 -142
- package/dist/index.js.map +1 -1
- package/dist/indexes/index.cjs +16 -16
- package/dist/indexes/index.d.cts +5 -5
- package/dist/indexes/index.d.ts +5 -5
- package/dist/indexes/index.js +2 -2
- package/dist/interchange/index.d.cts +4 -4
- package/dist/interchange/index.d.ts +4 -4
- package/dist/{manager-BPK-2PUI.d.cts → manager-Vkz28eAC.d.cts} +1 -1
- package/dist/{manager-0jVZtiE8.d.ts → manager-nIhmttD-.d.ts} +1 -1
- package/dist/profiler/index.d.cts +6 -6
- package/dist/profiler/index.d.ts +6 -6
- package/dist/schema/index.d.cts +4 -4
- package/dist/schema/index.d.ts +4 -4
- package/dist/{sqlite-D1rrwcir.d.cts → sqlite-D0aceIe0.d.cts} +1 -1
- package/dist/{sqlite-W3rmJMlc.d.ts → sqlite-SUxbZqfy.d.ts} +1 -1
- package/dist/{store-C0q13mtJ.d.ts → store-CpvwTMxV.d.cts} +58 -8
- package/dist/{store-2QW2SIRk.d.cts → store-U3i2tUch.d.ts} +58 -8
- package/dist/{types-IMQCuser.d.ts → types-C-zfYDJB.d.ts} +2 -2
- package/dist/{types-vgjar7Ch.d.cts → types-CQx4iW5Y.d.cts} +2 -2
- package/dist/{types-CQF88McG.d.ts → types-Qk2l3IkQ.d.cts} +20 -1
- package/dist/{types-CQF88McG.d.cts → types-Qk2l3IkQ.d.ts} +20 -1
- package/dist/{types-CglvhPKz.d.ts → types-qYFZ9SqD.d.ts} +1 -1
- package/dist/{types-D23slCOA.d.cts → types-yH4_p0XB.d.cts} +1 -1
- package/package.json +15 -1
- package/dist/chunk-4XNE2JG3.js.map +0 -1
- package/dist/chunk-CQL6FOTT.cjs.map +0 -1
- package/dist/chunk-FQCQM3KG.cjs.map +0 -1
- package/dist/chunk-NRNJ52AA.js.map +0 -1
- package/dist/chunk-Q73OWTJY.cjs.map +0 -1
- package/dist/chunk-UQVBVBVG.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
|
+
import { quoteIdentifier, EMPTY_REQUIRED_COLUMNS, addRequiredColumn, markSelectiveFieldAsRequired, markFieldRefAsRequired, NODE_COLUMNS, shouldProjectColumn, mapSelectiveSystemFieldToColumn, isIdFieldRef, isAggregateExpr, EDGE_COLUMNS } from './chunk-3EUKJEQ3.js';
|
|
1
2
|
import { META_EDGE_BRAND, META_EDGE_SUB_CLASS_OF, META_EDGE_NARROWER, META_EDGE_BROADER, META_EDGE_RELATED_TO, META_EDGE_EQUIVALENT_TO, META_EDGE_SAME_AS, META_EDGE_DIFFERENT_FROM, META_EDGE_DISJOINT_WITH, META_EDGE_HAS_PART, META_EDGE_PART_OF, META_EDGE_INVERSE_OF, META_EDGE_IMPLIES, ensureSchema, computeClosuresFromOntology, createEmptyClosures, KindRegistry, validateNodeProps, validateEdgeProps } from './chunk-JYUQA77I.js';
|
|
2
3
|
export { isMetaEdge } from './chunk-JYUQA77I.js';
|
|
3
4
|
import { NODE_TYPE_BRAND, EDGE_TYPE_BRAND, nowIso, validateOptionalIsoDate, getNodeKinds, getEdgeKinds } from './chunk-RS5OLGEW.js';
|
|
4
5
|
export { defineGraph, getEdgeKinds, getNodeKinds, isEdgeType, isEdgeTypeWithEndpoints, isGraphDef, isNodeType } from './chunk-RS5OLGEW.js';
|
|
6
|
+
import { runOptionallyInTransaction } from './chunk-7TU5EWQ7.js';
|
|
5
7
|
import { ConfigurationError, UnsupportedPredicateError, ValidationError, CompilerInvariantError, KindNotFoundError, DatabaseOperationError, EdgeNotFoundError, NodeConstraintNotFoundError, RestrictedDeleteError, NodeNotFoundError, EndpointNotFoundError, UniquenessError, CardinalityError, EndpointError, DisjointError } from './chunk-WFMTAEEN.js';
|
|
6
8
|
export { BackendDisposedError, CardinalityError, CompilerInvariantError, ConfigurationError, DatabaseOperationError, DisjointError, EdgeNotFoundError, EndpointError, EndpointNotFoundError, KindNotFoundError, MigrationError, NodeConstraintNotFoundError, NodeNotFoundError, RestrictedDeleteError, SchemaMismatchError, TypeGraphError, UniquenessError, UnsupportedPredicateError, ValidationError, VersionConflictError, getErrorSuggestion, isConstraintError, isSystemError, isTypeGraphError, isUserRecoverable } from './chunk-WFMTAEEN.js';
|
|
7
|
-
import { MAX_PG_IDENTIFIER_LENGTH, DEFAULT_PAGINATION_LIMIT, getDialect, DEFAULT_STREAM_BATCH_SIZE, NODE_META_KEYS, EDGE_META_KEYS, SQLITE_PATH_DELIMITER, PG_ARRAY_START, PG_ARRAY_END, PG_PATH_ELEMENT_SEPARATOR, fnv1aBase36 } from './chunk-
|
|
8
|
-
export { fts5Strategy, tsvectorStrategy } from './chunk-
|
|
9
|
+
import { MAX_PG_IDENTIFIER_LENGTH, DEFAULT_PAGINATION_LIMIT, getDialect, DEFAULT_STREAM_BATCH_SIZE, NODE_META_KEYS, EDGE_META_KEYS, SQLITE_PATH_DELIMITER, PG_ARRAY_START, PG_ARRAY_END, PG_PATH_ELEMENT_SEPARATOR, fnv1aBase36 } from './chunk-753F33CV.js';
|
|
10
|
+
export { fts5Strategy, tsvectorStrategy } from './chunk-753F33CV.js';
|
|
9
11
|
import { jsonPointer, parseJsonPointer, createSchemaIntrospector, normalizeJsonPointer, joinJsonPointers, resolveFieldTypeInfoAtJsonPointer, getSearchableMetadata, DEFAULT_SEARCHABLE_LANGUAGE, getEmbeddingDimensions, isEmbeddingSchema } from './chunk-EYELZHKY.js';
|
|
10
12
|
export { DEFAULT_SEARCHABLE_LANGUAGE, MAX_JSON_POINTER_DEPTH, embedding, getEmbeddingDimensions, getSearchableMetadata, isEmbeddingSchema, isSearchableSchema, joinJsonPointers, jsonPointer, normalizeJsonPointer, parseJsonPointer, searchable } from './chunk-EYELZHKY.js';
|
|
11
13
|
import { z } from 'zod';
|
|
@@ -1944,7 +1946,7 @@ function validateTableName(name, label) {
|
|
|
1944
1946
|
);
|
|
1945
1947
|
}
|
|
1946
1948
|
}
|
|
1947
|
-
function
|
|
1949
|
+
function quoteIdentifier2(name) {
|
|
1948
1950
|
return `"${name.replaceAll('"', '""')}"`;
|
|
1949
1951
|
}
|
|
1950
1952
|
function createSqlSchema(names = {}) {
|
|
@@ -1955,10 +1957,10 @@ function createSqlSchema(names = {}) {
|
|
|
1955
1957
|
validateTableName(tables.fulltext, "fulltext");
|
|
1956
1958
|
return {
|
|
1957
1959
|
tables,
|
|
1958
|
-
nodesTable: sql.raw(
|
|
1959
|
-
edgesTable: sql.raw(
|
|
1960
|
-
embeddingsTable: sql.raw(
|
|
1961
|
-
fulltextTable: sql.raw(
|
|
1960
|
+
nodesTable: sql.raw(quoteIdentifier2(tables.nodes)),
|
|
1961
|
+
edgesTable: sql.raw(quoteIdentifier2(tables.edges)),
|
|
1962
|
+
embeddingsTable: sql.raw(quoteIdentifier2(tables.embeddings)),
|
|
1963
|
+
fulltextTable: sql.raw(quoteIdentifier2(tables.fulltext))
|
|
1962
1964
|
};
|
|
1963
1965
|
}
|
|
1964
1966
|
var DEFAULT_SQL_SCHEMA = createSqlSchema();
|
|
@@ -1996,76 +1998,6 @@ function compileTypedJsonExtract(input) {
|
|
|
1996
1998
|
}
|
|
1997
1999
|
}
|
|
1998
2000
|
}
|
|
1999
|
-
var NODE_COLUMNS = [
|
|
2000
|
-
"id",
|
|
2001
|
-
"kind",
|
|
2002
|
-
"props",
|
|
2003
|
-
"version",
|
|
2004
|
-
"valid_from",
|
|
2005
|
-
"valid_to",
|
|
2006
|
-
"created_at",
|
|
2007
|
-
"updated_at",
|
|
2008
|
-
"deleted_at"
|
|
2009
|
-
];
|
|
2010
|
-
var EDGE_COLUMNS = [
|
|
2011
|
-
"id",
|
|
2012
|
-
"kind",
|
|
2013
|
-
"from_id",
|
|
2014
|
-
"to_id",
|
|
2015
|
-
"props",
|
|
2016
|
-
"valid_from",
|
|
2017
|
-
"valid_to",
|
|
2018
|
-
"created_at",
|
|
2019
|
-
"updated_at",
|
|
2020
|
-
"deleted_at"
|
|
2021
|
-
];
|
|
2022
|
-
var EMPTY_REQUIRED_COLUMNS = /* @__PURE__ */ new Set();
|
|
2023
|
-
function quoteIdentifier2(identifier) {
|
|
2024
|
-
return sql.raw(`"${identifier.replaceAll('"', '""')}"`);
|
|
2025
|
-
}
|
|
2026
|
-
function shouldProjectColumn(requiredColumns, column, alwaysRequiredColumns) {
|
|
2027
|
-
if (alwaysRequiredColumns?.has(column)) return true;
|
|
2028
|
-
if (requiredColumns === void 0) return true;
|
|
2029
|
-
return requiredColumns.has(column);
|
|
2030
|
-
}
|
|
2031
|
-
function addRequiredColumn(requiredColumnsByAlias, alias, column) {
|
|
2032
|
-
const existing = requiredColumnsByAlias.get(alias);
|
|
2033
|
-
if (existing) {
|
|
2034
|
-
existing.add(column);
|
|
2035
|
-
return;
|
|
2036
|
-
}
|
|
2037
|
-
requiredColumnsByAlias.set(alias, /* @__PURE__ */ new Set([column]));
|
|
2038
|
-
}
|
|
2039
|
-
function markFieldRefAsRequired(requiredColumnsByAlias, field2) {
|
|
2040
|
-
const column = field2.path[0];
|
|
2041
|
-
if (column === void 0) return;
|
|
2042
|
-
addRequiredColumn(requiredColumnsByAlias, field2.alias, column);
|
|
2043
|
-
}
|
|
2044
|
-
function mapSelectiveSystemFieldToColumn(field2) {
|
|
2045
|
-
if (field2 === "fromId") return "from_id";
|
|
2046
|
-
if (field2 === "toId") return "to_id";
|
|
2047
|
-
if (field2.startsWith("meta.")) {
|
|
2048
|
-
return field2.slice(5).replaceAll(/([A-Z])/g, "_$1").toLowerCase();
|
|
2049
|
-
}
|
|
2050
|
-
return field2;
|
|
2051
|
-
}
|
|
2052
|
-
function markSelectiveFieldAsRequired(requiredColumnsByAlias, field2) {
|
|
2053
|
-
if (field2.isSystemField) {
|
|
2054
|
-
addRequiredColumn(
|
|
2055
|
-
requiredColumnsByAlias,
|
|
2056
|
-
field2.alias,
|
|
2057
|
-
mapSelectiveSystemFieldToColumn(field2.field)
|
|
2058
|
-
);
|
|
2059
|
-
return;
|
|
2060
|
-
}
|
|
2061
|
-
addRequiredColumn(requiredColumnsByAlias, field2.alias, "props");
|
|
2062
|
-
}
|
|
2063
|
-
function isIdFieldRef(field2) {
|
|
2064
|
-
return field2.path.length === 1 && field2.path[0] === "id" && field2.jsonPointer === void 0;
|
|
2065
|
-
}
|
|
2066
|
-
function isAggregateExpr(source) {
|
|
2067
|
-
return "__type" in source && source.__type === "aggregate";
|
|
2068
|
-
}
|
|
2069
2001
|
|
|
2070
2002
|
// src/query/compiler/emitter/standard-builders.ts
|
|
2071
2003
|
function compileColumnReference(tableAlias, column) {
|
|
@@ -2075,7 +2007,7 @@ function compileColumnReference(tableAlias, column) {
|
|
|
2075
2007
|
return sql`${sql.raw(tableAlias)}.${sql.raw(column)}`;
|
|
2076
2008
|
}
|
|
2077
2009
|
function qualifyColumn(owner, name) {
|
|
2078
|
-
return sql`${
|
|
2010
|
+
return sql`${quoteIdentifier(owner)}.${quoteIdentifier(name)}`;
|
|
2079
2011
|
}
|
|
2080
2012
|
var SCOPED_RELEVANCE_NODES_ALIAS = "scoped_relevance_nodes";
|
|
2081
2013
|
function buildScopedNodeIdsSubquery(nodeAlias) {
|
|
@@ -2085,7 +2017,7 @@ function buildScopedNodeIdsSubquery(nodeAlias) {
|
|
|
2085
2017
|
SELECT DISTINCT
|
|
2086
2018
|
${qualifyColumn(cteAlias, `${nodeAlias}_id`)} AS node_id,
|
|
2087
2019
|
${qualifyColumn(cteAlias, `${nodeAlias}_kind`)} AS node_kind
|
|
2088
|
-
FROM ${
|
|
2020
|
+
FROM ${quoteIdentifier(cteAlias)}
|
|
2089
2021
|
) AS ${sql.raw(SCOPED_RELEVANCE_NODES_ALIAS)}
|
|
2090
2022
|
`;
|
|
2091
2023
|
}
|
|
@@ -2107,6 +2039,7 @@ function buildStandardStartCte(input) {
|
|
|
2107
2039
|
const { ast, ctx, graphId, predicateIndex, requiredColumnsByAlias } = input;
|
|
2108
2040
|
const alias = ast.start.alias;
|
|
2109
2041
|
const kinds = ast.start.kinds;
|
|
2042
|
+
const cteMaterialization = ctx.dialect.capabilities.emitNotMaterializedHint ? sql`NOT MATERIALIZED ` : sql``;
|
|
2110
2043
|
const kindFilter = compileKindFilter(sql.raw("kind"), kinds);
|
|
2111
2044
|
const temporalFilter = input.temporalFilterPass.forAlias();
|
|
2112
2045
|
const cteContext = { ...ctx, cteColumnPrefix: "" };
|
|
@@ -2121,14 +2054,19 @@ function buildStandardStartCte(input) {
|
|
|
2121
2054
|
...predicateClauses
|
|
2122
2055
|
];
|
|
2123
2056
|
const effectiveRequiredColumns = requiredColumnsByAlias ? requiredColumnsByAlias.get(alias) ?? EMPTY_REQUIRED_COLUMNS : void 0;
|
|
2057
|
+
const limitClause = input.limitOffset === void 0 ? sql`` : input.limitOffset.offset === void 0 ? sql`
|
|
2058
|
+
LIMIT ${input.limitOffset.limit}
|
|
2059
|
+
` : sql`
|
|
2060
|
+
LIMIT ${input.limitOffset.limit} OFFSET ${input.limitOffset.offset}
|
|
2061
|
+
`;
|
|
2124
2062
|
return sql`
|
|
2125
|
-
cte_${sql.raw(alias)} AS (
|
|
2063
|
+
cte_${sql.raw(alias)} AS ${cteMaterialization}(
|
|
2126
2064
|
SELECT ${sql.join(
|
|
2127
2065
|
compileNodeSelectColumns(void 0, alias, effectiveRequiredColumns),
|
|
2128
2066
|
sql`, `
|
|
2129
2067
|
)}
|
|
2130
2068
|
FROM ${ctx.schema.nodesTable}
|
|
2131
|
-
WHERE ${sql.join(whereClauses, sql` AND `)}
|
|
2069
|
+
WHERE ${sql.join(whereClauses, sql` AND `)}${limitClause}
|
|
2132
2070
|
)
|
|
2133
2071
|
`;
|
|
2134
2072
|
}
|
|
@@ -2192,7 +2130,7 @@ function buildStandardTraversalCte(input) {
|
|
|
2192
2130
|
...compileEdgeSelectColumns("e", edgeAlias, requiredEdgeColumns),
|
|
2193
2131
|
...compileNodeSelectColumns("n", nodeAlias, requiredNodeColumns)
|
|
2194
2132
|
];
|
|
2195
|
-
const cteMaterialization = materializeCte ? sql`MATERIALIZED ` : sql``;
|
|
2133
|
+
const cteMaterialization = materializeCte ? sql`MATERIALIZED ` : ctx.dialect.capabilities.emitNotMaterializedHint ? sql`NOT MATERIALIZED ` : sql``;
|
|
2196
2134
|
function compileTraversalBranch(branch) {
|
|
2197
2135
|
const whereClauses = [
|
|
2198
2136
|
...baseWhereClauses,
|
|
@@ -2341,7 +2279,7 @@ function buildStandardProjection(input) {
|
|
|
2341
2279
|
}
|
|
2342
2280
|
const projectedFields = fields.map((field2) => {
|
|
2343
2281
|
const source = compileProjectedSource(field2, dialect);
|
|
2344
|
-
return sql`${source} AS ${
|
|
2282
|
+
return sql`${source} AS ${quoteIdentifier(field2.outputName)}`;
|
|
2345
2283
|
});
|
|
2346
2284
|
return sql.join(projectedFields, sql`, `);
|
|
2347
2285
|
}
|
|
@@ -2361,7 +2299,7 @@ function compileSelectiveProjection(fields, dialect, ast, collapsedTraversalCteA
|
|
|
2361
2299
|
const cteAlias = collapsedTraversalCteAlias ?? aliasToCte.get(field2.alias) ?? `cte_${field2.alias}`;
|
|
2362
2300
|
if (field2.isSystemField) {
|
|
2363
2301
|
const dbColumn = mapSelectiveSystemFieldToColumn(field2.field);
|
|
2364
|
-
return sql`${sql.raw(cteAlias)}.${sql.raw(`${field2.alias}_${dbColumn}`)} AS ${
|
|
2302
|
+
return sql`${sql.raw(cteAlias)}.${sql.raw(`${field2.alias}_${dbColumn}`)} AS ${quoteIdentifier(field2.outputName)}`;
|
|
2365
2303
|
}
|
|
2366
2304
|
const propsColumn = `${field2.alias}_props`;
|
|
2367
2305
|
const column = sql`${sql.raw(cteAlias)}.${sql.raw(propsColumn)}`;
|
|
@@ -2372,7 +2310,7 @@ function compileSelectiveProjection(fields, dialect, ast, collapsedTraversalCteA
|
|
|
2372
2310
|
pointer,
|
|
2373
2311
|
valueType: field2.valueType
|
|
2374
2312
|
});
|
|
2375
|
-
return sql`${extracted} AS ${
|
|
2313
|
+
return sql`${extracted} AS ${quoteIdentifier(field2.outputName)}`;
|
|
2376
2314
|
});
|
|
2377
2315
|
return sql.join(columns, sql`, `);
|
|
2378
2316
|
}
|
|
@@ -3703,10 +3641,10 @@ function compileRecursiveProjection(ast, traversal, dialect) {
|
|
|
3703
3641
|
sql`${sql.raw(nodeAlias)}_deleted_at`
|
|
3704
3642
|
];
|
|
3705
3643
|
if (vl.depthAlias !== void 0) {
|
|
3706
|
-
fields.push(sql`depth AS ${
|
|
3644
|
+
fields.push(sql`depth AS ${quoteIdentifier(vl.depthAlias)}`);
|
|
3707
3645
|
}
|
|
3708
3646
|
if (vl.pathAlias !== void 0) {
|
|
3709
|
-
fields.push(sql`path AS ${
|
|
3647
|
+
fields.push(sql`path AS ${quoteIdentifier(vl.pathAlias)}`);
|
|
3710
3648
|
}
|
|
3711
3649
|
return sql.join(fields, sql`, `);
|
|
3712
3650
|
}
|
|
@@ -3720,7 +3658,7 @@ function compileRecursiveSelectiveProjection(fields, ast, traversal, dialect) {
|
|
|
3720
3658
|
}
|
|
3721
3659
|
if (field2.isSystemField) {
|
|
3722
3660
|
const dbColumn = mapSelectiveSystemFieldToColumn(field2.field);
|
|
3723
|
-
return sql`${sql.raw(`${field2.alias}_${dbColumn}`)} AS ${
|
|
3661
|
+
return sql`${sql.raw(`${field2.alias}_${dbColumn}`)} AS ${quoteIdentifier(field2.outputName)}`;
|
|
3724
3662
|
}
|
|
3725
3663
|
const column = sql.raw(`${field2.alias}_props`);
|
|
3726
3664
|
const extracted = compileTypedJsonExtract({
|
|
@@ -3729,14 +3667,14 @@ function compileRecursiveSelectiveProjection(fields, ast, traversal, dialect) {
|
|
|
3729
3667
|
pointer: jsonPointer([field2.field]),
|
|
3730
3668
|
valueType: field2.valueType
|
|
3731
3669
|
});
|
|
3732
|
-
return sql`${extracted} AS ${
|
|
3670
|
+
return sql`${extracted} AS ${quoteIdentifier(field2.outputName)}`;
|
|
3733
3671
|
});
|
|
3734
3672
|
const vl = traversal.variableLength;
|
|
3735
3673
|
if (vl.depthAlias !== void 0) {
|
|
3736
|
-
columns.push(sql`depth AS ${
|
|
3674
|
+
columns.push(sql`depth AS ${quoteIdentifier(vl.depthAlias)}`);
|
|
3737
3675
|
}
|
|
3738
3676
|
if (vl.pathAlias !== void 0) {
|
|
3739
|
-
columns.push(sql`path AS ${
|
|
3677
|
+
columns.push(sql`path AS ${quoteIdentifier(vl.pathAlias)}`);
|
|
3740
3678
|
}
|
|
3741
3679
|
return sql.join(columns, sql`, `);
|
|
3742
3680
|
}
|
|
@@ -4251,7 +4189,7 @@ function buildProjectedPropertyColumns(alias, plan, dialect) {
|
|
|
4251
4189
|
valueType: fieldPlan.typeInfo?.valueType
|
|
4252
4190
|
});
|
|
4253
4191
|
columns.push(
|
|
4254
|
-
sql`CASE WHEN ${sql.raw(alias)}.kind = ${kind} THEN ${extracted} ELSE NULL END AS ${
|
|
4192
|
+
sql`CASE WHEN ${sql.raw(alias)}.kind = ${kind} THEN ${extracted} ELSE NULL END AS ${quoteIdentifier(fieldPlan.outputName)}`
|
|
4255
4193
|
);
|
|
4256
4194
|
}
|
|
4257
4195
|
}
|
|
@@ -5282,8 +5220,10 @@ function resolveCountAggregateFastPath(ast) {
|
|
|
5282
5220
|
if (groupField.alias !== ast.start.alias || !isIdFieldRef(groupField)) {
|
|
5283
5221
|
return void 0;
|
|
5284
5222
|
}
|
|
5285
|
-
let
|
|
5286
|
-
let
|
|
5223
|
+
let requiresNodeCount = false;
|
|
5224
|
+
let requiresNodeCountDistinct = false;
|
|
5225
|
+
let requiresEdgeCount = false;
|
|
5226
|
+
let requiresEdgeCountDistinct = false;
|
|
5287
5227
|
for (const projectedField of ast.projection.fields) {
|
|
5288
5228
|
const source = projectedField.source;
|
|
5289
5229
|
if (!isAggregateExpr(source)) {
|
|
@@ -5292,26 +5232,35 @@ function resolveCountAggregateFastPath(ast) {
|
|
|
5292
5232
|
}
|
|
5293
5233
|
continue;
|
|
5294
5234
|
}
|
|
5295
|
-
if (
|
|
5235
|
+
if (!isIdFieldRef(source.field)) {
|
|
5236
|
+
return void 0;
|
|
5237
|
+
}
|
|
5238
|
+
const isNodeTarget = source.field.alias === traversal.nodeAlias;
|
|
5239
|
+
const isEdgeTarget = source.field.alias === traversal.edgeAlias;
|
|
5240
|
+
if (!isNodeTarget && !isEdgeTarget) {
|
|
5296
5241
|
return void 0;
|
|
5297
5242
|
}
|
|
5298
5243
|
if (source.function === "count") {
|
|
5299
|
-
|
|
5244
|
+
if (isNodeTarget) requiresNodeCount = true;
|
|
5245
|
+
else requiresEdgeCount = true;
|
|
5300
5246
|
continue;
|
|
5301
5247
|
}
|
|
5302
5248
|
if (source.function === "countDistinct") {
|
|
5303
|
-
|
|
5249
|
+
if (isNodeTarget) requiresNodeCountDistinct = true;
|
|
5250
|
+
else requiresEdgeCountDistinct = true;
|
|
5304
5251
|
continue;
|
|
5305
5252
|
}
|
|
5306
5253
|
return void 0;
|
|
5307
5254
|
}
|
|
5308
|
-
if (!
|
|
5255
|
+
if (!requiresNodeCount && !requiresNodeCountDistinct && !requiresEdgeCount && !requiresEdgeCountDistinct) {
|
|
5309
5256
|
return void 0;
|
|
5310
5257
|
}
|
|
5311
5258
|
return {
|
|
5312
5259
|
traversal,
|
|
5313
|
-
|
|
5314
|
-
|
|
5260
|
+
requiresNodeCount,
|
|
5261
|
+
requiresNodeCountDistinct,
|
|
5262
|
+
requiresEdgeCount,
|
|
5263
|
+
requiresEdgeCountDistinct
|
|
5315
5264
|
};
|
|
5316
5265
|
}
|
|
5317
5266
|
function compileCountAggregateFastPath(ast, graphId, ctx, logicalPlan, requiredColumnsByAlias, predicateIndex, temporalFilterPass) {
|
|
@@ -5319,15 +5268,23 @@ function compileCountAggregateFastPath(ast, graphId, ctx, logicalPlan, requiredC
|
|
|
5319
5268
|
if (!plan) {
|
|
5320
5269
|
return void 0;
|
|
5321
5270
|
}
|
|
5322
|
-
const {
|
|
5271
|
+
const {
|
|
5272
|
+
traversal,
|
|
5273
|
+
requiresNodeCount,
|
|
5274
|
+
requiresNodeCountDistinct,
|
|
5275
|
+
requiresEdgeCount,
|
|
5276
|
+
requiresEdgeCountDistinct
|
|
5277
|
+
} = plan;
|
|
5323
5278
|
const { dialect } = ctx;
|
|
5324
5279
|
const startAlias = ast.start.alias;
|
|
5325
5280
|
const previousAlias = traversal.joinFromAlias;
|
|
5326
5281
|
const previousAliasIdColumn = `${previousAlias}_id`;
|
|
5327
5282
|
const previousAliasKindColumn = `${previousAlias}_kind`;
|
|
5328
5283
|
const countCteAlias = `cte_${traversal.nodeAlias}_counts`;
|
|
5329
|
-
const
|
|
5330
|
-
const
|
|
5284
|
+
const nodeCountColumn = `${traversal.nodeAlias}_count`;
|
|
5285
|
+
const nodeCountDistinctColumn = `${traversal.nodeAlias}_count_distinct`;
|
|
5286
|
+
const edgeCountColumn = `${traversal.edgeAlias}_count`;
|
|
5287
|
+
const edgeCountDistinctColumn = `${traversal.edgeAlias}_count_distinct`;
|
|
5331
5288
|
const previousNodeKinds = getNodeKindsForAlias(ast, traversal.joinFromAlias);
|
|
5332
5289
|
const edgeKinds = [...new Set(traversal.edgeKinds)];
|
|
5333
5290
|
const nodeKinds = traversal.nodeKinds;
|
|
@@ -5353,34 +5310,68 @@ function compileCountAggregateFastPath(ast, graphId, ctx, logicalPlan, requiredC
|
|
|
5353
5310
|
const targetField = traversal.direction === "out" ? "to_id" : "from_id";
|
|
5354
5311
|
const joinKindField = traversal.direction === "out" ? "from_kind" : "to_kind";
|
|
5355
5312
|
const targetKindField = traversal.direction === "out" ? "to_kind" : "from_kind";
|
|
5313
|
+
const hasNodePredicates = nodePredicateClauses.length > 0;
|
|
5314
|
+
const requiresNodeJoin = requiresNodeCount || requiresNodeCountDistinct || hasNodePredicates;
|
|
5315
|
+
const useInnerJoin = hasNodePredicates;
|
|
5356
5316
|
const whereClauses = [
|
|
5357
5317
|
sql`e.graph_id = ${graphId}`,
|
|
5358
5318
|
compileKindFilter(sql.raw("e.kind"), edgeKinds),
|
|
5359
5319
|
compileKindFilter(sql.raw(`e.${joinKindField}`), previousNodeKinds),
|
|
5360
5320
|
compileKindFilter(sql.raw(`e.${targetKindField}`), nodeKinds),
|
|
5361
|
-
compileKindFilter(sql.raw("n.kind"), nodeKinds),
|
|
5362
5321
|
edgeTemporalFilter,
|
|
5363
|
-
|
|
5364
|
-
|
|
5365
|
-
...
|
|
5322
|
+
...edgePredicateClauses,
|
|
5323
|
+
// INNER JOIN mode: node-side filters in WHERE constrain every aggregate.
|
|
5324
|
+
...requiresNodeJoin && useInnerJoin ? [
|
|
5325
|
+
compileKindFilter(sql.raw("n.kind"), nodeKinds),
|
|
5326
|
+
nodeTemporalFilter,
|
|
5327
|
+
...nodePredicateClauses
|
|
5328
|
+
] : []
|
|
5366
5329
|
];
|
|
5330
|
+
const nodeJoinOnClauses = requiresNodeJoin ? useInnerJoin ? (
|
|
5331
|
+
// INNER JOIN: only the key conditions; filters live in WHERE.
|
|
5332
|
+
[
|
|
5333
|
+
sql`n.graph_id = e.graph_id`,
|
|
5334
|
+
sql`n.id = e.${sql.raw(targetField)}`,
|
|
5335
|
+
sql`n.kind = e.${sql.raw(targetKindField)}`
|
|
5336
|
+
]
|
|
5337
|
+
) : [
|
|
5338
|
+
sql`n.graph_id = e.graph_id`,
|
|
5339
|
+
sql`n.id = e.${sql.raw(targetField)}`,
|
|
5340
|
+
sql`n.kind = e.${sql.raw(targetKindField)}`,
|
|
5341
|
+
compileKindFilter(sql.raw("n.kind"), nodeKinds),
|
|
5342
|
+
nodeTemporalFilter
|
|
5343
|
+
] : [];
|
|
5367
5344
|
const aggregateColumns = [];
|
|
5368
|
-
if (
|
|
5369
|
-
aggregateColumns.push(sql`COUNT(n.id) AS ${sql.raw(
|
|
5345
|
+
if (requiresNodeCount) {
|
|
5346
|
+
aggregateColumns.push(sql`COUNT(n.id) AS ${sql.raw(nodeCountColumn)}`);
|
|
5347
|
+
}
|
|
5348
|
+
if (requiresNodeCountDistinct) {
|
|
5349
|
+
aggregateColumns.push(
|
|
5350
|
+
sql`COUNT(DISTINCT n.id) AS ${sql.raw(nodeCountDistinctColumn)}`
|
|
5351
|
+
);
|
|
5370
5352
|
}
|
|
5371
|
-
if (
|
|
5353
|
+
if (requiresEdgeCount) {
|
|
5354
|
+
aggregateColumns.push(sql`COUNT(e.id) AS ${sql.raw(edgeCountColumn)}`);
|
|
5355
|
+
}
|
|
5356
|
+
if (requiresEdgeCountDistinct) {
|
|
5372
5357
|
aggregateColumns.push(
|
|
5373
|
-
sql`COUNT(DISTINCT
|
|
5358
|
+
sql`COUNT(DISTINCT e.id) AS ${sql.raw(edgeCountDistinctColumn)}`
|
|
5374
5359
|
);
|
|
5375
5360
|
}
|
|
5361
|
+
const startCteLimit = traversal.optional && ast.orderBy === void 0 && ast.limit !== void 0 ? { limit: ast.limit, offset: ast.offset } : void 0;
|
|
5376
5362
|
const startCte = buildStandardStartCte({
|
|
5377
5363
|
ast,
|
|
5378
5364
|
ctx,
|
|
5379
5365
|
graphId,
|
|
5380
5366
|
predicateIndex,
|
|
5381
5367
|
requiredColumnsByAlias,
|
|
5382
|
-
temporalFilterPass
|
|
5368
|
+
temporalFilterPass,
|
|
5369
|
+
...startCteLimit === void 0 ? {} : { limitOffset: startCteLimit }
|
|
5383
5370
|
});
|
|
5371
|
+
const targetNodeJoinKeyword = useInnerJoin ? "JOIN" : "LEFT JOIN";
|
|
5372
|
+
const targetNodeJoin = requiresNodeJoin ? sql`
|
|
5373
|
+
${sql.raw(targetNodeJoinKeyword)} ${ctx.schema.nodesTable} n ON ${sql.join(nodeJoinOnClauses, sql` AND `)}
|
|
5374
|
+
` : sql``;
|
|
5384
5375
|
const countCte = sql`
|
|
5385
5376
|
${sql.raw(countCteAlias)} AS (
|
|
5386
5377
|
SELECT
|
|
@@ -5389,16 +5380,20 @@ function compileCountAggregateFastPath(ast, graphId, ctx, logicalPlan, requiredC
|
|
|
5389
5380
|
${sql.join(aggregateColumns, sql`, `)}
|
|
5390
5381
|
FROM cte_${sql.raw(previousAlias)}
|
|
5391
5382
|
JOIN ${ctx.schema.edgesTable} e ON cte_${sql.raw(previousAlias)}.${sql.raw(previousAliasIdColumn)} = e.${sql.raw(joinField)}
|
|
5392
|
-
AND cte_${sql.raw(previousAlias)}.${sql.raw(previousAliasKindColumn)} = e.${sql.raw(joinKindField)}
|
|
5393
|
-
JOIN ${ctx.schema.nodesTable} n ON n.graph_id = e.graph_id
|
|
5394
|
-
AND n.id = e.${sql.raw(targetField)}
|
|
5395
|
-
AND n.kind = e.${sql.raw(targetKindField)}
|
|
5383
|
+
AND cte_${sql.raw(previousAlias)}.${sql.raw(previousAliasKindColumn)} = e.${sql.raw(joinKindField)}${targetNodeJoin}
|
|
5396
5384
|
WHERE ${sql.join(whereClauses, sql` AND `)}
|
|
5397
5385
|
GROUP BY
|
|
5398
5386
|
cte_${sql.raw(previousAlias)}.${sql.raw(previousAliasIdColumn)},
|
|
5399
5387
|
cte_${sql.raw(previousAlias)}.${sql.raw(previousAliasKindColumn)}
|
|
5400
5388
|
)
|
|
5401
5389
|
`;
|
|
5390
|
+
function resolveCountColumn(source) {
|
|
5391
|
+
const isEdge = source.field.alias === traversal.edgeAlias;
|
|
5392
|
+
if (source.function === "countDistinct") {
|
|
5393
|
+
return isEdge ? edgeCountDistinctColumn : nodeCountDistinctColumn;
|
|
5394
|
+
}
|
|
5395
|
+
return isEdge ? edgeCountColumn : nodeCountColumn;
|
|
5396
|
+
}
|
|
5402
5397
|
const projection = sql.join(
|
|
5403
5398
|
ast.projection.fields.map((projectedField) => {
|
|
5404
5399
|
const source = projectedField.source;
|
|
@@ -5409,12 +5404,12 @@ function compileCountAggregateFastPath(ast, graphId, ctx, logicalPlan, requiredC
|
|
|
5409
5404
|
source.valueType,
|
|
5410
5405
|
`cte_${source.alias}`
|
|
5411
5406
|
);
|
|
5412
|
-
return sql`${value} AS ${
|
|
5407
|
+
return sql`${value} AS ${quoteIdentifier(projectedField.outputName)}`;
|
|
5413
5408
|
}
|
|
5414
|
-
const projectedCountColumn = source
|
|
5409
|
+
const projectedCountColumn = resolveCountColumn(source);
|
|
5415
5410
|
const countValue = sql`${sql.raw(countCteAlias)}.${sql.raw(projectedCountColumn)}`;
|
|
5416
5411
|
const aggregateValue = traversal.optional ? sql`COALESCE(${countValue}, 0)` : countValue;
|
|
5417
|
-
return sql`${aggregateValue} AS ${
|
|
5412
|
+
return sql`${aggregateValue} AS ${quoteIdentifier(projectedField.outputName)}`;
|
|
5418
5413
|
}),
|
|
5419
5414
|
sql`, `
|
|
5420
5415
|
);
|
|
@@ -5426,19 +5421,29 @@ function compileCountAggregateFastPath(ast, graphId, ctx, logicalPlan, requiredC
|
|
|
5426
5421
|
AND ${sql.raw(countCteAlias)}.${sql.raw(previousAliasKindColumn)} = cte_${sql.raw(previousAlias)}.${sql.raw(previousAliasKindColumn)}
|
|
5427
5422
|
`;
|
|
5428
5423
|
const orderBy = buildStandardOrderBy({ ast, dialect });
|
|
5429
|
-
const
|
|
5430
|
-
|
|
5431
|
-
offset: ast.offset
|
|
5432
|
-
});
|
|
5424
|
+
const emittedLogicalPlan = startCteLimit === void 0 ? logicalPlan : stripLimitOffsetFromPlan(logicalPlan);
|
|
5425
|
+
const limitOffset = startCteLimit === void 0 ? buildLimitOffsetClause({ limit: ast.limit, offset: ast.offset }) : void 0;
|
|
5433
5426
|
return emitStandardQuerySql({
|
|
5434
5427
|
ctes: [startCte, countCte],
|
|
5435
5428
|
fromClause,
|
|
5436
5429
|
...orderBy === void 0 ? {} : { orderBy },
|
|
5437
5430
|
...limitOffset === void 0 ? {} : { limitOffset },
|
|
5438
|
-
logicalPlan,
|
|
5431
|
+
logicalPlan: emittedLogicalPlan,
|
|
5439
5432
|
projection
|
|
5440
5433
|
});
|
|
5441
5434
|
}
|
|
5435
|
+
function stripLimitOffsetFromPlan(plan) {
|
|
5436
|
+
return { ...plan, root: stripLimitOffsetFromPlanNode(plan.root) };
|
|
5437
|
+
}
|
|
5438
|
+
function stripLimitOffsetFromPlanNode(node) {
|
|
5439
|
+
if (node.op === "limit_offset") {
|
|
5440
|
+
return stripLimitOffsetFromPlanNode(node.input);
|
|
5441
|
+
}
|
|
5442
|
+
if ("input" in node) {
|
|
5443
|
+
return { ...node, input: stripLimitOffsetFromPlanNode(node.input) };
|
|
5444
|
+
}
|
|
5445
|
+
return node;
|
|
5446
|
+
}
|
|
5442
5447
|
var STANDARD_QUERY_STRATEGY_HANDLERS = {
|
|
5443
5448
|
cte_project: compileStandardQueryWithCteStrategy
|
|
5444
5449
|
};
|
|
@@ -9363,6 +9368,12 @@ function countDistinct(alias, field2) {
|
|
|
9363
9368
|
}
|
|
9364
9369
|
};
|
|
9365
9370
|
}
|
|
9371
|
+
function countEdges(edgeAlias) {
|
|
9372
|
+
return count(edgeAlias);
|
|
9373
|
+
}
|
|
9374
|
+
function countDistinctEdges(edgeAlias) {
|
|
9375
|
+
return countDistinct(edgeAlias);
|
|
9376
|
+
}
|
|
9366
9377
|
function sum(alias, field2) {
|
|
9367
9378
|
return {
|
|
9368
9379
|
__type: "aggregate",
|
|
@@ -12708,17 +12719,17 @@ async function rebuildFulltextIndex(ctx, nodeKind, options) {
|
|
|
12708
12719
|
if (remaining > 0 && pageResult.skippedIds.length > 0) {
|
|
12709
12720
|
skippedIds.push(...pageResult.skippedIds.slice(0, remaining));
|
|
12710
12721
|
}
|
|
12711
|
-
|
|
12722
|
+
const writePage = async (target) => {
|
|
12712
12723
|
if (pageResult.toUpsert.length > 0) {
|
|
12713
|
-
if (
|
|
12714
|
-
await
|
|
12724
|
+
if (target.upsertFulltextBatch) {
|
|
12725
|
+
await target.upsertFulltextBatch({
|
|
12715
12726
|
graphId: ctx.graphId,
|
|
12716
12727
|
nodeKind: kind,
|
|
12717
12728
|
rows: pageResult.toUpsert
|
|
12718
12729
|
});
|
|
12719
|
-
} else if (
|
|
12730
|
+
} else if (target.upsertFulltext) {
|
|
12720
12731
|
for (const item of pageResult.toUpsert) {
|
|
12721
|
-
await
|
|
12732
|
+
await target.upsertFulltext({
|
|
12722
12733
|
graphId: ctx.graphId,
|
|
12723
12734
|
nodeKind: kind,
|
|
12724
12735
|
nodeId: item.nodeId,
|
|
@@ -12729,15 +12740,15 @@ async function rebuildFulltextIndex(ctx, nodeKind, options) {
|
|
|
12729
12740
|
}
|
|
12730
12741
|
}
|
|
12731
12742
|
if (pageResult.toDelete.length > 0) {
|
|
12732
|
-
if (
|
|
12733
|
-
await
|
|
12743
|
+
if (target.deleteFulltextBatch) {
|
|
12744
|
+
await target.deleteFulltextBatch({
|
|
12734
12745
|
graphId: ctx.graphId,
|
|
12735
12746
|
nodeKind: kind,
|
|
12736
12747
|
nodeIds: pageResult.toDelete
|
|
12737
12748
|
});
|
|
12738
|
-
} else if (
|
|
12749
|
+
} else if (target.deleteFulltext) {
|
|
12739
12750
|
for (const nodeId of pageResult.toDelete) {
|
|
12740
|
-
await
|
|
12751
|
+
await target.deleteFulltext({
|
|
12741
12752
|
graphId: ctx.graphId,
|
|
12742
12753
|
nodeKind: kind,
|
|
12743
12754
|
nodeId
|
|
@@ -12745,7 +12756,8 @@ async function rebuildFulltextIndex(ctx, nodeKind, options) {
|
|
|
12745
12756
|
}
|
|
12746
12757
|
}
|
|
12747
12758
|
}
|
|
12748
|
-
}
|
|
12759
|
+
};
|
|
12760
|
+
await runOptionallyInTransaction(backend, writePage);
|
|
12749
12761
|
processed += rows.length;
|
|
12750
12762
|
upserted += pageResult.toUpsert.length;
|
|
12751
12763
|
cleared += pageResult.toDelete.length;
|
|
@@ -13427,12 +13439,19 @@ var Store = class {
|
|
|
13427
13439
|
}
|
|
13428
13440
|
// === Batch Query Execution ===
|
|
13429
13441
|
/**
|
|
13430
|
-
* Executes multiple queries
|
|
13442
|
+
* Executes multiple queries and returns a typed tuple of results.
|
|
13431
13443
|
*
|
|
13432
|
-
*
|
|
13433
|
-
*
|
|
13434
|
-
*
|
|
13435
|
-
*
|
|
13444
|
+
* Each query preserves its own result type, projection, filtering, sorting,
|
|
13445
|
+
* and pagination.
|
|
13446
|
+
*
|
|
13447
|
+
* **Snapshot consistency is conditional.** When
|
|
13448
|
+
* `backend.capabilities.transactions` is `true`, queries run sequentially
|
|
13449
|
+
* on a single connection inside an implicit transaction and observe the
|
|
13450
|
+
* same database snapshot. When transactions are unavailable
|
|
13451
|
+
* (Cloudflare D1, `drizzle-orm/neon-http`), queries run sequentially over
|
|
13452
|
+
* independent connections and may observe writes that landed between them.
|
|
13453
|
+
* Branch on `backend.capabilities.transactions` if you need a guaranteed
|
|
13454
|
+
* snapshot.
|
|
13436
13455
|
*
|
|
13437
13456
|
* Read-only — use `bulkCreate`, `bulkInsert`, etc. for write batching.
|
|
13438
13457
|
*
|
|
@@ -13456,10 +13475,10 @@ var Store = class {
|
|
|
13456
13475
|
* @returns A tuple with per-query typed results, preserving input order
|
|
13457
13476
|
*/
|
|
13458
13477
|
async batch(...queries) {
|
|
13459
|
-
return this.#backend
|
|
13478
|
+
return runOptionallyInTransaction(this.#backend, async (target) => {
|
|
13460
13479
|
const results = [];
|
|
13461
13480
|
for (const query of queries) {
|
|
13462
|
-
const result = await query.executeOn(
|
|
13481
|
+
const result = await query.executeOn(target);
|
|
13463
13482
|
results.push(result);
|
|
13464
13483
|
}
|
|
13465
13484
|
return results;
|
|
@@ -13523,8 +13542,26 @@ var Store = class {
|
|
|
13523
13542
|
* );
|
|
13524
13543
|
* });
|
|
13525
13544
|
* ```
|
|
13545
|
+
*
|
|
13546
|
+
* **Backends without transactions.** When `backend.capabilities.transactions`
|
|
13547
|
+
* is `false` (Cloudflare D1, `drizzle-orm/neon-http`), this method runs the
|
|
13548
|
+
* callback against the same backend used outside `transaction()` — writes
|
|
13549
|
+
* are applied as they happen and a thrown error does **not** roll back
|
|
13550
|
+
* earlier writes inside the callback. Branch on
|
|
13551
|
+
* `backend.capabilities.transactions` if you require atomicity:
|
|
13552
|
+
*
|
|
13553
|
+
* ```typescript
|
|
13554
|
+
* if (backend.capabilities.transactions) {
|
|
13555
|
+
* await store.transaction(async (tx) => { ... });
|
|
13556
|
+
* } else {
|
|
13557
|
+
* // sequential, non-atomic — handle partial-failure recovery yourself
|
|
13558
|
+
* }
|
|
13559
|
+
* ```
|
|
13526
13560
|
*/
|
|
13527
13561
|
async transaction(fn) {
|
|
13562
|
+
if (!this.#backend.capabilities.transactions) {
|
|
13563
|
+
return fn({ nodes: this.nodes, edges: this.edges });
|
|
13564
|
+
}
|
|
13528
13565
|
return this.#backend.transaction(async (txBackend) => {
|
|
13529
13566
|
const txNodeOperations = {
|
|
13530
13567
|
...this.#nodeOperations,
|
|
@@ -13572,6 +13609,36 @@ var Store = class {
|
|
|
13572
13609
|
this.#search = void 0;
|
|
13573
13610
|
}
|
|
13574
13611
|
// === Lifecycle ===
|
|
13612
|
+
/**
|
|
13613
|
+
* Refreshes the backend's query-planner statistics.
|
|
13614
|
+
*
|
|
13615
|
+
* Call this once after a large initial import or bulk backfill. The
|
|
13616
|
+
* planner uses table statistics to choose between TypeGraph's
|
|
13617
|
+
* multi-column indexes; without fresh stats a forward traversal can
|
|
13618
|
+
* pick a reverse index and run an order of magnitude slower than
|
|
13619
|
+
* needed. Autovacuum / background statistics will catch up
|
|
13620
|
+
* eventually, but calling this explicitly after a bulk load gives
|
|
13621
|
+
* you correct latencies immediately.
|
|
13622
|
+
*
|
|
13623
|
+
* Implementations:
|
|
13624
|
+
* - SQLite runs `ANALYZE`, populating `sqlite_stat1`
|
|
13625
|
+
* - PostgreSQL runs `ANALYZE` on the TypeGraph-managed tables
|
|
13626
|
+
*
|
|
13627
|
+
* Costs a few tens of milliseconds at the sizes this library is
|
|
13628
|
+
* designed for. Safe to call at any time.
|
|
13629
|
+
*
|
|
13630
|
+
* @example
|
|
13631
|
+
* ```typescript
|
|
13632
|
+
* // After a bulk import
|
|
13633
|
+
* for (const batch of batches) {
|
|
13634
|
+
* await store.nodes.Document.bulkCreate(batch);
|
|
13635
|
+
* }
|
|
13636
|
+
* await store.refreshStatistics();
|
|
13637
|
+
* ```
|
|
13638
|
+
*/
|
|
13639
|
+
async refreshStatistics() {
|
|
13640
|
+
await this.#backend.refreshStatistics();
|
|
13641
|
+
}
|
|
13575
13642
|
/**
|
|
13576
13643
|
* Closes the store and releases underlying resources.
|
|
13577
13644
|
*
|
|
@@ -13676,6 +13743,6 @@ async function createStoreWithSchema(graph, backend, options) {
|
|
|
13676
13743
|
return [store, result];
|
|
13677
13744
|
}
|
|
13678
13745
|
|
|
13679
|
-
export { DEFAULT_SQL_SCHEMA, ExecutableAggregateQuery, ExecutableQuery, MAX_EXPLICIT_RECURSIVE_DEPTH, MAX_RECURSIVE_DEPTH, PreparedQuery, QueryBuilder, StoreSearch, UnionableQuery, avg, broader, composeFragments, core, count, countDistinct, createExternalRef, createFragment, createQueryBuilder, createSqlSchema, createStore, createStoreWithSchema, defineEdge, defineNode, defineSubgraphProject, differentFrom, disjointWith, equivalentTo, exists, externalRef, field, fieldRef, generateId, getExternalRefTable, hasPart, having, havingEq, havingGt, havingGte, havingLt, havingLte, implies, inSubquery, inverseOf, isExternalRefSchema, isParameterRef, limitFragment, max, metaEdge, min, narrower, notExists, notInSubquery, offsetFragment, orderByFragment, param, partOf, relatedTo, sameAs, subClassOf, sum };
|
|
13746
|
+
export { DEFAULT_SQL_SCHEMA, ExecutableAggregateQuery, ExecutableQuery, MAX_EXPLICIT_RECURSIVE_DEPTH, MAX_RECURSIVE_DEPTH, PreparedQuery, QueryBuilder, StoreSearch, UnionableQuery, avg, broader, composeFragments, core, count, countDistinct, countDistinctEdges, countEdges, createExternalRef, createFragment, createQueryBuilder, createSqlSchema, createStore, createStoreWithSchema, defineEdge, defineNode, defineSubgraphProject, differentFrom, disjointWith, equivalentTo, exists, externalRef, field, fieldRef, generateId, getExternalRefTable, hasPart, having, havingEq, havingGt, havingGte, havingLt, havingLte, implies, inSubquery, inverseOf, isExternalRefSchema, isParameterRef, limitFragment, max, metaEdge, min, narrower, notExists, notInSubquery, offsetFragment, orderByFragment, param, partOf, relatedTo, sameAs, subClassOf, sum };
|
|
13680
13747
|
//# sourceMappingURL=index.js.map
|
|
13681
13748
|
//# sourceMappingURL=index.js.map
|