@undefineds.co/xpod 0.3.5 → 0.3.14

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 (253) hide show
  1. package/config/cli.json +1 -1
  2. package/config/cloud.json +54 -22
  3. package/config/local.json +56 -12
  4. package/config/resolver.json +10 -2
  5. package/config/xpod.base.json +50 -0
  6. package/config/xpod.json +8 -8
  7. package/dist/agents/config/resolve.js +10 -10
  8. package/dist/agents/config/resolve.js.map +1 -1
  9. package/dist/api/chatkit/index.d.ts +1 -1
  10. package/dist/api/chatkit/index.js.map +1 -1
  11. package/dist/api/chatkit/pod-store.d.ts +14 -11
  12. package/dist/api/chatkit/pod-store.js +114 -78
  13. package/dist/api/chatkit/pod-store.js.map +1 -1
  14. package/dist/api/chatkit/runtime/AcpAgentRuntime.js +1 -1
  15. package/dist/api/chatkit/runtime/AcpAgentRuntime.js.map +1 -1
  16. package/dist/api/chatkit/service.js +1 -1
  17. package/dist/api/chatkit/service.js.map +1 -1
  18. package/dist/api/chatkit/types.d.ts +11 -11
  19. package/dist/api/chatkit/types.js +3 -3
  20. package/dist/api/chatkit/types.js.map +1 -1
  21. package/dist/api/container/cloud.js +0 -8
  22. package/dist/api/container/cloud.js.map +1 -1
  23. package/dist/api/container/index.js +2 -1
  24. package/dist/api/container/index.js.map +1 -1
  25. package/dist/api/container/local.js +0 -7
  26. package/dist/api/container/local.js.map +1 -1
  27. package/dist/api/container/routes.js +3 -17
  28. package/dist/api/container/routes.js.map +1 -1
  29. package/dist/api/container/types.d.ts +0 -2
  30. package/dist/api/container/types.js.map +1 -1
  31. package/dist/api/handlers/PodManagementHandler.d.ts +3 -0
  32. package/dist/api/handlers/PodManagementHandler.js +71 -1
  33. package/dist/api/handlers/PodManagementHandler.js.map +1 -1
  34. package/dist/api/handlers/RunHandler.js +5 -5
  35. package/dist/api/handlers/RunHandler.js.map +1 -1
  36. package/dist/api/runs/AgentRuntimeTypes.d.ts +7 -8
  37. package/dist/api/runs/AgentRuntimeTypes.js.map +1 -1
  38. package/dist/api/runs/InngestRunExecutionBackend.d.ts +2 -2
  39. package/dist/api/runs/ManagedRunWorker.d.ts +1 -1
  40. package/dist/api/runs/ManagedRunWorker.js +6 -6
  41. package/dist/api/runs/ManagedRunWorker.js.map +1 -1
  42. package/dist/api/runs/PiAgentRuntimeDriver.d.ts +16 -1
  43. package/dist/api/runs/PiAgentRuntimeDriver.js +182 -23
  44. package/dist/api/runs/PiAgentRuntimeDriver.js.map +1 -1
  45. package/dist/api/runs/RunStateCenter.d.ts +3 -3
  46. package/dist/api/runs/RunStateCenter.js +13 -13
  47. package/dist/api/runs/RunStateCenter.js.map +1 -1
  48. package/dist/api/runs/store.d.ts +4 -4
  49. package/dist/api/runs/store.js +2 -2
  50. package/dist/api/runs/store.js.map +1 -1
  51. package/dist/api/service/VectorStoreService.d.ts +1 -1
  52. package/dist/api/service/VectorStoreService.js +16 -16
  53. package/dist/api/service/VectorStoreService.js.map +1 -1
  54. package/dist/api/tasks/InngestTaskScheduler.d.ts +4 -4
  55. package/dist/api/tasks/TaskMaterializer.d.ts +3 -3
  56. package/dist/api/tasks/TaskMaterializer.js +11 -11
  57. package/dist/api/tasks/TaskMaterializer.js.map +1 -1
  58. package/dist/api/tasks/TaskService.d.ts +3 -3
  59. package/dist/api/tasks/TaskService.js +11 -7
  60. package/dist/api/tasks/TaskService.js.map +1 -1
  61. package/dist/api/tasks/store.d.ts +10 -4
  62. package/dist/api/tasks/store.js +14 -4
  63. package/dist/api/tasks/store.js.map +1 -1
  64. package/dist/api/workspace/types.d.ts +3 -3
  65. package/dist/api/workspace/types.js +6 -6
  66. package/dist/api/workspace/types.js.map +1 -1
  67. package/dist/cli/commands/config.js +2 -2
  68. package/dist/cli/commands/config.js.map +1 -1
  69. package/dist/cli/commands/start.js +9 -3
  70. package/dist/cli/commands/start.js.map +1 -1
  71. package/dist/components/components.jsonld +8 -2
  72. package/dist/components/context.jsonld +302 -51
  73. package/dist/http/search/SearchHttpHandler.js +8 -8
  74. package/dist/http/search/SearchHttpHandler.js.map +1 -1
  75. package/dist/identity/drizzle/PodLookupRepository.d.ts +11 -1
  76. package/dist/identity/drizzle/PodLookupRepository.js +95 -4
  77. package/dist/identity/drizzle/PodLookupRepository.js.map +1 -1
  78. package/dist/identity/drizzle/db.js +4 -43
  79. package/dist/identity/drizzle/db.js.map +1 -1
  80. package/dist/identity/drizzle/schema.pg.d.ts +0 -5
  81. package/dist/identity/drizzle/schema.pg.js +2 -16
  82. package/dist/identity/drizzle/schema.pg.js.map +1 -1
  83. package/dist/identity/drizzle/schema.sqlite.d.ts +19 -176
  84. package/dist/identity/drizzle/schema.sqlite.js +2 -16
  85. package/dist/identity/drizzle/schema.sqlite.js.map +1 -1
  86. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.d.ts +4 -4
  87. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js +7 -7
  88. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js.map +1 -1
  89. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.jsonld +6 -6
  90. package/dist/identity/oidc/AutoDetectOidcHandler.d.ts +4 -4
  91. package/dist/identity/oidc/AutoDetectOidcHandler.js +6 -6
  92. package/dist/identity/oidc/AutoDetectOidcHandler.js.map +1 -1
  93. package/dist/identity/oidc/AutoDetectOidcHandler.jsonld +6 -6
  94. package/dist/identity/oidc/ScopedPickWebIdHandler.d.ts +37 -0
  95. package/dist/identity/oidc/ScopedPickWebIdHandler.js +211 -0
  96. package/dist/identity/oidc/ScopedPickWebIdHandler.js.map +1 -0
  97. package/dist/identity/oidc/ScopedPickWebIdHandler.jsonld +158 -0
  98. package/dist/index.d.ts +12 -2
  99. package/dist/index.js +16 -4
  100. package/dist/index.js.map +1 -1
  101. package/dist/main.js +8 -2
  102. package/dist/main.js.map +1 -1
  103. package/dist/provision/ProvisionPodCreator.d.ts +3 -4
  104. package/dist/provision/ProvisionPodCreator.js +8 -13
  105. package/dist/provision/ProvisionPodCreator.js.map +1 -1
  106. package/dist/provision/ProvisionPodCreator.jsonld +7 -7
  107. package/dist/runtime/Proxy.d.ts +0 -1
  108. package/dist/runtime/Proxy.js +0 -9
  109. package/dist/runtime/Proxy.js.map +1 -1
  110. package/dist/runtime/bootstrap.d.ts +1 -0
  111. package/dist/runtime/bootstrap.js +5 -2
  112. package/dist/runtime/bootstrap.js.map +1 -1
  113. package/dist/runtime/css-process.d.ts +12 -4
  114. package/dist/runtime/css-process.js +61 -14
  115. package/dist/runtime/css-process.js.map +1 -1
  116. package/dist/runtime/oidc-issuer.d.ts +3 -2
  117. package/dist/runtime/oidc-issuer.js +3 -2
  118. package/dist/runtime/oidc-issuer.js.map +1 -1
  119. package/dist/runtime/runtime-types.d.ts +1 -0
  120. package/dist/runtime/runtime-types.js.map +1 -1
  121. package/dist/solidfs/LocalFirstRdfRepresentationResolver.d.ts +21 -0
  122. package/dist/solidfs/LocalFirstRdfRepresentationResolver.js +38 -0
  123. package/dist/solidfs/LocalFirstRdfRepresentationResolver.js.map +1 -0
  124. package/dist/solidfs/LocalSolidFS.d.ts +18 -0
  125. package/dist/solidfs/LocalSolidFS.js +539 -0
  126. package/dist/solidfs/LocalSolidFS.js.map +1 -0
  127. package/dist/solidfs/PodSolidFsHttpClient.d.ts +16 -0
  128. package/dist/solidfs/PodSolidFsHttpClient.js +93 -0
  129. package/dist/solidfs/PodSolidFsHttpClient.js.map +1 -0
  130. package/dist/solidfs/PodSolidFsHydrator.d.ts +27 -0
  131. package/dist/solidfs/PodSolidFsHydrator.js +127 -0
  132. package/dist/solidfs/PodSolidFsHydrator.js.map +1 -0
  133. package/dist/solidfs/PodSolidFsSyncer.d.ts +21 -0
  134. package/dist/solidfs/PodSolidFsSyncer.js +78 -0
  135. package/dist/solidfs/PodSolidFsSyncer.js.map +1 -0
  136. package/dist/solidfs/RdfIndexSolidFsSyncer.d.ts +22 -0
  137. package/dist/solidfs/RdfIndexSolidFsSyncer.js +131 -0
  138. package/dist/solidfs/RdfIndexSolidFsSyncer.js.map +1 -0
  139. package/dist/solidfs/index.d.ts +7 -0
  140. package/dist/solidfs/index.js +24 -0
  141. package/dist/solidfs/index.js.map +1 -0
  142. package/dist/solidfs/types.d.ts +131 -0
  143. package/dist/solidfs/types.js +19 -0
  144. package/dist/solidfs/types.js.map +1 -0
  145. package/dist/storage/RepresentationPartialConvertingStore.js +6 -13
  146. package/dist/storage/RepresentationPartialConvertingStore.js.map +1 -1
  147. package/dist/storage/SparqlUpdateResourceStore.d.ts +4 -0
  148. package/dist/storage/SparqlUpdateResourceStore.js +13 -0
  149. package/dist/storage/SparqlUpdateResourceStore.js.map +1 -1
  150. package/dist/storage/SparqlUpdateResourceStore.jsonld +26 -0
  151. package/dist/storage/accessors/MinioDataAccessor.d.ts +2 -0
  152. package/dist/storage/accessors/MinioDataAccessor.js +13 -7
  153. package/dist/storage/accessors/MinioDataAccessor.js.map +1 -1
  154. package/dist/storage/accessors/MinioDataAccessor.jsonld +8 -0
  155. package/dist/storage/accessors/MixDataAccessor.d.ts +85 -4
  156. package/dist/storage/accessors/MixDataAccessor.js +511 -16
  157. package/dist/storage/accessors/MixDataAccessor.js.map +1 -1
  158. package/dist/storage/accessors/MixDataAccessor.jsonld +176 -1
  159. package/dist/storage/accessors/QuintStoreSparqlDataAccessor.d.ts +7 -0
  160. package/dist/storage/accessors/QuintStoreSparqlDataAccessor.js +72 -4
  161. package/dist/storage/accessors/QuintStoreSparqlDataAccessor.js.map +1 -1
  162. package/dist/storage/accessors/QuintStoreSparqlDataAccessor.jsonld +24 -0
  163. package/dist/storage/quint/BaseQuintStore.d.ts +3 -0
  164. package/dist/storage/quint/BaseQuintStore.js +51 -27
  165. package/dist/storage/quint/BaseQuintStore.js.map +1 -1
  166. package/dist/storage/quint/PgQuintStore.d.ts +1 -0
  167. package/dist/storage/quint/PgQuintStore.js +50 -32
  168. package/dist/storage/quint/PgQuintStore.js.map +1 -1
  169. package/dist/storage/quint/PgQuintStore.jsonld +4 -3
  170. package/dist/storage/quint/SqliteQuintStore.d.ts +5 -0
  171. package/dist/storage/quint/SqliteQuintStore.js +100 -0
  172. package/dist/storage/quint/SqliteQuintStore.js.map +1 -1
  173. package/dist/storage/quint/SqliteQuintStore.jsonld +20 -0
  174. package/dist/storage/quint/types.d.ts +16 -0
  175. package/dist/storage/quint/types.js.map +1 -1
  176. package/dist/storage/rdf/Rdf3xTripleIndex.d.ts +55 -0
  177. package/dist/storage/rdf/Rdf3xTripleIndex.js +1235 -0
  178. package/dist/storage/rdf/Rdf3xTripleIndex.js.map +1 -0
  179. package/dist/storage/rdf/RdfContentTypes.d.ts +9 -0
  180. package/dist/storage/rdf/RdfContentTypes.js +79 -0
  181. package/dist/storage/rdf/RdfContentTypes.js.map +1 -0
  182. package/dist/storage/rdf/RdfLocalQueryEngine.d.ts +76 -0
  183. package/dist/storage/rdf/RdfLocalQueryEngine.js +2636 -0
  184. package/dist/storage/rdf/RdfLocalQueryEngine.js.map +1 -0
  185. package/dist/storage/rdf/RdfQuadIndex.d.ts +98 -0
  186. package/dist/storage/rdf/RdfQuadIndex.js +1840 -0
  187. package/dist/storage/rdf/RdfQuadIndex.js.map +1 -0
  188. package/dist/storage/rdf/RdfQuadIndex.jsonld +416 -0
  189. package/dist/storage/rdf/RdfShadowComparator.d.ts +12 -0
  190. package/dist/storage/rdf/RdfShadowComparator.js +47 -0
  191. package/dist/storage/rdf/RdfShadowComparator.js.map +1 -0
  192. package/dist/storage/rdf/RdfSparqlAdapter.d.ts +147 -0
  193. package/dist/storage/rdf/RdfSparqlAdapter.js +2420 -0
  194. package/dist/storage/rdf/RdfSparqlAdapter.js.map +1 -0
  195. package/dist/storage/rdf/RdfSparqlAdapter.jsonld +414 -0
  196. package/dist/storage/rdf/RdfTermDictionary.d.ts +27 -0
  197. package/dist/storage/rdf/RdfTermDictionary.js +352 -0
  198. package/dist/storage/rdf/RdfTermDictionary.js.map +1 -0
  199. package/dist/storage/rdf/RdfTermDictionary.jsonld +114 -0
  200. package/dist/storage/rdf/RdfTermSemantics.d.ts +6 -0
  201. package/dist/storage/rdf/RdfTermSemantics.js +40 -0
  202. package/dist/storage/rdf/RdfTermSemantics.js.map +1 -0
  203. package/dist/storage/rdf/RdfTextIndex.d.ts +23 -0
  204. package/dist/storage/rdf/RdfTextIndex.js +569 -0
  205. package/dist/storage/rdf/RdfTextIndex.js.map +1 -0
  206. package/dist/storage/rdf/RdfVectorIndex.d.ts +22 -0
  207. package/dist/storage/rdf/RdfVectorIndex.js +631 -0
  208. package/dist/storage/rdf/RdfVectorIndex.js.map +1 -0
  209. package/dist/storage/rdf/RdfXmlSerializer.d.ts +2 -0
  210. package/dist/storage/rdf/RdfXmlSerializer.js +123 -0
  211. package/dist/storage/rdf/RdfXmlSerializer.js.map +1 -0
  212. package/dist/storage/rdf/ShadowRdfQuintStore.d.ts +58 -0
  213. package/dist/storage/rdf/ShadowRdfQuintStore.js +202 -0
  214. package/dist/storage/rdf/ShadowRdfQuintStore.js.map +1 -0
  215. package/dist/storage/rdf/ShadowRdfQuintStore.jsonld +308 -0
  216. package/dist/storage/rdf/SolidRdfEngine.d.ts +51 -0
  217. package/dist/storage/rdf/SolidRdfEngine.js +264 -0
  218. package/dist/storage/rdf/SolidRdfEngine.js.map +1 -0
  219. package/dist/storage/rdf/SolidRdfEngine.jsonld +338 -0
  220. package/dist/storage/rdf/SolidRdfSparqlEngine.d.ts +92 -0
  221. package/dist/storage/rdf/SolidRdfSparqlEngine.js +477 -0
  222. package/dist/storage/rdf/SolidRdfSparqlEngine.js.map +1 -0
  223. package/dist/storage/rdf/SolidRdfSparqlEngine.jsonld +257 -0
  224. package/dist/storage/rdf/index.d.ts +15 -0
  225. package/dist/storage/rdf/index.js +61 -0
  226. package/dist/storage/rdf/index.js.map +1 -0
  227. package/dist/storage/rdf/models-benchmark.d.ts +260 -0
  228. package/dist/storage/rdf/models-benchmark.js +1405 -0
  229. package/dist/storage/rdf/models-benchmark.js.map +1 -0
  230. package/dist/storage/rdf/types.d.ts +726 -0
  231. package/dist/storage/rdf/types.js +3 -0
  232. package/dist/storage/rdf/types.js.map +1 -0
  233. package/dist/storage/rdf/types.jsonld +316 -0
  234. package/dist/storage/vector/VectorIndexingListener.d.ts +5 -5
  235. package/dist/storage/vector/VectorIndexingListener.js +19 -19
  236. package/dist/storage/vector/VectorIndexingListener.js.map +1 -1
  237. package/package.json +3 -2
  238. package/templates/pod/acp/.acr.hbs +39 -0
  239. package/templates/pod/acp/README.acr +18 -0
  240. package/templates/pod/acp/profile/card.acr +22 -0
  241. package/templates/pod/base/README$.md.hbs +27 -0
  242. package/templates/pod/base/profile/card$.ttl.hbs +13 -0
  243. package/templates/pod/wac/.acl.hbs +26 -0
  244. package/templates/pod/wac/README.acl.hbs +14 -0
  245. package/templates/pod/wac/profile/card.acl.hbs +19 -0
  246. package/dist/api/handlers/WebIdProfileHandler.d.ts +0 -16
  247. package/dist/api/handlers/WebIdProfileHandler.js +0 -423
  248. package/dist/api/handlers/WebIdProfileHandler.js.map +0 -1
  249. package/dist/identity/drizzle/WebIdProfileRepository.d.ts +0 -63
  250. package/dist/identity/drizzle/WebIdProfileRepository.js +0 -168
  251. package/dist/identity/drizzle/WebIdProfileRepository.js.map +0 -1
  252. package/dist/identity/drizzle/WebIdProfileRepository.jsonld +0 -112
  253. package/dist/storage/quint/BaseQuintStore.jsonld +0 -257
@@ -1 +1 @@
1
- {"version":3,"file":"SqliteQuintStore.js","sourceRoot":"","sources":["../../../src/storage/quint/SqliteQuintStore.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * SqliteQuintStore - SQLite implementation of QuintStore using Drizzle ORM\n */\n\nimport { existsSync, mkdirSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport { eq, ne, and, gte, gt, lt, lte, like, inArray, notInArray, isNull, isNotNull, sql } from 'drizzle-orm';\nimport type { SQL } from 'drizzle-orm';\nimport { wrap, AsyncIterator } from 'asynciterator';\nimport { DataFactory } from 'n3';\nimport type { Term, Quad } from '@rdfjs/types';\n\nimport { quints, type QuintRow, type NewQuintRow } from './schema';\nimport {\n quadToRow,\n rowToQuad,\n parseVector,\n termToId,\n serializeObject,\n deserializeObject,\n fpEncode,\n SEP,\n isSerializedObjectValue,\n} from './serialization';\nimport { getSqliteRuntime, type SqliteDatabase } from '../SqliteRuntime';\nimport type {\n Quint,\n QuintPattern,\n QuintStore,\n QuintStoreOptions,\n QueryOptions,\n StoreStats,\n TermMatch,\n TermOperators,\n CompoundPattern,\n CompoundResult,\n OperatorValue,\n} from './types';\nimport { isTerm } from './types';\n\nconst SQLITE_UNBOUNDED_LIMIT = Number.MAX_SAFE_INTEGER;\n\nexport interface SqliteQuintStoreOptions extends QuintStoreOptions {\n /** SQLite database file path, use ':memory:' for in-memory database */\n path: string;\n}\n\nexport class SqliteQuintStore {\n private sqlite: SqliteDatabase | null = null;\n private db: any | null = null;\n private options: SqliteQuintStoreOptions;\n private readonly sqliteRuntime = getSqliteRuntime();\n\n constructor(options: SqliteQuintStoreOptions) {\n // Handle sqlite: prefix\n let path = options.path;\n if (path.startsWith('sqlite:')) {\n path = path.slice(7);\n }\n this.options = { ...options, path };\n }\n\n // ============================================\n // Lifecycle\n // ============================================\n\n async open(): Promise<void> {\n // Idempotent: if already open, do nothing\n if (this.sqlite) {\n return;\n }\n\n const dbPath = this.options.path;\n \n // Ensure directory exists (unless it's in-memory)\n if (dbPath !== ':memory:') {\n const dir = dirname(dbPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n \n this.sqlite = this.sqliteRuntime.openDatabase(dbPath);\n this.db = this.sqliteRuntime.createDrizzleDatabase(this.sqlite);\n\n // Create table and indexes\n this.sqlite.exec(`\n CREATE TABLE IF NOT EXISTS quints (\n graph TEXT NOT NULL,\n subject TEXT NOT NULL,\n predicate TEXT NOT NULL,\n object TEXT NOT NULL,\n vector TEXT,\n PRIMARY KEY (graph, subject, predicate, object)\n );\n\n CREATE INDEX IF NOT EXISTS idx_spog ON quints (subject, predicate, object, graph);\n CREATE INDEX IF NOT EXISTS idx_ogsp ON quints (object, graph, subject, predicate);\n CREATE INDEX IF NOT EXISTS idx_gspo ON quints (graph, subject, predicate, object);\n CREATE INDEX IF NOT EXISTS idx_sopg ON quints (subject, object, predicate, graph);\n CREATE INDEX IF NOT EXISTS idx_pogs ON quints (predicate, object, graph, subject);\n CREATE INDEX IF NOT EXISTS idx_gpos ON quints (graph, predicate, object, subject);\n `);\n }\n\n async close(): Promise<void> {\n if (this.sqlite) {\n this.sqlite.close();\n this.sqlite = null;\n this.db = null;\n }\n }\n\n // ============================================\n // Query Operations\n // ============================================\n\n async get(pattern: QuintPattern, options?: QueryOptions): Promise<Quint[]> {\n this.ensureOpen();\n\n const conditions = this.buildConditions(pattern);\n \n let query = this.db!.select().from(quints);\n \n if (conditions.length > 0) {\n query = query.where(and(...conditions)) as any;\n }\n\n // ORDER BY 支持\n if (options?.order && options.order.length > 0) {\n // 使用 sql 模板构建 ORDER BY\n const orderCol = options.order[0]; // 目前只支持单列排序\n const direction = options.reverse ? 'DESC' : 'ASC';\n query = query.orderBy(sql.raw(`${orderCol} ${direction}`)) as any;\n }\n\n if (options?.limit !== undefined) {\n query = query.limit(options.limit) as any;\n }\n if (options?.offset !== undefined) {\n // SQLite requires LIMIT when using OFFSET\n if (options?.limit === undefined) {\n query = query.limit(SQLITE_UNBOUNDED_LIMIT) as any;\n }\n query = query.offset(options.offset) as any;\n }\n\n const rows = await query;\n return rows.map((row: QuintRow) => this.rowToQuint(row));\n }\n\n match(\n subject?: Term | null,\n predicate?: Term | null,\n object?: Term | null,\n graph?: Term | null,\n ): AsyncIterator<Quint> {\n const pattern: QuintPattern = {};\n if (subject) pattern.subject = subject;\n if (predicate) pattern.predicate = predicate;\n if (object) pattern.object = object;\n if (graph) pattern.graph = graph;\n\n return wrap(this.get(pattern));\n }\n\n async getByGraphPrefix(prefix: string, options?: QueryOptions): Promise<Quint[]> {\n return this.get({ graph: { $startsWith: prefix } }, options);\n }\n\n async count(pattern: QuintPattern): Promise<number> {\n this.ensureOpen();\n\n const conditions = this.buildConditions(pattern);\n\n let query = this.db!.select({ count: sql<number>`count(*)` }).from(quints);\n\n if (conditions.length > 0) {\n query = query.where(and(...conditions)) as any;\n }\n\n const result = await query;\n return result[0]?.count ?? 0;\n }\n\n /**\n * Compound query - multiple patterns JOINed by a common field\n * This executes a single SQL query with JOINs, letting SQLite optimize the execution plan\n */\n async getCompound(compound: CompoundPattern, options?: QueryOptions): Promise<CompoundResult[]> {\n this.ensureOpen();\n\n const { patterns, joinOn, select } = compound;\n \n if (patterns.length === 0) {\n return [];\n }\n\n if (patterns.length === 1) {\n // Single pattern, fall back to regular get\n const quads = await this.get(patterns[0], options);\n return quads.map(q => ({\n joinValue: termToId((q as any)[joinOn]),\n bindings: {},\n quads: [q],\n }));\n }\n\n // Build JOIN SQL\n const { sql: sqlQuery, params } = this.buildCompoundSQL(compound, options);\n \n if (this.options.debug) {\n console.log('[SqliteQuintStore] Compound SQL:', sqlQuery);\n console.log('[SqliteQuintStore] Params:', params);\n }\n\n // Execute raw SQL\n const stmt = this.sqlite!.prepare(sqlQuery);\n const rows = stmt.all(...params) as Record<string, string>[];\n\n // Convert rows to CompoundResult\n return rows.map(row => {\n const bindings: Record<string, string> = {};\n \n // Extract bindings based on select config or default naming\n if (select) {\n for (const s of select) {\n bindings[s.alias] = row[s.alias];\n }\n } else {\n // Default: include all fields from all patterns\n for (const key of Object.keys(row)) {\n if (key !== 'join_value') {\n bindings[key] = row[key];\n }\n }\n }\n\n return {\n joinValue: row.join_value,\n bindings,\n };\n });\n }\n\n /**\n * 批量获取多个 subject 的多个属性\n * \n * 用于优化 OPTIONAL 查询:避免每个 OPTIONAL 变成一次 LEFT JOIN\n * \n * SQL: SELECT subject, predicate, object FROM quints \n * WHERE subject IN (...) AND predicate IN (...)\n */\n async getAttributes(\n subjects: string[],\n predicates: string[],\n graph?: Term\n ): Promise<Map<string, Map<string, Term[]>>> {\n this.ensureOpen();\n\n if (subjects.length === 0 || predicates.length === 0) {\n return new Map();\n }\n\n // Build SQL with IN clauses\n const params: string[] = [];\n let sql = `SELECT subject, predicate, object FROM quints WHERE subject IN (${\n subjects.map(() => '?').join(', ')\n }) AND predicate IN (${\n predicates.map(() => '?').join(', ')\n })`;\n \n params.push(...subjects);\n params.push(...predicates);\n\n // Add graph filter if specified\n if (graph && graph.termType !== 'DefaultGraph') {\n sql += ` AND graph = ?`;\n params.push(termToId(graph as any));\n }\n\n if (this.options.debug) {\n console.log('[SqliteQuintStore] getAttributes SQL:', sql);\n console.log('[SqliteQuintStore] Params:', params.length, 'subjects:', subjects.length, 'predicates:', predicates.length);\n }\n\n const stmt = this.sqlite!.prepare(sql);\n const rows = stmt.all(...params) as { subject: string; predicate: string; object: string }[];\n\n // Build result map: subject -> predicate -> object[]\n const result = new Map<string, Map<string, Term[]>>();\n\n for (const row of rows) {\n if (!result.has(row.subject)) {\n result.set(row.subject, new Map());\n }\n const predicateMap = result.get(row.subject)!;\n \n if (!predicateMap.has(row.predicate)) {\n predicateMap.set(row.predicate, []);\n }\n \n // Deserialize object back to Term\n const objectTerm = deserializeObject(row.object);\n predicateMap.get(row.predicate)!.push(objectTerm);\n }\n\n if (this.options.debug) {\n console.log('[SqliteQuintStore] getAttributes returned', result.size, 'subjects');\n }\n\n return result;\n }\n\n /**\n * Build SQL for compound query with JOINs\n */\n private buildCompoundSQL(\n compound: CompoundPattern,\n options?: QueryOptions\n ): { sql: string; params: (string | number)[] } {\n const { patterns, joinOn, select } = compound;\n const params: (string | number)[] = [];\n \n // Map joinOn to column name\n const joinColumn = joinOn; // 'subject' | 'predicate' | 'object' | 'graph'\n\n // Build SELECT clause\n let selectClause = `q0.${joinColumn} as join_value`;\n \n if (select) {\n for (const s of select) {\n selectClause += `, q${s.pattern}.${s.field} as ${s.alias}`;\n }\n } else {\n // Default: select object from each pattern as p0_object, p1_object, etc.\n for (let i = 0; i < patterns.length; i++) {\n selectClause += `, q${i}.object as p${i}_object`;\n selectClause += `, q${i}.predicate as p${i}_predicate`;\n }\n }\n\n // Build FROM clause with JOINs\n let fromClause = 'quints q0';\n for (let i = 1; i < patterns.length; i++) {\n fromClause += ` JOIN quints q${i} ON q0.${joinColumn} = q${i}.${joinColumn}`;\n // Also join on graph to ensure same graph\n fromClause += ` AND q0.graph = q${i}.graph`;\n }\n\n // Build WHERE clause\n const whereParts: string[] = [];\n \n for (let i = 0; i < patterns.length; i++) {\n const pattern = patterns[i];\n const alias = `q${i}`;\n \n const conditions = this.buildConditionsForAlias(pattern, alias, params);\n whereParts.push(...conditions);\n }\n\n let sql = `SELECT ${selectClause} FROM ${fromClause}`;\n \n if (whereParts.length > 0) {\n sql += ` WHERE ${whereParts.join(' AND ')}`;\n }\n\n // Add LIMIT/OFFSET\n if (options?.limit) {\n sql += ` LIMIT ?`;\n params.push(options.limit);\n }\n if (options?.offset) {\n if (!options?.limit) {\n sql += ` LIMIT -1`;\n }\n sql += ` OFFSET ?`;\n params.push(options.offset);\n }\n\n return { sql, params };\n }\n\n /**\n * Build WHERE conditions for a specific table alias\n */\n private buildConditionsForAlias(\n pattern: QuintPattern,\n alias: string,\n params: (string | number)[]\n ): string[] {\n const conditions: string[] = [];\n\n /**\n * Serialize operator value for comparison\n * - Term: use serializeObject/termToId\n * - number: for exact match ($eq, $ne, $in, $notIn) use full serialization\n * for range comparison ($gt, $gte, $lt, $lte) use fpstring\n * - string: assume already serialized or use as-is\n */\n const serializeOpValue = (value: OperatorValue, isObject: boolean, filterOp: string): string | number => {\n if (typeof value === 'object' && 'termType' in value) {\n // It's a Term - use full serialization\n return isObject ? serializeObject(value as any) : termToId(value as any);\n }\n \n if (typeof value === 'number') {\n if (isObject) {\n // For exact match operations, use full serialization (includes datatype and original value)\n if (filterOp === '$eq' || filterOp === '$ne' || filterOp === '$in' || filterOp === '$notIn') {\n const lit = DataFactory.literal(String(value), DataFactory.namedNode('http://www.w3.org/2001/XMLSchema#integer'));\n return serializeObject(lit);\n }\n // For range comparisons, use fpstring\n const fpValue = `N${SEP}${fpEncode(value)}`;\n // $gt and $lte need max suffix to compare correctly\n if (filterOp === '$gt' || filterOp === '$lte') {\n return fpValue + SEP + '\\uffff';\n }\n // $lt and $gte use prefix only\n return fpValue;\n }\n return value;\n }\n \n if (isObject) {\n if (isSerializedObjectValue(value)) {\n return value;\n }\n return `\"${value}\"`;\n }\n return value;\n };\n\n const addCondition = (\n column: string,\n match: TermMatch | undefined,\n isObject: boolean = false\n ) => {\n if (!match) return;\n\n const fullColumn = `${alias}.${column}`;\n\n if (isTerm(match)) {\n conditions.push(`${fullColumn} = ?`);\n params.push(isObject ? serializeObject(match as any) : termToId(match as any));\n } else {\n const ops = match as TermOperators;\n\n if (ops.$eq !== undefined) {\n conditions.push(`${fullColumn} = ?`);\n params.push(serializeOpValue(ops.$eq, isObject, '$eq'));\n }\n if (ops.$ne !== undefined) {\n conditions.push(`${fullColumn} != ?`);\n params.push(serializeOpValue(ops.$ne, isObject, '$ne'));\n }\n if (ops.$gt !== undefined) {\n conditions.push(`${fullColumn} > ?`);\n params.push(serializeOpValue(ops.$gt, isObject, '$gt'));\n }\n if (ops.$gte !== undefined) {\n conditions.push(`${fullColumn} >= ?`);\n params.push(serializeOpValue(ops.$gte, isObject, '$gte'));\n }\n if (ops.$lt !== undefined) {\n conditions.push(`${fullColumn} < ?`);\n params.push(serializeOpValue(ops.$lt, isObject, '$lt'));\n }\n if (ops.$lte !== undefined) {\n conditions.push(`${fullColumn} <= ?`);\n params.push(serializeOpValue(ops.$lte, isObject, '$lte'));\n }\n if (ops.$in !== undefined && ops.$in.length > 0) {\n const placeholders = ops.$in.map(() => '?').join(', ');\n conditions.push(`${fullColumn} IN (${placeholders})`);\n params.push(...ops.$in.map(v => serializeOpValue(v, isObject, '$in')));\n }\n if (ops.$notIn !== undefined && ops.$notIn.length > 0) {\n const placeholders = ops.$notIn.map(() => '?').join(', ');\n conditions.push(`${fullColumn} NOT IN (${placeholders})`);\n params.push(...ops.$notIn.map(v => serializeOpValue(v, isObject, '$notIn')));\n }\n if (ops.$startsWith !== undefined) {\n conditions.push(`${fullColumn} >= ?`);\n conditions.push(`${fullColumn} < ?`);\n params.push(ops.$startsWith);\n params.push(ops.$startsWith + '\\uffff');\n }\n if (ops.$endsWith !== undefined) {\n conditions.push(`${fullColumn} LIKE ?`);\n params.push(`%${ops.$endsWith}`);\n }\n if (ops.$contains !== undefined) {\n conditions.push(`${fullColumn} LIKE ?`);\n params.push(`%${ops.$contains}%`);\n }\n if (isObject && ops.$strStartsWith !== undefined) {\n const lexical = this.objectLexicalSql(fullColumn);\n conditions.push(`${lexical} >= ?`);\n conditions.push(`${lexical} < ?`);\n params.push(ops.$strStartsWith);\n params.push(ops.$strStartsWith + '\\uffff');\n }\n if (isObject && ops.$strEndsWith !== undefined) {\n conditions.push(`${this.objectLexicalSql(fullColumn)} LIKE ?`);\n params.push(`%${ops.$strEndsWith}`);\n }\n if (isObject && ops.$strContains !== undefined) {\n conditions.push(`${this.objectLexicalSql(fullColumn)} LIKE ?`);\n params.push(`%${ops.$strContains}%`);\n }\n if (isObject && ops.$strRegex !== undefined) {\n conditions.push(`${this.objectLexicalSql(fullColumn)} GLOB ?`);\n params.push(ops.$strRegex.replace(/\\.\\*/g, '*').replace(/\\./g, '?'));\n }\n if (isObject && ops.$language !== undefined) {\n conditions.push(`lower(${fullColumn}) LIKE ?`);\n params.push(ops.$language === '*' ? '%\"@%' : `%\"@${ops.$language.toLowerCase()}`);\n }\n if (ops.$isNull === true) {\n conditions.push(`${fullColumn} IS NULL`);\n }\n if (ops.$isNull === false) {\n conditions.push(`${fullColumn} IS NOT NULL`);\n }\n }\n };\n\n addCondition('graph', pattern.graph);\n addCondition('subject', pattern.subject);\n addCondition('predicate', pattern.predicate);\n addCondition('object', pattern.object, true);\n\n return conditions;\n }\n\n // ============================================\n // Write Operations\n // ============================================\n\n async put(quint: Quint): Promise<void> {\n this.ensureOpen();\n\n const row = this.quintToRow(quint);\n\n await this.db!.insert(quints)\n .values(row)\n .onConflictDoUpdate({\n target: [quints.graph, quints.subject, quints.predicate, quints.object],\n set: { vector: row.vector },\n });\n }\n\n async multiPut(quintList: Quint[]): Promise<void> {\n this.ensureOpen();\n\n if (quintList.length === 0) return;\n\n const rows = quintList.map(q => this.quintToRow(q));\n\n // Use transaction for batch insert\n this.sqlite!.transaction(() => {\n for (const row of rows) {\n this.db!.insert(quints)\n .values(row)\n .onConflictDoUpdate({\n target: [quints.graph, quints.subject, quints.predicate, quints.object],\n set: { vector: row.vector },\n })\n .run();\n }\n })();\n }\n\n async updateEmbedding(pattern: QuintPattern, embedding: number[]): Promise<number> {\n this.ensureOpen();\n\n const conditions = this.buildConditions(pattern);\n const vectorJson = JSON.stringify(embedding);\n\n if (conditions.length === 0) {\n const result = await this.db!.update(quints)\n .set({ vector: vectorJson });\n return result.changes;\n }\n\n const result = await this.db!.update(quints)\n .set({ vector: vectorJson })\n .where(and(...conditions));\n\n return result.changes;\n }\n\n // ============================================\n // Delete Operations\n // ============================================\n\n async del(pattern: QuintPattern): Promise<number> {\n this.ensureOpen();\n\n const conditions = this.buildConditions(pattern);\n\n if (conditions.length === 0) {\n // Delete all - dangerous!\n const result = await this.db!.delete(quints);\n return result.changes;\n }\n\n const result = await this.db!.delete(quints).where(and(...conditions));\n return result.changes;\n }\n\n async multiDel(quintList: Quint[]): Promise<void> {\n this.ensureOpen();\n\n if (quintList.length === 0) return;\n\n this.sqlite!.transaction(() => {\n for (const quint of quintList) {\n const g = termToId(quint.graph as any);\n const s = termToId(quint.subject as any);\n const p = termToId(quint.predicate as any);\n const o = serializeObject(quint.object as any);\n\n this.db!.delete(quints)\n .where(\n and(\n eq(quints.graph, g),\n eq(quints.subject, s),\n eq(quints.predicate, p),\n eq(quints.object, o),\n ),\n )\n .run();\n }\n })();\n }\n\n // ============================================\n // Management\n // ============================================\n\n async stats(): Promise<StoreStats> {\n this.ensureOpen();\n\n const totalResult = await this.db!\n .select({ count: sql<number>`count(*)` })\n .from(quints);\n\n const vectorResult = await this.db!\n .select({ count: sql<number>`count(*)` })\n .from(quints)\n .where(sql`${quints.vector} IS NOT NULL`);\n\n const graphResult = await this.db!\n .select({ count: sql<number>`COUNT(DISTINCT ${quints.graph})` })\n .from(quints);\n\n return {\n totalCount: totalResult[0]?.count ?? 0,\n vectorCount: vectorResult[0]?.count ?? 0,\n graphCount: graphResult[0]?.count ?? 0,\n };\n }\n\n async clear(): Promise<void> {\n this.ensureOpen();\n await this.db!.delete(quints);\n }\n\n // ============================================\n // Private Helpers\n // ============================================\n\n private ensureOpen(): void {\n if (!this.db) {\n throw new Error('Store not open. Call open() first.');\n }\n }\n\n private buildConditions(pattern: QuintPattern): SQL[] {\n const conditions: SQL[] = [];\n\n /**\n * Serialize operator value for comparison\n * - Term: use serializeObject/termToId\n * - number: for exact match ($eq, $ne, $in, $notIn) use full serialization\n * for range comparison ($gt, $gte, $lt, $lte) use fpstring\n * - string: assume already serialized or use as-is\n */\n const serializeOpValue = (value: OperatorValue, isObject: boolean, filterOp: string): any => {\n if (typeof value === 'object' && 'termType' in value) {\n return isObject ? serializeObject(value as any) : termToId(value as any);\n }\n \n if (typeof value === 'number') {\n if (isObject) {\n // For exact match operations, use full serialization (includes datatype and original value)\n if (filterOp === '$eq' || filterOp === '$ne' || filterOp === '$in' || filterOp === '$notIn') {\n const lit = DataFactory.literal(String(value), DataFactory.namedNode('http://www.w3.org/2001/XMLSchema#integer'));\n return serializeObject(lit);\n }\n // For range comparisons, use fpstring\n const fpValue = `N${SEP}${fpEncode(value)}`;\n // $gt and $lte need max suffix\n if (filterOp === '$gt' || filterOp === '$lte') {\n return fpValue + SEP + '\\uffff';\n }\n return fpValue;\n }\n return value;\n }\n \n if (isObject && !isSerializedObjectValue(value)) {\n return `\"${value}\"`;\n }\n return value;\n };\n\n const addTermConditions = (\n column: typeof quints.graph | typeof quints.subject | typeof quints.predicate | typeof quints.object,\n match: TermMatch | undefined,\n isObject: boolean = false\n ) => {\n if (!match) return;\n\n if (isTerm(match)) {\n // Exact Term match\n conditions.push(eq(column, isObject ? serializeObject(match as any) : termToId(match as any)));\n } else {\n // Operator match\n const ops = match as TermOperators;\n\n if (ops.$eq !== undefined) {\n conditions.push(eq(column, serializeOpValue(ops.$eq, isObject, '$eq')));\n }\n if (ops.$ne !== undefined) {\n conditions.push(ne(column, serializeOpValue(ops.$ne, isObject, '$ne')));\n }\n if (ops.$gt !== undefined) {\n conditions.push(gt(column, serializeOpValue(ops.$gt, isObject, '$gt')));\n }\n if (ops.$gte !== undefined) {\n conditions.push(gte(column, serializeOpValue(ops.$gte, isObject, '$gte')));\n }\n if (ops.$lt !== undefined) {\n conditions.push(lt(column, serializeOpValue(ops.$lt, isObject, '$lt')));\n }\n if (ops.$lte !== undefined) {\n conditions.push(lte(column, serializeOpValue(ops.$lte, isObject, '$lte')));\n }\n if (ops.$in !== undefined && ops.$in.length > 0) {\n const serializedValues = ops.$in.map(v => serializeOpValue(v, isObject, '$in'));\n conditions.push(inArray(column, serializedValues));\n }\n if (ops.$notIn !== undefined && ops.$notIn.length > 0) {\n const serializedValues = ops.$notIn.map(v => serializeOpValue(v, isObject, '$notIn'));\n conditions.push(notInArray(column, serializedValues));\n }\n if (ops.$startsWith !== undefined) {\n // Use range query for prefix matching (index-friendly)\n conditions.push(gte(column, ops.$startsWith));\n conditions.push(lt(column, ops.$startsWith + '\\uffff'));\n }\n if (ops.$endsWith !== undefined) {\n conditions.push(like(column, `%${ops.$endsWith}`));\n }\n if (ops.$contains !== undefined) {\n conditions.push(like(column, `%${ops.$contains}%`));\n }\n if (ops.$regex !== undefined) {\n // SQLite uses GLOB as regex approximation\n conditions.push(sql`${column} GLOB ${ops.$regex.replace(/\\.\\*/g, '*').replace(/\\./g, '?')}`);\n }\n if (isObject && ops.$strStartsWith !== undefined) {\n const lexical = sql.raw(this.objectLexicalSql('object'));\n conditions.push(sql`${lexical} >= ${ops.$strStartsWith}`);\n conditions.push(sql`${lexical} < ${ops.$strStartsWith + '\\uffff'}`);\n }\n if (isObject && ops.$strEndsWith !== undefined) {\n conditions.push(sql`${sql.raw(this.objectLexicalSql('object'))} LIKE ${`%${ops.$strEndsWith}`}`);\n }\n if (isObject && ops.$strContains !== undefined) {\n conditions.push(sql`${sql.raw(this.objectLexicalSql('object'))} LIKE ${`%${ops.$strContains}%`}`);\n }\n if (isObject && ops.$strRegex !== undefined) {\n conditions.push(sql`${sql.raw(this.objectLexicalSql('object'))} GLOB ${ops.$strRegex.replace(/\\.\\*/g, '*').replace(/\\./g, '?')}`);\n }\n if (isObject && ops.$language !== undefined) {\n conditions.push(\n ops.$language === '*'\n ? sql`lower(${column}) LIKE ${`%\"@%`}`\n : sql`lower(${column}) LIKE ${`%\"@${ops.$language.toLowerCase()}`}`,\n );\n }\n if (ops.$isNull === true) {\n conditions.push(isNull(column));\n }\n if (ops.$isNull === false) {\n conditions.push(isNotNull(column));\n }\n }\n };\n\n addTermConditions(quints.graph, pattern.graph);\n addTermConditions(quints.subject, pattern.subject);\n addTermConditions(quints.predicate, pattern.predicate);\n addTermConditions(quints.object, pattern.object, true);\n\n return conditions;\n }\n\n private objectLexicalSql(column: string): string {\n return `CASE\n WHEN ${column} LIKE '\"%\"@%' THEN substr(${column}, 2, instr(substr(${column}, 2), '\"') - 1)\n WHEN ${column} LIKE '\"%\"^^%' THEN substr(${column}, 2, instr(substr(${column}, 2), '\"') - 1)\n WHEN ${column} LIKE '\"%\"' THEN substr(${column}, 2, length(${column}) - 2)\n WHEN ${column} LIKE 'N${SEP}%' THEN substr(${column}, length('N${SEP}') + instr(substr(${column}, length('N${SEP}') + 1), '${SEP}') + instr(substr(${column}, length('N${SEP}') + instr(substr(${column}, length('N${SEP}') + 1), '${SEP}') + 1), '${SEP}') + 1)\n WHEN ${column} LIKE 'D${SEP}%' THEN substr(${column}, length('D${SEP}') + instr(substr(${column}, length('D${SEP}') + 1), '${SEP}') + 1)\n ELSE ${column}\n END`;\n }\n\n private quintToRow(quint: Quint): NewQuintRow {\n return {\n graph: termToId(quint.graph as any),\n subject: termToId(quint.subject as any),\n predicate: termToId(quint.predicate as any),\n object: serializeObject(quint.object as any),\n vector: quint.vector ? JSON.stringify(quint.vector) : null,\n };\n }\n\n private rowToQuint(row: QuintRow): Quint {\n const quad = rowToQuad(row);\n const quint: Quint = quad as Quint;\n if (row.vector) {\n quint.vector = parseVector(row.vector);\n }\n return quint;\n }\n}\n"]}
1
+ {"version":3,"file":"SqliteQuintStore.js","sourceRoot":"","sources":["../../../src/storage/quint/SqliteQuintStore.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * SqliteQuintStore - SQLite implementation of QuintStore using Drizzle ORM\n */\n\nimport { existsSync, mkdirSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport { eq, ne, and, gte, gt, lt, lte, like, inArray, notInArray, isNull, isNotNull, sql } from 'drizzle-orm';\nimport type { SQL } from 'drizzle-orm';\nimport { wrap, AsyncIterator } from 'asynciterator';\nimport { DataFactory } from 'n3';\nimport type { Term, Quad } from '@rdfjs/types';\n\nimport { quints, type QuintRow, type NewQuintRow } from './schema';\nimport {\n quadToRow,\n rowToQuad,\n parseVector,\n termToId,\n serializeObject,\n deserializeObject,\n fpEncode,\n SEP,\n isSerializedObjectValue,\n} from './serialization';\nimport { getSqliteRuntime, type SqliteDatabase } from '../SqliteRuntime';\nimport type {\n Quint,\n QuintPattern,\n QuintStore,\n QuintStoreOptions,\n QueryOptions,\n StoreStats,\n StoreSpaceObject,\n TermMatch,\n TermOperators,\n CompoundPattern,\n CompoundResult,\n OperatorValue,\n} from './types';\nimport { isTerm } from './types';\n\nconst SQLITE_UNBOUNDED_LIMIT = Number.MAX_SAFE_INTEGER;\n\nexport interface SqliteQuintStoreOptions extends QuintStoreOptions {\n /** SQLite database file path, use ':memory:' for in-memory database */\n path: string;\n}\n\nexport class SqliteQuintStore {\n private sqlite: SqliteDatabase | null = null;\n private db: any | null = null;\n private options: SqliteQuintStoreOptions;\n private readonly sqliteRuntime = getSqliteRuntime();\n\n constructor(options: SqliteQuintStoreOptions) {\n // Handle sqlite: prefix\n let path = options.path;\n if (path.startsWith('sqlite:')) {\n path = path.slice(7);\n }\n this.options = { ...options, path };\n }\n\n // ============================================\n // Lifecycle\n // ============================================\n\n async open(): Promise<void> {\n // Idempotent: if already open, do nothing\n if (this.sqlite) {\n return;\n }\n\n const dbPath = this.options.path;\n \n // Ensure directory exists (unless it's in-memory)\n if (dbPath !== ':memory:') {\n const dir = dirname(dbPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n \n this.sqlite = this.sqliteRuntime.openDatabase(dbPath);\n this.db = this.sqliteRuntime.createDrizzleDatabase(this.sqlite);\n\n // Create table and indexes\n this.sqlite.exec(`\n CREATE TABLE IF NOT EXISTS quints (\n graph TEXT NOT NULL,\n subject TEXT NOT NULL,\n predicate TEXT NOT NULL,\n object TEXT NOT NULL,\n vector TEXT,\n PRIMARY KEY (graph, subject, predicate, object)\n );\n\n CREATE INDEX IF NOT EXISTS idx_spog ON quints (subject, predicate, object, graph);\n CREATE INDEX IF NOT EXISTS idx_ogsp ON quints (object, graph, subject, predicate);\n CREATE INDEX IF NOT EXISTS idx_gspo ON quints (graph, subject, predicate, object);\n CREATE INDEX IF NOT EXISTS idx_sopg ON quints (subject, object, predicate, graph);\n CREATE INDEX IF NOT EXISTS idx_pogs ON quints (predicate, object, graph, subject);\n CREATE INDEX IF NOT EXISTS idx_gpos ON quints (graph, predicate, object, subject);\n `);\n }\n\n async close(): Promise<void> {\n if (this.sqlite) {\n this.sqlite.close();\n this.sqlite = null;\n this.db = null;\n }\n }\n\n // ============================================\n // Query Operations\n // ============================================\n\n async get(pattern: QuintPattern, options?: QueryOptions): Promise<Quint[]> {\n this.ensureOpen();\n\n const conditions = this.buildConditions(pattern);\n \n let query = this.db!.select().from(quints);\n \n if (conditions.length > 0) {\n query = query.where(and(...conditions)) as any;\n }\n\n // ORDER BY 支持\n if (options?.order && options.order.length > 0) {\n // 使用 sql 模板构建 ORDER BY\n const orderCol = options.order[0]; // 目前只支持单列排序\n const direction = options.reverse ? 'DESC' : 'ASC';\n query = query.orderBy(sql.raw(`${orderCol} ${direction}`)) as any;\n }\n\n if (options?.limit !== undefined) {\n query = query.limit(options.limit) as any;\n }\n if (options?.offset !== undefined) {\n // SQLite requires LIMIT when using OFFSET\n if (options?.limit === undefined) {\n query = query.limit(SQLITE_UNBOUNDED_LIMIT) as any;\n }\n query = query.offset(options.offset) as any;\n }\n\n const rows = await query;\n return rows.map((row: QuintRow) => this.rowToQuint(row));\n }\n\n match(\n subject?: Term | null,\n predicate?: Term | null,\n object?: Term | null,\n graph?: Term | null,\n ): AsyncIterator<Quint> {\n const pattern: QuintPattern = {};\n if (subject) pattern.subject = subject;\n if (predicate) pattern.predicate = predicate;\n if (object) pattern.object = object;\n if (graph) pattern.graph = graph;\n\n return wrap(this.get(pattern));\n }\n\n async getByGraphPrefix(prefix: string, options?: QueryOptions): Promise<Quint[]> {\n return this.get({ graph: { $startsWith: prefix } }, options);\n }\n\n async count(pattern: QuintPattern): Promise<number> {\n this.ensureOpen();\n\n const conditions = this.buildConditions(pattern);\n\n let query = this.db!.select({ count: sql<number>`count(*)` }).from(quints);\n\n if (conditions.length > 0) {\n query = query.where(and(...conditions)) as any;\n }\n\n const result = await query;\n return result[0]?.count ?? 0;\n }\n\n /**\n * Compound query - multiple patterns JOINed by a common field\n * This executes a single SQL query with JOINs, letting SQLite optimize the execution plan\n */\n async getCompound(compound: CompoundPattern, options?: QueryOptions): Promise<CompoundResult[]> {\n this.ensureOpen();\n\n const { patterns, joinOn, select } = compound;\n \n if (patterns.length === 0) {\n return [];\n }\n\n if (patterns.length === 1) {\n // Single pattern, fall back to regular get\n const quads = await this.get(patterns[0], options);\n return quads.map(q => ({\n joinValue: termToId((q as any)[joinOn]),\n bindings: {},\n quads: [q],\n }));\n }\n\n // Build JOIN SQL\n const { sql: sqlQuery, params } = this.buildCompoundSQL(compound, options);\n \n if (this.options.debug) {\n console.log('[SqliteQuintStore] Compound SQL:', sqlQuery);\n console.log('[SqliteQuintStore] Params:', params);\n }\n\n // Execute raw SQL\n const stmt = this.sqlite!.prepare(sqlQuery);\n const rows = stmt.all(...params) as Record<string, string>[];\n\n // Convert rows to CompoundResult\n return rows.map(row => {\n const bindings: Record<string, string> = {};\n \n // Extract bindings based on select config or default naming\n if (select) {\n for (const s of select) {\n bindings[s.alias] = row[s.alias];\n }\n } else {\n // Default: include all fields from all patterns\n for (const key of Object.keys(row)) {\n if (key !== 'join_value') {\n bindings[key] = row[key];\n }\n }\n }\n\n return {\n joinValue: row.join_value,\n bindings,\n };\n });\n }\n\n /**\n * 批量获取多个 subject 的多个属性\n * \n * 用于优化 OPTIONAL 查询:避免每个 OPTIONAL 变成一次 LEFT JOIN\n * \n * SQL: SELECT subject, predicate, object FROM quints \n * WHERE subject IN (...) AND predicate IN (...)\n */\n async getAttributes(\n subjects: string[],\n predicates: string[],\n graph?: Term\n ): Promise<Map<string, Map<string, Term[]>>> {\n this.ensureOpen();\n\n if (subjects.length === 0 || predicates.length === 0) {\n return new Map();\n }\n\n // Build SQL with IN clauses\n const params: string[] = [];\n let sql = `SELECT subject, predicate, object FROM quints WHERE subject IN (${\n subjects.map(() => '?').join(', ')\n }) AND predicate IN (${\n predicates.map(() => '?').join(', ')\n })`;\n \n params.push(...subjects);\n params.push(...predicates);\n\n // Add graph filter if specified\n if (graph && graph.termType !== 'DefaultGraph') {\n sql += ` AND graph = ?`;\n params.push(termToId(graph as any));\n }\n\n if (this.options.debug) {\n console.log('[SqliteQuintStore] getAttributes SQL:', sql);\n console.log('[SqliteQuintStore] Params:', params.length, 'subjects:', subjects.length, 'predicates:', predicates.length);\n }\n\n const stmt = this.sqlite!.prepare(sql);\n const rows = stmt.all(...params) as { subject: string; predicate: string; object: string }[];\n\n // Build result map: subject -> predicate -> object[]\n const result = new Map<string, Map<string, Term[]>>();\n\n for (const row of rows) {\n if (!result.has(row.subject)) {\n result.set(row.subject, new Map());\n }\n const predicateMap = result.get(row.subject)!;\n \n if (!predicateMap.has(row.predicate)) {\n predicateMap.set(row.predicate, []);\n }\n \n // Deserialize object back to Term\n const objectTerm = deserializeObject(row.object);\n predicateMap.get(row.predicate)!.push(objectTerm);\n }\n\n if (this.options.debug) {\n console.log('[SqliteQuintStore] getAttributes returned', result.size, 'subjects');\n }\n\n return result;\n }\n\n /**\n * Build SQL for compound query with JOINs\n */\n private buildCompoundSQL(\n compound: CompoundPattern,\n options?: QueryOptions\n ): { sql: string; params: (string | number)[] } {\n const { patterns, joinOn, select } = compound;\n const params: (string | number)[] = [];\n \n // Map joinOn to column name\n const joinColumn = joinOn; // 'subject' | 'predicate' | 'object' | 'graph'\n\n // Build SELECT clause\n let selectClause = `q0.${joinColumn} as join_value`;\n \n if (select) {\n for (const s of select) {\n selectClause += `, q${s.pattern}.${s.field} as ${s.alias}`;\n }\n } else {\n // Default: select object from each pattern as p0_object, p1_object, etc.\n for (let i = 0; i < patterns.length; i++) {\n selectClause += `, q${i}.object as p${i}_object`;\n selectClause += `, q${i}.predicate as p${i}_predicate`;\n }\n }\n\n // Build FROM clause with JOINs\n let fromClause = 'quints q0';\n for (let i = 1; i < patterns.length; i++) {\n fromClause += ` JOIN quints q${i} ON q0.${joinColumn} = q${i}.${joinColumn}`;\n // Also join on graph to ensure same graph\n fromClause += ` AND q0.graph = q${i}.graph`;\n }\n\n // Build WHERE clause\n const whereParts: string[] = [];\n \n for (let i = 0; i < patterns.length; i++) {\n const pattern = patterns[i];\n const alias = `q${i}`;\n \n const conditions = this.buildConditionsForAlias(pattern, alias, params);\n whereParts.push(...conditions);\n }\n\n let sql = `SELECT ${selectClause} FROM ${fromClause}`;\n \n if (whereParts.length > 0) {\n sql += ` WHERE ${whereParts.join(' AND ')}`;\n }\n\n // Add LIMIT/OFFSET\n if (options?.limit) {\n sql += ` LIMIT ?`;\n params.push(options.limit);\n }\n if (options?.offset) {\n if (!options?.limit) {\n sql += ` LIMIT -1`;\n }\n sql += ` OFFSET ?`;\n params.push(options.offset);\n }\n\n return { sql, params };\n }\n\n /**\n * Build WHERE conditions for a specific table alias\n */\n private buildConditionsForAlias(\n pattern: QuintPattern,\n alias: string,\n params: (string | number)[]\n ): string[] {\n const conditions: string[] = [];\n\n /**\n * Serialize operator value for comparison\n * - Term: use serializeObject/termToId\n * - number: for exact match ($eq, $ne, $in, $notIn) use full serialization\n * for range comparison ($gt, $gte, $lt, $lte) use fpstring\n * - string: assume already serialized or use as-is\n */\n const serializeOpValue = (value: OperatorValue, isObject: boolean, filterOp: string): string | number => {\n if (typeof value === 'object' && 'termType' in value) {\n // It's a Term - use full serialization\n return isObject ? serializeObject(value as any) : termToId(value as any);\n }\n \n if (typeof value === 'number') {\n if (isObject) {\n // For exact match operations, use full serialization (includes datatype and original value)\n if (filterOp === '$eq' || filterOp === '$ne' || filterOp === '$in' || filterOp === '$notIn') {\n const lit = DataFactory.literal(String(value), DataFactory.namedNode('http://www.w3.org/2001/XMLSchema#integer'));\n return serializeObject(lit);\n }\n // For range comparisons, use fpstring\n const fpValue = `N${SEP}${fpEncode(value)}`;\n // $gt and $lte need max suffix to compare correctly\n if (filterOp === '$gt' || filterOp === '$lte') {\n return fpValue + SEP + '\\uffff';\n }\n // $lt and $gte use prefix only\n return fpValue;\n }\n return value;\n }\n \n if (isObject) {\n if (isSerializedObjectValue(value)) {\n return value;\n }\n return `\"${value}\"`;\n }\n return value;\n };\n\n const addCondition = (\n column: string,\n match: TermMatch | undefined,\n isObject: boolean = false\n ) => {\n if (!match) return;\n\n const fullColumn = `${alias}.${column}`;\n\n if (isTerm(match)) {\n conditions.push(`${fullColumn} = ?`);\n params.push(isObject ? serializeObject(match as any) : termToId(match as any));\n } else {\n const ops = match as TermOperators;\n\n if (ops.$eq !== undefined) {\n conditions.push(`${fullColumn} = ?`);\n params.push(serializeOpValue(ops.$eq, isObject, '$eq'));\n }\n if (ops.$ne !== undefined) {\n conditions.push(`${fullColumn} != ?`);\n params.push(serializeOpValue(ops.$ne, isObject, '$ne'));\n }\n if (ops.$gt !== undefined) {\n conditions.push(`${fullColumn} > ?`);\n params.push(serializeOpValue(ops.$gt, isObject, '$gt'));\n }\n if (ops.$gte !== undefined) {\n conditions.push(`${fullColumn} >= ?`);\n params.push(serializeOpValue(ops.$gte, isObject, '$gte'));\n }\n if (ops.$lt !== undefined) {\n conditions.push(`${fullColumn} < ?`);\n params.push(serializeOpValue(ops.$lt, isObject, '$lt'));\n }\n if (ops.$lte !== undefined) {\n conditions.push(`${fullColumn} <= ?`);\n params.push(serializeOpValue(ops.$lte, isObject, '$lte'));\n }\n if (ops.$in !== undefined && ops.$in.length > 0) {\n const placeholders = ops.$in.map(() => '?').join(', ');\n conditions.push(`${fullColumn} IN (${placeholders})`);\n params.push(...ops.$in.map(v => serializeOpValue(v, isObject, '$in')));\n }\n if (ops.$notIn !== undefined && ops.$notIn.length > 0) {\n const placeholders = ops.$notIn.map(() => '?').join(', ');\n conditions.push(`${fullColumn} NOT IN (${placeholders})`);\n params.push(...ops.$notIn.map(v => serializeOpValue(v, isObject, '$notIn')));\n }\n if (ops.$startsWith !== undefined) {\n conditions.push(`${fullColumn} >= ?`);\n conditions.push(`${fullColumn} < ?`);\n params.push(ops.$startsWith);\n params.push(ops.$startsWith + '\\uffff');\n }\n if (ops.$endsWith !== undefined) {\n conditions.push(`${fullColumn} LIKE ?`);\n params.push(`%${ops.$endsWith}`);\n }\n if (ops.$contains !== undefined) {\n conditions.push(`${fullColumn} LIKE ?`);\n params.push(`%${ops.$contains}%`);\n }\n if (isObject && ops.$strStartsWith !== undefined) {\n const lexical = this.objectLexicalSql(fullColumn);\n conditions.push(`${lexical} >= ?`);\n conditions.push(`${lexical} < ?`);\n params.push(ops.$strStartsWith);\n params.push(ops.$strStartsWith + '\\uffff');\n }\n if (isObject && ops.$strEndsWith !== undefined) {\n conditions.push(`${this.objectLexicalSql(fullColumn)} LIKE ?`);\n params.push(`%${ops.$strEndsWith}`);\n }\n if (isObject && ops.$strContains !== undefined) {\n conditions.push(`${this.objectLexicalSql(fullColumn)} LIKE ?`);\n params.push(`%${ops.$strContains}%`);\n }\n if (isObject && ops.$strRegex !== undefined) {\n conditions.push(`${this.objectLexicalSql(fullColumn)} GLOB ?`);\n params.push(ops.$strRegex.replace(/\\.\\*/g, '*').replace(/\\./g, '?'));\n }\n if (isObject && ops.$language !== undefined) {\n conditions.push(`lower(${fullColumn}) LIKE ?`);\n params.push(ops.$language === '*' ? '%\"@%' : `%\"@${ops.$language.toLowerCase()}`);\n }\n if (ops.$isNull === true) {\n conditions.push(`${fullColumn} IS NULL`);\n }\n if (ops.$isNull === false) {\n conditions.push(`${fullColumn} IS NOT NULL`);\n }\n }\n };\n\n addCondition('graph', pattern.graph);\n addCondition('subject', pattern.subject);\n addCondition('predicate', pattern.predicate);\n addCondition('object', pattern.object, true);\n\n return conditions;\n }\n\n // ============================================\n // Write Operations\n // ============================================\n\n async put(quint: Quint): Promise<void> {\n this.ensureOpen();\n\n const row = this.quintToRow(quint);\n\n await this.db!.insert(quints)\n .values(row)\n .onConflictDoUpdate({\n target: [quints.graph, quints.subject, quints.predicate, quints.object],\n set: { vector: row.vector },\n });\n }\n\n async multiPut(quintList: Quint[]): Promise<void> {\n this.ensureOpen();\n\n if (quintList.length === 0) return;\n\n const rows = quintList.map(q => this.quintToRow(q));\n\n // Use transaction for batch insert\n this.sqlite!.transaction(() => {\n for (const row of rows) {\n this.db!.insert(quints)\n .values(row)\n .onConflictDoUpdate({\n target: [quints.graph, quints.subject, quints.predicate, quints.object],\n set: { vector: row.vector },\n })\n .run();\n }\n })();\n }\n\n async updateEmbedding(pattern: QuintPattern, embedding: number[]): Promise<number> {\n this.ensureOpen();\n\n const conditions = this.buildConditions(pattern);\n const vectorJson = JSON.stringify(embedding);\n\n if (conditions.length === 0) {\n const result = await this.db!.update(quints)\n .set({ vector: vectorJson });\n return result.changes;\n }\n\n const result = await this.db!.update(quints)\n .set({ vector: vectorJson })\n .where(and(...conditions));\n\n return result.changes;\n }\n\n // ============================================\n // Delete Operations\n // ============================================\n\n async del(pattern: QuintPattern): Promise<number> {\n this.ensureOpen();\n\n const conditions = this.buildConditions(pattern);\n\n if (conditions.length === 0) {\n // Delete all - dangerous!\n const result = await this.db!.delete(quints);\n return result.changes;\n }\n\n const result = await this.db!.delete(quints).where(and(...conditions));\n return result.changes;\n }\n\n async multiDel(quintList: Quint[]): Promise<void> {\n this.ensureOpen();\n\n if (quintList.length === 0) return;\n\n this.sqlite!.transaction(() => {\n for (const quint of quintList) {\n const g = termToId(quint.graph as any);\n const s = termToId(quint.subject as any);\n const p = termToId(quint.predicate as any);\n const o = serializeObject(quint.object as any);\n\n this.db!.delete(quints)\n .where(\n and(\n eq(quints.graph, g),\n eq(quints.subject, s),\n eq(quints.predicate, p),\n eq(quints.object, o),\n ),\n )\n .run();\n }\n })();\n }\n\n // ============================================\n // Management\n // ============================================\n\n async stats(): Promise<StoreStats> {\n this.ensureOpen();\n\n const totalResult = await this.db!\n .select({ count: sql<number>`count(*)` })\n .from(quints);\n\n const vectorResult = await this.db!\n .select({ count: sql<number>`count(*)` })\n .from(quints)\n .where(sql`${quints.vector} IS NOT NULL`);\n\n const graphResult = await this.db!\n .select({ count: sql<number>`COUNT(DISTINCT ${quints.graph})` })\n .from(quints);\n\n return {\n totalCount: totalResult[0]?.count ?? 0,\n vectorCount: vectorResult[0]?.count ?? 0,\n graphCount: graphResult[0]?.count ?? 0,\n ...this.sqliteSpaceStats(),\n };\n }\n\n private sqliteSpaceStats(): Pick<StoreStats, 'databaseBytes' | 'tableBytes' | 'indexBytes' | 'spaceObjects'> {\n const spaceObjects = this.collectSpaceObjects();\n const databaseBytes = this.estimateDatabaseBytes();\n const accountedBytes = spaceObjects.reduce((sum, object) => sum + object.bytes, 0);\n return {\n databaseBytes: databaseBytes || accountedBytes,\n tableBytes: sumStoreSpaceObjects(spaceObjects, 'table'),\n indexBytes: sumStoreSpaceObjects(spaceObjects, 'index'),\n spaceObjects,\n };\n }\n\n private estimateDatabaseBytes(): number {\n try {\n const pageCount = this.sqlite!.prepare<{ page_count: number }>('PRAGMA page_count').get()?.page_count ?? 0;\n const pageSize = this.sqlite!.prepare<{ page_size: number }>('PRAGMA page_size').get()?.page_size ?? 0;\n return pageCount * pageSize;\n } catch {\n return 0;\n }\n }\n\n private collectSpaceObjects(): StoreSpaceObject[] {\n try {\n const schemaRows = this.sqlite!.prepare<{ name: string; type: string; tbl_name: string }>(`\n SELECT name, type, tbl_name\n FROM sqlite_schema\n WHERE type IN ('table', 'index')\n `).all();\n const rows = this.sqlite!.prepare<{ name: string; pages: number; bytes: number | null }>(`\n SELECT name, COUNT(*) AS pages, SUM(pgsize) AS bytes\n FROM dbstat\n GROUP BY name\n ORDER BY name\n `).all();\n\n if (rows.length > 0) {\n const schema = new Map(schemaRows.map((row) => [row.name, row]));\n return rows.map((row) => {\n const object = schema.get(row.name);\n const kind = quintSpaceObjectKind(row.name, object?.type, object?.tbl_name);\n return {\n name: row.name,\n kind,\n ...(object?.tbl_name && object.tbl_name !== row.name ? { tableName: object.tbl_name } : {}),\n pages: row.pages,\n bytes: row.bytes ?? 0,\n };\n });\n }\n\n return this.estimateSpaceObjectsFromSchema(schemaRows);\n } catch {\n try {\n const schemaRows = this.sqlite!.prepare<{ name: string; type: string; tbl_name: string }>(`\n SELECT name, type, tbl_name\n FROM sqlite_schema\n WHERE type IN ('table', 'index')\n `).all();\n return this.estimateSpaceObjectsFromSchema(schemaRows);\n } catch {\n return [];\n }\n }\n }\n\n private estimateSpaceObjectsFromSchema(schemaRows: Array<{ name: string; type: string; tbl_name: string }>): StoreSpaceObject[] {\n const pageSize = this.estimatePageSize();\n return schemaRows.map((object) => ({\n name: object.name,\n kind: quintSpaceObjectKind(object.name, object.type, object.tbl_name),\n ...(object.tbl_name && object.tbl_name !== object.name ? { tableName: object.tbl_name } : {}),\n pages: 1,\n bytes: pageSize,\n }));\n }\n\n private estimatePageSize(): number {\n try {\n return this.sqlite!.prepare<{ page_size: number }>('PRAGMA page_size').get()?.page_size ?? 4096;\n } catch {\n return 4096;\n }\n }\n\n async clear(): Promise<void> {\n this.ensureOpen();\n await this.db!.delete(quints);\n }\n\n // ============================================\n // Private Helpers\n // ============================================\n\n private ensureOpen(): void {\n if (!this.db) {\n throw new Error('Store not open. Call open() first.');\n }\n }\n\n private buildConditions(pattern: QuintPattern): SQL[] {\n const conditions: SQL[] = [];\n\n /**\n * Serialize operator value for comparison\n * - Term: use serializeObject/termToId\n * - number: for exact match ($eq, $ne, $in, $notIn) use full serialization\n * for range comparison ($gt, $gte, $lt, $lte) use fpstring\n * - string: assume already serialized or use as-is\n */\n const serializeOpValue = (value: OperatorValue, isObject: boolean, filterOp: string): any => {\n if (typeof value === 'object' && 'termType' in value) {\n return isObject ? serializeObject(value as any) : termToId(value as any);\n }\n \n if (typeof value === 'number') {\n if (isObject) {\n // For exact match operations, use full serialization (includes datatype and original value)\n if (filterOp === '$eq' || filterOp === '$ne' || filterOp === '$in' || filterOp === '$notIn') {\n const lit = DataFactory.literal(String(value), DataFactory.namedNode('http://www.w3.org/2001/XMLSchema#integer'));\n return serializeObject(lit);\n }\n // For range comparisons, use fpstring\n const fpValue = `N${SEP}${fpEncode(value)}`;\n // $gt and $lte need max suffix\n if (filterOp === '$gt' || filterOp === '$lte') {\n return fpValue + SEP + '\\uffff';\n }\n return fpValue;\n }\n return value;\n }\n \n if (isObject && !isSerializedObjectValue(value)) {\n return `\"${value}\"`;\n }\n return value;\n };\n\n const addTermConditions = (\n column: typeof quints.graph | typeof quints.subject | typeof quints.predicate | typeof quints.object,\n match: TermMatch | undefined,\n isObject: boolean = false\n ) => {\n if (!match) return;\n\n if (isTerm(match)) {\n // Exact Term match\n conditions.push(eq(column, isObject ? serializeObject(match as any) : termToId(match as any)));\n } else {\n // Operator match\n const ops = match as TermOperators;\n\n if (ops.$eq !== undefined) {\n conditions.push(eq(column, serializeOpValue(ops.$eq, isObject, '$eq')));\n }\n if (ops.$ne !== undefined) {\n conditions.push(ne(column, serializeOpValue(ops.$ne, isObject, '$ne')));\n }\n if (ops.$gt !== undefined) {\n conditions.push(gt(column, serializeOpValue(ops.$gt, isObject, '$gt')));\n }\n if (ops.$gte !== undefined) {\n conditions.push(gte(column, serializeOpValue(ops.$gte, isObject, '$gte')));\n }\n if (ops.$lt !== undefined) {\n conditions.push(lt(column, serializeOpValue(ops.$lt, isObject, '$lt')));\n }\n if (ops.$lte !== undefined) {\n conditions.push(lte(column, serializeOpValue(ops.$lte, isObject, '$lte')));\n }\n if (ops.$in !== undefined && ops.$in.length > 0) {\n const serializedValues = ops.$in.map(v => serializeOpValue(v, isObject, '$in'));\n conditions.push(inArray(column, serializedValues));\n }\n if (ops.$notIn !== undefined && ops.$notIn.length > 0) {\n const serializedValues = ops.$notIn.map(v => serializeOpValue(v, isObject, '$notIn'));\n conditions.push(notInArray(column, serializedValues));\n }\n if (ops.$startsWith !== undefined) {\n // Use range query for prefix matching (index-friendly)\n conditions.push(gte(column, ops.$startsWith));\n conditions.push(lt(column, ops.$startsWith + '\\uffff'));\n }\n if (ops.$endsWith !== undefined) {\n conditions.push(like(column, `%${ops.$endsWith}`));\n }\n if (ops.$contains !== undefined) {\n conditions.push(like(column, `%${ops.$contains}%`));\n }\n if (ops.$regex !== undefined) {\n // SQLite uses GLOB as regex approximation\n conditions.push(sql`${column} GLOB ${ops.$regex.replace(/\\.\\*/g, '*').replace(/\\./g, '?')}`);\n }\n if (isObject && ops.$strStartsWith !== undefined) {\n const lexical = sql.raw(this.objectLexicalSql('object'));\n conditions.push(sql`${lexical} >= ${ops.$strStartsWith}`);\n conditions.push(sql`${lexical} < ${ops.$strStartsWith + '\\uffff'}`);\n }\n if (isObject && ops.$strEndsWith !== undefined) {\n conditions.push(sql`${sql.raw(this.objectLexicalSql('object'))} LIKE ${`%${ops.$strEndsWith}`}`);\n }\n if (isObject && ops.$strContains !== undefined) {\n conditions.push(sql`${sql.raw(this.objectLexicalSql('object'))} LIKE ${`%${ops.$strContains}%`}`);\n }\n if (isObject && ops.$strRegex !== undefined) {\n conditions.push(sql`${sql.raw(this.objectLexicalSql('object'))} GLOB ${ops.$strRegex.replace(/\\.\\*/g, '*').replace(/\\./g, '?')}`);\n }\n if (isObject && ops.$language !== undefined) {\n conditions.push(\n ops.$language === '*'\n ? sql`lower(${column}) LIKE ${`%\"@%`}`\n : sql`lower(${column}) LIKE ${`%\"@${ops.$language.toLowerCase()}`}`,\n );\n }\n if (ops.$isNull === true) {\n conditions.push(isNull(column));\n }\n if (ops.$isNull === false) {\n conditions.push(isNotNull(column));\n }\n }\n };\n\n addTermConditions(quints.graph, pattern.graph);\n addTermConditions(quints.subject, pattern.subject);\n addTermConditions(quints.predicate, pattern.predicate);\n addTermConditions(quints.object, pattern.object, true);\n\n return conditions;\n }\n\n private objectLexicalSql(column: string): string {\n return `CASE\n WHEN ${column} LIKE '\"%\"@%' THEN substr(${column}, 2, instr(substr(${column}, 2), '\"') - 1)\n WHEN ${column} LIKE '\"%\"^^%' THEN substr(${column}, 2, instr(substr(${column}, 2), '\"') - 1)\n WHEN ${column} LIKE '\"%\"' THEN substr(${column}, 2, length(${column}) - 2)\n WHEN ${column} LIKE 'N${SEP}%' THEN substr(${column}, length('N${SEP}') + instr(substr(${column}, length('N${SEP}') + 1), '${SEP}') + instr(substr(${column}, length('N${SEP}') + instr(substr(${column}, length('N${SEP}') + 1), '${SEP}') + 1), '${SEP}') + 1)\n WHEN ${column} LIKE 'D${SEP}%' THEN substr(${column}, length('D${SEP}') + instr(substr(${column}, length('D${SEP}') + 1), '${SEP}') + 1)\n ELSE ${column}\n END`;\n }\n\n private quintToRow(quint: Quint): NewQuintRow {\n return {\n graph: termToId(quint.graph as any),\n subject: termToId(quint.subject as any),\n predicate: termToId(quint.predicate as any),\n object: serializeObject(quint.object as any),\n vector: quint.vector ? JSON.stringify(quint.vector) : null,\n };\n }\n\n private rowToQuint(row: QuintRow): Quint {\n const quad = rowToQuad(row);\n const quint: Quint = quad as Quint;\n if (row.vector) {\n quint.vector = parseVector(row.vector);\n }\n return quint;\n }\n}\n\nfunction sumStoreSpaceObjects(objects: StoreSpaceObject[], kind: StoreSpaceObject['kind']): number {\n return objects\n .filter((object) => object.kind === kind)\n .reduce((sum, object) => sum + object.bytes, 0);\n}\n\nfunction quintSpaceObjectKind(name: string, schemaType?: string, tableName?: string): StoreSpaceObject['kind'] {\n if (schemaType === 'table' && name === 'quints') {\n return 'table';\n }\n if (schemaType === 'index' && (name.startsWith('idx_') || tableName === 'quints')) {\n return 'index';\n }\n if (name.startsWith('sqlite_')) {\n return 'internal';\n }\n return 'unknown';\n}\n"]}
@@ -173,6 +173,26 @@
173
173
  "@id": "undefineds:dist/storage/quint/SqliteQuintStore.jsonld#SqliteQuintStore__member_stats",
174
174
  "memberFieldName": "stats"
175
175
  },
176
+ {
177
+ "@id": "undefineds:dist/storage/quint/SqliteQuintStore.jsonld#SqliteQuintStore__member_sqliteSpaceStats",
178
+ "memberFieldName": "sqliteSpaceStats"
179
+ },
180
+ {
181
+ "@id": "undefineds:dist/storage/quint/SqliteQuintStore.jsonld#SqliteQuintStore__member_estimateDatabaseBytes",
182
+ "memberFieldName": "estimateDatabaseBytes"
183
+ },
184
+ {
185
+ "@id": "undefineds:dist/storage/quint/SqliteQuintStore.jsonld#SqliteQuintStore__member_collectSpaceObjects",
186
+ "memberFieldName": "collectSpaceObjects"
187
+ },
188
+ {
189
+ "@id": "undefineds:dist/storage/quint/SqliteQuintStore.jsonld#SqliteQuintStore__member_estimateSpaceObjectsFromSchema",
190
+ "memberFieldName": "estimateSpaceObjectsFromSchema"
191
+ },
192
+ {
193
+ "@id": "undefineds:dist/storage/quint/SqliteQuintStore.jsonld#SqliteQuintStore__member_estimatePageSize",
194
+ "memberFieldName": "estimatePageSize"
195
+ },
176
196
  {
177
197
  "@id": "undefineds:dist/storage/quint/SqliteQuintStore.jsonld#SqliteQuintStore__member_clear",
178
198
  "memberFieldName": "clear"
@@ -49,6 +49,11 @@ export interface TermOperators {
49
49
  $strContains?: string;
50
50
  $strRegex?: string;
51
51
  $language?: string;
52
+ $notLanguage?: string;
53
+ $langMatches?: string;
54
+ $datatype?: Term;
55
+ $notDatatype?: Term;
56
+ $termType?: 'iri' | 'blank' | 'literal' | 'numeric';
52
57
  $isNull?: boolean;
53
58
  }
54
59
  /**
@@ -100,6 +105,17 @@ export interface StoreStats {
100
105
  totalCount: number;
101
106
  vectorCount: number;
102
107
  graphCount: number;
108
+ databaseBytes?: number;
109
+ tableBytes?: number;
110
+ indexBytes?: number;
111
+ spaceObjects?: StoreSpaceObject[];
112
+ }
113
+ export interface StoreSpaceObject {
114
+ name: string;
115
+ kind: 'table' | 'index' | 'internal' | 'unknown';
116
+ tableName?: string;
117
+ bytes: number;
118
+ pages: number;
103
119
  }
104
120
  /**
105
121
  * QuintStore 配置选项
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/storage/quint/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AA0DH,wBAEC;AALD;;GAEG;AACH,SAAgB,MAAM,CAAC,KAAgB;IACrC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,UAAU,IAAI,KAAK,CAAC;AAC5E,CAAC;AAqFD;;GAEG;AACH,MAAsB,UAAU;CA4C/B;AA5CD,gCA4CC","sourcesContent":["/**\n * QuintStore - 五元组存储类型定义\n * \n * Quint = (G)raph, (S)ubject, (P)redicate, (O)bject, (V)ector\n * \n * 核心能力:\n * - RDF 四元组存储与查询\n * - 通用操作符查询($startsWith, $contains 等)\n * - 向量嵌入存储(搜索后续再做)\n */\n\nimport type { Term, Quad } from '@rdfjs/types';\nimport type { AsyncIterator } from 'asynciterator';\nimport type { PredicateObjectDataTypes } from './value-types';\n\n/**\n * 五元组 - 扩展 RDF Quad,增加向量\n */\nexport interface Quint extends Quad {\n vector?: number[];\n}\n\n/**\n * Term 名称类型\n */\nexport type TermName = 'subject' | 'predicate' | 'object' | 'graph';\n\n/**\n * 操作符值类型 - 可以是 Term、string 或 number\n * 存储层会自动处理序列化\n */\nexport type OperatorValue = Term | string | number;\n\n/**\n * Term 操作符 - 用于灵活查询\n * 值可以是 Term、string 或 number,存储层自动处理序列化\n */\nexport interface TermOperators {\n $eq?: OperatorValue;\n $ne?: OperatorValue;\n $gt?: OperatorValue;\n $gte?: OperatorValue;\n $lt?: OperatorValue;\n $lte?: OperatorValue;\n $in?: OperatorValue[];\n $notIn?: OperatorValue[];\n $startsWith?: string;\n $endsWith?: string;\n $contains?: string;\n $regex?: string;\n /** RDF term lexical string operators for STR(?object) pushdown. */\n $strStartsWith?: string;\n $strEndsWith?: string;\n $strContains?: string;\n $strRegex?: string;\n $language?: string;\n $isNull?: boolean;\n}\n\n/**\n * Term 匹配 - Term 精确匹配或操作符匹配\n */\nexport type TermMatch = Term | TermOperators;\n\n/**\n * 判断是否为 Term(而非操作符)\n */\nexport function isTerm(value: TermMatch): value is Term {\n return value !== null && typeof value === 'object' && 'termType' in value;\n}\n\n/**\n * 查询模式\n */\nexport interface QuintPattern {\n subject?: TermMatch;\n predicate?: TermMatch;\n object?: TermMatch;\n graph?: TermMatch;\n}\n\n/**\n * 查询选项\n */\nexport interface QueryOptions {\n limit?: number;\n offset?: number;\n order?: TermName[];\n reverse?: boolean;\n}\n\n/**\n * 复合查询模式 - 多个 pattern 通过 subject 关联\n * 用于多 pattern + FILTER 查询,由数据库内部做 JOIN\n */\nexport interface CompoundPattern {\n /** 多个 pattern,每个 pattern 对应一个三元组匹配 */\n patterns: QuintPattern[];\n /** JOIN 的字段,通常是 subject */\n joinOn: TermName;\n /** 返回哪些字段的值 */\n select?: {\n pattern: number; // pattern 索引\n field: TermName; // 要返回的字段\n alias: string; // 别名\n }[];\n}\n\n/**\n * 存储统计信息\n */\nexport interface StoreStats {\n totalCount: number;\n vectorCount: number;\n graphCount: number;\n}\n\n/**\n * QuintStore 配置选项\n */\nexport interface QuintStoreOptions {\n debug?: boolean;\n /**\n * Predicate-level RDF object data declarations.\n *\n * This declares schema value types, not query modes. The store derives\n * whether exact/range/prefix/search can be pushed down from the data type.\n */\n predicateObjectDataTypes?: PredicateObjectDataTypes;\n /**\n * Maximum serialized byte length that can be indexed as text.\n * Longer undeclared text literals are stored as longText.\n */\n textMaxBytes?: number;\n}\n\n/**\n * 复合查询结果 - 包含多个 pattern 的绑定值\n */\nexport interface CompoundResult {\n /** JOIN 字段的值 */\n joinValue: string;\n /** 各 pattern 的匹配结果,key 是 alias */\n bindings: Record<string, string>;\n /** 原始 quad 数据(可选,用于获取完整信息) */\n quads?: Quint[];\n}\n\n/**\n * 批量属性查询结果\n * Map<subject, Map<predicate, object[]>>\n */\nexport type AttributeMap = Map<string, Map<string, Term[]>>;\n\n/**\n * QuintStore - 五元组存储抽象基类\n */\nexport abstract class QuintStore {\n // 查询\n abstract get(pattern: QuintPattern, options?: QueryOptions): Promise<Quint[]>;\n abstract match(subject?: Term | null, predicate?: Term | null, object?: Term | null, graph?: Term | null): AsyncIterator<Quint>;\n abstract getByGraphPrefix(prefix: string, options?: QueryOptions): Promise<Quint[]>;\n abstract count(pattern: QuintPattern): Promise<number>;\n \n // 复合查询 - 多 pattern JOIN,由数据库内部执行\n getCompound?(compound: CompoundPattern, options?: QueryOptions): Promise<CompoundResult[]>;\n \n /**\n * 批量获取多个 subject 的多个属性\n * \n * 用于优化 OPTIONAL 查询:先用 WHERE 条件获取 subjects,\n * 然后一次性获取所有属性,避免每个 OPTIONAL 变成一次 LEFT JOIN\n * \n * SQL: SELECT subject, predicate, object FROM quints \n * WHERE subject IN (...) AND predicate IN (...)\n * \n * @param subjects - 要查询的 subject IRIs\n * @param predicates - 要获取的属性 predicate IRIs\n * @param graph - 可选,限定图\n * @returns Map<subject, Map<predicate, object[]>>\n */\n getAttributes?(\n subjects: string[],\n predicates: string[],\n graph?: Term\n ): Promise<AttributeMap>;\n\n // 写入\n abstract put(quint: Quint): Promise<void>;\n abstract multiPut(quints: Quint[]): Promise<void>;\n abstract updateEmbedding(pattern: QuintPattern, embedding: number[]): Promise<number>;\n\n // 删除\n abstract del(pattern: QuintPattern): Promise<number>;\n abstract multiDel(quints: Quint[]): Promise<void>;\n\n // 生命周期\n abstract open(): Promise<void>;\n abstract close(): Promise<void>;\n abstract stats(): Promise<StoreStats>;\n abstract clear(): Promise<void>;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/storage/quint/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AA+DH,wBAEC;AALD;;GAEG;AACH,SAAgB,MAAM,CAAC,KAAgB;IACrC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,UAAU,IAAI,KAAK,CAAC;AAC5E,CAAC;AAiGD;;GAEG;AACH,MAAsB,UAAU;CA4C/B;AA5CD,gCA4CC","sourcesContent":["/**\n * QuintStore - 五元组存储类型定义\n * \n * Quint = (G)raph, (S)ubject, (P)redicate, (O)bject, (V)ector\n * \n * 核心能力:\n * - RDF 四元组存储与查询\n * - 通用操作符查询($startsWith, $contains 等)\n * - 向量嵌入存储(搜索后续再做)\n */\n\nimport type { Term, Quad } from '@rdfjs/types';\nimport type { AsyncIterator } from 'asynciterator';\nimport type { PredicateObjectDataTypes } from './value-types';\n\n/**\n * 五元组 - 扩展 RDF Quad,增加向量\n */\nexport interface Quint extends Quad {\n vector?: number[];\n}\n\n/**\n * Term 名称类型\n */\nexport type TermName = 'subject' | 'predicate' | 'object' | 'graph';\n\n/**\n * 操作符值类型 - 可以是 Term、string 或 number\n * 存储层会自动处理序列化\n */\nexport type OperatorValue = Term | string | number;\n\n/**\n * Term 操作符 - 用于灵活查询\n * 值可以是 Term、string 或 number,存储层自动处理序列化\n */\nexport interface TermOperators {\n $eq?: OperatorValue;\n $ne?: OperatorValue;\n $gt?: OperatorValue;\n $gte?: OperatorValue;\n $lt?: OperatorValue;\n $lte?: OperatorValue;\n $in?: OperatorValue[];\n $notIn?: OperatorValue[];\n $startsWith?: string;\n $endsWith?: string;\n $contains?: string;\n $regex?: string;\n /** RDF term lexical string operators for STR(?object) pushdown. */\n $strStartsWith?: string;\n $strEndsWith?: string;\n $strContains?: string;\n $strRegex?: string;\n $language?: string;\n $notLanguage?: string;\n $langMatches?: string;\n $datatype?: Term;\n $notDatatype?: Term;\n $termType?: 'iri' | 'blank' | 'literal' | 'numeric';\n $isNull?: boolean;\n}\n\n/**\n * Term 匹配 - Term 精确匹配或操作符匹配\n */\nexport type TermMatch = Term | TermOperators;\n\n/**\n * 判断是否为 Term(而非操作符)\n */\nexport function isTerm(value: TermMatch): value is Term {\n return value !== null && typeof value === 'object' && 'termType' in value;\n}\n\n/**\n * 查询模式\n */\nexport interface QuintPattern {\n subject?: TermMatch;\n predicate?: TermMatch;\n object?: TermMatch;\n graph?: TermMatch;\n}\n\n/**\n * 查询选项\n */\nexport interface QueryOptions {\n limit?: number;\n offset?: number;\n order?: TermName[];\n reverse?: boolean;\n}\n\n/**\n * 复合查询模式 - 多个 pattern 通过 subject 关联\n * 用于多 pattern + FILTER 查询,由数据库内部做 JOIN\n */\nexport interface CompoundPattern {\n /** 多个 pattern,每个 pattern 对应一个三元组匹配 */\n patterns: QuintPattern[];\n /** JOIN 的字段,通常是 subject */\n joinOn: TermName;\n /** 返回哪些字段的值 */\n select?: {\n pattern: number; // pattern 索引\n field: TermName; // 要返回的字段\n alias: string; // 别名\n }[];\n}\n\n/**\n * 存储统计信息\n */\nexport interface StoreStats {\n totalCount: number;\n vectorCount: number;\n graphCount: number;\n databaseBytes?: number;\n tableBytes?: number;\n indexBytes?: number;\n spaceObjects?: StoreSpaceObject[];\n}\n\nexport interface StoreSpaceObject {\n name: string;\n kind: 'table' | 'index' | 'internal' | 'unknown';\n tableName?: string;\n bytes: number;\n pages: number;\n}\n\n/**\n * QuintStore 配置选项\n */\nexport interface QuintStoreOptions {\n debug?: boolean;\n /**\n * Predicate-level RDF object data declarations.\n *\n * This declares schema value types, not query modes. The store derives\n * whether exact/range/prefix/search can be pushed down from the data type.\n */\n predicateObjectDataTypes?: PredicateObjectDataTypes;\n /**\n * Maximum serialized byte length that can be indexed as text.\n * Longer undeclared text literals are stored as longText.\n */\n textMaxBytes?: number;\n}\n\n/**\n * 复合查询结果 - 包含多个 pattern 的绑定值\n */\nexport interface CompoundResult {\n /** JOIN 字段的值 */\n joinValue: string;\n /** 各 pattern 的匹配结果,key 是 alias */\n bindings: Record<string, string>;\n /** 原始 quad 数据(可选,用于获取完整信息) */\n quads?: Quint[];\n}\n\n/**\n * 批量属性查询结果\n * Map<subject, Map<predicate, object[]>>\n */\nexport type AttributeMap = Map<string, Map<string, Term[]>>;\n\n/**\n * QuintStore - 五元组存储抽象基类\n */\nexport abstract class QuintStore {\n // 查询\n abstract get(pattern: QuintPattern, options?: QueryOptions): Promise<Quint[]>;\n abstract match(subject?: Term | null, predicate?: Term | null, object?: Term | null, graph?: Term | null): AsyncIterator<Quint>;\n abstract getByGraphPrefix(prefix: string, options?: QueryOptions): Promise<Quint[]>;\n abstract count(pattern: QuintPattern): Promise<number>;\n \n // 复合查询 - 多 pattern JOIN,由数据库内部执行\n getCompound?(compound: CompoundPattern, options?: QueryOptions): Promise<CompoundResult[]>;\n \n /**\n * 批量获取多个 subject 的多个属性\n * \n * 用于优化 OPTIONAL 查询:先用 WHERE 条件获取 subjects,\n * 然后一次性获取所有属性,避免每个 OPTIONAL 变成一次 LEFT JOIN\n * \n * SQL: SELECT subject, predicate, object FROM quints \n * WHERE subject IN (...) AND predicate IN (...)\n * \n * @param subjects - 要查询的 subject IRIs\n * @param predicates - 要获取的属性 predicate IRIs\n * @param graph - 可选,限定图\n * @returns Map<subject, Map<predicate, object[]>>\n */\n getAttributes?(\n subjects: string[],\n predicates: string[],\n graph?: Term\n ): Promise<AttributeMap>;\n\n // 写入\n abstract put(quint: Quint): Promise<void>;\n abstract multiPut(quints: Quint[]): Promise<void>;\n abstract updateEmbedding(pattern: QuintPattern, embedding: number[]): Promise<number>;\n\n // 删除\n abstract del(pattern: QuintPattern): Promise<number>;\n abstract multiDel(quints: Quint[]): Promise<void>;\n\n // 生命周期\n abstract open(): Promise<void>;\n abstract close(): Promise<void>;\n abstract stats(): Promise<StoreStats>;\n abstract clear(): Promise<void>;\n}\n"]}
@@ -0,0 +1,55 @@
1
+ import type { Rdf3xCardinalityEstimate, Rdf3xIndexStats, Rdf3xJoinOptions, Rdf3xJoinScanResult, Rdf3xRebuildResult, Rdf3xTripleIndexOptions, Rdf3xTriplePattern, Rdf3xTripleScanOptions, Rdf3xTripleScanResult, RdfIndexSpaceObject, RdfQuadJoinPattern } from './types';
2
+ export declare class Rdf3xTripleIndex {
3
+ private readonly options;
4
+ private readonly sqliteRuntime;
5
+ private db;
6
+ private dictionary;
7
+ constructor(options: Rdf3xTripleIndexOptions);
8
+ open(): void;
9
+ close(): void;
10
+ clear(): void;
11
+ rebuildFromCurrentQuads(): Rdf3xRebuildResult;
12
+ scan(pattern: Rdf3xTriplePattern, options?: Rdf3xTripleScanOptions): Rdf3xTripleScanResult;
13
+ joinPatterns(patterns: RdfQuadJoinPattern[], options?: Rdf3xJoinOptions): Rdf3xJoinScanResult;
14
+ estimateCardinality(pattern: Rdf3xTriplePattern): Rdf3xCardinalityEstimate;
15
+ stats(): Rdf3xIndexStats;
16
+ collectSpaceObjects(): RdfIndexSpaceObject[];
17
+ private initializeSchema;
18
+ private clearRdf3xTables;
19
+ private rebuildPairProjection;
20
+ private rebuildTermProjection;
21
+ private compileScanSql;
22
+ private compileJoinPatterns;
23
+ private joinSourceSql;
24
+ private buildJoinOrderClause;
25
+ private buildOrderClause;
26
+ private chooseJoinStart;
27
+ private compareJoinSources;
28
+ private estimateResolvedCardinality;
29
+ private resolveJoinPattern;
30
+ private joinMetrics;
31
+ private joinRowsToBindings;
32
+ private buildPagination;
33
+ private estimateExactTriple;
34
+ private estimatePairProjection;
35
+ private estimateTermProjection;
36
+ private estimateMembershipCardinality;
37
+ private estimateResolvedMembershipCardinality;
38
+ private buildMembershipWhere;
39
+ private pairProjectionFor;
40
+ private resolvePattern;
41
+ private estimateNumericObjectRangeCardinality;
42
+ private resolveNumericObjectRange;
43
+ private numericValueForPattern;
44
+ private choosePermutation;
45
+ private permutation;
46
+ private rowsToQuads;
47
+ private rowCount;
48
+ private collectPageCount;
49
+ private estimateDatabaseBytes;
50
+ private estimateSpaceObjectsFromSchema;
51
+ private estimatePageSize;
52
+ private metrics;
53
+ private requireDb;
54
+ private requireDictionary;
55
+ }