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
|
@@ -0,0 +1,569 @@
|
|
|
1
|
+
"""Base store classes for ADK memory backend (sync and async)."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
import re
|
|
5
|
+
from abc import ABC, abstractmethod
|
|
6
|
+
from typing import TYPE_CHECKING, Any, Final, Generic, TypeVar, cast
|
|
7
|
+
|
|
8
|
+
from typing_extensions import NotRequired, TypedDict
|
|
9
|
+
|
|
10
|
+
from sqlspec.observability import resolve_db_system
|
|
11
|
+
from sqlspec.utils.logging import get_logger, log_with_context
|
|
12
|
+
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from sqlspec.config import ADKConfig, DatabaseConfigProtocol
|
|
15
|
+
from sqlspec.extensions.adk.memory._types import MemoryRecord
|
|
16
|
+
|
|
17
|
+
ConfigT = TypeVar("ConfigT", bound="DatabaseConfigProtocol[Any, Any, Any]")
|
|
18
|
+
|
|
19
|
+
logger = get_logger("sqlspec.extensions.adk.memory.store")
|
|
20
|
+
|
|
21
|
+
__all__ = ("BaseAsyncADKMemoryStore", "BaseSyncADKMemoryStore")
|
|
22
|
+
|
|
23
|
+
VALID_TABLE_NAME_PATTERN: Final = re.compile(r"^[a-zA-Z_][a-zA-Z0-9_]*$")
|
|
24
|
+
COLUMN_NAME_PATTERN: Final = re.compile(r"^(\w+)")
|
|
25
|
+
MAX_TABLE_NAME_LENGTH: Final = 63
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class _ADKMemoryStoreConfig(TypedDict):
|
|
29
|
+
"""Normalized ADK memory store configuration."""
|
|
30
|
+
|
|
31
|
+
enable_memory: bool
|
|
32
|
+
memory_table: str
|
|
33
|
+
use_fts: bool
|
|
34
|
+
max_results: int
|
|
35
|
+
owner_id_column: NotRequired[str]
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _parse_owner_id_column(owner_id_column_ddl: str) -> str:
|
|
39
|
+
"""Extract column name from owner ID column DDL definition.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
owner_id_column_ddl: Full column DDL string.
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
Column name only (first word).
|
|
46
|
+
|
|
47
|
+
Raises:
|
|
48
|
+
ValueError: If DDL format is invalid.
|
|
49
|
+
"""
|
|
50
|
+
match = COLUMN_NAME_PATTERN.match(owner_id_column_ddl.strip())
|
|
51
|
+
if not match:
|
|
52
|
+
msg = f"Invalid owner_id_column DDL: {owner_id_column_ddl!r}. Must start with column name."
|
|
53
|
+
raise ValueError(msg)
|
|
54
|
+
|
|
55
|
+
return match.group(1)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def _validate_table_name(table_name: str) -> None:
|
|
59
|
+
"""Validate table name for SQL safety.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
table_name: Table name to validate.
|
|
63
|
+
|
|
64
|
+
Raises:
|
|
65
|
+
ValueError: If table name is invalid.
|
|
66
|
+
"""
|
|
67
|
+
if not table_name:
|
|
68
|
+
msg = "Table name cannot be empty"
|
|
69
|
+
raise ValueError(msg)
|
|
70
|
+
|
|
71
|
+
if len(table_name) > MAX_TABLE_NAME_LENGTH:
|
|
72
|
+
msg = f"Table name too long: {len(table_name)} chars (max {MAX_TABLE_NAME_LENGTH})"
|
|
73
|
+
raise ValueError(msg)
|
|
74
|
+
|
|
75
|
+
if not VALID_TABLE_NAME_PATTERN.match(table_name):
|
|
76
|
+
msg = (
|
|
77
|
+
f"Invalid table name: {table_name!r}. "
|
|
78
|
+
"Must start with letter/underscore and contain only alphanumeric characters and underscores"
|
|
79
|
+
)
|
|
80
|
+
raise ValueError(msg)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class BaseAsyncADKMemoryStore(ABC, Generic[ConfigT]):
|
|
84
|
+
"""Base class for async SQLSpec-backed ADK memory stores.
|
|
85
|
+
|
|
86
|
+
Implements storage operations for Google ADK memory entries using
|
|
87
|
+
SQLSpec database adapters with async/await.
|
|
88
|
+
|
|
89
|
+
This abstract base class provides common functionality for all database-specific
|
|
90
|
+
memory store implementations including:
|
|
91
|
+
- Connection management via SQLSpec configs
|
|
92
|
+
- Table name validation
|
|
93
|
+
- Memory entry CRUD operations
|
|
94
|
+
- Text search with optional full-text search support
|
|
95
|
+
|
|
96
|
+
Subclasses must implement dialect-specific SQL queries and will be created
|
|
97
|
+
in each adapter directory (e.g., sqlspec/adapters/asyncpg/adk/store.py).
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
config: SQLSpec database configuration with extension_config["adk"] settings.
|
|
101
|
+
|
|
102
|
+
Notes:
|
|
103
|
+
Configuration is read from config.extension_config["adk"]:
|
|
104
|
+
- memory_table: Memory table name (default: "adk_memory_entries")
|
|
105
|
+
- memory_use_fts: Enable full-text search when supported (default: False)
|
|
106
|
+
- memory_max_results: Max search results (default: 20)
|
|
107
|
+
- owner_id_column: Optional owner FK column DDL (default: None)
|
|
108
|
+
- enable_memory: Whether memory is enabled (default: True)
|
|
109
|
+
"""
|
|
110
|
+
|
|
111
|
+
__slots__ = (
|
|
112
|
+
"_config",
|
|
113
|
+
"_enabled",
|
|
114
|
+
"_max_results",
|
|
115
|
+
"_memory_table",
|
|
116
|
+
"_owner_id_column_ddl",
|
|
117
|
+
"_owner_id_column_name",
|
|
118
|
+
"_use_fts",
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
def __init__(self, config: ConfigT) -> None:
|
|
122
|
+
"""Initialize the ADK memory store.
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
config: SQLSpec database configuration.
|
|
126
|
+
|
|
127
|
+
Notes:
|
|
128
|
+
Reads configuration from config.extension_config["adk"]:
|
|
129
|
+
- memory_table: Memory table name (default: "adk_memory_entries")
|
|
130
|
+
- memory_use_fts: Enable full-text search when supported (default: False)
|
|
131
|
+
- memory_max_results: Max search results (default: 20)
|
|
132
|
+
- owner_id_column: Optional owner FK column DDL (default: None)
|
|
133
|
+
- enable_memory: Whether memory is enabled (default: True)
|
|
134
|
+
"""
|
|
135
|
+
self._config = config
|
|
136
|
+
store_config = self._get_store_config_from_extension()
|
|
137
|
+
self._enabled: bool = store_config.get("enable_memory", True)
|
|
138
|
+
self._memory_table: str = str(store_config["memory_table"])
|
|
139
|
+
self._use_fts: bool = bool(store_config.get("use_fts", False))
|
|
140
|
+
self._max_results: int = store_config.get("max_results", 20)
|
|
141
|
+
self._owner_id_column_ddl: str | None = store_config.get("owner_id_column")
|
|
142
|
+
self._owner_id_column_name: str | None = (
|
|
143
|
+
_parse_owner_id_column(self._owner_id_column_ddl) if self._owner_id_column_ddl else None
|
|
144
|
+
)
|
|
145
|
+
_validate_table_name(self._memory_table)
|
|
146
|
+
|
|
147
|
+
def _get_store_config_from_extension(self) -> "_ADKMemoryStoreConfig":
|
|
148
|
+
"""Extract ADK memory configuration from config.extension_config.
|
|
149
|
+
|
|
150
|
+
Returns:
|
|
151
|
+
Dict with memory_table, use_fts, max_results, and optionally owner_id_column.
|
|
152
|
+
"""
|
|
153
|
+
extension_config = self._config.extension_config
|
|
154
|
+
adk_config = cast("ADKConfig", extension_config.get("adk", {}))
|
|
155
|
+
enable_memory = adk_config.get("enable_memory")
|
|
156
|
+
memory_table = adk_config.get("memory_table")
|
|
157
|
+
use_fts = adk_config.get("memory_use_fts")
|
|
158
|
+
max_results = adk_config.get("memory_max_results")
|
|
159
|
+
|
|
160
|
+
result: _ADKMemoryStoreConfig = {
|
|
161
|
+
"enable_memory": bool(enable_memory) if enable_memory is not None else True,
|
|
162
|
+
"memory_table": str(memory_table) if memory_table is not None else "adk_memory_entries",
|
|
163
|
+
"use_fts": bool(use_fts) if use_fts is not None else False,
|
|
164
|
+
"max_results": int(max_results) if isinstance(max_results, int) else 20,
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
owner_id = adk_config.get("owner_id_column")
|
|
168
|
+
if owner_id is not None:
|
|
169
|
+
result["owner_id_column"] = owner_id
|
|
170
|
+
|
|
171
|
+
return result
|
|
172
|
+
|
|
173
|
+
@property
|
|
174
|
+
def config(self) -> ConfigT:
|
|
175
|
+
"""Return the database configuration."""
|
|
176
|
+
return self._config
|
|
177
|
+
|
|
178
|
+
@property
|
|
179
|
+
def memory_table(self) -> str:
|
|
180
|
+
"""Return the memory table name."""
|
|
181
|
+
return self._memory_table
|
|
182
|
+
|
|
183
|
+
@property
|
|
184
|
+
def enabled(self) -> bool:
|
|
185
|
+
"""Return whether memory store is enabled."""
|
|
186
|
+
return self._enabled
|
|
187
|
+
|
|
188
|
+
@property
|
|
189
|
+
def use_fts(self) -> bool:
|
|
190
|
+
"""Return whether full-text search is enabled."""
|
|
191
|
+
return self._use_fts
|
|
192
|
+
|
|
193
|
+
@property
|
|
194
|
+
def max_results(self) -> int:
|
|
195
|
+
"""Return the max search results limit."""
|
|
196
|
+
return self._max_results
|
|
197
|
+
|
|
198
|
+
@property
|
|
199
|
+
def owner_id_column_ddl(self) -> "str | None":
|
|
200
|
+
"""Return the full owner ID column DDL (or None if not configured)."""
|
|
201
|
+
return self._owner_id_column_ddl
|
|
202
|
+
|
|
203
|
+
@property
|
|
204
|
+
def owner_id_column_name(self) -> "str | None":
|
|
205
|
+
"""Return the owner ID column name only (or None if not configured)."""
|
|
206
|
+
return self._owner_id_column_name
|
|
207
|
+
|
|
208
|
+
@abstractmethod
|
|
209
|
+
async def create_tables(self) -> None:
|
|
210
|
+
"""Create the memory table and indexes if they don't exist.
|
|
211
|
+
|
|
212
|
+
Should check self._enabled and skip table creation if False.
|
|
213
|
+
"""
|
|
214
|
+
raise NotImplementedError
|
|
215
|
+
|
|
216
|
+
async def ensure_tables(self) -> None:
|
|
217
|
+
"""Create tables when enabled and emit a standardized log entry."""
|
|
218
|
+
|
|
219
|
+
if not self._enabled:
|
|
220
|
+
self._log_memory_table_skipped()
|
|
221
|
+
return
|
|
222
|
+
await self.create_tables()
|
|
223
|
+
self._log_memory_table_created()
|
|
224
|
+
|
|
225
|
+
@abstractmethod
|
|
226
|
+
async def insert_memory_entries(self, entries: "list[MemoryRecord]", owner_id: "object | None" = None) -> int:
|
|
227
|
+
"""Bulk insert memory entries with deduplication.
|
|
228
|
+
|
|
229
|
+
Uses UPSERT pattern to skip duplicates based on event_id.
|
|
230
|
+
|
|
231
|
+
Args:
|
|
232
|
+
entries: List of memory records to insert.
|
|
233
|
+
owner_id: Optional owner ID value for owner_id_column (if configured).
|
|
234
|
+
|
|
235
|
+
Returns:
|
|
236
|
+
Number of entries actually inserted (excludes duplicates).
|
|
237
|
+
|
|
238
|
+
Raises:
|
|
239
|
+
RuntimeError: If memory store is disabled.
|
|
240
|
+
"""
|
|
241
|
+
raise NotImplementedError
|
|
242
|
+
|
|
243
|
+
def _log_memory_table_created(self) -> None:
|
|
244
|
+
log_with_context(
|
|
245
|
+
logger,
|
|
246
|
+
logging.DEBUG,
|
|
247
|
+
"adk.memory.table.ready",
|
|
248
|
+
db_system=resolve_db_system(type(self).__name__),
|
|
249
|
+
memory_table=self._memory_table,
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
def _log_memory_table_skipped(self) -> None:
|
|
253
|
+
log_with_context(
|
|
254
|
+
logger,
|
|
255
|
+
logging.DEBUG,
|
|
256
|
+
"adk.memory.table.skipped",
|
|
257
|
+
db_system=resolve_db_system(type(self).__name__),
|
|
258
|
+
memory_table=self._memory_table,
|
|
259
|
+
reason="disabled",
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
@abstractmethod
|
|
263
|
+
async def search_entries(
|
|
264
|
+
self, query: str, app_name: str, user_id: str, limit: "int | None" = None
|
|
265
|
+
) -> "list[MemoryRecord]":
|
|
266
|
+
"""Search memory entries by text query.
|
|
267
|
+
|
|
268
|
+
Uses the configured search strategy (simple ILIKE or FTS).
|
|
269
|
+
|
|
270
|
+
Args:
|
|
271
|
+
query: Text query to search for.
|
|
272
|
+
app_name: Application name to filter by.
|
|
273
|
+
user_id: User ID to filter by.
|
|
274
|
+
limit: Maximum number of results (defaults to max_results config).
|
|
275
|
+
|
|
276
|
+
Returns:
|
|
277
|
+
List of matching memory records ordered by relevance/timestamp.
|
|
278
|
+
|
|
279
|
+
Raises:
|
|
280
|
+
RuntimeError: If memory store is disabled.
|
|
281
|
+
"""
|
|
282
|
+
raise NotImplementedError
|
|
283
|
+
|
|
284
|
+
@abstractmethod
|
|
285
|
+
async def delete_entries_by_session(self, session_id: str) -> int:
|
|
286
|
+
"""Delete all memory entries for a specific session.
|
|
287
|
+
|
|
288
|
+
Args:
|
|
289
|
+
session_id: Session ID to delete entries for.
|
|
290
|
+
|
|
291
|
+
Returns:
|
|
292
|
+
Number of entries deleted.
|
|
293
|
+
"""
|
|
294
|
+
raise NotImplementedError
|
|
295
|
+
|
|
296
|
+
@abstractmethod
|
|
297
|
+
async def delete_entries_older_than(self, days: int) -> int:
|
|
298
|
+
"""Delete memory entries older than specified days.
|
|
299
|
+
|
|
300
|
+
Used for TTL cleanup operations.
|
|
301
|
+
|
|
302
|
+
Args:
|
|
303
|
+
days: Number of days to retain entries.
|
|
304
|
+
|
|
305
|
+
Returns:
|
|
306
|
+
Number of entries deleted.
|
|
307
|
+
"""
|
|
308
|
+
raise NotImplementedError
|
|
309
|
+
|
|
310
|
+
@abstractmethod
|
|
311
|
+
async def _get_create_memory_table_sql(self) -> "str | list[str]":
|
|
312
|
+
"""Get the CREATE TABLE SQL for the memory table.
|
|
313
|
+
|
|
314
|
+
Returns:
|
|
315
|
+
SQL statement(s) to create the memory table with indexes.
|
|
316
|
+
"""
|
|
317
|
+
raise NotImplementedError
|
|
318
|
+
|
|
319
|
+
@abstractmethod
|
|
320
|
+
def _get_drop_memory_table_sql(self) -> "list[str]":
|
|
321
|
+
"""Get the DROP TABLE SQL statements for this database dialect.
|
|
322
|
+
|
|
323
|
+
Returns:
|
|
324
|
+
List of SQL statements to drop the memory table and indexes.
|
|
325
|
+
"""
|
|
326
|
+
raise NotImplementedError
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
class BaseSyncADKMemoryStore(ABC, Generic[ConfigT]):
|
|
330
|
+
"""Base class for sync SQLSpec-backed ADK memory stores.
|
|
331
|
+
|
|
332
|
+
Implements storage operations for Google ADK memory entries using
|
|
333
|
+
SQLSpec database adapters with synchronous execution.
|
|
334
|
+
|
|
335
|
+
This abstract base class provides common functionality for sync database-specific
|
|
336
|
+
memory store implementations including:
|
|
337
|
+
- Connection management via SQLSpec configs
|
|
338
|
+
- Table name validation
|
|
339
|
+
- Memory entry CRUD operations
|
|
340
|
+
- Text search with optional full-text search support
|
|
341
|
+
|
|
342
|
+
Subclasses must implement dialect-specific SQL queries and will be created
|
|
343
|
+
in each adapter directory (e.g., sqlspec/adapters/sqlite/adk/store.py).
|
|
344
|
+
|
|
345
|
+
Args:
|
|
346
|
+
config: SQLSpec database configuration with extension_config["adk"] settings.
|
|
347
|
+
|
|
348
|
+
Notes:
|
|
349
|
+
Configuration is read from config.extension_config["adk"]:
|
|
350
|
+
- memory_table: Memory table name (default: "adk_memory_entries")
|
|
351
|
+
- memory_use_fts: Enable full-text search when supported (default: False)
|
|
352
|
+
- memory_max_results: Max search results (default: 20)
|
|
353
|
+
- owner_id_column: Optional owner FK column DDL (default: None)
|
|
354
|
+
- enable_memory: Whether memory is enabled (default: True)
|
|
355
|
+
"""
|
|
356
|
+
|
|
357
|
+
__slots__ = (
|
|
358
|
+
"_config",
|
|
359
|
+
"_enabled",
|
|
360
|
+
"_max_results",
|
|
361
|
+
"_memory_table",
|
|
362
|
+
"_owner_id_column_ddl",
|
|
363
|
+
"_owner_id_column_name",
|
|
364
|
+
"_use_fts",
|
|
365
|
+
)
|
|
366
|
+
|
|
367
|
+
def __init__(self, config: ConfigT) -> None:
|
|
368
|
+
"""Initialize the sync ADK memory store.
|
|
369
|
+
|
|
370
|
+
Args:
|
|
371
|
+
config: SQLSpec database configuration.
|
|
372
|
+
|
|
373
|
+
Notes:
|
|
374
|
+
Reads configuration from config.extension_config["adk"]:
|
|
375
|
+
- memory_table: Memory table name (default: "adk_memory_entries")
|
|
376
|
+
- memory_use_fts: Enable full-text search when supported (default: False)
|
|
377
|
+
- memory_max_results: Max search results (default: 20)
|
|
378
|
+
- owner_id_column: Optional owner FK column DDL (default: None)
|
|
379
|
+
- enable_memory: Whether memory is enabled (default: True)
|
|
380
|
+
"""
|
|
381
|
+
self._config = config
|
|
382
|
+
store_config = self._get_store_config_from_extension()
|
|
383
|
+
self._enabled: bool = store_config.get("enable_memory", True)
|
|
384
|
+
self._memory_table: str = str(store_config["memory_table"])
|
|
385
|
+
self._use_fts: bool = bool(store_config.get("use_fts", False))
|
|
386
|
+
self._max_results: int = store_config.get("max_results", 20)
|
|
387
|
+
self._owner_id_column_ddl: str | None = store_config.get("owner_id_column")
|
|
388
|
+
self._owner_id_column_name: str | None = (
|
|
389
|
+
_parse_owner_id_column(self._owner_id_column_ddl) if self._owner_id_column_ddl else None
|
|
390
|
+
)
|
|
391
|
+
_validate_table_name(self._memory_table)
|
|
392
|
+
|
|
393
|
+
def _get_store_config_from_extension(self) -> "_ADKMemoryStoreConfig":
|
|
394
|
+
"""Extract ADK memory configuration from config.extension_config.
|
|
395
|
+
|
|
396
|
+
Returns:
|
|
397
|
+
Dict with memory_table, use_fts, max_results, and optionally owner_id_column.
|
|
398
|
+
"""
|
|
399
|
+
extension_config = self._config.extension_config
|
|
400
|
+
adk_config = cast("ADKConfig", extension_config.get("adk", {}))
|
|
401
|
+
enable_memory = adk_config.get("enable_memory")
|
|
402
|
+
memory_table = adk_config.get("memory_table")
|
|
403
|
+
use_fts = adk_config.get("memory_use_fts")
|
|
404
|
+
max_results = adk_config.get("memory_max_results")
|
|
405
|
+
|
|
406
|
+
result: _ADKMemoryStoreConfig = {
|
|
407
|
+
"enable_memory": bool(enable_memory) if enable_memory is not None else True,
|
|
408
|
+
"memory_table": str(memory_table) if memory_table is not None else "adk_memory_entries",
|
|
409
|
+
"use_fts": bool(use_fts) if use_fts is not None else False,
|
|
410
|
+
"max_results": int(max_results) if isinstance(max_results, int) else 20,
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
owner_id = adk_config.get("owner_id_column")
|
|
414
|
+
if owner_id is not None:
|
|
415
|
+
result["owner_id_column"] = owner_id
|
|
416
|
+
|
|
417
|
+
return result
|
|
418
|
+
|
|
419
|
+
@property
|
|
420
|
+
def config(self) -> ConfigT:
|
|
421
|
+
"""Return the database configuration."""
|
|
422
|
+
return self._config
|
|
423
|
+
|
|
424
|
+
@property
|
|
425
|
+
def memory_table(self) -> str:
|
|
426
|
+
"""Return the memory table name."""
|
|
427
|
+
return self._memory_table
|
|
428
|
+
|
|
429
|
+
@property
|
|
430
|
+
def enabled(self) -> bool:
|
|
431
|
+
"""Return whether memory store is enabled."""
|
|
432
|
+
return self._enabled
|
|
433
|
+
|
|
434
|
+
@property
|
|
435
|
+
def use_fts(self) -> bool:
|
|
436
|
+
"""Return whether full-text search is enabled."""
|
|
437
|
+
return self._use_fts
|
|
438
|
+
|
|
439
|
+
@property
|
|
440
|
+
def max_results(self) -> int:
|
|
441
|
+
"""Return the max search results limit."""
|
|
442
|
+
return self._max_results
|
|
443
|
+
|
|
444
|
+
@property
|
|
445
|
+
def owner_id_column_ddl(self) -> "str | None":
|
|
446
|
+
"""Return the full owner ID column DDL (or None if not configured)."""
|
|
447
|
+
return self._owner_id_column_ddl
|
|
448
|
+
|
|
449
|
+
@property
|
|
450
|
+
def owner_id_column_name(self) -> "str | None":
|
|
451
|
+
"""Return the owner ID column name only (or None if not configured)."""
|
|
452
|
+
return self._owner_id_column_name
|
|
453
|
+
|
|
454
|
+
@abstractmethod
|
|
455
|
+
def create_tables(self) -> None:
|
|
456
|
+
"""Create the memory table and indexes if they don't exist.
|
|
457
|
+
|
|
458
|
+
Should check self._enabled and skip table creation if False.
|
|
459
|
+
"""
|
|
460
|
+
raise NotImplementedError
|
|
461
|
+
|
|
462
|
+
def ensure_tables(self) -> None:
|
|
463
|
+
"""Create tables when enabled and emit a standardized log entry."""
|
|
464
|
+
|
|
465
|
+
if not self._enabled:
|
|
466
|
+
self._log_memory_table_skipped()
|
|
467
|
+
return
|
|
468
|
+
self.create_tables()
|
|
469
|
+
self._log_memory_table_created()
|
|
470
|
+
|
|
471
|
+
@abstractmethod
|
|
472
|
+
def insert_memory_entries(self, entries: "list[MemoryRecord]", owner_id: "object | None" = None) -> int:
|
|
473
|
+
"""Bulk insert memory entries with deduplication.
|
|
474
|
+
|
|
475
|
+
Uses UPSERT pattern to skip duplicates based on event_id.
|
|
476
|
+
|
|
477
|
+
Args:
|
|
478
|
+
entries: List of memory records to insert.
|
|
479
|
+
owner_id: Optional owner ID value for owner_id_column (if configured).
|
|
480
|
+
|
|
481
|
+
Returns:
|
|
482
|
+
Number of entries actually inserted (excludes duplicates).
|
|
483
|
+
|
|
484
|
+
Raises:
|
|
485
|
+
RuntimeError: If memory store is disabled.
|
|
486
|
+
"""
|
|
487
|
+
raise NotImplementedError
|
|
488
|
+
|
|
489
|
+
def _log_memory_table_created(self) -> None:
|
|
490
|
+
logger.debug(
|
|
491
|
+
"ADK memory table ready",
|
|
492
|
+
extra={"db.system": resolve_db_system(type(self).__name__), "memory_table": self._memory_table},
|
|
493
|
+
)
|
|
494
|
+
|
|
495
|
+
def _log_memory_table_skipped(self) -> None:
|
|
496
|
+
logger.debug(
|
|
497
|
+
"ADK memory table creation skipped",
|
|
498
|
+
extra={
|
|
499
|
+
"db.system": resolve_db_system(type(self).__name__),
|
|
500
|
+
"memory_table": self._memory_table,
|
|
501
|
+
"reason": "disabled",
|
|
502
|
+
},
|
|
503
|
+
)
|
|
504
|
+
|
|
505
|
+
@abstractmethod
|
|
506
|
+
def search_entries(
|
|
507
|
+
self, query: str, app_name: str, user_id: str, limit: "int | None" = None
|
|
508
|
+
) -> "list[MemoryRecord]":
|
|
509
|
+
"""Search memory entries by text query.
|
|
510
|
+
|
|
511
|
+
Uses the configured search strategy (simple ILIKE or FTS).
|
|
512
|
+
|
|
513
|
+
Args:
|
|
514
|
+
query: Text query to search for.
|
|
515
|
+
app_name: Application name to filter by.
|
|
516
|
+
user_id: User ID to filter by.
|
|
517
|
+
limit: Maximum number of results (defaults to max_results config).
|
|
518
|
+
|
|
519
|
+
Returns:
|
|
520
|
+
List of matching memory records ordered by relevance/timestamp.
|
|
521
|
+
|
|
522
|
+
Raises:
|
|
523
|
+
RuntimeError: If memory store is disabled.
|
|
524
|
+
"""
|
|
525
|
+
raise NotImplementedError
|
|
526
|
+
|
|
527
|
+
@abstractmethod
|
|
528
|
+
def delete_entries_by_session(self, session_id: str) -> int:
|
|
529
|
+
"""Delete all memory entries for a specific session.
|
|
530
|
+
|
|
531
|
+
Args:
|
|
532
|
+
session_id: Session ID to delete entries for.
|
|
533
|
+
|
|
534
|
+
Returns:
|
|
535
|
+
Number of entries deleted.
|
|
536
|
+
"""
|
|
537
|
+
raise NotImplementedError
|
|
538
|
+
|
|
539
|
+
@abstractmethod
|
|
540
|
+
def delete_entries_older_than(self, days: int) -> int:
|
|
541
|
+
"""Delete memory entries older than specified days.
|
|
542
|
+
|
|
543
|
+
Used for TTL cleanup operations.
|
|
544
|
+
|
|
545
|
+
Args:
|
|
546
|
+
days: Number of days to retain entries.
|
|
547
|
+
|
|
548
|
+
Returns:
|
|
549
|
+
Number of entries deleted.
|
|
550
|
+
"""
|
|
551
|
+
raise NotImplementedError
|
|
552
|
+
|
|
553
|
+
@abstractmethod
|
|
554
|
+
def _get_create_memory_table_sql(self) -> "str | list[str]":
|
|
555
|
+
"""Get the CREATE TABLE SQL for the memory table.
|
|
556
|
+
|
|
557
|
+
Returns:
|
|
558
|
+
SQL statement(s) to create the memory table with indexes.
|
|
559
|
+
"""
|
|
560
|
+
raise NotImplementedError
|
|
561
|
+
|
|
562
|
+
@abstractmethod
|
|
563
|
+
def _get_drop_memory_table_sql(self) -> "list[str]":
|
|
564
|
+
"""Get the DROP TABLE SQL statements for this database dialect.
|
|
565
|
+
|
|
566
|
+
Returns:
|
|
567
|
+
List of SQL statements to drop the memory table and indexes.
|
|
568
|
+
"""
|
|
569
|
+
raise NotImplementedError
|