provisa 0.1.0a244__py3-none-any.whl

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 (747) hide show
  1. buenavista/__init__.py +9 -0
  2. buenavista/bv_dialects.py +123 -0
  3. buenavista/core.py +150 -0
  4. buenavista/postgres.py +853 -0
  5. buenavista/rewrite.py +66 -0
  6. provisa/__init__.py +9 -0
  7. provisa/_config/capabilities.yaml +218 -0
  8. provisa/_config/pg_extension_catalog.yaml +106 -0
  9. provisa/_ui/apple-touch-icon.png +0 -0
  10. provisa/_ui/assets/AdminPage-Dqs2DYTv.js +1 -0
  11. provisa/_ui/assets/Alert-olsRF0Jo.js +1 -0
  12. provisa/_ui/assets/Card-z2Bo-A5p.js +1 -0
  13. provisa/_ui/assets/CloseButton-COJkmEJ_.js +5 -0
  14. provisa/_ui/assets/Code-CuWuP1uE.js +1 -0
  15. provisa/_ui/assets/CommandsPage-CGZTC4Jw.js +1 -0
  16. provisa/_ui/assets/ConfirmDialog-CnYI0AfS.js +1 -0
  17. provisa/_ui/assets/CopyButton-DmLBbp5g.js +1 -0
  18. provisa/_ui/assets/DocsPage-CRWTTZLR.js +1 -0
  19. provisa/_ui/assets/DocsPage-DAitv_IW.css +1 -0
  20. provisa/_ui/assets/ErdModal-CPZQ7m-5.js +2 -0
  21. provisa/_ui/assets/FilterInput-DFpPDDtr.js +1 -0
  22. provisa/_ui/assets/GraphPage-6J0lXseA.js +4 -0
  23. provisa/_ui/assets/GraphPage-nK82rD0e.css +1 -0
  24. provisa/_ui/assets/GrpcPage-B1gbbQHK.css +1 -0
  25. provisa/_ui/assets/GrpcPage-DoTbcK4o.js +2 -0
  26. provisa/_ui/assets/Input-BQ7YLH5k.js +1 -0
  27. provisa/_ui/assets/InputBase-D8Jikz1x.js +1 -0
  28. provisa/_ui/assets/JsonApiPage-C3-MZvt3.js +1 -0
  29. provisa/_ui/assets/JsonApiPage-xEeynjaG.css +1 -0
  30. provisa/_ui/assets/List-BFN9Gv0L.js +1 -0
  31. provisa/_ui/assets/LoginPage-D3rUrhhP.js +2 -0
  32. provisa/_ui/assets/Mantine.context-COSAnKfW.js +1 -0
  33. provisa/_ui/assets/McpExplorePage-CKVK-a_A.css +1 -0
  34. provisa/_ui/assets/McpExplorePage-DN-5kwhM.js +569 -0
  35. provisa/_ui/assets/MultiSelect-o1U1Tya2.js +1 -0
  36. provisa/_ui/assets/NlPage-Dncsd506.js +1 -0
  37. provisa/_ui/assets/NumberInput-BcxkyHDO.js +1 -0
  38. provisa/_ui/assets/OpenApiPage-BA2uwVJo.css +1 -0
  39. provisa/_ui/assets/OpenApiPage-BVXBLXML.js +1 -0
  40. provisa/_ui/assets/Pagination-DnHpOlc2.js +1 -0
  41. provisa/_ui/assets/PasswordInput-CHPV3HHV.js +1 -0
  42. provisa/_ui/assets/QueryPage-tMx_5EVY.js +109 -0
  43. provisa/_ui/assets/QueryPage-wFcZ_rSr.css +1 -0
  44. provisa/_ui/assets/Radio-Bi-dGDMv.js +1 -0
  45. provisa/_ui/assets/RelationshipsPage-BNeNG4Qk.js +3 -0
  46. provisa/_ui/assets/RequestsPage-CJSlnIdv.js +1 -0
  47. provisa/_ui/assets/SchemaExplorer-BlUYmbAz.js +20 -0
  48. provisa/_ui/assets/SecurityPage-BO6CfBK8.js +1 -0
  49. provisa/_ui/assets/SegmentedControl-FblIlBwc.js +1 -0
  50. provisa/_ui/assets/Select-SA9iAO1h.js +1 -0
  51. provisa/_ui/assets/SetupPage-Cxoe46vJ.js +1 -0
  52. provisa/_ui/assets/SimpleGrid-BkUQXfli.js +1 -0
  53. provisa/_ui/assets/SourcesPage-DosK9lzy.js +11 -0
  54. provisa/_ui/assets/SqlPage-BD7WXqY8.js +6 -0
  55. provisa/_ui/assets/TablesPage-CGDxNvB1.js +1 -0
  56. provisa/_ui/assets/Tabs-CblK1Rtp.js +1 -0
  57. provisa/_ui/assets/TextInput-D86W-0Nq.js +1 -0
  58. provisa/_ui/assets/Textarea-Dywhas9Y.js +1 -0
  59. provisa/_ui/assets/ViewsPage-D9gGGmHP.js +1 -0
  60. provisa/_ui/assets/actions-5gXnxx2e.js +1 -0
  61. provisa/_ui/assets/admin-BwoS7Ttj.js +1 -0
  62. provisa/_ui/assets/admin-WJWK7W-X.js +2 -0
  63. provisa/_ui/assets/architecture-7EHR7CIX-B1R6OVIb.js +1 -0
  64. provisa/_ui/assets/babel-BvCgDdiU.js +15 -0
  65. provisa/_ui/assets/chevron-right-_50lIoPZ.js +1 -0
  66. provisa/_ui/assets/chevron-up-BfLSdWfo.js +1 -0
  67. provisa/_ui/assets/chevrons-right-UteR6wPJ.js +1 -0
  68. provisa/_ui/assets/circle-alert-Bu1UeVIx.js +1 -0
  69. provisa/_ui/assets/codicon-DCmgc-ay.ttf +0 -0
  70. provisa/_ui/assets/copy-BJSjhFSQ.js +1 -0
  71. provisa/_ui/assets/create-safe-context-Cp0rN64W.js +1 -0
  72. provisa/_ui/assets/cypher-codemirror-COI3VOX7.css +1 -0
  73. provisa/_ui/assets/cypher-codemirror-rzCmupus.js +10 -0
  74. provisa/_ui/assets/dist-BOx43okh.js +1 -0
  75. provisa/_ui/assets/dist-DJ30WIku.js +1 -0
  76. provisa/_ui/assets/download-EO2qj82-.js +1 -0
  77. provisa/_ui/assets/esm-DoY7ccVx.js +15 -0
  78. provisa/_ui/assets/estree-CStc1WiO.js +44 -0
  79. provisa/_ui/assets/eventmodeling-FCH6USID-BPtIDmEK.js +1 -0
  80. provisa/_ui/assets/firebase-BZvYX7DS.js +1 -0
  81. provisa/_ui/assets/get-env-DN1byi3J.js +1 -0
  82. provisa/_ui/assets/get-style-object-BDpgefo6.js +1 -0
  83. provisa/_ui/assets/gitGraph-WXDBUCRP-DaajRYRT.js +1 -0
  84. provisa/_ui/assets/graph-export-C1Qyb8tJ.js +6 -0
  85. provisa/_ui/assets/graphql-8PnP7wdF.js +28 -0
  86. provisa/_ui/assets/graphql-DPd-ryYU.js +28 -0
  87. provisa/_ui/assets/index-Bk-4qilv.js +21 -0
  88. provisa/_ui/assets/index-Ubv-iDeM.css +1 -0
  89. provisa/_ui/assets/info-Db4sqa4U.js +1 -0
  90. provisa/_ui/assets/info-J43DQDTF-DdZDZQFj.js +1 -0
  91. provisa/_ui/assets/katex-C4eR7coU.js +257 -0
  92. provisa/_ui/assets/lib-DJX5c_EK.js +16 -0
  93. provisa/_ui/assets/liveCapability-Buo2q2KH.js +1 -0
  94. provisa/_ui/assets/maximize-2-BjEM81oc.js +1 -0
  95. provisa/_ui/assets/naming-D2W_TDLo.js +1 -0
  96. provisa/_ui/assets/packet-YPE3B663-D_8FMH56.js +1 -0
  97. provisa/_ui/assets/pencil-BKoqPyRv.js +1 -0
  98. provisa/_ui/assets/pie-LRSECV5Y-B3u8ZO9o.js +1 -0
  99. provisa/_ui/assets/play-DZgTbsd-.js +1 -0
  100. provisa/_ui/assets/plus-BZ8PGQwK.js +1 -0
  101. provisa/_ui/assets/radar-GUYGQ44K-B57pEu02.js +1 -0
  102. provisa/_ui/assets/rolldown-runtime-CMxvf4Kt.js +1 -0
  103. provisa/_ui/assets/sparkles-DxXOJOVI.js +1 -0
  104. provisa/_ui/assets/standalone-BvaX2kS-.js +29 -0
  105. provisa/_ui/assets/table-2-BwuZElBq.js +1 -0
  106. provisa/_ui/assets/trash-2-DK4I8-td.js +1 -0
  107. provisa/_ui/assets/treeView-BLDUP644-D2lP5nmA.js +1 -0
  108. provisa/_ui/assets/treemap-LRROVOQU-V5HaemcZ.js +1 -0
  109. provisa/_ui/assets/use-media-query-B79wNZr6.js +1 -0
  110. provisa/_ui/assets/use-merged-ref-WrlFclhU.js +1 -0
  111. provisa/_ui/assets/use-reduced-motion-CwaZt4K5.js +1 -0
  112. provisa/_ui/assets/useAdminQueries-DmD_MMVD.js +543 -0
  113. provisa/_ui/assets/vendor-apollo-uTC-SxVA.js +158 -0
  114. provisa/_ui/assets/vendor-cytoscape-DzheRRTy.js +349 -0
  115. provisa/_ui/assets/vendor-firebase-Bne7jdsa.js +1 -0
  116. provisa/_ui/assets/vendor-mermaid-DYlES3LV.js +2772 -0
  117. provisa/_ui/assets/vendor-monaco-B12TyRWl.css +1 -0
  118. provisa/_ui/assets/vendor-monaco-B_j1bxCw.js +1064 -0
  119. provisa/_ui/assets/vendor-mui-C2_0bhe-.js +1 -0
  120. provisa/_ui/assets/vendor-react-m9IIiB39.js +72 -0
  121. provisa/_ui/assets/wardley-L42UT6IY-bBVX-Ej4.js +1 -0
  122. provisa/_ui/assets/x-B488js0C.js +1 -0
  123. provisa/_ui/favicon.ico +0 -0
  124. provisa/_ui/favicon.svg +10 -0
  125. provisa/_ui/guides-md/admin.md +187 -0
  126. provisa/_ui/guides-md/api-reference.md +825 -0
  127. provisa/_ui/guides-md/architecture.md +656 -0
  128. provisa/_ui/guides-md/configuration.md +845 -0
  129. provisa/_ui/guides-md/cypher.md +234 -0
  130. provisa/_ui/guides-md/deployment.md +804 -0
  131. provisa/_ui/guides-md/images/bolt-neo4j-browser.png +0 -0
  132. provisa/_ui/guides-md/images/data-sources.png +0 -0
  133. provisa/_ui/guides-md/images/graph-view.png +0 -0
  134. provisa/_ui/guides-md/images/natural-language.png +0 -0
  135. provisa/_ui/guides-md/images/pgwire-datagrip.png +0 -0
  136. provisa/_ui/guides-md/images/query-explorer.png +0 -0
  137. provisa/_ui/guides-md/images/relationships.png +0 -0
  138. provisa/_ui/guides-md/images/schema-voyager.png +0 -0
  139. provisa/_ui/guides-md/images/security-roles.png +0 -0
  140. provisa/_ui/guides-md/images/table-registration.png +0 -0
  141. provisa/_ui/guides-md/import.md +115 -0
  142. provisa/_ui/guides-md/integrations.md +239 -0
  143. provisa/_ui/guides-md/manifest.json +82 -0
  144. provisa/_ui/guides-md/multitenant.md +350 -0
  145. provisa/_ui/guides-md/pgwire.md +196 -0
  146. provisa/_ui/guides-md/python-client.md +260 -0
  147. provisa/_ui/guides-md/quickstart.md +160 -0
  148. provisa/_ui/guides-md/readme.md +364 -0
  149. provisa/_ui/guides-md/security.md +315 -0
  150. provisa/_ui/guides-md/sources.md +722 -0
  151. provisa/_ui/guides-md/subscriptions.md +179 -0
  152. provisa/_ui/icon-192.png +0 -0
  153. provisa/_ui/icon-512.png +0 -0
  154. provisa/_ui/icon.svg +10 -0
  155. provisa/_ui/icons.svg +24 -0
  156. provisa/_ui/index.html +294 -0
  157. provisa/_ui/monacoeditorwork/editor.worker.bundle.js +13516 -0
  158. provisa/_ui/monacoeditorwork/graphql.worker.bundle.js +32447 -0
  159. provisa/_ui/monacoeditorwork/json.worker.bundle.js +21317 -0
  160. provisa/_ui/site.webmanifest +11 -0
  161. provisa/_ui/voyager/react-dom.production.min.js +277 -0
  162. provisa/_ui/voyager/react.production.min.js +41 -0
  163. provisa/_ui/voyager/voyager.css +697 -0
  164. provisa/_ui/voyager/voyager.standalone.js +1762 -0
  165. provisa/api/__init__.py +9 -0
  166. provisa/api/_meta_seed.py +313 -0
  167. provisa/api/_meta_views.py +115 -0
  168. provisa/api/_query_helpers.py +140 -0
  169. provisa/api/admin/__init__.py +11 -0
  170. provisa/api/admin/_config_io.py +34 -0
  171. provisa/api/admin/_dev_shared.py +38 -0
  172. provisa/api/admin/_guards.py +27 -0
  173. provisa/api/admin/_live_mappers.py +84 -0
  174. provisa/api/admin/_row_mappers.py +204 -0
  175. provisa/api/admin/_table_ops.py +201 -0
  176. provisa/api/admin/actions_router.py +575 -0
  177. provisa/api/admin/ai_models_router.py +102 -0
  178. provisa/api/admin/api_discovery.py +148 -0
  179. provisa/api/admin/capabilities.py +113 -0
  180. provisa/api/admin/config_export.py +246 -0
  181. provisa/api/admin/crawl_router.py +69 -0
  182. provisa/api/admin/creation_requests_router.py +290 -0
  183. provisa/api/admin/db_queries.py +181 -0
  184. provisa/api/admin/dev_queries.py +522 -0
  185. provisa/api/admin/discovery.py +158 -0
  186. provisa/api/admin/discovery_resilience.py +47 -0
  187. provisa/api/admin/discovery_schema.py +281 -0
  188. provisa/api/admin/graphql_remote_router.py +373 -0
  189. provisa/api/admin/grpc_remote_router.py +426 -0
  190. provisa/api/admin/introspect.py +664 -0
  191. provisa/api/admin/invites_router.py +119 -0
  192. provisa/api/admin/local_users_router.py +242 -0
  193. provisa/api/admin/neo4j_router.py +155 -0
  194. provisa/api/admin/openapi_router.py +330 -0
  195. provisa/api/admin/orgs_router.py +209 -0
  196. provisa/api/admin/roles_router.py +132 -0
  197. provisa/api/admin/schema.py +41 -0
  198. provisa/api/admin/schema_common.py +388 -0
  199. provisa/api/admin/schema_helpers.py +454 -0
  200. provisa/api/admin/schema_mutation.py +1089 -0
  201. provisa/api/admin/schema_mutation_ops.py +459 -0
  202. provisa/api/admin/schema_query.py +834 -0
  203. provisa/api/admin/security_router.py +57 -0
  204. provisa/api/admin/settings_router.py +1057 -0
  205. provisa/api/admin/source_meta_router.py +126 -0
  206. provisa/api/admin/sparql_router.py +128 -0
  207. provisa/api/admin/system_health.py +119 -0
  208. provisa/api/admin/table_profile_router.py +104 -0
  209. provisa/api/admin/table_search_router.py +138 -0
  210. provisa/api/admin/types.py +524 -0
  211. provisa/api/airport/__init__.py +16 -0
  212. provisa/api/airport/pushdown.py +248 -0
  213. provisa/api/airport/query.py +157 -0
  214. provisa/api/airport/server.py +1038 -0
  215. provisa/api/airport/service.py +47 -0
  216. provisa/api/airport/transactions.py +62 -0
  217. provisa/api/airport/wire.py +207 -0
  218. provisa/api/app.py +1038 -0
  219. provisa/api/app_loaders.py +979 -0
  220. provisa/api/app_rebuild.py +198 -0
  221. provisa/api/app_schema_build.py +277 -0
  222. provisa/api/app_startup.py +676 -0
  223. provisa/api/auth_router.py +248 -0
  224. provisa/api/billing/__init__.py +4 -0
  225. provisa/api/billing/kms.py +70 -0
  226. provisa/api/billing/lemonsqueezy_client.py +80 -0
  227. provisa/api/billing/models.py +45 -0
  228. provisa/api/billing/router.py +148 -0
  229. provisa/api/billing/tenant_db.py +152 -0
  230. provisa/api/data/__init__.py +9 -0
  231. provisa/api/data/action_exec.py +40 -0
  232. provisa/api/data/encrypted_directive.py +58 -0
  233. provisa/api/data/endpoint.py +910 -0
  234. provisa/api/data/endpoint_dev.py +908 -0
  235. provisa/api/data/endpoint_executors.py +907 -0
  236. provisa/api/data/endpoint_grpc_proxy.py +136 -0
  237. provisa/api/data/endpoint_helpers.py +432 -0
  238. provisa/api/data/federation.py +185 -0
  239. provisa/api/data/hydration.py +297 -0
  240. provisa/api/data/materialization.py +683 -0
  241. provisa/api/data/mutations.py +416 -0
  242. provisa/api/data/redirect_unwrap.py +70 -0
  243. provisa/api/data/sdl.py +247 -0
  244. provisa/api/data/subscribe.py +581 -0
  245. provisa/api/data/subscription_sse.py +458 -0
  246. provisa/api/flight/__init__.py +11 -0
  247. provisa/api/flight/catalog.py +266 -0
  248. provisa/api/flight/server.py +622 -0
  249. provisa/api/jsonapi/__init__.py +11 -0
  250. provisa/api/jsonapi/errors.py +46 -0
  251. provisa/api/jsonapi/generator.py +513 -0
  252. provisa/api/jsonapi/pagination.py +92 -0
  253. provisa/api/jsonapi/serializer.py +128 -0
  254. provisa/api/jsonapi/spec.py +260 -0
  255. provisa/api/mcp/__init__.py +26 -0
  256. provisa/api/mcp/chat.py +211 -0
  257. provisa/api/mcp/search.py +206 -0
  258. provisa/api/mcp/server.py +207 -0
  259. provisa/api/mcp/status.py +199 -0
  260. provisa/api/mcp/tls.py +220 -0
  261. provisa/api/mcp/tools.py +438 -0
  262. provisa/api/middleware/__init__.py +9 -0
  263. provisa/api/middleware/rate_limit_middleware.py +62 -0
  264. provisa/api/middleware/tenant_middleware.py +95 -0
  265. provisa/api/otel_setup.py +473 -0
  266. provisa/api/rate_limit.py +124 -0
  267. provisa/api/rest/__init__.py +11 -0
  268. provisa/api/rest/cypher_exec.py +491 -0
  269. provisa/api/rest/cypher_router.py +875 -0
  270. provisa/api/rest/generator.py +322 -0
  271. provisa/api/rest/graph_tools_router.py +258 -0
  272. provisa/api/rest/neo4j_compat_router.py +233 -0
  273. provisa/api/rest/nl_router.py +150 -0
  274. provisa/api/rest/openapi_spec.py +532 -0
  275. provisa/api/rest/registered_call.py +170 -0
  276. provisa/api/setup_router.py +223 -0
  277. provisa/api/startup_resilience.py +62 -0
  278. provisa/api/startup_seed.py +611 -0
  279. provisa/api/tenant_helpers.py +40 -0
  280. provisa/api/trino_setup.py +193 -0
  281. provisa/api_source/__init__.py +9 -0
  282. provisa/api_source/cache.py +33 -0
  283. provisa/api_source/caller.py +431 -0
  284. provisa/api_source/candidates.py +181 -0
  285. provisa/api_source/engine_cache.py +423 -0
  286. provisa/api_source/flattener.py +111 -0
  287. provisa/api_source/introspect.py +306 -0
  288. provisa/api_source/loader.py +150 -0
  289. provisa/api_source/models.py +118 -0
  290. provisa/api_source/normalizers.py +252 -0
  291. provisa/api_source/promotions.py +91 -0
  292. provisa/api_source/router_integration.py +136 -0
  293. provisa/api_source/schema_integration.py +153 -0
  294. provisa/api_source/transforms.py +46 -0
  295. provisa/apq/__init__.py +20 -0
  296. provisa/apq/cache.py +124 -0
  297. provisa/audit/__init__.py +35 -0
  298. provisa/audit/compliance_reporter.py +98 -0
  299. provisa/audit/query_log.py +136 -0
  300. provisa/audit/sla_monitor.py +115 -0
  301. provisa/auth/__init__.py +9 -0
  302. provisa/auth/approval.proto +30 -0
  303. provisa/auth/approval_hook.py +327 -0
  304. provisa/auth/approval_pb2.py +55 -0
  305. provisa/auth/approval_pb2_grpc.py +113 -0
  306. provisa/auth/middleware.py +279 -0
  307. provisa/auth/models.py +58 -0
  308. provisa/auth/providers/__init__.py +9 -0
  309. provisa/auth/providers/basic.py +73 -0
  310. provisa/auth/providers/firebase.py +63 -0
  311. provisa/auth/providers/keycloak.py +74 -0
  312. provisa/auth/providers/oauth.py +80 -0
  313. provisa/auth/providers/simple.py +86 -0
  314. provisa/auth/role_mapping.py +70 -0
  315. provisa/auth/superuser.py +59 -0
  316. provisa/auth/wiring.py +195 -0
  317. provisa/bolt/__init__.py +20 -0
  318. provisa/bolt/framing.py +52 -0
  319. provisa/bolt/messages.py +82 -0
  320. provisa/bolt/packstream.py +456 -0
  321. provisa/bolt/server.py +218 -0
  322. provisa/bolt/session.py +824 -0
  323. provisa/bolt/websocket.py +250 -0
  324. provisa/cache/__init__.py +24 -0
  325. provisa/cache/hot_tables.py +790 -0
  326. provisa/cache/key.py +103 -0
  327. provisa/cache/middleware.py +70 -0
  328. provisa/cache/policy.py +76 -0
  329. provisa/cache/store.py +283 -0
  330. provisa/cache/warm_tables.py +181 -0
  331. provisa/cassandra/__init__.py +11 -0
  332. provisa/cassandra/source.py +149 -0
  333. provisa/cli.py +110 -0
  334. provisa/compiler/__init__.py +9 -0
  335. provisa/compiler/actions_schema.py +251 -0
  336. provisa/compiler/aggregate_gen.py +259 -0
  337. provisa/compiler/aggregates.py +622 -0
  338. provisa/compiler/context.py +380 -0
  339. provisa/compiler/cte_utils.py +29 -0
  340. provisa/compiler/cursor.py +206 -0
  341. provisa/compiler/directives.py +368 -0
  342. provisa/compiler/enum_detect.py +178 -0
  343. provisa/compiler/federation.py +263 -0
  344. provisa/compiler/function_gen.py +170 -0
  345. provisa/compiler/hints.py +180 -0
  346. provisa/compiler/introspect.py +279 -0
  347. provisa/compiler/mask_inject.py +188 -0
  348. provisa/compiler/mutation_gen.py +401 -0
  349. provisa/compiler/naming.py +351 -0
  350. provisa/compiler/nf_extractor.py +251 -0
  351. provisa/compiler/normalize.py +248 -0
  352. provisa/compiler/order_by_gen.py +41 -0
  353. provisa/compiler/params.py +119 -0
  354. provisa/compiler/parser.py +112 -0
  355. provisa/compiler/rls.py +182 -0
  356. provisa/compiler/sampling.py +52 -0
  357. provisa/compiler/schema_directives.py +224 -0
  358. provisa/compiler/schema_gen.py +869 -0
  359. provisa/compiler/schema_inputs.py +290 -0
  360. provisa/compiler/schema_service.py +87 -0
  361. provisa/compiler/schema_types.py +78 -0
  362. provisa/compiler/sql_gen.py +794 -0
  363. provisa/compiler/sql_rewrite.py +316 -0
  364. provisa/compiler/sql_selection.py +684 -0
  365. provisa/compiler/sql_types.py +180 -0
  366. provisa/compiler/sql_validator.py +549 -0
  367. provisa/compiler/sql_where.py +307 -0
  368. provisa/compiler/stage1.py +32 -0
  369. provisa/compiler/stage2.py +582 -0
  370. provisa/compiler/type_map.py +243 -0
  371. provisa/compiler/view_expand.py +94 -0
  372. provisa/control_plane/__init__.py +11 -0
  373. provisa/control_plane/models.py +30 -0
  374. provisa/control_plane/router.py +117 -0
  375. provisa/control_plane/store.py +46 -0
  376. provisa/core/__init__.py +9 -0
  377. provisa/core/auth_models.py +304 -0
  378. provisa/core/catalog.py +210 -0
  379. provisa/core/change_signal.py +118 -0
  380. provisa/core/config_loader.py +983 -0
  381. provisa/core/control_plane.py +36 -0
  382. provisa/core/control_plane_pg.py +87 -0
  383. provisa/core/database.py +914 -0
  384. provisa/core/db.py +167 -0
  385. provisa/core/desktop_profile.py +217 -0
  386. provisa/core/domain_policy.py +108 -0
  387. provisa/core/duckdb_async.py +358 -0
  388. provisa/core/ir_types.py +233 -0
  389. provisa/core/meta_rls.py +136 -0
  390. provisa/core/models.py +1080 -0
  391. provisa/core/org_provisioning.py +165 -0
  392. provisa/core/redis_factory.py +61 -0
  393. provisa/core/repositories/__init__.py +9 -0
  394. provisa/core/repositories/creation_request.py +146 -0
  395. provisa/core/repositories/domain.py +53 -0
  396. provisa/core/repositories/function.py +223 -0
  397. provisa/core/repositories/relationship.py +202 -0
  398. provisa/core/repositories/rls.py +106 -0
  399. provisa/core/repositories/role.py +52 -0
  400. provisa/core/repositories/source.py +81 -0
  401. provisa/core/repositories/table.py +239 -0
  402. provisa/core/schema.sql +606 -0
  403. provisa/core/schema_admin.py +168 -0
  404. provisa/core/schema_org.py +737 -0
  405. provisa/core/secrets.py +80 -0
  406. provisa/core/source_registry.py +59 -0
  407. provisa/core/tenant_context.py +55 -0
  408. provisa/core/trino_catalog_files.py +348 -0
  409. provisa/cypher/__init__.py +11 -0
  410. provisa/cypher/assembler.py +478 -0
  411. provisa/cypher/comprehension.py +277 -0
  412. provisa/cypher/correlated_call.py +110 -0
  413. provisa/cypher/expr_ast.py +247 -0
  414. provisa/cypher/expr_context.py +421 -0
  415. provisa/cypher/expr_parser.py +463 -0
  416. provisa/cypher/expr_visitor.py +302 -0
  417. provisa/cypher/graph_rewriter.py +304 -0
  418. provisa/cypher/graph_types.py +88 -0
  419. provisa/cypher/group_by.py +60 -0
  420. provisa/cypher/label_map.py +678 -0
  421. provisa/cypher/map_projection.py +90 -0
  422. provisa/cypher/params.py +71 -0
  423. provisa/cypher/parser.py +880 -0
  424. provisa/cypher/path_functions.py +719 -0
  425. provisa/cypher/path_translator.py +178 -0
  426. provisa/cypher/select_builder.py +629 -0
  427. provisa/cypher/sql_to_cypher.py +764 -0
  428. provisa/cypher/sql_to_cypher_agg.py +492 -0
  429. provisa/cypher/sql_to_cypher_helpers.py +85 -0
  430. provisa/cypher/translator.py +876 -0
  431. provisa/cypher/translator_helpers.py +452 -0
  432. provisa/cypher/translator_rel.py +576 -0
  433. provisa/cypher/translator_types.py +34 -0
  434. provisa/cypher/translator_union.py +324 -0
  435. provisa/cypher/write_translator.py +422 -0
  436. provisa/ddn/__init__.py +17 -0
  437. provisa/ddn/__main__.py +20 -0
  438. provisa/ddn/cli.py +172 -0
  439. provisa/ddn/mapper.py +580 -0
  440. provisa/ddn/models.py +166 -0
  441. provisa/ddn/parser.py +496 -0
  442. provisa/discovery/__init__.py +9 -0
  443. provisa/discovery/analyzer.py +141 -0
  444. provisa/discovery/candidates.py +147 -0
  445. provisa/discovery/catalog_cache.py +239 -0
  446. provisa/discovery/collector.py +267 -0
  447. provisa/discovery/column_inference.py +40 -0
  448. provisa/discovery/fk_introspect.py +462 -0
  449. provisa/discovery/prompt.py +95 -0
  450. provisa/discovery/table_search.py +192 -0
  451. provisa/elasticsearch/__init__.py +11 -0
  452. provisa/elasticsearch/source.py +236 -0
  453. provisa/encryption/__init__.py +51 -0
  454. provisa/encryption/envelope.py +118 -0
  455. provisa/encryption/factory.py +52 -0
  456. provisa/encryption/providers.py +252 -0
  457. provisa/encryption/registry.py +311 -0
  458. provisa/encryption/runtime.py +55 -0
  459. provisa/encryption/service.py +52 -0
  460. provisa/events/__init__.py +11 -0
  461. provisa/events/app_wiring.py +313 -0
  462. provisa/events/boot.py +415 -0
  463. provisa/events/calendars.py +299 -0
  464. provisa/events/content_hash.py +77 -0
  465. provisa/events/deadlines.py +176 -0
  466. provisa/events/freshness_contract.py +75 -0
  467. provisa/events/handlers.py +282 -0
  468. provisa/events/injector.py +123 -0
  469. provisa/events/lineage.py +215 -0
  470. provisa/events/outcomes.py +95 -0
  471. provisa/events/probes.py +179 -0
  472. provisa/events/processor.py +543 -0
  473. provisa/events/queue.py +267 -0
  474. provisa/events/snapshots.py +128 -0
  475. provisa/events/source_loader.py +190 -0
  476. provisa/events/supervisor.py +74 -0
  477. provisa/events/triggers.py +286 -0
  478. provisa/executor/__init__.py +9 -0
  479. provisa/executor/ctas.py +375 -0
  480. provisa/executor/direct.py +117 -0
  481. provisa/executor/drivers/__init__.py +11 -0
  482. provisa/executor/drivers/base.py +61 -0
  483. provisa/executor/drivers/bigquery.py +95 -0
  484. provisa/executor/drivers/clickhouse.py +81 -0
  485. provisa/executor/drivers/databricks.py +87 -0
  486. provisa/executor/drivers/duckdb_driver.py +67 -0
  487. provisa/executor/drivers/mssql_warehouse.py +114 -0
  488. provisa/executor/drivers/mysql.py +71 -0
  489. provisa/executor/drivers/oracle.py +70 -0
  490. provisa/executor/drivers/postgresql.py +133 -0
  491. provisa/executor/drivers/registry.py +193 -0
  492. provisa/executor/drivers/snowflake.py +86 -0
  493. provisa/executor/drivers/sqlalchemy_driver.py +117 -0
  494. provisa/executor/drivers/sqlserver.py +78 -0
  495. provisa/executor/errors.py +53 -0
  496. provisa/executor/formats/__init__.py +11 -0
  497. provisa/executor/formats/arrow.py +66 -0
  498. provisa/executor/formats/ndjson.py +48 -0
  499. provisa/executor/formats/tabular.py +125 -0
  500. provisa/executor/function_dispatch.py +310 -0
  501. provisa/executor/pool.py +139 -0
  502. provisa/executor/redirect.py +446 -0
  503. provisa/executor/result.py +29 -0
  504. provisa/executor/serialize.py +648 -0
  505. provisa/executor/stats.py +100 -0
  506. provisa/executor/trino.py +270 -0
  507. provisa/executor/trino_flight.py +169 -0
  508. provisa/executor/trino_write.py +113 -0
  509. provisa/executor/writable.py +118 -0
  510. provisa/federation/__init__.py +2 -0
  511. provisa/federation/backend.py +587 -0
  512. provisa/federation/bigquery_backend.py +34 -0
  513. provisa/federation/bigquery_connectors.py +113 -0
  514. provisa/federation/bigquery_runtime.py +234 -0
  515. provisa/federation/cardinality.py +85 -0
  516. provisa/federation/clickhouse_backend.py +46 -0
  517. provisa/federation/clickhouse_connectors.py +227 -0
  518. provisa/federation/clickhouse_runtime.py +403 -0
  519. provisa/federation/conformance.py +102 -0
  520. provisa/federation/connector.py +55 -0
  521. provisa/federation/connector_base.py +199 -0
  522. provisa/federation/connector_duckdb.py +729 -0
  523. provisa/federation/databricks_backend.py +37 -0
  524. provisa/federation/databricks_connectors.py +92 -0
  525. provisa/federation/databricks_runtime.py +268 -0
  526. provisa/federation/databricks_store.py +334 -0
  527. provisa/federation/databricks_tls.py +34 -0
  528. provisa/federation/databricks_uc.py +169 -0
  529. provisa/federation/delta.py +79 -0
  530. provisa/federation/duckdb_backend.py +34 -0
  531. provisa/federation/duckdb_extensions.py +106 -0
  532. provisa/federation/duckdb_runtime.py +372 -0
  533. provisa/federation/engine.py +1222 -0
  534. provisa/federation/fabric_shortcuts.py +184 -0
  535. provisa/federation/fdw_artifact_catalog.py +218 -0
  536. provisa/federation/freshness_gate.py +86 -0
  537. provisa/federation/materialization.py +107 -0
  538. provisa/federation/materialize_exec.py +240 -0
  539. provisa/federation/mssql_warehouse_backend.py +52 -0
  540. provisa/federation/mssql_warehouse_connectors.py +76 -0
  541. provisa/federation/mssql_warehouse_runtime.py +280 -0
  542. provisa/federation/native_backend.py +305 -0
  543. provisa/federation/pg_backend.py +50 -0
  544. provisa/federation/pg_runtime.py +109 -0
  545. provisa/federation/pgwire_replica.py +494 -0
  546. provisa/federation/plan.py +190 -0
  547. provisa/federation/promote.py +142 -0
  548. provisa/federation/read_through.py +70 -0
  549. provisa/federation/residency.py +145 -0
  550. provisa/federation/runtime.py +316 -0
  551. provisa/federation/runtime_support.py +49 -0
  552. provisa/federation/snowflake_backend.py +37 -0
  553. provisa/federation/snowflake_connectors.py +134 -0
  554. provisa/federation/snowflake_runtime.py +157 -0
  555. provisa/federation/sqlalchemy_backend.py +32 -0
  556. provisa/federation/sqlalchemy_runtime.py +71 -0
  557. provisa/federation/store_connection.py +130 -0
  558. provisa/federation/store_writer.py +319 -0
  559. provisa/federation/strategy.py +165 -0
  560. provisa/federation/trino_connectors.py +544 -0
  561. provisa/federation/trino_lifecycle.py +320 -0
  562. provisa/file_source/__init__.py +9 -0
  563. provisa/file_source/crawler.py +226 -0
  564. provisa/file_source/pg_migrate.py +171 -0
  565. provisa/file_source/source.py +333 -0
  566. provisa/freshness/__init__.py +52 -0
  567. provisa/freshness/adapters.py +53 -0
  568. provisa/freshness/decision.py +52 -0
  569. provisa/freshness/predicate.py +135 -0
  570. provisa/freshness/producer.py +78 -0
  571. provisa/freshness/source_gate.py +99 -0
  572. provisa/freshness/subject.py +63 -0
  573. provisa/google_sheets/__init__.py +11 -0
  574. provisa/google_sheets/source.py +68 -0
  575. provisa/govdata/__init__.py +9 -0
  576. provisa/govdata/schema_import.py +199 -0
  577. provisa/govdata/source.py +145 -0
  578. provisa/govdata/subjects.py +46 -0
  579. provisa/govdata/subscription.py +65 -0
  580. provisa/graphql_remote/__init__.py +9 -0
  581. provisa/graphql_remote/executor.py +117 -0
  582. provisa/graphql_remote/introspect.py +66 -0
  583. provisa/graphql_remote/mapper.py +589 -0
  584. provisa/grpc/__init__.py +9 -0
  585. provisa/grpc/proto_gen.py +243 -0
  586. provisa/grpc/query_ir.py +38 -0
  587. provisa/grpc/reflection.py +32 -0
  588. provisa/grpc/schema_gen.py +67 -0
  589. provisa/grpc/server.py +214 -0
  590. provisa/grpc_remote/__init__.py +9 -0
  591. provisa/grpc_remote/executor.py +151 -0
  592. provisa/grpc_remote/loader.py +239 -0
  593. provisa/grpc_remote/mapper.py +238 -0
  594. provisa/hasura_v2/__init__.py +17 -0
  595. provisa/hasura_v2/__main__.py +18 -0
  596. provisa/hasura_v2/cli.py +168 -0
  597. provisa/hasura_v2/mapper.py +608 -0
  598. provisa/hasura_v2/models.py +139 -0
  599. provisa/hasura_v2/parser.py +383 -0
  600. provisa/import_shared/__init__.py +12 -0
  601. provisa/import_shared/filters.py +157 -0
  602. provisa/import_shared/warnings.py +55 -0
  603. provisa/ingest/__init__.py +11 -0
  604. provisa/ingest/ddl.py +99 -0
  605. provisa/ingest/engine.py +90 -0
  606. provisa/ingest/provider.py +80 -0
  607. provisa/ingest/router.py +117 -0
  608. provisa/kafka/__init__.py +11 -0
  609. provisa/kafka/change_events.py +99 -0
  610. provisa/kafka/schema_registry.py +176 -0
  611. provisa/kafka/sink.py +146 -0
  612. provisa/kafka/sink_executor.py +94 -0
  613. provisa/kafka/source.py +297 -0
  614. provisa/kafka/window.py +134 -0
  615. provisa/lineage/__init__.py +33 -0
  616. provisa/lineage/columns.py +80 -0
  617. provisa/lineage/versions.py +86 -0
  618. provisa/live/__init__.py +15 -0
  619. provisa/live/engine.py +387 -0
  620. provisa/live/outputs/__init__.py +11 -0
  621. provisa/live/outputs/base.py +29 -0
  622. provisa/live/outputs/kafka.py +71 -0
  623. provisa/live/outputs/sse.py +93 -0
  624. provisa/live/reconcile.py +83 -0
  625. provisa/live/watermark.py +76 -0
  626. provisa/llm/__init__.py +5 -0
  627. provisa/llm/client.py +151 -0
  628. provisa/mongodb/__init__.py +11 -0
  629. provisa/mongodb/source.py +152 -0
  630. provisa/mv/__init__.py +15 -0
  631. provisa/mv/aggregate_catalog.py +210 -0
  632. provisa/mv/coordination.py +214 -0
  633. provisa/mv/delta.py +248 -0
  634. provisa/mv/determinism.py +97 -0
  635. provisa/mv/input_signals.py +122 -0
  636. provisa/mv/models.py +175 -0
  637. provisa/mv/refresh.py +522 -0
  638. provisa/mv/registry.py +131 -0
  639. provisa/mv/rewriter.py +352 -0
  640. provisa/mv/schema.sql +62 -0
  641. provisa/neo4j/__init__.py +11 -0
  642. provisa/neo4j/preview.py +104 -0
  643. provisa/neo4j/source.py +120 -0
  644. provisa/nl/__init__.py +12 -0
  645. provisa/nl/executor.py +206 -0
  646. provisa/nl/job.py +182 -0
  647. provisa/nl/loop.py +162 -0
  648. provisa/nl/prompt.py +114 -0
  649. provisa/nl/runner.py +320 -0
  650. provisa/nl/schema_matcher.py +274 -0
  651. provisa/observability/__init__.py +7 -0
  652. provisa/observability/ops_schema.py +173 -0
  653. provisa/observability/ops_trino.py +152 -0
  654. provisa/observability/otlp2sql.py +360 -0
  655. provisa/observability/stage_trace.py +100 -0
  656. provisa/observability/telemetry_pg.py +61 -0
  657. provisa/openapi/__init__.py +9 -0
  658. provisa/openapi/loader.py +58 -0
  659. provisa/openapi/mapper.py +259 -0
  660. provisa/openapi/pg_cache.py +394 -0
  661. provisa/openapi/register.py +321 -0
  662. provisa/otel_compat.py +221 -0
  663. provisa/pg_extensions/__init__.py +33 -0
  664. provisa/pg_extensions/catalog.py +277 -0
  665. provisa/pgwire/__init__.py +9 -0
  666. provisa/pgwire/_pipeline.py +533 -0
  667. provisa/pgwire/catalog.py +331 -0
  668. provisa/pgwire/catalog_columns_data.py +840 -0
  669. provisa/pgwire/catalog_constraints.py +502 -0
  670. provisa/pgwire/catalog_data.py +459 -0
  671. provisa/pgwire/catalog_populate.py +883 -0
  672. provisa/pgwire/catalog_rewrite.py +351 -0
  673. provisa/pgwire/copy_binary.py +112 -0
  674. provisa/pgwire/copy_handler.py +455 -0
  675. provisa/pgwire/ddl_handler.py +254 -0
  676. provisa/pgwire/ext_surfaces.py +305 -0
  677. provisa/pgwire/function_call.py +88 -0
  678. provisa/pgwire/function_catalog.py +104 -0
  679. provisa/pgwire/server.py +676 -0
  680. provisa/pgwire/system_tables.py +205 -0
  681. provisa/prometheus/__init__.py +11 -0
  682. provisa/prometheus/source.py +115 -0
  683. provisa/redis/__init__.py +11 -0
  684. provisa/redis/source.py +136 -0
  685. provisa/runtime_deps/__init__.py +44 -0
  686. provisa/runtime_deps/pgwire_bundles.py +161 -0
  687. provisa/scheduler/__init__.py +5 -0
  688. provisa/scheduler/jobs.py +534 -0
  689. provisa/scheduler/templating.py +49 -0
  690. provisa/schema_clusters.py +37 -0
  691. provisa/security/__init__.py +11 -0
  692. provisa/security/association_suggester.py +246 -0
  693. provisa/security/high_security.py +107 -0
  694. provisa/security/masking.py +278 -0
  695. provisa/security/mutation_authz.py +156 -0
  696. provisa/security/rights.py +100 -0
  697. provisa/security/visibility.py +56 -0
  698. provisa/source_adapters/__init__.py +11 -0
  699. provisa/source_adapters/grpc_remote_adapter.py +97 -0
  700. provisa/source_adapters/openapi_adapter.py +127 -0
  701. provisa/source_adapters/registry.py +69 -0
  702. provisa/sources/__init__.py +3 -0
  703. provisa/sources/counts.py +43 -0
  704. provisa/sources/gql.py +26 -0
  705. provisa/sparql/__init__.py +11 -0
  706. provisa/sparql/source.py +163 -0
  707. provisa/subscriptions/__init__.py +16 -0
  708. provisa/subscriptions/base.py +47 -0
  709. provisa/subscriptions/cdc_landing.py +62 -0
  710. provisa/subscriptions/debezium_provider.py +257 -0
  711. provisa/subscriptions/govdata_provider.py +162 -0
  712. provisa/subscriptions/kafka_provider.py +110 -0
  713. provisa/subscriptions/mongo_provider.py +84 -0
  714. provisa/subscriptions/pg_provider.py +131 -0
  715. provisa/subscriptions/pg_triggers.py +82 -0
  716. provisa/subscriptions/polling_provider.py +82 -0
  717. provisa/subscriptions/registry.py +163 -0
  718. provisa/subscriptions/rss_provider.py +230 -0
  719. provisa/subscriptions/trino_polling_provider.py +137 -0
  720. provisa/subscriptions/websocket_provider.py +143 -0
  721. provisa/tools/__init__.py +9 -0
  722. provisa/tools/req_schema.py +194 -0
  723. provisa/transpiler/__init__.py +9 -0
  724. provisa/transpiler/router.py +241 -0
  725. provisa/transpiler/transpile.py +182 -0
  726. provisa/transpiler/transpile_correlated.py +970 -0
  727. provisa/ui_server.py +141 -0
  728. provisa/vector/__init__.py +11 -0
  729. provisa/vector/cache_invalidation.py +71 -0
  730. provisa/vector/capability.py +42 -0
  731. provisa/vector/fallback_cache.py +101 -0
  732. provisa/vector/generation.py +85 -0
  733. provisa/vector/governance.py +47 -0
  734. provisa/vector/providers.py +117 -0
  735. provisa/vector/query.py +98 -0
  736. provisa/vector/registry.py +74 -0
  737. provisa/vector/scheduled_refresh.py +65 -0
  738. provisa/vector/support.py +44 -0
  739. provisa/webhooks/__init__.py +15 -0
  740. provisa/webhooks/executor.py +98 -0
  741. provisa-0.1.0a244.dist-info/METADATA +129 -0
  742. provisa-0.1.0a244.dist-info/RECORD +747 -0
  743. provisa-0.1.0a244.dist-info/WHEEL +5 -0
  744. provisa-0.1.0a244.dist-info/entry_points.txt +2 -0
  745. provisa-0.1.0a244.dist-info/licenses/LICENSE +89 -0
  746. provisa-0.1.0a244.dist-info/licenses/NOTICE +26 -0
  747. provisa-0.1.0a244.dist-info/top_level.txt +2 -0
buenavista/__init__.py ADDED
@@ -0,0 +1,9 @@
1
+ # Copyright (c) 2026 Kenneth Stott
2
+ # Canary: 6112eecd-1577-4f0f-a632-ecd48ca18735
3
+ #
4
+ # This source code is licensed under the Business Source License 1.1
5
+ # found in the LICENSE file in the root directory of this source tree.
6
+ #
7
+ # NOTICE: Use of this software for training artificial intelligence or
8
+ # machine learning models is strictly prohibited without explicit written
9
+ # permission from the copyright holder.
@@ -0,0 +1,123 @@
1
+ # Copyright (c) 2026 Kenneth Stott
2
+ # Canary: 59df7f5e-dd95-4eae-ba68-bfe4f163ec1b
3
+ #
4
+ # This source code is licensed under the Business Source License 1.1
5
+ # found in the LICENSE file in the root directory of this source tree.
6
+ #
7
+ # NOTICE: Use of this software for training artificial intelligence or
8
+ # machine learning models is strictly prohibited without explicit written
9
+ # permission from the copyright holder.
10
+
11
+ from sqlglot import exp
12
+ from sqlglot.dialects import DuckDB, Postgres, Trino
13
+ from sqlglot.tokens import TokenType
14
+
15
+
16
+ # Additional expressions I need
17
+ class ToISO8601(exp.Func):
18
+ pass
19
+
20
+
21
+ class BVPostgres(Postgres):
22
+ pass
23
+
24
+
25
+ # Trino-specific modifications
26
+ class BVTrino(Trino):
27
+ class Tokenizer(Trino.Tokenizer):
28
+ KEYWORDS = {
29
+ **Trino.Tokenizer.KEYWORDS,
30
+ "DEALLOCATE": TokenType.COMMAND,
31
+ }
32
+
33
+ class Parser(Trino.Parser):
34
+ FUNCTIONS = {
35
+ **Trino.Parser.FUNCTIONS,
36
+ "TO_ISO8601": ToISO8601.from_arg_list,
37
+ }
38
+
39
+
40
+ # DuckDB-specific modifications
41
+ def _duckdb_command_handler(self, expression):
42
+ cmd = expression.this.upper()
43
+ if cmd == "PREPARE":
44
+ literal = expression.expression.this
45
+ tokens = literal.split()
46
+ stmt = tokens[0]
47
+ if tokens[1].upper() not in ("FROM", "AS"):
48
+ raise Exception("Badness badness")
49
+ res = " ".join(tokens[2:])
50
+ rest = BVDuckDB().generate(BVTrino().parse(res)[0])
51
+ return f"PREPARE {stmt} AS " + rest
52
+ elif cmd == "SHOW":
53
+ literal = expression.expression.this
54
+ tokens = literal.split()
55
+ entity = tokens[0].upper()
56
+ if entity == "CATALOGS":
57
+ q = "SELECT DISTINCT catalog_name as Catalog FROM information_schema.schemata"
58
+ if len(tokens) >= 3:
59
+ if len(tokens) == 5:
60
+ like = tokens[2].replace(tokens[4], "")
61
+ else:
62
+ like = tokens[2]
63
+ q += " WHERE catalog_name LIKE " + like
64
+ else:
65
+ return q
66
+ elif entity == "SCHEMAS":
67
+ q = "SELECT DISTINCT schema_name as Schema FROM information_schema.schemata"
68
+ if len(tokens) > 1 and tokens[1].upper() == "FROM":
69
+ q += f" WHERE catalog_name = '{tokens[2]}'"
70
+ if len(tokens) >= 5:
71
+ if len(tokens) == 7:
72
+ like = tokens[4].replace(tokens[6], "")
73
+ else:
74
+ like = tokens[4]
75
+ q += " AND schema_name LIKE " + like
76
+ else:
77
+ q += " WHERE catalog_name IN (SELECT current_database())"
78
+ if len(tokens) >= 3:
79
+ if len(tokens) == 5:
80
+ like = tokens[2].replace(tokens[4], "")
81
+ else:
82
+ like = tokens[2]
83
+ q += " AND schema_name LIKE " + like
84
+ return q
85
+ elif entity == "TABLES":
86
+ q = "SELECT DISTINCT table_name as Table from information_schema.tables"
87
+ if len(tokens) > 1 and tokens[1].upper() == "FROM":
88
+ q += f" WHERE table_schema = '{tokens[2]}'"
89
+ if len(tokens) >= 5:
90
+ if len(tokens) == 7:
91
+ like = tokens[4].replace(tokens[6], "")
92
+ else:
93
+ like = tokens[4]
94
+ q += " AND table_name LIKE " + like
95
+ else:
96
+ q += " WHERE table_schema IN (SELECT current_schema())"
97
+ if len(tokens) >= 3:
98
+ if len(tokens) == 5:
99
+ like = tokens[2].replace(tokens[4], "")
100
+ else:
101
+ like = tokens[2]
102
+ q += " AND table_name LIKE " + like
103
+ return q
104
+ elif entity == "COLUMNS" and tokens[1].upper() == "FROM":
105
+ return f"DESCRIBE {tokens[2]}"
106
+ elif entity == "TRANSACTION":
107
+ return "SELECT 'read committed' as transaction_isolation"
108
+ elif entity == "STANDARD_CONFORMING_STRINGS":
109
+ return "SELECT 'on' as standard_conforming_strings"
110
+ else:
111
+ raise Exception("Unhandled SHOW command: " + literal)
112
+
113
+ return expression.sql()
114
+
115
+
116
+ class BVDuckDB(DuckDB):
117
+ class Generator(DuckDB.Generator):
118
+ TRANSFORMS = {
119
+ **DuckDB.Generator.TRANSFORMS,
120
+ exp.CurrentTimestamp: lambda *_: "CURRENT_TIMESTAMP",
121
+ ToISO8601: lambda self, e: f"STRFTIME({self.sql(e, 'this')}, '%Y-%m-%dT%H:%M:%S.%f%z')",
122
+ exp.Command: _duckdb_command_handler,
123
+ }
buenavista/core.py ADDED
@@ -0,0 +1,150 @@
1
+ # Copyright (c) 2026 Kenneth Stott
2
+ # Canary: cf04da0e-7202-4517-8d77-047866a039f2
3
+ #
4
+ # This source code is licensed under the Business Source License 1.1
5
+ # found in the LICENSE file in the root directory of this source tree.
6
+ #
7
+ # NOTICE: Use of this software for training artificial intelligence or
8
+ # machine learning models is strictly prohibited without explicit written
9
+ # permission from the copyright holder.
10
+
11
+ import enum
12
+ import json
13
+ import re
14
+ import uuid
15
+ from typing import Any, Dict, Iterator, List, Optional, Tuple
16
+
17
+
18
+ class BVType(enum.Enum):
19
+ NULL = 0
20
+ BIGINT = 1
21
+ BOOL = 2
22
+ BYTES = 3
23
+ DATE = 4
24
+ FLOAT = 5
25
+ INTEGER = 6
26
+ INTERVAL = 7
27
+ JSON = 8
28
+ DECIMAL = 9
29
+ TEXT = 10
30
+ TIME = 11
31
+ TIMESTAMP = 12
32
+ UNKNOWN = 13
33
+ ARRAY = 14
34
+ INTEGERARRAY = 15
35
+ STRINGARRAY = 16
36
+
37
+
38
+ class QueryResult:
39
+ """The BV representation of a result of a query."""
40
+
41
+ def __init__(self):
42
+ self.result_format = None
43
+
44
+ def has_results(self) -> bool:
45
+ raise NotImplementedError
46
+
47
+ def column_count(self):
48
+ raise NotImplementedError
49
+
50
+ def column(self, index: int) -> Tuple[str, BVType]:
51
+ raise NotImplementedError
52
+
53
+ def rows(self) -> Iterator[List]:
54
+ raise NotImplementedError
55
+
56
+ def status(self) -> str:
57
+ raise NotImplementedError
58
+
59
+
60
+ class Session:
61
+ def __init__(self):
62
+ self.id = uuid.uuid4()
63
+
64
+ def cursor(self):
65
+ raise NotImplementedError
66
+
67
+ def close(self):
68
+ raise NotImplementedError
69
+
70
+ def execute_sql(self, sql: str, params=None) -> QueryResult:
71
+ raise NotImplementedError
72
+
73
+ def in_transaction(self) -> bool:
74
+ raise NotImplementedError
75
+
76
+ def load_df_function(self, table: str):
77
+ raise NotImplementedError
78
+
79
+
80
+ class Connection:
81
+ """Translation layer from an upstream data source into the BV representation of a query result."""
82
+
83
+ def __init__(self):
84
+ self._sessions = {}
85
+
86
+ def create_session(self) -> Session:
87
+ sess = self.new_session()
88
+ self._sessions[sess.id] = sess
89
+ return sess
90
+
91
+ def get_session(self, id: int) -> Optional[Session]:
92
+ return self._sessions.get(id)
93
+
94
+ def close_session(self, session: Session):
95
+ if session and session.id in self._sessions:
96
+ del self._sessions[session.id]
97
+ session.close()
98
+
99
+ def new_session(self) -> Session:
100
+ raise NotImplementedError
101
+
102
+ def parameters(self) -> Dict[str, str]:
103
+ return {}
104
+
105
+
106
+ class Extension:
107
+ @classmethod
108
+ def check_json(cls, payload: str) -> Optional[dict]:
109
+ is_json = False
110
+ if payload[-1] == "}":
111
+ is_json = True
112
+ elif payload[-1] == ";" and payload[-2] == "}":
113
+ is_json = True
114
+ # Strip any SQL comments
115
+ if is_json:
116
+ payload = re.sub(r"\/\*.*\*\/", "", payload)
117
+ return json.loads(payload)
118
+ return None
119
+
120
+ def type(self) -> str:
121
+ raise NotImplementedError
122
+
123
+ def apply(self, params: dict, session: Session) -> QueryResult:
124
+ raise NotImplementedError
125
+
126
+
127
+ class SimpleQueryResult(QueryResult):
128
+ def __init__(self, name: str, value: Any, type: BVType):
129
+ super().__init__()
130
+ self.name = name
131
+ self.value = str(value)
132
+ self.type = type
133
+
134
+ def has_results(self):
135
+ return True
136
+
137
+ def column_count(self):
138
+ return 1
139
+
140
+ def column(self, index: int) -> Tuple[str, BVType]:
141
+ if index == 0:
142
+ return (self.name, self.type)
143
+ else:
144
+ raise IndexError
145
+
146
+ def rows(self) -> Iterator[List]:
147
+ return iter([[self.value]])
148
+
149
+ def status(self) -> str:
150
+ return ""