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.
- buenavista/__init__.py +9 -0
- buenavista/bv_dialects.py +123 -0
- buenavista/core.py +150 -0
- buenavista/postgres.py +853 -0
- buenavista/rewrite.py +66 -0
- provisa/__init__.py +9 -0
- provisa/_config/capabilities.yaml +218 -0
- provisa/_config/pg_extension_catalog.yaml +106 -0
- provisa/_ui/apple-touch-icon.png +0 -0
- provisa/_ui/assets/AdminPage-Dqs2DYTv.js +1 -0
- provisa/_ui/assets/Alert-olsRF0Jo.js +1 -0
- provisa/_ui/assets/Card-z2Bo-A5p.js +1 -0
- provisa/_ui/assets/CloseButton-COJkmEJ_.js +5 -0
- provisa/_ui/assets/Code-CuWuP1uE.js +1 -0
- provisa/_ui/assets/CommandsPage-CGZTC4Jw.js +1 -0
- provisa/_ui/assets/ConfirmDialog-CnYI0AfS.js +1 -0
- provisa/_ui/assets/CopyButton-DmLBbp5g.js +1 -0
- provisa/_ui/assets/DocsPage-CRWTTZLR.js +1 -0
- provisa/_ui/assets/DocsPage-DAitv_IW.css +1 -0
- provisa/_ui/assets/ErdModal-CPZQ7m-5.js +2 -0
- provisa/_ui/assets/FilterInput-DFpPDDtr.js +1 -0
- provisa/_ui/assets/GraphPage-6J0lXseA.js +4 -0
- provisa/_ui/assets/GraphPage-nK82rD0e.css +1 -0
- provisa/_ui/assets/GrpcPage-B1gbbQHK.css +1 -0
- provisa/_ui/assets/GrpcPage-DoTbcK4o.js +2 -0
- provisa/_ui/assets/Input-BQ7YLH5k.js +1 -0
- provisa/_ui/assets/InputBase-D8Jikz1x.js +1 -0
- provisa/_ui/assets/JsonApiPage-C3-MZvt3.js +1 -0
- provisa/_ui/assets/JsonApiPage-xEeynjaG.css +1 -0
- provisa/_ui/assets/List-BFN9Gv0L.js +1 -0
- provisa/_ui/assets/LoginPage-D3rUrhhP.js +2 -0
- provisa/_ui/assets/Mantine.context-COSAnKfW.js +1 -0
- provisa/_ui/assets/McpExplorePage-CKVK-a_A.css +1 -0
- provisa/_ui/assets/McpExplorePage-DN-5kwhM.js +569 -0
- provisa/_ui/assets/MultiSelect-o1U1Tya2.js +1 -0
- provisa/_ui/assets/NlPage-Dncsd506.js +1 -0
- provisa/_ui/assets/NumberInput-BcxkyHDO.js +1 -0
- provisa/_ui/assets/OpenApiPage-BA2uwVJo.css +1 -0
- provisa/_ui/assets/OpenApiPage-BVXBLXML.js +1 -0
- provisa/_ui/assets/Pagination-DnHpOlc2.js +1 -0
- provisa/_ui/assets/PasswordInput-CHPV3HHV.js +1 -0
- provisa/_ui/assets/QueryPage-tMx_5EVY.js +109 -0
- provisa/_ui/assets/QueryPage-wFcZ_rSr.css +1 -0
- provisa/_ui/assets/Radio-Bi-dGDMv.js +1 -0
- provisa/_ui/assets/RelationshipsPage-BNeNG4Qk.js +3 -0
- provisa/_ui/assets/RequestsPage-CJSlnIdv.js +1 -0
- provisa/_ui/assets/SchemaExplorer-BlUYmbAz.js +20 -0
- provisa/_ui/assets/SecurityPage-BO6CfBK8.js +1 -0
- provisa/_ui/assets/SegmentedControl-FblIlBwc.js +1 -0
- provisa/_ui/assets/Select-SA9iAO1h.js +1 -0
- provisa/_ui/assets/SetupPage-Cxoe46vJ.js +1 -0
- provisa/_ui/assets/SimpleGrid-BkUQXfli.js +1 -0
- provisa/_ui/assets/SourcesPage-DosK9lzy.js +11 -0
- provisa/_ui/assets/SqlPage-BD7WXqY8.js +6 -0
- provisa/_ui/assets/TablesPage-CGDxNvB1.js +1 -0
- provisa/_ui/assets/Tabs-CblK1Rtp.js +1 -0
- provisa/_ui/assets/TextInput-D86W-0Nq.js +1 -0
- provisa/_ui/assets/Textarea-Dywhas9Y.js +1 -0
- provisa/_ui/assets/ViewsPage-D9gGGmHP.js +1 -0
- provisa/_ui/assets/actions-5gXnxx2e.js +1 -0
- provisa/_ui/assets/admin-BwoS7Ttj.js +1 -0
- provisa/_ui/assets/admin-WJWK7W-X.js +2 -0
- provisa/_ui/assets/architecture-7EHR7CIX-B1R6OVIb.js +1 -0
- provisa/_ui/assets/babel-BvCgDdiU.js +15 -0
- provisa/_ui/assets/chevron-right-_50lIoPZ.js +1 -0
- provisa/_ui/assets/chevron-up-BfLSdWfo.js +1 -0
- provisa/_ui/assets/chevrons-right-UteR6wPJ.js +1 -0
- provisa/_ui/assets/circle-alert-Bu1UeVIx.js +1 -0
- provisa/_ui/assets/codicon-DCmgc-ay.ttf +0 -0
- provisa/_ui/assets/copy-BJSjhFSQ.js +1 -0
- provisa/_ui/assets/create-safe-context-Cp0rN64W.js +1 -0
- provisa/_ui/assets/cypher-codemirror-COI3VOX7.css +1 -0
- provisa/_ui/assets/cypher-codemirror-rzCmupus.js +10 -0
- provisa/_ui/assets/dist-BOx43okh.js +1 -0
- provisa/_ui/assets/dist-DJ30WIku.js +1 -0
- provisa/_ui/assets/download-EO2qj82-.js +1 -0
- provisa/_ui/assets/esm-DoY7ccVx.js +15 -0
- provisa/_ui/assets/estree-CStc1WiO.js +44 -0
- provisa/_ui/assets/eventmodeling-FCH6USID-BPtIDmEK.js +1 -0
- provisa/_ui/assets/firebase-BZvYX7DS.js +1 -0
- provisa/_ui/assets/get-env-DN1byi3J.js +1 -0
- provisa/_ui/assets/get-style-object-BDpgefo6.js +1 -0
- provisa/_ui/assets/gitGraph-WXDBUCRP-DaajRYRT.js +1 -0
- provisa/_ui/assets/graph-export-C1Qyb8tJ.js +6 -0
- provisa/_ui/assets/graphql-8PnP7wdF.js +28 -0
- provisa/_ui/assets/graphql-DPd-ryYU.js +28 -0
- provisa/_ui/assets/index-Bk-4qilv.js +21 -0
- provisa/_ui/assets/index-Ubv-iDeM.css +1 -0
- provisa/_ui/assets/info-Db4sqa4U.js +1 -0
- provisa/_ui/assets/info-J43DQDTF-DdZDZQFj.js +1 -0
- provisa/_ui/assets/katex-C4eR7coU.js +257 -0
- provisa/_ui/assets/lib-DJX5c_EK.js +16 -0
- provisa/_ui/assets/liveCapability-Buo2q2KH.js +1 -0
- provisa/_ui/assets/maximize-2-BjEM81oc.js +1 -0
- provisa/_ui/assets/naming-D2W_TDLo.js +1 -0
- provisa/_ui/assets/packet-YPE3B663-D_8FMH56.js +1 -0
- provisa/_ui/assets/pencil-BKoqPyRv.js +1 -0
- provisa/_ui/assets/pie-LRSECV5Y-B3u8ZO9o.js +1 -0
- provisa/_ui/assets/play-DZgTbsd-.js +1 -0
- provisa/_ui/assets/plus-BZ8PGQwK.js +1 -0
- provisa/_ui/assets/radar-GUYGQ44K-B57pEu02.js +1 -0
- provisa/_ui/assets/rolldown-runtime-CMxvf4Kt.js +1 -0
- provisa/_ui/assets/sparkles-DxXOJOVI.js +1 -0
- provisa/_ui/assets/standalone-BvaX2kS-.js +29 -0
- provisa/_ui/assets/table-2-BwuZElBq.js +1 -0
- provisa/_ui/assets/trash-2-DK4I8-td.js +1 -0
- provisa/_ui/assets/treeView-BLDUP644-D2lP5nmA.js +1 -0
- provisa/_ui/assets/treemap-LRROVOQU-V5HaemcZ.js +1 -0
- provisa/_ui/assets/use-media-query-B79wNZr6.js +1 -0
- provisa/_ui/assets/use-merged-ref-WrlFclhU.js +1 -0
- provisa/_ui/assets/use-reduced-motion-CwaZt4K5.js +1 -0
- provisa/_ui/assets/useAdminQueries-DmD_MMVD.js +543 -0
- provisa/_ui/assets/vendor-apollo-uTC-SxVA.js +158 -0
- provisa/_ui/assets/vendor-cytoscape-DzheRRTy.js +349 -0
- provisa/_ui/assets/vendor-firebase-Bne7jdsa.js +1 -0
- provisa/_ui/assets/vendor-mermaid-DYlES3LV.js +2772 -0
- provisa/_ui/assets/vendor-monaco-B12TyRWl.css +1 -0
- provisa/_ui/assets/vendor-monaco-B_j1bxCw.js +1064 -0
- provisa/_ui/assets/vendor-mui-C2_0bhe-.js +1 -0
- provisa/_ui/assets/vendor-react-m9IIiB39.js +72 -0
- provisa/_ui/assets/wardley-L42UT6IY-bBVX-Ej4.js +1 -0
- provisa/_ui/assets/x-B488js0C.js +1 -0
- provisa/_ui/favicon.ico +0 -0
- provisa/_ui/favicon.svg +10 -0
- provisa/_ui/guides-md/admin.md +187 -0
- provisa/_ui/guides-md/api-reference.md +825 -0
- provisa/_ui/guides-md/architecture.md +656 -0
- provisa/_ui/guides-md/configuration.md +845 -0
- provisa/_ui/guides-md/cypher.md +234 -0
- provisa/_ui/guides-md/deployment.md +804 -0
- provisa/_ui/guides-md/images/bolt-neo4j-browser.png +0 -0
- provisa/_ui/guides-md/images/data-sources.png +0 -0
- provisa/_ui/guides-md/images/graph-view.png +0 -0
- provisa/_ui/guides-md/images/natural-language.png +0 -0
- provisa/_ui/guides-md/images/pgwire-datagrip.png +0 -0
- provisa/_ui/guides-md/images/query-explorer.png +0 -0
- provisa/_ui/guides-md/images/relationships.png +0 -0
- provisa/_ui/guides-md/images/schema-voyager.png +0 -0
- provisa/_ui/guides-md/images/security-roles.png +0 -0
- provisa/_ui/guides-md/images/table-registration.png +0 -0
- provisa/_ui/guides-md/import.md +115 -0
- provisa/_ui/guides-md/integrations.md +239 -0
- provisa/_ui/guides-md/manifest.json +82 -0
- provisa/_ui/guides-md/multitenant.md +350 -0
- provisa/_ui/guides-md/pgwire.md +196 -0
- provisa/_ui/guides-md/python-client.md +260 -0
- provisa/_ui/guides-md/quickstart.md +160 -0
- provisa/_ui/guides-md/readme.md +364 -0
- provisa/_ui/guides-md/security.md +315 -0
- provisa/_ui/guides-md/sources.md +722 -0
- provisa/_ui/guides-md/subscriptions.md +179 -0
- provisa/_ui/icon-192.png +0 -0
- provisa/_ui/icon-512.png +0 -0
- provisa/_ui/icon.svg +10 -0
- provisa/_ui/icons.svg +24 -0
- provisa/_ui/index.html +294 -0
- provisa/_ui/monacoeditorwork/editor.worker.bundle.js +13516 -0
- provisa/_ui/monacoeditorwork/graphql.worker.bundle.js +32447 -0
- provisa/_ui/monacoeditorwork/json.worker.bundle.js +21317 -0
- provisa/_ui/site.webmanifest +11 -0
- provisa/_ui/voyager/react-dom.production.min.js +277 -0
- provisa/_ui/voyager/react.production.min.js +41 -0
- provisa/_ui/voyager/voyager.css +697 -0
- provisa/_ui/voyager/voyager.standalone.js +1762 -0
- provisa/api/__init__.py +9 -0
- provisa/api/_meta_seed.py +313 -0
- provisa/api/_meta_views.py +115 -0
- provisa/api/_query_helpers.py +140 -0
- provisa/api/admin/__init__.py +11 -0
- provisa/api/admin/_config_io.py +34 -0
- provisa/api/admin/_dev_shared.py +38 -0
- provisa/api/admin/_guards.py +27 -0
- provisa/api/admin/_live_mappers.py +84 -0
- provisa/api/admin/_row_mappers.py +204 -0
- provisa/api/admin/_table_ops.py +201 -0
- provisa/api/admin/actions_router.py +575 -0
- provisa/api/admin/ai_models_router.py +102 -0
- provisa/api/admin/api_discovery.py +148 -0
- provisa/api/admin/capabilities.py +113 -0
- provisa/api/admin/config_export.py +246 -0
- provisa/api/admin/crawl_router.py +69 -0
- provisa/api/admin/creation_requests_router.py +290 -0
- provisa/api/admin/db_queries.py +181 -0
- provisa/api/admin/dev_queries.py +522 -0
- provisa/api/admin/discovery.py +158 -0
- provisa/api/admin/discovery_resilience.py +47 -0
- provisa/api/admin/discovery_schema.py +281 -0
- provisa/api/admin/graphql_remote_router.py +373 -0
- provisa/api/admin/grpc_remote_router.py +426 -0
- provisa/api/admin/introspect.py +664 -0
- provisa/api/admin/invites_router.py +119 -0
- provisa/api/admin/local_users_router.py +242 -0
- provisa/api/admin/neo4j_router.py +155 -0
- provisa/api/admin/openapi_router.py +330 -0
- provisa/api/admin/orgs_router.py +209 -0
- provisa/api/admin/roles_router.py +132 -0
- provisa/api/admin/schema.py +41 -0
- provisa/api/admin/schema_common.py +388 -0
- provisa/api/admin/schema_helpers.py +454 -0
- provisa/api/admin/schema_mutation.py +1089 -0
- provisa/api/admin/schema_mutation_ops.py +459 -0
- provisa/api/admin/schema_query.py +834 -0
- provisa/api/admin/security_router.py +57 -0
- provisa/api/admin/settings_router.py +1057 -0
- provisa/api/admin/source_meta_router.py +126 -0
- provisa/api/admin/sparql_router.py +128 -0
- provisa/api/admin/system_health.py +119 -0
- provisa/api/admin/table_profile_router.py +104 -0
- provisa/api/admin/table_search_router.py +138 -0
- provisa/api/admin/types.py +524 -0
- provisa/api/airport/__init__.py +16 -0
- provisa/api/airport/pushdown.py +248 -0
- provisa/api/airport/query.py +157 -0
- provisa/api/airport/server.py +1038 -0
- provisa/api/airport/service.py +47 -0
- provisa/api/airport/transactions.py +62 -0
- provisa/api/airport/wire.py +207 -0
- provisa/api/app.py +1038 -0
- provisa/api/app_loaders.py +979 -0
- provisa/api/app_rebuild.py +198 -0
- provisa/api/app_schema_build.py +277 -0
- provisa/api/app_startup.py +676 -0
- provisa/api/auth_router.py +248 -0
- provisa/api/billing/__init__.py +4 -0
- provisa/api/billing/kms.py +70 -0
- provisa/api/billing/lemonsqueezy_client.py +80 -0
- provisa/api/billing/models.py +45 -0
- provisa/api/billing/router.py +148 -0
- provisa/api/billing/tenant_db.py +152 -0
- provisa/api/data/__init__.py +9 -0
- provisa/api/data/action_exec.py +40 -0
- provisa/api/data/encrypted_directive.py +58 -0
- provisa/api/data/endpoint.py +910 -0
- provisa/api/data/endpoint_dev.py +908 -0
- provisa/api/data/endpoint_executors.py +907 -0
- provisa/api/data/endpoint_grpc_proxy.py +136 -0
- provisa/api/data/endpoint_helpers.py +432 -0
- provisa/api/data/federation.py +185 -0
- provisa/api/data/hydration.py +297 -0
- provisa/api/data/materialization.py +683 -0
- provisa/api/data/mutations.py +416 -0
- provisa/api/data/redirect_unwrap.py +70 -0
- provisa/api/data/sdl.py +247 -0
- provisa/api/data/subscribe.py +581 -0
- provisa/api/data/subscription_sse.py +458 -0
- provisa/api/flight/__init__.py +11 -0
- provisa/api/flight/catalog.py +266 -0
- provisa/api/flight/server.py +622 -0
- provisa/api/jsonapi/__init__.py +11 -0
- provisa/api/jsonapi/errors.py +46 -0
- provisa/api/jsonapi/generator.py +513 -0
- provisa/api/jsonapi/pagination.py +92 -0
- provisa/api/jsonapi/serializer.py +128 -0
- provisa/api/jsonapi/spec.py +260 -0
- provisa/api/mcp/__init__.py +26 -0
- provisa/api/mcp/chat.py +211 -0
- provisa/api/mcp/search.py +206 -0
- provisa/api/mcp/server.py +207 -0
- provisa/api/mcp/status.py +199 -0
- provisa/api/mcp/tls.py +220 -0
- provisa/api/mcp/tools.py +438 -0
- provisa/api/middleware/__init__.py +9 -0
- provisa/api/middleware/rate_limit_middleware.py +62 -0
- provisa/api/middleware/tenant_middleware.py +95 -0
- provisa/api/otel_setup.py +473 -0
- provisa/api/rate_limit.py +124 -0
- provisa/api/rest/__init__.py +11 -0
- provisa/api/rest/cypher_exec.py +491 -0
- provisa/api/rest/cypher_router.py +875 -0
- provisa/api/rest/generator.py +322 -0
- provisa/api/rest/graph_tools_router.py +258 -0
- provisa/api/rest/neo4j_compat_router.py +233 -0
- provisa/api/rest/nl_router.py +150 -0
- provisa/api/rest/openapi_spec.py +532 -0
- provisa/api/rest/registered_call.py +170 -0
- provisa/api/setup_router.py +223 -0
- provisa/api/startup_resilience.py +62 -0
- provisa/api/startup_seed.py +611 -0
- provisa/api/tenant_helpers.py +40 -0
- provisa/api/trino_setup.py +193 -0
- provisa/api_source/__init__.py +9 -0
- provisa/api_source/cache.py +33 -0
- provisa/api_source/caller.py +431 -0
- provisa/api_source/candidates.py +181 -0
- provisa/api_source/engine_cache.py +423 -0
- provisa/api_source/flattener.py +111 -0
- provisa/api_source/introspect.py +306 -0
- provisa/api_source/loader.py +150 -0
- provisa/api_source/models.py +118 -0
- provisa/api_source/normalizers.py +252 -0
- provisa/api_source/promotions.py +91 -0
- provisa/api_source/router_integration.py +136 -0
- provisa/api_source/schema_integration.py +153 -0
- provisa/api_source/transforms.py +46 -0
- provisa/apq/__init__.py +20 -0
- provisa/apq/cache.py +124 -0
- provisa/audit/__init__.py +35 -0
- provisa/audit/compliance_reporter.py +98 -0
- provisa/audit/query_log.py +136 -0
- provisa/audit/sla_monitor.py +115 -0
- provisa/auth/__init__.py +9 -0
- provisa/auth/approval.proto +30 -0
- provisa/auth/approval_hook.py +327 -0
- provisa/auth/approval_pb2.py +55 -0
- provisa/auth/approval_pb2_grpc.py +113 -0
- provisa/auth/middleware.py +279 -0
- provisa/auth/models.py +58 -0
- provisa/auth/providers/__init__.py +9 -0
- provisa/auth/providers/basic.py +73 -0
- provisa/auth/providers/firebase.py +63 -0
- provisa/auth/providers/keycloak.py +74 -0
- provisa/auth/providers/oauth.py +80 -0
- provisa/auth/providers/simple.py +86 -0
- provisa/auth/role_mapping.py +70 -0
- provisa/auth/superuser.py +59 -0
- provisa/auth/wiring.py +195 -0
- provisa/bolt/__init__.py +20 -0
- provisa/bolt/framing.py +52 -0
- provisa/bolt/messages.py +82 -0
- provisa/bolt/packstream.py +456 -0
- provisa/bolt/server.py +218 -0
- provisa/bolt/session.py +824 -0
- provisa/bolt/websocket.py +250 -0
- provisa/cache/__init__.py +24 -0
- provisa/cache/hot_tables.py +790 -0
- provisa/cache/key.py +103 -0
- provisa/cache/middleware.py +70 -0
- provisa/cache/policy.py +76 -0
- provisa/cache/store.py +283 -0
- provisa/cache/warm_tables.py +181 -0
- provisa/cassandra/__init__.py +11 -0
- provisa/cassandra/source.py +149 -0
- provisa/cli.py +110 -0
- provisa/compiler/__init__.py +9 -0
- provisa/compiler/actions_schema.py +251 -0
- provisa/compiler/aggregate_gen.py +259 -0
- provisa/compiler/aggregates.py +622 -0
- provisa/compiler/context.py +380 -0
- provisa/compiler/cte_utils.py +29 -0
- provisa/compiler/cursor.py +206 -0
- provisa/compiler/directives.py +368 -0
- provisa/compiler/enum_detect.py +178 -0
- provisa/compiler/federation.py +263 -0
- provisa/compiler/function_gen.py +170 -0
- provisa/compiler/hints.py +180 -0
- provisa/compiler/introspect.py +279 -0
- provisa/compiler/mask_inject.py +188 -0
- provisa/compiler/mutation_gen.py +401 -0
- provisa/compiler/naming.py +351 -0
- provisa/compiler/nf_extractor.py +251 -0
- provisa/compiler/normalize.py +248 -0
- provisa/compiler/order_by_gen.py +41 -0
- provisa/compiler/params.py +119 -0
- provisa/compiler/parser.py +112 -0
- provisa/compiler/rls.py +182 -0
- provisa/compiler/sampling.py +52 -0
- provisa/compiler/schema_directives.py +224 -0
- provisa/compiler/schema_gen.py +869 -0
- provisa/compiler/schema_inputs.py +290 -0
- provisa/compiler/schema_service.py +87 -0
- provisa/compiler/schema_types.py +78 -0
- provisa/compiler/sql_gen.py +794 -0
- provisa/compiler/sql_rewrite.py +316 -0
- provisa/compiler/sql_selection.py +684 -0
- provisa/compiler/sql_types.py +180 -0
- provisa/compiler/sql_validator.py +549 -0
- provisa/compiler/sql_where.py +307 -0
- provisa/compiler/stage1.py +32 -0
- provisa/compiler/stage2.py +582 -0
- provisa/compiler/type_map.py +243 -0
- provisa/compiler/view_expand.py +94 -0
- provisa/control_plane/__init__.py +11 -0
- provisa/control_plane/models.py +30 -0
- provisa/control_plane/router.py +117 -0
- provisa/control_plane/store.py +46 -0
- provisa/core/__init__.py +9 -0
- provisa/core/auth_models.py +304 -0
- provisa/core/catalog.py +210 -0
- provisa/core/change_signal.py +118 -0
- provisa/core/config_loader.py +983 -0
- provisa/core/control_plane.py +36 -0
- provisa/core/control_plane_pg.py +87 -0
- provisa/core/database.py +914 -0
- provisa/core/db.py +167 -0
- provisa/core/desktop_profile.py +217 -0
- provisa/core/domain_policy.py +108 -0
- provisa/core/duckdb_async.py +358 -0
- provisa/core/ir_types.py +233 -0
- provisa/core/meta_rls.py +136 -0
- provisa/core/models.py +1080 -0
- provisa/core/org_provisioning.py +165 -0
- provisa/core/redis_factory.py +61 -0
- provisa/core/repositories/__init__.py +9 -0
- provisa/core/repositories/creation_request.py +146 -0
- provisa/core/repositories/domain.py +53 -0
- provisa/core/repositories/function.py +223 -0
- provisa/core/repositories/relationship.py +202 -0
- provisa/core/repositories/rls.py +106 -0
- provisa/core/repositories/role.py +52 -0
- provisa/core/repositories/source.py +81 -0
- provisa/core/repositories/table.py +239 -0
- provisa/core/schema.sql +606 -0
- provisa/core/schema_admin.py +168 -0
- provisa/core/schema_org.py +737 -0
- provisa/core/secrets.py +80 -0
- provisa/core/source_registry.py +59 -0
- provisa/core/tenant_context.py +55 -0
- provisa/core/trino_catalog_files.py +348 -0
- provisa/cypher/__init__.py +11 -0
- provisa/cypher/assembler.py +478 -0
- provisa/cypher/comprehension.py +277 -0
- provisa/cypher/correlated_call.py +110 -0
- provisa/cypher/expr_ast.py +247 -0
- provisa/cypher/expr_context.py +421 -0
- provisa/cypher/expr_parser.py +463 -0
- provisa/cypher/expr_visitor.py +302 -0
- provisa/cypher/graph_rewriter.py +304 -0
- provisa/cypher/graph_types.py +88 -0
- provisa/cypher/group_by.py +60 -0
- provisa/cypher/label_map.py +678 -0
- provisa/cypher/map_projection.py +90 -0
- provisa/cypher/params.py +71 -0
- provisa/cypher/parser.py +880 -0
- provisa/cypher/path_functions.py +719 -0
- provisa/cypher/path_translator.py +178 -0
- provisa/cypher/select_builder.py +629 -0
- provisa/cypher/sql_to_cypher.py +764 -0
- provisa/cypher/sql_to_cypher_agg.py +492 -0
- provisa/cypher/sql_to_cypher_helpers.py +85 -0
- provisa/cypher/translator.py +876 -0
- provisa/cypher/translator_helpers.py +452 -0
- provisa/cypher/translator_rel.py +576 -0
- provisa/cypher/translator_types.py +34 -0
- provisa/cypher/translator_union.py +324 -0
- provisa/cypher/write_translator.py +422 -0
- provisa/ddn/__init__.py +17 -0
- provisa/ddn/__main__.py +20 -0
- provisa/ddn/cli.py +172 -0
- provisa/ddn/mapper.py +580 -0
- provisa/ddn/models.py +166 -0
- provisa/ddn/parser.py +496 -0
- provisa/discovery/__init__.py +9 -0
- provisa/discovery/analyzer.py +141 -0
- provisa/discovery/candidates.py +147 -0
- provisa/discovery/catalog_cache.py +239 -0
- provisa/discovery/collector.py +267 -0
- provisa/discovery/column_inference.py +40 -0
- provisa/discovery/fk_introspect.py +462 -0
- provisa/discovery/prompt.py +95 -0
- provisa/discovery/table_search.py +192 -0
- provisa/elasticsearch/__init__.py +11 -0
- provisa/elasticsearch/source.py +236 -0
- provisa/encryption/__init__.py +51 -0
- provisa/encryption/envelope.py +118 -0
- provisa/encryption/factory.py +52 -0
- provisa/encryption/providers.py +252 -0
- provisa/encryption/registry.py +311 -0
- provisa/encryption/runtime.py +55 -0
- provisa/encryption/service.py +52 -0
- provisa/events/__init__.py +11 -0
- provisa/events/app_wiring.py +313 -0
- provisa/events/boot.py +415 -0
- provisa/events/calendars.py +299 -0
- provisa/events/content_hash.py +77 -0
- provisa/events/deadlines.py +176 -0
- provisa/events/freshness_contract.py +75 -0
- provisa/events/handlers.py +282 -0
- provisa/events/injector.py +123 -0
- provisa/events/lineage.py +215 -0
- provisa/events/outcomes.py +95 -0
- provisa/events/probes.py +179 -0
- provisa/events/processor.py +543 -0
- provisa/events/queue.py +267 -0
- provisa/events/snapshots.py +128 -0
- provisa/events/source_loader.py +190 -0
- provisa/events/supervisor.py +74 -0
- provisa/events/triggers.py +286 -0
- provisa/executor/__init__.py +9 -0
- provisa/executor/ctas.py +375 -0
- provisa/executor/direct.py +117 -0
- provisa/executor/drivers/__init__.py +11 -0
- provisa/executor/drivers/base.py +61 -0
- provisa/executor/drivers/bigquery.py +95 -0
- provisa/executor/drivers/clickhouse.py +81 -0
- provisa/executor/drivers/databricks.py +87 -0
- provisa/executor/drivers/duckdb_driver.py +67 -0
- provisa/executor/drivers/mssql_warehouse.py +114 -0
- provisa/executor/drivers/mysql.py +71 -0
- provisa/executor/drivers/oracle.py +70 -0
- provisa/executor/drivers/postgresql.py +133 -0
- provisa/executor/drivers/registry.py +193 -0
- provisa/executor/drivers/snowflake.py +86 -0
- provisa/executor/drivers/sqlalchemy_driver.py +117 -0
- provisa/executor/drivers/sqlserver.py +78 -0
- provisa/executor/errors.py +53 -0
- provisa/executor/formats/__init__.py +11 -0
- provisa/executor/formats/arrow.py +66 -0
- provisa/executor/formats/ndjson.py +48 -0
- provisa/executor/formats/tabular.py +125 -0
- provisa/executor/function_dispatch.py +310 -0
- provisa/executor/pool.py +139 -0
- provisa/executor/redirect.py +446 -0
- provisa/executor/result.py +29 -0
- provisa/executor/serialize.py +648 -0
- provisa/executor/stats.py +100 -0
- provisa/executor/trino.py +270 -0
- provisa/executor/trino_flight.py +169 -0
- provisa/executor/trino_write.py +113 -0
- provisa/executor/writable.py +118 -0
- provisa/federation/__init__.py +2 -0
- provisa/federation/backend.py +587 -0
- provisa/federation/bigquery_backend.py +34 -0
- provisa/federation/bigquery_connectors.py +113 -0
- provisa/federation/bigquery_runtime.py +234 -0
- provisa/federation/cardinality.py +85 -0
- provisa/federation/clickhouse_backend.py +46 -0
- provisa/federation/clickhouse_connectors.py +227 -0
- provisa/federation/clickhouse_runtime.py +403 -0
- provisa/federation/conformance.py +102 -0
- provisa/federation/connector.py +55 -0
- provisa/federation/connector_base.py +199 -0
- provisa/federation/connector_duckdb.py +729 -0
- provisa/federation/databricks_backend.py +37 -0
- provisa/federation/databricks_connectors.py +92 -0
- provisa/federation/databricks_runtime.py +268 -0
- provisa/federation/databricks_store.py +334 -0
- provisa/federation/databricks_tls.py +34 -0
- provisa/federation/databricks_uc.py +169 -0
- provisa/federation/delta.py +79 -0
- provisa/federation/duckdb_backend.py +34 -0
- provisa/federation/duckdb_extensions.py +106 -0
- provisa/federation/duckdb_runtime.py +372 -0
- provisa/federation/engine.py +1222 -0
- provisa/federation/fabric_shortcuts.py +184 -0
- provisa/federation/fdw_artifact_catalog.py +218 -0
- provisa/federation/freshness_gate.py +86 -0
- provisa/federation/materialization.py +107 -0
- provisa/federation/materialize_exec.py +240 -0
- provisa/federation/mssql_warehouse_backend.py +52 -0
- provisa/federation/mssql_warehouse_connectors.py +76 -0
- provisa/federation/mssql_warehouse_runtime.py +280 -0
- provisa/federation/native_backend.py +305 -0
- provisa/federation/pg_backend.py +50 -0
- provisa/federation/pg_runtime.py +109 -0
- provisa/federation/pgwire_replica.py +494 -0
- provisa/federation/plan.py +190 -0
- provisa/federation/promote.py +142 -0
- provisa/federation/read_through.py +70 -0
- provisa/federation/residency.py +145 -0
- provisa/federation/runtime.py +316 -0
- provisa/federation/runtime_support.py +49 -0
- provisa/federation/snowflake_backend.py +37 -0
- provisa/federation/snowflake_connectors.py +134 -0
- provisa/federation/snowflake_runtime.py +157 -0
- provisa/federation/sqlalchemy_backend.py +32 -0
- provisa/federation/sqlalchemy_runtime.py +71 -0
- provisa/federation/store_connection.py +130 -0
- provisa/federation/store_writer.py +319 -0
- provisa/federation/strategy.py +165 -0
- provisa/federation/trino_connectors.py +544 -0
- provisa/federation/trino_lifecycle.py +320 -0
- provisa/file_source/__init__.py +9 -0
- provisa/file_source/crawler.py +226 -0
- provisa/file_source/pg_migrate.py +171 -0
- provisa/file_source/source.py +333 -0
- provisa/freshness/__init__.py +52 -0
- provisa/freshness/adapters.py +53 -0
- provisa/freshness/decision.py +52 -0
- provisa/freshness/predicate.py +135 -0
- provisa/freshness/producer.py +78 -0
- provisa/freshness/source_gate.py +99 -0
- provisa/freshness/subject.py +63 -0
- provisa/google_sheets/__init__.py +11 -0
- provisa/google_sheets/source.py +68 -0
- provisa/govdata/__init__.py +9 -0
- provisa/govdata/schema_import.py +199 -0
- provisa/govdata/source.py +145 -0
- provisa/govdata/subjects.py +46 -0
- provisa/govdata/subscription.py +65 -0
- provisa/graphql_remote/__init__.py +9 -0
- provisa/graphql_remote/executor.py +117 -0
- provisa/graphql_remote/introspect.py +66 -0
- provisa/graphql_remote/mapper.py +589 -0
- provisa/grpc/__init__.py +9 -0
- provisa/grpc/proto_gen.py +243 -0
- provisa/grpc/query_ir.py +38 -0
- provisa/grpc/reflection.py +32 -0
- provisa/grpc/schema_gen.py +67 -0
- provisa/grpc/server.py +214 -0
- provisa/grpc_remote/__init__.py +9 -0
- provisa/grpc_remote/executor.py +151 -0
- provisa/grpc_remote/loader.py +239 -0
- provisa/grpc_remote/mapper.py +238 -0
- provisa/hasura_v2/__init__.py +17 -0
- provisa/hasura_v2/__main__.py +18 -0
- provisa/hasura_v2/cli.py +168 -0
- provisa/hasura_v2/mapper.py +608 -0
- provisa/hasura_v2/models.py +139 -0
- provisa/hasura_v2/parser.py +383 -0
- provisa/import_shared/__init__.py +12 -0
- provisa/import_shared/filters.py +157 -0
- provisa/import_shared/warnings.py +55 -0
- provisa/ingest/__init__.py +11 -0
- provisa/ingest/ddl.py +99 -0
- provisa/ingest/engine.py +90 -0
- provisa/ingest/provider.py +80 -0
- provisa/ingest/router.py +117 -0
- provisa/kafka/__init__.py +11 -0
- provisa/kafka/change_events.py +99 -0
- provisa/kafka/schema_registry.py +176 -0
- provisa/kafka/sink.py +146 -0
- provisa/kafka/sink_executor.py +94 -0
- provisa/kafka/source.py +297 -0
- provisa/kafka/window.py +134 -0
- provisa/lineage/__init__.py +33 -0
- provisa/lineage/columns.py +80 -0
- provisa/lineage/versions.py +86 -0
- provisa/live/__init__.py +15 -0
- provisa/live/engine.py +387 -0
- provisa/live/outputs/__init__.py +11 -0
- provisa/live/outputs/base.py +29 -0
- provisa/live/outputs/kafka.py +71 -0
- provisa/live/outputs/sse.py +93 -0
- provisa/live/reconcile.py +83 -0
- provisa/live/watermark.py +76 -0
- provisa/llm/__init__.py +5 -0
- provisa/llm/client.py +151 -0
- provisa/mongodb/__init__.py +11 -0
- provisa/mongodb/source.py +152 -0
- provisa/mv/__init__.py +15 -0
- provisa/mv/aggregate_catalog.py +210 -0
- provisa/mv/coordination.py +214 -0
- provisa/mv/delta.py +248 -0
- provisa/mv/determinism.py +97 -0
- provisa/mv/input_signals.py +122 -0
- provisa/mv/models.py +175 -0
- provisa/mv/refresh.py +522 -0
- provisa/mv/registry.py +131 -0
- provisa/mv/rewriter.py +352 -0
- provisa/mv/schema.sql +62 -0
- provisa/neo4j/__init__.py +11 -0
- provisa/neo4j/preview.py +104 -0
- provisa/neo4j/source.py +120 -0
- provisa/nl/__init__.py +12 -0
- provisa/nl/executor.py +206 -0
- provisa/nl/job.py +182 -0
- provisa/nl/loop.py +162 -0
- provisa/nl/prompt.py +114 -0
- provisa/nl/runner.py +320 -0
- provisa/nl/schema_matcher.py +274 -0
- provisa/observability/__init__.py +7 -0
- provisa/observability/ops_schema.py +173 -0
- provisa/observability/ops_trino.py +152 -0
- provisa/observability/otlp2sql.py +360 -0
- provisa/observability/stage_trace.py +100 -0
- provisa/observability/telemetry_pg.py +61 -0
- provisa/openapi/__init__.py +9 -0
- provisa/openapi/loader.py +58 -0
- provisa/openapi/mapper.py +259 -0
- provisa/openapi/pg_cache.py +394 -0
- provisa/openapi/register.py +321 -0
- provisa/otel_compat.py +221 -0
- provisa/pg_extensions/__init__.py +33 -0
- provisa/pg_extensions/catalog.py +277 -0
- provisa/pgwire/__init__.py +9 -0
- provisa/pgwire/_pipeline.py +533 -0
- provisa/pgwire/catalog.py +331 -0
- provisa/pgwire/catalog_columns_data.py +840 -0
- provisa/pgwire/catalog_constraints.py +502 -0
- provisa/pgwire/catalog_data.py +459 -0
- provisa/pgwire/catalog_populate.py +883 -0
- provisa/pgwire/catalog_rewrite.py +351 -0
- provisa/pgwire/copy_binary.py +112 -0
- provisa/pgwire/copy_handler.py +455 -0
- provisa/pgwire/ddl_handler.py +254 -0
- provisa/pgwire/ext_surfaces.py +305 -0
- provisa/pgwire/function_call.py +88 -0
- provisa/pgwire/function_catalog.py +104 -0
- provisa/pgwire/server.py +676 -0
- provisa/pgwire/system_tables.py +205 -0
- provisa/prometheus/__init__.py +11 -0
- provisa/prometheus/source.py +115 -0
- provisa/redis/__init__.py +11 -0
- provisa/redis/source.py +136 -0
- provisa/runtime_deps/__init__.py +44 -0
- provisa/runtime_deps/pgwire_bundles.py +161 -0
- provisa/scheduler/__init__.py +5 -0
- provisa/scheduler/jobs.py +534 -0
- provisa/scheduler/templating.py +49 -0
- provisa/schema_clusters.py +37 -0
- provisa/security/__init__.py +11 -0
- provisa/security/association_suggester.py +246 -0
- provisa/security/high_security.py +107 -0
- provisa/security/masking.py +278 -0
- provisa/security/mutation_authz.py +156 -0
- provisa/security/rights.py +100 -0
- provisa/security/visibility.py +56 -0
- provisa/source_adapters/__init__.py +11 -0
- provisa/source_adapters/grpc_remote_adapter.py +97 -0
- provisa/source_adapters/openapi_adapter.py +127 -0
- provisa/source_adapters/registry.py +69 -0
- provisa/sources/__init__.py +3 -0
- provisa/sources/counts.py +43 -0
- provisa/sources/gql.py +26 -0
- provisa/sparql/__init__.py +11 -0
- provisa/sparql/source.py +163 -0
- provisa/subscriptions/__init__.py +16 -0
- provisa/subscriptions/base.py +47 -0
- provisa/subscriptions/cdc_landing.py +62 -0
- provisa/subscriptions/debezium_provider.py +257 -0
- provisa/subscriptions/govdata_provider.py +162 -0
- provisa/subscriptions/kafka_provider.py +110 -0
- provisa/subscriptions/mongo_provider.py +84 -0
- provisa/subscriptions/pg_provider.py +131 -0
- provisa/subscriptions/pg_triggers.py +82 -0
- provisa/subscriptions/polling_provider.py +82 -0
- provisa/subscriptions/registry.py +163 -0
- provisa/subscriptions/rss_provider.py +230 -0
- provisa/subscriptions/trino_polling_provider.py +137 -0
- provisa/subscriptions/websocket_provider.py +143 -0
- provisa/tools/__init__.py +9 -0
- provisa/tools/req_schema.py +194 -0
- provisa/transpiler/__init__.py +9 -0
- provisa/transpiler/router.py +241 -0
- provisa/transpiler/transpile.py +182 -0
- provisa/transpiler/transpile_correlated.py +970 -0
- provisa/ui_server.py +141 -0
- provisa/vector/__init__.py +11 -0
- provisa/vector/cache_invalidation.py +71 -0
- provisa/vector/capability.py +42 -0
- provisa/vector/fallback_cache.py +101 -0
- provisa/vector/generation.py +85 -0
- provisa/vector/governance.py +47 -0
- provisa/vector/providers.py +117 -0
- provisa/vector/query.py +98 -0
- provisa/vector/registry.py +74 -0
- provisa/vector/scheduled_refresh.py +65 -0
- provisa/vector/support.py +44 -0
- provisa/webhooks/__init__.py +15 -0
- provisa/webhooks/executor.py +98 -0
- provisa-0.1.0a244.dist-info/METADATA +129 -0
- provisa-0.1.0a244.dist-info/RECORD +747 -0
- provisa-0.1.0a244.dist-info/WHEEL +5 -0
- provisa-0.1.0a244.dist-info/entry_points.txt +2 -0
- provisa-0.1.0a244.dist-info/licenses/LICENSE +89 -0
- provisa-0.1.0a244.dist-info/licenses/NOTICE +26 -0
- 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 ""
|