sqlspec 0.36.0__cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.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.
- ac8f31065839703b4e70__mypyc.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/__init__.py +140 -0
- sqlspec/__main__.py +12 -0
- sqlspec/__metadata__.py +14 -0
- sqlspec/_serialization.py +315 -0
- sqlspec/_typing.py +700 -0
- sqlspec/adapters/__init__.py +0 -0
- sqlspec/adapters/adbc/__init__.py +5 -0
- sqlspec/adapters/adbc/_typing.py +82 -0
- sqlspec/adapters/adbc/adk/__init__.py +5 -0
- sqlspec/adapters/adbc/adk/store.py +1273 -0
- sqlspec/adapters/adbc/config.py +295 -0
- sqlspec/adapters/adbc/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/adbc/core.py +735 -0
- sqlspec/adapters/adbc/data_dictionary.py +334 -0
- sqlspec/adapters/adbc/driver.py +529 -0
- sqlspec/adapters/adbc/events/__init__.py +5 -0
- sqlspec/adapters/adbc/events/store.py +285 -0
- sqlspec/adapters/adbc/litestar/__init__.py +5 -0
- sqlspec/adapters/adbc/litestar/store.py +502 -0
- sqlspec/adapters/adbc/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/adbc/type_converter.py +140 -0
- sqlspec/adapters/aiosqlite/__init__.py +25 -0
- sqlspec/adapters/aiosqlite/_typing.py +82 -0
- sqlspec/adapters/aiosqlite/adk/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/adk/store.py +818 -0
- sqlspec/adapters/aiosqlite/config.py +334 -0
- sqlspec/adapters/aiosqlite/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/aiosqlite/core.py +315 -0
- sqlspec/adapters/aiosqlite/data_dictionary.py +208 -0
- sqlspec/adapters/aiosqlite/driver.py +313 -0
- sqlspec/adapters/aiosqlite/events/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/events/store.py +20 -0
- sqlspec/adapters/aiosqlite/litestar/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/litestar/store.py +279 -0
- sqlspec/adapters/aiosqlite/pool.py +533 -0
- sqlspec/adapters/asyncmy/__init__.py +21 -0
- sqlspec/adapters/asyncmy/_typing.py +87 -0
- sqlspec/adapters/asyncmy/adk/__init__.py +5 -0
- sqlspec/adapters/asyncmy/adk/store.py +703 -0
- sqlspec/adapters/asyncmy/config.py +302 -0
- sqlspec/adapters/asyncmy/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/asyncmy/core.py +360 -0
- sqlspec/adapters/asyncmy/data_dictionary.py +124 -0
- sqlspec/adapters/asyncmy/driver.py +383 -0
- sqlspec/adapters/asyncmy/events/__init__.py +5 -0
- sqlspec/adapters/asyncmy/events/store.py +104 -0
- sqlspec/adapters/asyncmy/litestar/__init__.py +5 -0
- sqlspec/adapters/asyncmy/litestar/store.py +296 -0
- sqlspec/adapters/asyncpg/__init__.py +19 -0
- sqlspec/adapters/asyncpg/_typing.py +88 -0
- sqlspec/adapters/asyncpg/adk/__init__.py +5 -0
- sqlspec/adapters/asyncpg/adk/store.py +748 -0
- sqlspec/adapters/asyncpg/config.py +569 -0
- sqlspec/adapters/asyncpg/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/asyncpg/core.py +367 -0
- sqlspec/adapters/asyncpg/data_dictionary.py +162 -0
- sqlspec/adapters/asyncpg/driver.py +487 -0
- sqlspec/adapters/asyncpg/events/__init__.py +6 -0
- sqlspec/adapters/asyncpg/events/backend.py +286 -0
- sqlspec/adapters/asyncpg/events/store.py +40 -0
- sqlspec/adapters/asyncpg/litestar/__init__.py +5 -0
- sqlspec/adapters/asyncpg/litestar/store.py +251 -0
- sqlspec/adapters/bigquery/__init__.py +14 -0
- sqlspec/adapters/bigquery/_typing.py +86 -0
- sqlspec/adapters/bigquery/adk/__init__.py +5 -0
- sqlspec/adapters/bigquery/adk/store.py +827 -0
- sqlspec/adapters/bigquery/config.py +353 -0
- sqlspec/adapters/bigquery/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/bigquery/core.py +715 -0
- sqlspec/adapters/bigquery/data_dictionary.py +128 -0
- sqlspec/adapters/bigquery/driver.py +548 -0
- sqlspec/adapters/bigquery/events/__init__.py +5 -0
- sqlspec/adapters/bigquery/events/store.py +139 -0
- sqlspec/adapters/bigquery/litestar/__init__.py +5 -0
- sqlspec/adapters/bigquery/litestar/store.py +325 -0
- sqlspec/adapters/bigquery/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/bigquery/type_converter.py +107 -0
- sqlspec/adapters/cockroach_asyncpg/__init__.py +24 -0
- sqlspec/adapters/cockroach_asyncpg/_typing.py +72 -0
- sqlspec/adapters/cockroach_asyncpg/adk/__init__.py +3 -0
- sqlspec/adapters/cockroach_asyncpg/adk/store.py +410 -0
- sqlspec/adapters/cockroach_asyncpg/config.py +238 -0
- sqlspec/adapters/cockroach_asyncpg/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/cockroach_asyncpg/core.py +55 -0
- sqlspec/adapters/cockroach_asyncpg/data_dictionary.py +107 -0
- sqlspec/adapters/cockroach_asyncpg/driver.py +144 -0
- sqlspec/adapters/cockroach_asyncpg/events/__init__.py +3 -0
- sqlspec/adapters/cockroach_asyncpg/events/store.py +20 -0
- sqlspec/adapters/cockroach_asyncpg/litestar/__init__.py +3 -0
- sqlspec/adapters/cockroach_asyncpg/litestar/store.py +142 -0
- sqlspec/adapters/cockroach_psycopg/__init__.py +38 -0
- sqlspec/adapters/cockroach_psycopg/_typing.py +129 -0
- sqlspec/adapters/cockroach_psycopg/adk/__init__.py +13 -0
- sqlspec/adapters/cockroach_psycopg/adk/store.py +868 -0
- sqlspec/adapters/cockroach_psycopg/config.py +484 -0
- sqlspec/adapters/cockroach_psycopg/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/cockroach_psycopg/core.py +63 -0
- sqlspec/adapters/cockroach_psycopg/data_dictionary.py +215 -0
- sqlspec/adapters/cockroach_psycopg/driver.py +284 -0
- sqlspec/adapters/cockroach_psycopg/events/__init__.py +6 -0
- sqlspec/adapters/cockroach_psycopg/events/store.py +34 -0
- sqlspec/adapters/cockroach_psycopg/litestar/__init__.py +3 -0
- sqlspec/adapters/cockroach_psycopg/litestar/store.py +325 -0
- sqlspec/adapters/duckdb/__init__.py +25 -0
- sqlspec/adapters/duckdb/_typing.py +81 -0
- sqlspec/adapters/duckdb/adk/__init__.py +14 -0
- sqlspec/adapters/duckdb/adk/store.py +850 -0
- sqlspec/adapters/duckdb/config.py +463 -0
- sqlspec/adapters/duckdb/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/duckdb/core.py +257 -0
- sqlspec/adapters/duckdb/data_dictionary.py +140 -0
- sqlspec/adapters/duckdb/driver.py +430 -0
- sqlspec/adapters/duckdb/events/__init__.py +5 -0
- sqlspec/adapters/duckdb/events/store.py +57 -0
- sqlspec/adapters/duckdb/litestar/__init__.py +5 -0
- sqlspec/adapters/duckdb/litestar/store.py +330 -0
- sqlspec/adapters/duckdb/pool.py +293 -0
- sqlspec/adapters/duckdb/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/duckdb/type_converter.py +118 -0
- sqlspec/adapters/mock/__init__.py +72 -0
- sqlspec/adapters/mock/_typing.py +147 -0
- sqlspec/adapters/mock/config.py +483 -0
- sqlspec/adapters/mock/core.py +319 -0
- sqlspec/adapters/mock/data_dictionary.py +366 -0
- sqlspec/adapters/mock/driver.py +721 -0
- sqlspec/adapters/mysqlconnector/__init__.py +36 -0
- sqlspec/adapters/mysqlconnector/_typing.py +141 -0
- sqlspec/adapters/mysqlconnector/adk/__init__.py +15 -0
- sqlspec/adapters/mysqlconnector/adk/store.py +1060 -0
- sqlspec/adapters/mysqlconnector/config.py +394 -0
- sqlspec/adapters/mysqlconnector/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/mysqlconnector/core.py +303 -0
- sqlspec/adapters/mysqlconnector/data_dictionary.py +235 -0
- sqlspec/adapters/mysqlconnector/driver.py +483 -0
- sqlspec/adapters/mysqlconnector/events/__init__.py +8 -0
- sqlspec/adapters/mysqlconnector/events/store.py +98 -0
- sqlspec/adapters/mysqlconnector/litestar/__init__.py +5 -0
- sqlspec/adapters/mysqlconnector/litestar/store.py +426 -0
- sqlspec/adapters/oracledb/__init__.py +60 -0
- sqlspec/adapters/oracledb/_numpy_handlers.py +141 -0
- sqlspec/adapters/oracledb/_typing.py +182 -0
- sqlspec/adapters/oracledb/_uuid_handlers.py +166 -0
- sqlspec/adapters/oracledb/adk/__init__.py +10 -0
- sqlspec/adapters/oracledb/adk/store.py +2369 -0
- sqlspec/adapters/oracledb/config.py +550 -0
- sqlspec/adapters/oracledb/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/oracledb/core.py +543 -0
- sqlspec/adapters/oracledb/data_dictionary.py +536 -0
- sqlspec/adapters/oracledb/driver.py +1229 -0
- sqlspec/adapters/oracledb/events/__init__.py +16 -0
- sqlspec/adapters/oracledb/events/backend.py +347 -0
- sqlspec/adapters/oracledb/events/store.py +420 -0
- sqlspec/adapters/oracledb/litestar/__init__.py +5 -0
- sqlspec/adapters/oracledb/litestar/store.py +781 -0
- sqlspec/adapters/oracledb/migrations.py +535 -0
- sqlspec/adapters/oracledb/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/oracledb/type_converter.py +211 -0
- sqlspec/adapters/psqlpy/__init__.py +17 -0
- sqlspec/adapters/psqlpy/_typing.py +79 -0
- sqlspec/adapters/psqlpy/adk/__init__.py +5 -0
- sqlspec/adapters/psqlpy/adk/store.py +766 -0
- sqlspec/adapters/psqlpy/config.py +304 -0
- sqlspec/adapters/psqlpy/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/psqlpy/core.py +480 -0
- sqlspec/adapters/psqlpy/data_dictionary.py +126 -0
- sqlspec/adapters/psqlpy/driver.py +438 -0
- sqlspec/adapters/psqlpy/events/__init__.py +6 -0
- sqlspec/adapters/psqlpy/events/backend.py +310 -0
- sqlspec/adapters/psqlpy/events/store.py +20 -0
- sqlspec/adapters/psqlpy/litestar/__init__.py +5 -0
- sqlspec/adapters/psqlpy/litestar/store.py +270 -0
- sqlspec/adapters/psqlpy/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/psqlpy/type_converter.py +113 -0
- sqlspec/adapters/psycopg/__init__.py +32 -0
- sqlspec/adapters/psycopg/_typing.py +164 -0
- sqlspec/adapters/psycopg/adk/__init__.py +10 -0
- sqlspec/adapters/psycopg/adk/store.py +1387 -0
- sqlspec/adapters/psycopg/config.py +576 -0
- sqlspec/adapters/psycopg/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/psycopg/core.py +450 -0
- sqlspec/adapters/psycopg/data_dictionary.py +289 -0
- sqlspec/adapters/psycopg/driver.py +975 -0
- sqlspec/adapters/psycopg/events/__init__.py +20 -0
- sqlspec/adapters/psycopg/events/backend.py +458 -0
- sqlspec/adapters/psycopg/events/store.py +42 -0
- sqlspec/adapters/psycopg/litestar/__init__.py +5 -0
- sqlspec/adapters/psycopg/litestar/store.py +552 -0
- sqlspec/adapters/psycopg/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/psycopg/type_converter.py +93 -0
- sqlspec/adapters/pymysql/__init__.py +21 -0
- sqlspec/adapters/pymysql/_typing.py +71 -0
- sqlspec/adapters/pymysql/adk/__init__.py +5 -0
- sqlspec/adapters/pymysql/adk/store.py +540 -0
- sqlspec/adapters/pymysql/config.py +195 -0
- sqlspec/adapters/pymysql/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/pymysql/core.py +299 -0
- sqlspec/adapters/pymysql/data_dictionary.py +122 -0
- sqlspec/adapters/pymysql/driver.py +259 -0
- sqlspec/adapters/pymysql/events/__init__.py +5 -0
- sqlspec/adapters/pymysql/events/store.py +50 -0
- sqlspec/adapters/pymysql/litestar/__init__.py +5 -0
- sqlspec/adapters/pymysql/litestar/store.py +232 -0
- sqlspec/adapters/pymysql/pool.py +137 -0
- sqlspec/adapters/spanner/__init__.py +40 -0
- sqlspec/adapters/spanner/_typing.py +86 -0
- sqlspec/adapters/spanner/adk/__init__.py +5 -0
- sqlspec/adapters/spanner/adk/store.py +732 -0
- sqlspec/adapters/spanner/config.py +352 -0
- sqlspec/adapters/spanner/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/spanner/core.py +188 -0
- sqlspec/adapters/spanner/data_dictionary.py +120 -0
- sqlspec/adapters/spanner/dialect/__init__.py +6 -0
- sqlspec/adapters/spanner/dialect/_spangres.py +57 -0
- sqlspec/adapters/spanner/dialect/_spanner.py +130 -0
- sqlspec/adapters/spanner/driver.py +373 -0
- sqlspec/adapters/spanner/events/__init__.py +5 -0
- sqlspec/adapters/spanner/events/store.py +187 -0
- sqlspec/adapters/spanner/litestar/__init__.py +5 -0
- sqlspec/adapters/spanner/litestar/store.py +291 -0
- sqlspec/adapters/spanner/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/spanner/type_converter.py +331 -0
- sqlspec/adapters/sqlite/__init__.py +19 -0
- sqlspec/adapters/sqlite/_typing.py +80 -0
- sqlspec/adapters/sqlite/adk/__init__.py +5 -0
- sqlspec/adapters/sqlite/adk/store.py +958 -0
- sqlspec/adapters/sqlite/config.py +280 -0
- sqlspec/adapters/sqlite/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/sqlite/core.py +312 -0
- sqlspec/adapters/sqlite/data_dictionary.py +202 -0
- sqlspec/adapters/sqlite/driver.py +359 -0
- sqlspec/adapters/sqlite/events/__init__.py +5 -0
- sqlspec/adapters/sqlite/events/store.py +20 -0
- sqlspec/adapters/sqlite/litestar/__init__.py +5 -0
- sqlspec/adapters/sqlite/litestar/store.py +316 -0
- sqlspec/adapters/sqlite/pool.py +198 -0
- sqlspec/adapters/sqlite/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/sqlite/type_converter.py +114 -0
- sqlspec/base.py +747 -0
- sqlspec/builder/__init__.py +179 -0
- sqlspec/builder/_base.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_base.py +1022 -0
- sqlspec/builder/_column.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_column.py +521 -0
- sqlspec/builder/_ddl.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_ddl.py +1642 -0
- sqlspec/builder/_delete.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_delete.py +95 -0
- sqlspec/builder/_dml.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_dml.py +365 -0
- sqlspec/builder/_explain.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_explain.py +579 -0
- sqlspec/builder/_expression_wrappers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_expression_wrappers.py +46 -0
- sqlspec/builder/_factory.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_factory.py +1697 -0
- sqlspec/builder/_insert.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_insert.py +328 -0
- sqlspec/builder/_join.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_join.py +499 -0
- sqlspec/builder/_merge.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_merge.py +821 -0
- sqlspec/builder/_parsing_utils.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_parsing_utils.py +297 -0
- sqlspec/builder/_select.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_select.py +1660 -0
- sqlspec/builder/_temporal.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_temporal.py +139 -0
- sqlspec/builder/_update.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_update.py +173 -0
- sqlspec/builder/_vector_expressions.py +267 -0
- sqlspec/cli.py +911 -0
- sqlspec/config.py +1755 -0
- sqlspec/core/__init__.py +374 -0
- sqlspec/core/_correlation.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/_correlation.py +176 -0
- sqlspec/core/cache.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/cache.py +1069 -0
- sqlspec/core/compiler.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/compiler.py +954 -0
- sqlspec/core/explain.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/explain.py +275 -0
- sqlspec/core/filters.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/filters.py +952 -0
- sqlspec/core/hashing.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/hashing.py +262 -0
- sqlspec/core/metrics.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/metrics.py +83 -0
- sqlspec/core/parameters/__init__.py +71 -0
- sqlspec/core/parameters/_alignment.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_alignment.py +270 -0
- sqlspec/core/parameters/_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_converter.py +543 -0
- sqlspec/core/parameters/_processor.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_processor.py +505 -0
- sqlspec/core/parameters/_registry.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_registry.py +206 -0
- sqlspec/core/parameters/_transformers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_transformers.py +292 -0
- sqlspec/core/parameters/_types.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_types.py +499 -0
- sqlspec/core/parameters/_validator.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_validator.py +180 -0
- sqlspec/core/pipeline.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/pipeline.py +319 -0
- sqlspec/core/query_modifiers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/query_modifiers.py +437 -0
- sqlspec/core/result/__init__.py +23 -0
- sqlspec/core/result/_base.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/result/_base.py +1121 -0
- sqlspec/core/result/_io.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/result/_io.py +28 -0
- sqlspec/core/splitter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/splitter.py +966 -0
- sqlspec/core/stack.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/stack.py +163 -0
- sqlspec/core/statement.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/statement.py +1503 -0
- sqlspec/core/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/type_converter.py +339 -0
- sqlspec/data_dictionary/__init__.py +22 -0
- sqlspec/data_dictionary/_loader.py +123 -0
- sqlspec/data_dictionary/_registry.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/_registry.py +74 -0
- sqlspec/data_dictionary/_types.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/_types.py +121 -0
- sqlspec/data_dictionary/dialects/__init__.py +21 -0
- sqlspec/data_dictionary/dialects/bigquery.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/bigquery.py +49 -0
- sqlspec/data_dictionary/dialects/cockroachdb.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/cockroachdb.py +43 -0
- sqlspec/data_dictionary/dialects/duckdb.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/duckdb.py +47 -0
- sqlspec/data_dictionary/dialects/mysql.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/mysql.py +42 -0
- sqlspec/data_dictionary/dialects/oracle.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/oracle.py +34 -0
- sqlspec/data_dictionary/dialects/postgres.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/postgres.py +46 -0
- sqlspec/data_dictionary/dialects/spanner.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/spanner.py +37 -0
- sqlspec/data_dictionary/dialects/sqlite.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/sqlite.py +42 -0
- sqlspec/data_dictionary/sql/.gitkeep +0 -0
- sqlspec/data_dictionary/sql/bigquery/columns.sql +23 -0
- sqlspec/data_dictionary/sql/bigquery/foreign_keys.sql +34 -0
- sqlspec/data_dictionary/sql/bigquery/indexes.sql +19 -0
- sqlspec/data_dictionary/sql/bigquery/tables.sql +33 -0
- sqlspec/data_dictionary/sql/bigquery/version.sql +3 -0
- sqlspec/data_dictionary/sql/cockroachdb/columns.sql +34 -0
- sqlspec/data_dictionary/sql/cockroachdb/foreign_keys.sql +40 -0
- sqlspec/data_dictionary/sql/cockroachdb/indexes.sql +32 -0
- sqlspec/data_dictionary/sql/cockroachdb/tables.sql +44 -0
- sqlspec/data_dictionary/sql/cockroachdb/version.sql +3 -0
- sqlspec/data_dictionary/sql/duckdb/columns.sql +23 -0
- sqlspec/data_dictionary/sql/duckdb/foreign_keys.sql +36 -0
- sqlspec/data_dictionary/sql/duckdb/indexes.sql +19 -0
- sqlspec/data_dictionary/sql/duckdb/tables.sql +38 -0
- sqlspec/data_dictionary/sql/duckdb/version.sql +3 -0
- sqlspec/data_dictionary/sql/mysql/columns.sql +23 -0
- sqlspec/data_dictionary/sql/mysql/foreign_keys.sql +28 -0
- sqlspec/data_dictionary/sql/mysql/indexes.sql +26 -0
- sqlspec/data_dictionary/sql/mysql/tables.sql +33 -0
- sqlspec/data_dictionary/sql/mysql/version.sql +3 -0
- sqlspec/data_dictionary/sql/oracle/columns.sql +23 -0
- sqlspec/data_dictionary/sql/oracle/foreign_keys.sql +48 -0
- sqlspec/data_dictionary/sql/oracle/indexes.sql +44 -0
- sqlspec/data_dictionary/sql/oracle/tables.sql +25 -0
- sqlspec/data_dictionary/sql/oracle/version.sql +20 -0
- sqlspec/data_dictionary/sql/postgres/columns.sql +34 -0
- sqlspec/data_dictionary/sql/postgres/foreign_keys.sql +40 -0
- sqlspec/data_dictionary/sql/postgres/indexes.sql +56 -0
- sqlspec/data_dictionary/sql/postgres/tables.sql +44 -0
- sqlspec/data_dictionary/sql/postgres/version.sql +3 -0
- sqlspec/data_dictionary/sql/spanner/columns.sql +23 -0
- sqlspec/data_dictionary/sql/spanner/foreign_keys.sql +70 -0
- sqlspec/data_dictionary/sql/spanner/indexes.sql +30 -0
- sqlspec/data_dictionary/sql/spanner/tables.sql +9 -0
- sqlspec/data_dictionary/sql/spanner/version.sql +3 -0
- sqlspec/data_dictionary/sql/sqlite/columns.sql +23 -0
- sqlspec/data_dictionary/sql/sqlite/foreign_keys.sql +22 -0
- sqlspec/data_dictionary/sql/sqlite/indexes.sql +7 -0
- sqlspec/data_dictionary/sql/sqlite/tables.sql +28 -0
- sqlspec/data_dictionary/sql/sqlite/version.sql +3 -0
- sqlspec/driver/__init__.py +32 -0
- sqlspec/driver/_async.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_async.py +1737 -0
- sqlspec/driver/_common.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_common.py +1478 -0
- sqlspec/driver/_sql_helpers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_sql_helpers.py +148 -0
- sqlspec/driver/_storage_helpers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_storage_helpers.py +144 -0
- sqlspec/driver/_sync.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_sync.py +1710 -0
- sqlspec/exceptions.py +338 -0
- sqlspec/extensions/__init__.py +0 -0
- sqlspec/extensions/adk/__init__.py +70 -0
- sqlspec/extensions/adk/_types.py +51 -0
- sqlspec/extensions/adk/converters.py +172 -0
- sqlspec/extensions/adk/memory/__init__.py +69 -0
- sqlspec/extensions/adk/memory/_types.py +30 -0
- sqlspec/extensions/adk/memory/converters.py +149 -0
- sqlspec/extensions/adk/memory/service.py +217 -0
- sqlspec/extensions/adk/memory/store.py +569 -0
- sqlspec/extensions/adk/migrations/0001_create_adk_tables.py +246 -0
- sqlspec/extensions/adk/migrations/__init__.py +0 -0
- sqlspec/extensions/adk/service.py +225 -0
- sqlspec/extensions/adk/store.py +567 -0
- sqlspec/extensions/events/__init__.py +51 -0
- sqlspec/extensions/events/_channel.py +703 -0
- sqlspec/extensions/events/_hints.py +45 -0
- sqlspec/extensions/events/_models.py +23 -0
- sqlspec/extensions/events/_payload.py +69 -0
- sqlspec/extensions/events/_protocols.py +134 -0
- sqlspec/extensions/events/_queue.py +461 -0
- sqlspec/extensions/events/_store.py +209 -0
- sqlspec/extensions/events/migrations/0001_create_event_queue.py +59 -0
- sqlspec/extensions/events/migrations/__init__.py +3 -0
- sqlspec/extensions/fastapi/__init__.py +19 -0
- sqlspec/extensions/fastapi/extension.py +351 -0
- sqlspec/extensions/fastapi/providers.py +607 -0
- sqlspec/extensions/flask/__init__.py +37 -0
- sqlspec/extensions/flask/_state.py +76 -0
- sqlspec/extensions/flask/_utils.py +71 -0
- sqlspec/extensions/flask/extension.py +519 -0
- sqlspec/extensions/litestar/__init__.py +28 -0
- sqlspec/extensions/litestar/_utils.py +52 -0
- sqlspec/extensions/litestar/channels.py +165 -0
- sqlspec/extensions/litestar/cli.py +102 -0
- sqlspec/extensions/litestar/config.py +90 -0
- sqlspec/extensions/litestar/handlers.py +316 -0
- sqlspec/extensions/litestar/migrations/0001_create_session_table.py +137 -0
- sqlspec/extensions/litestar/migrations/__init__.py +3 -0
- sqlspec/extensions/litestar/plugin.py +671 -0
- sqlspec/extensions/litestar/providers.py +526 -0
- sqlspec/extensions/litestar/store.py +296 -0
- sqlspec/extensions/otel/__init__.py +58 -0
- sqlspec/extensions/prometheus/__init__.py +113 -0
- sqlspec/extensions/starlette/__init__.py +19 -0
- sqlspec/extensions/starlette/_state.py +30 -0
- sqlspec/extensions/starlette/_utils.py +96 -0
- sqlspec/extensions/starlette/extension.py +346 -0
- sqlspec/extensions/starlette/middleware.py +235 -0
- sqlspec/loader.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/loader.py +702 -0
- sqlspec/migrations/__init__.py +36 -0
- sqlspec/migrations/base.py +731 -0
- sqlspec/migrations/commands.py +1232 -0
- sqlspec/migrations/context.py +157 -0
- sqlspec/migrations/fix.py +204 -0
- sqlspec/migrations/loaders.py +443 -0
- sqlspec/migrations/runner.py +1172 -0
- sqlspec/migrations/templates.py +234 -0
- sqlspec/migrations/tracker.py +611 -0
- sqlspec/migrations/utils.py +256 -0
- sqlspec/migrations/validation.py +207 -0
- sqlspec/migrations/version.py +446 -0
- sqlspec/observability/__init__.py +55 -0
- sqlspec/observability/_common.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_common.py +77 -0
- sqlspec/observability/_config.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_config.py +348 -0
- sqlspec/observability/_diagnostics.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_diagnostics.py +74 -0
- sqlspec/observability/_dispatcher.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_dispatcher.py +152 -0
- sqlspec/observability/_formatters/__init__.py +13 -0
- sqlspec/observability/_formatters/_aws.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_formatters/_aws.py +102 -0
- sqlspec/observability/_formatters/_azure.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_formatters/_azure.py +96 -0
- sqlspec/observability/_formatters/_base.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_formatters/_base.py +57 -0
- sqlspec/observability/_formatters/_gcp.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_formatters/_gcp.py +131 -0
- sqlspec/observability/_formatting.py +58 -0
- sqlspec/observability/_observer.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_observer.py +357 -0
- sqlspec/observability/_runtime.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_runtime.py +420 -0
- sqlspec/observability/_sampling.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_sampling.py +188 -0
- sqlspec/observability/_spans.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_spans.py +161 -0
- sqlspec/protocols.py +916 -0
- sqlspec/py.typed +0 -0
- sqlspec/storage/__init__.py +48 -0
- sqlspec/storage/_utils.py +104 -0
- sqlspec/storage/backends/__init__.py +1 -0
- sqlspec/storage/backends/base.py +253 -0
- sqlspec/storage/backends/fsspec.py +529 -0
- sqlspec/storage/backends/local.py +441 -0
- sqlspec/storage/backends/obstore.py +916 -0
- sqlspec/storage/errors.py +104 -0
- sqlspec/storage/pipeline.py +582 -0
- sqlspec/storage/registry.py +301 -0
- sqlspec/typing.py +395 -0
- sqlspec/utils/__init__.py +7 -0
- sqlspec/utils/arrow_helpers.py +318 -0
- sqlspec/utils/config_tools.py +332 -0
- sqlspec/utils/correlation.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/correlation.py +134 -0
- sqlspec/utils/deprecation.py +190 -0
- sqlspec/utils/fixtures.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/fixtures.py +258 -0
- sqlspec/utils/logging.py +222 -0
- sqlspec/utils/module_loader.py +306 -0
- sqlspec/utils/portal.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/portal.py +375 -0
- sqlspec/utils/schema.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/schema.py +485 -0
- sqlspec/utils/serializers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/serializers.py +408 -0
- sqlspec/utils/singleton.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/singleton.py +41 -0
- sqlspec/utils/sync_tools.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/sync_tools.py +311 -0
- sqlspec/utils/text.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/text.py +108 -0
- sqlspec/utils/type_converters.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/type_converters.py +128 -0
- sqlspec/utils/type_guards.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/type_guards.py +1360 -0
- sqlspec/utils/uuids.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/uuids.py +225 -0
- sqlspec-0.36.0.dist-info/METADATA +205 -0
- sqlspec-0.36.0.dist-info/RECORD +531 -0
- sqlspec-0.36.0.dist-info/WHEEL +7 -0
- sqlspec-0.36.0.dist-info/entry_points.txt +2 -0
- sqlspec-0.36.0.dist-info/licenses/LICENSE +21 -0
|
Binary file
|
|
@@ -0,0 +1,521 @@
|
|
|
1
|
+
"""Column expressions for query building.
|
|
2
|
+
|
|
3
|
+
Provides Column objects that support Python operators for building
|
|
4
|
+
SQL conditions with parameter binding.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from collections.abc import Iterable
|
|
8
|
+
from datetime import date, datetime
|
|
9
|
+
from typing import Any, cast
|
|
10
|
+
|
|
11
|
+
from sqlglot import exp
|
|
12
|
+
|
|
13
|
+
from sqlspec.builder._vector_expressions import VectorDistance
|
|
14
|
+
|
|
15
|
+
__all__ = ("Column", "ColumnExpression", "FunctionColumn")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _convert_value(value: Any) -> exp.Expression:
|
|
19
|
+
"""Convert a Python value to a SQLGlot expression.
|
|
20
|
+
|
|
21
|
+
Special handling for datetime objects to prevent SQLGlot from
|
|
22
|
+
converting them to TIME_STR_TO_TIME function calls. Datetime
|
|
23
|
+
objects should be passed as parameters, not converted to SQL functions.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
value: The value to convert
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
A SQLGlot expression representing the value
|
|
30
|
+
"""
|
|
31
|
+
if isinstance(value, (datetime, date)):
|
|
32
|
+
return exp.Literal(this=value, is_string=False)
|
|
33
|
+
return exp.convert(value)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class ColumnExpression:
|
|
37
|
+
"""Base class for column expressions that can be combined with operators."""
|
|
38
|
+
|
|
39
|
+
__slots__ = ("_expression",)
|
|
40
|
+
|
|
41
|
+
def __init__(self, expression: exp.Expression) -> None:
|
|
42
|
+
self._expression = expression
|
|
43
|
+
|
|
44
|
+
def __and__(self, other: "ColumnExpression") -> "ColumnExpression":
|
|
45
|
+
"""Combine with AND operator (&)."""
|
|
46
|
+
if not isinstance(other, ColumnExpression):
|
|
47
|
+
return NotImplemented
|
|
48
|
+
return ColumnExpression(exp.And(this=self._expression, expression=other._expression))
|
|
49
|
+
|
|
50
|
+
def __or__(self, other: "ColumnExpression") -> "ColumnExpression":
|
|
51
|
+
"""Combine with OR operator (|)."""
|
|
52
|
+
if not isinstance(other, ColumnExpression):
|
|
53
|
+
return NotImplemented
|
|
54
|
+
return ColumnExpression(exp.Or(this=self._expression, expression=other._expression))
|
|
55
|
+
|
|
56
|
+
def __invert__(self) -> "ColumnExpression":
|
|
57
|
+
"""Apply NOT operator (~)."""
|
|
58
|
+
return ColumnExpression(exp.Not(this=self._expression))
|
|
59
|
+
|
|
60
|
+
def __bool__(self) -> bool:
|
|
61
|
+
"""Prevent accidental use of 'and'/'or' keywords."""
|
|
62
|
+
msg = (
|
|
63
|
+
"Cannot use 'and'/'or' operators on ColumnExpression. "
|
|
64
|
+
"Use '&'/'|' operators instead. "
|
|
65
|
+
f"Expression: {self._expression.sql()}"
|
|
66
|
+
)
|
|
67
|
+
raise TypeError(msg)
|
|
68
|
+
|
|
69
|
+
@property
|
|
70
|
+
def sqlglot_expression(self) -> exp.Expression:
|
|
71
|
+
"""Get the underlying SQLGlot expression."""
|
|
72
|
+
return self._expression
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class Column:
|
|
76
|
+
"""Represents a database column with Python operator support."""
|
|
77
|
+
|
|
78
|
+
__slots__ = ("_expression", "name", "table")
|
|
79
|
+
|
|
80
|
+
def __init__(self, name: str, table: str | None = None) -> None:
|
|
81
|
+
self.name = name
|
|
82
|
+
self.table = table
|
|
83
|
+
|
|
84
|
+
if table:
|
|
85
|
+
self._expression = exp.Column(this=exp.Identifier(this=name), table=exp.Identifier(this=table))
|
|
86
|
+
else:
|
|
87
|
+
self._expression = exp.Column(this=exp.Identifier(this=name))
|
|
88
|
+
|
|
89
|
+
def _convert_value(self, value: Any) -> exp.Expression:
|
|
90
|
+
"""Convert a Python value to a SQLGlot expression."""
|
|
91
|
+
return _convert_value(value)
|
|
92
|
+
|
|
93
|
+
def __eq__(self, other: object) -> ColumnExpression: # type: ignore[override]
|
|
94
|
+
"""Equal to (==)."""
|
|
95
|
+
if other is None:
|
|
96
|
+
return ColumnExpression(exp.Is(this=self._expression, expression=exp.Null()))
|
|
97
|
+
return ColumnExpression(exp.EQ(this=self._expression, expression=self._convert_value(other)))
|
|
98
|
+
|
|
99
|
+
def __ne__(self, other: object) -> ColumnExpression: # type: ignore[override]
|
|
100
|
+
"""Not equal to (!=)."""
|
|
101
|
+
if other is None:
|
|
102
|
+
return ColumnExpression(exp.Not(this=exp.Is(this=self._expression, expression=exp.Null())))
|
|
103
|
+
return ColumnExpression(exp.NEQ(this=self._expression, expression=self._convert_value(other)))
|
|
104
|
+
|
|
105
|
+
def __gt__(self, other: Any) -> ColumnExpression:
|
|
106
|
+
"""Greater than (>)."""
|
|
107
|
+
return ColumnExpression(exp.GT(this=self._expression, expression=self._convert_value(other)))
|
|
108
|
+
|
|
109
|
+
def __ge__(self, other: Any) -> ColumnExpression:
|
|
110
|
+
"""Greater than or equal (>=)."""
|
|
111
|
+
return ColumnExpression(exp.GTE(this=self._expression, expression=self._convert_value(other)))
|
|
112
|
+
|
|
113
|
+
def __lt__(self, other: Any) -> ColumnExpression:
|
|
114
|
+
"""Less than (<)."""
|
|
115
|
+
return ColumnExpression(exp.LT(this=self._expression, expression=self._convert_value(other)))
|
|
116
|
+
|
|
117
|
+
def __le__(self, other: Any) -> ColumnExpression:
|
|
118
|
+
"""Less than or equal (<=)."""
|
|
119
|
+
return ColumnExpression(exp.LTE(this=self._expression, expression=self._convert_value(other)))
|
|
120
|
+
|
|
121
|
+
def __invert__(self) -> ColumnExpression:
|
|
122
|
+
"""Apply NOT operator (~)."""
|
|
123
|
+
return ColumnExpression(exp.Not(this=self._expression))
|
|
124
|
+
|
|
125
|
+
def like(self, pattern: str, escape: str | None = None) -> ColumnExpression:
|
|
126
|
+
"""SQL LIKE pattern matching."""
|
|
127
|
+
if escape:
|
|
128
|
+
like_expr = exp.Like(
|
|
129
|
+
this=self._expression, expression=self._convert_value(pattern), escape=self._convert_value(escape)
|
|
130
|
+
)
|
|
131
|
+
else:
|
|
132
|
+
like_expr = exp.Like(this=self._expression, expression=self._convert_value(pattern))
|
|
133
|
+
return ColumnExpression(like_expr)
|
|
134
|
+
|
|
135
|
+
def ilike(self, pattern: str) -> ColumnExpression:
|
|
136
|
+
"""Case-insensitive LIKE."""
|
|
137
|
+
return ColumnExpression(exp.ILike(this=self._expression, expression=self._convert_value(pattern)))
|
|
138
|
+
|
|
139
|
+
def in_(self, values: Iterable[Any]) -> ColumnExpression:
|
|
140
|
+
"""SQL IN clause."""
|
|
141
|
+
converted_values = [self._convert_value(v) for v in values]
|
|
142
|
+
return ColumnExpression(exp.In(this=self._expression, expressions=converted_values))
|
|
143
|
+
|
|
144
|
+
def not_in(self, values: Iterable[Any]) -> ColumnExpression:
|
|
145
|
+
"""SQL NOT IN clause."""
|
|
146
|
+
return ~self.in_(values)
|
|
147
|
+
|
|
148
|
+
def between(self, start: Any, end: Any) -> ColumnExpression:
|
|
149
|
+
"""SQL BETWEEN clause."""
|
|
150
|
+
return ColumnExpression(
|
|
151
|
+
exp.Between(this=self._expression, low=self._convert_value(start), high=self._convert_value(end))
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
def is_null(self) -> ColumnExpression:
|
|
155
|
+
"""SQL IS NULL."""
|
|
156
|
+
return ColumnExpression(exp.Is(this=self._expression, expression=exp.Null()))
|
|
157
|
+
|
|
158
|
+
def is_not_null(self) -> ColumnExpression:
|
|
159
|
+
"""SQL IS NOT NULL."""
|
|
160
|
+
return ColumnExpression(exp.Not(this=exp.Is(this=self._expression, expression=exp.Null())))
|
|
161
|
+
|
|
162
|
+
def not_like(self, pattern: str, escape: str | None = None) -> ColumnExpression:
|
|
163
|
+
"""SQL NOT LIKE pattern matching."""
|
|
164
|
+
return ~self.like(pattern, escape)
|
|
165
|
+
|
|
166
|
+
def not_ilike(self, pattern: str) -> ColumnExpression:
|
|
167
|
+
"""Case-insensitive NOT LIKE."""
|
|
168
|
+
return ~self.ilike(pattern)
|
|
169
|
+
|
|
170
|
+
def any_(self, values: Iterable[Any]) -> ColumnExpression:
|
|
171
|
+
"""SQL = ANY(...) clause."""
|
|
172
|
+
converted_values = [self._convert_value(v) for v in values]
|
|
173
|
+
return ColumnExpression(exp.EQ(this=self._expression, expression=exp.Any(expressions=converted_values)))
|
|
174
|
+
|
|
175
|
+
def not_any_(self, values: Iterable[Any]) -> ColumnExpression:
|
|
176
|
+
"""SQL <> ANY(...) clause."""
|
|
177
|
+
converted_values = [self._convert_value(v) for v in values]
|
|
178
|
+
return ColumnExpression(exp.NEQ(this=self._expression, expression=exp.Any(expressions=converted_values)))
|
|
179
|
+
|
|
180
|
+
def lower(self) -> "FunctionColumn":
|
|
181
|
+
"""SQL LOWER() function."""
|
|
182
|
+
return FunctionColumn(exp.Lower(this=self._expression))
|
|
183
|
+
|
|
184
|
+
def upper(self) -> "FunctionColumn":
|
|
185
|
+
"""SQL UPPER() function."""
|
|
186
|
+
return FunctionColumn(exp.Upper(this=self._expression))
|
|
187
|
+
|
|
188
|
+
def length(self) -> "FunctionColumn":
|
|
189
|
+
"""SQL LENGTH() function."""
|
|
190
|
+
return FunctionColumn(exp.Length(this=self._expression))
|
|
191
|
+
|
|
192
|
+
def trim(self) -> "FunctionColumn":
|
|
193
|
+
"""SQL TRIM() function."""
|
|
194
|
+
return FunctionColumn(exp.Trim(this=self._expression))
|
|
195
|
+
|
|
196
|
+
def abs(self) -> "FunctionColumn":
|
|
197
|
+
"""SQL ABS() function."""
|
|
198
|
+
return FunctionColumn(exp.Abs(this=self._expression))
|
|
199
|
+
|
|
200
|
+
def round(self, decimals: int = 0) -> "FunctionColumn":
|
|
201
|
+
"""SQL ROUND() function."""
|
|
202
|
+
if decimals == 0:
|
|
203
|
+
return FunctionColumn(exp.Round(this=self._expression))
|
|
204
|
+
return FunctionColumn(exp.Round(this=self._expression, expression=exp.convert(decimals)))
|
|
205
|
+
|
|
206
|
+
def floor(self) -> "FunctionColumn":
|
|
207
|
+
"""SQL FLOOR() function."""
|
|
208
|
+
return FunctionColumn(exp.Floor(this=self._expression))
|
|
209
|
+
|
|
210
|
+
def ceil(self) -> "FunctionColumn":
|
|
211
|
+
"""SQL CEIL() function."""
|
|
212
|
+
return FunctionColumn(exp.Ceil(this=self._expression))
|
|
213
|
+
|
|
214
|
+
def substring(self, start: int, length: int | None = None) -> "FunctionColumn":
|
|
215
|
+
"""SQL SUBSTRING() function."""
|
|
216
|
+
args = [self._convert_value(start)]
|
|
217
|
+
if length is not None:
|
|
218
|
+
args.append(self._convert_value(length))
|
|
219
|
+
return FunctionColumn(exp.Substring(this=self._expression, expressions=args))
|
|
220
|
+
|
|
221
|
+
def coalesce(self, *values: Any) -> "FunctionColumn":
|
|
222
|
+
"""SQL COALESCE() function."""
|
|
223
|
+
expressions = [self._expression] + [self._convert_value(v) for v in values]
|
|
224
|
+
return FunctionColumn(exp.Coalesce(expressions=expressions))
|
|
225
|
+
|
|
226
|
+
def cast(self, data_type: str) -> "FunctionColumn":
|
|
227
|
+
"""SQL CAST() function."""
|
|
228
|
+
return FunctionColumn(exp.Cast(this=self._expression, to=exp.DataType.build(data_type)))
|
|
229
|
+
|
|
230
|
+
def count(self) -> "FunctionColumn":
|
|
231
|
+
"""SQL COUNT() function."""
|
|
232
|
+
return FunctionColumn(exp.Count(this=self._expression))
|
|
233
|
+
|
|
234
|
+
def sum(self) -> "FunctionColumn":
|
|
235
|
+
"""SQL SUM() function."""
|
|
236
|
+
return FunctionColumn(exp.Sum(this=self._expression))
|
|
237
|
+
|
|
238
|
+
def avg(self) -> "FunctionColumn":
|
|
239
|
+
"""SQL AVG() function."""
|
|
240
|
+
return FunctionColumn(exp.Avg(this=self._expression))
|
|
241
|
+
|
|
242
|
+
def min(self) -> "FunctionColumn":
|
|
243
|
+
"""SQL MIN() function."""
|
|
244
|
+
return FunctionColumn(exp.Min(this=self._expression))
|
|
245
|
+
|
|
246
|
+
def max(self) -> "FunctionColumn":
|
|
247
|
+
"""SQL MAX() function."""
|
|
248
|
+
return FunctionColumn(exp.Max(this=self._expression))
|
|
249
|
+
|
|
250
|
+
def count_distinct(self) -> "FunctionColumn":
|
|
251
|
+
"""SQL COUNT(DISTINCT column) function."""
|
|
252
|
+
return FunctionColumn(exp.Count(this=exp.Distinct(expressions=[self._expression])))
|
|
253
|
+
|
|
254
|
+
@staticmethod
|
|
255
|
+
def count_all() -> "FunctionColumn":
|
|
256
|
+
"""SQL COUNT(*) function."""
|
|
257
|
+
return FunctionColumn(exp.Count(this=exp.Star()))
|
|
258
|
+
|
|
259
|
+
@staticmethod
|
|
260
|
+
def _normalize_metric(metric: str) -> str:
|
|
261
|
+
"""Normalize and validate vector distance metric."""
|
|
262
|
+
normalized_metric = metric.lower()
|
|
263
|
+
valid_metrics = {"euclidean", "cosine", "inner_product", "euclidean_squared"}
|
|
264
|
+
if normalized_metric not in valid_metrics:
|
|
265
|
+
msg = f"Invalid metric: {metric}. Must be one of {valid_metrics}"
|
|
266
|
+
raise ValueError(msg)
|
|
267
|
+
return normalized_metric
|
|
268
|
+
|
|
269
|
+
def _convert_vector_value(self, value: "list[float] | Column | exp.Expression") -> "exp.Expression":
|
|
270
|
+
"""Convert a vector input into a SQLGlot expression."""
|
|
271
|
+
if isinstance(value, list):
|
|
272
|
+
return exp.Array(expressions=[exp.Literal.number(v) for v in value])
|
|
273
|
+
if isinstance(value, Column):
|
|
274
|
+
return value._expression
|
|
275
|
+
if isinstance(value, exp.Expression):
|
|
276
|
+
return value
|
|
277
|
+
msg = f"Unsupported vector type: {type(value)}"
|
|
278
|
+
raise TypeError(msg)
|
|
279
|
+
|
|
280
|
+
def vector_distance(
|
|
281
|
+
self, other_vector: "list[float] | Column | exp.Expression", metric: str = "euclidean"
|
|
282
|
+
) -> "FunctionColumn":
|
|
283
|
+
"""Calculate vector distance using specified metric.
|
|
284
|
+
|
|
285
|
+
Generates dialect-specific SQL for vector distance calculation:
|
|
286
|
+
- PostgreSQL (pgvector): Operators <->, <=>, <#>
|
|
287
|
+
- MySQL 9+: DISTANCE(col, vec, 'METRIC') function
|
|
288
|
+
- Oracle 23ai+: VECTOR_DISTANCE(col, vec, METRIC) function
|
|
289
|
+
|
|
290
|
+
Args:
|
|
291
|
+
other_vector: Vector to compare against (list, Column, or SQLGlot expression).
|
|
292
|
+
metric: Distance metric to use. Options:
|
|
293
|
+
- "euclidean": L2 distance (default)
|
|
294
|
+
- "cosine": Cosine distance
|
|
295
|
+
- "inner_product": Negative inner product
|
|
296
|
+
- "euclidean_squared": L2² distance (Oracle only)
|
|
297
|
+
|
|
298
|
+
Returns:
|
|
299
|
+
FunctionColumn expression for use in SELECT, WHERE, ORDER BY.
|
|
300
|
+
|
|
301
|
+
Examples:
|
|
302
|
+
Basic distance query with threshold:
|
|
303
|
+
>>> query = (
|
|
304
|
+
... sql
|
|
305
|
+
... .select("*")
|
|
306
|
+
... .from_("docs")
|
|
307
|
+
... .where(
|
|
308
|
+
... Column("embedding").vector_distance(
|
|
309
|
+
... [0.1, 0.2], metric="euclidean"
|
|
310
|
+
... )
|
|
311
|
+
... < 0.5
|
|
312
|
+
... )
|
|
313
|
+
... )
|
|
314
|
+
|
|
315
|
+
Distance in SELECT clause with alias:
|
|
316
|
+
>>> query = (
|
|
317
|
+
... sql
|
|
318
|
+
... .select(
|
|
319
|
+
... "id",
|
|
320
|
+
... Column("embedding")
|
|
321
|
+
... .vector_distance([0.1, 0.2])
|
|
322
|
+
... .as_("dist"),
|
|
323
|
+
... )
|
|
324
|
+
... .from_("docs")
|
|
325
|
+
... .order_by("dist")
|
|
326
|
+
... )
|
|
327
|
+
|
|
328
|
+
Compare two vector columns:
|
|
329
|
+
>>> query = (
|
|
330
|
+
... sql
|
|
331
|
+
... .select("*")
|
|
332
|
+
... .from_("pairs")
|
|
333
|
+
... .where(
|
|
334
|
+
... Column("vec1").vector_distance(
|
|
335
|
+
... Column("vec2"), metric="cosine"
|
|
336
|
+
... )
|
|
337
|
+
... < 0.3
|
|
338
|
+
... )
|
|
339
|
+
... )
|
|
340
|
+
"""
|
|
341
|
+
normalized_metric = self._normalize_metric(metric)
|
|
342
|
+
vec_expr = self._convert_vector_value(other_vector)
|
|
343
|
+
distance_expr = VectorDistance(this=self._expression, expression=vec_expr, metric=normalized_metric)
|
|
344
|
+
return FunctionColumn(distance_expr)
|
|
345
|
+
|
|
346
|
+
def cosine_similarity(self, other_vector: "list[float] | Column | exp.Expression") -> "FunctionColumn":
|
|
347
|
+
"""Calculate cosine similarity (1 - cosine_distance).
|
|
348
|
+
|
|
349
|
+
Convenience method that computes similarity instead of distance.
|
|
350
|
+
Returns values in range [-1, 1] where 1 = identical vectors.
|
|
351
|
+
|
|
352
|
+
Args:
|
|
353
|
+
other_vector: Vector to compare against (list, Column, or expression).
|
|
354
|
+
|
|
355
|
+
Returns:
|
|
356
|
+
FunctionColumn expression: 1 - cosine_distance(self, other_vector).
|
|
357
|
+
|
|
358
|
+
Examples:
|
|
359
|
+
Find most similar documents:
|
|
360
|
+
>>> query = (
|
|
361
|
+
... sql
|
|
362
|
+
... .select(
|
|
363
|
+
... "id",
|
|
364
|
+
... Column("embedding")
|
|
365
|
+
... .cosine_similarity([0.1, 0.2])
|
|
366
|
+
... .as_("score"),
|
|
367
|
+
... )
|
|
368
|
+
... .from_("docs")
|
|
369
|
+
... .order_by(sql.column("score").desc())
|
|
370
|
+
... .limit(10)
|
|
371
|
+
... )
|
|
372
|
+
"""
|
|
373
|
+
cosine_dist = self.vector_distance(other_vector, metric="cosine")
|
|
374
|
+
similarity_expr = exp.Sub(this=exp.Literal.number(1), expression=exp.Paren(this=cosine_dist._expression)) # pyright: ignore[reportPrivateUsage]
|
|
375
|
+
return FunctionColumn(similarity_expr)
|
|
376
|
+
|
|
377
|
+
def alias(self, alias_name: str) -> exp.Expression:
|
|
378
|
+
"""Create an aliased column expression."""
|
|
379
|
+
return exp.Alias(this=self._expression, alias=alias_name)
|
|
380
|
+
|
|
381
|
+
def asc(self) -> exp.Ordered:
|
|
382
|
+
"""Create an ASC ordering expression."""
|
|
383
|
+
return exp.Ordered(this=self._expression, desc=False)
|
|
384
|
+
|
|
385
|
+
def desc(self) -> exp.Ordered:
|
|
386
|
+
"""Create a DESC ordering expression."""
|
|
387
|
+
return exp.Ordered(this=self._expression, desc=True)
|
|
388
|
+
|
|
389
|
+
def as_(self, alias: str) -> exp.Alias:
|
|
390
|
+
"""Create an aliased expression."""
|
|
391
|
+
return cast("exp.Alias", exp.alias_(self._expression, alias))
|
|
392
|
+
|
|
393
|
+
def __repr__(self) -> str:
|
|
394
|
+
if self.table:
|
|
395
|
+
return f"Column<{self.table}.{self.name}>"
|
|
396
|
+
return f"Column<{self.name}>"
|
|
397
|
+
|
|
398
|
+
def __hash__(self) -> int:
|
|
399
|
+
"""Hash based on table and column name."""
|
|
400
|
+
return hash((self.table, self.name))
|
|
401
|
+
|
|
402
|
+
@property
|
|
403
|
+
def sqlglot_expression(self) -> exp.Expression:
|
|
404
|
+
"""Get the underlying SQLGlot expression (public API).
|
|
405
|
+
|
|
406
|
+
Returns:
|
|
407
|
+
The SQLGlot expression for this column
|
|
408
|
+
"""
|
|
409
|
+
return self._expression
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
class FunctionColumn:
|
|
413
|
+
"""Represents the result of a SQL function call on a column."""
|
|
414
|
+
|
|
415
|
+
__slots__ = ("_expression",)
|
|
416
|
+
|
|
417
|
+
def __init__(self, expression: "exp.Expression") -> None:
|
|
418
|
+
self._expression = expression
|
|
419
|
+
|
|
420
|
+
def _convert_value(self, value: Any) -> exp.Expression:
|
|
421
|
+
"""Convert a Python value to a SQLGlot expression."""
|
|
422
|
+
return _convert_value(value)
|
|
423
|
+
|
|
424
|
+
@property
|
|
425
|
+
def sqlglot_expression(self) -> "exp.Expression":
|
|
426
|
+
"""Return underlying SQLGlot expression."""
|
|
427
|
+
return self._expression
|
|
428
|
+
|
|
429
|
+
def __eq__(self, other: object) -> ColumnExpression: # type: ignore[override]
|
|
430
|
+
return ColumnExpression(exp.EQ(this=self._expression, expression=self._convert_value(other)))
|
|
431
|
+
|
|
432
|
+
def __ne__(self, other: object) -> ColumnExpression: # type: ignore[override]
|
|
433
|
+
return ColumnExpression(exp.NEQ(this=self._expression, expression=self._convert_value(other)))
|
|
434
|
+
|
|
435
|
+
def __gt__(self, other: Any) -> ColumnExpression:
|
|
436
|
+
"""Greater than (>)."""
|
|
437
|
+
return ColumnExpression(exp.GT(this=self._expression, expression=self._convert_value(other)))
|
|
438
|
+
|
|
439
|
+
def __ge__(self, other: Any) -> ColumnExpression:
|
|
440
|
+
"""Greater than or equal (>=)."""
|
|
441
|
+
return ColumnExpression(exp.GTE(this=self._expression, expression=self._convert_value(other)))
|
|
442
|
+
|
|
443
|
+
def __lt__(self, other: Any) -> ColumnExpression:
|
|
444
|
+
"""Less than (<)."""
|
|
445
|
+
return ColumnExpression(exp.LT(this=self._expression, expression=self._convert_value(other)))
|
|
446
|
+
|
|
447
|
+
def __le__(self, other: Any) -> ColumnExpression:
|
|
448
|
+
"""Less than or equal (<=)."""
|
|
449
|
+
return ColumnExpression(exp.LTE(this=self._expression, expression=self._convert_value(other)))
|
|
450
|
+
|
|
451
|
+
def like(self, pattern: str) -> ColumnExpression:
|
|
452
|
+
return ColumnExpression(exp.Like(this=self._expression, expression=self._convert_value(pattern)))
|
|
453
|
+
|
|
454
|
+
def ilike(self, pattern: str) -> ColumnExpression:
|
|
455
|
+
"""Case-insensitive LIKE."""
|
|
456
|
+
return ColumnExpression(exp.ILike(this=self._expression, expression=self._convert_value(pattern)))
|
|
457
|
+
|
|
458
|
+
def in_(self, values: Iterable[Any]) -> ColumnExpression:
|
|
459
|
+
"""SQL IN clause."""
|
|
460
|
+
converted_values = [self._convert_value(v) for v in values]
|
|
461
|
+
return ColumnExpression(exp.In(this=self._expression, expressions=converted_values))
|
|
462
|
+
|
|
463
|
+
def not_in_(self, values: Iterable[Any]) -> ColumnExpression:
|
|
464
|
+
"""SQL NOT IN clause."""
|
|
465
|
+
return ~self.in_(values)
|
|
466
|
+
|
|
467
|
+
def not_like(self, pattern: str) -> ColumnExpression:
|
|
468
|
+
"""SQL NOT LIKE."""
|
|
469
|
+
return ~self.like(pattern)
|
|
470
|
+
|
|
471
|
+
def not_ilike(self, pattern: str) -> ColumnExpression:
|
|
472
|
+
"""Case-insensitive NOT LIKE."""
|
|
473
|
+
return ~self.ilike(pattern)
|
|
474
|
+
|
|
475
|
+
def between(self, start: Any, end: Any) -> ColumnExpression:
|
|
476
|
+
"""SQL BETWEEN clause."""
|
|
477
|
+
return ColumnExpression(
|
|
478
|
+
exp.Between(this=self._expression, low=self._convert_value(start), high=self._convert_value(end))
|
|
479
|
+
)
|
|
480
|
+
|
|
481
|
+
def is_null(self) -> ColumnExpression:
|
|
482
|
+
"""SQL IS NULL."""
|
|
483
|
+
return ColumnExpression(exp.Is(this=self._expression, expression=exp.Null()))
|
|
484
|
+
|
|
485
|
+
def is_not_null(self) -> ColumnExpression:
|
|
486
|
+
"""SQL IS NOT NULL."""
|
|
487
|
+
return ColumnExpression(exp.Not(this=exp.Is(this=self._expression, expression=exp.Null())))
|
|
488
|
+
|
|
489
|
+
def any_(self, values: Iterable[Any]) -> ColumnExpression:
|
|
490
|
+
"""SQL = ANY(...) clause."""
|
|
491
|
+
converted_values = [self._convert_value(v) for v in values]
|
|
492
|
+
return ColumnExpression(exp.EQ(this=self._expression, expression=exp.Any(expressions=converted_values)))
|
|
493
|
+
|
|
494
|
+
def not_any_(self, values: Iterable[Any]) -> ColumnExpression:
|
|
495
|
+
"""SQL <> ANY(...) clause."""
|
|
496
|
+
converted_values = [self._convert_value(v) for v in values]
|
|
497
|
+
return ColumnExpression(exp.NEQ(this=self._expression, expression=exp.Any(expressions=converted_values)))
|
|
498
|
+
|
|
499
|
+
def alias(self, alias_name: str) -> "exp.Expression":
|
|
500
|
+
"""Create an aliased function expression."""
|
|
501
|
+
return exp.Alias(this=self._expression, alias=alias_name)
|
|
502
|
+
|
|
503
|
+
def as_(self, alias: str) -> "exp.Alias":
|
|
504
|
+
"""Create an aliased expression using sqlglot helper."""
|
|
505
|
+
return cast("exp.Alias", exp.alias_(self._expression, alias))
|
|
506
|
+
|
|
507
|
+
def cast(self, data_type: str) -> "FunctionColumn":
|
|
508
|
+
"""SQL CAST() function."""
|
|
509
|
+
return FunctionColumn(exp.Cast(this=self._expression, to=exp.DataType.build(data_type)))
|
|
510
|
+
|
|
511
|
+
def asc(self) -> "exp.Ordered":
|
|
512
|
+
"""Create an ASC ordering expression."""
|
|
513
|
+
return exp.Ordered(this=self._expression, desc=False)
|
|
514
|
+
|
|
515
|
+
def desc(self) -> "exp.Ordered":
|
|
516
|
+
"""Create a DESC ordering expression."""
|
|
517
|
+
return exp.Ordered(this=self._expression, desc=True)
|
|
518
|
+
|
|
519
|
+
def __hash__(self) -> int:
|
|
520
|
+
"""Hash based on the SQL expression."""
|
|
521
|
+
return hash(self._expression.sql())
|
|
Binary file
|