1+ # Install pyarrow, adbc-driver-manager and duckdb before running this example
2+ # This example currently can be run only with duckdb<=1.1.3, later versions of duckdb no longer support substrait in adbc
3+ # /// script
4+ # dependencies = [
5+ # "pyarrow==20.0.0",
6+ # "adbc-driver-manager==1.5.0",
7+ # "duckdb==1.1.3",
8+ # "substrait[extensions] @ file:///${PROJECT_ROOT}/"
9+ # ]
10+ # ///
11+
12+
13+ import adbc_driver_duckdb .dbapi
14+ import pyarrow
15+ from substrait .builders .plan import read_named_table , filter
16+ from substrait .builders .extended_expression import scalar_function , column , literal
17+ from substrait .builders .type import i64
18+ from substrait .extension_registry import ExtensionRegistry
19+ import pyarrow .substrait as pa_substrait
20+
21+ registry = ExtensionRegistry ()
22+
23+ data = pyarrow .record_batch (
24+ [[1 , 2 , 3 , 4 ], ["a" , "b" , "c" , "d" ]],
25+ names = ["ints" , "strs" ],
26+ )
27+
28+ def read_adbc_named_table (name : str , conn ):
29+ pa_schema = conn .adbc_get_table_schema (name )
30+ substrait_schema = pa_substrait .serialize_schema (pa_schema ).to_pysubstrait ().base_schema
31+ return read_named_table (name , substrait_schema )
32+
33+ with adbc_driver_duckdb .dbapi .connect (":memory:" ) as conn :
34+ with conn .cursor () as cur :
35+ cur .adbc_ingest ("AnswerToEverything" , data )
36+
37+ cur .executescript ("INSTALL substrait;" )
38+ cur .executescript ("LOAD substrait;" )
39+
40+ table = read_adbc_named_table ("AnswerToEverything" , conn )
41+ table = filter (table , expression = scalar_function ('functions_comparison.yaml' , 'gte' , column ('ints' ), literal (3 , i64 ())))
42+
43+ cur .execute (table (registry ).SerializeToString ())
44+ print (cur .fetch_arrow_table ())
0 commit comments