diff --git a/Cargo.lock b/Cargo.lock index 0dc52e53bd..2892070cc7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -145,9 +145,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" [[package]] name = "arc-swap" @@ -351,7 +351,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.74", + "syn 2.0.79", ] [[package]] @@ -373,7 +373,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.74", + "syn 2.0.79", ] [[package]] @@ -384,7 +384,7 @@ checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" dependencies = [ "proc-macro2", "quote", - "syn 2.0.74", + "syn 2.0.79", ] [[package]] @@ -393,6 +393,12 @@ version = "0.15.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ae037714f313c1353189ead58ef9eec30a8e8dc101b2622d461418fd59e28a9" +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "atty" version = "0.2.14" @@ -470,8 +476,8 @@ dependencies = [ "bytes", "fastrand 1.9.0", "hex", - "http", - "hyper", + "http 0.2.12", + "hyper 0.14.30", "ring 0.16.20", "time", "tokio", @@ -503,7 +509,7 @@ dependencies = [ "aws-smithy-http", "aws-smithy-types", "aws-types", - "http", + "http 0.2.12", "regex", "tracing", ] @@ -519,8 +525,8 @@ dependencies = [ "aws-smithy-types", "aws-types", "bytes", - "http", - "http-body", + "http 0.2.12", + "http-body 0.4.6", "lazy_static", "percent-encoding", "pin-project-lite", @@ -549,8 +555,8 @@ dependencies = [ "aws-smithy-xml", "aws-types", "bytes", - "http", - "http-body", + "http 0.2.12", + "http-body 0.4.6", "once_cell", "percent-encoding", "regex", @@ -578,7 +584,7 @@ dependencies = [ "aws-smithy-types", "aws-types", "bytes", - "http", + "http 0.2.12", "regex", "tokio-stream", "tower", @@ -605,7 +611,7 @@ dependencies = [ "aws-smithy-xml", "aws-types", "bytes", - "http", + "http 0.2.12", "regex", "tower", "tracing", @@ -622,7 +628,7 @@ dependencies = [ "aws-smithy-eventstream", "aws-smithy-http", "aws-types", - "http", + "http 0.2.12", "tracing", ] @@ -638,7 +644,7 @@ dependencies = [ "form_urlencoded", "hex", "hmac", - "http", + "http 0.2.12", "once_cell", "percent-encoding", "regex", @@ -671,8 +677,8 @@ dependencies = [ "crc32c", "crc32fast", "hex", - "http", - "http-body", + "http 0.2.12", + "http-body 0.4.6", "md-5", "pin-project-lite", "sha1", @@ -692,9 +698,9 @@ dependencies = [ "aws-smithy-types", "bytes", "fastrand 1.9.0", - "http", - "http-body", - "hyper", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.30", "hyper-tls", "pin-project-lite", "tokio", @@ -724,9 +730,9 @@ dependencies = [ "bytes", "bytes-utils", "futures-core", - "http", - "http-body", - "hyper", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.30", "once_cell", "percent-encoding", "pin-project-lite", @@ -745,8 +751,8 @@ dependencies = [ "aws-smithy-http", "aws-smithy-types", "bytes", - "http", - "http-body", + "http 0.2.12", + "http-body 0.4.6", "pin-project-lite", "tower", "tracing", @@ -804,11 +810,58 @@ dependencies = [ "aws-smithy-client", "aws-smithy-http", "aws-smithy-types", - "http", + "http 0.2.12", "rustc_version", "tracing", ] +[[package]] +name = "axum" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" +dependencies = [ + "async-trait", + "axum-core", + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper 1.0.1", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper 1.0.1", + "tower-layer", + "tower-service", +] + [[package]] name = "azure_core" version = "0.17.0" @@ -1075,7 +1128,7 @@ checksum = "1ee891b04274a59bd38b412188e24b849617b2e45a0fd8d057deb63e7403761b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.74", + "syn 2.0.79", ] [[package]] @@ -1677,6 +1730,7 @@ dependencies = [ "common-tracing", "common-version", "daft-compression", + "daft-connect", "daft-core", "daft-csv", "daft-dsl", @@ -1714,6 +1768,35 @@ dependencies = [ "url", ] +[[package]] +name = "daft-connect" +version = "0.3.0-dev0" +dependencies = [ + "arrow2", + "common-daft-config", + "common-error", + "daft-core", + "daft-dsl", + "daft-local-execution", + "daft-micropartition", + "daft-physical-plan", + "daft-plan", + "daft-schema", + "daft-table", + "dashmap", + "eyre", + "futures", + "pyo3", + "spark-connect", + "tempfile", + "tokio", + "tonic", + "tracing", + "tracing-subscriber", + "tracing-tree", + "uuid 1.10.0", +] + [[package]] name = "daft-core" version = "0.3.0-dev0" @@ -1896,7 +1979,7 @@ dependencies = [ "google-cloud-storage", "google-cloud-token", "home", - "hyper", + "hyper 0.14.30", "hyper-tls", "itertools 0.11.0", "lazy_static", @@ -2218,6 +2301,20 @@ dependencies = [ "serde", ] +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "deflate64" version = "0.1.9" @@ -2273,7 +2370,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.74", + "syn 2.0.79", "unicode-xid", ] @@ -2420,6 +2517,16 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + [[package]] name = "fallible-streaming-iterator" version = "0.1.9" @@ -2524,9 +2631,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -2539,9 +2646,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -2549,15 +2656,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -2566,9 +2673,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" @@ -2587,26 +2694,26 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.74", + "syn 2.0.79", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-timer" @@ -2616,9 +2723,9 @@ checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -2785,7 +2892,26 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "http", + "http 0.2.12", + "indexmap 2.5.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.1.0", "indexmap 2.5.0", "slab", "tokio", @@ -2923,6 +3049,17 @@ dependencies = [ "itoa", ] +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + [[package]] name = "http-body" version = "0.4.6" @@ -2930,7 +3067,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", - "http", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", "pin-project-lite", ] @@ -2976,9 +3136,9 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2", - "http", - "http-body", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", "httparse", "httpdate", "itoa", @@ -2990,6 +3150,40 @@ dependencies = [ "want", ] +[[package]] +name = "hyper" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2 0.4.6", + "http 1.1.0", + "http-body 1.0.1", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-timeout" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3203a961e5c83b6f5498933e78b6b263e208c197b63e9c6c53cc82ffd3f63793" +dependencies = [ + "hyper 1.4.1", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + [[package]] name = "hyper-tls" version = "0.5.0" @@ -2997,12 +3191,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper", + "hyper 0.14.30", "native-tls", "tokio", "tokio-native-tls", ] +[[package]] +name = "hyper-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "hyper 1.4.1", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + [[package]] name = "hyperloglog" version = "0.3.0-dev0" @@ -3056,6 +3269,12 @@ dependencies = [ "tiff", ] +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + [[package]] name = "indexmap" version = "1.9.3" @@ -3431,6 +3650,12 @@ dependencies = [ "regex-automata 0.1.10", ] +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + [[package]] name = "matrixmultiply" version = "0.3.9" @@ -3596,6 +3821,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "nu-ansi-term" +version = "0.50.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "num" version = "0.4.3" @@ -3741,7 +3975,7 @@ dependencies = [ "base64 0.13.1", "chrono", "getrandom 0.2.15", - "http", + "http 0.2.12", "rand 0.8.5", "serde", "serde_json", @@ -3801,7 +4035,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.74", + "syn 2.0.79", ] [[package]] @@ -4025,7 +4259,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.74", + "syn 2.0.79", ] [[package]] @@ -4182,6 +4416,16 @@ dependencies = [ "prost-derive 0.11.9", ] +[[package]] +name = "prost" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b0487d90e047de87f984913713b85c601c05609aad5b0df4b4573fbf69aa13f" +dependencies = [ + "bytes", + "prost-derive 0.13.3", +] + [[package]] name = "prost-derive" version = "0.9.0" @@ -4208,6 +4452,28 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "prost-derive" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9552f850d5f0964a4e4d0bf306459ac29323ddfbae05e35a7c0d35cb0803cc5" +dependencies = [ + "anyhow", + "itertools 0.11.0", + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "prost-types" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4759aa0d3a6232fb8dbdb97b61de2c20047c68aca932c7ed76da9d788508d670" +dependencies = [ + "prost 0.13.3", +] + [[package]] name = "pyo3" version = "0.21.2" @@ -4268,7 +4534,7 @@ dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", - "syn 2.0.74", + "syn 2.0.79", ] [[package]] @@ -4281,7 +4547,7 @@ dependencies = [ "proc-macro2", "pyo3-build-config", "quote", - "syn 2.0.74", + "syn 2.0.79", ] [[package]] @@ -4456,7 +4722,7 @@ checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.74", + "syn 2.0.79", ] [[package]] @@ -4526,10 +4792,10 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2", - "http", - "http-body", - "hyper", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.30", "hyper-tls", "ipnet", "js-sys", @@ -4544,7 +4810,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 0.1.2", "system-configuration", "tokio", "tokio-native-tls", @@ -4619,7 +4885,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.74", + "syn 2.0.79", "unicode-ident", ] @@ -4822,7 +5088,7 @@ checksum = "fabfb6138d2383ea8208cf98ccf69cdfb1aff4088460681d84189aa259762f97" dependencies = [ "proc-macro2", "quote", - "syn 2.0.74", + "syn 2.0.79", ] [[package]] @@ -5039,6 +5305,15 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "spark-connect" +version = "0.3.0-dev0" +dependencies = [ + "prost 0.13.3", + "prost-types", + "tonic", +] + [[package]] name = "spin" version = "0.5.2" @@ -5153,7 +5428,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.74", + "syn 2.0.79", ] [[package]] @@ -5175,9 +5450,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.74" +version = "2.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fceb41e3d546d0bd83421d3409b1460cc7444cd389341a4c880fe7a042cb3d7" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" dependencies = [ "proc-macro2", "quote", @@ -5190,6 +5465,12 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "sync_wrapper" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" + [[package]] name = "synstructure" version = "0.12.6" @@ -5292,7 +5573,7 @@ checksum = "5999e24eaa32083191ba4e425deb75cdf25efefabe5aaccb7446dd0d4122a3f5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.74", + "syn 2.0.79", ] [[package]] @@ -5323,7 +5604,7 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.74", + "syn 2.0.79", ] [[package]] @@ -5452,9 +5733,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.39.2" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ "backtrace", "bytes", @@ -5476,7 +5757,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.74", + "syn 2.0.79", ] [[package]] @@ -5491,9 +5772,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" dependencies = [ "futures-core", "pin-project-lite", @@ -5514,6 +5795,36 @@ dependencies = [ "tokio", ] +[[package]] +name = "tonic" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64 0.22.1", + "bytes", + "h2 0.4.6", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.4.1", + "hyper-timeout", + "hyper-util", + "percent-encoding", + "pin-project", + "prost 0.13.3", + "socket2", + "tokio", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "tower" version = "0.4.13" @@ -5522,9 +5833,13 @@ checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" dependencies = [ "futures-core", "futures-util", + "indexmap 1.9.3", "pin-project", "pin-project-lite", + "rand 0.8.5", + "slab", "tokio", + "tokio-util", "tower-layer", "tower-service", "tracing", @@ -5562,7 +5877,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.74", + "syn 2.0.79", ] [[package]] @@ -5604,7 +5919,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ "matchers", - "nu-ansi-term", + "nu-ansi-term 0.46.0", "once_cell", "regex", "sharded-slab", @@ -5615,6 +5930,18 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "tracing-tree" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f459ca79f1b0d5f71c54ddfde6debfc59c8b6eeb46808ae492077f739dc7b49c" +dependencies = [ + "nu-ansi-term 0.50.1", + "tracing-core", + "tracing-log", + "tracing-subscriber", +] + [[package]] name = "try-lock" version = "0.2.5" @@ -5675,7 +6002,7 @@ checksum = "70b20a22c42c8f1cd23ce5e34f165d4d37038f5b663ad20fb6adbdf029172483" dependencies = [ "proc-macro2", "quote", - "syn 2.0.74", + "syn 2.0.79", ] [[package]] @@ -5909,7 +6236,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.74", + "syn 2.0.79", "wasm-bindgen-shared", ] @@ -5943,7 +6270,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.74", + "syn 2.0.79", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -6257,7 +6584,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.74", + "syn 2.0.79", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index dde3543e70..6d700fb1c6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,10 +8,11 @@ common-system-info = {path = "src/common/system-info", default-features = false} common-tracing = {path = "src/common/tracing", default-features = false} common-version = {path = "src/common/version", default-features = false} daft-compression = {path = "src/daft-compression", default-features = false} +daft-connect = {path = "src/daft-connect"} daft-core = {path = "src/daft-core", default-features = false} daft-csv = {path = "src/daft-csv", default-features = false} daft-dsl = {path = "src/daft-dsl", default-features = false} -daft-functions = {path = "src/daft-functions", default-features = false} +daft-functions = {path = "src/daft-functions"} daft-functions-json = {path = "src/daft-functions-json", default-features = false} daft-image = {path = "src/daft-image", default-features = false} daft-io = {path = "src/daft-io", default-features = false} @@ -38,27 +39,28 @@ sysinfo = {workspace = true} python = [ "dep:pyo3", "dep:pyo3-log", + "common-daft-config/python", + "common-display/python", + "common-resource-request/python", + "common-system-info/python", + "daft-connect/python", "daft-core/python", "daft-csv/python", "daft-dsl/python", - "daft-local-execution/python", - "daft-io/python", + "daft-functions-json/python", + "daft-functions/python", "daft-image/python", + "daft-io/python", "daft-json/python", + "daft-local-execution/python", "daft-micropartition/python", "daft-parquet/python", "daft-plan/python", "daft-scan/python", "daft-scheduler/python", - "daft-stats/python", "daft-sql/python", - "daft-table/python", - "daft-functions/python", - "daft-functions-json/python", - "common-daft-config/python", - "common-system-info/python", - "common-display/python", - "common-resource-request/python" + "daft-stats/python", + "daft-table/python" ] [lib] @@ -137,10 +139,13 @@ members = [ "src/daft-functions", "src/daft-functions-json", "src/daft-sql", - "src/hyperloglog" + "src/hyperloglog", + "src/spark-connect", + "src/daft-connect" ] [workspace.dependencies] +anyhow = "1.0.89" async-compat = "0.2.3" async-compression = {version = "0.4.12", features = [ "tokio", @@ -153,6 +158,18 @@ bytes = "1.6.0" chrono = "0.4.38" chrono-tz = "0.8.4" comfy-table = "7.1.1" +common-daft-config = {path = "src/common/daft-config"} +common-display = {path = "src/common/display"} +common-error = {path = "src/common/error"} +daft-connect = {path = "src/daft-connect", default-features = false} +daft-core = {path = "src/daft-core"} +daft-dsl = {path = "src/daft-dsl"} +daft-local-execution = {path = "src/daft-local-execution"} +daft-micropartition = {path = "src/daft-micropartition"} +daft-physical-plan = {path = "src/daft-physical-plan"} +daft-plan = {path = "src/daft-plan"} +daft-schema = {path = "src/daft-schema"} +daft-table = {path = "src/daft-table"} derivative = "2.2.0" dyn-clone = "1" futures = "0.3.30" @@ -175,6 +192,7 @@ rstest = "0.18.2" serde_json = "1.0.116" sketches-ddsketch = {version = "0.2.2", features = ["use_serde"]} snafu = {version = "0.7.4", features = ["futures"]} +spark-connect = {path = "src/spark-connect", default-features = false} sqlparser = "0.51.0" sysinfo = "0.30.12" test-log = "0.2.16" @@ -202,7 +220,7 @@ path = "src/arrow2" version = "1.3.3" [workspace.dependencies.derive_more] -features = ["display"] +features = ["display", "from", "constructor"] version = "1.0.0" [workspace.dependencies.lazy_static] @@ -290,7 +308,7 @@ uninlined_format_args = "allow" unnecessary_wraps = "allow" unnested_or_patterns = "allow" unreadable_literal = "allow" -# todo: remove? +# todo: remove this at some point unsafe_derive_deserialize = "allow" unused_async = "allow" # used_underscore_items = "allow" # REMOVE diff --git a/daft/daft/__init__.pyi b/daft/daft/__init__.pyi index 798632d51f..26443d4acb 100644 --- a/daft/daft/__init__.pyi +++ b/daft/daft/__init__.pyi @@ -17,6 +17,8 @@ if TYPE_CHECKING: from pyiceberg.schema import Schema as IcebergSchema from pyiceberg.table import TableProperties as IcebergTableProperties +def connect_start() -> None: ... + class ImageMode(Enum): """ Supported image modes for Daft's image type. diff --git a/src/arrow2/src/array/utf8/mod.rs b/src/arrow2/src/array/utf8/mod.rs index 6a64505a7b..4c20f9f25b 100644 --- a/src/arrow2/src/array/utf8/mod.rs +++ b/src/arrow2/src/array/utf8/mod.rs @@ -67,7 +67,7 @@ impl> AsRef<[u8]> for StrAsBytes { /// * A slice of `values` taken from two consecutives `offsets` is valid `utf8`. /// * `len` is equal to `validity.len()`, when defined. #[derive(Clone)] -pub struct Utf8Array { +pub struct Utf8Array { data_type: DataType, offsets: OffsetsBuffer, values: Buffer, diff --git a/src/daft-connect/Cargo.toml b/src/daft-connect/Cargo.toml new file mode 100644 index 0000000000..1db906f5d9 --- /dev/null +++ b/src/daft-connect/Cargo.toml @@ -0,0 +1,40 @@ +[dependencies] +dashmap = "6.1.0" +# papaya = "0.1.3" +eyre = "0.6.12" +futures = "0.3.31" +pyo3 = {workspace = true, optional = true} +tokio = {version = "1.40.0", features = ["full"]} +tonic = "0.12.3" +tracing-subscriber = {version = "0.3.18", features = ["env-filter"]} +tracing-tree = "0.4.0" +uuid = {version = "1.10.0", features = ["v4"]} +arrow2.workspace = true +common-daft-config.workspace = true +common-error.workspace = true +daft-core.workspace = true +daft-dsl.workspace = true +daft-local-execution.workspace = true +daft-micropartition.workspace = true +daft-physical-plan.workspace = true +daft-plan.workspace = true +daft-schema.workspace = true +daft-table.workspace = true +spark-connect.workspace = true +tracing.workspace = true + +[dev-dependencies] +tempfile = "3.4.0" + +[features] +python = [ + "dep:pyo3" +] + +[lints] +workspace = true + +[package] +edition = {workspace = true} +name = "daft-connect" +version = {workspace = true} diff --git a/src/daft-connect/src/command.rs b/src/daft-connect/src/command.rs new file mode 100644 index 0000000000..09bc32ca05 --- /dev/null +++ b/src/daft-connect/src/command.rs @@ -0,0 +1,179 @@ +// Stream of Result + +use std::{collections::HashMap, sync::Arc, thread}; + +use common_daft_config::DaftExecutionConfig; +use common_error::DaftResult; +use daft_local_execution::run::run_local; +use daft_micropartition::MicroPartition; +use daft_plan::LogicalPlanRef; +use daft_table::Table; +use eyre::Context; +use spark_connect::{ + execute_plan_response::{ArrowBatch, ResponseType, ResultComplete}, + spark_connect_service_server::SparkConnectService, + ExecutePlanResponse, Relation, WriteOperation, +}; +use tonic::Status; +use uuid::Uuid; + +use crate::{DaftSparkConnectService, Session}; + +type DaftStream = ::ExecutePlanStream; + +struct ResultEncoder { + session_id: String, + server_side_session_id: String, + operation_id: String, + tx: tokio::sync::mpsc::UnboundedSender, +} + +pub trait Encoder { + fn create_batch(&self, row_count: i64, data: Vec) -> eyre::Result<()>; +} + +impl Encoder for ResultEncoder { + fn create_batch(&self, row_count: i64, data: Vec) -> eyre::Result<()> { + let response = ExecutePlanResponse { + session_id: self.session_id.clone(), + server_side_session_id: self.server_side_session_id.clone(), + operation_id: self.operation_id.clone(), + response_id: Uuid::new_v4().to_string(), // todo: implement this + metrics: None, // todo: implement this + observed_metrics: vec![], + schema: None, + response_type: Some(ResponseType::ArrowBatch(ArrowBatch { + row_count, + data, + start_offset: None, + })), + }; + + self.tx + .send(response) + .wrap_err("Error sending response to client") + } +} + +impl Session { + pub async fn handle_root_command( + &self, + command: Relation, + operation_id: String, + ) -> Result { + // let data = thread::spawn(move || { + // // crate::convert:: + // + // // let logical_plan = to_logical_plan(command).unwrap().build(); + // + // let result = execute_plan(logical_plan); + // process_result(result) + // }); + // let data = tokio::task::spawn_blocking(move || data.join().unwrap()) + // .await + // .unwrap(); + // let response = create_response(&self.id, &self.server_side_session_id, &operation_id, data); + // let result = create_stream( + // response, + // &self.id, + // &self.server_side_session_id, + // &operation_id, + // ); + // + // Ok(result) + todo!() + } + + pub fn write_operation(&self, operation: WriteOperation) -> Result { + println!("write_operation {:#?}", operation); + Err(Status::unimplemented( + "write_operation operation is not yet implemented", + )) + } +} + +pub fn execute_plan( + logical_plan: LogicalPlanRef, +) -> impl Iterator>> { + let physical_plan = daft_physical_plan::translate(&logical_plan).unwrap(); + + let cfg = Arc::new(DaftExecutionConfig::default()); + let psets = HashMap::new(); + run_local(&physical_plan, psets, cfg, None).unwrap() +} + +fn process_result(result: impl Iterator>>) -> Vec { + let mut data = Vec::new(); + let options = arrow2::io::ipc::write::WriteOptions { compression: None }; + let mut writer = arrow2::io::ipc::write::StreamWriter::new(&mut data, options); + + for elem in result { + let elem = elem.unwrap(); + let tables = elem.get_tables().unwrap(); + let tables = vec![tables.first().unwrap()]; + + for table in tables { + write_table_to_arrow(&mut writer, table); + } + } + + data +} + +fn write_table_to_arrow( + writer: &mut arrow2::io::ipc::write::StreamWriter<&mut Vec>, + table: &Table, +) { + let schema = table.schema.to_arrow().unwrap(); + writer.start(&schema, None).unwrap(); + + let arrays = table.get_inner_arrow_arrays(); + let chunk = arrow2::chunk::Chunk::new(arrays); + writer.write(&chunk, None).unwrap(); +} + +fn create_response( + session_id: &str, + server_side_session_id: &str, + operation_id: &str, + data: Vec, +) -> ExecutePlanResponse { + let response_type = ResponseType::ArrowBatch(ArrowBatch { + row_count: 10i64, + data, + start_offset: None, + }); + + ExecutePlanResponse { + session_id: session_id.to_string(), + server_side_session_id: server_side_session_id.to_string(), + operation_id: operation_id.to_string(), + response_id: Uuid::new_v4().to_string(), + metrics: None, + observed_metrics: vec![], + schema: None, + response_type: Some(response_type), + } +} + +fn create_stream( + response: ExecutePlanResponse, + session_id: &str, + server_side_session_id: &str, + operation_id: &str, +) -> DaftStream { + let stream = futures::stream::iter(vec![ + Ok(response), + Ok(ExecutePlanResponse { + session_id: session_id.to_string(), + server_side_session_id: server_side_session_id.to_string(), + operation_id: operation_id.to_string(), + response_id: Uuid::new_v4().to_string(), + metrics: None, + observed_metrics: vec![], + schema: None, + response_type: Some(ResponseType::ResultComplete(ResultComplete {})), + }), + ]); + Box::pin(stream) +} diff --git a/src/daft-connect/src/config.rs b/src/daft-connect/src/config.rs new file mode 100644 index 0000000000..6b6712d903 --- /dev/null +++ b/src/daft-connect/src/config.rs @@ -0,0 +1,212 @@ +use std::collections::BTreeMap; + +use spark_connect::{ + config_request::{Get, GetAll, GetOption, GetWithDefault, IsModifiable, Set, Unset}, + ConfigResponse, KeyValue, +}; +use tonic::Status; + +use crate::Session; + +impl Session { + fn config_response(&self) -> ConfigResponse { + ConfigResponse { + session_id: self.id.clone(), + server_side_session_id: self.server_side_session_id.clone(), + pairs: vec![], + warnings: vec![], + } + } + + pub fn set(&mut self, operation: Set) -> Result { + let mut response = self.config_response(); + + let span = tracing::info_span!("set", session_id = %self.id, ?operation); + let _enter = span.enter(); + + for KeyValue { key, value } in operation.pairs { + let Some(value) = value else { + let msg = format!("Missing value for key {key}. If you want to unset a value use the Unset operation"); + response.warnings.push(msg); + continue; + }; + + let previous = self.config_values.insert(key.clone(), value.clone()); + if previous.is_some() { + tracing::info!("Updated existing configuration value"); + } else { + tracing::info!("Set new configuration value"); + } + } + + Ok(response) + } + + pub fn get(&self, operation: Get) -> Result { + let mut response = self.config_response(); + + let span = tracing::info_span!("get", session_id = %self.id); + let _enter = span.enter(); + + for key in operation.keys { + let value = self.config_values.get(&key).cloned(); + response.pairs.push(KeyValue { key, value }); + } + + Ok(response) + } + + pub fn get_with_default(&self, operation: GetWithDefault) -> Result { + let mut response = self.config_response(); + + let span = tracing::info_span!("get_with_default", session_id = %self.id); + let _enter = span.enter(); + + for KeyValue { + key, + value: default_value, + } in operation.pairs + { + let value = self.config_values.get(&key).cloned().or(default_value); + response.pairs.push(KeyValue { key, value }); + } + + Ok(response) + } + + /// Needs to be fixed so it has different behavior than [`Session::get`]. Not entirely + /// sure how it should work yet. + pub fn get_option(&self, operation: GetOption) -> Result { + let mut response = self.config_response(); + + let span = tracing::info_span!("get_option", session_id = %self.id); + let _enter = span.enter(); + + for key in operation.keys { + let value = self.config_values.get(&key).cloned(); + response.pairs.push(KeyValue { key, value }); + } + + Ok(response) + } + + pub fn get_all(&self, operation: GetAll) -> Result { + let mut response = self.config_response(); + + let span = tracing::info_span!("get_all", session_id = %self.id); + let _enter = span.enter(); + + let Some(prefix) = operation.prefix else { + for (key, value) in &self.config_values { + response.pairs.push(KeyValue { + key: key.clone(), + value: Some(value.clone()), + }); + } + return Ok(response); + }; + + for (k, v) in prefix_search(&self.config_values, &prefix) { + response.pairs.push(KeyValue { + key: k.clone(), + value: Some(v.clone()), + }); + } + + Ok(response) + } + + pub fn unset(&mut self, operation: Unset) -> Result { + let mut response = self.config_response(); + + let span = tracing::info_span!("unset", session_id = %self.id); + let _enter = span.enter(); + + for key in operation.keys { + if self.config_values.remove(&key).is_none() { + let msg = format!("Key {key} not found"); + response.warnings.push(msg); + } else { + tracing::info!("Unset configuration value"); + } + } + + Ok(response) + } + + pub fn is_modifiable(&self, _operation: IsModifiable) -> Result { + let response = self.config_response(); + + let span = tracing::info_span!("is_modifiable", session_id = %self.id); + let _enter = span.enter(); + + tracing::warn!(session_id = %self.id, "is_modifiable operation not yet implemented"); + // todo: need to implement this + Ok(response) + } +} + +fn prefix_search<'a, V>( + map: &'a BTreeMap, + prefix: &'a str, +) -> impl Iterator { + let start = map.range(prefix.to_string()..); + start.take_while(move |(k, _)| k.starts_with(prefix)) +} + +#[cfg(test)] +mod tests { + use std::collections::BTreeMap; + + use super::*; + + #[test] + fn test_prefix_search() { + let mut map = BTreeMap::new(); + map.insert("apple".to_string(), 1); + map.insert("application".to_string(), 2); + map.insert("banana".to_string(), 3); + map.insert("app".to_string(), 4); + map.insert("apricot".to_string(), 5); + + // Test with prefix "app" + let result: Vec<_> = prefix_search(&map, "app").collect(); + assert_eq!( + result, + vec![ + (&"app".to_string(), &4), + (&"apple".to_string(), &1), + (&"application".to_string(), &2), + ] + ); + + // Test with prefix "b" + let result: Vec<_> = prefix_search(&map, "b").collect(); + assert_eq!(result, vec![(&"banana".to_string(), &3),]); + + // Test with prefix that doesn't match any keys + let result: Vec<_> = prefix_search(&map, "z").collect(); + assert_eq!(result, vec![]); + + // Test with empty prefix (should return all items) + let result: Vec<_> = prefix_search(&map, "").collect(); + assert_eq!( + result, + vec![ + (&"app".to_string(), &4), + (&"apple".to_string(), &1), + (&"application".to_string(), &2), + (&"apricot".to_string(), &5), + (&"banana".to_string(), &3), + ] + ); + + // Test with prefix that matches a complete key + let result: Vec<_> = prefix_search(&map, "apple").collect(); + assert_eq!(result, vec![(&"apple".to_string(), &1),]); + + // Test with case sensitivity + let result: Vec<_> = prefix_search(&map, "App").collect(); + assert_eq!(result, vec![]); + } +} diff --git a/src/daft-connect/src/convert.rs b/src/daft-connect/src/convert.rs new file mode 100644 index 0000000000..2b6c9ccc1e --- /dev/null +++ b/src/daft-connect/src/convert.rs @@ -0,0 +1,4 @@ +mod expr; +mod fmt; +mod logical_plan; +mod stream; diff --git a/src/daft-connect/src/convert/expr.rs b/src/daft-connect/src/convert/expr.rs new file mode 100644 index 0000000000..29e0c2d634 --- /dev/null +++ b/src/daft-connect/src/convert/expr.rs @@ -0,0 +1,120 @@ +use daft_dsl::{Expr as DaftExpr, Operator}; +use eyre::{bail, ensure, eyre, Result}; +use spark_connect::{expression, expression::literal::LiteralType, Expression}; + +pub fn to_daft_expr(expr: Expression) -> Result { + match expr.expr_type { + Some(expression::ExprType::Literal(lit)) => Ok(DaftExpr::Literal(convert_literal(lit)?)), + + Some(expression::ExprType::UnresolvedAttribute(attr)) => { + Ok(DaftExpr::Column(attr.unparsed_identifier.into())) + } + + Some(expression::ExprType::Alias(alias)) => { + let expression::Alias { + expr, + name, + metadata, + } = *alias; + let expr = *expr.ok_or_else(|| eyre!("expr is None"))?; + + // Convert alias + let expr = to_daft_expr(expr)?; + + if let Some(metadata) = metadata + && !metadata.is_empty() + { + bail!("Metadata is not yet supported"); + } + + // ignore metadata for now + + let [name] = name.as_slice() else { + bail!("Alias name must have exactly one element"); + }; + + Ok(DaftExpr::Alias(expr.into(), name.as_str().into())) + } + + Some(expression::ExprType::UnresolvedFunction(expression::UnresolvedFunction { + function_name, + arguments, + is_distinct, + is_user_defined_function, + })) => { + ensure!(!is_distinct, "Distinct is not yet supported"); + ensure!( + !is_user_defined_function, + "User-defined functions are not yet supported" + ); + + let op = function_name.as_str(); + match op { + ">" | "<" | "<=" | ">=" | "+" | "-" | "*" | "/" => { + let arr: [Expression; 2] = arguments + .try_into() + .map_err(|_| eyre!("Expected 2 arguments"))?; + let [left, right] = arr; + + let left = to_daft_expr(left)?; + let right = to_daft_expr(right)?; + + let op = match op { + ">" => Operator::Gt, + "<" => Operator::Lt, + "<=" => Operator::LtEq, + ">=" => Operator::GtEq, + "+" => Operator::Plus, + "-" => Operator::Minus, + "*" => Operator::Multiply, + "/" => Operator::FloorDivide, // todo is this what we want? + _ => unreachable!(), + }; + + Ok(DaftExpr::BinaryOp { + left: left.into(), + op, + right: right.into(), + }) + } + other => bail!("Unsupported function name: {other}"), + } + } + + // Handle other expression types... + _ => Err(eyre!("Unsupported expression type")), + } +} + +// Helper functions to convert literals, function names, operators etc. + +fn convert_literal(lit: expression::Literal) -> Result { + let literal_type = lit + .literal_type + .ok_or_else(|| eyre!("literal_type is None"))?; + + let result = match literal_type { + LiteralType::Null(..) => daft_dsl::LiteralValue::Null, + LiteralType::Binary(input) => daft_dsl::LiteralValue::Binary(input), + LiteralType::Boolean(input) => daft_dsl::LiteralValue::Boolean(input), + LiteralType::Byte(input) => daft_dsl::LiteralValue::Int32(input), + LiteralType::Short(input) => daft_dsl::LiteralValue::Int32(input), + LiteralType::Integer(input) => daft_dsl::LiteralValue::Int32(input), + LiteralType::Long(input) => daft_dsl::LiteralValue::Int64(input), + LiteralType::Float(input) => daft_dsl::LiteralValue::Float64(f64::from(input)), + LiteralType::Double(input) => daft_dsl::LiteralValue::Float64(input), + LiteralType::String(input) => daft_dsl::LiteralValue::Utf8(input), + LiteralType::Date(input) => daft_dsl::LiteralValue::Date(input), + LiteralType::Decimal(_) + | LiteralType::Timestamp(_) + | LiteralType::TimestampNtz(_) + | LiteralType::CalendarInterval(_) + | LiteralType::YearMonthInterval(_) + | LiteralType::DayTimeInterval(_) + | LiteralType::Array(_) + | LiteralType::Map(_) + | LiteralType::Struct(_) => bail!("unimplemented"), + }; + + Ok(result) +} diff --git a/src/daft-connect/src/convert/fmt.rs b/src/daft-connect/src/convert/fmt.rs new file mode 100644 index 0000000000..483dd58724 --- /dev/null +++ b/src/daft-connect/src/convert/fmt.rs @@ -0,0 +1,171 @@ +use std::fmt::Display; + +use spark_connect::relation::RelType; + +/// A struct for displaying the top-level RelType of a Spark Connect relation. +struct TopLevelDisplay<'a> { + plan: &'a RelType, +} + +impl TopLevelDisplay<'_> { + /// Creates a new TopLevelDisplay instance. + /// + /// # Arguments + /// + /// * `plan` - A reference to the RelType to be displayed. + /// + /// # Returns + /// + /// A new TopLevelDisplay instance. + pub fn new(plan: &'_ RelType) -> Self { + Self { plan } + } +} + +impl<'a> Display for TopLevelDisplay<'a> { + /// Formats the RelType as a string. + /// + /// This method matches on the RelType variant and returns a string + /// representation of the top-level relation type. + /// + /// # Arguments + /// + /// * `f` - The formatter to write the output to. + /// + /// # Returns + /// + /// A fmt::Result indicating whether the operation was successful. + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let rel_type_str = match self.plan { + RelType::Read(_) => "Read", + RelType::Project(_) => "Project", + RelType::Filter(_) => "Filter", + RelType::Join(_) => "Join", + RelType::SetOp(_) => "SetOp", + RelType::Sort(_) => "Sort", + RelType::Limit(_) => "Limit", + RelType::Aggregate(_) => "Aggregate", + RelType::Sql(_) => "Sql", + RelType::LocalRelation(_) => "LocalRelation", + RelType::Sample(_) => "Sample", + RelType::Offset(_) => "Offset", + RelType::Deduplicate(_) => "Deduplicate", + RelType::Range(_) => "Range", + RelType::SubqueryAlias(_) => "SubqueryAlias", + RelType::Repartition(_) => "Repartition", + RelType::ToDf(_) => "ToDf", + RelType::WithColumnsRenamed(_) => "WithColumnsRenamed", + RelType::ShowString(_) => "ShowString", + RelType::Drop(_) => "Drop", + RelType::Tail(_) => "Tail", + RelType::WithColumns(_) => "WithColumns", + RelType::Hint(_) => "Hint", + RelType::Unpivot(_) => "Unpivot", + RelType::ToSchema(_) => "ToSchema", + RelType::RepartitionByExpression(_) => "RepartitionByExpression", + RelType::MapPartitions(_) => "MapPartitions", + RelType::CollectMetrics(_) => "CollectMetrics", + RelType::Parse(_) => "Parse", + RelType::GroupMap(_) => "GroupMap", + RelType::CoGroupMap(_) => "CoGroupMap", + RelType::WithWatermark(_) => "WithWatermark", + RelType::ApplyInPandasWithState(_) => "ApplyInPandasWithState", + RelType::HtmlString(_) => "HtmlString", + RelType::CachedLocalRelation(_) => "CachedLocalRelation", + RelType::CachedRemoteRelation(_) => "CachedRemoteRelation", + RelType::CommonInlineUserDefinedTableFunction(_) => { + "CommonInlineUserDefinedTableFunction" + } + RelType::AsOfJoin(_) => "AsOfJoin", + RelType::CommonInlineUserDefinedDataSource(_) => "CommonInlineUserDefinedDataSource", + RelType::WithRelations(_) => "WithRelations", + RelType::Transpose(_) => "Transpose", + RelType::FillNa(_) => "FillNa", + RelType::DropNa(_) => "DropNa", + RelType::Replace(_) => "Replace", + RelType::Summary(_) => "Summary", + RelType::Crosstab(_) => "Crosstab", + RelType::Describe(_) => "Describe", + RelType::Cov(_) => "Cov", + RelType::Corr(_) => "Corr", + RelType::ApproxQuantile(_) => "ApproxQuantile", + RelType::FreqItems(_) => "FreqItems", + RelType::SampleBy(_) => "SampleBy", + RelType::Catalog(_) => "Catalog", + RelType::Extension(_) => "Extension", + RelType::Unknown(_) => "Unknown", + }; + + f.write_str(rel_type_str) + } +} + +/// Extension trait for RelType to add a `name` method. +pub trait RelTypeExt { + /// Returns the name of the RelType as a string. + fn name(&self) -> &'static str; +} + +impl RelTypeExt for RelType { + fn name(&self) -> &'static str { + match self { + RelType::Read(_) => "Read", + RelType::Project(_) => "Project", + RelType::Filter(_) => "Filter", + RelType::Join(_) => "Join", + RelType::SetOp(_) => "SetOp", + RelType::Sort(_) => "Sort", + RelType::Limit(_) => "Limit", + RelType::Aggregate(_) => "Aggregate", + RelType::Sql(_) => "Sql", + RelType::LocalRelation(_) => "LocalRelation", + RelType::Sample(_) => "Sample", + RelType::Offset(_) => "Offset", + RelType::Deduplicate(_) => "Deduplicate", + RelType::Range(_) => "Range", + RelType::SubqueryAlias(_) => "SubqueryAlias", + RelType::Repartition(_) => "Repartition", + RelType::ToDf(_) => "ToDf", + RelType::WithColumnsRenamed(_) => "WithColumnsRenamed", + RelType::ShowString(_) => "ShowString", + RelType::Drop(_) => "Drop", + RelType::Tail(_) => "Tail", + RelType::WithColumns(_) => "WithColumns", + RelType::Hint(_) => "Hint", + RelType::Unpivot(_) => "Unpivot", + RelType::ToSchema(_) => "ToSchema", + RelType::RepartitionByExpression(_) => "RepartitionByExpression", + RelType::MapPartitions(_) => "MapPartitions", + RelType::CollectMetrics(_) => "CollectMetrics", + RelType::Parse(_) => "Parse", + RelType::GroupMap(_) => "GroupMap", + RelType::CoGroupMap(_) => "CoGroupMap", + RelType::WithWatermark(_) => "WithWatermark", + RelType::ApplyInPandasWithState(_) => "ApplyInPandasWithState", + RelType::HtmlString(_) => "HtmlString", + RelType::CachedLocalRelation(_) => "CachedLocalRelation", + RelType::CachedRemoteRelation(_) => "CachedRemoteRelation", + RelType::CommonInlineUserDefinedTableFunction(_) => { + "CommonInlineUserDefinedTableFunction" + } + RelType::AsOfJoin(_) => "AsOfJoin", + RelType::CommonInlineUserDefinedDataSource(_) => "CommonInlineUserDefinedDataSource", + RelType::WithRelations(_) => "WithRelations", + RelType::Transpose(_) => "Transpose", + RelType::FillNa(_) => "FillNa", + RelType::DropNa(_) => "DropNa", + RelType::Replace(_) => "Replace", + RelType::Summary(_) => "Summary", + RelType::Crosstab(_) => "Crosstab", + RelType::Describe(_) => "Describe", + RelType::Cov(_) => "Cov", + RelType::Corr(_) => "Corr", + RelType::ApproxQuantile(_) => "ApproxQuantile", + RelType::FreqItems(_) => "FreqItems", + RelType::SampleBy(_) => "SampleBy", + RelType::Catalog(_) => "Catalog", + RelType::Extension(_) => "Extension", + RelType::Unknown(_) => "Unknown", + } + } +} diff --git a/src/daft-connect/src/convert/logical_plan.rs b/src/daft-connect/src/convert/logical_plan.rs new file mode 100644 index 0000000000..4d45b6bff7 --- /dev/null +++ b/src/daft-connect/src/convert/logical_plan.rs @@ -0,0 +1,127 @@ +use std::{collections::HashSet, sync::Arc}; + +use daft_plan::{LogicalPlanBuilder, ParquetScanBuilder}; +use eyre::{bail, eyre, Result, WrapErr}; +use spark_connect::{ + expression::Alias, + read::{DataSource, ReadType}, + relation::RelType, + Filter, Read, Relation, WithColumns, +}; + +use crate::convert::expr; + +pub fn to_logical_plan(plan: Relation) -> Result { + let rel_type = plan.rel_type.ok_or_else(|| eyre!("rel_type is None"))?; + + match rel_type { + RelType::ShowString(..) => bail!("ShowString is only supported as a top-level relation"), + RelType::Filter(filter) => parse_filter(*filter).wrap_err("parsing Filter"), + RelType::WithColumns(with_columns) => { + parse_with_columns(*with_columns).wrap_err("parsing WithColumns") + } + RelType::Read(read) => parse_read(read), + _ => bail!("Unsupported relation type: {rel_type:?}"), + } +} + +fn parse_filter(filter: Filter) -> Result { + let Filter { input, condition } = filter; + let input = *input.ok_or_else(|| eyre!("input is None"))?; + let input_plan = to_logical_plan(input).wrap_err("parsing input")?; + + let condition = condition.ok_or_else(|| eyre!("condition is None"))?; + let condition = expr::to_daft_expr(condition).wrap_err("converting to daft expression")?; + let condition = Arc::new(condition); + + input_plan.filter(condition).wrap_err("applying filter") +} + +fn parse_with_columns(with_columns: WithColumns) -> Result { + let WithColumns { input, aliases } = with_columns; + let input = *input.ok_or_else(|| eyre!("input is None"))?; + let input_plan = to_logical_plan(input).wrap_err("parsing input")?; + + let mut new_exprs = Vec::new(); + let mut existing_columns: HashSet<_> = input_plan.schema().names().into_iter().collect(); + + for alias in aliases { + let Alias { + expr, + name, + metadata, + } = alias; + + if name.len() != 1 { + bail!("Alias name must have exactly one element"); + } + let name = name[0].as_str(); + + if metadata.is_some() { + bail!("Metadata is not yet supported"); + } + + let expr = expr.ok_or_else(|| eyre!("expression is None"))?; + let expr = expr::to_daft_expr(*expr).wrap_err("converting to daft expression")?; + let expr = Arc::new(expr); + + new_exprs.push(expr.alias(name)); + + if existing_columns.contains(name) { + existing_columns.remove(name); + } + } + + // Add remaining existing columns + for col_name in existing_columns { + new_exprs.push(daft_dsl::col(col_name)); + } + + input_plan + .select(new_exprs) + .wrap_err("selecting new expressions") +} + +fn parse_read(read: Read) -> Result { + let Read { + is_streaming, + read_type, + } = read; + + if is_streaming { + bail!("Streaming reads are not yet supported"); + } + + let read_type = read_type.ok_or_else(|| eyre!("type is None"))?; + + match read_type { + ReadType::NamedTable(_) => bail!("Named tables are not yet supported"), + ReadType::DataSource(data_source) => parse_data_source(data_source), + } +} + +fn parse_data_source(data_source: DataSource) -> Result { + let DataSource { + format, + options, + paths, + predicates, + .. + } = data_source; + + let format = format.ok_or_else(|| eyre!("format is None"))?; + if format != "parquet" { + bail!("Only parquet is supported; got {format}"); + } + + if !options.is_empty() { + bail!("Options are not yet supported"); + } + if !predicates.is_empty() { + bail!("Predicates are not yet supported"); + } + + ParquetScanBuilder::new(paths) + .finish() + .wrap_err("creating ParquetScanBuilder") +} diff --git a/src/daft-connect/src/convert/stream.rs b/src/daft-connect/src/convert/stream.rs new file mode 100644 index 0000000000..46ef6a7487 --- /dev/null +++ b/src/daft-connect/src/convert/stream.rs @@ -0,0 +1,120 @@ +use std::{collections::HashMap, fmt::Display, sync::Arc}; + +use common_daft_config::DaftExecutionConfig; +use daft_core::series::Series; +use daft_schema::schema::Schema; +use daft_table::Table; +use eyre::{bail, ensure, eyre, Context}; +use spark_connect::{ + execute_plan_response::{ArrowBatch, ResponseType}, + relation::RelType, + ExecutePlanResponse, Relation, ShowString, +}; +use uuid::Uuid; + +use crate::{ + command::Encoder, + convert::{fmt::RelTypeExt, logical_plan::to_logical_plan}, +}; + +pub fn parse_top_level(plan: Relation, encoder: &impl Encoder) -> eyre::Result<()> { + let rel_type = plan.rel_type.ok_or_else(|| eyre!("rel_type is None"))?; + + match rel_type { + RelType::ShowString(input) => show_string(*input, encoder).wrap_err("parsing ShowString"), + other => Err(eyre!("Unsupported top-level relation: {}", other.name())), + } +} + +pub fn show_string(show_string: ShowString, encoder: &impl Encoder) -> eyre::Result<()> { + let ShowString { + input, + num_rows, + truncate, + vertical, + } = show_string; + + ensure!(num_rows > 0, "num_rows must be positive, got {num_rows}"); + ensure!(truncate > 0, "truncate must be positive, got {truncate}"); + ensure!(!vertical, "vertical is not yet supported"); + + let input = *input.ok_or_else(|| eyre!("input is None"))?; + + let logical_plan = to_logical_plan(input)?.build(); + + let physical_plan = daft_physical_plan::translate(&logical_plan)?; + + let cfg = Arc::new(DaftExecutionConfig::default()); + let psets = HashMap::new(); + + let mut data = Vec::new(); + let options = arrow2::io::ipc::write::WriteOptions { compression: None }; + let mut writer = arrow2::io::ipc::write::StreamWriter::new(&mut data, options); + + for (i, elem) in daft_local_execution::run::run_local(&physical_plan, psets, cfg, None) + .wrap_err("running local execution")? + .enumerate() + { + let elem = elem.wrap_err_with(|| format!("error in partition {i}"))?; + let tables = elem.get_tables().unwrap(); + + let [table] = tables.as_slice() else { + bail!("expected 1 table, got {} tables. It is a work in progress to support multiple tables", tables.len()); + }; + + let display = format!("{table}"); + + let arrow_array: arrow2::array::Utf8Array = [display.as_str()].iter().map(Some).collect(); + let singleton_series = Series::try_from(( + "show_string", + Box::new(arrow_array) as Box, + ))?; + + let singleton_table = Table::new_with_size( + Schema::new(vec![singleton_series.field().clone()])?, + vec![singleton_series], + 1, + )?; + + write_table_to_arrow(&mut writer, &singleton_table); + } + + encoder.create_batch(10, data); + Ok(()) +} + +fn write_table_to_arrow( + writer: &mut arrow2::io::ipc::write::StreamWriter<&mut Vec>, + table: &Table, +) { + let schema = table.schema.to_arrow().unwrap(); + writer.start(&schema, None).unwrap(); + + let arrays = table.get_inner_arrow_arrays(); + let chunk = arrow2::chunk::Chunk::new(arrays); + writer.write(&chunk, None).unwrap(); +} + +fn create_response( + session_id: &str, + server_side_session_id: &str, + operation_id: &str, + data: Vec, +) -> ExecutePlanResponse { + let response_type = ResponseType::ArrowBatch(ArrowBatch { + row_count: 10i64, + data, + start_offset: None, + }); + + ExecutePlanResponse { + session_id: session_id.to_string(), + server_side_session_id: server_side_session_id.to_string(), + operation_id: operation_id.to_string(), + response_id: Uuid::new_v4().to_string(), + metrics: None, + observed_metrics: vec![], + schema: None, + response_type: Some(response_type), + } +} diff --git a/src/daft-connect/src/convert/tests.rs b/src/daft-connect/src/convert/tests.rs new file mode 100644 index 0000000000..85c6670064 --- /dev/null +++ b/src/daft-connect/src/convert/tests.rs @@ -0,0 +1,228 @@ +use std::{collections::HashMap, io::Write}; + +use spark_connect::{ + expression::{ + literal::LiteralType, Alias, ExprType, Literal, UnresolvedAttribute, UnresolvedFunction, + }, + read::{DataSource, ReadType}, + relation::RelType, + Expression, Filter, Read, Relation, RelationCommon, ShowString, WithColumns, +}; + +use crate::{command::execute_plan, convert::to_logical_plan}; + +#[test] +pub fn test_filter() { + let mut tmp_file = tempfile::NamedTempFile::new().unwrap(); + let bytes = include_bytes!("../../tests/increasing_id_data.parquet"); + tmp_file.write_all(bytes).unwrap(); + + let path = tmp_file.path().to_str().unwrap(); + + #[expect( + deprecated, + reason = "Some of the fields are deprecated, but we must still set them to their default values." + )] + #[rustfmt::skip] // rustfmt gets stuck on this (perhaps) forever. Stuck on this for literal minutes 😅 + let input = Relation { + common: Some( + RelationCommon { + source_info: String::new(), + plan_id: Some( + 4, + ), + origin: None, + }, + ), + rel_type: Some( + RelType::ShowString( + Box::new(ShowString { + input: Some( + Box::new(Relation { + common: Some( + RelationCommon { + source_info: String::new(), + plan_id: Some( + 3, + ), + origin: None, + }, + ), + rel_type: Some( + RelType::WithColumns( + Box::new(WithColumns { + input: Some( + Box::new(Relation { + common: Some( + RelationCommon { + source_info: String::new(), + plan_id: Some( + 2, + ), + origin: None, + }, + ), + rel_type: Some( + RelType::Filter( + Box::new(Filter { + input: Some( + Box::new(Relation { + common: Some( + RelationCommon { + source_info: String::new(), + plan_id: Some( + 0, + ), + origin: None, + }, + ), + rel_type: Some( + RelType::Read( + Read { + is_streaming: false, + read_type: Some( + ReadType::DataSource( + DataSource { + format: Some( + "parquet".to_string(), + ), + schema: Some( + String::new(), + ), + options: HashMap::new(), + paths: vec![ + path.to_string(), + ], + predicates: Vec::new(), + }, + ), + ), + }, + ), + ), + }), + ), + condition: Some( + Expression { + common: None, + expr_type: Some( + ExprType::UnresolvedFunction( + UnresolvedFunction { + function_name: ">".to_string(), + arguments: vec![ + Expression { + common: None, + expr_type: Some( + ExprType::UnresolvedAttribute( + UnresolvedAttribute { + unparsed_identifier: "id".to_string(), + plan_id: None, + is_metadata_column: None, + }, + ), + ), + }, + Expression { + common: None, + expr_type: Some( + ExprType::Literal( + Literal { + literal_type: Some( + LiteralType::Integer( + 2, + ), + ), + }, + ), + ), + }, + ], + is_distinct: false, + is_user_defined_function: false, + }, + ), + ), + }, + ), + }), + ), + ), + }), + ), + aliases: vec![ + Alias { + expr: Some( + Box::new(Expression { + common: None, + expr_type: Some( + ExprType::UnresolvedFunction( + UnresolvedFunction { + function_name: "+".to_string(), + arguments: vec![ + Expression { + common: None, + expr_type: Some( + ExprType::UnresolvedAttribute( + UnresolvedAttribute { + unparsed_identifier: "id".to_string(), + plan_id: None, + is_metadata_column: None, + }, + ), + ), + }, + Expression { + common: None, + expr_type: Some( + ExprType::Literal( + Literal { + literal_type: Some( + LiteralType::Integer( + 2, + ), + ), + }, + ), + ), + }, + ], + is_distinct: false, + is_user_defined_function: false, + }, + ), + ), + }), + ), + name: vec![ + "id2".to_string(), + ], + metadata: None, + }, + ], + }), + ), + ), + }), + ), + num_rows: 20, + truncate: 20, + vertical: false, + }), + ), + ), + }; + + let plan = to_logical_plan(input).unwrap().build(); + + let result = execute_plan(plan); + + for part in result { + let part = part.unwrap(); + // println!("{part:?}"); + let tables = part.get_tables().unwrap(); + + for table in tables.iter() { + println!("{table:#?}"); + } + } +} diff --git a/src/daft-connect/src/lib.rs b/src/daft-connect/src/lib.rs new file mode 100644 index 0000000000..760eb8a254 --- /dev/null +++ b/src/daft-connect/src/lib.rs @@ -0,0 +1,309 @@ +#![feature(iterator_try_collect)] +#![feature(let_chains)] + +use std::collections::BTreeMap; + +use dashmap::DashMap; +#[cfg(feature = "python")] +use pyo3::types::PyModuleMethods; +use spark_connect::{ + command::CommandType, + spark_connect_service_server::{SparkConnectService, SparkConnectServiceServer}, + AddArtifactsRequest, AddArtifactsResponse, AnalyzePlanRequest, AnalyzePlanResponse, + ArtifactStatusesRequest, ArtifactStatusesResponse, ConfigRequest, ConfigResponse, + ExecutePlanRequest, ExecutePlanResponse, FetchErrorDetailsRequest, FetchErrorDetailsResponse, + InterruptRequest, InterruptResponse, ReattachExecuteRequest, ReleaseExecuteRequest, + ReleaseExecuteResponse, ReleaseSessionRequest, ReleaseSessionResponse, +}; +use tonic::{transport::Server, Request, Response, Status}; +use tracing::info; +use uuid::Uuid; + +mod command; +mod config; +mod convert; + +#[derive(Default)] +struct Session { + /// so order is preserved + /// + /// Also, + config_values: BTreeMap, + + id: String, + + server_side_session_id: String, +} + +pub fn start() { + let addr = "[::1]:50051".parse().unwrap(); + let service = DaftSparkConnectService::default(); + + println!("Daft-Connect server listening on {}", addr); + + std::thread::spawn(move || { + let runtime = tokio::runtime::Runtime::new().unwrap(); + runtime.block_on(async { + Server::builder() + .add_service(SparkConnectServiceServer::new(service)) + .serve(addr) + .await + .unwrap(); + }); + + println!("done with runtime") + }); +} + +#[derive(Default)] +pub struct DaftSparkConnectService { + client_to_session: DashMap, // To track session data +} + +impl DaftSparkConnectService { + fn get_session( + &self, + session_id: &str, + ) -> Result, Status> { + let Ok(uuid) = Uuid::parse_str(session_id) else { + return Err(Status::invalid_argument( + "Invalid session_id format, must be a UUID", + )); + }; + + let res = self + .client_to_session + .entry(uuid) + .or_insert_with(|| Session { + config_values: BTreeMap::new(), + id: session_id.to_string(), + server_side_session_id: Uuid::new_v4().to_string(), + }); + + Ok(res) + } +} + +#[tonic::async_trait] +impl SparkConnectService for DaftSparkConnectService { + type ExecutePlanStream = std::pin::Pin< + Box< + dyn futures::Stream> + Send + Sync + 'static, + >, + >; + type ReattachExecuteStream = std::pin::Pin< + Box< + dyn futures::Stream> + Send + Sync + 'static, + >, + >; + + async fn execute_plan( + &self, + request: Request, + ) -> Result, Status> { + let request = request.into_inner(); + + let session = self.get_session(&request.session_id)?; + + let operation = request + .operation_id + .ok_or_else(|| Status::invalid_argument("Operation ID is required"))?; + + // Proceed with executing the plan... + let plan = request + .plan + .ok_or_else(|| Status::invalid_argument("Plan is required"))?; + let plan = plan + .op_type + .ok_or_else(|| Status::invalid_argument("Plan operation is required"))?; + + use spark_connect::plan::OpType; + // println!("plan {:#?}", plan); + + let command = match plan { + OpType::Root(relation) => { + let result = session.handle_root_command(relation, operation).await?; + return Ok(Response::new(result)); + } + OpType::Command(command) => command, + }; + + let command = command + .command_type + .ok_or_else(|| Status::invalid_argument("Command type is required"))?; + + // println!("command {:#?}", command); + + match command { + CommandType::RegisterFunction(_) => {} + CommandType::WriteOperation(write) => { + let result = session.write_operation(write)?; + return Ok(Response::new(result)); + } + CommandType::CreateDataframeView(_) => {} + CommandType::WriteOperationV2(_) => {} + CommandType::SqlCommand(_) => {} + CommandType::WriteStreamOperationStart(_) => {} + CommandType::StreamingQueryCommand(_) => {} + CommandType::GetResourcesCommand(_) => {} + CommandType::StreamingQueryManagerCommand(_) => {} + CommandType::RegisterTableFunction(_) => {} + CommandType::StreamingQueryListenerBusCommand(_) => {} + CommandType::RegisterDataSource(_) => {} + CommandType::CreateResourceProfileCommand(_) => {} + CommandType::CheckpointCommand(_) => {} + CommandType::RemoveCachedRemoteRelationCommand(_) => {} + CommandType::MergeIntoTableCommand(_) => {} + CommandType::Extension(_) => {} + } + + Err(Status::unimplemented("Unsupported plan type")) + } + + async fn config( + &self, + request: Request, + ) -> Result, Status> { + let request = request.into_inner(); + + let mut session = self.get_session(&request.session_id)?; + + let Some(operation) = request.operation.and_then(|op| op.op_type) else { + return Err(Status::invalid_argument("Missing operation")); + }; + + use spark_connect::config_request::operation::OpType; + + let response = match operation { + OpType::Set(op) => session.set(op), + OpType::Get(op) => session.get(op), + OpType::GetWithDefault(op) => session.get_with_default(op), + OpType::GetOption(op) => session.get_option(op), + OpType::GetAll(op) => session.get_all(op), + OpType::Unset(op) => session.unset(op), + OpType::IsModifiable(op) => session.is_modifiable(op), + }?; + + info!("Response: {response:?}"); + + Ok(Response::new(response)) + } + + async fn add_artifacts( + &self, + _request: Request>, + ) -> Result, Status> { + Err(Status::unimplemented( + "add_artifacts operation is not yet implemented", + )) + } + + async fn analyze_plan( + &self, + request: Request, + ) -> Result, Status> { + let request = request.into_inner(); + // println!("AnalyzePlanRequest: {request:#?}"); + + // let session = self.get_session(&request.session_id)?; + + // Err(Status::unimplemented("analyze_plan operation is not yet implemented")) + + use spark_connect::analyze_plan_response::Result as AnalyzePlanResponseResult; + + let tree_string = AnalyzePlanResponseResult::TreeString( + spark_connect::analyze_plan_response::TreeString { + tree_string: "schema [unimplemented]".to_string(), + }, + ); + + let response = AnalyzePlanResponse { + session_id: request.session_id.clone(), + server_side_session_id: request.session_id, + result: Some(tree_string), + }; + + Ok(Response::new(response)) + } + + async fn artifact_status( + &self, + _request: Request, + ) -> Result, Status> { + Err(Status::unimplemented( + "artifact_status operation is not yet implemented", + )) + } + + async fn interrupt( + &self, + _request: Request, + ) -> Result, Status> { + Err(Status::unimplemented( + "interrupt operation is not yet implemented", + )) + } + + async fn reattach_execute( + &self, + request: Request, + ) -> Result, Status> { + // let request = request.into_inner(); + + // println!("reattach_execute request: {request:#?}"); + + // let session = self.get_session(&request.session_id)?; + + // Return an empty stream + let empty_stream = futures::stream::empty(); + Ok(Response::new(Box::pin(empty_stream))) + } + + async fn release_execute( + &self, + request: Request, + ) -> Result, Status> { + let request = request.into_inner(); + + let session = self.get_session(&request.session_id)?; + + // println!("release request: {request:#?}"); + + let response = ReleaseExecuteResponse { + session_id: session.id.clone(), + server_side_session_id: session.server_side_session_id.clone(), + operation_id: Some(request.operation_id), // todo: impl properly + }; + + Ok(Response::new(response)) + } + async fn release_session( + &self, + _request: Request, + ) -> Result, Status> { + Err(Status::unimplemented( + "release_session operation is not yet implemented", + )) + } + + async fn fetch_error_details( + &self, + _request: Request, + ) -> Result, Status> { + Err(Status::unimplemented( + "fetch_error_details operation is not yet implemented", + )) + } +} +#[cfg(feature = "python")] +#[pyo3::pyfunction] +#[pyo3(name = "connect_start")] +pub fn py_connect_start() { + start(); +} + +#[cfg(feature = "python")] +pub fn register_modules(parent: &pyo3::Bound) -> pyo3::PyResult<()> { + parent.add_function(pyo3::wrap_pyfunction_bound!(py_connect_start, parent)?)?; + Ok(()) +} diff --git a/src/daft-connect/src/main.rs b/src/daft-connect/src/main.rs new file mode 100644 index 0000000000..b5eb7a2662 --- /dev/null +++ b/src/daft-connect/src/main.rs @@ -0,0 +1,28 @@ +use daft_connect::DaftSparkConnectService; +use spark_connect::spark_connect_service_server::SparkConnectServiceServer; +use tonic::transport::Server; +use tracing_subscriber::{layer::SubscriberExt, EnvFilter, Registry}; +use tracing_tree::HierarchicalLayer; + +#[tokio::main] +async fn main() -> Result<(), Box> { + let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info")); + + let fmt_layer = HierarchicalLayer::new(2); + + let subscriber = Registry::default().with(env_filter).with(fmt_layer); + + tracing::subscriber::set_global_default(subscriber).unwrap(); + + let addr = "[::1]:50051".parse()?; + let service = DaftSparkConnectService::default(); + + println!("Daft-Connect server listening on {}", addr); + + Server::builder() + .add_service(SparkConnectServiceServer::new(service)) + .serve(addr) + .await?; + + Ok(()) +} diff --git a/src/daft-connect/tests/increasing_id_data.parquet b/src/daft-connect/tests/increasing_id_data.parquet new file mode 100644 index 0000000000..262c4f3ace Binary files /dev/null and b/src/daft-connect/tests/increasing_id_data.parquet differ diff --git a/src/daft-core/src/python/series.rs b/src/daft-core/src/python/series.rs index 87304b12d1..6e96dcffe9 100644 --- a/src/daft-core/src/python/series.rs +++ b/src/daft-core/src/python/series.rs @@ -27,7 +27,7 @@ use crate::{ #[pyclass] #[derive(Clone)] pub struct PySeries { - pub series: series::Series, + pub series: Series, } #[pymethods] diff --git a/src/daft-dsl/src/expr/mod.rs b/src/daft-dsl/src/expr/mod.rs index 873f9013bd..acf665b7e0 100644 --- a/src/daft-dsl/src/expr/mod.rs +++ b/src/daft-dsl/src/expr/mod.rs @@ -109,7 +109,8 @@ pub enum AggExpr { #[display("sum({_0})")] Sum(ExprRef), - #[display("approx_percentile({}, percentiles={:?}, force_list_output={})", _0.child, _0.percentiles, _0.force_list_output)] + #[display("approx_percentile({}, percentiles={:?}, force_list_output={})", _0.child, _0.percentiles, _0.force_list_output + )] ApproxPercentile(ApproxPercentileParams), #[display("approx_count_distinct({_0})")] @@ -155,8 +156,36 @@ pub enum SketchType { HyperLogLog, } -pub fn col>>(name: S) -> ExprRef { - Expr::Column(name.into()).into() +pub trait ToArcStr { + fn to_arc_str(self) -> Arc; +} + +impl ToArcStr for &str { + fn to_arc_str(self) -> Arc { + self.into() + } +} + +impl ToArcStr for String { + fn to_arc_str(self) -> Arc { + self.into() + } +} + +impl ToArcStr for Arc { + fn to_arc_str(self) -> Arc { + self + } +} + +impl ToArcStr for &String { + fn to_arc_str(self) -> Arc { + Arc::from(self.as_str()) + } +} + +pub fn col(name: impl ToArcStr) -> ExprRef { + Expr::Column(name.to_arc_str()).into() } pub fn binary_op(op: Operator, left: ExprRef, right: ExprRef) -> ExprRef { diff --git a/src/daft-local-execution/src/lib.rs b/src/daft-local-execution/src/lib.rs index c316434a63..5571c76a3c 100644 --- a/src/daft-local-execution/src/lib.rs +++ b/src/daft-local-execution/src/lib.rs @@ -1,8 +1,8 @@ #![feature(let_chains)] mod channel; mod intermediate_ops; -mod pipeline; -mod run; +pub mod pipeline; +pub mod run; mod runtime_stats; mod sinks; mod sources; diff --git a/src/daft-plan/src/builder.rs b/src/daft-plan/src/builder.rs index 1a6fbb8503..440a6efae2 100644 --- a/src/daft-plan/src/builder.rs +++ b/src/daft-plan/src/builder.rs @@ -4,13 +4,15 @@ use std::{ }; use common_daft_config::DaftPlanningConfig; -use common_display::mermaid::MermaidDisplayOptions; +use common_display::{mermaid::MermaidDisplayOptions, DisplayAs, DisplayLevel}; use common_error::DaftResult; use common_file_formats::{FileFormat, FileFormatConfig, ParquetSourceConfig}; use common_io_config::IOConfig; use daft_core::{ + datatypes::Utf8Array, join::{JoinStrategy, JoinType}, prelude::TimeUnit, + series::IntoSeries, }; use daft_dsl::{col, ExprRef}; use daft_scan::{ @@ -244,12 +246,74 @@ impl LogicalPlanBuilder { ParquetScanBuilder::new(glob_path) } + /// Add a new column to the logical plan. + pub fn with_column(&self, name: &str, expr: impl Into) -> DaftResult { + let expr = expr.into(); + let current_schema = self.schema(); + let mut new_exprs: Vec = current_schema + .fields + .iter() + .map(|(field_name, _)| col(field_name)) + .collect(); + + new_exprs.push(expr.alias(name)); + + self.select(new_exprs) + } + + /// Select specific columns or expressions to include in the logical plan. + /// + /// This method creates a new logical plan that projects only the specified columns or expressions. + /// It's particularly useful for reducing the number of columns in the output or for creating + /// new columns based on expressions. + /// + /// # Examples + /// + /// ```no_run + /// use daft_plan::LogicalPlanBuilder; + /// use daft_dsl::{col, lit}; + /// use daft_schema::dtype::DataType; + /// + /// let builder: LogicalPlanBuilder = unimplemented!("You will need to replace this with your own logic"); + /// + /// // Select existing columns + /// let result = builder.select(vec![col("name"), col("age")]); + /// + /// // Select with expressions + /// let result = builder.select(vec![ + /// col("name"), + /// (col("age") + lit(1)).alias("age_next_year"), + /// col("salary").cast(DataType::Float64), + /// ]); + /// + /// // Select with a complex expression + /// let result = builder.select(vec![ + /// col("name"), + /// (col("salary") * lit(1.1)).alias("increased_salary"), + /// ]); + /// ``` pub fn select(&self, to_select: Vec) -> DaftResult { let logical_plan: LogicalPlan = logical_ops::Project::try_new(self.plan.clone(), to_select)?.into(); Ok(self.with_new_plan(logical_plan)) } + pub fn add_show_string_column(&self) -> DaftResult { + // todo: should NOT broadcast; should only set first row + let schema = self.schema(); + let display = schema.display_as(DisplayLevel::Default); + + let utf8_data = vec![Some(display)]; + let utf8_array = arrow2::array::Utf8Array::::from(utf8_data).boxed(); + + let field = Field::new("show_string", DataType::Utf8); + let series = Utf8Array::try_from((Arc::new(field), utf8_array))?.into_series(); + + let expr = daft_dsl::lit(series); + + self.with_column("show_string", expr) + } + pub fn with_columns(&self, columns: Vec) -> DaftResult { let fields = &self.schema().fields; let current_col_names = fields diff --git a/src/daft-sql/src/planner.rs b/src/daft-sql/src/planner.rs index 5ffcbb16dd..bbd8c20da4 100644 --- a/src/daft-sql/src/planner.rs +++ b/src/daft-sql/src/planner.rs @@ -269,9 +269,9 @@ impl SQLPlanner { // switch left/right operands if the caller has them in reverse if left_name == tbl_b || right_name == tbl_a { - Ok((vec![col(col_b.as_ref())], vec![col(col_a.as_ref())])) + Ok((vec![col(col_b)], vec![col(col_a)])) } else { - Ok((vec![col(col_a.as_ref())], vec![col(col_b.as_ref())])) + Ok((vec![col(col_a)], vec![col(col_b)])) } } else { unsupported_sql_err!("collect_compound_identifiers: Expected left.len() == 2 && right.len() == 2, but found left.len() == {:?}, right.len() == {:?}", left.len(), right.len()); @@ -510,13 +510,7 @@ impl SQLPlanner { current_relation.inner.schema().exclude(items.as_slice()) } } - .map(|schema| { - schema - .names() - .iter() - .map(|n| col(n.as_ref())) - .collect::>() - }) + .map(|schema| schema.names().iter().map(col).collect::>()) .map_err(std::convert::Into::into) } else { Ok(vec![col("*")]) diff --git a/src/daft-table/src/lib.rs b/src/daft-table/src/lib.rs index 1d84e3d7b1..cbd2d65edb 100644 --- a/src/daft-table/src/lib.rs +++ b/src/daft-table/src/lib.rs @@ -59,6 +59,10 @@ fn _validate_schema(schema: &Schema, columns: &[Series]) -> DaftResult<()> { } impl Table { + pub fn get_inner_arrow_arrays(&self) -> Vec> { + self.columns.iter().map(|s| s.inner.to_arrow()).collect() + } + /// Create a new [`Table`] and handle broadcasting of any unit-length columns /// /// Note that this function is slow. You might instead be looking for [`Table::new_with_size`] which does not perform broadcasting diff --git a/src/lib.rs b/src/lib.rs index a7a1382538..201f6b229f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -118,6 +118,7 @@ pub mod pylib { daft_sql::register_modules(m)?; daft_functions::register_modules(m)?; daft_functions_json::register_modules(m)?; + daft_connect::register_modules(m)?; m.add_wrapped(wrap_pyfunction!(version))?; m.add_wrapped(wrap_pyfunction!(build_type))?; diff --git a/src/spark-connect/Cargo.toml b/src/spark-connect/Cargo.toml new file mode 100644 index 0000000000..f40f11133d --- /dev/null +++ b/src/spark-connect/Cargo.toml @@ -0,0 +1,14 @@ +[build-dependencies] + +[dependencies] +prost = "0.13.3" +prost-types = "0.13.3" +tonic = "0.12.3" + +[lints] +workspace = true + +[package] +edition = {workspace = true} +name = "spark-connect" +version = {workspace = true} diff --git a/src/spark-connect/build.rs b/src/spark-connect/build.rs new file mode 100644 index 0000000000..5432ec61cc --- /dev/null +++ b/src/spark-connect/build.rs @@ -0,0 +1,15 @@ +fn main() -> std::io::Result<()> { + // tonic_build::configure().build_server(true).compile_protos( + // &[ + // "proto/spark/connect/base.proto", + // "proto/spark/connect/catalog.proto", + // "proto/spark/connect/commands.proto", + // "proto/spark/connect/common.proto", + // "proto/spark/connect/expressions.proto", + // "proto/spark/connect/relations.proto", + // "proto/spark/connect/types.proto", + // ], + // &["proto"], + // )?; + Ok(()) +} diff --git a/src/spark-connect/proto/spark/connect/base.proto b/src/spark-connect/proto/spark/connect/base.proto new file mode 100644 index 0000000000..e3c84ddd5e --- /dev/null +++ b/src/spark-connect/proto/spark/connect/base.proto @@ -0,0 +1,1103 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +syntax = 'proto3'; + +package spark.connect; + +import "google/protobuf/any.proto"; +import "spark/connect/commands.proto"; +import "spark/connect/common.proto"; +import "spark/connect/expressions.proto"; +import "spark/connect/relations.proto"; +import "spark/connect/types.proto"; + +option java_multiple_files = true; +option java_package = "org.apache.spark.connect.proto"; +option go_package = "internal/generated"; + +// A [[Plan]] is the structure that carries the runtime information for the execution from the +// client to the server. A [[Plan]] can either be of the type [[Relation]] which is a reference +// to the underlying logical plan or it can be of the [[Command]] type that is used to execute +// commands on the server. +message Plan { + oneof op_type { + Relation root = 1; + Command command = 2; + } +} + + + +// User Context is used to refer to one particular user session that is executing +// queries in the backend. +message UserContext { + string user_id = 1; + string user_name = 2; + + // To extend the existing user context message that is used to identify incoming requests, + // Spark Connect leverages the Any protobuf type that can be used to inject arbitrary other + // messages into this message. Extensions are stored as a `repeated` type to be able to + // handle multiple active extensions. + repeated google.protobuf.Any extensions = 999; +} + +// Request to perform plan analyze, optionally to explain the plan. +message AnalyzePlanRequest { + // (Required) + // + // The session_id specifies a spark session for a user id (which is specified + // by user_context.user_id). The session_id is set by the client to be able to + // collate streaming responses from different queries within the dedicated session. + // The id should be an UUID string of the format `00112233-4455-6677-8899-aabbccddeeff` + string session_id = 1; + + // (Optional) + // + // Server-side generated idempotency key from the previous responses (if any). Server + // can use this to validate that the server side session has not changed. + optional string client_observed_server_side_session_id = 17; + + // (Required) User context + UserContext user_context = 2; + + // Provides optional information about the client sending the request. This field + // can be used for language or version specific information and is only intended for + // logging purposes and will not be interpreted by the server. + optional string client_type = 3; + + oneof analyze { + Schema schema = 4; + Explain explain = 5; + TreeString tree_string = 6; + IsLocal is_local = 7; + IsStreaming is_streaming = 8; + InputFiles input_files = 9; + SparkVersion spark_version = 10; + DDLParse ddl_parse = 11; + SameSemantics same_semantics = 12; + SemanticHash semantic_hash = 13; + Persist persist = 14; + Unpersist unpersist = 15; + GetStorageLevel get_storage_level = 16; + } + + message Schema { + // (Required) The logical plan to be analyzed. + Plan plan = 1; + } + + // Explains the input plan based on a configurable mode. + message Explain { + // (Required) The logical plan to be analyzed. + Plan plan = 1; + + // (Required) For analyzePlan rpc calls, configure the mode to explain plan in strings. + ExplainMode explain_mode = 2; + + // Plan explanation mode. + enum ExplainMode { + EXPLAIN_MODE_UNSPECIFIED = 0; + + // Generates only physical plan. + EXPLAIN_MODE_SIMPLE = 1; + + // Generates parsed logical plan, analyzed logical plan, optimized logical plan and physical plan. + // Parsed Logical plan is a unresolved plan that extracted from the query. Analyzed logical plans + // transforms which translates unresolvedAttribute and unresolvedRelation into fully typed objects. + // The optimized logical plan transforms through a set of optimization rules, resulting in the + // physical plan. + EXPLAIN_MODE_EXTENDED = 2; + + // Generates code for the statement, if any and a physical plan. + EXPLAIN_MODE_CODEGEN = 3; + + // If plan node statistics are available, generates a logical plan and also the statistics. + EXPLAIN_MODE_COST = 4; + + // Generates a physical plan outline and also node details. + EXPLAIN_MODE_FORMATTED = 5; + } + } + + message TreeString { + // (Required) The logical plan to be analyzed. + Plan plan = 1; + + // (Optional) Max level of the schema. + optional int32 level = 2; + } + + message IsLocal { + // (Required) The logical plan to be analyzed. + Plan plan = 1; + } + + message IsStreaming { + // (Required) The logical plan to be analyzed. + Plan plan = 1; + } + + message InputFiles { + // (Required) The logical plan to be analyzed. + Plan plan = 1; + } + + message SparkVersion { } + + message DDLParse { + // (Required) The DDL formatted string to be parsed. + string ddl_string = 1; + } + + + // Returns `true` when the logical query plans are equal and therefore return same results. + message SameSemantics { + // (Required) The plan to be compared. + Plan target_plan = 1; + + // (Required) The other plan to be compared. + Plan other_plan = 2; + } + + message SemanticHash { + // (Required) The logical plan to get a hashCode. + Plan plan = 1; + } + + message Persist { + // (Required) The logical plan to persist. + Relation relation = 1; + + // (Optional) The storage level. + optional StorageLevel storage_level = 2; + } + + message Unpersist { + // (Required) The logical plan to unpersist. + Relation relation = 1; + + // (Optional) Whether to block until all blocks are deleted. + optional bool blocking = 2; + } + + message GetStorageLevel { + // (Required) The logical plan to get the storage level. + Relation relation = 1; + } +} + +// Response to performing analysis of the query. Contains relevant metadata to be able to +// reason about the performance. +// Next ID: 16 +message AnalyzePlanResponse { + string session_id = 1; + // Server-side generated idempotency key that the client can use to assert that the server side + // session has not changed. + string server_side_session_id = 15; + + oneof result { + Schema schema = 2; + Explain explain = 3; + TreeString tree_string = 4; + IsLocal is_local = 5; + IsStreaming is_streaming = 6; + InputFiles input_files = 7; + SparkVersion spark_version = 8; + DDLParse ddl_parse = 9; + SameSemantics same_semantics = 10; + SemanticHash semantic_hash = 11; + Persist persist = 12; + Unpersist unpersist = 13; + GetStorageLevel get_storage_level = 14; + } + + message Schema { + DataType schema = 1; + } + + message Explain { + string explain_string = 1; + } + + message TreeString { + string tree_string = 1; + } + + message IsLocal { + bool is_local = 1; + } + + message IsStreaming { + bool is_streaming = 1; + } + + message InputFiles { + // A best-effort snapshot of the files that compose this Dataset + repeated string files = 1; + } + + message SparkVersion { + string version = 1; + } + + message DDLParse { + DataType parsed = 1; + } + + message SameSemantics { + bool result = 1; + } + + message SemanticHash { + int32 result = 1; + } + + message Persist { } + + message Unpersist { } + + message GetStorageLevel { + // (Required) The StorageLevel as a result of get_storage_level request. + StorageLevel storage_level = 1; + } +} + +// A request to be executed by the service. +message ExecutePlanRequest { + // (Required) + // + // The session_id specifies a spark session for a user id (which is specified + // by user_context.user_id). The session_id is set by the client to be able to + // collate streaming responses from different queries within the dedicated session. + // The id should be an UUID string of the format `00112233-4455-6677-8899-aabbccddeeff` + string session_id = 1; + + // (Optional) + // + // Server-side generated idempotency key from the previous responses (if any). Server + // can use this to validate that the server side session has not changed. + optional string client_observed_server_side_session_id = 8; + + // (Required) User context + // + // user_context.user_id and session+id both identify a unique remote spark session on the + // server side. + UserContext user_context = 2; + + // (Optional) + // Provide an id for this request. If not provided, it will be generated by the server. + // It is returned in every ExecutePlanResponse.operation_id of the ExecutePlan response stream. + // The id must be an UUID string of the format `00112233-4455-6677-8899-aabbccddeeff` + optional string operation_id = 6; + + // (Required) The logical plan to be executed / analyzed. + Plan plan = 3; + + // Provides optional information about the client sending the request. This field + // can be used for language or version specific information and is only intended for + // logging purposes and will not be interpreted by the server. + optional string client_type = 4; + + // Repeated element for options that can be passed to the request. This element is currently + // unused but allows to pass in an extension value used for arbitrary options. + repeated RequestOption request_options = 5; + + message RequestOption { + oneof request_option { + ReattachOptions reattach_options = 1; + // Extension type for request options + google.protobuf.Any extension = 999; + } + } + + // Tags to tag the given execution with. + // Tags cannot contain ',' character and cannot be empty strings. + // Used by Interrupt with interrupt.tag. + repeated string tags = 7; +} + +// The response of a query, can be one or more for each request. Responses belonging to the +// same input query, carry the same `session_id`. +// Next ID: 17 +message ExecutePlanResponse { + string session_id = 1; + // Server-side generated idempotency key that the client can use to assert that the server side + // session has not changed. + string server_side_session_id = 15; + + // Identifies the ExecutePlan execution. + // If set by the client in ExecutePlanRequest.operationId, that value is returned. + // Otherwise generated by the server. + // It is an UUID string of the format `00112233-4455-6677-8899-aabbccddeeff` + string operation_id = 12; + + // Identified the response in the stream. + // The id is an UUID string of the format `00112233-4455-6677-8899-aabbccddeeff` + string response_id = 13; + + // Union type for the different response messages. + oneof response_type { + ArrowBatch arrow_batch = 2; + + // Special case for executing SQL commands. + SqlCommandResult sql_command_result = 5; + + // Response for a streaming query. + WriteStreamOperationStartResult write_stream_operation_start_result = 8; + + // Response for commands on a streaming query. + StreamingQueryCommandResult streaming_query_command_result = 9; + + // Response for 'SparkContext.resources'. + GetResourcesCommandResult get_resources_command_result = 10; + + // Response for commands on the streaming query manager. + StreamingQueryManagerCommandResult streaming_query_manager_command_result = 11; + + // Response for commands on the client side streaming query listener. + StreamingQueryListenerEventsResult streaming_query_listener_events_result = 16; + + // Response type informing if the stream is complete in reattachable execution. + ResultComplete result_complete = 14; + + // Response for command that creates ResourceProfile. + CreateResourceProfileCommandResult create_resource_profile_command_result = 17; + + // (Optional) Intermediate query progress reports. + ExecutionProgress execution_progress = 18; + + // Response for command that checkpoints a DataFrame. + CheckpointCommandResult checkpoint_command_result = 19; + + // Support arbitrary result objects. + google.protobuf.Any extension = 999; + } + + // Metrics for the query execution. Typically, this field is only present in the last + // batch of results and then represent the overall state of the query execution. + Metrics metrics = 4; + + // The metrics observed during the execution of the query plan. + repeated ObservedMetrics observed_metrics = 6; + + // (Optional) The Spark schema. This field is available when `collect` is called. + DataType schema = 7; + + // A SQL command returns an opaque Relation that can be directly used as input for the next + // call. + message SqlCommandResult { + Relation relation = 1; + } + + // Batch results of metrics. + message ArrowBatch { + // Count rows in `data`. Must match the number of rows inside `data`. + int64 row_count = 1; + // Serialized Arrow data. + bytes data = 2; + + // If set, row offset of the start of this ArrowBatch in execution results. + optional int64 start_offset = 3; + } + + message Metrics { + + repeated MetricObject metrics = 1; + + message MetricObject { + string name = 1; + int64 plan_id = 2; + int64 parent = 3; + map execution_metrics = 4; + } + + message MetricValue { + string name = 1; + int64 value = 2; + string metric_type = 3; + } + } + + message ObservedMetrics { + string name = 1; + repeated Expression.Literal values = 2; + repeated string keys = 3; + int64 plan_id = 4; + } + + message ResultComplete { + // If present, in a reattachable execution this means that after server sends onComplete, + // the execution is complete. If the server sends onComplete without sending a ResultComplete, + // it means that there is more, and the client should use ReattachExecute RPC to continue. + } + + // This message is used to communicate progress about the query progress during the execution. + message ExecutionProgress { + // Captures the progress of each individual stage. + repeated StageInfo stages = 1; + + // Captures the currently in progress tasks. + int64 num_inflight_tasks = 2; + + message StageInfo { + int64 stage_id = 1; + int64 num_tasks = 2; + int64 num_completed_tasks = 3; + int64 input_bytes_read = 4; + bool done = 5; + } + } +} + +// The key-value pair for the config request and response. +message KeyValue { + // (Required) The key. + string key = 1; + // (Optional) The value. + optional string value = 2; +} + +// Request to update or fetch the configurations. +message ConfigRequest { + // (Required) + // + // The session_id specifies a spark session for a user id (which is specified + // by user_context.user_id). The session_id is set by the client to be able to + // collate streaming responses from different queries within the dedicated session. + // The id should be an UUID string of the format `00112233-4455-6677-8899-aabbccddeeff` + string session_id = 1; + + // (Optional) + // + // Server-side generated idempotency key from the previous responses (if any). Server + // can use this to validate that the server side session has not changed. + optional string client_observed_server_side_session_id = 8; + + // (Required) User context + UserContext user_context = 2; + + // (Required) The operation for the config. + Operation operation = 3; + + // Provides optional information about the client sending the request. This field + // can be used for language or version specific information and is only intended for + // logging purposes and will not be interpreted by the server. + optional string client_type = 4; + + message Operation { + oneof op_type { + Set set = 1; + Get get = 2; + GetWithDefault get_with_default = 3; + GetOption get_option = 4; + GetAll get_all = 5; + Unset unset = 6; + IsModifiable is_modifiable = 7; + } + } + + message Set { + // (Required) The config key-value pairs to set. + repeated KeyValue pairs = 1; + } + + message Get { + // (Required) The config keys to get. + repeated string keys = 1; + } + + message GetWithDefault { + // (Required) The config key-value pairs to get. The value will be used as the default value. + repeated KeyValue pairs = 1; + } + + message GetOption { + // (Required) The config keys to get optionally. + repeated string keys = 1; + } + + message GetAll { + // (Optional) The prefix of the config key to get. + optional string prefix = 1; + } + + message Unset { + // (Required) The config keys to unset. + repeated string keys = 1; + } + + message IsModifiable { + // (Required) The config keys to check the config is modifiable. + repeated string keys = 1; + } +} + +// Response to the config request. +// Next ID: 5 +message ConfigResponse { + string session_id = 1; + // Server-side generated idempotency key that the client can use to assert that the server side + // session has not changed. + string server_side_session_id = 4; + + // (Optional) The result key-value pairs. + // + // Available when the operation is 'Get', 'GetWithDefault', 'GetOption', 'GetAll'. + // Also available for the operation 'IsModifiable' with boolean string "true" and "false". + repeated KeyValue pairs = 2; + + // (Optional) + // + // Warning messages for deprecated or unsupported configurations. + repeated string warnings = 3; +} + +// Request to transfer client-local artifacts. +message AddArtifactsRequest { + + // (Required) + // + // The session_id specifies a spark session for a user id (which is specified + // by user_context.user_id). The session_id is set by the client to be able to + // collate streaming responses from different queries within the dedicated session. + // The id should be an UUID string of the format `00112233-4455-6677-8899-aabbccddeeff` + string session_id = 1; + + // User context + UserContext user_context = 2; + + // (Optional) + // + // Server-side generated idempotency key from the previous responses (if any). Server + // can use this to validate that the server side session has not changed. + optional string client_observed_server_side_session_id = 7; + + // Provides optional information about the client sending the request. This field + // can be used for language or version specific information and is only intended for + // logging purposes and will not be interpreted by the server. + optional string client_type = 6; + + // A chunk of an Artifact. + message ArtifactChunk { + // Data chunk. + bytes data = 1; + // CRC to allow server to verify integrity of the chunk. + int64 crc = 2; + } + + // An artifact that is contained in a single `ArtifactChunk`. + // Generally, this message represents tiny artifacts such as REPL-generated class files. + message SingleChunkArtifact { + // The name of the artifact is expected in the form of a "Relative Path" that is made up of a + // sequence of directories and the final file element. + // Examples of "Relative Path"s: "jars/test.jar", "classes/xyz.class", "abc.xyz", "a/b/X.jar". + // The server is expected to maintain the hierarchy of files as defined by their name. (i.e + // The relative path of the file on the server's filesystem will be the same as the name of + // the provided artifact) + string name = 1; + // A single data chunk. + ArtifactChunk data = 2; + } + + // A number of `SingleChunkArtifact` batched into a single RPC. + message Batch { + repeated SingleChunkArtifact artifacts = 1; + } + + // Signals the beginning/start of a chunked artifact. + // A large artifact is transferred through a payload of `BeginChunkedArtifact` followed by a + // sequence of `ArtifactChunk`s. + message BeginChunkedArtifact { + // Name of the artifact undergoing chunking. Follows the same conventions as the `name` in + // the `Artifact` message. + string name = 1; + // Total size of the artifact in bytes. + int64 total_bytes = 2; + // Number of chunks the artifact is split into. + // This includes the `initial_chunk`. + int64 num_chunks = 3; + // The first/initial chunk. + ArtifactChunk initial_chunk = 4; + } + + // The payload is either a batch of artifacts or a partial chunk of a large artifact. + oneof payload { + Batch batch = 3; + // The metadata and the initial chunk of a large artifact chunked into multiple requests. + // The server side is notified about the total size of the large artifact as well as the + // number of chunks to expect. + BeginChunkedArtifact begin_chunk = 4; + // A chunk of an artifact excluding metadata. This can be any chunk of a large artifact + // excluding the first chunk (which is included in `BeginChunkedArtifact`). + ArtifactChunk chunk = 5; + } +} + +// Response to adding an artifact. Contains relevant metadata to verify successful transfer of +// artifact(s). +// Next ID: 4 +message AddArtifactsResponse { + // Session id in which the AddArtifact was running. + string session_id = 2; + // Server-side generated idempotency key that the client can use to assert that the server side + // session has not changed. + string server_side_session_id = 3; + + // The list of artifact(s) seen by the server. + repeated ArtifactSummary artifacts = 1; + + // Metadata of an artifact. + message ArtifactSummary { + string name = 1; + // Whether the CRC (Cyclic Redundancy Check) is successful on server verification. + // The server discards any artifact that fails the CRC. + // If false, the client may choose to resend the artifact specified by `name`. + bool is_crc_successful = 2; + } +} + +// Request to get current statuses of artifacts at the server side. +message ArtifactStatusesRequest { + // (Required) + // + // The session_id specifies a spark session for a user id (which is specified + // by user_context.user_id). The session_id is set by the client to be able to + // collate streaming responses from different queries within the dedicated session. + // The id should be an UUID string of the format `00112233-4455-6677-8899-aabbccddeeff` + string session_id = 1; + + // (Optional) + // + // Server-side generated idempotency key from the previous responses (if any). Server + // can use this to validate that the server side session has not changed. + optional string client_observed_server_side_session_id = 5; + + // User context + UserContext user_context = 2; + + // Provides optional information about the client sending the request. This field + // can be used for language or version specific information and is only intended for + // logging purposes and will not be interpreted by the server. + optional string client_type = 3; + + // The name of the artifact is expected in the form of a "Relative Path" that is made up of a + // sequence of directories and the final file element. + // Examples of "Relative Path"s: "jars/test.jar", "classes/xyz.class", "abc.xyz", "a/b/X.jar". + // The server is expected to maintain the hierarchy of files as defined by their name. (i.e + // The relative path of the file on the server's filesystem will be the same as the name of + // the provided artifact) + repeated string names = 4; +} + +// Response to checking artifact statuses. +// Next ID: 4 +message ArtifactStatusesResponse { + // Session id in which the ArtifactStatus was running. + string session_id = 2; + // Server-side generated idempotency key that the client can use to assert that the server side + // session has not changed. + string server_side_session_id = 3; + // A map of artifact names to their statuses. + map statuses = 1; + + message ArtifactStatus { + // Exists or not particular artifact at the server. + bool exists = 1; + } +} + +message InterruptRequest { + // (Required) + // + // The session_id specifies a spark session for a user id (which is specified + // by user_context.user_id). The session_id is set by the client to be able to + // collate streaming responses from different queries within the dedicated session. + // The id should be an UUID string of the format `00112233-4455-6677-8899-aabbccddeeff` + string session_id = 1; + + // (Optional) + // + // Server-side generated idempotency key from the previous responses (if any). Server + // can use this to validate that the server side session has not changed. + optional string client_observed_server_side_session_id = 7; + + // (Required) User context + UserContext user_context = 2; + + // Provides optional information about the client sending the request. This field + // can be used for language or version specific information and is only intended for + // logging purposes and will not be interpreted by the server. + optional string client_type = 3; + + // (Required) The type of interrupt to execute. + InterruptType interrupt_type = 4; + + enum InterruptType { + INTERRUPT_TYPE_UNSPECIFIED = 0; + + // Interrupt all running executions within the session with the provided session_id. + INTERRUPT_TYPE_ALL = 1; + + // Interrupt all running executions within the session with the provided operation_tag. + INTERRUPT_TYPE_TAG = 2; + + // Interrupt the running execution within the session with the provided operation_id. + INTERRUPT_TYPE_OPERATION_ID = 3; + } + + oneof interrupt { + // if interrupt_tag == INTERRUPT_TYPE_TAG, interrupt operation with this tag. + string operation_tag = 5; + + // if interrupt_tag == INTERRUPT_TYPE_OPERATION_ID, interrupt operation with this operation_id. + string operation_id = 6; + } +} + +// Next ID: 4 +message InterruptResponse { + // Session id in which the interrupt was running. + string session_id = 1; + // Server-side generated idempotency key that the client can use to assert that the server side + // session has not changed. + string server_side_session_id = 3; + + // Operation ids of the executions which were interrupted. + repeated string interrupted_ids = 2; + +} + +message ReattachOptions { + // If true, the request can be reattached to using ReattachExecute. + // ReattachExecute can be used either if the stream broke with a GRPC network error, + // or if the server closed the stream without sending a response with StreamStatus.complete=true. + // The server will keep a buffer of responses in case a response is lost, and + // ReattachExecute needs to back-track. + // + // If false, the execution response stream will will not be reattachable, and all responses are + // immediately released by the server after being sent. + bool reattachable = 1; +} + +message ReattachExecuteRequest { + // (Required) + // + // The session_id of the request to reattach to. + // This must be an id of existing session. + string session_id = 1; + + // (Optional) + // + // Server-side generated idempotency key from the previous responses (if any). Server + // can use this to validate that the server side session has not changed. + optional string client_observed_server_side_session_id = 6; + + // (Required) User context + // + // user_context.user_id and session+id both identify a unique remote spark session on the + // server side. + UserContext user_context = 2; + + // (Required) + // Provide an id of the request to reattach to. + // This must be an id of existing operation. + string operation_id = 3; + + // Provides optional information about the client sending the request. This field + // can be used for language or version specific information and is only intended for + // logging purposes and will not be interpreted by the server. + optional string client_type = 4; + + // (Optional) + // Last already processed response id from the response stream. + // After reattach, server will resume the response stream after that response. + // If not specified, server will restart the stream from the start. + // + // Note: server controls the amount of responses that it buffers and it may drop responses, + // that are far behind the latest returned response, so this can't be used to arbitrarily + // scroll back the cursor. If the response is no longer available, this will result in an error. + optional string last_response_id = 5; +} + +message ReleaseExecuteRequest { + // (Required) + // + // The session_id of the request to reattach to. + // This must be an id of existing session. + string session_id = 1; + + // (Optional) + // + // Server-side generated idempotency key from the previous responses (if any). Server + // can use this to validate that the server side session has not changed. + optional string client_observed_server_side_session_id = 7; + + // (Required) User context + // + // user_context.user_id and session+id both identify a unique remote spark session on the + // server side. + UserContext user_context = 2; + + // (Required) + // Provide an id of the request to reattach to. + // This must be an id of existing operation. + string operation_id = 3; + + // Provides optional information about the client sending the request. This field + // can be used for language or version specific information and is only intended for + // logging purposes and will not be interpreted by the server. + optional string client_type = 4; + + // Release and close operation completely. + // This will also interrupt the query if it is running execution, and wait for it to be torn down. + message ReleaseAll {} + + // Release all responses from the operation response stream up to and including + // the response with the given by response_id. + // While server determines by itself how much of a buffer of responses to keep, client providing + // explicit release calls will help reduce resource consumption. + // Noop if response_id not found in cached responses. + message ReleaseUntil { + string response_id = 1; + } + + oneof release { + ReleaseAll release_all = 5; + ReleaseUntil release_until = 6; + } +} + +// Next ID: 4 +message ReleaseExecuteResponse { + // Session id in which the release was running. + string session_id = 1; + // Server-side generated idempotency key that the client can use to assert that the server side + // session has not changed. + string server_side_session_id = 3; + + // Operation id of the operation on which the release executed. + // If the operation couldn't be found (because e.g. it was concurrently released), will be unset. + // Otherwise, it will be equal to the operation_id from request. + optional string operation_id = 2; +} + +message ReleaseSessionRequest { + // (Required) + // + // The session_id of the request to reattach to. + // This must be an id of existing session. + string session_id = 1; + + // (Required) User context + // + // user_context.user_id and session+id both identify a unique remote spark session on the + // server side. + UserContext user_context = 2; + + // Provides optional information about the client sending the request. This field + // can be used for language or version specific information and is only intended for + // logging purposes and will not be interpreted by the server. + optional string client_type = 3; +} + +// Next ID: 3 +message ReleaseSessionResponse { + // Session id of the session on which the release executed. + string session_id = 1; + // Server-side generated idempotency key that the client can use to assert that the server side + // session has not changed. + string server_side_session_id = 2; +} + +message FetchErrorDetailsRequest { + + // (Required) + // The session_id specifies a Spark session for a user identified by user_context.user_id. + // The id should be a UUID string of the format `00112233-4455-6677-8899-aabbccddeeff`. + string session_id = 1; + + // (Optional) + // + // Server-side generated idempotency key from the previous responses (if any). Server + // can use this to validate that the server side session has not changed. + optional string client_observed_server_side_session_id = 5; + + // User context + UserContext user_context = 2; + + // (Required) + // The id of the error. + string error_id = 3; + + // Provides optional information about the client sending the request. This field + // can be used for language or version specific information and is only intended for + // logging purposes and will not be interpreted by the server. + optional string client_type = 4; +} + +// Next ID: 5 +message FetchErrorDetailsResponse { + + // Server-side generated idempotency key that the client can use to assert that the server side + // session has not changed. + string server_side_session_id = 3; + + string session_id = 4; + + // The index of the root error in errors. The field will not be set if the error is not found. + optional int32 root_error_idx = 1; + + // A list of errors. + repeated Error errors = 2; + + message StackTraceElement { + // The fully qualified name of the class containing the execution point. + string declaring_class = 1; + + // The name of the method containing the execution point. + string method_name = 2; + + // The name of the file containing the execution point. + optional string file_name = 3; + + // The line number of the source line containing the execution point. + int32 line_number = 4; + } + + // QueryContext defines the schema for the query context of a SparkThrowable. + // It helps users understand where the error occurs while executing queries. + message QueryContext { + // The type of this query context. + enum ContextType { + SQL = 0; + DATAFRAME = 1; + } + ContextType context_type = 10; + + // The object type of the query which throws the exception. + // If the exception is directly from the main query, it should be an empty string. + // Otherwise, it should be the exact object type in upper case. For example, a "VIEW". + string object_type = 1; + + // The object name of the query which throws the exception. + // If the exception is directly from the main query, it should be an empty string. + // Otherwise, it should be the object name. For example, a view name "V1". + string object_name = 2; + + // The starting index in the query text which throws the exception. The index starts from 0. + int32 start_index = 3; + + // The stopping index in the query which throws the exception. The index starts from 0. + int32 stop_index = 4; + + // The corresponding fragment of the query which throws the exception. + string fragment = 5; + + // The user code (call site of the API) that caused throwing the exception. + string call_site = 6; + + // Summary of the exception cause. + string summary = 7; + } + + // SparkThrowable defines the schema for SparkThrowable exceptions. + message SparkThrowable { + // Succinct, human-readable, unique, and consistent representation of the error category. + optional string error_class = 1; + + // The message parameters for the error framework. + map message_parameters = 2; + + // The query context of a SparkThrowable. + repeated QueryContext query_contexts = 3; + + // Portable error identifier across SQL engines + // If null, error class or SQLSTATE is not set. + optional string sql_state = 4; + } + + // Error defines the schema for the representing exception. + message Error { + // The fully qualified names of the exception class and its parent classes. + repeated string error_type_hierarchy = 1; + + // The detailed message of the exception. + string message = 2; + + // The stackTrace of the exception. It will be set + // if the SQLConf spark.sql.connect.serverStacktrace.enabled is true. + repeated StackTraceElement stack_trace = 3; + + // The index of the cause error in errors. + optional int32 cause_idx = 4; + + // The structured data of a SparkThrowable exception. + optional SparkThrowable spark_throwable = 5; + } +} + +message CheckpointCommandResult { + // (Required) The logical plan checkpointed. + CachedRemoteRelation relation = 1; +} + +// Main interface for the SparkConnect service. +service SparkConnectService { + + // Executes a request that contains the query and returns a stream of [[Response]]. + // + // It is guaranteed that there is at least one ARROW batch returned even if the result set is empty. + rpc ExecutePlan(ExecutePlanRequest) returns (stream ExecutePlanResponse) {} + + // Analyzes a query and returns a [[AnalyzeResponse]] containing metadata about the query. + rpc AnalyzePlan(AnalyzePlanRequest) returns (AnalyzePlanResponse) {} + + // Update or fetch the configurations and returns a [[ConfigResponse]] containing the result. + rpc Config(ConfigRequest) returns (ConfigResponse) {} + + // Add artifacts to the session and returns a [[AddArtifactsResponse]] containing metadata about + // the added artifacts. + rpc AddArtifacts(stream AddArtifactsRequest) returns (AddArtifactsResponse) {} + + // Check statuses of artifacts in the session and returns them in a [[ArtifactStatusesResponse]] + rpc ArtifactStatus(ArtifactStatusesRequest) returns (ArtifactStatusesResponse) {} + + // Interrupts running executions + rpc Interrupt(InterruptRequest) returns (InterruptResponse) {} + + // Reattach to an existing reattachable execution. + // The ExecutePlan must have been started with ReattachOptions.reattachable=true. + // If the ExecutePlanResponse stream ends without a ResultComplete message, there is more to + // continue. If there is a ResultComplete, the client should use ReleaseExecute with + rpc ReattachExecute(ReattachExecuteRequest) returns (stream ExecutePlanResponse) {} + + // Release an reattachable execution, or parts thereof. + // The ExecutePlan must have been started with ReattachOptions.reattachable=true. + // Non reattachable executions are released automatically and immediately after the ExecutePlan + // RPC and ReleaseExecute may not be used. + rpc ReleaseExecute(ReleaseExecuteRequest) returns (ReleaseExecuteResponse) {} + + // Release a session. + // All the executions in the session will be released. Any further requests for the session with + // that session_id for the given user_id will fail. If the session didn't exist or was already + // released, this is a noop. + rpc ReleaseSession(ReleaseSessionRequest) returns (ReleaseSessionResponse) {} + + // FetchErrorDetails retrieves the matched exception with details based on a provided error id. + rpc FetchErrorDetails(FetchErrorDetailsRequest) returns (FetchErrorDetailsResponse) {} +} diff --git a/src/spark-connect/proto/spark/connect/catalog.proto b/src/spark-connect/proto/spark/connect/catalog.proto new file mode 100644 index 0000000000..5b1b90b008 --- /dev/null +++ b/src/spark-connect/proto/spark/connect/catalog.proto @@ -0,0 +1,243 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +syntax = 'proto3'; + +package spark.connect; + +import "spark/connect/common.proto"; +import "spark/connect/types.proto"; + +option java_multiple_files = true; +option java_package = "org.apache.spark.connect.proto"; +option go_package = "internal/generated"; + +// Catalog messages are marked as unstable. +message Catalog { + oneof cat_type { + CurrentDatabase current_database = 1; + SetCurrentDatabase set_current_database = 2; + ListDatabases list_databases = 3; + ListTables list_tables = 4; + ListFunctions list_functions = 5; + ListColumns list_columns = 6; + GetDatabase get_database = 7; + GetTable get_table = 8; + GetFunction get_function = 9; + DatabaseExists database_exists = 10; + TableExists table_exists = 11; + FunctionExists function_exists = 12; + CreateExternalTable create_external_table = 13; + CreateTable create_table = 14; + DropTempView drop_temp_view = 15; + DropGlobalTempView drop_global_temp_view = 16; + RecoverPartitions recover_partitions = 17; + IsCached is_cached = 18; + CacheTable cache_table = 19; + UncacheTable uncache_table = 20; + ClearCache clear_cache = 21; + RefreshTable refresh_table = 22; + RefreshByPath refresh_by_path = 23; + CurrentCatalog current_catalog = 24; + SetCurrentCatalog set_current_catalog = 25; + ListCatalogs list_catalogs = 26; + } +} + +// See `spark.catalog.currentDatabase` +message CurrentDatabase { } + +// See `spark.catalog.setCurrentDatabase` +message SetCurrentDatabase { + // (Required) + string db_name = 1; +} + +// See `spark.catalog.listDatabases` +message ListDatabases { + // (Optional) The pattern that the database name needs to match + optional string pattern = 1; +} + +// See `spark.catalog.listTables` +message ListTables { + // (Optional) + optional string db_name = 1; + // (Optional) The pattern that the table name needs to match + optional string pattern = 2; +} + +// See `spark.catalog.listFunctions` +message ListFunctions { + // (Optional) + optional string db_name = 1; + // (Optional) The pattern that the function name needs to match + optional string pattern = 2; +} + +// See `spark.catalog.listColumns` +message ListColumns { + // (Required) + string table_name = 1; + // (Optional) + optional string db_name = 2; +} + +// See `spark.catalog.getDatabase` +message GetDatabase { + // (Required) + string db_name = 1; +} + +// See `spark.catalog.getTable` +message GetTable { + // (Required) + string table_name = 1; + // (Optional) + optional string db_name = 2; +} + +// See `spark.catalog.getFunction` +message GetFunction { + // (Required) + string function_name = 1; + // (Optional) + optional string db_name = 2; +} + +// See `spark.catalog.databaseExists` +message DatabaseExists { + // (Required) + string db_name = 1; +} + +// See `spark.catalog.tableExists` +message TableExists { + // (Required) + string table_name = 1; + // (Optional) + optional string db_name = 2; +} + +// See `spark.catalog.functionExists` +message FunctionExists { + // (Required) + string function_name = 1; + // (Optional) + optional string db_name = 2; +} + +// See `spark.catalog.createExternalTable` +message CreateExternalTable { + // (Required) + string table_name = 1; + // (Optional) + optional string path = 2; + // (Optional) + optional string source = 3; + // (Optional) + optional DataType schema = 4; + // Options could be empty for valid data source format. + // The map key is case insensitive. + map options = 5; +} + +// See `spark.catalog.createTable` +message CreateTable { + // (Required) + string table_name = 1; + // (Optional) + optional string path = 2; + // (Optional) + optional string source = 3; + // (Optional) + optional string description = 4; + // (Optional) + optional DataType schema = 5; + // Options could be empty for valid data source format. + // The map key is case insensitive. + map options = 6; +} + +// See `spark.catalog.dropTempView` +message DropTempView { + // (Required) + string view_name = 1; +} + +// See `spark.catalog.dropGlobalTempView` +message DropGlobalTempView { + // (Required) + string view_name = 1; +} + +// See `spark.catalog.recoverPartitions` +message RecoverPartitions { + // (Required) + string table_name = 1; +} + +// See `spark.catalog.isCached` +message IsCached { + // (Required) + string table_name = 1; +} + +// See `spark.catalog.cacheTable` +message CacheTable { + // (Required) + string table_name = 1; + + // (Optional) + optional StorageLevel storage_level = 2; +} + +// See `spark.catalog.uncacheTable` +message UncacheTable { + // (Required) + string table_name = 1; +} + +// See `spark.catalog.clearCache` +message ClearCache { } + +// See `spark.catalog.refreshTable` +message RefreshTable { + // (Required) + string table_name = 1; +} + +// See `spark.catalog.refreshByPath` +message RefreshByPath { + // (Required) + string path = 1; +} + +// See `spark.catalog.currentCatalog` +message CurrentCatalog { } + +// See `spark.catalog.setCurrentCatalog` +message SetCurrentCatalog { + // (Required) + string catalog_name = 1; +} + +// See `spark.catalog.listCatalogs` +message ListCatalogs { + // (Optional) The pattern that the catalog name needs to match + optional string pattern = 1; +} diff --git a/src/spark-connect/proto/spark/connect/commands.proto b/src/spark-connect/proto/spark/connect/commands.proto new file mode 100644 index 0000000000..71189a3c43 --- /dev/null +++ b/src/spark-connect/proto/spark/connect/commands.proto @@ -0,0 +1,533 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +syntax = 'proto3'; + +import "google/protobuf/any.proto"; +import "spark/connect/common.proto"; +import "spark/connect/expressions.proto"; +import "spark/connect/relations.proto"; + +package spark.connect; + +option java_multiple_files = true; +option java_package = "org.apache.spark.connect.proto"; +option go_package = "internal/generated"; + +// A [[Command]] is an operation that is executed by the server that does not directly consume or +// produce a relational result. +message Command { + oneof command_type { + CommonInlineUserDefinedFunction register_function = 1; + WriteOperation write_operation = 2; + CreateDataFrameViewCommand create_dataframe_view = 3; + WriteOperationV2 write_operation_v2 = 4; + SqlCommand sql_command = 5; + WriteStreamOperationStart write_stream_operation_start = 6; + StreamingQueryCommand streaming_query_command = 7; + GetResourcesCommand get_resources_command = 8; + StreamingQueryManagerCommand streaming_query_manager_command = 9; + CommonInlineUserDefinedTableFunction register_table_function = 10; + StreamingQueryListenerBusCommand streaming_query_listener_bus_command = 11; + CommonInlineUserDefinedDataSource register_data_source = 12; + CreateResourceProfileCommand create_resource_profile_command = 13; + CheckpointCommand checkpoint_command = 14; + RemoveCachedRemoteRelationCommand remove_cached_remote_relation_command = 15; + MergeIntoTableCommand merge_into_table_command = 16; + + // This field is used to mark extensions to the protocol. When plugins generate arbitrary + // Commands they can add them here. During the planning the correct resolution is done. + google.protobuf.Any extension = 999; + + } +} + +// A SQL Command is used to trigger the eager evaluation of SQL commands in Spark. +// +// When the SQL provide as part of the message is a command it will be immediately evaluated +// and the result will be collected and returned as part of a LocalRelation. If the result is +// not a command, the operation will simply return a SQL Relation. This allows the client to be +// almost oblivious to the server-side behavior. +message SqlCommand { + // (Required) SQL Query. + string sql = 1 [deprecated=true]; + + // (Optional) A map of parameter names to literal expressions. + map args = 2 [deprecated=true]; + + // (Optional) A sequence of literal expressions for positional parameters in the SQL query text. + repeated Expression.Literal pos_args = 3 [deprecated=true]; + + // (Optional) A map of parameter names to expressions. + // It cannot coexist with `pos_arguments`. + map named_arguments = 4 [deprecated=true]; + + // (Optional) A sequence of expressions for positional parameters in the SQL query text. + // It cannot coexist with `named_arguments`. + repeated Expression pos_arguments = 5 [deprecated=true]; + + // (Optional) The relation that this SQL command will be built on. + Relation input = 6; +} + +// A command that can create DataFrame global temp view or local temp view. +message CreateDataFrameViewCommand { + // (Required) The relation that this view will be built on. + Relation input = 1; + + // (Required) View name. + string name = 2; + + // (Required) Whether this is global temp view or local temp view. + bool is_global = 3; + + // (Required) + // + // If true, and if the view already exists, updates it; if false, and if the view + // already exists, throws exception. + bool replace = 4; +} + +// As writes are not directly handled during analysis and planning, they are modeled as commands. +message WriteOperation { + // (Required) The output of the `input` relation will be persisted according to the options. + Relation input = 1; + + // (Optional) Format value according to the Spark documentation. Examples are: text, parquet, delta. + optional string source = 2; + + // (Optional) + // + // The destination of the write operation can be either a path or a table. + // If the destination is neither a path nor a table, such as jdbc and noop, + // the `save_type` should not be set. + oneof save_type { + string path = 3; + SaveTable table = 4; + } + + // (Required) the save mode. + SaveMode mode = 5; + + // (Optional) List of columns to sort the output by. + repeated string sort_column_names = 6; + + // (Optional) List of columns for partitioning. + repeated string partitioning_columns = 7; + + // (Optional) Bucketing specification. Bucketing must set the number of buckets and the columns + // to bucket by. + BucketBy bucket_by = 8; + + // (Optional) A list of configuration options. + map options = 9; + + // (Optional) Columns used for clustering the table. + repeated string clustering_columns = 10; + + message SaveTable { + // (Required) The table name. + string table_name = 1; + // (Required) The method to be called to write to the table. + TableSaveMethod save_method = 2; + + enum TableSaveMethod { + TABLE_SAVE_METHOD_UNSPECIFIED = 0; + TABLE_SAVE_METHOD_SAVE_AS_TABLE = 1; + TABLE_SAVE_METHOD_INSERT_INTO = 2; + } + } + + message BucketBy { + repeated string bucket_column_names = 1; + int32 num_buckets = 2; + } + + enum SaveMode { + SAVE_MODE_UNSPECIFIED = 0; + SAVE_MODE_APPEND = 1; + SAVE_MODE_OVERWRITE = 2; + SAVE_MODE_ERROR_IF_EXISTS = 3; + SAVE_MODE_IGNORE = 4; + } +} + +// As writes are not directly handled during analysis and planning, they are modeled as commands. +message WriteOperationV2 { + // (Required) The output of the `input` relation will be persisted according to the options. + Relation input = 1; + + // (Required) The destination of the write operation must be either a path or a table. + string table_name = 2; + + // (Optional) A provider for the underlying output data source. Spark's default catalog supports + // "parquet", "json", etc. + optional string provider = 3; + + // (Optional) List of columns for partitioning for output table created by `create`, + // `createOrReplace`, or `replace` + repeated Expression partitioning_columns = 4; + + // (Optional) A list of configuration options. + map options = 5; + + // (Optional) A list of table properties. + map table_properties = 6; + + // (Required) Write mode. + Mode mode = 7; + + enum Mode { + MODE_UNSPECIFIED = 0; + MODE_CREATE = 1; + MODE_OVERWRITE = 2; + MODE_OVERWRITE_PARTITIONS = 3; + MODE_APPEND = 4; + MODE_REPLACE = 5; + MODE_CREATE_OR_REPLACE = 6; + } + + // (Optional) A condition for overwrite saving mode + Expression overwrite_condition = 8; + + // (Optional) Columns used for clustering the table. + repeated string clustering_columns = 9; +} + +// Starts write stream operation as streaming query. Query ID and Run ID of the streaming +// query are returned. +message WriteStreamOperationStart { + + // (Required) The output of the `input` streaming relation will be written. + Relation input = 1; + + // The following fields directly map to API for DataStreamWriter(). + // Consult API documentation unless explicitly documented here. + + string format = 2; + map options = 3; + repeated string partitioning_column_names = 4; + + oneof trigger { + string processing_time_interval = 5; + bool available_now = 6; + bool once = 7; + string continuous_checkpoint_interval = 8; + } + + string output_mode = 9; + string query_name = 10; + + // The destination is optional. When set, it can be a path or a table name. + oneof sink_destination { + string path = 11; + string table_name = 12; + } + + StreamingForeachFunction foreach_writer = 13; + StreamingForeachFunction foreach_batch = 14; + + // (Optional) Columns used for clustering the table. + repeated string clustering_column_names = 15; +} + +message StreamingForeachFunction { + oneof function { + PythonUDF python_function = 1; + ScalarScalaUDF scala_function = 2; + } +} + +message WriteStreamOperationStartResult { + + // (Required) Query instance. See `StreamingQueryInstanceId`. + StreamingQueryInstanceId query_id = 1; + + // An optional query name. + string name = 2; + + // Optional query started event if there is any listener registered on the client side. + optional string query_started_event_json = 3; + + // TODO: How do we indicate errors? + // TODO: Consider adding status, last progress etc here. +} + +// A tuple that uniquely identifies an instance of streaming query run. It consists of `id` that +// persists across the streaming runs and `run_id` that changes between each run of the +// streaming query that resumes from the checkpoint. +message StreamingQueryInstanceId { + + // (Required) The unique id of this query that persists across restarts from checkpoint data. + // That is, this id is generated when a query is started for the first time, and + // will be the same every time it is restarted from checkpoint data. + string id = 1; + + // (Required) The unique id of this run of the query. That is, every start/restart of a query + // will generate a unique run_id. Therefore, every time a query is restarted from + // checkpoint, it will have the same `id` but different `run_id`s. + string run_id = 2; +} + +// Commands for a streaming query. +message StreamingQueryCommand { + + // (Required) Query instance. See `StreamingQueryInstanceId`. + StreamingQueryInstanceId query_id = 1; + + // See documentation for the corresponding API method in StreamingQuery. + oneof command { + // status() API. + bool status = 2; + // lastProgress() API. + bool last_progress = 3; + // recentProgress() API. + bool recent_progress = 4; + // stop() API. Stops the query. + bool stop = 5; + // processAllAvailable() API. Waits till all the available data is processed + bool process_all_available = 6; + // explain() API. Returns logical and physical plans. + ExplainCommand explain = 7; + // exception() API. Returns the exception in the query if any. + bool exception = 8; + // awaitTermination() API. Waits for the termination of the query. + AwaitTerminationCommand await_termination = 9; + } + + message ExplainCommand { + // TODO: Consider reusing Explain from AnalyzePlanRequest message. + // We can not do this right now since it base.proto imports this file. + bool extended = 1; + } + + message AwaitTerminationCommand { + optional int64 timeout_ms = 2; + } +} + +// Response for commands on a streaming query. +message StreamingQueryCommandResult { + // (Required) Query instance id. See `StreamingQueryInstanceId`. + StreamingQueryInstanceId query_id = 1; + + oneof result_type { + StatusResult status = 2; + RecentProgressResult recent_progress = 3; + ExplainResult explain = 4; + ExceptionResult exception = 5; + AwaitTerminationResult await_termination = 6; + } + + message StatusResult { + // See documentation for these Scala 'StreamingQueryStatus' struct + string status_message = 1; + bool is_data_available = 2; + bool is_trigger_active = 3; + bool is_active = 4; + } + + message RecentProgressResult { + // Progress reports as an array of json strings. + repeated string recent_progress_json = 5; + } + + message ExplainResult { + // Logical and physical plans as string + string result = 1; + } + + message ExceptionResult { + // (Optional) Exception message as string, maps to the return value of original + // StreamingQueryException's toString method + optional string exception_message = 1; + // (Optional) Exception error class as string + optional string error_class = 2; + // (Optional) Exception stack trace as string + optional string stack_trace = 3; + } + + message AwaitTerminationResult { + bool terminated = 1; + } +} + +// Commands for the streaming query manager. +message StreamingQueryManagerCommand { + + // See documentation for the corresponding API method in StreamingQueryManager. + oneof command { + // active() API, returns a list of active queries. + bool active = 1; + // get() API, returns the StreamingQuery identified by id. + string get_query = 2; + // awaitAnyTermination() API, wait until any query terminates or timeout. + AwaitAnyTerminationCommand await_any_termination = 3; + // resetTerminated() API. + bool reset_terminated = 4; + // addListener API. + StreamingQueryListenerCommand add_listener = 5; + // removeListener API. + StreamingQueryListenerCommand remove_listener = 6; + // listListeners() API, returns a list of streaming query listeners. + bool list_listeners = 7; + } + + message AwaitAnyTerminationCommand { + // (Optional) The waiting time in milliseconds to wait for any query to terminate. + optional int64 timeout_ms = 1; + } + + message StreamingQueryListenerCommand { + bytes listener_payload = 1; + optional PythonUDF python_listener_payload = 2; + string id = 3; + } +} + +// Response for commands on the streaming query manager. +message StreamingQueryManagerCommandResult { + oneof result_type { + ActiveResult active = 1; + StreamingQueryInstance query = 2; + AwaitAnyTerminationResult await_any_termination = 3; + bool reset_terminated = 4; + bool add_listener = 5; + bool remove_listener = 6; + ListStreamingQueryListenerResult list_listeners = 7; + } + + message ActiveResult { + repeated StreamingQueryInstance active_queries = 1; + } + + message StreamingQueryInstance { + // (Required) The id and runId of this query. + StreamingQueryInstanceId id = 1; + // (Optional) The name of this query. + optional string name = 2; + } + + message AwaitAnyTerminationResult { + bool terminated = 1; + } + + message StreamingQueryListenerInstance { + bytes listener_payload = 1; + } + + message ListStreamingQueryListenerResult { + // (Required) Reference IDs of listener instances. + repeated string listener_ids = 1; + } +} + +// The protocol for client-side StreamingQueryListener. +// This command will only be set when either the first listener is added to the client, or the last +// listener is removed from the client. +// The add_listener_bus_listener command will only be set true in the first case. +// The remove_listener_bus_listener command will only be set true in the second case. +message StreamingQueryListenerBusCommand { + oneof command { + bool add_listener_bus_listener = 1; + bool remove_listener_bus_listener = 2; + } +} + +// The enum used for client side streaming query listener event +// There is no QueryStartedEvent defined here, +// it is added as a field in WriteStreamOperationStartResult +enum StreamingQueryEventType { + QUERY_PROGRESS_UNSPECIFIED = 0; + QUERY_PROGRESS_EVENT = 1; + QUERY_TERMINATED_EVENT = 2; + QUERY_IDLE_EVENT = 3; +} + +// The protocol for the returned events in the long-running response channel. +message StreamingQueryListenerEvent { + // (Required) The json serialized event, all StreamingQueryListener events have a json method + string event_json = 1; + // (Required) Query event type used by client to decide how to deserialize the event_json + StreamingQueryEventType event_type = 2; +} + +message StreamingQueryListenerEventsResult { + repeated StreamingQueryListenerEvent events = 1; + optional bool listener_bus_listener_added = 2; +} + +// Command to get the output of 'SparkContext.resources' +message GetResourcesCommand { } + +// Response for command 'GetResourcesCommand'. +message GetResourcesCommandResult { + map resources = 1; +} + +// Command to create ResourceProfile +message CreateResourceProfileCommand { + // (Required) The ResourceProfile to be built on the server-side. + ResourceProfile profile = 1; +} + +// Response for command 'CreateResourceProfileCommand'. +message CreateResourceProfileCommandResult { + // (Required) Server-side generated resource profile id. + int32 profile_id = 1; +} + +// Command to remove `CashedRemoteRelation` +message RemoveCachedRemoteRelationCommand { + // (Required) The remote to be related + CachedRemoteRelation relation = 1; +} + +message CheckpointCommand { + // (Required) The logical plan to checkpoint. + Relation relation = 1; + + // (Required) Locally checkpoint using a local temporary + // directory in Spark Connect server (Spark Driver) + bool local = 2; + + // (Required) Whether to checkpoint this dataframe immediately. + bool eager = 3; +} + +message MergeIntoTableCommand { + // (Required) The name of the target table. + string target_table_name = 1; + + // (Required) The relation of the source table. + Relation source_table_plan = 2; + + // (Required) The condition to match the source and target. + Expression merge_condition = 3; + + // (Optional) The actions to be taken when the condition is matched. + repeated Expression match_actions = 4; + + // (Optional) The actions to be taken when the condition is not matched. + repeated Expression not_matched_actions = 5; + + // (Optional) The actions to be taken when the condition is not matched by source. + repeated Expression not_matched_by_source_actions = 6; + + // (Required) Whether to enable schema evolution. + bool with_schema_evolution = 7; +} diff --git a/src/spark-connect/proto/spark/connect/common.proto b/src/spark-connect/proto/spark/connect/common.proto new file mode 100644 index 0000000000..b2848370b0 --- /dev/null +++ b/src/spark-connect/proto/spark/connect/common.proto @@ -0,0 +1,98 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +syntax = 'proto3'; + +package spark.connect; + +option java_multiple_files = true; +option java_package = "org.apache.spark.connect.proto"; +option go_package = "internal/generated"; + +// StorageLevel for persisting Datasets/Tables. +message StorageLevel { + // (Required) Whether the cache should use disk or not. + bool use_disk = 1; + // (Required) Whether the cache should use memory or not. + bool use_memory = 2; + // (Required) Whether the cache should use off-heap or not. + bool use_off_heap = 3; + // (Required) Whether the cached data is deserialized or not. + bool deserialized = 4; + // (Required) The number of replicas. + int32 replication = 5; +} + + +// ResourceInformation to hold information about a type of Resource. +// The corresponding class is 'org.apache.spark.resource.ResourceInformation' +message ResourceInformation { + // (Required) The name of the resource + string name = 1; + // (Required) An array of strings describing the addresses of the resource. + repeated string addresses = 2; +} + +// An executor resource request. +message ExecutorResourceRequest { + // (Required) resource name. + string resource_name = 1; + + // (Required) resource amount requesting. + int64 amount = 2; + + // Optional script used to discover the resources. + optional string discovery_script = 3; + + // Optional vendor, required for some cluster managers. + optional string vendor = 4; +} + +// A task resource request. +message TaskResourceRequest { + // (Required) resource name. + string resource_name = 1; + + // (Required) resource amount requesting as a double to support fractional + // resource requests. + double amount = 2; +} + +message ResourceProfile { + // (Optional) Resource requests for executors. Mapped from the resource name + // (e.g., cores, memory, CPU) to its specific request. + map executor_resources = 1; + + // (Optional) Resource requests for tasks. Mapped from the resource name + // (e.g., cores, memory, CPU) to its specific request. + map task_resources = 2; +} + +message Origin { + // (Required) Indicate the origin type. + oneof function { + PythonOrigin python_origin = 1; + } +} + +message PythonOrigin { + // (Required) Name of the origin, for example, the name of the function + string fragment = 1; + + // (Required) Callsite to show to end users, for example, stacktrace. + string call_site = 2; +} diff --git a/src/spark-connect/proto/spark/connect/example_plugins.proto b/src/spark-connect/proto/spark/connect/example_plugins.proto new file mode 100644 index 0000000000..caf233e75e --- /dev/null +++ b/src/spark-connect/proto/spark/connect/example_plugins.proto @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +syntax = 'proto3'; + +import "spark/connect/relations.proto"; +import "spark/connect/expressions.proto"; +option go_package = "internal/generated"; + +package spark.connect; + +option java_multiple_files = true; +option java_package = "org.apache.spark.connect.proto"; + +message ExamplePluginRelation { + Relation input = 1; + string custom_field = 2; + +} + +message ExamplePluginExpression { + Expression child = 1; + string custom_field = 2; +} + +message ExamplePluginCommand { + string custom_field = 1; +} diff --git a/src/spark-connect/proto/spark/connect/expressions.proto b/src/spark-connect/proto/spark/connect/expressions.proto new file mode 100644 index 0000000000..3a91371fd3 --- /dev/null +++ b/src/spark-connect/proto/spark/connect/expressions.proto @@ -0,0 +1,453 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +syntax = 'proto3'; + +import "google/protobuf/any.proto"; +import "spark/connect/types.proto"; +import "spark/connect/common.proto"; + +package spark.connect; + +option java_multiple_files = true; +option java_package = "org.apache.spark.connect.proto"; +option go_package = "internal/generated"; + +// Expression used to refer to fields, functions and similar. This can be used everywhere +// expressions in SQL appear. +message Expression { + + ExpressionCommon common = 18; + oneof expr_type { + Literal literal = 1; + UnresolvedAttribute unresolved_attribute = 2; + UnresolvedFunction unresolved_function = 3; + ExpressionString expression_string = 4; + UnresolvedStar unresolved_star = 5; + Alias alias = 6; + Cast cast = 7; + UnresolvedRegex unresolved_regex = 8; + SortOrder sort_order = 9; + LambdaFunction lambda_function = 10; + Window window = 11; + UnresolvedExtractValue unresolved_extract_value = 12; + UpdateFields update_fields = 13; + UnresolvedNamedLambdaVariable unresolved_named_lambda_variable = 14; + CommonInlineUserDefinedFunction common_inline_user_defined_function = 15; + CallFunction call_function = 16; + NamedArgumentExpression named_argument_expression = 17; + MergeAction merge_action = 19; + TypedAggregateExpression typed_aggregate_expression = 20; + + // This field is used to mark extensions to the protocol. When plugins generate arbitrary + // relations they can add them here. During the planning the correct resolution is done. + google.protobuf.Any extension = 999; + } + + + // Expression for the OVER clause or WINDOW clause. + message Window { + + // (Required) The window function. + Expression window_function = 1; + + // (Optional) The way that input rows are partitioned. + repeated Expression partition_spec = 2; + + // (Optional) Ordering of rows in a partition. + repeated SortOrder order_spec = 3; + + // (Optional) Window frame in a partition. + // + // If not set, it will be treated as 'UnspecifiedFrame'. + WindowFrame frame_spec = 4; + + // The window frame + message WindowFrame { + + // (Required) The type of the frame. + FrameType frame_type = 1; + + // (Required) The lower bound of the frame. + FrameBoundary lower = 2; + + // (Required) The upper bound of the frame. + FrameBoundary upper = 3; + + enum FrameType { + FRAME_TYPE_UNDEFINED = 0; + + // RowFrame treats rows in a partition individually. + FRAME_TYPE_ROW = 1; + + // RangeFrame treats rows in a partition as groups of peers. + // All rows having the same 'ORDER BY' ordering are considered as peers. + FRAME_TYPE_RANGE = 2; + } + + message FrameBoundary { + oneof boundary { + // CURRENT ROW boundary + bool current_row = 1; + + // UNBOUNDED boundary. + // For lower bound, it will be converted to 'UnboundedPreceding'. + // for upper bound, it will be converted to 'UnboundedFollowing'. + bool unbounded = 2; + + // This is an expression for future proofing. We are expecting literals on the server side. + Expression value = 3; + } + } + } + } + + // SortOrder is used to specify the data ordering, it is normally used in Sort and Window. + // It is an unevaluable expression and cannot be evaluated, so can not be used in Projection. + message SortOrder { + // (Required) The expression to be sorted. + Expression child = 1; + + // (Required) The sort direction, should be ASCENDING or DESCENDING. + SortDirection direction = 2; + + // (Required) How to deal with NULLs, should be NULLS_FIRST or NULLS_LAST. + NullOrdering null_ordering = 3; + + enum SortDirection { + SORT_DIRECTION_UNSPECIFIED = 0; + SORT_DIRECTION_ASCENDING = 1; + SORT_DIRECTION_DESCENDING = 2; + } + + enum NullOrdering { + SORT_NULLS_UNSPECIFIED = 0; + SORT_NULLS_FIRST = 1; + SORT_NULLS_LAST = 2; + } + } + + message Cast { + // (Required) the expression to be casted. + Expression expr = 1; + + // (Required) the data type that the expr to be casted to. + oneof cast_to_type { + DataType type = 2; + // If this is set, Server will use Catalyst parser to parse this string to DataType. + string type_str = 3; + } + + // (Optional) The expression evaluation mode. + EvalMode eval_mode = 4; + + enum EvalMode { + EVAL_MODE_UNSPECIFIED = 0; + EVAL_MODE_LEGACY = 1; + EVAL_MODE_ANSI = 2; + EVAL_MODE_TRY = 3; + } + } + + message Literal { + oneof literal_type { + DataType null = 1; + bytes binary = 2; + bool boolean = 3; + + int32 byte = 4; + int32 short = 5; + int32 integer = 6; + int64 long = 7; + float float = 10; + double double = 11; + Decimal decimal = 12; + + string string = 13; + + // Date in units of days since the UNIX epoch. + int32 date = 16; + // Timestamp in units of microseconds since the UNIX epoch. + int64 timestamp = 17; + // Timestamp in units of microseconds since the UNIX epoch (without timezone information). + int64 timestamp_ntz = 18; + + CalendarInterval calendar_interval = 19; + int32 year_month_interval = 20; + int64 day_time_interval = 21; + Array array = 22; + Map map = 23; + Struct struct = 24; + } + + message Decimal { + // the string representation. + string value = 1; + // The maximum number of digits allowed in the value. + // the maximum precision is 38. + optional int32 precision = 2; + // declared scale of decimal literal + optional int32 scale = 3; + } + + message CalendarInterval { + int32 months = 1; + int32 days = 2; + int64 microseconds = 3; + } + + message Array { + DataType element_type = 1; + repeated Literal elements = 2; + } + + message Map { + DataType key_type = 1; + DataType value_type = 2; + repeated Literal keys = 3; + repeated Literal values = 4; + } + + message Struct { + DataType struct_type = 1; + repeated Literal elements = 2; + } + } + + // An unresolved attribute that is not explicitly bound to a specific column, but the column + // is resolved during analysis by name. + message UnresolvedAttribute { + // (Required) An identifier that will be parsed by Catalyst parser. This should follow the + // Spark SQL identifier syntax. + string unparsed_identifier = 1; + + // (Optional) The id of corresponding connect plan. + optional int64 plan_id = 2; + + // (Optional) The requested column is a metadata column. + optional bool is_metadata_column = 3; + } + + // An unresolved function is not explicitly bound to one explicit function, but the function + // is resolved during analysis following Sparks name resolution rules. + message UnresolvedFunction { + // (Required) name (or unparsed name for user defined function) for the unresolved function. + string function_name = 1; + + // (Optional) Function arguments. Empty arguments are allowed. + repeated Expression arguments = 2; + + // (Required) Indicate if this function should be applied on distinct values. + bool is_distinct = 3; + + // (Required) Indicate if this is a user defined function. + // + // When it is not a user defined function, Connect will use the function name directly. + // When it is a user defined function, Connect will parse the function name first. + bool is_user_defined_function = 4; + } + + // Expression as string. + message ExpressionString { + // (Required) A SQL expression that will be parsed by Catalyst parser. + string expression = 1; + } + + // UnresolvedStar is used to expand all the fields of a relation or struct. + message UnresolvedStar { + + // (Optional) The target of the expansion. + // + // If set, it should end with '.*' and will be parsed by 'parseAttributeName' + // in the server side. + optional string unparsed_target = 1; + + // (Optional) The id of corresponding connect plan. + optional int64 plan_id = 2; + } + + // Represents all of the input attributes to a given relational operator, for example in + // "SELECT `(id)?+.+` FROM ...". + message UnresolvedRegex { + // (Required) The column name used to extract column with regex. + string col_name = 1; + + // (Optional) The id of corresponding connect plan. + optional int64 plan_id = 2; + } + + // Extracts a value or values from an Expression + message UnresolvedExtractValue { + // (Required) The expression to extract value from, can be + // Map, Array, Struct or array of Structs. + Expression child = 1; + + // (Required) The expression to describe the extraction, can be + // key of Map, index of Array, field name of Struct. + Expression extraction = 2; + } + + // Add, replace or drop a field of `StructType` expression by name. + message UpdateFields { + // (Required) The struct expression. + Expression struct_expression = 1; + + // (Required) The field name. + string field_name = 2; + + // (Optional) The expression to add or replace. + // + // When not set, it means this field will be dropped. + Expression value_expression = 3; + } + + message Alias { + // (Required) The expression that alias will be added on. + Expression expr = 1; + + // (Required) a list of name parts for the alias. + // + // Scalar columns only has one name that presents. + repeated string name = 2; + + // (Optional) Alias metadata expressed as a JSON map. + optional string metadata = 3; + } + + message LambdaFunction { + // (Required) The lambda function. + // + // The function body should use 'UnresolvedAttribute' as arguments, the sever side will + // replace 'UnresolvedAttribute' with 'UnresolvedNamedLambdaVariable'. + Expression function = 1; + + // (Required) Function variables. Must contains 1 ~ 3 variables. + repeated Expression.UnresolvedNamedLambdaVariable arguments = 2; + } + + message UnresolvedNamedLambdaVariable { + + // (Required) a list of name parts for the variable. Must not be empty. + repeated string name_parts = 1; + } +} + +message ExpressionCommon { + // (Required) Keep the information of the origin for this expression such as stacktrace. + Origin origin = 1; +} + +message CommonInlineUserDefinedFunction { + // (Required) Name of the user-defined function. + string function_name = 1; + // (Optional) Indicate if the user-defined function is deterministic. + bool deterministic = 2; + // (Optional) Function arguments. Empty arguments are allowed. + repeated Expression arguments = 3; + // (Required) Indicate the function type of the user-defined function. + oneof function { + PythonUDF python_udf = 4; + ScalarScalaUDF scalar_scala_udf = 5; + JavaUDF java_udf = 6; + } +} + +message PythonUDF { + // (Required) Output type of the Python UDF + DataType output_type = 1; + // (Required) EvalType of the Python UDF + int32 eval_type = 2; + // (Required) The encoded commands of the Python UDF + bytes command = 3; + // (Required) Python version being used in the client. + string python_ver = 4; + // (Optional) Additional includes for the Python UDF. + repeated string additional_includes = 5; +} + +message ScalarScalaUDF { + // (Required) Serialized JVM object containing UDF definition, input encoders and output encoder + bytes payload = 1; + // (Optional) Input type(s) of the UDF + repeated DataType inputTypes = 2; + // (Required) Output type of the UDF + DataType outputType = 3; + // (Required) True if the UDF can return null value + bool nullable = 4; + // (Required) Indicate if the UDF is an aggregate function + bool aggregate = 5; +} + +message JavaUDF { + // (Required) Fully qualified name of Java class + string class_name = 1; + + // (Optional) Output type of the Java UDF + optional DataType output_type = 2; + + // (Required) Indicate if the Java user-defined function is an aggregate function + bool aggregate = 3; +} + +message TypedAggregateExpression { + // (Required) The aggregate function object packed into bytes. + ScalarScalaUDF scalar_scala_udf = 1; +} + +message CallFunction { + // (Required) Unparsed name of the SQL function. + string function_name = 1; + + // (Optional) Function arguments. Empty arguments are allowed. + repeated Expression arguments = 2; +} + +message NamedArgumentExpression { + // (Required) The key of the named argument. + string key = 1; + + // (Required) The value expression of the named argument. + Expression value = 2; +} + +message MergeAction { + // (Required) The action type of the merge action. + ActionType action_type = 1; + + // (Optional) The condition expression of the merge action. + optional Expression condition = 2; + + // (Optional) The assignments of the merge action. Required for ActionTypes INSERT and UPDATE. + repeated Assignment assignments = 3; + + enum ActionType { + ACTION_TYPE_INVALID = 0; + ACTION_TYPE_DELETE = 1; + ACTION_TYPE_INSERT = 2; + ACTION_TYPE_INSERT_STAR = 3; + ACTION_TYPE_UPDATE = 4; + ACTION_TYPE_UPDATE_STAR = 5; + } + + message Assignment { + // (Required) The key of the assignment. + Expression key = 1; + + // (Required) The value of the assignment. + Expression value = 2; + } +} diff --git a/src/spark-connect/proto/spark/connect/relations.proto b/src/spark-connect/proto/spark/connect/relations.proto new file mode 100644 index 0000000000..1003e5c21d --- /dev/null +++ b/src/spark-connect/proto/spark/connect/relations.proto @@ -0,0 +1,1133 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +syntax = 'proto3'; + +package spark.connect; + +import "google/protobuf/any.proto"; +import "spark/connect/expressions.proto"; +import "spark/connect/types.proto"; +import "spark/connect/catalog.proto"; +import "spark/connect/common.proto"; + +option java_multiple_files = true; +option java_package = "org.apache.spark.connect.proto"; +option go_package = "internal/generated"; + +// The main [[Relation]] type. Fundamentally, a relation is a typed container +// that has exactly one explicit relation type set. +// +// When adding new relation types, they have to be registered here. +message Relation { + RelationCommon common = 1; + oneof rel_type { + Read read = 2; + Project project = 3; + Filter filter = 4; + Join join = 5; + SetOperation set_op = 6; + Sort sort = 7; + Limit limit = 8; + Aggregate aggregate = 9; + SQL sql = 10; + LocalRelation local_relation = 11; + Sample sample = 12; + Offset offset = 13; + Deduplicate deduplicate = 14; + Range range = 15; + SubqueryAlias subquery_alias = 16; + Repartition repartition = 17; + ToDF to_df = 18; + WithColumnsRenamed with_columns_renamed = 19; + ShowString show_string = 20; + Drop drop = 21; + Tail tail = 22; + WithColumns with_columns = 23; + Hint hint = 24; + Unpivot unpivot = 25; + ToSchema to_schema = 26; + RepartitionByExpression repartition_by_expression = 27; + MapPartitions map_partitions = 28; + CollectMetrics collect_metrics = 29; + Parse parse = 30; + GroupMap group_map = 31; + CoGroupMap co_group_map = 32; + WithWatermark with_watermark = 33; + ApplyInPandasWithState apply_in_pandas_with_state = 34; + HtmlString html_string = 35; + CachedLocalRelation cached_local_relation = 36; + CachedRemoteRelation cached_remote_relation = 37; + CommonInlineUserDefinedTableFunction common_inline_user_defined_table_function = 38; + AsOfJoin as_of_join = 39; + CommonInlineUserDefinedDataSource common_inline_user_defined_data_source = 40; + WithRelations with_relations = 41; + Transpose transpose = 42; + + // NA functions + NAFill fill_na = 90; + NADrop drop_na = 91; + NAReplace replace = 92; + + // stat functions + StatSummary summary = 100; + StatCrosstab crosstab = 101; + StatDescribe describe = 102; + StatCov cov = 103; + StatCorr corr = 104; + StatApproxQuantile approx_quantile = 105; + StatFreqItems freq_items = 106; + StatSampleBy sample_by = 107; + + // Catalog API (experimental / unstable) + Catalog catalog = 200; + + // This field is used to mark extensions to the protocol. When plugins generate arbitrary + // relations they can add them here. During the planning the correct resolution is done. + google.protobuf.Any extension = 998; + Unknown unknown = 999; + } +} + +// Used for testing purposes only. +message Unknown {} + +// Common metadata of all relations. +message RelationCommon { + // (Required) Shared relation metadata. + string source_info = 1 [deprecated=true]; + + // (Optional) A per-client globally unique id for a given connect plan. + optional int64 plan_id = 2; + + // (Optional) Keep the information of the origin for this expression such as stacktrace. + Origin origin = 3; +} + +// Relation that uses a SQL query to generate the output. +message SQL { + // (Required) The SQL query. + string query = 1; + + // (Optional) A map of parameter names to literal expressions. + map args = 2 [deprecated=true]; + + // (Optional) A sequence of literal expressions for positional parameters in the SQL query text. + repeated Expression.Literal pos_args = 3 [deprecated=true]; + + // (Optional) A map of parameter names to expressions. + // It cannot coexist with `pos_arguments`. + map named_arguments = 4; + + // (Optional) A sequence of expressions for positional parameters in the SQL query text. + // It cannot coexist with `named_arguments`. + repeated Expression pos_arguments = 5; +} + +// Relation of type [[WithRelations]]. +// +// This relation contains a root plan, and one or more references that are used by the root plan. +// There are two ways of referencing a relation, by name (through a subquery alias), or by plan_id +// (using RelationCommon.plan_id). +// +// This relation can be used to implement CTEs, describe DAGs, or to reduce tree depth. +message WithRelations { + // (Required) Plan at the root of the query tree. This plan is expected to contain one or more + // references. Those references get expanded later on by the engine. + Relation root = 1; + + // (Required) Plans referenced by the root plan. Relations in this list are also allowed to + // contain references to other relations in this list, as long they do not form cycles. + repeated Relation references = 2; +} + +// Relation that reads from a file / table or other data source. Does not have additional +// inputs. +message Read { + oneof read_type { + NamedTable named_table = 1; + DataSource data_source = 2; + } + + // (Optional) Indicates if this is a streaming read. + bool is_streaming = 3; + + message NamedTable { + // (Required) Unparsed identifier for the table. + string unparsed_identifier = 1; + + // Options for the named table. The map key is case insensitive. + map options = 2; + } + + message DataSource { + // (Optional) Supported formats include: parquet, orc, text, json, parquet, csv, avro. + // + // If not set, the value from SQL conf 'spark.sql.sources.default' will be used. + optional string format = 1; + + // (Optional) If not set, Spark will infer the schema. + // + // This schema string should be either DDL-formatted or JSON-formatted. + optional string schema = 2; + + // Options for the data source. The context of this map varies based on the + // data source format. This options could be empty for valid data source format. + // The map key is case insensitive. + map options = 3; + + // (Optional) A list of path for file-system backed data sources. + repeated string paths = 4; + + // (Optional) Condition in the where clause for each partition. + // + // This is only supported by the JDBC data source. + repeated string predicates = 5; + } +} + +// Projection of a bag of expressions for a given input relation. +// +// The input relation must be specified. +// The projected expression can be an arbitrary expression. +message Project { + // (Optional) Input relation is optional for Project. + // + // For example, `SELECT ABS(-1)` is valid plan without an input plan. + Relation input = 1; + + // (Required) A Project requires at least one expression. + repeated Expression expressions = 3; +} + +// Relation that applies a boolean expression `condition` on each row of `input` to produce +// the output result. +message Filter { + // (Required) Input relation for a Filter. + Relation input = 1; + + // (Required) A Filter must have a condition expression. + Expression condition = 2; +} + +// Relation of type [[Join]]. +// +// `left` and `right` must be present. +message Join { + // (Required) Left input relation for a Join. + Relation left = 1; + + // (Required) Right input relation for a Join. + Relation right = 2; + + // (Optional) The join condition. Could be unset when `using_columns` is utilized. + // + // This field does not co-exist with using_columns. + Expression join_condition = 3; + + // (Required) The join type. + JoinType join_type = 4; + + // Optional. using_columns provides a list of columns that should present on both sides of + // the join inputs that this Join will join on. For example A JOIN B USING col_name is + // equivalent to A JOIN B on A.col_name = B.col_name. + // + // This field does not co-exist with join_condition. + repeated string using_columns = 5; + + enum JoinType { + JOIN_TYPE_UNSPECIFIED = 0; + JOIN_TYPE_INNER = 1; + JOIN_TYPE_FULL_OUTER = 2; + JOIN_TYPE_LEFT_OUTER = 3; + JOIN_TYPE_RIGHT_OUTER = 4; + JOIN_TYPE_LEFT_ANTI = 5; + JOIN_TYPE_LEFT_SEMI = 6; + JOIN_TYPE_CROSS = 7; + } + + // (Optional) Only used by joinWith. Set the left and right join data types. + optional JoinDataType join_data_type = 6; + + message JoinDataType { + // If the left data type is a struct. + bool is_left_struct = 1; + // If the right data type is a struct. + bool is_right_struct = 2; + } +} + +// Relation of type [[SetOperation]] +message SetOperation { + // (Required) Left input relation for a Set operation. + Relation left_input = 1; + + // (Required) Right input relation for a Set operation. + Relation right_input = 2; + + // (Required) The Set operation type. + SetOpType set_op_type = 3; + + // (Optional) If to remove duplicate rows. + // + // True to preserve all results. + // False to remove duplicate rows. + optional bool is_all = 4; + + // (Optional) If to perform the Set operation based on name resolution. + // + // Only UNION supports this option. + optional bool by_name = 5; + + // (Optional) If to perform the Set operation and allow missing columns. + // + // Only UNION supports this option. + optional bool allow_missing_columns = 6; + + enum SetOpType { + SET_OP_TYPE_UNSPECIFIED = 0; + SET_OP_TYPE_INTERSECT = 1; + SET_OP_TYPE_UNION = 2; + SET_OP_TYPE_EXCEPT = 3; + } +} + +// Relation of type [[Limit]] that is used to `limit` rows from the input relation. +message Limit { + // (Required) Input relation for a Limit. + Relation input = 1; + + // (Required) the limit. + int32 limit = 2; +} + +// Relation of type [[Offset]] that is used to read rows staring from the `offset` on +// the input relation. +message Offset { + // (Required) Input relation for an Offset. + Relation input = 1; + + // (Required) the limit. + int32 offset = 2; +} + +// Relation of type [[Tail]] that is used to fetch `limit` rows from the last of the input relation. +message Tail { + // (Required) Input relation for an Tail. + Relation input = 1; + + // (Required) the limit. + int32 limit = 2; +} + +// Relation of type [[Aggregate]]. +message Aggregate { + // (Required) Input relation for a RelationalGroupedDataset. + Relation input = 1; + + // (Required) How the RelationalGroupedDataset was built. + GroupType group_type = 2; + + // (Required) Expressions for grouping keys + repeated Expression grouping_expressions = 3; + + // (Required) List of values that will be translated to columns in the output DataFrame. + repeated Expression aggregate_expressions = 4; + + // (Optional) Pivots a column of the current `DataFrame` and performs the specified aggregation. + Pivot pivot = 5; + + // (Optional) List of values that will be translated to columns in the output DataFrame. + repeated GroupingSets grouping_sets = 6; + + enum GroupType { + GROUP_TYPE_UNSPECIFIED = 0; + GROUP_TYPE_GROUPBY = 1; + GROUP_TYPE_ROLLUP = 2; + GROUP_TYPE_CUBE = 3; + GROUP_TYPE_PIVOT = 4; + GROUP_TYPE_GROUPING_SETS = 5; + } + + message Pivot { + // (Required) The column to pivot + Expression col = 1; + + // (Optional) List of values that will be translated to columns in the output DataFrame. + // + // Note that if it is empty, the server side will immediately trigger a job to collect + // the distinct values of the column. + repeated Expression.Literal values = 2; + } + + message GroupingSets { + // (Required) Individual grouping set + repeated Expression grouping_set = 1; + } +} + +// Relation of type [[Sort]]. +message Sort { + // (Required) Input relation for a Sort. + Relation input = 1; + + // (Required) The ordering expressions + repeated Expression.SortOrder order = 2; + + // (Optional) if this is a global sort. + optional bool is_global = 3; +} + + +// Drop specified columns. +message Drop { + // (Required) The input relation. + Relation input = 1; + + // (Optional) columns to drop. + repeated Expression columns = 2; + + // (Optional) names of columns to drop. + repeated string column_names = 3; +} + + +// Relation of type [[Deduplicate]] which have duplicate rows removed, could consider either only +// the subset of columns or all the columns. +message Deduplicate { + // (Required) Input relation for a Deduplicate. + Relation input = 1; + + // (Optional) Deduplicate based on a list of column names. + // + // This field does not co-use with `all_columns_as_keys`. + repeated string column_names = 2; + + // (Optional) Deduplicate based on all the columns of the input relation. + // + // This field does not co-use with `column_names`. + optional bool all_columns_as_keys = 3; + + // (Optional) Deduplicate within the time range of watermark. + optional bool within_watermark = 4; +} + +// A relation that does not need to be qualified by name. +message LocalRelation { + // (Optional) Local collection data serialized into Arrow IPC streaming format which contains + // the schema of the data. + optional bytes data = 1; + + // (Optional) The schema of local data. + // It should be either a DDL-formatted type string or a JSON string. + // + // The server side will update the column names and data types according to this schema. + // If the 'data' is not provided, then this schema will be required. + optional string schema = 2; +} + +// A local relation that has been cached already. +message CachedLocalRelation { + // `userId` and `sessionId` fields are deleted since the server must always use the active + // session/user rather than arbitrary values provided by the client. It is never valid to access + // a local relation from a different session/user. + reserved 1, 2; + reserved "userId", "sessionId"; + + // (Required) A sha-256 hash of the serialized local relation in proto, see LocalRelation. + string hash = 3; +} + +// Represents a remote relation that has been cached on server. +message CachedRemoteRelation { + // (Required) ID of the remote related (assigned by the service). + string relation_id = 1; +} + +// Relation of type [[Sample]] that samples a fraction of the dataset. +message Sample { + // (Required) Input relation for a Sample. + Relation input = 1; + + // (Required) lower bound. + double lower_bound = 2; + + // (Required) upper bound. + double upper_bound = 3; + + // (Optional) Whether to sample with replacement. + optional bool with_replacement = 4; + + // (Required) The random seed. + // This field is required to avoid generating mutable dataframes (see SPARK-48184 for details), + // however, still keep it 'optional' here for backward compatibility. + optional int64 seed = 5; + + // (Required) Explicitly sort the underlying plan to make the ordering deterministic or cache it. + // This flag is true when invoking `dataframe.randomSplit` to randomly splits DataFrame with the + // provided weights. Otherwise, it is false. + bool deterministic_order = 6; +} + +// Relation of type [[Range]] that generates a sequence of integers. +message Range { + // (Optional) Default value = 0 + optional int64 start = 1; + + // (Required) + int64 end = 2; + + // (Required) + int64 step = 3; + + // Optional. Default value is assigned by 1) SQL conf "spark.sql.leafNodeDefaultParallelism" if + // it is set, or 2) spark default parallelism. + optional int32 num_partitions = 4; +} + +// Relation alias. +message SubqueryAlias { + // (Required) The input relation of SubqueryAlias. + Relation input = 1; + + // (Required) The alias. + string alias = 2; + + // (Optional) Qualifier of the alias. + repeated string qualifier = 3; +} + +// Relation repartition. +message Repartition { + // (Required) The input relation of Repartition. + Relation input = 1; + + // (Required) Must be positive. + int32 num_partitions = 2; + + // (Optional) Default value is false. + optional bool shuffle = 3; +} + +// Compose the string representing rows for output. +// It will invoke 'Dataset.showString' to compute the results. +message ShowString { + // (Required) The input relation. + Relation input = 1; + + // (Required) Number of rows to show. + int32 num_rows = 2; + + // (Required) If set to more than 0, truncates strings to + // `truncate` characters and all cells will be aligned right. + int32 truncate = 3; + + // (Required) If set to true, prints output rows vertically (one line per column value). + bool vertical = 4; +} + +// Compose the string representing rows for output. +// It will invoke 'Dataset.htmlString' to compute the results. +message HtmlString { + // (Required) The input relation. + Relation input = 1; + + // (Required) Number of rows to show. + int32 num_rows = 2; + + // (Required) If set to more than 0, truncates strings to + // `truncate` characters and all cells will be aligned right. + int32 truncate = 3; +} + +// Computes specified statistics for numeric and string columns. +// It will invoke 'Dataset.summary' (same as 'StatFunctions.summary') +// to compute the results. +message StatSummary { + // (Required) The input relation. + Relation input = 1; + + // (Optional) Statistics from to be computed. + // + // Available statistics are: + // count + // mean + // stddev + // min + // max + // arbitrary approximate percentiles specified as a percentage (e.g. 75%) + // count_distinct + // approx_count_distinct + // + // If no statistics are given, this function computes 'count', 'mean', 'stddev', 'min', + // 'approximate quartiles' (percentiles at 25%, 50%, and 75%), and 'max'. + repeated string statistics = 2; +} + +// Computes basic statistics for numeric and string columns, including count, mean, stddev, min, +// and max. If no columns are given, this function computes statistics for all numerical or +// string columns. +message StatDescribe { + // (Required) The input relation. + Relation input = 1; + + // (Optional) Columns to compute statistics on. + repeated string cols = 2; +} + +// Computes a pair-wise frequency table of the given columns. Also known as a contingency table. +// It will invoke 'Dataset.stat.crosstab' (same as 'StatFunctions.crossTabulate') +// to compute the results. +message StatCrosstab { + // (Required) The input relation. + Relation input = 1; + + // (Required) The name of the first column. + // + // Distinct items will make the first item of each row. + string col1 = 2; + + // (Required) The name of the second column. + // + // Distinct items will make the column names of the DataFrame. + string col2 = 3; +} + +// Calculate the sample covariance of two numerical columns of a DataFrame. +// It will invoke 'Dataset.stat.cov' (same as 'StatFunctions.calculateCov') to compute the results. +message StatCov { + // (Required) The input relation. + Relation input = 1; + + // (Required) The name of the first column. + string col1 = 2; + + // (Required) The name of the second column. + string col2 = 3; +} + +// Calculates the correlation of two columns of a DataFrame. Currently only supports the Pearson +// Correlation Coefficient. It will invoke 'Dataset.stat.corr' (same as +// 'StatFunctions.pearsonCorrelation') to compute the results. +message StatCorr { + // (Required) The input relation. + Relation input = 1; + + // (Required) The name of the first column. + string col1 = 2; + + // (Required) The name of the second column. + string col2 = 3; + + // (Optional) Default value is 'pearson'. + // + // Currently only supports the Pearson Correlation Coefficient. + optional string method = 4; +} + +// Calculates the approximate quantiles of numerical columns of a DataFrame. +// It will invoke 'Dataset.stat.approxQuantile' (same as 'StatFunctions.approxQuantile') +// to compute the results. +message StatApproxQuantile { + // (Required) The input relation. + Relation input = 1; + + // (Required) The names of the numerical columns. + repeated string cols = 2; + + // (Required) A list of quantile probabilities. + // + // Each number must belong to [0, 1]. + // For example 0 is the minimum, 0.5 is the median, 1 is the maximum. + repeated double probabilities = 3; + + // (Required) The relative target precision to achieve (greater than or equal to 0). + // + // If set to zero, the exact quantiles are computed, which could be very expensive. + // Note that values greater than 1 are accepted but give the same result as 1. + double relative_error = 4; +} + +// Finding frequent items for columns, possibly with false positives. +// It will invoke 'Dataset.stat.freqItems' (same as 'StatFunctions.freqItems') +// to compute the results. +message StatFreqItems { + // (Required) The input relation. + Relation input = 1; + + // (Required) The names of the columns to search frequent items in. + repeated string cols = 2; + + // (Optional) The minimum frequency for an item to be considered `frequent`. + // Should be greater than 1e-4. + optional double support = 3; +} + + +// Returns a stratified sample without replacement based on the fraction +// given on each stratum. +// It will invoke 'Dataset.stat.freqItems' (same as 'StatFunctions.freqItems') +// to compute the results. +message StatSampleBy { + // (Required) The input relation. + Relation input = 1; + + // (Required) The column that defines strata. + Expression col = 2; + + // (Required) Sampling fraction for each stratum. + // + // If a stratum is not specified, we treat its fraction as zero. + repeated Fraction fractions = 3; + + // (Required) The random seed. + // This field is required to avoid generating mutable dataframes (see SPARK-48184 for details), + // however, still keep it 'optional' here for backward compatibility. + optional int64 seed = 5; + + message Fraction { + // (Required) The stratum. + Expression.Literal stratum = 1; + + // (Required) The fraction value. Must be in [0, 1]. + double fraction = 2; + } +} + + +// Replaces null values. +// It will invoke 'Dataset.na.fill' (same as 'DataFrameNaFunctions.fill') to compute the results. +// Following 3 parameter combinations are supported: +// 1, 'values' only contains 1 item, 'cols' is empty: +// replaces null values in all type-compatible columns. +// 2, 'values' only contains 1 item, 'cols' is not empty: +// replaces null values in specified columns. +// 3, 'values' contains more than 1 items, then 'cols' is required to have the same length: +// replaces each specified column with corresponding value. +message NAFill { + // (Required) The input relation. + Relation input = 1; + + // (Optional) Optional list of column names to consider. + repeated string cols = 2; + + // (Required) Values to replace null values with. + // + // Should contain at least 1 item. + // Only 4 data types are supported now: bool, long, double, string + repeated Expression.Literal values = 3; +} + + +// Drop rows containing null values. +// It will invoke 'Dataset.na.drop' (same as 'DataFrameNaFunctions.drop') to compute the results. +message NADrop { + // (Required) The input relation. + Relation input = 1; + + // (Optional) Optional list of column names to consider. + // + // When it is empty, all the columns in the input relation will be considered. + repeated string cols = 2; + + // (Optional) The minimum number of non-null and non-NaN values required to keep. + // + // When not set, it is equivalent to the number of considered columns, which means + // a row will be kept only if all columns are non-null. + // + // 'how' options ('all', 'any') can be easily converted to this field: + // - 'all' -> set 'min_non_nulls' 1; + // - 'any' -> keep 'min_non_nulls' unset; + optional int32 min_non_nulls = 3; +} + + +// Replaces old values with the corresponding values. +// It will invoke 'Dataset.na.replace' (same as 'DataFrameNaFunctions.replace') +// to compute the results. +message NAReplace { + // (Required) The input relation. + Relation input = 1; + + // (Optional) List of column names to consider. + // + // When it is empty, all the type-compatible columns in the input relation will be considered. + repeated string cols = 2; + + // (Optional) The value replacement mapping. + repeated Replacement replacements = 3; + + message Replacement { + // (Required) The old value. + // + // Only 4 data types are supported now: null, bool, double, string. + Expression.Literal old_value = 1; + + // (Required) The new value. + // + // Should be of the same data type with the old value. + Expression.Literal new_value = 2; + } +} + + +// Rename columns on the input relation by the same length of names. +message ToDF { + // (Required) The input relation of RenameColumnsBySameLengthNames. + Relation input = 1; + + // (Required) + // + // The number of columns of the input relation must be equal to the length + // of this field. If this is not true, an exception will be returned. + repeated string column_names = 2; +} + + +// Rename columns on the input relation by a map with name to name mapping. +message WithColumnsRenamed { + // (Required) The input relation. + Relation input = 1; + + + // (Optional) + // + // Renaming column names of input relation from A to B where A is the map key + // and B is the map value. This is a no-op if schema doesn't contain any A. It + // does not require that all input relation column names to present as keys. + // duplicated B are not allowed. + map rename_columns_map = 2 [deprecated=true]; + + repeated Rename renames = 3; + + message Rename { + // (Required) The existing column name. + string col_name = 1; + + // (Required) The new column name. + string new_col_name = 2; + } +} + +// Adding columns or replacing the existing columns that have the same names. +message WithColumns { + // (Required) The input relation. + Relation input = 1; + + // (Required) + // + // Given a column name, apply the corresponding expression on the column. If column + // name exists in the input relation, then replace the column. If the column name + // does not exist in the input relation, then adds it as a new column. + // + // Only one name part is expected from each Expression.Alias. + // + // An exception is thrown when duplicated names are present in the mapping. + repeated Expression.Alias aliases = 2; +} + +message WithWatermark { + + // (Required) The input relation + Relation input = 1; + + // (Required) Name of the column containing event time. + string event_time = 2; + + // (Required) + string delay_threshold = 3; +} + +// Specify a hint over a relation. Hint should have a name and optional parameters. +message Hint { + // (Required) The input relation. + Relation input = 1; + + // (Required) Hint name. + // + // Supported Join hints include BROADCAST, MERGE, SHUFFLE_HASH, SHUFFLE_REPLICATE_NL. + // + // Supported partitioning hints include COALESCE, REPARTITION, REPARTITION_BY_RANGE. + string name = 2; + + // (Optional) Hint parameters. + repeated Expression parameters = 3; +} + +// Unpivot a DataFrame from wide format to long format, optionally leaving identifier columns set. +message Unpivot { + // (Required) The input relation. + Relation input = 1; + + // (Required) Id columns. + repeated Expression ids = 2; + + // (Optional) Value columns to unpivot. + optional Values values = 3; + + // (Required) Name of the variable column. + string variable_column_name = 4; + + // (Required) Name of the value column. + string value_column_name = 5; + + message Values { + repeated Expression values = 1; + } +} + +// Transpose a DataFrame, switching rows to columns. +// Transforms the DataFrame such that the values in the specified index column +// become the new columns of the DataFrame. +message Transpose { + // (Required) The input relation. + Relation input = 1; + + // (Optional) A list of columns that will be treated as the indices. + // Only single column is supported now. + repeated Expression index_columns = 2; +} + +message ToSchema { + // (Required) The input relation. + Relation input = 1; + + // (Required) The user provided schema. + // + // The Sever side will update the dataframe with this schema. + DataType schema = 2; +} + +message RepartitionByExpression { + // (Required) The input relation. + Relation input = 1; + + // (Required) The partitioning expressions. + repeated Expression partition_exprs = 2; + + // (Optional) number of partitions, must be positive. + optional int32 num_partitions = 3; +} + +message MapPartitions { + // (Required) Input relation for a mapPartitions-equivalent API: mapInPandas, mapInArrow. + Relation input = 1; + + // (Required) Input user-defined function. + CommonInlineUserDefinedFunction func = 2; + + // (Optional) Whether to use barrier mode execution or not. + optional bool is_barrier = 3; + + // (Optional) ResourceProfile id used for the stage level scheduling. + optional int32 profile_id = 4; +} + +message GroupMap { + // (Required) Input relation for Group Map API: apply, applyInPandas. + Relation input = 1; + + // (Required) Expressions for grouping keys. + repeated Expression grouping_expressions = 2; + + // (Required) Input user-defined function. + CommonInlineUserDefinedFunction func = 3; + + // (Optional) Expressions for sorting. Only used by Scala Sorted Group Map API. + repeated Expression sorting_expressions = 4; + + // Below fields are only used by (Flat)MapGroupsWithState + // (Optional) Input relation for initial State. + Relation initial_input = 5; + + // (Optional) Expressions for grouping keys of the initial state input relation. + repeated Expression initial_grouping_expressions = 6; + + // (Optional) True if MapGroupsWithState, false if FlatMapGroupsWithState. + optional bool is_map_groups_with_state = 7; + + // (Optional) The output mode of the function. + optional string output_mode = 8; + + // (Optional) Timeout configuration for groups that do not receive data for a while. + optional string timeout_conf = 9; +} + +message CoGroupMap { + // (Required) One input relation for CoGroup Map API - applyInPandas. + Relation input = 1; + + // Expressions for grouping keys of the first input relation. + repeated Expression input_grouping_expressions = 2; + + // (Required) The other input relation. + Relation other = 3; + + // Expressions for grouping keys of the other input relation. + repeated Expression other_grouping_expressions = 4; + + // (Required) Input user-defined function. + CommonInlineUserDefinedFunction func = 5; + + // (Optional) Expressions for sorting. Only used by Scala Sorted CoGroup Map API. + repeated Expression input_sorting_expressions = 6; + + // (Optional) Expressions for sorting. Only used by Scala Sorted CoGroup Map API. + repeated Expression other_sorting_expressions = 7; +} + +message ApplyInPandasWithState { + // (Required) Input relation for applyInPandasWithState. + Relation input = 1; + + // (Required) Expressions for grouping keys. + repeated Expression grouping_expressions = 2; + + // (Required) Input user-defined function. + CommonInlineUserDefinedFunction func = 3; + + // (Required) Schema for the output DataFrame. + string output_schema = 4; + + // (Required) Schema for the state. + string state_schema = 5; + + // (Required) The output mode of the function. + string output_mode = 6; + + // (Required) Timeout configuration for groups that do not receive data for a while. + string timeout_conf = 7; +} + +message CommonInlineUserDefinedTableFunction { + // (Required) Name of the user-defined table function. + string function_name = 1; + + // (Optional) Whether the user-defined table function is deterministic. + bool deterministic = 2; + + // (Optional) Function input arguments. Empty arguments are allowed. + repeated Expression arguments = 3; + + // (Required) Type of the user-defined table function. + oneof function { + PythonUDTF python_udtf = 4; + } +} + +message PythonUDTF { + // (Optional) Return type of the Python UDTF. + optional DataType return_type = 1; + + // (Required) EvalType of the Python UDTF. + int32 eval_type = 2; + + // (Required) The encoded commands of the Python UDTF. + bytes command = 3; + + // (Required) Python version being used in the client. + string python_ver = 4; +} + +message CommonInlineUserDefinedDataSource { + // (Required) Name of the data source. + string name = 1; + + // (Required) The data source type. + oneof data_source { + PythonDataSource python_data_source = 2; + } +} + +message PythonDataSource { + // (Required) The encoded commands of the Python data source. + bytes command = 1; + + // (Required) Python version being used in the client. + string python_ver = 2; +} + +// Collect arbitrary (named) metrics from a dataset. +message CollectMetrics { + // (Required) The input relation. + Relation input = 1; + + // (Required) Name of the metrics. + string name = 2; + + // (Required) The metric sequence. + repeated Expression metrics = 3; +} + +message Parse { + // (Required) Input relation to Parse. The input is expected to have single text column. + Relation input = 1; + // (Required) The expected format of the text. + ParseFormat format = 2; + + // (Optional) DataType representing the schema. If not set, Spark will infer the schema. + optional DataType schema = 3; + + // Options for the csv/json parser. The map key is case insensitive. + map options = 4; + enum ParseFormat { + PARSE_FORMAT_UNSPECIFIED = 0; + PARSE_FORMAT_CSV = 1; + PARSE_FORMAT_JSON = 2; + } +} + +// Relation of type [[AsOfJoin]]. +// +// `left` and `right` must be present. +message AsOfJoin { + // (Required) Left input relation for a Join. + Relation left = 1; + + // (Required) Right input relation for a Join. + Relation right = 2; + + // (Required) Field to join on in left DataFrame + Expression left_as_of = 3; + + // (Required) Field to join on in right DataFrame + Expression right_as_of = 4; + + // (Optional) The join condition. Could be unset when `using_columns` is utilized. + // + // This field does not co-exist with using_columns. + Expression join_expr = 5; + + // Optional. using_columns provides a list of columns that should present on both sides of + // the join inputs that this Join will join on. For example A JOIN B USING col_name is + // equivalent to A JOIN B on A.col_name = B.col_name. + // + // This field does not co-exist with join_condition. + repeated string using_columns = 6; + + // (Required) The join type. + string join_type = 7; + + // (Optional) The asof tolerance within this range. + Expression tolerance = 8; + + // (Required) Whether allow matching with the same value or not. + bool allow_exact_matches = 9; + + // (Required) Whether to search for prior, subsequent, or closest matches. + string direction = 10; +} diff --git a/src/spark-connect/proto/spark/connect/types.proto b/src/spark-connect/proto/spark/connect/types.proto new file mode 100644 index 0000000000..4f768f2015 --- /dev/null +++ b/src/spark-connect/proto/spark/connect/types.proto @@ -0,0 +1,201 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +syntax = 'proto3'; + +package spark.connect; + +option java_multiple_files = true; +option java_package = "org.apache.spark.connect.proto"; +option go_package = "internal/generated"; + +// This message describes the logical [[DataType]] of something. It does not carry the value +// itself but only describes it. +message DataType { + oneof kind { + NULL null = 1; + + Binary binary = 2; + + Boolean boolean = 3; + + // Numeric types + Byte byte = 4; + Short short = 5; + Integer integer = 6; + Long long = 7; + + Float float = 8; + Double double = 9; + Decimal decimal = 10; + + // String types + String string = 11; + Char char = 12; + VarChar var_char = 13; + + // Datatime types + Date date = 14; + Timestamp timestamp = 15; + TimestampNTZ timestamp_ntz = 16; + + // Interval types + CalendarInterval calendar_interval = 17; + YearMonthInterval year_month_interval = 18; + DayTimeInterval day_time_interval = 19; + + // Complex types + Array array = 20; + Struct struct = 21; + Map map = 22; + Variant variant = 25; + + // UserDefinedType + UDT udt = 23; + + // UnparsedDataType + Unparsed unparsed = 24; + } + + message Boolean { + uint32 type_variation_reference = 1; + } + + message Byte { + uint32 type_variation_reference = 1; + } + + message Short { + uint32 type_variation_reference = 1; + } + + message Integer { + uint32 type_variation_reference = 1; + } + + message Long { + uint32 type_variation_reference = 1; + } + + message Float { + uint32 type_variation_reference = 1; + } + + message Double { + uint32 type_variation_reference = 1; + } + + message String { + uint32 type_variation_reference = 1; + string collation = 2; + } + + message Binary { + uint32 type_variation_reference = 1; + } + + message NULL { + uint32 type_variation_reference = 1; + } + + message Timestamp { + uint32 type_variation_reference = 1; + } + + message Date { + uint32 type_variation_reference = 1; + } + + message TimestampNTZ { + uint32 type_variation_reference = 1; + } + + message CalendarInterval { + uint32 type_variation_reference = 1; + } + + message YearMonthInterval { + optional int32 start_field = 1; + optional int32 end_field = 2; + uint32 type_variation_reference = 3; + } + + message DayTimeInterval { + optional int32 start_field = 1; + optional int32 end_field = 2; + uint32 type_variation_reference = 3; + } + + // Start compound types. + message Char { + int32 length = 1; + uint32 type_variation_reference = 2; + } + + message VarChar { + int32 length = 1; + uint32 type_variation_reference = 2; + } + + message Decimal { + optional int32 scale = 1; + optional int32 precision = 2; + uint32 type_variation_reference = 3; + } + + message StructField { + string name = 1; + DataType data_type = 2; + bool nullable = 3; + optional string metadata = 4; + } + + message Struct { + repeated StructField fields = 1; + uint32 type_variation_reference = 2; + } + + message Array { + DataType element_type = 1; + bool contains_null = 2; + uint32 type_variation_reference = 3; + } + + message Map { + DataType key_type = 1; + DataType value_type = 2; + bool value_contains_null = 3; + uint32 type_variation_reference = 4; + } + + message Variant { + uint32 type_variation_reference = 1; + } + + message UDT { + string type = 1; + optional string jvm_class = 2; + optional string python_class = 3; + optional string serialized_python_class = 4; + DataType sql_type = 5; + } + + message Unparsed { + // (Required) The unparsed data type string + string data_type_string = 1; + } +} diff --git a/src/spark-connect/src/lib.rs b/src/spark-connect/src/lib.rs new file mode 100644 index 0000000000..b957c47191 --- /dev/null +++ b/src/spark-connect/src/lib.rs @@ -0,0 +1,5842 @@ +#![allow( + internal_features, + reason = "prost auto generated code... im so confused." +)] +#![feature(liballoc_internals)] // todo: yea... I have no idea. let's talk about this. +#![feature(hint_must_use)] +#![expect( + clippy::derive_partial_eq_without_eq, + reason = "prost does not properly derive Eq" +)] + +extern crate alloc; + +// tonic::include_proto!("spark.connect"); + +// This file is @generated by prost-build. +/// StorageLevel for persisting Datasets/Tables. +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct StorageLevel { + /// (Required) Whether the cache should use disk or not. + #[prost(bool, tag = "1")] + pub use_disk: bool, + /// (Required) Whether the cache should use memory or not. + #[prost(bool, tag = "2")] + pub use_memory: bool, + /// (Required) Whether the cache should use off-heap or not. + #[prost(bool, tag = "3")] + pub use_off_heap: bool, + /// (Required) Whether the cached data is deserialized or not. + #[prost(bool, tag = "4")] + pub deserialized: bool, + /// (Required) The number of replicas. + #[prost(int32, tag = "5")] + pub replication: i32, +} +/// ResourceInformation to hold information about a type of Resource. +/// The corresponding class is 'org.apache.spark.resource.ResourceInformation' +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ResourceInformation { + /// (Required) The name of the resource + #[prost(string, tag = "1")] + pub name: ::prost::alloc::string::String, + /// (Required) An array of strings describing the addresses of the resource. + #[prost(string, repeated, tag = "2")] + pub addresses: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, +} +/// An executor resource request. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ExecutorResourceRequest { + /// (Required) resource name. + #[prost(string, tag = "1")] + pub resource_name: ::prost::alloc::string::String, + /// (Required) resource amount requesting. + #[prost(int64, tag = "2")] + pub amount: i64, + /// Optional script used to discover the resources. + #[prost(string, optional, tag = "3")] + pub discovery_script: ::core::option::Option<::prost::alloc::string::String>, + /// Optional vendor, required for some cluster managers. + #[prost(string, optional, tag = "4")] + pub vendor: ::core::option::Option<::prost::alloc::string::String>, +} +/// A task resource request. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct TaskResourceRequest { + /// (Required) resource name. + #[prost(string, tag = "1")] + pub resource_name: ::prost::alloc::string::String, + /// (Required) resource amount requesting as a double to support fractional + /// resource requests. + #[prost(double, tag = "2")] + pub amount: f64, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ResourceProfile { + /// (Optional) Resource requests for executors. Mapped from the resource name + /// (e.g., cores, memory, CPU) to its specific request. + #[prost(map = "string, message", tag = "1")] + pub executor_resources: + ::std::collections::HashMap<::prost::alloc::string::String, ExecutorResourceRequest>, + /// (Optional) Resource requests for tasks. Mapped from the resource name + /// (e.g., cores, memory, CPU) to its specific request. + #[prost(map = "string, message", tag = "2")] + pub task_resources: + ::std::collections::HashMap<::prost::alloc::string::String, TaskResourceRequest>, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Origin { + /// (Required) Indicate the origin type. + #[prost(oneof = "origin::Function", tags = "1")] + pub function: ::core::option::Option, +} +/// Nested message and enum types in `Origin` . +pub mod origin { + /// (Required) Indicate the origin type. + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Function { + #[prost(message, tag = "1")] + PythonOrigin(super::PythonOrigin), + } +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct PythonOrigin { + /// (Required) Name of the origin, for example, the name of the function + #[prost(string, tag = "1")] + pub fragment: ::prost::alloc::string::String, + /// (Required) Callsite to show to end users, for example, stacktrace. + #[prost(string, tag = "2")] + pub call_site: ::prost::alloc::string::String, +} +/// This message describes the logical \[ [ DataType ] \] of something. It does not carry the value +/// itself but only describes it. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct DataType { + #[prost( + oneof = "data_type::Kind", + tags = "1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 25, 23, 24" + )] + pub kind: ::core::option::Option, +} +/// Nested message and enum types in `DataType` . +pub mod data_type { + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct Boolean { + #[prost(uint32, tag = "1")] + pub type_variation_reference: u32, + } + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct Byte { + #[prost(uint32, tag = "1")] + pub type_variation_reference: u32, + } + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct Short { + #[prost(uint32, tag = "1")] + pub type_variation_reference: u32, + } + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct Integer { + #[prost(uint32, tag = "1")] + pub type_variation_reference: u32, + } + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct Long { + #[prost(uint32, tag = "1")] + pub type_variation_reference: u32, + } + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct Float { + #[prost(uint32, tag = "1")] + pub type_variation_reference: u32, + } + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct Double { + #[prost(uint32, tag = "1")] + pub type_variation_reference: u32, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct String { + #[prost(uint32, tag = "1")] + pub type_variation_reference: u32, + #[prost(string, tag = "2")] + pub collation: ::prost::alloc::string::String, + } + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct Binary { + #[prost(uint32, tag = "1")] + pub type_variation_reference: u32, + } + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct Null { + #[prost(uint32, tag = "1")] + pub type_variation_reference: u32, + } + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct Timestamp { + #[prost(uint32, tag = "1")] + pub type_variation_reference: u32, + } + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct Date { + #[prost(uint32, tag = "1")] + pub type_variation_reference: u32, + } + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct TimestampNtz { + #[prost(uint32, tag = "1")] + pub type_variation_reference: u32, + } + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct CalendarInterval { + #[prost(uint32, tag = "1")] + pub type_variation_reference: u32, + } + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct YearMonthInterval { + #[prost(int32, optional, tag = "1")] + pub start_field: ::core::option::Option, + #[prost(int32, optional, tag = "2")] + pub end_field: ::core::option::Option, + #[prost(uint32, tag = "3")] + pub type_variation_reference: u32, + } + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct DayTimeInterval { + #[prost(int32, optional, tag = "1")] + pub start_field: ::core::option::Option, + #[prost(int32, optional, tag = "2")] + pub end_field: ::core::option::Option, + #[prost(uint32, tag = "3")] + pub type_variation_reference: u32, + } + /// Start compound types. + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct Char { + #[prost(int32, tag = "1")] + pub length: i32, + #[prost(uint32, tag = "2")] + pub type_variation_reference: u32, + } + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct VarChar { + #[prost(int32, tag = "1")] + pub length: i32, + #[prost(uint32, tag = "2")] + pub type_variation_reference: u32, + } + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct Decimal { + #[prost(int32, optional, tag = "1")] + pub scale: ::core::option::Option, + #[prost(int32, optional, tag = "2")] + pub precision: ::core::option::Option, + #[prost(uint32, tag = "3")] + pub type_variation_reference: u32, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct StructField { + #[prost(string, tag = "1")] + pub name: ::prost::alloc::string::String, + #[prost(message, optional, tag = "2")] + pub data_type: ::core::option::Option, + #[prost(bool, tag = "3")] + pub nullable: bool, + #[prost(string, optional, tag = "4")] + pub metadata: ::core::option::Option<::prost::alloc::string::String>, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Struct { + #[prost(message, repeated, tag = "1")] + pub fields: ::prost::alloc::vec::Vec, + #[prost(uint32, tag = "2")] + pub type_variation_reference: u32, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Array { + #[prost(message, optional, boxed, tag = "1")] + pub element_type: ::core::option::Option<::prost::alloc::boxed::Box>, + #[prost(bool, tag = "2")] + pub contains_null: bool, + #[prost(uint32, tag = "3")] + pub type_variation_reference: u32, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Map { + #[prost(message, optional, boxed, tag = "1")] + pub key_type: ::core::option::Option<::prost::alloc::boxed::Box>, + #[prost(message, optional, boxed, tag = "2")] + pub value_type: ::core::option::Option<::prost::alloc::boxed::Box>, + #[prost(bool, tag = "3")] + pub value_contains_null: bool, + #[prost(uint32, tag = "4")] + pub type_variation_reference: u32, + } + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct Variant { + #[prost(uint32, tag = "1")] + pub type_variation_reference: u32, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Udt { + #[prost(string, tag = "1")] + pub r#type: ::prost::alloc::string::String, + #[prost(string, optional, tag = "2")] + pub jvm_class: ::core::option::Option<::prost::alloc::string::String>, + #[prost(string, optional, tag = "3")] + pub python_class: ::core::option::Option<::prost::alloc::string::String>, + #[prost(string, optional, tag = "4")] + pub serialized_python_class: ::core::option::Option<::prost::alloc::string::String>, + #[prost(message, optional, boxed, tag = "5")] + pub sql_type: ::core::option::Option<::prost::alloc::boxed::Box>, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Unparsed { + /// (Required) The unparsed data type string + #[prost(string, tag = "1")] + pub data_type_string: ::prost::alloc::string::String, + } + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Kind { + #[prost(message, tag = "1")] + Null(Null), + #[prost(message, tag = "2")] + Binary(Binary), + #[prost(message, tag = "3")] + Boolean(Boolean), + /// Numeric types + #[prost(message, tag = "4")] + Byte(Byte), + #[prost(message, tag = "5")] + Short(Short), + #[prost(message, tag = "6")] + Integer(Integer), + #[prost(message, tag = "7")] + Long(Long), + #[prost(message, tag = "8")] + Float(Float), + #[prost(message, tag = "9")] + Double(Double), + #[prost(message, tag = "10")] + Decimal(Decimal), + /// String types + #[prost(message, tag = "11")] + String(String), + #[prost(message, tag = "12")] + Char(Char), + #[prost(message, tag = "13")] + VarChar(VarChar), + /// Datatime types + #[prost(message, tag = "14")] + Date(Date), + #[prost(message, tag = "15")] + Timestamp(Timestamp), + #[prost(message, tag = "16")] + TimestampNtz(TimestampNtz), + /// Interval types + #[prost(message, tag = "17")] + CalendarInterval(CalendarInterval), + #[prost(message, tag = "18")] + YearMonthInterval(YearMonthInterval), + #[prost(message, tag = "19")] + DayTimeInterval(DayTimeInterval), + /// Complex types + #[prost(message, tag = "20")] + Array(::prost::alloc::boxed::Box), + #[prost(message, tag = "21")] + Struct(Struct), + #[prost(message, tag = "22")] + Map(::prost::alloc::boxed::Box), + #[prost(message, tag = "25")] + Variant(Variant), + /// UserDefinedType + #[prost(message, tag = "23")] + Udt(::prost::alloc::boxed::Box), + /// UnparsedDataType + #[prost(message, tag = "24")] + Unparsed(Unparsed), + } +} +/// Expression used to refer to fields, functions and similar. This can be used everywhere +/// expressions in SQL appear. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Expression { + #[prost(message, optional, tag = "18")] + pub common: ::core::option::Option, + #[prost( + oneof = "expression::ExprType", + tags = "1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 20, 999" + )] + pub expr_type: ::core::option::Option, +} +/// Nested message and enum types in `Expression` . +pub mod expression { + /// Expression for the OVER clause or WINDOW clause. + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Window { + /// (Required) The window function. + #[prost(message, optional, boxed, tag = "1")] + pub window_function: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Optional) The way that input rows are partitioned. + #[prost(message, repeated, tag = "2")] + pub partition_spec: ::prost::alloc::vec::Vec, + /// (Optional) Ordering of rows in a partition. + #[prost(message, repeated, tag = "3")] + pub order_spec: ::prost::alloc::vec::Vec, + /// (Optional) Window frame in a partition. + /// + /// If not set, it will be treated as 'UnspecifiedFrame'. + #[prost(message, optional, boxed, tag = "4")] + pub frame_spec: ::core::option::Option<::prost::alloc::boxed::Box>, + } + /// Nested message and enum types in `Window` . + pub mod window { + /// The window frame + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct WindowFrame { + /// (Required) The type of the frame. + #[prost(enumeration = "window_frame::FrameType", tag = "1")] + pub frame_type: i32, + /// (Required) The lower bound of the frame. + #[prost(message, optional, boxed, tag = "2")] + pub lower: + ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) The upper bound of the frame. + #[prost(message, optional, boxed, tag = "3")] + pub upper: + ::core::option::Option<::prost::alloc::boxed::Box>, + } + /// Nested message and enum types in `WindowFrame` . + pub mod window_frame { + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct FrameBoundary { + #[prost(oneof = "frame_boundary::Boundary", tags = "1, 2, 3")] + pub boundary: ::core::option::Option, + } + /// Nested message and enum types in `FrameBoundary` . + pub mod frame_boundary { + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Boundary { + /// CURRENT ROW boundary + #[prost(bool, tag = "1")] + CurrentRow(bool), + /// UNBOUNDED boundary. + /// For lower bound, it will be converted to 'UnboundedPreceding'. + /// for upper bound, it will be converted to 'UnboundedFollowing'. + #[prost(bool, tag = "2")] + Unbounded(bool), + /// This is an expression for future proofing. We are expecting literals on the server side. + #[prost(message, tag = "3")] + Value(::prost::alloc::boxed::Box), + } + } + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum FrameType { + Undefined = 0, + /// RowFrame treats rows in a partition individually. + Row = 1, + /// RangeFrame treats rows in a partition as groups of peers. + /// All rows having the same 'ORDER BY' ordering are considered as peers. + Range = 2, + } + impl FrameType { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Self::Undefined => "FRAME_TYPE_UNDEFINED", + Self::Row => "FRAME_TYPE_ROW", + Self::Range => "FRAME_TYPE_RANGE", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "FRAME_TYPE_UNDEFINED" => Some(Self::Undefined), + "FRAME_TYPE_ROW" => Some(Self::Row), + "FRAME_TYPE_RANGE" => Some(Self::Range), + _ => None, + } + } + } + } + } + /// SortOrder is used to specify the data ordering, it is normally used in Sort and Window. + /// It is an unevaluable expression and cannot be evaluated, so can not be used in Projection. + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SortOrder { + /// (Required) The expression to be sorted. + #[prost(message, optional, boxed, tag = "1")] + pub child: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) The sort direction, should be ASCENDING or DESCENDING. + #[prost(enumeration = "sort_order::SortDirection", tag = "2")] + pub direction: i32, + /// (Required) How to deal with NULLs, should be NULLS_FIRST or NULLS_LAST. + #[prost(enumeration = "sort_order::NullOrdering", tag = "3")] + pub null_ordering: i32, + } + /// Nested message and enum types in `SortOrder` . + pub mod sort_order { + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum SortDirection { + Unspecified = 0, + Ascending = 1, + Descending = 2, + } + impl SortDirection { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Self::Unspecified => "SORT_DIRECTION_UNSPECIFIED", + Self::Ascending => "SORT_DIRECTION_ASCENDING", + Self::Descending => "SORT_DIRECTION_DESCENDING", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "SORT_DIRECTION_UNSPECIFIED" => Some(Self::Unspecified), + "SORT_DIRECTION_ASCENDING" => Some(Self::Ascending), + "SORT_DIRECTION_DESCENDING" => Some(Self::Descending), + _ => None, + } + } + } + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum NullOrdering { + SortNullsUnspecified = 0, + SortNullsFirst = 1, + SortNullsLast = 2, + } + impl NullOrdering { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Self::SortNullsUnspecified => "SORT_NULLS_UNSPECIFIED", + Self::SortNullsFirst => "SORT_NULLS_FIRST", + Self::SortNullsLast => "SORT_NULLS_LAST", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "SORT_NULLS_UNSPECIFIED" => Some(Self::SortNullsUnspecified), + "SORT_NULLS_FIRST" => Some(Self::SortNullsFirst), + "SORT_NULLS_LAST" => Some(Self::SortNullsLast), + _ => None, + } + } + } + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Cast { + /// (Required) the expression to be casted. + #[prost(message, optional, boxed, tag = "1")] + pub expr: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Optional) The expression evaluation mode. + #[prost(enumeration = "cast::EvalMode", tag = "4")] + pub eval_mode: i32, + /// (Required) the data type that the expr to be casted to. + #[prost(oneof = "cast::CastToType", tags = "2, 3")] + pub cast_to_type: ::core::option::Option, + } + /// Nested message and enum types in `Cast` . + pub mod cast { + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum EvalMode { + Unspecified = 0, + Legacy = 1, + Ansi = 2, + Try = 3, + } + impl EvalMode { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Self::Unspecified => "EVAL_MODE_UNSPECIFIED", + Self::Legacy => "EVAL_MODE_LEGACY", + Self::Ansi => "EVAL_MODE_ANSI", + Self::Try => "EVAL_MODE_TRY", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "EVAL_MODE_UNSPECIFIED" => Some(Self::Unspecified), + "EVAL_MODE_LEGACY" => Some(Self::Legacy), + "EVAL_MODE_ANSI" => Some(Self::Ansi), + "EVAL_MODE_TRY" => Some(Self::Try), + _ => None, + } + } + } + /// (Required) the data type that the expr to be casted to. + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum CastToType { + #[prost(message, tag = "2")] + Type(super::super::DataType), + /// If this is set, Server will use Catalyst parser to parse this string to DataType. + #[prost(string, tag = "3")] + TypeStr(::prost::alloc::string::String), + } + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Literal { + #[prost( + oneof = "literal::LiteralType", + tags = "1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21, 22, 23, 24" + )] + pub literal_type: ::core::option::Option, + } + /// Nested message and enum types in `Literal` . + pub mod literal { + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Decimal { + /// the string representation. + #[prost(string, tag = "1")] + pub value: ::prost::alloc::string::String, + /// The maximum number of digits allowed in the value. + /// the maximum precision is 38. + #[prost(int32, optional, tag = "2")] + pub precision: ::core::option::Option, + /// declared scale of decimal literal + #[prost(int32, optional, tag = "3")] + pub scale: ::core::option::Option, + } + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct CalendarInterval { + #[prost(int32, tag = "1")] + pub months: i32, + #[prost(int32, tag = "2")] + pub days: i32, + #[prost(int64, tag = "3")] + pub microseconds: i64, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Array { + #[prost(message, optional, tag = "1")] + pub element_type: ::core::option::Option, + #[prost(message, repeated, tag = "2")] + pub elements: ::prost::alloc::vec::Vec, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Map { + #[prost(message, optional, tag = "1")] + pub key_type: ::core::option::Option, + #[prost(message, optional, tag = "2")] + pub value_type: ::core::option::Option, + #[prost(message, repeated, tag = "3")] + pub keys: ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag = "4")] + pub values: ::prost::alloc::vec::Vec, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Struct { + #[prost(message, optional, tag = "1")] + pub struct_type: ::core::option::Option, + #[prost(message, repeated, tag = "2")] + pub elements: ::prost::alloc::vec::Vec, + } + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum LiteralType { + #[prost(message, tag = "1")] + Null(super::super::DataType), + #[prost(bytes, tag = "2")] + Binary(::prost::alloc::vec::Vec), + #[prost(bool, tag = "3")] + Boolean(bool), + #[prost(int32, tag = "4")] + Byte(i32), + #[prost(int32, tag = "5")] + Short(i32), + #[prost(int32, tag = "6")] + Integer(i32), + #[prost(int64, tag = "7")] + Long(i64), + #[prost(float, tag = "10")] + Float(f32), + #[prost(double, tag = "11")] + Double(f64), + #[prost(message, tag = "12")] + Decimal(Decimal), + #[prost(string, tag = "13")] + String(::prost::alloc::string::String), + /// Date in units of days since the UNIX epoch. + #[prost(int32, tag = "16")] + Date(i32), + /// Timestamp in units of microseconds since the UNIX epoch. + #[prost(int64, tag = "17")] + Timestamp(i64), + /// Timestamp in units of microseconds since the UNIX epoch (without timezone information). + #[prost(int64, tag = "18")] + TimestampNtz(i64), + #[prost(message, tag = "19")] + CalendarInterval(CalendarInterval), + #[prost(int32, tag = "20")] + YearMonthInterval(i32), + #[prost(int64, tag = "21")] + DayTimeInterval(i64), + #[prost(message, tag = "22")] + Array(Array), + #[prost(message, tag = "23")] + Map(Map), + #[prost(message, tag = "24")] + Struct(Struct), + } + } + /// An unresolved attribute that is not explicitly bound to a specific column, but the column + /// is resolved during analysis by name. + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct UnresolvedAttribute { + /// (Required) An identifier that will be parsed by Catalyst parser. This should follow the + /// Spark SQL identifier syntax. + #[prost(string, tag = "1")] + pub unparsed_identifier: ::prost::alloc::string::String, + /// (Optional) The id of corresponding connect plan. + #[prost(int64, optional, tag = "2")] + pub plan_id: ::core::option::Option, + /// (Optional) The requested column is a metadata column. + #[prost(bool, optional, tag = "3")] + pub is_metadata_column: ::core::option::Option, + } + /// An unresolved function is not explicitly bound to one explicit function, but the function + /// is resolved during analysis following Sparks name resolution rules. + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct UnresolvedFunction { + /// (Required) name (or unparsed name for user defined function) for the unresolved function. + #[prost(string, tag = "1")] + pub function_name: ::prost::alloc::string::String, + /// (Optional) Function arguments. Empty arguments are allowed. + #[prost(message, repeated, tag = "2")] + pub arguments: ::prost::alloc::vec::Vec, + /// (Required) Indicate if this function should be applied on distinct values. + #[prost(bool, tag = "3")] + pub is_distinct: bool, + /// (Required) Indicate if this is a user defined function. + /// + /// When it is not a user defined function, Connect will use the function name directly. + /// When it is a user defined function, Connect will parse the function name first. + #[prost(bool, tag = "4")] + pub is_user_defined_function: bool, + } + /// Expression as string. + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct ExpressionString { + /// (Required) A SQL expression that will be parsed by Catalyst parser. + #[prost(string, tag = "1")] + pub expression: ::prost::alloc::string::String, + } + /// UnresolvedStar is used to expand all the fields of a relation or struct. + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct UnresolvedStar { + /// (Optional) The target of the expansion. + /// + /// If set, it should end with '.*' and will be parsed by 'parseAttributeName' + /// in the server side. + #[prost(string, optional, tag = "1")] + pub unparsed_target: ::core::option::Option<::prost::alloc::string::String>, + /// (Optional) The id of corresponding connect plan. + #[prost(int64, optional, tag = "2")] + pub plan_id: ::core::option::Option, + } + /// Represents all of the input attributes to a given relational operator, for example in + /// "SELECT `(id)?+.+` FROM ...". + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct UnresolvedRegex { + /// (Required) The column name used to extract column with regex. + #[prost(string, tag = "1")] + pub col_name: ::prost::alloc::string::String, + /// (Optional) The id of corresponding connect plan. + #[prost(int64, optional, tag = "2")] + pub plan_id: ::core::option::Option, + } + /// Extracts a value or values from an Expression + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct UnresolvedExtractValue { + /// (Required) The expression to extract value from, can be + /// Map, Array, Struct or array of Structs. + #[prost(message, optional, boxed, tag = "1")] + pub child: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) The expression to describe the extraction, can be + /// key of Map, index of Array, field name of Struct. + #[prost(message, optional, boxed, tag = "2")] + pub extraction: ::core::option::Option<::prost::alloc::boxed::Box>, + } + /// Add, replace or drop a field of `StructType` expression by name. + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct UpdateFields { + /// (Required) The struct expression. + #[prost(message, optional, boxed, tag = "1")] + pub struct_expression: + ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) The field name. + #[prost(string, tag = "2")] + pub field_name: ::prost::alloc::string::String, + /// (Optional) The expression to add or replace. + /// + /// When not set, it means this field will be dropped. + #[prost(message, optional, boxed, tag = "3")] + pub value_expression: ::core::option::Option<::prost::alloc::boxed::Box>, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Alias { + /// (Required) The expression that alias will be added on. + #[prost(message, optional, boxed, tag = "1")] + pub expr: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) a list of name parts for the alias. + /// + /// Scalar columns only has one name that presents. + #[prost(string, repeated, tag = "2")] + pub name: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// (Optional) Alias metadata expressed as a JSON map. + #[prost(string, optional, tag = "3")] + pub metadata: ::core::option::Option<::prost::alloc::string::String>, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct LambdaFunction { + /// (Required) The lambda function. + /// + /// The function body should use 'UnresolvedAttribute' as arguments, the sever side will + /// replace 'UnresolvedAttribute' with 'UnresolvedNamedLambdaVariable'. + #[prost(message, optional, boxed, tag = "1")] + pub function: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) Function variables. Must contains 1 ~ 3 variables. + #[prost(message, repeated, tag = "2")] + pub arguments: ::prost::alloc::vec::Vec, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct UnresolvedNamedLambdaVariable { + /// (Required) a list of name parts for the variable. Must not be empty. + #[prost(string, repeated, tag = "1")] + pub name_parts: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + } + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum ExprType { + #[prost(message, tag = "1")] + Literal(Literal), + #[prost(message, tag = "2")] + UnresolvedAttribute(UnresolvedAttribute), + #[prost(message, tag = "3")] + UnresolvedFunction(UnresolvedFunction), + #[prost(message, tag = "4")] + ExpressionString(ExpressionString), + #[prost(message, tag = "5")] + UnresolvedStar(UnresolvedStar), + #[prost(message, tag = "6")] + Alias(::prost::alloc::boxed::Box), + #[prost(message, tag = "7")] + Cast(::prost::alloc::boxed::Box), + #[prost(message, tag = "8")] + UnresolvedRegex(UnresolvedRegex), + #[prost(message, tag = "9")] + SortOrder(::prost::alloc::boxed::Box), + #[prost(message, tag = "10")] + LambdaFunction(::prost::alloc::boxed::Box), + #[prost(message, tag = "11")] + Window(::prost::alloc::boxed::Box), + #[prost(message, tag = "12")] + UnresolvedExtractValue(::prost::alloc::boxed::Box), + #[prost(message, tag = "13")] + UpdateFields(::prost::alloc::boxed::Box), + #[prost(message, tag = "14")] + UnresolvedNamedLambdaVariable(UnresolvedNamedLambdaVariable), + #[prost(message, tag = "15")] + CommonInlineUserDefinedFunction(super::CommonInlineUserDefinedFunction), + #[prost(message, tag = "16")] + CallFunction(super::CallFunction), + #[prost(message, tag = "17")] + NamedArgumentExpression(::prost::alloc::boxed::Box), + #[prost(message, tag = "19")] + MergeAction(::prost::alloc::boxed::Box), + #[prost(message, tag = "20")] + TypedAggregateExpression(super::TypedAggregateExpression), + /// This field is used to mark extensions to the protocol. When plugins generate arbitrary + /// relations they can add them here. During the planning the correct resolution is done. + #[prost(message, tag = "999")] + Extension(::prost_types::Any), + } +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ExpressionCommon { + /// (Required) Keep the information of the origin for this expression such as stacktrace. + #[prost(message, optional, tag = "1")] + pub origin: ::core::option::Option, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct CommonInlineUserDefinedFunction { + /// (Required) Name of the user-defined function. + #[prost(string, tag = "1")] + pub function_name: ::prost::alloc::string::String, + /// (Optional) Indicate if the user-defined function is deterministic. + #[prost(bool, tag = "2")] + pub deterministic: bool, + /// (Optional) Function arguments. Empty arguments are allowed. + #[prost(message, repeated, tag = "3")] + pub arguments: ::prost::alloc::vec::Vec, + /// (Required) Indicate the function type of the user-defined function. + #[prost( + oneof = "common_inline_user_defined_function::Function", + tags = "4, 5, 6" + )] + pub function: ::core::option::Option, +} +/// Nested message and enum types in `CommonInlineUserDefinedFunction` . +pub mod common_inline_user_defined_function { + /// (Required) Indicate the function type of the user-defined function. + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Function { + #[prost(message, tag = "4")] + PythonUdf(super::PythonUdf), + #[prost(message, tag = "5")] + ScalarScalaUdf(super::ScalarScalaUdf), + #[prost(message, tag = "6")] + JavaUdf(super::JavaUdf), + } +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct PythonUdf { + /// (Required) Output type of the Python UDF + #[prost(message, optional, tag = "1")] + pub output_type: ::core::option::Option, + /// (Required) EvalType of the Python UDF + #[prost(int32, tag = "2")] + pub eval_type: i32, + /// (Required) The encoded commands of the Python UDF + #[prost(bytes = "vec", tag = "3")] + pub command: ::prost::alloc::vec::Vec, + /// (Required) Python version being used in the client. + #[prost(string, tag = "4")] + pub python_ver: ::prost::alloc::string::String, + /// (Optional) Additional includes for the Python UDF. + #[prost(string, repeated, tag = "5")] + pub additional_includes: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ScalarScalaUdf { + /// (Required) Serialized JVM object containing UDF definition, input encoders and output encoder + #[prost(bytes = "vec", tag = "1")] + pub payload: ::prost::alloc::vec::Vec, + /// (Optional) Input type(s) of the UDF + #[prost(message, repeated, tag = "2")] + pub input_types: ::prost::alloc::vec::Vec, + /// (Required) Output type of the UDF + #[prost(message, optional, tag = "3")] + pub output_type: ::core::option::Option, + /// (Required) True if the UDF can return null value + #[prost(bool, tag = "4")] + pub nullable: bool, + /// (Required) Indicate if the UDF is an aggregate function + #[prost(bool, tag = "5")] + pub aggregate: bool, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct JavaUdf { + /// (Required) Fully qualified name of Java class + #[prost(string, tag = "1")] + pub class_name: ::prost::alloc::string::String, + /// (Optional) Output type of the Java UDF + #[prost(message, optional, tag = "2")] + pub output_type: ::core::option::Option, + /// (Required) Indicate if the Java user-defined function is an aggregate function + #[prost(bool, tag = "3")] + pub aggregate: bool, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct TypedAggregateExpression { + /// (Required) The aggregate function object packed into bytes. + #[prost(message, optional, tag = "1")] + pub scalar_scala_udf: ::core::option::Option, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct CallFunction { + /// (Required) Unparsed name of the SQL function. + #[prost(string, tag = "1")] + pub function_name: ::prost::alloc::string::String, + /// (Optional) Function arguments. Empty arguments are allowed. + #[prost(message, repeated, tag = "2")] + pub arguments: ::prost::alloc::vec::Vec, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct NamedArgumentExpression { + /// (Required) The key of the named argument. + #[prost(string, tag = "1")] + pub key: ::prost::alloc::string::String, + /// (Required) The value expression of the named argument. + #[prost(message, optional, boxed, tag = "2")] + pub value: ::core::option::Option<::prost::alloc::boxed::Box>, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MergeAction { + /// (Required) The action type of the merge action. + #[prost(enumeration = "merge_action::ActionType", tag = "1")] + pub action_type: i32, + /// (Optional) The condition expression of the merge action. + #[prost(message, optional, boxed, tag = "2")] + pub condition: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Optional) The assignments of the merge action. Required for ActionTypes INSERT and UPDATE. + #[prost(message, repeated, tag = "3")] + pub assignments: ::prost::alloc::vec::Vec, +} +/// Nested message and enum types in `MergeAction` . +pub mod merge_action { + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Assignment { + /// (Required) The key of the assignment. + #[prost(message, optional, tag = "1")] + pub key: ::core::option::Option, + /// (Required) The value of the assignment. + #[prost(message, optional, tag = "2")] + pub value: ::core::option::Option, + } + #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] + #[repr(i32)] + pub enum ActionType { + Invalid = 0, + Delete = 1, + Insert = 2, + InsertStar = 3, + Update = 4, + UpdateStar = 5, + } + impl ActionType { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Self::Invalid => "ACTION_TYPE_INVALID", + Self::Delete => "ACTION_TYPE_DELETE", + Self::Insert => "ACTION_TYPE_INSERT", + Self::InsertStar => "ACTION_TYPE_INSERT_STAR", + Self::Update => "ACTION_TYPE_UPDATE", + Self::UpdateStar => "ACTION_TYPE_UPDATE_STAR", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "ACTION_TYPE_INVALID" => Some(Self::Invalid), + "ACTION_TYPE_DELETE" => Some(Self::Delete), + "ACTION_TYPE_INSERT" => Some(Self::Insert), + "ACTION_TYPE_INSERT_STAR" => Some(Self::InsertStar), + "ACTION_TYPE_UPDATE" => Some(Self::Update), + "ACTION_TYPE_UPDATE_STAR" => Some(Self::UpdateStar), + _ => None, + } + } + } +} +/// Catalog messages are marked as unstable. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Catalog { + #[prost( + oneof = "catalog::CatType", + tags = "1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26" + )] + pub cat_type: ::core::option::Option, +} +/// Nested message and enum types in `Catalog` . +pub mod catalog { + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum CatType { + #[prost(message, tag = "1")] + CurrentDatabase(super::CurrentDatabase), + #[prost(message, tag = "2")] + SetCurrentDatabase(super::SetCurrentDatabase), + #[prost(message, tag = "3")] + ListDatabases(super::ListDatabases), + #[prost(message, tag = "4")] + ListTables(super::ListTables), + #[prost(message, tag = "5")] + ListFunctions(super::ListFunctions), + #[prost(message, tag = "6")] + ListColumns(super::ListColumns), + #[prost(message, tag = "7")] + GetDatabase(super::GetDatabase), + #[prost(message, tag = "8")] + GetTable(super::GetTable), + #[prost(message, tag = "9")] + GetFunction(super::GetFunction), + #[prost(message, tag = "10")] + DatabaseExists(super::DatabaseExists), + #[prost(message, tag = "11")] + TableExists(super::TableExists), + #[prost(message, tag = "12")] + FunctionExists(super::FunctionExists), + #[prost(message, tag = "13")] + CreateExternalTable(super::CreateExternalTable), + #[prost(message, tag = "14")] + CreateTable(super::CreateTable), + #[prost(message, tag = "15")] + DropTempView(super::DropTempView), + #[prost(message, tag = "16")] + DropGlobalTempView(super::DropGlobalTempView), + #[prost(message, tag = "17")] + RecoverPartitions(super::RecoverPartitions), + #[prost(message, tag = "18")] + IsCached(super::IsCached), + #[prost(message, tag = "19")] + CacheTable(super::CacheTable), + #[prost(message, tag = "20")] + UncacheTable(super::UncacheTable), + #[prost(message, tag = "21")] + ClearCache(super::ClearCache), + #[prost(message, tag = "22")] + RefreshTable(super::RefreshTable), + #[prost(message, tag = "23")] + RefreshByPath(super::RefreshByPath), + #[prost(message, tag = "24")] + CurrentCatalog(super::CurrentCatalog), + #[prost(message, tag = "25")] + SetCurrentCatalog(super::SetCurrentCatalog), + #[prost(message, tag = "26")] + ListCatalogs(super::ListCatalogs), + } +} +/// See `spark.catalog.currentDatabase` +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct CurrentDatabase {} +/// See `spark.catalog.setCurrentDatabase` +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SetCurrentDatabase { + /// (Required) + #[prost(string, tag = "1")] + pub db_name: ::prost::alloc::string::String, +} +/// See `spark.catalog.listDatabases` +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ListDatabases { + /// (Optional) The pattern that the database name needs to match + #[prost(string, optional, tag = "1")] + pub pattern: ::core::option::Option<::prost::alloc::string::String>, +} +/// See `spark.catalog.listTables` +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ListTables { + /// (Optional) + #[prost(string, optional, tag = "1")] + pub db_name: ::core::option::Option<::prost::alloc::string::String>, + /// (Optional) The pattern that the table name needs to match + #[prost(string, optional, tag = "2")] + pub pattern: ::core::option::Option<::prost::alloc::string::String>, +} +/// See `spark.catalog.listFunctions` +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ListFunctions { + /// (Optional) + #[prost(string, optional, tag = "1")] + pub db_name: ::core::option::Option<::prost::alloc::string::String>, + /// (Optional) The pattern that the function name needs to match + #[prost(string, optional, tag = "2")] + pub pattern: ::core::option::Option<::prost::alloc::string::String>, +} +/// See `spark.catalog.listColumns` +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ListColumns { + /// (Required) + #[prost(string, tag = "1")] + pub table_name: ::prost::alloc::string::String, + /// (Optional) + #[prost(string, optional, tag = "2")] + pub db_name: ::core::option::Option<::prost::alloc::string::String>, +} +/// See `spark.catalog.getDatabase` +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GetDatabase { + /// (Required) + #[prost(string, tag = "1")] + pub db_name: ::prost::alloc::string::String, +} +/// See `spark.catalog.getTable` +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GetTable { + /// (Required) + #[prost(string, tag = "1")] + pub table_name: ::prost::alloc::string::String, + /// (Optional) + #[prost(string, optional, tag = "2")] + pub db_name: ::core::option::Option<::prost::alloc::string::String>, +} +/// See `spark.catalog.getFunction` +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GetFunction { + /// (Required) + #[prost(string, tag = "1")] + pub function_name: ::prost::alloc::string::String, + /// (Optional) + #[prost(string, optional, tag = "2")] + pub db_name: ::core::option::Option<::prost::alloc::string::String>, +} +/// See `spark.catalog.databaseExists` +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct DatabaseExists { + /// (Required) + #[prost(string, tag = "1")] + pub db_name: ::prost::alloc::string::String, +} +/// See `spark.catalog.tableExists` +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct TableExists { + /// (Required) + #[prost(string, tag = "1")] + pub table_name: ::prost::alloc::string::String, + /// (Optional) + #[prost(string, optional, tag = "2")] + pub db_name: ::core::option::Option<::prost::alloc::string::String>, +} +/// See `spark.catalog.functionExists` +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct FunctionExists { + /// (Required) + #[prost(string, tag = "1")] + pub function_name: ::prost::alloc::string::String, + /// (Optional) + #[prost(string, optional, tag = "2")] + pub db_name: ::core::option::Option<::prost::alloc::string::String>, +} +/// See `spark.catalog.createExternalTable` +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct CreateExternalTable { + /// (Required) + #[prost(string, tag = "1")] + pub table_name: ::prost::alloc::string::String, + /// (Optional) + #[prost(string, optional, tag = "2")] + pub path: ::core::option::Option<::prost::alloc::string::String>, + /// (Optional) + #[prost(string, optional, tag = "3")] + pub source: ::core::option::Option<::prost::alloc::string::String>, + /// (Optional) + #[prost(message, optional, tag = "4")] + pub schema: ::core::option::Option, + /// Options could be empty for valid data source format. + /// The map key is case insensitive. + #[prost(map = "string, string", tag = "5")] + pub options: + ::std::collections::HashMap<::prost::alloc::string::String, ::prost::alloc::string::String>, +} +/// See `spark.catalog.createTable` +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct CreateTable { + /// (Required) + #[prost(string, tag = "1")] + pub table_name: ::prost::alloc::string::String, + /// (Optional) + #[prost(string, optional, tag = "2")] + pub path: ::core::option::Option<::prost::alloc::string::String>, + /// (Optional) + #[prost(string, optional, tag = "3")] + pub source: ::core::option::Option<::prost::alloc::string::String>, + /// (Optional) + #[prost(string, optional, tag = "4")] + pub description: ::core::option::Option<::prost::alloc::string::String>, + /// (Optional) + #[prost(message, optional, tag = "5")] + pub schema: ::core::option::Option, + /// Options could be empty for valid data source format. + /// The map key is case insensitive. + #[prost(map = "string, string", tag = "6")] + pub options: + ::std::collections::HashMap<::prost::alloc::string::String, ::prost::alloc::string::String>, +} +/// See `spark.catalog.dropTempView` +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct DropTempView { + /// (Required) + #[prost(string, tag = "1")] + pub view_name: ::prost::alloc::string::String, +} +/// See `spark.catalog.dropGlobalTempView` +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct DropGlobalTempView { + /// (Required) + #[prost(string, tag = "1")] + pub view_name: ::prost::alloc::string::String, +} +/// See `spark.catalog.recoverPartitions` +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct RecoverPartitions { + /// (Required) + #[prost(string, tag = "1")] + pub table_name: ::prost::alloc::string::String, +} +/// See `spark.catalog.isCached` +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct IsCached { + /// (Required) + #[prost(string, tag = "1")] + pub table_name: ::prost::alloc::string::String, +} +/// See `spark.catalog.cacheTable` +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct CacheTable { + /// (Required) + #[prost(string, tag = "1")] + pub table_name: ::prost::alloc::string::String, + /// (Optional) + #[prost(message, optional, tag = "2")] + pub storage_level: ::core::option::Option, +} +/// See `spark.catalog.uncacheTable` +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct UncacheTable { + /// (Required) + #[prost(string, tag = "1")] + pub table_name: ::prost::alloc::string::String, +} +/// See `spark.catalog.clearCache` +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct ClearCache {} +/// See `spark.catalog.refreshTable` +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct RefreshTable { + /// (Required) + #[prost(string, tag = "1")] + pub table_name: ::prost::alloc::string::String, +} +/// See `spark.catalog.refreshByPath` +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct RefreshByPath { + /// (Required) + #[prost(string, tag = "1")] + pub path: ::prost::alloc::string::String, +} +/// See `spark.catalog.currentCatalog` +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct CurrentCatalog {} +/// See `spark.catalog.setCurrentCatalog` +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SetCurrentCatalog { + /// (Required) + #[prost(string, tag = "1")] + pub catalog_name: ::prost::alloc::string::String, +} +/// See `spark.catalog.listCatalogs` +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ListCatalogs { + /// (Optional) The pattern that the catalog name needs to match + #[prost(string, optional, tag = "1")] + pub pattern: ::core::option::Option<::prost::alloc::string::String>, +} +/// The main \[ [ Relation ] \] type. Fundamentally, a relation is a typed container +/// that has exactly one explicit relation type set. +/// +/// When adding new relation types, they have to be registered here. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Relation { + #[prost(message, optional, tag = "1")] + pub common: ::core::option::Option, + #[prost( + oneof = "relation::RelType", + tags = "2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 90, 91, 92, 100, 101, 102, 103, 104, 105, 106, 107, 200, 998, 999" + )] + pub rel_type: ::core::option::Option, +} +/// Nested message and enum types in `Relation` . +pub mod relation { + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum RelType { + #[prost(message, tag = "2")] + Read(super::Read), + #[prost(message, tag = "3")] + Project(::prost::alloc::boxed::Box), + #[prost(message, tag = "4")] + Filter(::prost::alloc::boxed::Box), + #[prost(message, tag = "5")] + Join(::prost::alloc::boxed::Box), + #[prost(message, tag = "6")] + SetOp(::prost::alloc::boxed::Box), + #[prost(message, tag = "7")] + Sort(::prost::alloc::boxed::Box), + #[prost(message, tag = "8")] + Limit(::prost::alloc::boxed::Box), + #[prost(message, tag = "9")] + Aggregate(::prost::alloc::boxed::Box), + #[prost(message, tag = "10")] + Sql(super::Sql), + #[prost(message, tag = "11")] + LocalRelation(super::LocalRelation), + #[prost(message, tag = "12")] + Sample(::prost::alloc::boxed::Box), + #[prost(message, tag = "13")] + Offset(::prost::alloc::boxed::Box), + #[prost(message, tag = "14")] + Deduplicate(::prost::alloc::boxed::Box), + #[prost(message, tag = "15")] + Range(super::Range), + #[prost(message, tag = "16")] + SubqueryAlias(::prost::alloc::boxed::Box), + #[prost(message, tag = "17")] + Repartition(::prost::alloc::boxed::Box), + #[prost(message, tag = "18")] + ToDf(::prost::alloc::boxed::Box), + #[prost(message, tag = "19")] + WithColumnsRenamed(::prost::alloc::boxed::Box), + #[prost(message, tag = "20")] + ShowString(::prost::alloc::boxed::Box), + #[prost(message, tag = "21")] + Drop(::prost::alloc::boxed::Box), + #[prost(message, tag = "22")] + Tail(::prost::alloc::boxed::Box), + #[prost(message, tag = "23")] + WithColumns(::prost::alloc::boxed::Box), + #[prost(message, tag = "24")] + Hint(::prost::alloc::boxed::Box), + #[prost(message, tag = "25")] + Unpivot(::prost::alloc::boxed::Box), + #[prost(message, tag = "26")] + ToSchema(::prost::alloc::boxed::Box), + #[prost(message, tag = "27")] + RepartitionByExpression(::prost::alloc::boxed::Box), + #[prost(message, tag = "28")] + MapPartitions(::prost::alloc::boxed::Box), + #[prost(message, tag = "29")] + CollectMetrics(::prost::alloc::boxed::Box), + #[prost(message, tag = "30")] + Parse(::prost::alloc::boxed::Box), + #[prost(message, tag = "31")] + GroupMap(::prost::alloc::boxed::Box), + #[prost(message, tag = "32")] + CoGroupMap(::prost::alloc::boxed::Box), + #[prost(message, tag = "33")] + WithWatermark(::prost::alloc::boxed::Box), + #[prost(message, tag = "34")] + ApplyInPandasWithState(::prost::alloc::boxed::Box), + #[prost(message, tag = "35")] + HtmlString(::prost::alloc::boxed::Box), + #[prost(message, tag = "36")] + CachedLocalRelation(super::CachedLocalRelation), + #[prost(message, tag = "37")] + CachedRemoteRelation(super::CachedRemoteRelation), + #[prost(message, tag = "38")] + CommonInlineUserDefinedTableFunction(super::CommonInlineUserDefinedTableFunction), + #[prost(message, tag = "39")] + AsOfJoin(::prost::alloc::boxed::Box), + #[prost(message, tag = "40")] + CommonInlineUserDefinedDataSource(super::CommonInlineUserDefinedDataSource), + #[prost(message, tag = "41")] + WithRelations(::prost::alloc::boxed::Box), + #[prost(message, tag = "42")] + Transpose(::prost::alloc::boxed::Box), + /// NA functions + #[prost(message, tag = "90")] + FillNa(::prost::alloc::boxed::Box), + #[prost(message, tag = "91")] + DropNa(::prost::alloc::boxed::Box), + #[prost(message, tag = "92")] + Replace(::prost::alloc::boxed::Box), + /// stat functions + #[prost(message, tag = "100")] + Summary(::prost::alloc::boxed::Box), + #[prost(message, tag = "101")] + Crosstab(::prost::alloc::boxed::Box), + #[prost(message, tag = "102")] + Describe(::prost::alloc::boxed::Box), + #[prost(message, tag = "103")] + Cov(::prost::alloc::boxed::Box), + #[prost(message, tag = "104")] + Corr(::prost::alloc::boxed::Box), + #[prost(message, tag = "105")] + ApproxQuantile(::prost::alloc::boxed::Box), + #[prost(message, tag = "106")] + FreqItems(::prost::alloc::boxed::Box), + #[prost(message, tag = "107")] + SampleBy(::prost::alloc::boxed::Box), + /// Catalog API (experimental / unstable) + #[prost(message, tag = "200")] + Catalog(super::Catalog), + /// This field is used to mark extensions to the protocol. When plugins generate arbitrary + /// relations they can add them here. During the planning the correct resolution is done. + #[prost(message, tag = "998")] + Extension(::prost_types::Any), + #[prost(message, tag = "999")] + Unknown(super::Unknown), + } +} +/// Used for testing purposes only. +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct Unknown {} +/// Common metadata of all relations. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct RelationCommon { + /// (Required) Shared relation metadata. + #[deprecated] + #[prost(string, tag = "1")] + pub source_info: ::prost::alloc::string::String, + /// (Optional) A per-client globally unique id for a given connect plan. + #[prost(int64, optional, tag = "2")] + pub plan_id: ::core::option::Option, + /// (Optional) Keep the information of the origin for this expression such as stacktrace. + #[prost(message, optional, tag = "3")] + pub origin: ::core::option::Option, +} +/// Relation that uses a SQL query to generate the output. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Sql { + /// (Required) The SQL query. + #[prost(string, tag = "1")] + pub query: ::prost::alloc::string::String, + /// (Optional) A map of parameter names to literal expressions. + #[prost(map = "string, message", tag = "2")] + pub args: ::std::collections::HashMap<::prost::alloc::string::String, expression::Literal>, + /// (Optional) A sequence of literal expressions for positional parameters in the SQL query text. + #[deprecated] + #[prost(message, repeated, tag = "3")] + pub pos_args: ::prost::alloc::vec::Vec, + /// (Optional) A map of parameter names to expressions. + /// It cannot coexist with `pos_arguments` . + #[prost(map = "string, message", tag = "4")] + pub named_arguments: ::std::collections::HashMap<::prost::alloc::string::String, Expression>, + /// (Optional) A sequence of expressions for positional parameters in the SQL query text. + /// It cannot coexist with `named_arguments` . + #[prost(message, repeated, tag = "5")] + pub pos_arguments: ::prost::alloc::vec::Vec, +} +/// Relation of type \[ [ WithRelations ] \]. +/// +/// This relation contains a root plan, and one or more references that are used by the root plan. +/// There are two ways of referencing a relation, by name (through a subquery alias), or by plan_id +/// (using RelationCommon.plan_id). +/// +/// This relation can be used to implement CTEs, describe DAGs, or to reduce tree depth. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct WithRelations { + /// (Required) Plan at the root of the query tree. This plan is expected to contain one or more + /// references. Those references get expanded later on by the engine. + #[prost(message, optional, boxed, tag = "1")] + pub root: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) Plans referenced by the root plan. Relations in this list are also allowed to + /// contain references to other relations in this list, as long they do not form cycles. + #[prost(message, repeated, tag = "2")] + pub references: ::prost::alloc::vec::Vec, +} +/// Relation that reads from a file / table or other data source. Does not have additional +/// inputs. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Read { + /// (Optional) Indicates if this is a streaming read. + #[prost(bool, tag = "3")] + pub is_streaming: bool, + #[prost(oneof = "read::ReadType", tags = "1, 2")] + pub read_type: ::core::option::Option, +} +/// Nested message and enum types in `Read` . +pub mod read { + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct NamedTable { + /// (Required) Unparsed identifier for the table. + #[prost(string, tag = "1")] + pub unparsed_identifier: ::prost::alloc::string::String, + /// Options for the named table. The map key is case insensitive. + #[prost(map = "string, string", tag = "2")] + pub options: ::std::collections::HashMap< + ::prost::alloc::string::String, + ::prost::alloc::string::String, + >, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct DataSource { + /// (Optional) Supported formats include: parquet, orc, text, json, parquet, csv, avro. + /// + /// If not set, the value from SQL conf 'spark.sql.sources.default' will be used. + #[prost(string, optional, tag = "1")] + pub format: ::core::option::Option<::prost::alloc::string::String>, + /// (Optional) If not set, Spark will infer the schema. + /// + /// This schema string should be either DDL-formatted or JSON-formatted. + #[prost(string, optional, tag = "2")] + pub schema: ::core::option::Option<::prost::alloc::string::String>, + /// Options for the data source. The context of this map varies based on the + /// data source format. This options could be empty for valid data source format. + /// The map key is case insensitive. + #[prost(map = "string, string", tag = "3")] + pub options: ::std::collections::HashMap< + ::prost::alloc::string::String, + ::prost::alloc::string::String, + >, + /// (Optional) A list of path for file-system backed data sources. + #[prost(string, repeated, tag = "4")] + pub paths: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// (Optional) Condition in the where clause for each partition. + /// + /// This is only supported by the JDBC data source. + #[prost(string, repeated, tag = "5")] + pub predicates: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + } + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum ReadType { + #[prost(message, tag = "1")] + NamedTable(NamedTable), + #[prost(message, tag = "2")] + DataSource(DataSource), + } +} +/// Projection of a bag of expressions for a given input relation. +/// +/// The input relation must be specified. +/// The projected expression can be an arbitrary expression. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Project { + /// (Optional) Input relation is optional for Project. + /// + /// For example, `SELECT ABS(-1)` is valid plan without an input plan. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) A Project requires at least one expression. + #[prost(message, repeated, tag = "3")] + pub expressions: ::prost::alloc::vec::Vec, +} +/// Relation that applies a boolean expression `condition` on each row of `input` to produce +/// the output result. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Filter { + /// (Required) Input relation for a Filter. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) A Filter must have a condition expression. + #[prost(message, optional, tag = "2")] + pub condition: ::core::option::Option, +} +/// Relation of type \[ [ Join ] \]. +/// +/// `left` and `right` must be present. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Join { + /// (Required) Left input relation for a Join. + #[prost(message, optional, boxed, tag = "1")] + pub left: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) Right input relation for a Join. + #[prost(message, optional, boxed, tag = "2")] + pub right: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Optional) The join condition. Could be unset when `using_columns` is utilized. + /// + /// This field does not co-exist with using_columns. + #[prost(message, optional, tag = "3")] + pub join_condition: ::core::option::Option, + /// (Required) The join type. + #[prost(enumeration = "join::JoinType", tag = "4")] + pub join_type: i32, + /// Optional. using_columns provides a list of columns that should present on both sides of + /// the join inputs that this Join will join on. For example A JOIN B USING col_name is + /// equivalent to A JOIN B on A.col_name = B.col_name. + /// + /// This field does not co-exist with join_condition. + #[prost(string, repeated, tag = "5")] + pub using_columns: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// (Optional) Only used by joinWith. Set the left and right join data types. + #[prost(message, optional, tag = "6")] + pub join_data_type: ::core::option::Option, +} +/// Nested message and enum types in `Join` . +pub mod join { + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct JoinDataType { + /// If the left data type is a struct. + #[prost(bool, tag = "1")] + pub is_left_struct: bool, + /// If the right data type is a struct. + #[prost(bool, tag = "2")] + pub is_right_struct: bool, + } + #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] + #[repr(i32)] + pub enum JoinType { + Unspecified = 0, + Inner = 1, + FullOuter = 2, + LeftOuter = 3, + RightOuter = 4, + LeftAnti = 5, + LeftSemi = 6, + Cross = 7, + } + impl JoinType { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Self::Unspecified => "JOIN_TYPE_UNSPECIFIED", + Self::Inner => "JOIN_TYPE_INNER", + Self::FullOuter => "JOIN_TYPE_FULL_OUTER", + Self::LeftOuter => "JOIN_TYPE_LEFT_OUTER", + Self::RightOuter => "JOIN_TYPE_RIGHT_OUTER", + Self::LeftAnti => "JOIN_TYPE_LEFT_ANTI", + Self::LeftSemi => "JOIN_TYPE_LEFT_SEMI", + Self::Cross => "JOIN_TYPE_CROSS", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "JOIN_TYPE_UNSPECIFIED" => Some(Self::Unspecified), + "JOIN_TYPE_INNER" => Some(Self::Inner), + "JOIN_TYPE_FULL_OUTER" => Some(Self::FullOuter), + "JOIN_TYPE_LEFT_OUTER" => Some(Self::LeftOuter), + "JOIN_TYPE_RIGHT_OUTER" => Some(Self::RightOuter), + "JOIN_TYPE_LEFT_ANTI" => Some(Self::LeftAnti), + "JOIN_TYPE_LEFT_SEMI" => Some(Self::LeftSemi), + "JOIN_TYPE_CROSS" => Some(Self::Cross), + _ => None, + } + } + } +} +/// Relation of type \[ [ SetOperation ] \] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SetOperation { + /// (Required) Left input relation for a Set operation. + #[prost(message, optional, boxed, tag = "1")] + pub left_input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) Right input relation for a Set operation. + #[prost(message, optional, boxed, tag = "2")] + pub right_input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) The Set operation type. + #[prost(enumeration = "set_operation::SetOpType", tag = "3")] + pub set_op_type: i32, + /// (Optional) If to remove duplicate rows. + /// + /// True to preserve all results. + /// False to remove duplicate rows. + #[prost(bool, optional, tag = "4")] + pub is_all: ::core::option::Option, + /// (Optional) If to perform the Set operation based on name resolution. + /// + /// Only UNION supports this option. + #[prost(bool, optional, tag = "5")] + pub by_name: ::core::option::Option, + /// (Optional) If to perform the Set operation and allow missing columns. + /// + /// Only UNION supports this option. + #[prost(bool, optional, tag = "6")] + pub allow_missing_columns: ::core::option::Option, +} +/// Nested message and enum types in `SetOperation` . +pub mod set_operation { + #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] + #[repr(i32)] + pub enum SetOpType { + Unspecified = 0, + Intersect = 1, + Union = 2, + Except = 3, + } + impl SetOpType { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Self::Unspecified => "SET_OP_TYPE_UNSPECIFIED", + Self::Intersect => "SET_OP_TYPE_INTERSECT", + Self::Union => "SET_OP_TYPE_UNION", + Self::Except => "SET_OP_TYPE_EXCEPT", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "SET_OP_TYPE_UNSPECIFIED" => Some(Self::Unspecified), + "SET_OP_TYPE_INTERSECT" => Some(Self::Intersect), + "SET_OP_TYPE_UNION" => Some(Self::Union), + "SET_OP_TYPE_EXCEPT" => Some(Self::Except), + _ => None, + } + } + } +} +/// Relation of type \[ [ Limit ] \] that is used to `limit` rows from the input relation. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Limit { + /// (Required) Input relation for a Limit. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) the limit. + #[prost(int32, tag = "2")] + pub limit: i32, +} +/// Relation of type \[ [ Offset ] \] that is used to read rows staring from the `offset` on +/// the input relation. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Offset { + /// (Required) Input relation for an Offset. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) the limit. + #[prost(int32, tag = "2")] + pub offset: i32, +} +/// Relation of type \[ [ Tail ] \] that is used to fetch `limit` rows from the last of the input relation. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Tail { + /// (Required) Input relation for an Tail. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) the limit. + #[prost(int32, tag = "2")] + pub limit: i32, +} +/// Relation of type \[ [ Aggregate ] \]. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Aggregate { + /// (Required) Input relation for a RelationalGroupedDataset. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) How the RelationalGroupedDataset was built. + #[prost(enumeration = "aggregate::GroupType", tag = "2")] + pub group_type: i32, + /// (Required) Expressions for grouping keys + #[prost(message, repeated, tag = "3")] + pub grouping_expressions: ::prost::alloc::vec::Vec, + /// (Required) List of values that will be translated to columns in the output DataFrame. + #[prost(message, repeated, tag = "4")] + pub aggregate_expressions: ::prost::alloc::vec::Vec, + /// (Optional) Pivots a column of the current `DataFrame` and performs the specified aggregation. + #[prost(message, optional, tag = "5")] + pub pivot: ::core::option::Option, + /// (Optional) List of values that will be translated to columns in the output DataFrame. + #[prost(message, repeated, tag = "6")] + pub grouping_sets: ::prost::alloc::vec::Vec, +} +/// Nested message and enum types in `Aggregate` . +pub mod aggregate { + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Pivot { + /// (Required) The column to pivot + #[prost(message, optional, tag = "1")] + pub col: ::core::option::Option, + /// (Optional) List of values that will be translated to columns in the output DataFrame. + /// + /// Note that if it is empty, the server side will immediately trigger a job to collect + /// the distinct values of the column. + #[prost(message, repeated, tag = "2")] + pub values: ::prost::alloc::vec::Vec, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct GroupingSets { + /// (Required) Individual grouping set + #[prost(message, repeated, tag = "1")] + pub grouping_set: ::prost::alloc::vec::Vec, + } + #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] + #[repr(i32)] + pub enum GroupType { + Unspecified = 0, + Groupby = 1, + Rollup = 2, + Cube = 3, + Pivot = 4, + GroupingSets = 5, + } + impl GroupType { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Self::Unspecified => "GROUP_TYPE_UNSPECIFIED", + Self::Groupby => "GROUP_TYPE_GROUPBY", + Self::Rollup => "GROUP_TYPE_ROLLUP", + Self::Cube => "GROUP_TYPE_CUBE", + Self::Pivot => "GROUP_TYPE_PIVOT", + Self::GroupingSets => "GROUP_TYPE_GROUPING_SETS", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "GROUP_TYPE_UNSPECIFIED" => Some(Self::Unspecified), + "GROUP_TYPE_GROUPBY" => Some(Self::Groupby), + "GROUP_TYPE_ROLLUP" => Some(Self::Rollup), + "GROUP_TYPE_CUBE" => Some(Self::Cube), + "GROUP_TYPE_PIVOT" => Some(Self::Pivot), + "GROUP_TYPE_GROUPING_SETS" => Some(Self::GroupingSets), + _ => None, + } + } + } +} +/// Relation of type \[ [ Sort ] \]. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Sort { + /// (Required) Input relation for a Sort. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) The ordering expressions + #[prost(message, repeated, tag = "2")] + pub order: ::prost::alloc::vec::Vec, + /// (Optional) if this is a global sort. + #[prost(bool, optional, tag = "3")] + pub is_global: ::core::option::Option, +} +/// Drop specified columns. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Drop { + /// (Required) The input relation. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Optional) columns to drop. + #[prost(message, repeated, tag = "2")] + pub columns: ::prost::alloc::vec::Vec, + /// (Optional) names of columns to drop. + #[prost(string, repeated, tag = "3")] + pub column_names: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, +} +/// Relation of type \[ [ Deduplicate ] \] which have duplicate rows removed, could consider either only +/// the subset of columns or all the columns. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Deduplicate { + /// (Required) Input relation for a Deduplicate. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Optional) Deduplicate based on a list of column names. + /// + /// This field does not co-use with `all_columns_as_keys` . + #[prost(string, repeated, tag = "2")] + pub column_names: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// (Optional) Deduplicate based on all the columns of the input relation. + /// + /// This field does not co-use with `column_names` . + #[prost(bool, optional, tag = "3")] + pub all_columns_as_keys: ::core::option::Option, + /// (Optional) Deduplicate within the time range of watermark. + #[prost(bool, optional, tag = "4")] + pub within_watermark: ::core::option::Option, +} +/// A relation that does not need to be qualified by name. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct LocalRelation { + /// (Optional) Local collection data serialized into Arrow IPC streaming format which contains + /// the schema of the data. + #[prost(bytes = "vec", optional, tag = "1")] + pub data: ::core::option::Option<::prost::alloc::vec::Vec>, + /// (Optional) The schema of local data. + /// It should be either a DDL-formatted type string or a JSON string. + /// + /// The server side will update the column names and data types according to this schema. + /// If the 'data' is not provided, then this schema will be required. + #[prost(string, optional, tag = "2")] + pub schema: ::core::option::Option<::prost::alloc::string::String>, +} +/// A local relation that has been cached already. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct CachedLocalRelation { + /// (Required) A sha-256 hash of the serialized local relation in proto, see LocalRelation. + #[prost(string, tag = "3")] + pub hash: ::prost::alloc::string::String, +} +/// Represents a remote relation that has been cached on server. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct CachedRemoteRelation { + /// (Required) ID of the remote related (assigned by the service). + #[prost(string, tag = "1")] + pub relation_id: ::prost::alloc::string::String, +} +/// Relation of type \[ [ Sample ] \] that samples a fraction of the dataset. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Sample { + /// (Required) Input relation for a Sample. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) lower bound. + #[prost(double, tag = "2")] + pub lower_bound: f64, + /// (Required) upper bound. + #[prost(double, tag = "3")] + pub upper_bound: f64, + /// (Optional) Whether to sample with replacement. + #[prost(bool, optional, tag = "4")] + pub with_replacement: ::core::option::Option, + /// (Required) The random seed. + /// This field is required to avoid generating mutable dataframes (see SPARK-48184 for details), + /// however, still keep it 'optional' here for backward compatibility. + #[prost(int64, optional, tag = "5")] + pub seed: ::core::option::Option, + /// (Required) Explicitly sort the underlying plan to make the ordering deterministic or cache it. + /// This flag is true when invoking `dataframe.randomSplit` to randomly splits DataFrame with the + /// provided weights. Otherwise, it is false. + #[prost(bool, tag = "6")] + pub deterministic_order: bool, +} +/// Relation of type \[ [ Range ] \] that generates a sequence of integers. +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct Range { + /// (Optional) Default value = 0 + #[prost(int64, optional, tag = "1")] + pub start: ::core::option::Option, + /// (Required) + #[prost(int64, tag = "2")] + pub end: i64, + /// (Required) + #[prost(int64, tag = "3")] + pub step: i64, + /// Optional. Default value is assigned by 1) SQL conf "spark.sql.leafNodeDefaultParallelism" if + /// it is set, or 2) spark default parallelism. + #[prost(int32, optional, tag = "4")] + pub num_partitions: ::core::option::Option, +} +/// Relation alias. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SubqueryAlias { + /// (Required) The input relation of SubqueryAlias. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) The alias. + #[prost(string, tag = "2")] + pub alias: ::prost::alloc::string::String, + /// (Optional) Qualifier of the alias. + #[prost(string, repeated, tag = "3")] + pub qualifier: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, +} +/// Relation repartition. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Repartition { + /// (Required) The input relation of Repartition. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) Must be positive. + #[prost(int32, tag = "2")] + pub num_partitions: i32, + /// (Optional) Default value is false. + #[prost(bool, optional, tag = "3")] + pub shuffle: ::core::option::Option, +} +/// Compose the string representing rows for output. +/// It will invoke 'Dataset.showString' to compute the results. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ShowString { + /// (Required) The input relation. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) Number of rows to show. + #[prost(int32, tag = "2")] + pub num_rows: i32, + /// (Required) If set to more than 0, truncates strings to + /// `truncate` characters and all cells will be aligned right. + #[prost(int32, tag = "3")] + pub truncate: i32, + /// (Required) If set to true, prints output rows vertically (one line per column value). + #[prost(bool, tag = "4")] + pub vertical: bool, +} +/// Compose the string representing rows for output. +/// It will invoke 'Dataset.htmlString' to compute the results. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct HtmlString { + /// (Required) The input relation. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) Number of rows to show. + #[prost(int32, tag = "2")] + pub num_rows: i32, + /// (Required) If set to more than 0, truncates strings to + /// `truncate` characters and all cells will be aligned right. + #[prost(int32, tag = "3")] + pub truncate: i32, +} +/// Computes specified statistics for numeric and string columns. +/// It will invoke 'Dataset.summary' (same as 'StatFunctions.summary') +/// to compute the results. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct StatSummary { + /// (Required) The input relation. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Optional) Statistics from to be computed. + /// + /// Available statistics are: + /// count + /// mean + /// stddev + /// min + /// max + /// arbitrary approximate percentiles specified as a percentage (e.g. 75%) + /// count_distinct + /// approx_count_distinct + /// + /// If no statistics are given, this function computes 'count', 'mean', 'stddev', 'min', + /// 'approximate quartiles' (percentiles at 25%, 50%, and 75%), and 'max'. + #[prost(string, repeated, tag = "2")] + pub statistics: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, +} +/// Computes basic statistics for numeric and string columns, including count, mean, stddev, min, +/// and max. If no columns are given, this function computes statistics for all numerical or +/// string columns. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct StatDescribe { + /// (Required) The input relation. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Optional) Columns to compute statistics on. + #[prost(string, repeated, tag = "2")] + pub cols: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, +} +/// Computes a pair-wise frequency table of the given columns. Also known as a contingency table. +/// It will invoke 'Dataset.stat.crosstab' (same as 'StatFunctions.crossTabulate') +/// to compute the results. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct StatCrosstab { + /// (Required) The input relation. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) The name of the first column. + /// + /// Distinct items will make the first item of each row. + #[prost(string, tag = "2")] + pub col1: ::prost::alloc::string::String, + /// (Required) The name of the second column. + /// + /// Distinct items will make the column names of the DataFrame. + #[prost(string, tag = "3")] + pub col2: ::prost::alloc::string::String, +} +/// Calculate the sample covariance of two numerical columns of a DataFrame. +/// It will invoke 'Dataset.stat.cov' (same as 'StatFunctions.calculateCov') to compute the results. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct StatCov { + /// (Required) The input relation. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) The name of the first column. + #[prost(string, tag = "2")] + pub col1: ::prost::alloc::string::String, + /// (Required) The name of the second column. + #[prost(string, tag = "3")] + pub col2: ::prost::alloc::string::String, +} +/// Calculates the correlation of two columns of a DataFrame. Currently only supports the Pearson +/// Correlation Coefficient. It will invoke 'Dataset.stat.corr' (same as +/// 'StatFunctions.pearsonCorrelation') to compute the results. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct StatCorr { + /// (Required) The input relation. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) The name of the first column. + #[prost(string, tag = "2")] + pub col1: ::prost::alloc::string::String, + /// (Required) The name of the second column. + #[prost(string, tag = "3")] + pub col2: ::prost::alloc::string::String, + /// (Optional) Default value is 'pearson'. + /// + /// Currently only supports the Pearson Correlation Coefficient. + #[prost(string, optional, tag = "4")] + pub method: ::core::option::Option<::prost::alloc::string::String>, +} +/// Calculates the approximate quantiles of numerical columns of a DataFrame. +/// It will invoke 'Dataset.stat.approxQuantile' (same as 'StatFunctions.approxQuantile') +/// to compute the results. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct StatApproxQuantile { + /// (Required) The input relation. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) The names of the numerical columns. + #[prost(string, repeated, tag = "2")] + pub cols: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// (Required) A list of quantile probabilities. + /// + /// Each number must belong to \[0, 1\]. + /// For example 0 is the minimum, 0.5 is the median, 1 is the maximum. + #[prost(double, repeated, tag = "3")] + pub probabilities: ::prost::alloc::vec::Vec, + /// (Required) The relative target precision to achieve (greater than or equal to 0). + /// + /// If set to zero, the exact quantiles are computed, which could be very expensive. + /// Note that values greater than 1 are accepted but give the same result as 1. + #[prost(double, tag = "4")] + pub relative_error: f64, +} +/// Finding frequent items for columns, possibly with false positives. +/// It will invoke 'Dataset.stat.freqItems' (same as 'StatFunctions.freqItems') +/// to compute the results. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct StatFreqItems { + /// (Required) The input relation. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) The names of the columns to search frequent items in. + #[prost(string, repeated, tag = "2")] + pub cols: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// (Optional) The minimum frequency for an item to be considered `frequent` . + /// Should be greater than 1e-4. + #[prost(double, optional, tag = "3")] + pub support: ::core::option::Option, +} +/// Returns a stratified sample without replacement based on the fraction +/// given on each stratum. +/// It will invoke 'Dataset.stat.freqItems' (same as 'StatFunctions.freqItems') +/// to compute the results. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct StatSampleBy { + /// (Required) The input relation. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) The column that defines strata. + #[prost(message, optional, tag = "2")] + pub col: ::core::option::Option, + /// (Required) Sampling fraction for each stratum. + /// + /// If a stratum is not specified, we treat its fraction as zero. + #[prost(message, repeated, tag = "3")] + pub fractions: ::prost::alloc::vec::Vec, + /// (Required) The random seed. + /// This field is required to avoid generating mutable dataframes (see SPARK-48184 for details), + /// however, still keep it 'optional' here for backward compatibility. + #[prost(int64, optional, tag = "5")] + pub seed: ::core::option::Option, +} +/// Nested message and enum types in `StatSampleBy` . +pub mod stat_sample_by { + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Fraction { + /// (Required) The stratum. + #[prost(message, optional, tag = "1")] + pub stratum: ::core::option::Option, + /// (Required) The fraction value. Must be in \[0, 1\]. + #[prost(double, tag = "2")] + pub fraction: f64, + } +} +/// Replaces null values. +/// It will invoke 'Dataset.na.fill' (same as 'DataFrameNaFunctions.fill') to compute the results. +/// Following 3 parameter combinations are supported: +/// 1, 'values' only contains 1 item, 'cols' is empty: +/// replaces null values in all type-compatible columns. +/// 2, 'values' only contains 1 item, 'cols' is not empty: +/// replaces null values in specified columns. +/// 3, 'values' contains more than 1 items, then 'cols' is required to have the same length: +/// replaces each specified column with corresponding value. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct NaFill { + /// (Required) The input relation. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Optional) Optional list of column names to consider. + #[prost(string, repeated, tag = "2")] + pub cols: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// (Required) Values to replace null values with. + /// + /// Should contain at least 1 item. + /// Only 4 data types are supported now: bool, long, double, string + #[prost(message, repeated, tag = "3")] + pub values: ::prost::alloc::vec::Vec, +} +/// Drop rows containing null values. +/// It will invoke 'Dataset.na.drop' (same as 'DataFrameNaFunctions.drop') to compute the results. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct NaDrop { + /// (Required) The input relation. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Optional) Optional list of column names to consider. + /// + /// When it is empty, all the columns in the input relation will be considered. + #[prost(string, repeated, tag = "2")] + pub cols: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// (Optional) The minimum number of non-null and non-NaN values required to keep. + /// + /// When not set, it is equivalent to the number of considered columns, which means + /// a row will be kept only if all columns are non-null. + /// + /// 'how' options ('all', 'any') can be easily converted to this field: + /// - 'all' -> set 'min_non_nulls' 1; + /// - 'any' -> keep 'min_non_nulls' unset; + #[prost(int32, optional, tag = "3")] + pub min_non_nulls: ::core::option::Option, +} +/// Replaces old values with the corresponding values. +/// It will invoke 'Dataset.na.replace' (same as 'DataFrameNaFunctions.replace') +/// to compute the results. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct NaReplace { + /// (Required) The input relation. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Optional) List of column names to consider. + /// + /// When it is empty, all the type-compatible columns in the input relation will be considered. + #[prost(string, repeated, tag = "2")] + pub cols: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// (Optional) The value replacement mapping. + #[prost(message, repeated, tag = "3")] + pub replacements: ::prost::alloc::vec::Vec, +} +/// Nested message and enum types in `NAReplace` . +pub mod na_replace { + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Replacement { + /// (Required) The old value. + /// + /// Only 4 data types are supported now: null, bool, double, string. + #[prost(message, optional, tag = "1")] + pub old_value: ::core::option::Option, + /// (Required) The new value. + /// + /// Should be of the same data type with the old value. + #[prost(message, optional, tag = "2")] + pub new_value: ::core::option::Option, + } +} +/// Rename columns on the input relation by the same length of names. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ToDf { + /// (Required) The input relation of RenameColumnsBySameLengthNames. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) + /// + /// The number of columns of the input relation must be equal to the length + /// of this field. If this is not true, an exception will be returned. + #[prost(string, repeated, tag = "2")] + pub column_names: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, +} +/// Rename columns on the input relation by a map with name to name mapping. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct WithColumnsRenamed { + /// (Required) The input relation. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Optional) + /// + /// Renaming column names of input relation from A to B where A is the map key + /// and B is the map value. This is a no-op if schema doesn't contain any A. It + /// does not require that all input relation column names to present as keys. + /// duplicated B are not allowed. + #[prost(map = "string, string", tag = "2")] + pub rename_columns_map: + ::std::collections::HashMap<::prost::alloc::string::String, ::prost::alloc::string::String>, + #[prost(message, repeated, tag = "3")] + pub renames: ::prost::alloc::vec::Vec, +} +/// Nested message and enum types in `WithColumnsRenamed` . +pub mod with_columns_renamed { + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Rename { + /// (Required) The existing column name. + #[prost(string, tag = "1")] + pub col_name: ::prost::alloc::string::String, + /// (Required) The new column name. + #[prost(string, tag = "2")] + pub new_col_name: ::prost::alloc::string::String, + } +} +/// Adding columns or replacing the existing columns that have the same names. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct WithColumns { + /// (Required) The input relation. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) + /// + /// Given a column name, apply the corresponding expression on the column. If column + /// name exists in the input relation, then replace the column. If the column name + /// does not exist in the input relation, then adds it as a new column. + /// + /// Only one name part is expected from each Expression.Alias. + /// + /// An exception is thrown when duplicated names are present in the mapping. + #[prost(message, repeated, tag = "2")] + pub aliases: ::prost::alloc::vec::Vec, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct WithWatermark { + /// (Required) The input relation + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) Name of the column containing event time. + #[prost(string, tag = "2")] + pub event_time: ::prost::alloc::string::String, + /// (Required) + #[prost(string, tag = "3")] + pub delay_threshold: ::prost::alloc::string::String, +} +/// Specify a hint over a relation. Hint should have a name and optional parameters. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Hint { + /// (Required) The input relation. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) Hint name. + /// + /// Supported Join hints include BROADCAST, MERGE, SHUFFLE_HASH, SHUFFLE_REPLICATE_NL. + /// + /// Supported partitioning hints include COALESCE, REPARTITION, REPARTITION_BY_RANGE. + #[prost(string, tag = "2")] + pub name: ::prost::alloc::string::String, + /// (Optional) Hint parameters. + #[prost(message, repeated, tag = "3")] + pub parameters: ::prost::alloc::vec::Vec, +} +/// Unpivot a DataFrame from wide format to long format, optionally leaving identifier columns set. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Unpivot { + /// (Required) The input relation. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) Id columns. + #[prost(message, repeated, tag = "2")] + pub ids: ::prost::alloc::vec::Vec, + /// (Optional) Value columns to unpivot. + #[prost(message, optional, tag = "3")] + pub values: ::core::option::Option, + /// (Required) Name of the variable column. + #[prost(string, tag = "4")] + pub variable_column_name: ::prost::alloc::string::String, + /// (Required) Name of the value column. + #[prost(string, tag = "5")] + pub value_column_name: ::prost::alloc::string::String, +} +/// Nested message and enum types in `Unpivot` . +pub mod unpivot { + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Values { + #[prost(message, repeated, tag = "1")] + pub values: ::prost::alloc::vec::Vec, + } +} +/// Transpose a DataFrame, switching rows to columns. +/// Transforms the DataFrame such that the values in the specified index column +/// become the new columns of the DataFrame. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Transpose { + /// (Required) The input relation. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Optional) A list of columns that will be treated as the indices. + /// Only single column is supported now. + #[prost(message, repeated, tag = "2")] + pub index_columns: ::prost::alloc::vec::Vec, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ToSchema { + /// (Required) The input relation. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) The user provided schema. + /// + /// The Sever side will update the dataframe with this schema. + #[prost(message, optional, tag = "2")] + pub schema: ::core::option::Option, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct RepartitionByExpression { + /// (Required) The input relation. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) The partitioning expressions. + #[prost(message, repeated, tag = "2")] + pub partition_exprs: ::prost::alloc::vec::Vec, + /// (Optional) number of partitions, must be positive. + #[prost(int32, optional, tag = "3")] + pub num_partitions: ::core::option::Option, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MapPartitions { + /// (Required) Input relation for a mapPartitions-equivalent API: mapInPandas, mapInArrow. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) Input user-defined function. + #[prost(message, optional, tag = "2")] + pub func: ::core::option::Option, + /// (Optional) Whether to use barrier mode execution or not. + #[prost(bool, optional, tag = "3")] + pub is_barrier: ::core::option::Option, + /// (Optional) ResourceProfile id used for the stage level scheduling. + #[prost(int32, optional, tag = "4")] + pub profile_id: ::core::option::Option, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GroupMap { + /// (Required) Input relation for Group Map API: apply, applyInPandas. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) Expressions for grouping keys. + #[prost(message, repeated, tag = "2")] + pub grouping_expressions: ::prost::alloc::vec::Vec, + /// (Required) Input user-defined function. + #[prost(message, optional, tag = "3")] + pub func: ::core::option::Option, + /// (Optional) Expressions for sorting. Only used by Scala Sorted Group Map API. + #[prost(message, repeated, tag = "4")] + pub sorting_expressions: ::prost::alloc::vec::Vec, + /// Below fields are only used by (Flat)MapGroupsWithState + /// (Optional) Input relation for initial State. + #[prost(message, optional, boxed, tag = "5")] + pub initial_input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Optional) Expressions for grouping keys of the initial state input relation. + #[prost(message, repeated, tag = "6")] + pub initial_grouping_expressions: ::prost::alloc::vec::Vec, + /// (Optional) True if MapGroupsWithState, false if FlatMapGroupsWithState. + #[prost(bool, optional, tag = "7")] + pub is_map_groups_with_state: ::core::option::Option, + /// (Optional) The output mode of the function. + #[prost(string, optional, tag = "8")] + pub output_mode: ::core::option::Option<::prost::alloc::string::String>, + /// (Optional) Timeout configuration for groups that do not receive data for a while. + #[prost(string, optional, tag = "9")] + pub timeout_conf: ::core::option::Option<::prost::alloc::string::String>, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct CoGroupMap { + /// (Required) One input relation for CoGroup Map API - applyInPandas. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// Expressions for grouping keys of the first input relation. + #[prost(message, repeated, tag = "2")] + pub input_grouping_expressions: ::prost::alloc::vec::Vec, + /// (Required) The other input relation. + #[prost(message, optional, boxed, tag = "3")] + pub other: ::core::option::Option<::prost::alloc::boxed::Box>, + /// Expressions for grouping keys of the other input relation. + #[prost(message, repeated, tag = "4")] + pub other_grouping_expressions: ::prost::alloc::vec::Vec, + /// (Required) Input user-defined function. + #[prost(message, optional, tag = "5")] + pub func: ::core::option::Option, + /// (Optional) Expressions for sorting. Only used by Scala Sorted CoGroup Map API. + #[prost(message, repeated, tag = "6")] + pub input_sorting_expressions: ::prost::alloc::vec::Vec, + /// (Optional) Expressions for sorting. Only used by Scala Sorted CoGroup Map API. + #[prost(message, repeated, tag = "7")] + pub other_sorting_expressions: ::prost::alloc::vec::Vec, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ApplyInPandasWithState { + /// (Required) Input relation for applyInPandasWithState. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) Expressions for grouping keys. + #[prost(message, repeated, tag = "2")] + pub grouping_expressions: ::prost::alloc::vec::Vec, + /// (Required) Input user-defined function. + #[prost(message, optional, tag = "3")] + pub func: ::core::option::Option, + /// (Required) Schema for the output DataFrame. + #[prost(string, tag = "4")] + pub output_schema: ::prost::alloc::string::String, + /// (Required) Schema for the state. + #[prost(string, tag = "5")] + pub state_schema: ::prost::alloc::string::String, + /// (Required) The output mode of the function. + #[prost(string, tag = "6")] + pub output_mode: ::prost::alloc::string::String, + /// (Required) Timeout configuration for groups that do not receive data for a while. + #[prost(string, tag = "7")] + pub timeout_conf: ::prost::alloc::string::String, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct CommonInlineUserDefinedTableFunction { + /// (Required) Name of the user-defined table function. + #[prost(string, tag = "1")] + pub function_name: ::prost::alloc::string::String, + /// (Optional) Whether the user-defined table function is deterministic. + #[prost(bool, tag = "2")] + pub deterministic: bool, + /// (Optional) Function input arguments. Empty arguments are allowed. + #[prost(message, repeated, tag = "3")] + pub arguments: ::prost::alloc::vec::Vec, + /// (Required) Type of the user-defined table function. + #[prost( + oneof = "common_inline_user_defined_table_function::Function", + tags = "4" + )] + pub function: ::core::option::Option, +} +/// Nested message and enum types in `CommonInlineUserDefinedTableFunction` . +pub mod common_inline_user_defined_table_function { + /// (Required) Type of the user-defined table function. + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Function { + #[prost(message, tag = "4")] + PythonUdtf(super::PythonUdtf), + } +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct PythonUdtf { + /// (Optional) Return type of the Python UDTF. + #[prost(message, optional, tag = "1")] + pub return_type: ::core::option::Option, + /// (Required) EvalType of the Python UDTF. + #[prost(int32, tag = "2")] + pub eval_type: i32, + /// (Required) The encoded commands of the Python UDTF. + #[prost(bytes = "vec", tag = "3")] + pub command: ::prost::alloc::vec::Vec, + /// (Required) Python version being used in the client. + #[prost(string, tag = "4")] + pub python_ver: ::prost::alloc::string::String, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct CommonInlineUserDefinedDataSource { + /// (Required) Name of the data source. + #[prost(string, tag = "1")] + pub name: ::prost::alloc::string::String, + /// (Required) The data source type. + #[prost( + oneof = "common_inline_user_defined_data_source::DataSource", + tags = "2" + )] + pub data_source: ::core::option::Option, +} +/// Nested message and enum types in `CommonInlineUserDefinedDataSource` . +pub mod common_inline_user_defined_data_source { + /// (Required) The data source type. + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum DataSource { + #[prost(message, tag = "2")] + PythonDataSource(super::PythonDataSource), + } +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct PythonDataSource { + /// (Required) The encoded commands of the Python data source. + #[prost(bytes = "vec", tag = "1")] + pub command: ::prost::alloc::vec::Vec, + /// (Required) Python version being used in the client. + #[prost(string, tag = "2")] + pub python_ver: ::prost::alloc::string::String, +} +/// Collect arbitrary (named) metrics from a dataset. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct CollectMetrics { + /// (Required) The input relation. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) Name of the metrics. + #[prost(string, tag = "2")] + pub name: ::prost::alloc::string::String, + /// (Required) The metric sequence. + #[prost(message, repeated, tag = "3")] + pub metrics: ::prost::alloc::vec::Vec, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Parse { + /// (Required) Input relation to Parse. The input is expected to have single text column. + #[prost(message, optional, boxed, tag = "1")] + pub input: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) The expected format of the text. + #[prost(enumeration = "parse::ParseFormat", tag = "2")] + pub format: i32, + /// (Optional) DataType representing the schema. If not set, Spark will infer the schema. + #[prost(message, optional, tag = "3")] + pub schema: ::core::option::Option, + /// Options for the csv/json parser. The map key is case insensitive. + #[prost(map = "string, string", tag = "4")] + pub options: + ::std::collections::HashMap<::prost::alloc::string::String, ::prost::alloc::string::String>, +} +/// Nested message and enum types in `Parse` . +pub mod parse { + #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] + #[repr(i32)] + pub enum ParseFormat { + Unspecified = 0, + Csv = 1, + Json = 2, + } + impl ParseFormat { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Self::Unspecified => "PARSE_FORMAT_UNSPECIFIED", + Self::Csv => "PARSE_FORMAT_CSV", + Self::Json => "PARSE_FORMAT_JSON", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "PARSE_FORMAT_UNSPECIFIED" => Some(Self::Unspecified), + "PARSE_FORMAT_CSV" => Some(Self::Csv), + "PARSE_FORMAT_JSON" => Some(Self::Json), + _ => None, + } + } + } +} +/// Relation of type \[ [ AsOfJoin ] \]. +/// +/// `left` and `right` must be present. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct AsOfJoin { + /// (Required) Left input relation for a Join. + #[prost(message, optional, boxed, tag = "1")] + pub left: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) Right input relation for a Join. + #[prost(message, optional, boxed, tag = "2")] + pub right: ::core::option::Option<::prost::alloc::boxed::Box>, + /// (Required) Field to join on in left DataFrame + #[prost(message, optional, tag = "3")] + pub left_as_of: ::core::option::Option, + /// (Required) Field to join on in right DataFrame + #[prost(message, optional, tag = "4")] + pub right_as_of: ::core::option::Option, + /// (Optional) The join condition. Could be unset when `using_columns` is utilized. + /// + /// This field does not co-exist with using_columns. + #[prost(message, optional, tag = "5")] + pub join_expr: ::core::option::Option, + /// Optional. using_columns provides a list of columns that should present on both sides of + /// the join inputs that this Join will join on. For example A JOIN B USING col_name is + /// equivalent to A JOIN B on A.col_name = B.col_name. + /// + /// This field does not co-exist with join_condition. + #[prost(string, repeated, tag = "6")] + pub using_columns: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// (Required) The join type. + #[prost(string, tag = "7")] + pub join_type: ::prost::alloc::string::String, + /// (Optional) The asof tolerance within this range. + #[prost(message, optional, tag = "8")] + pub tolerance: ::core::option::Option, + /// (Required) Whether allow matching with the same value or not. + #[prost(bool, tag = "9")] + pub allow_exact_matches: bool, + /// (Required) Whether to search for prior, subsequent, or closest matches. + #[prost(string, tag = "10")] + pub direction: ::prost::alloc::string::String, +} +/// A \[ [ Command ] \] is an operation that is executed by the server that does not directly consume or +/// produce a relational result. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Command { + #[prost( + oneof = "command::CommandType", + tags = "1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 999" + )] + pub command_type: ::core::option::Option, +} +/// Nested message and enum types in `Command` . +pub mod command { + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum CommandType { + #[prost(message, tag = "1")] + RegisterFunction(super::CommonInlineUserDefinedFunction), + #[prost(message, tag = "2")] + WriteOperation(super::WriteOperation), + #[prost(message, tag = "3")] + CreateDataframeView(super::CreateDataFrameViewCommand), + #[prost(message, tag = "4")] + WriteOperationV2(super::WriteOperationV2), + #[prost(message, tag = "5")] + SqlCommand(super::SqlCommand), + #[prost(message, tag = "6")] + WriteStreamOperationStart(super::WriteStreamOperationStart), + #[prost(message, tag = "7")] + StreamingQueryCommand(super::StreamingQueryCommand), + #[prost(message, tag = "8")] + GetResourcesCommand(super::GetResourcesCommand), + #[prost(message, tag = "9")] + StreamingQueryManagerCommand(super::StreamingQueryManagerCommand), + #[prost(message, tag = "10")] + RegisterTableFunction(super::CommonInlineUserDefinedTableFunction), + #[prost(message, tag = "11")] + StreamingQueryListenerBusCommand(super::StreamingQueryListenerBusCommand), + #[prost(message, tag = "12")] + RegisterDataSource(super::CommonInlineUserDefinedDataSource), + #[prost(message, tag = "13")] + CreateResourceProfileCommand(super::CreateResourceProfileCommand), + #[prost(message, tag = "14")] + CheckpointCommand(super::CheckpointCommand), + #[prost(message, tag = "15")] + RemoveCachedRemoteRelationCommand(super::RemoveCachedRemoteRelationCommand), + #[prost(message, tag = "16")] + MergeIntoTableCommand(super::MergeIntoTableCommand), + /// This field is used to mark extensions to the protocol. When plugins generate arbitrary + /// Commands they can add them here. During the planning the correct resolution is done. + #[prost(message, tag = "999")] + Extension(::prost_types::Any), + } +} +/// A SQL Command is used to trigger the eager evaluation of SQL commands in Spark. +/// +/// When the SQL provide as part of the message is a command it will be immediately evaluated +/// and the result will be collected and returned as part of a LocalRelation. If the result is +/// not a command, the operation will simply return a SQL Relation. This allows the client to be +/// almost oblivious to the server-side behavior. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SqlCommand { + /// (Required) SQL Query. + #[deprecated] + #[prost(string, tag = "1")] + pub sql: ::prost::alloc::string::String, + /// (Optional) A map of parameter names to literal expressions. + #[prost(map = "string, message", tag = "2")] + pub args: ::std::collections::HashMap<::prost::alloc::string::String, expression::Literal>, + /// (Optional) A sequence of literal expressions for positional parameters in the SQL query text. + #[deprecated] + #[prost(message, repeated, tag = "3")] + pub pos_args: ::prost::alloc::vec::Vec, + /// (Optional) A map of parameter names to expressions. + /// It cannot coexist with `pos_arguments` . + #[prost(map = "string, message", tag = "4")] + pub named_arguments: ::std::collections::HashMap<::prost::alloc::string::String, Expression>, + /// (Optional) A sequence of expressions for positional parameters in the SQL query text. + /// It cannot coexist with `named_arguments` . + #[deprecated] + #[prost(message, repeated, tag = "5")] + pub pos_arguments: ::prost::alloc::vec::Vec, + /// (Optional) The relation that this SQL command will be built on. + #[prost(message, optional, tag = "6")] + pub input: ::core::option::Option, +} +/// A command that can create DataFrame global temp view or local temp view. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct CreateDataFrameViewCommand { + /// (Required) The relation that this view will be built on. + #[prost(message, optional, tag = "1")] + pub input: ::core::option::Option, + /// (Required) View name. + #[prost(string, tag = "2")] + pub name: ::prost::alloc::string::String, + /// (Required) Whether this is global temp view or local temp view. + #[prost(bool, tag = "3")] + pub is_global: bool, + /// (Required) + /// + /// If true, and if the view already exists, updates it; if false, and if the view + /// already exists, throws exception. + #[prost(bool, tag = "4")] + pub replace: bool, +} +/// As writes are not directly handled during analysis and planning, they are modeled as commands. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct WriteOperation { + /// (Required) The output of the `input` relation will be persisted according to the options. + #[prost(message, optional, tag = "1")] + pub input: ::core::option::Option, + /// (Optional) Format value according to the Spark documentation. Examples are: text, parquet, delta. + #[prost(string, optional, tag = "2")] + pub source: ::core::option::Option<::prost::alloc::string::String>, + /// (Required) the save mode. + #[prost(enumeration = "write_operation::SaveMode", tag = "5")] + pub mode: i32, + /// (Optional) List of columns to sort the output by. + #[prost(string, repeated, tag = "6")] + pub sort_column_names: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// (Optional) List of columns for partitioning. + #[prost(string, repeated, tag = "7")] + pub partitioning_columns: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// (Optional) Bucketing specification. Bucketing must set the number of buckets and the columns + /// to bucket by. + #[prost(message, optional, tag = "8")] + pub bucket_by: ::core::option::Option, + /// (Optional) A list of configuration options. + #[prost(map = "string, string", tag = "9")] + pub options: + ::std::collections::HashMap<::prost::alloc::string::String, ::prost::alloc::string::String>, + /// (Optional) Columns used for clustering the table. + #[prost(string, repeated, tag = "10")] + pub clustering_columns: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// (Optional) + /// + /// The destination of the write operation can be either a path or a table. + /// If the destination is neither a path nor a table, such as jdbc and noop, + /// the `save_type` should not be set. + #[prost(oneof = "write_operation::SaveType", tags = "3, 4")] + pub save_type: ::core::option::Option, +} +/// Nested message and enum types in `WriteOperation` . +pub mod write_operation { + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SaveTable { + /// (Required) The table name. + #[prost(string, tag = "1")] + pub table_name: ::prost::alloc::string::String, + /// (Required) The method to be called to write to the table. + #[prost(enumeration = "save_table::TableSaveMethod", tag = "2")] + pub save_method: i32, + } + /// Nested message and enum types in `SaveTable` . + pub mod save_table { + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum TableSaveMethod { + Unspecified = 0, + SaveAsTable = 1, + InsertInto = 2, + } + impl TableSaveMethod { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Self::Unspecified => "TABLE_SAVE_METHOD_UNSPECIFIED", + Self::SaveAsTable => "TABLE_SAVE_METHOD_SAVE_AS_TABLE", + Self::InsertInto => "TABLE_SAVE_METHOD_INSERT_INTO", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "TABLE_SAVE_METHOD_UNSPECIFIED" => Some(Self::Unspecified), + "TABLE_SAVE_METHOD_SAVE_AS_TABLE" => Some(Self::SaveAsTable), + "TABLE_SAVE_METHOD_INSERT_INTO" => Some(Self::InsertInto), + _ => None, + } + } + } + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct BucketBy { + #[prost(string, repeated, tag = "1")] + pub bucket_column_names: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + #[prost(int32, tag = "2")] + pub num_buckets: i32, + } + #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] + #[repr(i32)] + pub enum SaveMode { + Unspecified = 0, + Append = 1, + Overwrite = 2, + ErrorIfExists = 3, + Ignore = 4, + } + impl SaveMode { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Self::Unspecified => "SAVE_MODE_UNSPECIFIED", + Self::Append => "SAVE_MODE_APPEND", + Self::Overwrite => "SAVE_MODE_OVERWRITE", + Self::ErrorIfExists => "SAVE_MODE_ERROR_IF_EXISTS", + Self::Ignore => "SAVE_MODE_IGNORE", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "SAVE_MODE_UNSPECIFIED" => Some(Self::Unspecified), + "SAVE_MODE_APPEND" => Some(Self::Append), + "SAVE_MODE_OVERWRITE" => Some(Self::Overwrite), + "SAVE_MODE_ERROR_IF_EXISTS" => Some(Self::ErrorIfExists), + "SAVE_MODE_IGNORE" => Some(Self::Ignore), + _ => None, + } + } + } + /// (Optional) + /// + /// The destination of the write operation can be either a path or a table. + /// If the destination is neither a path nor a table, such as jdbc and noop, + /// the `save_type` should not be set. + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum SaveType { + #[prost(string, tag = "3")] + Path(::prost::alloc::string::String), + #[prost(message, tag = "4")] + Table(SaveTable), + } +} +/// As writes are not directly handled during analysis and planning, they are modeled as commands. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct WriteOperationV2 { + /// (Required) The output of the `input` relation will be persisted according to the options. + #[prost(message, optional, tag = "1")] + pub input: ::core::option::Option, + /// (Required) The destination of the write operation must be either a path or a table. + #[prost(string, tag = "2")] + pub table_name: ::prost::alloc::string::String, + /// (Optional) A provider for the underlying output data source. Spark's default catalog supports + /// "parquet", "json", etc. + #[prost(string, optional, tag = "3")] + pub provider: ::core::option::Option<::prost::alloc::string::String>, + /// (Optional) List of columns for partitioning for output table created by `create` , + /// `createOrReplace` , or `replace` + #[prost(message, repeated, tag = "4")] + pub partitioning_columns: ::prost::alloc::vec::Vec, + /// (Optional) A list of configuration options. + #[prost(map = "string, string", tag = "5")] + pub options: + ::std::collections::HashMap<::prost::alloc::string::String, ::prost::alloc::string::String>, + /// (Optional) A list of table properties. + #[prost(map = "string, string", tag = "6")] + pub table_properties: + ::std::collections::HashMap<::prost::alloc::string::String, ::prost::alloc::string::String>, + /// (Required) Write mode. + #[prost(enumeration = "write_operation_v2::Mode", tag = "7")] + pub mode: i32, + /// (Optional) A condition for overwrite saving mode + #[prost(message, optional, tag = "8")] + pub overwrite_condition: ::core::option::Option, + /// (Optional) Columns used for clustering the table. + #[prost(string, repeated, tag = "9")] + pub clustering_columns: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, +} +/// Nested message and enum types in `WriteOperationV2` . +pub mod write_operation_v2 { + #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] + #[repr(i32)] + pub enum Mode { + Unspecified = 0, + Create = 1, + Overwrite = 2, + OverwritePartitions = 3, + Append = 4, + Replace = 5, + CreateOrReplace = 6, + } + impl Mode { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Self::Unspecified => "MODE_UNSPECIFIED", + Self::Create => "MODE_CREATE", + Self::Overwrite => "MODE_OVERWRITE", + Self::OverwritePartitions => "MODE_OVERWRITE_PARTITIONS", + Self::Append => "MODE_APPEND", + Self::Replace => "MODE_REPLACE", + Self::CreateOrReplace => "MODE_CREATE_OR_REPLACE", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "MODE_UNSPECIFIED" => Some(Self::Unspecified), + "MODE_CREATE" => Some(Self::Create), + "MODE_OVERWRITE" => Some(Self::Overwrite), + "MODE_OVERWRITE_PARTITIONS" => Some(Self::OverwritePartitions), + "MODE_APPEND" => Some(Self::Append), + "MODE_REPLACE" => Some(Self::Replace), + "MODE_CREATE_OR_REPLACE" => Some(Self::CreateOrReplace), + _ => None, + } + } + } +} +/// Starts write stream operation as streaming query. Query ID and Run ID of the streaming +/// query are returned. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct WriteStreamOperationStart { + /// (Required) The output of the `input` streaming relation will be written. + #[prost(message, optional, tag = "1")] + pub input: ::core::option::Option, + #[prost(string, tag = "2")] + pub format: ::prost::alloc::string::String, + #[prost(map = "string, string", tag = "3")] + pub options: + ::std::collections::HashMap<::prost::alloc::string::String, ::prost::alloc::string::String>, + #[prost(string, repeated, tag = "4")] + pub partitioning_column_names: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + #[prost(string, tag = "9")] + pub output_mode: ::prost::alloc::string::String, + #[prost(string, tag = "10")] + pub query_name: ::prost::alloc::string::String, + #[prost(message, optional, tag = "13")] + pub foreach_writer: ::core::option::Option, + #[prost(message, optional, tag = "14")] + pub foreach_batch: ::core::option::Option, + /// (Optional) Columns used for clustering the table. + #[prost(string, repeated, tag = "15")] + pub clustering_column_names: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + #[prost(oneof = "write_stream_operation_start::Trigger", tags = "5, 6, 7, 8")] + pub trigger: ::core::option::Option, + /// The destination is optional. When set, it can be a path or a table name. + #[prost( + oneof = "write_stream_operation_start::SinkDestination", + tags = "11, 12" + )] + pub sink_destination: ::core::option::Option, +} +/// Nested message and enum types in `WriteStreamOperationStart` . +pub mod write_stream_operation_start { + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Trigger { + #[prost(string, tag = "5")] + ProcessingTimeInterval(::prost::alloc::string::String), + #[prost(bool, tag = "6")] + AvailableNow(bool), + #[prost(bool, tag = "7")] + Once(bool), + #[prost(string, tag = "8")] + ContinuousCheckpointInterval(::prost::alloc::string::String), + } + /// The destination is optional. When set, it can be a path or a table name. + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum SinkDestination { + #[prost(string, tag = "11")] + Path(::prost::alloc::string::String), + #[prost(string, tag = "12")] + TableName(::prost::alloc::string::String), + } +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct StreamingForeachFunction { + #[prost(oneof = "streaming_foreach_function::Function", tags = "1, 2")] + pub function: ::core::option::Option, +} +/// Nested message and enum types in `StreamingForeachFunction` . +pub mod streaming_foreach_function { + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Function { + #[prost(message, tag = "1")] + PythonFunction(super::PythonUdf), + #[prost(message, tag = "2")] + ScalaFunction(super::ScalarScalaUdf), + } +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct WriteStreamOperationStartResult { + /// (Required) Query instance. See `StreamingQueryInstanceId` . + #[prost(message, optional, tag = "1")] + pub query_id: ::core::option::Option, + /// An optional query name. + #[prost(string, tag = "2")] + pub name: ::prost::alloc::string::String, + /// Optional query started event if there is any listener registered on the client side. + #[prost(string, optional, tag = "3")] + pub query_started_event_json: ::core::option::Option<::prost::alloc::string::String>, +} +/// A tuple that uniquely identifies an instance of streaming query run. It consists of `id` that +/// persists across the streaming runs and `run_id` that changes between each run of the +/// streaming query that resumes from the checkpoint. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct StreamingQueryInstanceId { + /// (Required) The unique id of this query that persists across restarts from checkpoint data. + /// That is, this id is generated when a query is started for the first time, and + /// will be the same every time it is restarted from checkpoint data. + #[prost(string, tag = "1")] + pub id: ::prost::alloc::string::String, + /// (Required) The unique id of this run of the query. That is, every start/restart of a query + /// will generate a unique run_id. Therefore, every time a query is restarted from + /// checkpoint, it will have the same `id` but different `run_id` s. + #[prost(string, tag = "2")] + pub run_id: ::prost::alloc::string::String, +} +/// Commands for a streaming query. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct StreamingQueryCommand { + /// (Required) Query instance. See `StreamingQueryInstanceId` . + #[prost(message, optional, tag = "1")] + pub query_id: ::core::option::Option, + /// See documentation for the corresponding API method in StreamingQuery. + #[prost( + oneof = "streaming_query_command::Command", + tags = "2, 3, 4, 5, 6, 7, 8, 9" + )] + pub command: ::core::option::Option, +} +/// Nested message and enum types in `StreamingQueryCommand` . +pub mod streaming_query_command { + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct ExplainCommand { + /// TODO: Consider reusing Explain from AnalyzePlanRequest message. + /// We can not do this right now since it base.proto imports this file. + #[prost(bool, tag = "1")] + pub extended: bool, + } + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct AwaitTerminationCommand { + #[prost(int64, optional, tag = "2")] + pub timeout_ms: ::core::option::Option, + } + /// See documentation for the corresponding API method in StreamingQuery. + #[derive(Clone, Copy, PartialEq, ::prost::Oneof)] + pub enum Command { + /// status() API. + #[prost(bool, tag = "2")] + Status(bool), + /// lastProgress() API. + #[prost(bool, tag = "3")] + LastProgress(bool), + /// recentProgress() API. + #[prost(bool, tag = "4")] + RecentProgress(bool), + /// stop() API. Stops the query. + #[prost(bool, tag = "5")] + Stop(bool), + /// processAllAvailable() API. Waits till all the available data is processed + #[prost(bool, tag = "6")] + ProcessAllAvailable(bool), + /// explain() API. Returns logical and physical plans. + #[prost(message, tag = "7")] + Explain(ExplainCommand), + /// exception() API. Returns the exception in the query if any. + #[prost(bool, tag = "8")] + Exception(bool), + /// awaitTermination() API. Waits for the termination of the query. + #[prost(message, tag = "9")] + AwaitTermination(AwaitTerminationCommand), + } +} +/// Response for commands on a streaming query. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct StreamingQueryCommandResult { + /// (Required) Query instance id. See `StreamingQueryInstanceId` . + #[prost(message, optional, tag = "1")] + pub query_id: ::core::option::Option, + #[prost( + oneof = "streaming_query_command_result::ResultType", + tags = "2, 3, 4, 5, 6" + )] + pub result_type: ::core::option::Option, +} +/// Nested message and enum types in `StreamingQueryCommandResult` . +pub mod streaming_query_command_result { + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct StatusResult { + /// See documentation for these Scala 'StreamingQueryStatus' struct + #[prost(string, tag = "1")] + pub status_message: ::prost::alloc::string::String, + #[prost(bool, tag = "2")] + pub is_data_available: bool, + #[prost(bool, tag = "3")] + pub is_trigger_active: bool, + #[prost(bool, tag = "4")] + pub is_active: bool, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct RecentProgressResult { + /// Progress reports as an array of json strings. + #[prost(string, repeated, tag = "5")] + pub recent_progress_json: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct ExplainResult { + /// Logical and physical plans as string + #[prost(string, tag = "1")] + pub result: ::prost::alloc::string::String, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct ExceptionResult { + /// (Optional) Exception message as string, maps to the return value of original + /// StreamingQueryException's toString method + #[prost(string, optional, tag = "1")] + pub exception_message: ::core::option::Option<::prost::alloc::string::String>, + /// (Optional) Exception error class as string + #[prost(string, optional, tag = "2")] + pub error_class: ::core::option::Option<::prost::alloc::string::String>, + /// (Optional) Exception stack trace as string + #[prost(string, optional, tag = "3")] + pub stack_trace: ::core::option::Option<::prost::alloc::string::String>, + } + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct AwaitTerminationResult { + #[prost(bool, tag = "1")] + pub terminated: bool, + } + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum ResultType { + #[prost(message, tag = "2")] + Status(StatusResult), + #[prost(message, tag = "3")] + RecentProgress(RecentProgressResult), + #[prost(message, tag = "4")] + Explain(ExplainResult), + #[prost(message, tag = "5")] + Exception(ExceptionResult), + #[prost(message, tag = "6")] + AwaitTermination(AwaitTerminationResult), + } +} +/// Commands for the streaming query manager. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct StreamingQueryManagerCommand { + /// See documentation for the corresponding API method in StreamingQueryManager. + #[prost( + oneof = "streaming_query_manager_command::Command", + tags = "1, 2, 3, 4, 5, 6, 7" + )] + pub command: ::core::option::Option, +} +/// Nested message and enum types in `StreamingQueryManagerCommand` . +pub mod streaming_query_manager_command { + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct AwaitAnyTerminationCommand { + /// (Optional) The waiting time in milliseconds to wait for any query to terminate. + #[prost(int64, optional, tag = "1")] + pub timeout_ms: ::core::option::Option, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct StreamingQueryListenerCommand { + #[prost(bytes = "vec", tag = "1")] + pub listener_payload: ::prost::alloc::vec::Vec, + #[prost(message, optional, tag = "2")] + pub python_listener_payload: ::core::option::Option, + #[prost(string, tag = "3")] + pub id: ::prost::alloc::string::String, + } + /// See documentation for the corresponding API method in StreamingQueryManager. + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Command { + /// active() API, returns a list of active queries. + #[prost(bool, tag = "1")] + Active(bool), + /// get() API, returns the StreamingQuery identified by id. + #[prost(string, tag = "2")] + GetQuery(::prost::alloc::string::String), + /// awaitAnyTermination() API, wait until any query terminates or timeout. + #[prost(message, tag = "3")] + AwaitAnyTermination(AwaitAnyTerminationCommand), + /// resetTerminated() API. + #[prost(bool, tag = "4")] + ResetTerminated(bool), + /// addListener API. + #[prost(message, tag = "5")] + AddListener(StreamingQueryListenerCommand), + /// removeListener API. + #[prost(message, tag = "6")] + RemoveListener(StreamingQueryListenerCommand), + /// listListeners() API, returns a list of streaming query listeners. + #[prost(bool, tag = "7")] + ListListeners(bool), + } +} +/// Response for commands on the streaming query manager. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct StreamingQueryManagerCommandResult { + #[prost( + oneof = "streaming_query_manager_command_result::ResultType", + tags = "1, 2, 3, 4, 5, 6, 7" + )] + pub result_type: ::core::option::Option, +} +/// Nested message and enum types in `StreamingQueryManagerCommandResult` . +pub mod streaming_query_manager_command_result { + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct ActiveResult { + #[prost(message, repeated, tag = "1")] + pub active_queries: ::prost::alloc::vec::Vec, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct StreamingQueryInstance { + /// (Required) The id and runId of this query. + #[prost(message, optional, tag = "1")] + pub id: ::core::option::Option, + /// (Optional) The name of this query. + #[prost(string, optional, tag = "2")] + pub name: ::core::option::Option<::prost::alloc::string::String>, + } + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct AwaitAnyTerminationResult { + #[prost(bool, tag = "1")] + pub terminated: bool, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct StreamingQueryListenerInstance { + #[prost(bytes = "vec", tag = "1")] + pub listener_payload: ::prost::alloc::vec::Vec, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct ListStreamingQueryListenerResult { + /// (Required) Reference IDs of listener instances. + #[prost(string, repeated, tag = "1")] + pub listener_ids: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + } + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum ResultType { + #[prost(message, tag = "1")] + Active(ActiveResult), + #[prost(message, tag = "2")] + Query(StreamingQueryInstance), + #[prost(message, tag = "3")] + AwaitAnyTermination(AwaitAnyTerminationResult), + #[prost(bool, tag = "4")] + ResetTerminated(bool), + #[prost(bool, tag = "5")] + AddListener(bool), + #[prost(bool, tag = "6")] + RemoveListener(bool), + #[prost(message, tag = "7")] + ListListeners(ListStreamingQueryListenerResult), + } +} +/// The protocol for client-side StreamingQueryListener. +/// This command will only be set when either the first listener is added to the client, or the last +/// listener is removed from the client. +/// The add_listener_bus_listener command will only be set true in the first case. +/// The remove_listener_bus_listener command will only be set true in the second case. +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct StreamingQueryListenerBusCommand { + #[prost(oneof = "streaming_query_listener_bus_command::Command", tags = "1, 2")] + pub command: ::core::option::Option, +} +/// Nested message and enum types in `StreamingQueryListenerBusCommand` . +pub mod streaming_query_listener_bus_command { + #[derive(Clone, Copy, PartialEq, ::prost::Oneof)] + pub enum Command { + #[prost(bool, tag = "1")] + AddListenerBusListener(bool), + #[prost(bool, tag = "2")] + RemoveListenerBusListener(bool), + } +} +/// The protocol for the returned events in the long-running response channel. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct StreamingQueryListenerEvent { + /// (Required) The json serialized event, all StreamingQueryListener events have a json method + #[prost(string, tag = "1")] + pub event_json: ::prost::alloc::string::String, + /// (Required) Query event type used by client to decide how to deserialize the event_json + #[prost(enumeration = "StreamingQueryEventType", tag = "2")] + pub event_type: i32, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct StreamingQueryListenerEventsResult { + #[prost(message, repeated, tag = "1")] + pub events: ::prost::alloc::vec::Vec, + #[prost(bool, optional, tag = "2")] + pub listener_bus_listener_added: ::core::option::Option, +} +/// Command to get the output of 'SparkContext.resources' +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct GetResourcesCommand {} +/// Response for command 'GetResourcesCommand'. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GetResourcesCommandResult { + #[prost(map = "string, message", tag = "1")] + pub resources: ::std::collections::HashMap<::prost::alloc::string::String, ResourceInformation>, +} +/// Command to create ResourceProfile +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct CreateResourceProfileCommand { + /// (Required) The ResourceProfile to be built on the server-side. + #[prost(message, optional, tag = "1")] + pub profile: ::core::option::Option, +} +/// Response for command 'CreateResourceProfileCommand'. +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct CreateResourceProfileCommandResult { + /// (Required) Server-side generated resource profile id. + #[prost(int32, tag = "1")] + pub profile_id: i32, +} +/// Command to remove `CashedRemoteRelation` +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct RemoveCachedRemoteRelationCommand { + /// (Required) The remote to be related + #[prost(message, optional, tag = "1")] + pub relation: ::core::option::Option, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct CheckpointCommand { + /// (Required) The logical plan to checkpoint. + #[prost(message, optional, tag = "1")] + pub relation: ::core::option::Option, + /// (Required) Locally checkpoint using a local temporary + /// directory in Spark Connect server (Spark Driver) + #[prost(bool, tag = "2")] + pub local: bool, + /// (Required) Whether to checkpoint this dataframe immediately. + #[prost(bool, tag = "3")] + pub eager: bool, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MergeIntoTableCommand { + /// (Required) The name of the target table. + #[prost(string, tag = "1")] + pub target_table_name: ::prost::alloc::string::String, + /// (Required) The relation of the source table. + #[prost(message, optional, tag = "2")] + pub source_table_plan: ::core::option::Option, + /// (Required) The condition to match the source and target. + #[prost(message, optional, tag = "3")] + pub merge_condition: ::core::option::Option, + /// (Optional) The actions to be taken when the condition is matched. + #[prost(message, repeated, tag = "4")] + pub match_actions: ::prost::alloc::vec::Vec, + /// (Optional) The actions to be taken when the condition is not matched. + #[prost(message, repeated, tag = "5")] + pub not_matched_actions: ::prost::alloc::vec::Vec, + /// (Optional) The actions to be taken when the condition is not matched by source. + #[prost(message, repeated, tag = "6")] + pub not_matched_by_source_actions: ::prost::alloc::vec::Vec, + /// (Required) Whether to enable schema evolution. + #[prost(bool, tag = "7")] + pub with_schema_evolution: bool, +} +/// The enum used for client side streaming query listener event +/// There is no QueryStartedEvent defined here, +/// it is added as a field in WriteStreamOperationStartResult +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] +#[repr(i32)] +pub enum StreamingQueryEventType { + QueryProgressUnspecified = 0, + QueryProgressEvent = 1, + QueryTerminatedEvent = 2, + QueryIdleEvent = 3, +} +impl StreamingQueryEventType { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Self::QueryProgressUnspecified => "QUERY_PROGRESS_UNSPECIFIED", + Self::QueryProgressEvent => "QUERY_PROGRESS_EVENT", + Self::QueryTerminatedEvent => "QUERY_TERMINATED_EVENT", + Self::QueryIdleEvent => "QUERY_IDLE_EVENT", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "QUERY_PROGRESS_UNSPECIFIED" => Some(Self::QueryProgressUnspecified), + "QUERY_PROGRESS_EVENT" => Some(Self::QueryProgressEvent), + "QUERY_TERMINATED_EVENT" => Some(Self::QueryTerminatedEvent), + "QUERY_IDLE_EVENT" => Some(Self::QueryIdleEvent), + _ => None, + } + } +} +/// A \[ [ Plan ] \] is the structure that carries the runtime information for the execution from the +/// client to the server. A \[ [ Plan ] \] can either be of the type \[ [ Relation ] \] which is a reference +/// to the underlying logical plan or it can be of the \[ [ Command ] \] type that is used to execute +/// commands on the server. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Plan { + #[prost(oneof = "plan::OpType", tags = "1, 2")] + pub op_type: ::core::option::Option, +} +/// Nested message and enum types in `Plan` . +pub mod plan { + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum OpType { + #[prost(message, tag = "1")] + Root(super::Relation), + #[prost(message, tag = "2")] + Command(super::Command), + } +} +/// User Context is used to refer to one particular user session that is executing +/// queries in the backend. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct UserContext { + #[prost(string, tag = "1")] + pub user_id: ::prost::alloc::string::String, + #[prost(string, tag = "2")] + pub user_name: ::prost::alloc::string::String, + /// To extend the existing user context message that is used to identify incoming requests, + /// Spark Connect leverages the Any protobuf type that can be used to inject arbitrary other + /// messages into this message. Extensions are stored as a `repeated` type to be able to + /// handle multiple active extensions. + #[prost(message, repeated, tag = "999")] + pub extensions: ::prost::alloc::vec::Vec<::prost_types::Any>, +} +/// Request to perform plan analyze, optionally to explain the plan. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct AnalyzePlanRequest { + /// (Required) + /// + /// The session_id specifies a spark session for a user id (which is specified + /// by user_context.user_id). The session_id is set by the client to be able to + /// collate streaming responses from different queries within the dedicated session. + /// The id should be an UUID string of the format `00112233-4455-6677-8899-aabbccddeeff` + #[prost(string, tag = "1")] + pub session_id: ::prost::alloc::string::String, + /// (Optional) + /// + /// Server-side generated idempotency key from the previous responses (if any). Server + /// can use this to validate that the server side session has not changed. + #[prost(string, optional, tag = "17")] + pub client_observed_server_side_session_id: + ::core::option::Option<::prost::alloc::string::String>, + /// (Required) User context + #[prost(message, optional, tag = "2")] + pub user_context: ::core::option::Option, + /// Provides optional information about the client sending the request. This field + /// can be used for language or version specific information and is only intended for + /// logging purposes and will not be interpreted by the server. + #[prost(string, optional, tag = "3")] + pub client_type: ::core::option::Option<::prost::alloc::string::String>, + #[prost( + oneof = "analyze_plan_request::Analyze", + tags = "4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16" + )] + pub analyze: ::core::option::Option, +} +/// Nested message and enum types in `AnalyzePlanRequest` . +pub mod analyze_plan_request { + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Schema { + /// (Required) The logical plan to be analyzed. + #[prost(message, optional, tag = "1")] + pub plan: ::core::option::Option, + } + /// Explains the input plan based on a configurable mode. + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Explain { + /// (Required) The logical plan to be analyzed. + #[prost(message, optional, tag = "1")] + pub plan: ::core::option::Option, + /// (Required) For analyzePlan rpc calls, configure the mode to explain plan in strings. + #[prost(enumeration = "explain::ExplainMode", tag = "2")] + pub explain_mode: i32, + } + /// Nested message and enum types in `Explain` . + pub mod explain { + /// Plan explanation mode. + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum ExplainMode { + Unspecified = 0, + /// Generates only physical plan. + Simple = 1, + /// Generates parsed logical plan, analyzed logical plan, optimized logical plan and physical plan. + /// Parsed Logical plan is a unresolved plan that extracted from the query. Analyzed logical plans + /// transforms which translates unresolvedAttribute and unresolvedRelation into fully typed objects. + /// The optimized logical plan transforms through a set of optimization rules, resulting in the + /// physical plan. + Extended = 2, + /// Generates code for the statement, if any and a physical plan. + Codegen = 3, + /// If plan node statistics are available, generates a logical plan and also the statistics. + Cost = 4, + /// Generates a physical plan outline and also node details. + Formatted = 5, + } + impl ExplainMode { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Self::Unspecified => "EXPLAIN_MODE_UNSPECIFIED", + Self::Simple => "EXPLAIN_MODE_SIMPLE", + Self::Extended => "EXPLAIN_MODE_EXTENDED", + Self::Codegen => "EXPLAIN_MODE_CODEGEN", + Self::Cost => "EXPLAIN_MODE_COST", + Self::Formatted => "EXPLAIN_MODE_FORMATTED", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "EXPLAIN_MODE_UNSPECIFIED" => Some(Self::Unspecified), + "EXPLAIN_MODE_SIMPLE" => Some(Self::Simple), + "EXPLAIN_MODE_EXTENDED" => Some(Self::Extended), + "EXPLAIN_MODE_CODEGEN" => Some(Self::Codegen), + "EXPLAIN_MODE_COST" => Some(Self::Cost), + "EXPLAIN_MODE_FORMATTED" => Some(Self::Formatted), + _ => None, + } + } + } + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct TreeString { + /// (Required) The logical plan to be analyzed. + #[prost(message, optional, tag = "1")] + pub plan: ::core::option::Option, + /// (Optional) Max level of the schema. + #[prost(int32, optional, tag = "2")] + pub level: ::core::option::Option, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct IsLocal { + /// (Required) The logical plan to be analyzed. + #[prost(message, optional, tag = "1")] + pub plan: ::core::option::Option, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct IsStreaming { + /// (Required) The logical plan to be analyzed. + #[prost(message, optional, tag = "1")] + pub plan: ::core::option::Option, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct InputFiles { + /// (Required) The logical plan to be analyzed. + #[prost(message, optional, tag = "1")] + pub plan: ::core::option::Option, + } + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct SparkVersion {} + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct DdlParse { + /// (Required) The DDL formatted string to be parsed. + #[prost(string, tag = "1")] + pub ddl_string: ::prost::alloc::string::String, + } + /// Returns `true` when the logical query plans are equal and therefore return same results. + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SameSemantics { + /// (Required) The plan to be compared. + #[prost(message, optional, tag = "1")] + pub target_plan: ::core::option::Option, + /// (Required) The other plan to be compared. + #[prost(message, optional, tag = "2")] + pub other_plan: ::core::option::Option, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SemanticHash { + /// (Required) The logical plan to get a hashCode. + #[prost(message, optional, tag = "1")] + pub plan: ::core::option::Option, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Persist { + /// (Required) The logical plan to persist. + #[prost(message, optional, tag = "1")] + pub relation: ::core::option::Option, + /// (Optional) The storage level. + #[prost(message, optional, tag = "2")] + pub storage_level: ::core::option::Option, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Unpersist { + /// (Required) The logical plan to unpersist. + #[prost(message, optional, tag = "1")] + pub relation: ::core::option::Option, + /// (Optional) Whether to block until all blocks are deleted. + #[prost(bool, optional, tag = "2")] + pub blocking: ::core::option::Option, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct GetStorageLevel { + /// (Required) The logical plan to get the storage level. + #[prost(message, optional, tag = "1")] + pub relation: ::core::option::Option, + } + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Analyze { + #[prost(message, tag = "4")] + Schema(Schema), + #[prost(message, tag = "5")] + Explain(Explain), + #[prost(message, tag = "6")] + TreeString(TreeString), + #[prost(message, tag = "7")] + IsLocal(IsLocal), + #[prost(message, tag = "8")] + IsStreaming(IsStreaming), + #[prost(message, tag = "9")] + InputFiles(InputFiles), + #[prost(message, tag = "10")] + SparkVersion(SparkVersion), + #[prost(message, tag = "11")] + DdlParse(DdlParse), + #[prost(message, tag = "12")] + SameSemantics(SameSemantics), + #[prost(message, tag = "13")] + SemanticHash(SemanticHash), + #[prost(message, tag = "14")] + Persist(Persist), + #[prost(message, tag = "15")] + Unpersist(Unpersist), + #[prost(message, tag = "16")] + GetStorageLevel(GetStorageLevel), + } +} +/// Response to performing analysis of the query. Contains relevant metadata to be able to +/// reason about the performance. +/// Next ID: 16 +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct AnalyzePlanResponse { + #[prost(string, tag = "1")] + pub session_id: ::prost::alloc::string::String, + /// Server-side generated idempotency key that the client can use to assert that the server side + /// session has not changed. + #[prost(string, tag = "15")] + pub server_side_session_id: ::prost::alloc::string::String, + #[prost( + oneof = "analyze_plan_response::Result", + tags = "2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14" + )] + pub result: ::core::option::Option, +} +/// Nested message and enum types in `AnalyzePlanResponse` . +pub mod analyze_plan_response { + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Schema { + #[prost(message, optional, tag = "1")] + pub schema: ::core::option::Option, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Explain { + #[prost(string, tag = "1")] + pub explain_string: ::prost::alloc::string::String, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct TreeString { + #[prost(string, tag = "1")] + pub tree_string: ::prost::alloc::string::String, + } + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct IsLocal { + #[prost(bool, tag = "1")] + pub is_local: bool, + } + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct IsStreaming { + #[prost(bool, tag = "1")] + pub is_streaming: bool, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct InputFiles { + /// A best-effort snapshot of the files that compose this Dataset + #[prost(string, repeated, tag = "1")] + pub files: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SparkVersion { + #[prost(string, tag = "1")] + pub version: ::prost::alloc::string::String, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct DdlParse { + #[prost(message, optional, tag = "1")] + pub parsed: ::core::option::Option, + } + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct SameSemantics { + #[prost(bool, tag = "1")] + pub result: bool, + } + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct SemanticHash { + #[prost(int32, tag = "1")] + pub result: i32, + } + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct Persist {} + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct Unpersist {} + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct GetStorageLevel { + /// (Required) The StorageLevel as a result of get_storage_level request. + #[prost(message, optional, tag = "1")] + pub storage_level: ::core::option::Option, + } + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Result { + #[prost(message, tag = "2")] + Schema(Schema), + #[prost(message, tag = "3")] + Explain(Explain), + #[prost(message, tag = "4")] + TreeString(TreeString), + #[prost(message, tag = "5")] + IsLocal(IsLocal), + #[prost(message, tag = "6")] + IsStreaming(IsStreaming), + #[prost(message, tag = "7")] + InputFiles(InputFiles), + #[prost(message, tag = "8")] + SparkVersion(SparkVersion), + #[prost(message, tag = "9")] + DdlParse(DdlParse), + #[prost(message, tag = "10")] + SameSemantics(SameSemantics), + #[prost(message, tag = "11")] + SemanticHash(SemanticHash), + #[prost(message, tag = "12")] + Persist(Persist), + #[prost(message, tag = "13")] + Unpersist(Unpersist), + #[prost(message, tag = "14")] + GetStorageLevel(GetStorageLevel), + } +} +/// A request to be executed by the service. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ExecutePlanRequest { + /// (Required) + /// + /// The session_id specifies a spark session for a user id (which is specified + /// by user_context.user_id). The session_id is set by the client to be able to + /// collate streaming responses from different queries within the dedicated session. + /// The id should be an UUID string of the format `00112233-4455-6677-8899-aabbccddeeff` + #[prost(string, tag = "1")] + pub session_id: ::prost::alloc::string::String, + /// (Optional) + /// + /// Server-side generated idempotency key from the previous responses (if any). Server + /// can use this to validate that the server side session has not changed. + #[prost(string, optional, tag = "8")] + pub client_observed_server_side_session_id: + ::core::option::Option<::prost::alloc::string::String>, + /// (Required) User context + /// + /// user_context.user_id and session+id both identify a unique remote spark session on the + /// server side. + #[prost(message, optional, tag = "2")] + pub user_context: ::core::option::Option, + /// (Optional) + /// Provide an id for this request. If not provided, it will be generated by the server. + /// It is returned in every ExecutePlanResponse.operation_id of the ExecutePlan response stream. + /// The id must be an UUID string of the format `00112233-4455-6677-8899-aabbccddeeff` + #[prost(string, optional, tag = "6")] + pub operation_id: ::core::option::Option<::prost::alloc::string::String>, + /// (Required) The logical plan to be executed / analyzed. + #[prost(message, optional, tag = "3")] + pub plan: ::core::option::Option, + /// Provides optional information about the client sending the request. This field + /// can be used for language or version specific information and is only intended for + /// logging purposes and will not be interpreted by the server. + #[prost(string, optional, tag = "4")] + pub client_type: ::core::option::Option<::prost::alloc::string::String>, + /// Repeated element for options that can be passed to the request. This element is currently + /// unused but allows to pass in an extension value used for arbitrary options. + #[prost(message, repeated, tag = "5")] + pub request_options: ::prost::alloc::vec::Vec, + /// Tags to tag the given execution with. + /// Tags cannot contain ',' character and cannot be empty strings. + /// Used by Interrupt with interrupt.tag. + #[prost(string, repeated, tag = "7")] + pub tags: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, +} +/// Nested message and enum types in `ExecutePlanRequest` . +pub mod execute_plan_request { + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct RequestOption { + #[prost(oneof = "request_option::RequestOption", tags = "1, 999")] + pub request_option: ::core::option::Option, + } + /// Nested message and enum types in `RequestOption` . + pub mod request_option { + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum RequestOption { + #[prost(message, tag = "1")] + ReattachOptions(super::super::ReattachOptions), + /// Extension type for request options + #[prost(message, tag = "999")] + Extension(::prost_types::Any), + } + } +} +/// The response of a query, can be one or more for each request. Responses belonging to the +/// same input query, carry the same `session_id` . +/// Next ID: 17 +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ExecutePlanResponse { + #[prost(string, tag = "1")] + pub session_id: ::prost::alloc::string::String, + /// Server-side generated idempotency key that the client can use to assert that the server side + /// session has not changed. + #[prost(string, tag = "15")] + pub server_side_session_id: ::prost::alloc::string::String, + /// Identifies the ExecutePlan execution. + /// If set by the client in ExecutePlanRequest.operationId, that value is returned. + /// Otherwise generated by the server. + /// It is an UUID string of the format `00112233-4455-6677-8899-aabbccddeeff` + #[prost(string, tag = "12")] + pub operation_id: ::prost::alloc::string::String, + /// Identified the response in the stream. + /// The id is an UUID string of the format `00112233-4455-6677-8899-aabbccddeeff` + #[prost(string, tag = "13")] + pub response_id: ::prost::alloc::string::String, + /// Metrics for the query execution. Typically, this field is only present in the last + /// batch of results and then represent the overall state of the query execution. + #[prost(message, optional, tag = "4")] + pub metrics: ::core::option::Option, + /// The metrics observed during the execution of the query plan. + #[prost(message, repeated, tag = "6")] + pub observed_metrics: ::prost::alloc::vec::Vec, + /// (Optional) The Spark schema. This field is available when `collect` is called. + #[prost(message, optional, tag = "7")] + pub schema: ::core::option::Option, + /// Union type for the different response messages. + #[prost( + oneof = "execute_plan_response::ResponseType", + tags = "2, 5, 8, 9, 10, 11, 16, 14, 17, 18, 19, 999" + )] + pub response_type: ::core::option::Option, +} +/// Nested message and enum types in `ExecutePlanResponse` . +pub mod execute_plan_response { + /// A SQL command returns an opaque Relation that can be directly used as input for the next + /// call. + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SqlCommandResult { + #[prost(message, optional, tag = "1")] + pub relation: ::core::option::Option, + } + /// Batch results of metrics. + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct ArrowBatch { + /// Count rows in `data` . Must match the number of rows inside `data` . + #[prost(int64, tag = "1")] + pub row_count: i64, + /// Serialized Arrow data. + #[prost(bytes = "vec", tag = "2")] + pub data: ::prost::alloc::vec::Vec, + /// If set, row offset of the start of this ArrowBatch in execution results. + #[prost(int64, optional, tag = "3")] + pub start_offset: ::core::option::Option, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Metrics { + #[prost(message, repeated, tag = "1")] + pub metrics: ::prost::alloc::vec::Vec, + } + /// Nested message and enum types in `Metrics` . + pub mod metrics { + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct MetricObject { + #[prost(string, tag = "1")] + pub name: ::prost::alloc::string::String, + #[prost(int64, tag = "2")] + pub plan_id: i64, + #[prost(int64, tag = "3")] + pub parent: i64, + #[prost(map = "string, message", tag = "4")] + pub execution_metrics: + ::std::collections::HashMap<::prost::alloc::string::String, MetricValue>, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct MetricValue { + #[prost(string, tag = "1")] + pub name: ::prost::alloc::string::String, + #[prost(int64, tag = "2")] + pub value: i64, + #[prost(string, tag = "3")] + pub metric_type: ::prost::alloc::string::String, + } + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct ObservedMetrics { + #[prost(string, tag = "1")] + pub name: ::prost::alloc::string::String, + #[prost(message, repeated, tag = "2")] + pub values: ::prost::alloc::vec::Vec, + #[prost(string, repeated, tag = "3")] + pub keys: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + #[prost(int64, tag = "4")] + pub plan_id: i64, + } + /// If present, in a reattachable execution this means that after server sends onComplete, + /// the execution is complete. If the server sends onComplete without sending a ResultComplete, + /// it means that there is more, and the client should use ReattachExecute RPC to continue. + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct ResultComplete {} + /// This message is used to communicate progress about the query progress during the execution. + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct ExecutionProgress { + /// Captures the progress of each individual stage. + #[prost(message, repeated, tag = "1")] + pub stages: ::prost::alloc::vec::Vec, + /// Captures the currently in progress tasks. + #[prost(int64, tag = "2")] + pub num_inflight_tasks: i64, + } + /// Nested message and enum types in `ExecutionProgress` . + pub mod execution_progress { + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct StageInfo { + #[prost(int64, tag = "1")] + pub stage_id: i64, + #[prost(int64, tag = "2")] + pub num_tasks: i64, + #[prost(int64, tag = "3")] + pub num_completed_tasks: i64, + #[prost(int64, tag = "4")] + pub input_bytes_read: i64, + #[prost(bool, tag = "5")] + pub done: bool, + } + } + /// Union type for the different response messages. + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum ResponseType { + #[prost(message, tag = "2")] + ArrowBatch(ArrowBatch), + /// Special case for executing SQL commands. + #[prost(message, tag = "5")] + SqlCommandResult(SqlCommandResult), + /// Response for a streaming query. + #[prost(message, tag = "8")] + WriteStreamOperationStartResult(super::WriteStreamOperationStartResult), + /// Response for commands on a streaming query. + #[prost(message, tag = "9")] + StreamingQueryCommandResult(super::StreamingQueryCommandResult), + /// Response for 'SparkContext.resources'. + #[prost(message, tag = "10")] + GetResourcesCommandResult(super::GetResourcesCommandResult), + /// Response for commands on the streaming query manager. + #[prost(message, tag = "11")] + StreamingQueryManagerCommandResult(super::StreamingQueryManagerCommandResult), + /// Response for commands on the client side streaming query listener. + #[prost(message, tag = "16")] + StreamingQueryListenerEventsResult(super::StreamingQueryListenerEventsResult), + /// Response type informing if the stream is complete in reattachable execution. + #[prost(message, tag = "14")] + ResultComplete(ResultComplete), + /// Response for command that creates ResourceProfile. + #[prost(message, tag = "17")] + CreateResourceProfileCommandResult(super::CreateResourceProfileCommandResult), + /// (Optional) Intermediate query progress reports. + #[prost(message, tag = "18")] + ExecutionProgress(ExecutionProgress), + /// Response for command that checkpoints a DataFrame. + #[prost(message, tag = "19")] + CheckpointCommandResult(super::CheckpointCommandResult), + /// Support arbitrary result objects. + #[prost(message, tag = "999")] + Extension(::prost_types::Any), + } +} +/// The key-value pair for the config request and response. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct KeyValue { + /// (Required) The key. + #[prost(string, tag = "1")] + pub key: ::prost::alloc::string::String, + /// (Optional) The value. + #[prost(string, optional, tag = "2")] + pub value: ::core::option::Option<::prost::alloc::string::String>, +} +/// Request to update or fetch the configurations. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ConfigRequest { + /// (Required) + /// + /// The session_id specifies a spark session for a user id (which is specified + /// by user_context.user_id). The session_id is set by the client to be able to + /// collate streaming responses from different queries within the dedicated session. + /// The id should be an UUID string of the format `00112233-4455-6677-8899-aabbccddeeff` + #[prost(string, tag = "1")] + pub session_id: ::prost::alloc::string::String, + /// (Optional) + /// + /// Server-side generated idempotency key from the previous responses (if any). Server + /// can use this to validate that the server side session has not changed. + #[prost(string, optional, tag = "8")] + pub client_observed_server_side_session_id: + ::core::option::Option<::prost::alloc::string::String>, + /// (Required) User context + #[prost(message, optional, tag = "2")] + pub user_context: ::core::option::Option, + /// (Required) The operation for the config. + #[prost(message, optional, tag = "3")] + pub operation: ::core::option::Option, + /// Provides optional information about the client sending the request. This field + /// can be used for language or version specific information and is only intended for + /// logging purposes and will not be interpreted by the server. + #[prost(string, optional, tag = "4")] + pub client_type: ::core::option::Option<::prost::alloc::string::String>, +} +/// Nested message and enum types in `ConfigRequest` . +pub mod config_request { + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Operation { + #[prost(oneof = "operation::OpType", tags = "1, 2, 3, 4, 5, 6, 7")] + pub op_type: ::core::option::Option, + } + /// Nested message and enum types in `Operation` . + pub mod operation { + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum OpType { + #[prost(message, tag = "1")] + Set(super::Set), + #[prost(message, tag = "2")] + Get(super::Get), + #[prost(message, tag = "3")] + GetWithDefault(super::GetWithDefault), + #[prost(message, tag = "4")] + GetOption(super::GetOption), + #[prost(message, tag = "5")] + GetAll(super::GetAll), + #[prost(message, tag = "6")] + Unset(super::Unset), + #[prost(message, tag = "7")] + IsModifiable(super::IsModifiable), + } + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Set { + /// (Required) The config key-value pairs to set. + #[prost(message, repeated, tag = "1")] + pub pairs: ::prost::alloc::vec::Vec, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Get { + /// (Required) The config keys to get. + #[prost(string, repeated, tag = "1")] + pub keys: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct GetWithDefault { + /// (Required) The config key-value pairs to get. The value will be used as the default value. + #[prost(message, repeated, tag = "1")] + pub pairs: ::prost::alloc::vec::Vec, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct GetOption { + /// (Required) The config keys to get optionally. + #[prost(string, repeated, tag = "1")] + pub keys: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct GetAll { + /// (Optional) The prefix of the config key to get. + #[prost(string, optional, tag = "1")] + pub prefix: ::core::option::Option<::prost::alloc::string::String>, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Unset { + /// (Required) The config keys to unset. + #[prost(string, repeated, tag = "1")] + pub keys: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + } + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct IsModifiable { + /// (Required) The config keys to check the config is modifiable. + #[prost(string, repeated, tag = "1")] + pub keys: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + } +} +/// Response to the config request. +/// Next ID: 5 +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ConfigResponse { + #[prost(string, tag = "1")] + pub session_id: ::prost::alloc::string::String, + /// Server-side generated idempotency key that the client can use to assert that the server side + /// session has not changed. + #[prost(string, tag = "4")] + pub server_side_session_id: ::prost::alloc::string::String, + /// (Optional) The result key-value pairs. + /// + /// Available when the operation is 'Get', 'GetWithDefault', 'GetOption', 'GetAll'. + /// Also available for the operation 'IsModifiable' with boolean string "true" and "false". + #[prost(message, repeated, tag = "2")] + pub pairs: ::prost::alloc::vec::Vec, + /// (Optional) + /// + /// Warning messages for deprecated or unsupported configurations. + #[prost(string, repeated, tag = "3")] + pub warnings: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, +} +/// Request to transfer client-local artifacts. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct AddArtifactsRequest { + /// (Required) + /// + /// The session_id specifies a spark session for a user id (which is specified + /// by user_context.user_id). The session_id is set by the client to be able to + /// collate streaming responses from different queries within the dedicated session. + /// The id should be an UUID string of the format `00112233-4455-6677-8899-aabbccddeeff` + #[prost(string, tag = "1")] + pub session_id: ::prost::alloc::string::String, + /// User context + #[prost(message, optional, tag = "2")] + pub user_context: ::core::option::Option, + /// (Optional) + /// + /// Server-side generated idempotency key from the previous responses (if any). Server + /// can use this to validate that the server side session has not changed. + #[prost(string, optional, tag = "7")] + pub client_observed_server_side_session_id: + ::core::option::Option<::prost::alloc::string::String>, + /// Provides optional information about the client sending the request. This field + /// can be used for language or version specific information and is only intended for + /// logging purposes and will not be interpreted by the server. + #[prost(string, optional, tag = "6")] + pub client_type: ::core::option::Option<::prost::alloc::string::String>, + /// The payload is either a batch of artifacts or a partial chunk of a large artifact. + #[prost(oneof = "add_artifacts_request::Payload", tags = "3, 4, 5")] + pub payload: ::core::option::Option, +} +/// Nested message and enum types in `AddArtifactsRequest` . +pub mod add_artifacts_request { + /// A chunk of an Artifact. + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct ArtifactChunk { + /// Data chunk. + #[prost(bytes = "vec", tag = "1")] + pub data: ::prost::alloc::vec::Vec, + /// CRC to allow server to verify integrity of the chunk. + #[prost(int64, tag = "2")] + pub crc: i64, + } + /// An artifact that is contained in a single `ArtifactChunk` . + /// Generally, this message represents tiny artifacts such as REPL-generated class files. + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SingleChunkArtifact { + /// The name of the artifact is expected in the form of a "Relative Path" that is made up of a + /// sequence of directories and the final file element. + /// Examples of "Relative Path"s: "jars/test.jar", "classes/xyz.class", "abc.xyz", "a/b/X.jar". + /// The server is expected to maintain the hierarchy of files as defined by their name. (i.e + /// The relative path of the file on the server's filesystem will be the same as the name of + /// the provided artifact) + #[prost(string, tag = "1")] + pub name: ::prost::alloc::string::String, + /// A single data chunk. + #[prost(message, optional, tag = "2")] + pub data: ::core::option::Option, + } + /// A number of `SingleChunkArtifact` batched into a single RPC. + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Batch { + #[prost(message, repeated, tag = "1")] + pub artifacts: ::prost::alloc::vec::Vec, + } + /// Signals the beginning/start of a chunked artifact. + /// A large artifact is transferred through a payload of `BeginChunkedArtifact` followed by a + /// sequence of `ArtifactChunk` s. + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct BeginChunkedArtifact { + /// Name of the artifact undergoing chunking. Follows the same conventions as the `name` in + /// the `Artifact` message. + #[prost(string, tag = "1")] + pub name: ::prost::alloc::string::String, + /// Total size of the artifact in bytes. + #[prost(int64, tag = "2")] + pub total_bytes: i64, + /// Number of chunks the artifact is split into. + /// This includes the `initial_chunk` . + #[prost(int64, tag = "3")] + pub num_chunks: i64, + /// The first/initial chunk. + #[prost(message, optional, tag = "4")] + pub initial_chunk: ::core::option::Option, + } + /// The payload is either a batch of artifacts or a partial chunk of a large artifact. + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Payload { + #[prost(message, tag = "3")] + Batch(Batch), + /// The metadata and the initial chunk of a large artifact chunked into multiple requests. + /// The server side is notified about the total size of the large artifact as well as the + /// number of chunks to expect. + #[prost(message, tag = "4")] + BeginChunk(BeginChunkedArtifact), + /// A chunk of an artifact excluding metadata. This can be any chunk of a large artifact + /// excluding the first chunk (which is included in `BeginChunkedArtifact` ). + #[prost(message, tag = "5")] + Chunk(ArtifactChunk), + } +} +/// Response to adding an artifact. Contains relevant metadata to verify successful transfer of +/// artifact(s). +/// Next ID: 4 +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct AddArtifactsResponse { + /// Session id in which the AddArtifact was running. + #[prost(string, tag = "2")] + pub session_id: ::prost::alloc::string::String, + /// Server-side generated idempotency key that the client can use to assert that the server side + /// session has not changed. + #[prost(string, tag = "3")] + pub server_side_session_id: ::prost::alloc::string::String, + /// The list of artifact(s) seen by the server. + #[prost(message, repeated, tag = "1")] + pub artifacts: ::prost::alloc::vec::Vec, +} +/// Nested message and enum types in `AddArtifactsResponse` . +pub mod add_artifacts_response { + /// Metadata of an artifact. + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct ArtifactSummary { + #[prost(string, tag = "1")] + pub name: ::prost::alloc::string::String, + /// Whether the CRC (Cyclic Redundancy Check) is successful on server verification. + /// The server discards any artifact that fails the CRC. + /// If false, the client may choose to resend the artifact specified by `name` . + #[prost(bool, tag = "2")] + pub is_crc_successful: bool, + } +} +/// Request to get current statuses of artifacts at the server side. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ArtifactStatusesRequest { + /// (Required) + /// + /// The session_id specifies a spark session for a user id (which is specified + /// by user_context.user_id). The session_id is set by the client to be able to + /// collate streaming responses from different queries within the dedicated session. + /// The id should be an UUID string of the format `00112233-4455-6677-8899-aabbccddeeff` + #[prost(string, tag = "1")] + pub session_id: ::prost::alloc::string::String, + /// (Optional) + /// + /// Server-side generated idempotency key from the previous responses (if any). Server + /// can use this to validate that the server side session has not changed. + #[prost(string, optional, tag = "5")] + pub client_observed_server_side_session_id: + ::core::option::Option<::prost::alloc::string::String>, + /// User context + #[prost(message, optional, tag = "2")] + pub user_context: ::core::option::Option, + /// Provides optional information about the client sending the request. This field + /// can be used for language or version specific information and is only intended for + /// logging purposes and will not be interpreted by the server. + #[prost(string, optional, tag = "3")] + pub client_type: ::core::option::Option<::prost::alloc::string::String>, + /// The name of the artifact is expected in the form of a "Relative Path" that is made up of a + /// sequence of directories and the final file element. + /// Examples of "Relative Path"s: "jars/test.jar", "classes/xyz.class", "abc.xyz", "a/b/X.jar". + /// The server is expected to maintain the hierarchy of files as defined by their name. (i.e + /// The relative path of the file on the server's filesystem will be the same as the name of + /// the provided artifact) + #[prost(string, repeated, tag = "4")] + pub names: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, +} +/// Response to checking artifact statuses. +/// Next ID: 4 +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ArtifactStatusesResponse { + /// Session id in which the ArtifactStatus was running. + #[prost(string, tag = "2")] + pub session_id: ::prost::alloc::string::String, + /// Server-side generated idempotency key that the client can use to assert that the server side + /// session has not changed. + #[prost(string, tag = "3")] + pub server_side_session_id: ::prost::alloc::string::String, + /// A map of artifact names to their statuses. + #[prost(map = "string, message", tag = "1")] + pub statuses: ::std::collections::HashMap< + ::prost::alloc::string::String, + artifact_statuses_response::ArtifactStatus, + >, +} +/// Nested message and enum types in `ArtifactStatusesResponse` . +pub mod artifact_statuses_response { + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct ArtifactStatus { + /// Exists or not particular artifact at the server. + #[prost(bool, tag = "1")] + pub exists: bool, + } +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct InterruptRequest { + /// (Required) + /// + /// The session_id specifies a spark session for a user id (which is specified + /// by user_context.user_id). The session_id is set by the client to be able to + /// collate streaming responses from different queries within the dedicated session. + /// The id should be an UUID string of the format `00112233-4455-6677-8899-aabbccddeeff` + #[prost(string, tag = "1")] + pub session_id: ::prost::alloc::string::String, + /// (Optional) + /// + /// Server-side generated idempotency key from the previous responses (if any). Server + /// can use this to validate that the server side session has not changed. + #[prost(string, optional, tag = "7")] + pub client_observed_server_side_session_id: + ::core::option::Option<::prost::alloc::string::String>, + /// (Required) User context + #[prost(message, optional, tag = "2")] + pub user_context: ::core::option::Option, + /// Provides optional information about the client sending the request. This field + /// can be used for language or version specific information and is only intended for + /// logging purposes and will not be interpreted by the server. + #[prost(string, optional, tag = "3")] + pub client_type: ::core::option::Option<::prost::alloc::string::String>, + /// (Required) The type of interrupt to execute. + #[prost(enumeration = "interrupt_request::InterruptType", tag = "4")] + pub interrupt_type: i32, + #[prost(oneof = "interrupt_request::Interrupt", tags = "5, 6")] + pub interrupt: ::core::option::Option, +} +/// Nested message and enum types in `InterruptRequest` . +pub mod interrupt_request { + #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] + #[repr(i32)] + pub enum InterruptType { + Unspecified = 0, + /// Interrupt all running executions within the session with the provided session_id. + All = 1, + /// Interrupt all running executions within the session with the provided operation_tag. + Tag = 2, + /// Interrupt the running execution within the session with the provided operation_id. + OperationId = 3, + } + impl InterruptType { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Self::Unspecified => "INTERRUPT_TYPE_UNSPECIFIED", + Self::All => "INTERRUPT_TYPE_ALL", + Self::Tag => "INTERRUPT_TYPE_TAG", + Self::OperationId => "INTERRUPT_TYPE_OPERATION_ID", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "INTERRUPT_TYPE_UNSPECIFIED" => Some(Self::Unspecified), + "INTERRUPT_TYPE_ALL" => Some(Self::All), + "INTERRUPT_TYPE_TAG" => Some(Self::Tag), + "INTERRUPT_TYPE_OPERATION_ID" => Some(Self::OperationId), + _ => None, + } + } + } + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Interrupt { + /// if interrupt_tag == INTERRUPT_TYPE_TAG, interrupt operation with this tag. + #[prost(string, tag = "5")] + OperationTag(::prost::alloc::string::String), + /// if interrupt_tag == INTERRUPT_TYPE_OPERATION_ID, interrupt operation with this operation_id. + #[prost(string, tag = "6")] + OperationId(::prost::alloc::string::String), + } +} +/// Next ID: 4 +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct InterruptResponse { + /// Session id in which the interrupt was running. + #[prost(string, tag = "1")] + pub session_id: ::prost::alloc::string::String, + /// Server-side generated idempotency key that the client can use to assert that the server side + /// session has not changed. + #[prost(string, tag = "3")] + pub server_side_session_id: ::prost::alloc::string::String, + /// Operation ids of the executions which were interrupted. + #[prost(string, repeated, tag = "2")] + pub interrupted_ids: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, +} +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct ReattachOptions { + /// If true, the request can be reattached to using ReattachExecute. + /// ReattachExecute can be used either if the stream broke with a GRPC network error, + /// or if the server closed the stream without sending a response with StreamStatus.complete=true. + /// The server will keep a buffer of responses in case a response is lost, and + /// ReattachExecute needs to back-track. + /// + /// If false, the execution response stream will will not be reattachable, and all responses are + /// immediately released by the server after being sent. + #[prost(bool, tag = "1")] + pub reattachable: bool, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ReattachExecuteRequest { + /// (Required) + /// + /// The session_id of the request to reattach to. + /// This must be an id of existing session. + #[prost(string, tag = "1")] + pub session_id: ::prost::alloc::string::String, + /// (Optional) + /// + /// Server-side generated idempotency key from the previous responses (if any). Server + /// can use this to validate that the server side session has not changed. + #[prost(string, optional, tag = "6")] + pub client_observed_server_side_session_id: + ::core::option::Option<::prost::alloc::string::String>, + /// (Required) User context + /// + /// user_context.user_id and session+id both identify a unique remote spark session on the + /// server side. + #[prost(message, optional, tag = "2")] + pub user_context: ::core::option::Option, + /// (Required) + /// Provide an id of the request to reattach to. + /// This must be an id of existing operation. + #[prost(string, tag = "3")] + pub operation_id: ::prost::alloc::string::String, + /// Provides optional information about the client sending the request. This field + /// can be used for language or version specific information and is only intended for + /// logging purposes and will not be interpreted by the server. + #[prost(string, optional, tag = "4")] + pub client_type: ::core::option::Option<::prost::alloc::string::String>, + /// (Optional) + /// Last already processed response id from the response stream. + /// After reattach, server will resume the response stream after that response. + /// If not specified, server will restart the stream from the start. + /// + /// Note: server controls the amount of responses that it buffers and it may drop responses, + /// that are far behind the latest returned response, so this can't be used to arbitrarily + /// scroll back the cursor. If the response is no longer available, this will result in an error. + #[prost(string, optional, tag = "5")] + pub last_response_id: ::core::option::Option<::prost::alloc::string::String>, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ReleaseExecuteRequest { + /// (Required) + /// + /// The session_id of the request to reattach to. + /// This must be an id of existing session. + #[prost(string, tag = "1")] + pub session_id: ::prost::alloc::string::String, + /// (Optional) + /// + /// Server-side generated idempotency key from the previous responses (if any). Server + /// can use this to validate that the server side session has not changed. + #[prost(string, optional, tag = "7")] + pub client_observed_server_side_session_id: + ::core::option::Option<::prost::alloc::string::String>, + /// (Required) User context + /// + /// user_context.user_id and session+id both identify a unique remote spark session on the + /// server side. + #[prost(message, optional, tag = "2")] + pub user_context: ::core::option::Option, + /// (Required) + /// Provide an id of the request to reattach to. + /// This must be an id of existing operation. + #[prost(string, tag = "3")] + pub operation_id: ::prost::alloc::string::String, + /// Provides optional information about the client sending the request. This field + /// can be used for language or version specific information and is only intended for + /// logging purposes and will not be interpreted by the server. + #[prost(string, optional, tag = "4")] + pub client_type: ::core::option::Option<::prost::alloc::string::String>, + #[prost(oneof = "release_execute_request::Release", tags = "5, 6")] + pub release: ::core::option::Option, +} +/// Nested message and enum types in `ReleaseExecuteRequest` . +pub mod release_execute_request { + /// Release and close operation completely. + /// This will also interrupt the query if it is running execution, and wait for it to be torn down. + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct ReleaseAll {} + /// Release all responses from the operation response stream up to and including + /// the response with the given by response_id. + /// While server determines by itself how much of a buffer of responses to keep, client providing + /// explicit release calls will help reduce resource consumption. + /// Noop if response_id not found in cached responses. + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct ReleaseUntil { + #[prost(string, tag = "1")] + pub response_id: ::prost::alloc::string::String, + } + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Release { + #[prost(message, tag = "5")] + ReleaseAll(ReleaseAll), + #[prost(message, tag = "6")] + ReleaseUntil(ReleaseUntil), + } +} +/// Next ID: 4 +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ReleaseExecuteResponse { + /// Session id in which the release was running. + #[prost(string, tag = "1")] + pub session_id: ::prost::alloc::string::String, + /// Server-side generated idempotency key that the client can use to assert that the server side + /// session has not changed. + #[prost(string, tag = "3")] + pub server_side_session_id: ::prost::alloc::string::String, + /// Operation id of the operation on which the release executed. + /// If the operation couldn't be found (because e.g. it was concurrently released), will be unset. + /// Otherwise, it will be equal to the operation_id from request. + #[prost(string, optional, tag = "2")] + pub operation_id: ::core::option::Option<::prost::alloc::string::String>, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ReleaseSessionRequest { + /// (Required) + /// + /// The session_id of the request to reattach to. + /// This must be an id of existing session. + #[prost(string, tag = "1")] + pub session_id: ::prost::alloc::string::String, + /// (Required) User context + /// + /// user_context.user_id and session+id both identify a unique remote spark session on the + /// server side. + #[prost(message, optional, tag = "2")] + pub user_context: ::core::option::Option, + /// Provides optional information about the client sending the request. This field + /// can be used for language or version specific information and is only intended for + /// logging purposes and will not be interpreted by the server. + #[prost(string, optional, tag = "3")] + pub client_type: ::core::option::Option<::prost::alloc::string::String>, +} +/// Next ID: 3 +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ReleaseSessionResponse { + /// Session id of the session on which the release executed. + #[prost(string, tag = "1")] + pub session_id: ::prost::alloc::string::String, + /// Server-side generated idempotency key that the client can use to assert that the server side + /// session has not changed. + #[prost(string, tag = "2")] + pub server_side_session_id: ::prost::alloc::string::String, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct FetchErrorDetailsRequest { + /// (Required) + /// The session_id specifies a Spark session for a user identified by user_context.user_id. + /// The id should be a UUID string of the format `00112233-4455-6677-8899-aabbccddeeff` . + #[prost(string, tag = "1")] + pub session_id: ::prost::alloc::string::String, + /// (Optional) + /// + /// Server-side generated idempotency key from the previous responses (if any). Server + /// can use this to validate that the server side session has not changed. + #[prost(string, optional, tag = "5")] + pub client_observed_server_side_session_id: + ::core::option::Option<::prost::alloc::string::String>, + /// User context + #[prost(message, optional, tag = "2")] + pub user_context: ::core::option::Option, + /// (Required) + /// The id of the error. + #[prost(string, tag = "3")] + pub error_id: ::prost::alloc::string::String, + /// Provides optional information about the client sending the request. This field + /// can be used for language or version specific information and is only intended for + /// logging purposes and will not be interpreted by the server. + #[prost(string, optional, tag = "4")] + pub client_type: ::core::option::Option<::prost::alloc::string::String>, +} +/// Next ID: 5 +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct FetchErrorDetailsResponse { + /// Server-side generated idempotency key that the client can use to assert that the server side + /// session has not changed. + #[prost(string, tag = "3")] + pub server_side_session_id: ::prost::alloc::string::String, + #[prost(string, tag = "4")] + pub session_id: ::prost::alloc::string::String, + /// The index of the root error in errors. The field will not be set if the error is not found. + #[prost(int32, optional, tag = "1")] + pub root_error_idx: ::core::option::Option, + /// A list of errors. + #[prost(message, repeated, tag = "2")] + pub errors: ::prost::alloc::vec::Vec, +} +/// Nested message and enum types in `FetchErrorDetailsResponse` . +pub mod fetch_error_details_response { + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct StackTraceElement { + /// The fully qualified name of the class containing the execution point. + #[prost(string, tag = "1")] + pub declaring_class: ::prost::alloc::string::String, + /// The name of the method containing the execution point. + #[prost(string, tag = "2")] + pub method_name: ::prost::alloc::string::String, + /// The name of the file containing the execution point. + #[prost(string, optional, tag = "3")] + pub file_name: ::core::option::Option<::prost::alloc::string::String>, + /// The line number of the source line containing the execution point. + #[prost(int32, tag = "4")] + pub line_number: i32, + } + /// QueryContext defines the schema for the query context of a SparkThrowable. + /// It helps users understand where the error occurs while executing queries. + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct QueryContext { + #[prost(enumeration = "query_context::ContextType", tag = "10")] + pub context_type: i32, + /// The object type of the query which throws the exception. + /// If the exception is directly from the main query, it should be an empty string. + /// Otherwise, it should be the exact object type in upper case. For example, a "VIEW". + #[prost(string, tag = "1")] + pub object_type: ::prost::alloc::string::String, + /// The object name of the query which throws the exception. + /// If the exception is directly from the main query, it should be an empty string. + /// Otherwise, it should be the object name. For example, a view name "V1". + #[prost(string, tag = "2")] + pub object_name: ::prost::alloc::string::String, + /// The starting index in the query text which throws the exception. The index starts from 0. + #[prost(int32, tag = "3")] + pub start_index: i32, + /// The stopping index in the query which throws the exception. The index starts from 0. + #[prost(int32, tag = "4")] + pub stop_index: i32, + /// The corresponding fragment of the query which throws the exception. + #[prost(string, tag = "5")] + pub fragment: ::prost::alloc::string::String, + /// The user code (call site of the API) that caused throwing the exception. + #[prost(string, tag = "6")] + pub call_site: ::prost::alloc::string::String, + /// Summary of the exception cause. + #[prost(string, tag = "7")] + pub summary: ::prost::alloc::string::String, + } + /// Nested message and enum types in `QueryContext` . + pub mod query_context { + /// The type of this query context. + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum ContextType { + Sql = 0, + Dataframe = 1, + } + impl ContextType { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Self::Sql => "SQL", + Self::Dataframe => "DATAFRAME", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "SQL" => Some(Self::Sql), + "DATAFRAME" => Some(Self::Dataframe), + _ => None, + } + } + } + } + /// SparkThrowable defines the schema for SparkThrowable exceptions. + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SparkThrowable { + /// Succinct, human-readable, unique, and consistent representation of the error category. + #[prost(string, optional, tag = "1")] + pub error_class: ::core::option::Option<::prost::alloc::string::String>, + /// The message parameters for the error framework. + #[prost(map = "string, string", tag = "2")] + pub message_parameters: ::std::collections::HashMap< + ::prost::alloc::string::String, + ::prost::alloc::string::String, + >, + /// The query context of a SparkThrowable. + #[prost(message, repeated, tag = "3")] + pub query_contexts: ::prost::alloc::vec::Vec, + /// Portable error identifier across SQL engines + /// If null, error class or SQLSTATE is not set. + #[prost(string, optional, tag = "4")] + pub sql_state: ::core::option::Option<::prost::alloc::string::String>, + } + /// Error defines the schema for the representing exception. + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Error { + /// The fully qualified names of the exception class and its parent classes. + #[prost(string, repeated, tag = "1")] + pub error_type_hierarchy: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// The detailed message of the exception. + #[prost(string, tag = "2")] + pub message: ::prost::alloc::string::String, + /// The stackTrace of the exception. It will be set + /// if the SQLConf spark.sql.connect.serverStacktrace.enabled is true. + #[prost(message, repeated, tag = "3")] + pub stack_trace: ::prost::alloc::vec::Vec, + /// The index of the cause error in errors. + #[prost(int32, optional, tag = "4")] + pub cause_idx: ::core::option::Option, + /// The structured data of a SparkThrowable exception. + #[prost(message, optional, tag = "5")] + pub spark_throwable: ::core::option::Option, + } +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct CheckpointCommandResult { + /// (Required) The logical plan checkpointed. + #[prost(message, optional, tag = "1")] + pub relation: ::core::option::Option, +} +/// Generated client implementations. +pub mod spark_connect_service_client { + #![allow( + unused_variables, + dead_code, + missing_docs, + clippy::wildcard_imports, + clippy::let_unit_value + )] + use tonic::codegen::{http::Uri, *}; + /// Main interface for the SparkConnect service. + #[derive(Debug, Clone)] + pub struct SparkConnectServiceClient { + inner: tonic::client::Grpc, + } + impl SparkConnectServiceClient { + /// Attempt to create a new client by connecting to a given endpoint. + pub async fn connect(dst: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; + Ok(Self::new(conn)) + } + } + impl SparkConnectServiceClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + std::marker::Send + 'static, + ::Error: Into + std::marker::Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> SparkConnectServiceClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + >>::Error: + Into + std::marker::Send + std::marker::Sync, + { + SparkConnectServiceClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond with an + /// error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + /// Executes a request that contains the query and returns a stream of [ [ Response ] ]. + /// + /// It is guaranteed that there is at least one ARROW batch returned even if the result set is empty. + pub async fn execute_plan( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response>, + tonic::Status, + > { + self.inner.ready().await.map_err(|e| { + tonic::Status::unknown(::alloc::__export::must_use({ + let res = ::alloc::fmt::format(::alloc::__export::format_args!( + "Service was not ready: {}", + e.into() + )); + res + })) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/spark.connect.SparkConnectService/ExecutePlan", + ); + let mut req = request.into_request(); + req.extensions_mut().insert(GrpcMethod::new( + "spark.connect.SparkConnectService", + "ExecutePlan", + )); + self.inner.server_streaming(req, path, codec).await + } + /// Analyzes a query and returns a [ [ AnalyzeResponse ] ] containing metadata about the query. + pub async fn analyze_plan( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result, tonic::Status> + { + self.inner.ready().await.map_err(|e| { + tonic::Status::unknown(::alloc::__export::must_use({ + let res = ::alloc::fmt::format(::alloc::__export::format_args!( + "Service was not ready: {}", + e.into() + )); + res + })) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/spark.connect.SparkConnectService/AnalyzePlan", + ); + let mut req = request.into_request(); + req.extensions_mut().insert(GrpcMethod::new( + "spark.connect.SparkConnectService", + "AnalyzePlan", + )); + self.inner.unary(req, path, codec).await + } + /// Update or fetch the configurations and returns a [ [ ConfigResponse ] ] containing the result. + pub async fn config( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result, tonic::Status> { + self.inner.ready().await.map_err(|e| { + tonic::Status::unknown(::alloc::__export::must_use({ + let res = ::alloc::fmt::format(::alloc::__export::format_args!( + "Service was not ready: {}", + e.into() + )); + res + })) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = + http::uri::PathAndQuery::from_static("/spark.connect.SparkConnectService/Config"); + let mut req = request.into_request(); + req.extensions_mut().insert(GrpcMethod::new( + "spark.connect.SparkConnectService", + "Config", + )); + self.inner.unary(req, path, codec).await + } + /// Add artifacts to the session and returns a [ [ AddArtifactsResponse ] ] containing metadata about + /// the added artifacts. + pub async fn add_artifacts( + &mut self, + request: impl tonic::IntoStreamingRequest, + ) -> std::result::Result, tonic::Status> + { + self.inner.ready().await.map_err(|e| { + tonic::Status::unknown(::alloc::__export::must_use({ + let res = ::alloc::fmt::format(::alloc::__export::format_args!( + "Service was not ready: {}", + e.into() + )); + res + })) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/spark.connect.SparkConnectService/AddArtifacts", + ); + let mut req = request.into_streaming_request(); + req.extensions_mut().insert(GrpcMethod::new( + "spark.connect.SparkConnectService", + "AddArtifacts", + )); + self.inner.client_streaming(req, path, codec).await + } + /// Check statuses of artifacts in the session and returns them in a [ [ ArtifactStatusesResponse ] ] + pub async fn artifact_status( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result, tonic::Status> + { + self.inner.ready().await.map_err(|e| { + tonic::Status::unknown(::alloc::__export::must_use({ + let res = ::alloc::fmt::format(::alloc::__export::format_args!( + "Service was not ready: {}", + e.into() + )); + res + })) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/spark.connect.SparkConnectService/ArtifactStatus", + ); + let mut req = request.into_request(); + req.extensions_mut().insert(GrpcMethod::new( + "spark.connect.SparkConnectService", + "ArtifactStatus", + )); + self.inner.unary(req, path, codec).await + } + /// Interrupts running executions + pub async fn interrupt( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result, tonic::Status> { + self.inner.ready().await.map_err(|e| { + tonic::Status::unknown(::alloc::__export::must_use({ + let res = ::alloc::fmt::format(::alloc::__export::format_args!( + "Service was not ready: {}", + e.into() + )); + res + })) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/spark.connect.SparkConnectService/Interrupt", + ); + let mut req = request.into_request(); + req.extensions_mut().insert(GrpcMethod::new( + "spark.connect.SparkConnectService", + "Interrupt", + )); + self.inner.unary(req, path, codec).await + } + /// Reattach to an existing reattachable execution. + /// The ExecutePlan must have been started with ReattachOptions.reattachable=true. + /// If the ExecutePlanResponse stream ends without a ResultComplete message, there is more to + /// continue. If there is a ResultComplete, the client should use ReleaseExecute with + pub async fn reattach_execute( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response>, + tonic::Status, + > { + self.inner.ready().await.map_err(|e| { + tonic::Status::unknown(::alloc::__export::must_use({ + let res = ::alloc::fmt::format(::alloc::__export::format_args!( + "Service was not ready: {}", + e.into() + )); + res + })) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/spark.connect.SparkConnectService/ReattachExecute", + ); + let mut req = request.into_request(); + req.extensions_mut().insert(GrpcMethod::new( + "spark.connect.SparkConnectService", + "ReattachExecute", + )); + self.inner.server_streaming(req, path, codec).await + } + /// Release an reattachable execution, or parts thereof. + /// The ExecutePlan must have been started with ReattachOptions.reattachable=true. + /// Non reattachable executions are released automatically and immediately after the ExecutePlan + /// RPC and ReleaseExecute may not be used. + pub async fn release_execute( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result, tonic::Status> + { + self.inner.ready().await.map_err(|e| { + tonic::Status::unknown(::alloc::__export::must_use({ + let res = ::alloc::fmt::format(::alloc::__export::format_args!( + "Service was not ready: {}", + e.into() + )); + res + })) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/spark.connect.SparkConnectService/ReleaseExecute", + ); + let mut req = request.into_request(); + req.extensions_mut().insert(GrpcMethod::new( + "spark.connect.SparkConnectService", + "ReleaseExecute", + )); + self.inner.unary(req, path, codec).await + } + /// Release a session. + /// All the executions in the session will be released. Any further requests for the session with + /// that session_id for the given user_id will fail. If the session didn't exist or was already + /// released, this is a noop. + pub async fn release_session( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result, tonic::Status> + { + self.inner.ready().await.map_err(|e| { + tonic::Status::unknown(::alloc::__export::must_use({ + let res = ::alloc::fmt::format(::alloc::__export::format_args!( + "Service was not ready: {}", + e.into() + )); + res + })) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/spark.connect.SparkConnectService/ReleaseSession", + ); + let mut req = request.into_request(); + req.extensions_mut().insert(GrpcMethod::new( + "spark.connect.SparkConnectService", + "ReleaseSession", + )); + self.inner.unary(req, path, codec).await + } + /// FetchErrorDetails retrieves the matched exception with details based on a provided error id. + pub async fn fetch_error_details( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result, tonic::Status> + { + self.inner.ready().await.map_err(|e| { + tonic::Status::unknown(::alloc::__export::must_use({ + let res = ::alloc::fmt::format(::alloc::__export::format_args!( + "Service was not ready: {}", + e.into() + )); + res + })) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/spark.connect.SparkConnectService/FetchErrorDetails", + ); + let mut req = request.into_request(); + req.extensions_mut().insert(GrpcMethod::new( + "spark.connect.SparkConnectService", + "FetchErrorDetails", + )); + self.inner.unary(req, path, codec).await + } + } +} +/// Generated server implementations. +pub mod spark_connect_service_server { + #![allow( + unused_variables, + dead_code, + missing_docs, + clippy::wildcard_imports, + clippy::let_unit_value + )] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with SparkConnectServiceServer. + #[async_trait] + pub trait SparkConnectService: std::marker::Send + std::marker::Sync + 'static { + /// Server streaming response type for the ExecutePlan method. + type ExecutePlanStream: tonic::codegen::tokio_stream::Stream< + Item = std::result::Result, + > + std::marker::Send + + 'static; + /// Executes a request that contains the query and returns a stream of [ [ Response ] ]. + /// + /// It is guaranteed that there is at least one ARROW batch returned even if the result set is empty. + async fn execute_plan( + &self, + request: tonic::Request, + ) -> std::result::Result, tonic::Status>; + /// Analyzes a query and returns a [ [ AnalyzeResponse ] ] containing metadata about the query. + async fn analyze_plan( + &self, + request: tonic::Request, + ) -> std::result::Result, tonic::Status>; + /// Update or fetch the configurations and returns a [ [ ConfigResponse ] ] containing the result. + async fn config( + &self, + request: tonic::Request, + ) -> std::result::Result, tonic::Status>; + /// Add artifacts to the session and returns a [ [ AddArtifactsResponse ] ] containing metadata about + /// the added artifacts. + async fn add_artifacts( + &self, + request: tonic::Request>, + ) -> std::result::Result, tonic::Status>; + /// Check statuses of artifacts in the session and returns them in a [ [ ArtifactStatusesResponse ] ] + async fn artifact_status( + &self, + request: tonic::Request, + ) -> std::result::Result, tonic::Status>; + /// Interrupts running executions + async fn interrupt( + &self, + request: tonic::Request, + ) -> std::result::Result, tonic::Status>; + /// Server streaming response type for the ReattachExecute method. + type ReattachExecuteStream: tonic::codegen::tokio_stream::Stream< + Item = std::result::Result, + > + std::marker::Send + + 'static; + /// Reattach to an existing reattachable execution. + /// The ExecutePlan must have been started with ReattachOptions.reattachable=true. + /// If the ExecutePlanResponse stream ends without a ResultComplete message, there is more to + /// continue. If there is a ResultComplete, the client should use ReleaseExecute with + async fn reattach_execute( + &self, + request: tonic::Request, + ) -> std::result::Result, tonic::Status>; + /// Release an reattachable execution, or parts thereof. + /// The ExecutePlan must have been started with ReattachOptions.reattachable=true. + /// Non reattachable executions are released automatically and immediately after the ExecutePlan + /// RPC and ReleaseExecute may not be used. + async fn release_execute( + &self, + request: tonic::Request, + ) -> std::result::Result, tonic::Status>; + /// Release a session. + /// All the executions in the session will be released. Any further requests for the session with + /// that session_id for the given user_id will fail. If the session didn't exist or was already + /// released, this is a noop. + async fn release_session( + &self, + request: tonic::Request, + ) -> std::result::Result, tonic::Status>; + /// FetchErrorDetails retrieves the matched exception with details based on a provided error id. + async fn fetch_error_details( + &self, + request: tonic::Request, + ) -> std::result::Result, tonic::Status>; + } + /// Main interface for the SparkConnect service. + #[derive(Debug)] + pub struct SparkConnectServiceServer { + inner: Arc, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + impl SparkConnectServiceServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor(inner: T, interceptor: F) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for SparkConnectServiceServer + where + T: SparkConnectService, + B: Body + std::marker::Send + 'static, + B::Error: Into + std::marker::Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + match req.uri().path() { + "/spark.connect.SparkConnectService/ExecutePlan" => { + #[allow(non_camel_case_types)] + struct ExecutePlanSvc(pub Arc); + impl + tonic::server::ServerStreamingService + for ExecutePlanSvc + { + type Response = super::ExecutePlanResponse; + type ResponseStream = T::ExecutePlanStream; + type Future = + BoxFuture, tonic::Status>; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::execute_plan(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = ExecutePlanSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.server_streaming(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/spark.connect.SparkConnectService/AnalyzePlan" => { + #[allow(non_camel_case_types)] + struct AnalyzePlanSvc(pub Arc); + impl + tonic::server::UnaryService + for AnalyzePlanSvc + { + type Response = super::AnalyzePlanResponse; + type Future = BoxFuture, tonic::Status>; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::analyze_plan(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = AnalyzePlanSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/spark.connect.SparkConnectService/Config" => { + #[allow(non_camel_case_types)] + struct ConfigSvc(pub Arc); + impl tonic::server::UnaryService for ConfigSvc { + type Response = super::ConfigResponse; + type Future = BoxFuture, tonic::Status>; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::config(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = ConfigSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/spark.connect.SparkConnectService/AddArtifacts" => { + #[allow(non_camel_case_types)] + struct AddArtifactsSvc(pub Arc); + impl + tonic::server::ClientStreamingService + for AddArtifactsSvc + { + type Response = super::AddArtifactsResponse; + type Future = BoxFuture, tonic::Status>; + fn call( + &mut self, + request: tonic::Request>, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::add_artifacts(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = AddArtifactsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.client_streaming(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/spark.connect.SparkConnectService/ArtifactStatus" => { + #[allow(non_camel_case_types)] + struct ArtifactStatusSvc(pub Arc); + impl + tonic::server::UnaryService + for ArtifactStatusSvc + { + type Response = super::ArtifactStatusesResponse; + type Future = BoxFuture, tonic::Status>; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::artifact_status(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = ArtifactStatusSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/spark.connect.SparkConnectService/Interrupt" => { + #[allow(non_camel_case_types)] + struct InterruptSvc(pub Arc); + impl + tonic::server::UnaryService for InterruptSvc + { + type Response = super::InterruptResponse; + type Future = BoxFuture, tonic::Status>; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::interrupt(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = InterruptSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/spark.connect.SparkConnectService/ReattachExecute" => { + #[allow(non_camel_case_types)] + struct ReattachExecuteSvc(pub Arc); + impl + tonic::server::ServerStreamingService + for ReattachExecuteSvc + { + type Response = super::ExecutePlanResponse; + type ResponseStream = T::ReattachExecuteStream; + type Future = + BoxFuture, tonic::Status>; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::reattach_execute(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = ReattachExecuteSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.server_streaming(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/spark.connect.SparkConnectService/ReleaseExecute" => { + #[allow(non_camel_case_types)] + struct ReleaseExecuteSvc(pub Arc); + impl + tonic::server::UnaryService + for ReleaseExecuteSvc + { + type Response = super::ReleaseExecuteResponse; + type Future = BoxFuture, tonic::Status>; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::release_execute(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = ReleaseExecuteSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/spark.connect.SparkConnectService/ReleaseSession" => { + #[allow(non_camel_case_types)] + struct ReleaseSessionSvc(pub Arc); + impl + tonic::server::UnaryService + for ReleaseSessionSvc + { + type Response = super::ReleaseSessionResponse; + type Future = BoxFuture, tonic::Status>; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::release_session(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = ReleaseSessionSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/spark.connect.SparkConnectService/FetchErrorDetails" => { + #[allow(non_camel_case_types)] + struct FetchErrorDetailsSvc(pub Arc); + impl + tonic::server::UnaryService + for FetchErrorDetailsSvc + { + type Response = super::FetchErrorDetailsResponse; + type Future = BoxFuture, tonic::Status>; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::fetch_error_details(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = FetchErrorDetailsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => Box::pin(async move { + let mut response = http::Response::new(empty_body()); + let headers = response.headers_mut(); + headers.insert( + tonic::Status::GRPC_STATUS, + (tonic::Code::Unimplemented as i32).into(), + ); + headers.insert( + http::header::CONTENT_TYPE, + tonic::metadata::GRPC_CONTENT_TYPE, + ); + Ok(response) + }), + } + } + } + impl Clone for SparkConnectServiceServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + /// Generated gRPC service name + pub const SERVICE_NAME: &str = "spark.connect.SparkConnectService"; + impl tonic::server::NamedService for SparkConnectServiceServer { + const NAME: &'static str = SERVICE_NAME; + } +} diff --git a/tests/connect/__init__.py b/tests/connect/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/connect/test_connect.py b/tests/connect/test_connect.py new file mode 100644 index 0000000000..dc2b328c9e --- /dev/null +++ b/tests/connect/test_connect.py @@ -0,0 +1,125 @@ +# def test_apply_lambda +# def test_apply_module_func +# def test_apply_inline_func +# def test_apply_lambda_pyobj + +from __future__ import annotations + +import time + +from pyspark.sql import SparkSession +from pyspark.sql.dataframe import DataFrame +from pyspark.sql.functions import col + +from daft.daft import connect_start + + +def test_abc(): + connect_start() + + # Create a Spark session using Spark Connect + spark: SparkSession = ( + SparkSession.builder.appName("SparkConnectExample").remote("sc://localhost:50051").getOrCreate() + ) + print("Spark session created") + + # Read the Parquet file back into a DataFrame + df: DataFrame = spark.read.parquet("/Users/andrewgazelka/Projects/simple-spark-connect/increasing_id_data.parquet") + print("DataFrame read from Parquet file") + # The DataFrame remains unchanged: + # +---+ + # | id| + # +---+ + # | 0| + # | 1| + # | 2| + # | 3| + # | 4| + # +---+ + + print("DataFrame schema:") + df.printSchema() + # root + # |-- id: long (nullable = false) + + print("\nDataFrame content:") + df.show() + + print("done showing") + + # Perform operations on the DataFrame + # 1. filter(col("id") > 2): Select only rows where 'id' is greater than 2 + # 2. withColumn("id2", col("id") + 2): Add a new column 'id2' that is 'id' plus 2 + result: DataFrame = df.filter(col("id") > 2).withColumn("id2", col("id") + 2) + + print("\nFiltered and transformed DataFrame:") + result.show() + + # result_pandas = result.toPandas() + # The resulting DataFrame looks like this: + # +---+---+ + # | id|id2| + # +---+---+ + # | 3| 5| + # | 4| 6| + # +---+---+ + # Explanation: + # 1. Only rows with id > 2 are kept (3 and 4) + # 2. A new column 'id2' is added with values id + 2 + + # Stop the Spark session + # spark.sql("select * from increasing_id_data").show() + + spark.stop() + print("Spark session stopped") + + # Waiting for 10 seconds + time.sleep(2) + + print("End of main function") + + +# from daft. +# +# +# def add_1(x): +# return x + 1 +# +# +# def test_apply_module_func(): +# df = daft.from_pydict({"a": [1, 2, 3]}) +# df = df.with_column("a_plus_1", df["a"].apply(add_1, return_dtype=DataType.int32())) +# assert df.to_pydict() == {"a": [1, 2, 3], "a_plus_1": [2, 3, 4]} +# +# +# def test_apply_lambda(): +# df = daft.from_pydict({"a": [1, 2, 3]}) +# df = df.with_column("a_plus_1", df["a"].apply(lambda x: x + 1, return_dtype=DataType.int32())) +# assert df.to_pydict() == {"a": [1, 2, 3], "a_plus_1": [2, 3, 4]} +# +# +# def test_apply_inline_func(): +# def inline_add_1(x): +# return x + 1 +# +# df = daft.from_pydict({"a": [1, 2, 3]}) +# df = df.with_column("a_plus_1", df["a"].apply(inline_add_1, return_dtype=DataType.int32())) +# assert df.to_pydict() == {"a": [1, 2, 3], "a_plus_1": [2, 3, 4]} +# +# +# @dataclasses.dataclass +# class MyObj: +# x: int +# +# +# def test_apply_obj(): +# df = daft.from_pydict({"obj": [MyObj(x=0), MyObj(x=0), MyObj(x=0)]}) +# +# def inline_mutate_obj(obj): +# obj.x = 1 +# return obj +# +# df = df.with_column("mut_obj", df["obj"].apply(inline_mutate_obj, return_dtype=DataType.python())) +# result = df.to_pydict() +# for mut_obj in result["mut_obj"]: +# assert mut_obj.x == 1 diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000000..48e1273e59 --- /dev/null +++ b/uv.lock @@ -0,0 +1,1815 @@ +version = 1 +requires-python = ">=3.8" +resolution-markers = [ + "python_full_version < '3.10' and platform_system != 'Windows'", + "python_full_version == '3.10.*' and platform_system != 'Windows'", + "python_full_version >= '3.11' and python_full_version < '3.13' and platform_system != 'Windows'", + "python_full_version >= '3.13' and platform_system != 'Windows'", + "python_full_version < '3.10' and platform_system == 'Windows'", + "python_full_version == '3.10.*' and platform_system == 'Windows'", + "python_full_version >= '3.11' and python_full_version < '3.13' and platform_system == 'Windows'", + "python_full_version >= '3.13' and platform_system == 'Windows'", +] + +[[package]] +name = "aiosignal" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/67/0952ed97a9793b4958e5736f6d2b346b414a2cd63e82d05940032f45b32f/aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc", size = 19422 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/ac/a7305707cb852b7e16ff80eaf5692309bde30e2b1100a1fcacdc8f731d97/aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17", size = 7617 }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, +] + +[[package]] +name = "anyio" +version = "4.5.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "idna" }, + { name = "sniffio" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4d/f9/9a7ce600ebe7804daf90d4d48b1c0510a4561ddce43a596be46676f82343/anyio-4.5.2.tar.gz", hash = "sha256:23009af4ed04ce05991845451e11ef02fc7c5ed29179ac9a420e5ad0ac7ddc5b", size = 171293 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/b4/f7e396030e3b11394436358ca258a81d6010106582422f23443c16ca1873/anyio-4.5.2-py3-none-any.whl", hash = "sha256:c011ee36bc1e8ba40e5a81cb9df91925c218fe9b778554e0b56a21e1b5d4716f", size = 89766 }, +] + +[[package]] +name = "attrs" +version = "24.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/0f/aafca9af9315aee06a89ffde799a10a582fe8de76c563ee80bbcdc08b3fb/attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346", size = 792678 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2", size = 63001 }, +] + +[[package]] +name = "boto3" +version = "1.35.42" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "botocore" }, + { name = "jmespath" }, + { name = "s3transfer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/e4/a60d99f727766d9801f4e14dca7e2df0245831844411562d81e0df2cc179/boto3-1.35.42.tar.gz", hash = "sha256:a5b00f8b82dce62870759f04861747944da834d64a64355970120c475efdafc0", size = 111011 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/7c/88d9031a7a409393da450bcfca2f3597e0afccac4cae2d97fc4e7190f012/boto3-1.35.42-py3-none-any.whl", hash = "sha256:e1f36f8be453505cebcc3da178ea081b2a06c0e5e1cdee774f1067599b8d9c3e", size = 139159 }, +] + +[[package]] +name = "botocore" +version = "1.35.42" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jmespath" }, + { name = "python-dateutil" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d3/0c/2bcd566397ab06661b222b9b5156ba0c40d5a97d3727c88ccaefea275cb4/botocore-1.35.42.tar.gz", hash = "sha256:af348636f73dc24b7e2dc760a34d08c8f2f94366e9b4c78d877307b128abecef", size = 12835012 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/f5/0e67c7e6a7f5f8c068cf444dc25d03097a22428380587542978d7ad9d86a/botocore-1.35.42-py3-none-any.whl", hash = "sha256:05af0bb8b9cea7ce7bc589c332348d338a21b784e9d088a588fd10ec145007ff", size = 12621471 }, +] + +[[package]] +name = "cachetools" +version = "5.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/38/a0f315319737ecf45b4319a8cd1f3a908e29d9277b46942263292115eee7/cachetools-5.5.0.tar.gz", hash = "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a", size = 27661 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/07/14f8ad37f2d12a5ce41206c21820d8cb6561b728e51fad4530dff0552a67/cachetools-5.5.0-py3-none-any.whl", hash = "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292", size = 9524 }, +] + +[[package]] +name = "certifi" +version = "2024.8.30" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/ee/9b19140fe824b367c04c5e1b369942dd754c4c5462d5674002f75c4dedc1/certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9", size = 168507 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", size = 167321 }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/4f/e1808dc01273379acc506d18f1504eb2d299bd4131743b9fc54d7be4df1e/charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", size = 106620 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/8b/825cc84cf13a28bfbcba7c416ec22bf85a9584971be15b21dd8300c65b7f/charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6", size = 196363 }, + { url = "https://files.pythonhosted.org/packages/23/81/d7eef6a99e42c77f444fdd7bc894b0ceca6c3a95c51239e74a722039521c/charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b", size = 125639 }, + { url = "https://files.pythonhosted.org/packages/21/67/b4564d81f48042f520c948abac7079356e94b30cb8ffb22e747532cf469d/charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99", size = 120451 }, + { url = "https://files.pythonhosted.org/packages/c2/72/12a7f0943dd71fb5b4e7b55c41327ac0a1663046a868ee4d0d8e9c369b85/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca", size = 140041 }, + { url = "https://files.pythonhosted.org/packages/67/56/fa28c2c3e31217c4c52158537a2cf5d98a6c1e89d31faf476c89391cd16b/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d", size = 150333 }, + { url = "https://files.pythonhosted.org/packages/f9/d2/466a9be1f32d89eb1554cf84073a5ed9262047acee1ab39cbaefc19635d2/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7", size = 142921 }, + { url = "https://files.pythonhosted.org/packages/f8/01/344ec40cf5d85c1da3c1f57566c59e0c9b56bcc5566c08804a95a6cc8257/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3", size = 144785 }, + { url = "https://files.pythonhosted.org/packages/73/8b/2102692cb6d7e9f03b9a33a710e0164cadfce312872e3efc7cfe22ed26b4/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907", size = 146631 }, + { url = "https://files.pythonhosted.org/packages/d8/96/cc2c1b5d994119ce9f088a9a0c3ebd489d360a2eb058e2c8049f27092847/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b", size = 140867 }, + { url = "https://files.pythonhosted.org/packages/c9/27/cde291783715b8ec30a61c810d0120411844bc4c23b50189b81188b273db/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912", size = 149273 }, + { url = "https://files.pythonhosted.org/packages/3a/a4/8633b0fc1a2d1834d5393dafecce4a1cc56727bfd82b4dc18fc92f0d3cc3/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95", size = 152437 }, + { url = "https://files.pythonhosted.org/packages/64/ea/69af161062166b5975ccbb0961fd2384853190c70786f288684490913bf5/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e", size = 150087 }, + { url = "https://files.pythonhosted.org/packages/3b/fd/e60a9d9fd967f4ad5a92810138192f825d77b4fa2a557990fd575a47695b/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe", size = 145142 }, + { url = "https://files.pythonhosted.org/packages/6d/02/8cb0988a1e49ac9ce2eed1e07b77ff118f2923e9ebd0ede41ba85f2dcb04/charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc", size = 94701 }, + { url = "https://files.pythonhosted.org/packages/d6/20/f1d4670a8a723c46be695dff449d86d6092916f9e99c53051954ee33a1bc/charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749", size = 102191 }, + { url = "https://files.pythonhosted.org/packages/9c/61/73589dcc7a719582bf56aae309b6103d2762b526bffe189d635a7fcfd998/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", size = 193339 }, + { url = "https://files.pythonhosted.org/packages/77/d5/8c982d58144de49f59571f940e329ad6e8615e1e82ef84584c5eeb5e1d72/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", size = 124366 }, + { url = "https://files.pythonhosted.org/packages/bf/19/411a64f01ee971bed3231111b69eb56f9331a769072de479eae7de52296d/charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", size = 118874 }, + { url = "https://files.pythonhosted.org/packages/4c/92/97509850f0d00e9f14a46bc751daabd0ad7765cff29cdfb66c68b6dad57f/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", size = 138243 }, + { url = "https://files.pythonhosted.org/packages/e2/29/d227805bff72ed6d6cb1ce08eec707f7cfbd9868044893617eb331f16295/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", size = 148676 }, + { url = "https://files.pythonhosted.org/packages/13/bc/87c2c9f2c144bedfa62f894c3007cd4530ba4b5351acb10dc786428a50f0/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", size = 141289 }, + { url = "https://files.pythonhosted.org/packages/eb/5b/6f10bad0f6461fa272bfbbdf5d0023b5fb9bc6217c92bf068fa5a99820f5/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", size = 142585 }, + { url = "https://files.pythonhosted.org/packages/3b/a0/a68980ab8a1f45a36d9745d35049c1af57d27255eff8c907e3add84cf68f/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5", size = 144408 }, + { url = "https://files.pythonhosted.org/packages/d7/a1/493919799446464ed0299c8eef3c3fad0daf1c3cd48bff9263c731b0d9e2/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", size = 139076 }, + { url = "https://files.pythonhosted.org/packages/fb/9d/9c13753a5a6e0db4a0a6edb1cef7aee39859177b64e1a1e748a6e3ba62c2/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c", size = 146874 }, + { url = "https://files.pythonhosted.org/packages/75/d2/0ab54463d3410709c09266dfb416d032a08f97fd7d60e94b8c6ef54ae14b/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", size = 150871 }, + { url = "https://files.pythonhosted.org/packages/8d/c9/27e41d481557be53d51e60750b85aa40eaf52b841946b3cdeff363105737/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", size = 148546 }, + { url = "https://files.pythonhosted.org/packages/ee/44/4f62042ca8cdc0cabf87c0fc00ae27cd8b53ab68be3605ba6d071f742ad3/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", size = 143048 }, + { url = "https://files.pythonhosted.org/packages/01/f8/38842422988b795220eb8038745d27a675ce066e2ada79516c118f291f07/charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99", size = 94389 }, + { url = "https://files.pythonhosted.org/packages/0b/6e/b13bd47fa9023b3699e94abf565b5a2f0b0be6e9ddac9812182596ee62e4/charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", size = 101752 }, + { url = "https://files.pythonhosted.org/packages/d3/0b/4b7a70987abf9b8196845806198975b6aab4ce016632f817ad758a5aa056/charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6", size = 194445 }, + { url = "https://files.pythonhosted.org/packages/50/89/354cc56cf4dd2449715bc9a0f54f3aef3dc700d2d62d1fa5bbea53b13426/charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf", size = 125275 }, + { url = "https://files.pythonhosted.org/packages/fa/44/b730e2a2580110ced837ac083d8ad222343c96bb6b66e9e4e706e4d0b6df/charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db", size = 119020 }, + { url = "https://files.pythonhosted.org/packages/9d/e4/9263b8240ed9472a2ae7ddc3e516e71ef46617fe40eaa51221ccd4ad9a27/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1", size = 139128 }, + { url = "https://files.pythonhosted.org/packages/6b/e3/9f73e779315a54334240353eaea75854a9a690f3f580e4bd85d977cb2204/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03", size = 149277 }, + { url = "https://files.pythonhosted.org/packages/1a/cf/f1f50c2f295312edb8a548d3fa56a5c923b146cd3f24114d5adb7e7be558/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284", size = 142174 }, + { url = "https://files.pythonhosted.org/packages/16/92/92a76dc2ff3a12e69ba94e7e05168d37d0345fa08c87e1fe24d0c2a42223/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15", size = 143838 }, + { url = "https://files.pythonhosted.org/packages/a4/01/2117ff2b1dfc61695daf2babe4a874bca328489afa85952440b59819e9d7/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8", size = 146149 }, + { url = "https://files.pythonhosted.org/packages/f6/9b/93a332b8d25b347f6839ca0a61b7f0287b0930216994e8bf67a75d050255/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2", size = 140043 }, + { url = "https://files.pythonhosted.org/packages/ab/f6/7ac4a01adcdecbc7a7587767c776d53d369b8b971382b91211489535acf0/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719", size = 148229 }, + { url = "https://files.pythonhosted.org/packages/9d/be/5708ad18161dee7dc6a0f7e6cf3a88ea6279c3e8484844c0590e50e803ef/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631", size = 151556 }, + { url = "https://files.pythonhosted.org/packages/5a/bb/3d8bc22bacb9eb89785e83e6723f9888265f3a0de3b9ce724d66bd49884e/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b", size = 149772 }, + { url = "https://files.pythonhosted.org/packages/f7/fa/d3fc622de05a86f30beea5fc4e9ac46aead4731e73fd9055496732bcc0a4/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565", size = 144800 }, + { url = "https://files.pythonhosted.org/packages/9a/65/bdb9bc496d7d190d725e96816e20e2ae3a6fa42a5cac99c3c3d6ff884118/charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7", size = 94836 }, + { url = "https://files.pythonhosted.org/packages/3e/67/7b72b69d25b89c0b3cea583ee372c43aa24df15f0e0f8d3982c57804984b/charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9", size = 102187 }, + { url = "https://files.pythonhosted.org/packages/f3/89/68a4c86f1a0002810a27f12e9a7b22feb198c59b2f05231349fbce5c06f4/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", size = 194617 }, + { url = "https://files.pythonhosted.org/packages/4f/cd/8947fe425e2ab0aa57aceb7807af13a0e4162cd21eee42ef5b053447edf5/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", size = 125310 }, + { url = "https://files.pythonhosted.org/packages/5b/f0/b5263e8668a4ee9becc2b451ed909e9c27058337fda5b8c49588183c267a/charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", size = 119126 }, + { url = "https://files.pythonhosted.org/packages/ff/6e/e445afe4f7fda27a533f3234b627b3e515a1b9429bc981c9a5e2aa5d97b6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", size = 139342 }, + { url = "https://files.pythonhosted.org/packages/a1/b2/4af9993b532d93270538ad4926c8e37dc29f2111c36f9c629840c57cd9b3/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", size = 149383 }, + { url = "https://files.pythonhosted.org/packages/fb/6f/4e78c3b97686b871db9be6f31d64e9264e889f8c9d7ab33c771f847f79b7/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", size = 142214 }, + { url = "https://files.pythonhosted.org/packages/2b/c9/1c8fe3ce05d30c87eff498592c89015b19fade13df42850aafae09e94f35/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", size = 144104 }, + { url = "https://files.pythonhosted.org/packages/ee/68/efad5dcb306bf37db7db338338e7bb8ebd8cf38ee5bbd5ceaaaa46f257e6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", size = 146255 }, + { url = "https://files.pythonhosted.org/packages/0c/75/1ed813c3ffd200b1f3e71121c95da3f79e6d2a96120163443b3ad1057505/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", size = 140251 }, + { url = "https://files.pythonhosted.org/packages/7d/0d/6f32255c1979653b448d3c709583557a4d24ff97ac4f3a5be156b2e6a210/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", size = 148474 }, + { url = "https://files.pythonhosted.org/packages/ac/a0/c1b5298de4670d997101fef95b97ac440e8c8d8b4efa5a4d1ef44af82f0d/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", size = 151849 }, + { url = "https://files.pythonhosted.org/packages/04/4f/b3961ba0c664989ba63e30595a3ed0875d6790ff26671e2aae2fdc28a399/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", size = 149781 }, + { url = "https://files.pythonhosted.org/packages/d8/90/6af4cd042066a4adad58ae25648a12c09c879efa4849c705719ba1b23d8c/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482", size = 144970 }, + { url = "https://files.pythonhosted.org/packages/cc/67/e5e7e0cbfefc4ca79025238b43cdf8a2037854195b37d6417f3d0895c4c2/charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", size = 94973 }, + { url = "https://files.pythonhosted.org/packages/65/97/fc9bbc54ee13d33dc54a7fcf17b26368b18505500fc01e228c27b5222d80/charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", size = 102308 }, + { url = "https://files.pythonhosted.org/packages/86/f4/ccab93e631e7293cca82f9f7ba39783c967f823a0000df2d8dd743cad74f/charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578", size = 193961 }, + { url = "https://files.pythonhosted.org/packages/94/d4/2b21cb277bac9605026d2d91a4a8872bc82199ed11072d035dc674c27223/charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6", size = 124507 }, + { url = "https://files.pythonhosted.org/packages/9a/e0/a7c1fcdff20d9c667342e0391cfeb33ab01468d7d276b2c7914b371667cc/charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417", size = 119298 }, + { url = "https://files.pythonhosted.org/packages/70/de/1538bb2f84ac9940f7fa39945a5dd1d22b295a89c98240b262fc4b9fcfe0/charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51", size = 139328 }, + { url = "https://files.pythonhosted.org/packages/e9/ca/288bb1a6bc2b74fb3990bdc515012b47c4bc5925c8304fc915d03f94b027/charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41", size = 149368 }, + { url = "https://files.pythonhosted.org/packages/aa/75/58374fdaaf8406f373e508dab3486a31091f760f99f832d3951ee93313e8/charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f", size = 141944 }, + { url = "https://files.pythonhosted.org/packages/32/c8/0bc558f7260db6ffca991ed7166494a7da4fda5983ee0b0bfc8ed2ac6ff9/charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8", size = 143326 }, + { url = "https://files.pythonhosted.org/packages/0e/dd/7f6fec09a1686446cee713f38cf7d5e0669e0bcc8288c8e2924e998cf87d/charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab", size = 146171 }, + { url = "https://files.pythonhosted.org/packages/4c/a8/440f1926d6d8740c34d3ca388fbd718191ec97d3d457a0677eb3aa718fce/charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12", size = 139711 }, + { url = "https://files.pythonhosted.org/packages/e9/7f/4b71e350a3377ddd70b980bea1e2cc0983faf45ba43032b24b2578c14314/charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19", size = 148348 }, + { url = "https://files.pythonhosted.org/packages/1e/70/17b1b9202531a33ed7ef41885f0d2575ae42a1e330c67fddda5d99ad1208/charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea", size = 151290 }, + { url = "https://files.pythonhosted.org/packages/44/30/574b5b5933d77ecb015550aafe1c7d14a8cd41e7e6c4dcea5ae9e8d496c3/charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858", size = 149114 }, + { url = "https://files.pythonhosted.org/packages/0b/11/ca7786f7e13708687443082af20d8341c02e01024275a28bc75032c5ce5d/charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654", size = 143856 }, + { url = "https://files.pythonhosted.org/packages/f9/c2/1727c1438256c71ed32753b23ec2e6fe7b6dff66a598f6566cfe8139305e/charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613", size = 94333 }, + { url = "https://files.pythonhosted.org/packages/09/c8/0e17270496a05839f8b500c1166e3261d1226e39b698a735805ec206967b/charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade", size = 101454 }, + { url = "https://files.pythonhosted.org/packages/54/2f/28659eee7f5d003e0f5a3b572765bf76d6e0fe6601ab1f1b1dd4cba7e4f1/charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa", size = 196326 }, + { url = "https://files.pythonhosted.org/packages/d1/18/92869d5c0057baa973a3ee2af71573be7b084b3c3d428fe6463ce71167f8/charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a", size = 125614 }, + { url = "https://files.pythonhosted.org/packages/d6/27/327904c5a54a7796bb9f36810ec4173d2df5d88b401d2b95ef53111d214e/charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0", size = 120450 }, + { url = "https://files.pythonhosted.org/packages/a4/23/65af317914a0308495133b2d654cf67b11bbd6ca16637c4e8a38f80a5a69/charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a", size = 140135 }, + { url = "https://files.pythonhosted.org/packages/f2/41/6190102ad521a8aa888519bb014a74251ac4586cde9b38e790901684f9ab/charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242", size = 150413 }, + { url = "https://files.pythonhosted.org/packages/7b/ab/f47b0159a69eab9bd915591106859f49670c75f9a19082505ff16f50efc0/charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b", size = 142992 }, + { url = "https://files.pythonhosted.org/packages/28/89/60f51ad71f63aaaa7e51a2a2ad37919985a341a1d267070f212cdf6c2d22/charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62", size = 144871 }, + { url = "https://files.pythonhosted.org/packages/0c/48/0050550275fea585a6e24460b42465020b53375017d8596c96be57bfabca/charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0", size = 146756 }, + { url = "https://files.pythonhosted.org/packages/dc/b5/47f8ee91455946f745e6c9ddbb0f8f50314d2416dd922b213e7d5551ad09/charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd", size = 141034 }, + { url = "https://files.pythonhosted.org/packages/84/79/5c731059ebab43e80bf61fa51666b9b18167974b82004f18c76378ed31a3/charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be", size = 149434 }, + { url = "https://files.pythonhosted.org/packages/ca/f3/0719cd09fc4dc42066f239cb3c48ced17fc3316afca3e2a30a4756fe49ab/charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d", size = 152443 }, + { url = "https://files.pythonhosted.org/packages/f7/0e/c6357297f1157c8e8227ff337e93fd0a90e498e3d6ab96b2782204ecae48/charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3", size = 150294 }, + { url = "https://files.pythonhosted.org/packages/54/9a/acfa96dc4ea8c928040b15822b59d0863d6e1757fba8bd7de3dc4f761c13/charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742", size = 145314 }, + { url = "https://files.pythonhosted.org/packages/73/1c/b10a63032eaebb8d7bcb8544f12f063f41f5f463778ac61da15d9985e8b6/charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2", size = 94724 }, + { url = "https://files.pythonhosted.org/packages/c5/77/3a78bf28bfaa0863f9cfef278dbeadf55efe064eafff8c7c424ae3c4c1bf/charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca", size = 102159 }, + { url = "https://files.pythonhosted.org/packages/bf/9b/08c0432272d77b04803958a4598a51e2a4b51c06640af8b8f0f908c18bf2/charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", size = 49446 }, +] + +[[package]] +name = "click" +version = "8.1.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "platform_system == 'Windows'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de", size = 336121 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", size = 97941 }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, +] + +[[package]] +name = "connectorx" +version = "0.3.3" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/a7/dda511abdeb291b4ab56682323a70e2e125009055cf3791fa3b88e0fa96e/connectorx-0.3.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4c0e61e44a62eaee2ffe89bf938c7431b8f3d2d3ecdf09e8abb2d159f09138f0", size = 55474409 }, + { url = "https://files.pythonhosted.org/packages/fe/8e/f8df19b17056711f76ac17925fc8a452bd17e2e0d3121fd19b083ab12080/connectorx-0.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:da1970ec09ad7a65e25936a6d613f15ad2ce916f97f17c64180415dc58493881", size = 54469121 }, + { url = "https://files.pythonhosted.org/packages/4c/e9/9b59eabb83b5d4961a7941c465a877ff45aa993da5a968482ab827150d30/connectorx-0.3.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b43b0abcfb954c497981bcf8f2b5339dcf7986399a401b9470f0bf8055a58562", size = 60511112 }, + { url = "https://files.pythonhosted.org/packages/dc/5b/213fa316fee95d45ac696d7c9cf6cb19b9df1b80d37bb2fe4b8631670ea7/connectorx-0.3.3-cp310-none-win_amd64.whl", hash = "sha256:dff9e04396a76d3f2ca9ab1abed0df52497f19666b222c512d7b10f1699636c8", size = 53817256 }, + { url = "https://files.pythonhosted.org/packages/a8/8e/63f1c59682a225d2fe8716be44deae1ee3592933fbe191177c74ec33a6f5/connectorx-0.3.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d1d0cbb1b97643337fb7f3e30fa2b44f63d8629eadff55afffcdf10b2afeaf9c", size = 55471403 }, + { url = "https://files.pythonhosted.org/packages/80/f3/1ea88070047caa3998727caccba9a6721083d568222786133af677c987c0/connectorx-0.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4010b466cafd728ec80adf387e53cc10668e2bc1a8c52c42a0604bea5149c412", size = 54473785 }, + { url = "https://files.pythonhosted.org/packages/60/18/a9b0ff95e71a4dec33993cd8e2d821caae4ae25e55eaf3ac0a0d30aa8b48/connectorx-0.3.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:f430c359e7977818f90ac8cce3bb7ba340469dcabee13e4ac7926f80e34e8c4d", size = 60512358 }, + { url = "https://files.pythonhosted.org/packages/19/b1/cb84b8a747b27431fdc2099c819dadc0afe519f824dd7b64dfe53edb07e3/connectorx-0.3.3-cp311-none-win_amd64.whl", hash = "sha256:6e6495cab5f23e638456622a880c774c4bcfc17ee9ed7009d4217756a7e9e2c8", size = 53814833 }, + { url = "https://files.pythonhosted.org/packages/a5/d8/6077247b842824df2c512430c150be71402345ec5ab386e2afc6ab9af6e4/connectorx-0.3.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:dfefa3c55601b1a229dd27359a61c18977921455eae0c5068ec15d79900a096c", size = 55474648 }, + { url = "https://files.pythonhosted.org/packages/6f/da/de01abb84c48996d472b9331efe0ae4c9302235d45286b7bd82864d8ddfc/connectorx-0.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1b62f6cac84a7c41c4f61746262da059dd8af06d10de64ebde2d59c73e28c22b", size = 54468476 }, + { url = "https://files.pythonhosted.org/packages/3a/70/6f8799f1f5b39a1be90782f7b0ba904daf63aae75340e9d2f4089d8c77a9/connectorx-0.3.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:2eaca398a5dae6da595c8c521d2a27050100a94e4d5778776b914b919e54ab1e", size = 60507349 }, + { url = "https://files.pythonhosted.org/packages/cb/0a/4b33ba99394d900def8bd0a008d9f22eb2a0a93d58053621bbf052613cf0/connectorx-0.3.3-cp312-none-win_amd64.whl", hash = "sha256:a37762f26ced286e9c06528f0179877148ea83f24263ac53b906c33c430af323", size = 53816655 }, + { url = "https://files.pythonhosted.org/packages/bb/36/ba1864c64f3ddbf87bfd7a6d21b61626bf6a80a9339c0249c0b6d1f450ba/connectorx-0.3.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:9267431fa88b00c60c6113d9deabe86a2ad739c8be56ee4b57164d3ed983b5dc", size = 55474237 }, + { url = "https://files.pythonhosted.org/packages/8e/45/29baccf5fa511bc1e15b1ee6bb2b4d7987ea5cdc263989a260c9161bfcac/connectorx-0.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:823170c06b61c7744fc668e6525b26a11ca462c1c809354aa2d482bd5a92bb0e", size = 54469958 }, + { url = "https://files.pythonhosted.org/packages/4b/75/db87f3c6396d315ce3bbc3282860955aab7efd31fa08cbe11db0cc7ff88c/connectorx-0.3.3-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:9b001b78406dd7a1b8b7d61330bbcb73ea68f478589fc439fbda001ed875e8ea", size = 60511172 }, + { url = "https://files.pythonhosted.org/packages/fe/80/cc6c3bf7d6914f3c25369ea74f00dc96fd7c47fe29c2b481d26f01b6b952/connectorx-0.3.3-cp39-none-win_amd64.whl", hash = "sha256:e1e16404e353f348120d393586c58cad8a4ebf81e07f3f1dff580b551dbc863d", size = 53817178 }, +] + +[[package]] +name = "decorator" +version = "5.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/66/0c/8d907af351aa16b42caae42f9d6aa37b900c67308052d10fdce809f8d952/decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", size = 35016 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186", size = 9073 }, +] + +[[package]] +name = "deltalake" +version = "0.20.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyarrow" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c2/ed/3e94303014138904107c9fab7ed32febb85190f02d4e76931e7b909087fd/deltalake-0.20.2.tar.gz", hash = "sha256:e13bbcff69fb0948d1969ad2a03cc80a2dd052c8a762d9808d75316c9a9b1639", size = 4867394 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/a8/052d8b997097a56ba76381ce53cef72516ff5568672021d14c406e252c43/deltalake-0.20.2-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:fe0623e0b938d05d83d50f2537d750f732f9ecfea0936a71b18a01cd732b70a1", size = 30781064 }, + { url = "https://files.pythonhosted.org/packages/3f/56/043c0cc146d9210d9aaf49e5c9eecf4fb0f7a7c4ebe39d93a240e52cdbfa/deltalake-0.20.2-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d50f6f3c1c07ab13f9ee37fb0291a52f5e0961da6b2be3dbbbd2d0c2eebd9077", size = 29090793 }, + { url = "https://files.pythonhosted.org/packages/8c/ca/387783449a08c9c479de3d0e8f068100acc390fd2ee454b227e46d51bc0b/deltalake-0.20.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b04f9cda5b67e3ec4db1524eebd0ef7aaee0387683e2e3ce34790a54295d3465", size = 35756229 }, + { url = "https://files.pythonhosted.org/packages/f2/f7/e5fb8f63f76412afe12021e608cfc3fb09ab42aa144e89278beae2e5161f/deltalake-0.20.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37e69797219b4e79f37e064c0282520d9dda35dd11a449f7c9080626deb91db3", size = 35934951 }, + { url = "https://files.pythonhosted.org/packages/24/4f/49b12efe414624d417c73ddd2989034540ac8dab550666dbdd0155852bf7/deltalake-0.20.2-cp38-abi3-win_amd64.whl", hash = "sha256:a6742240ef72fb60503f9d1bbdba658a175005740bf5df1b51187273c0771a0c", size = 28525221 }, +] + +[[package]] +name = "deprecation" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5a/d3/8ae2869247df154b64c1884d7346d412fed0c49df84db635aab2d1c40e62/deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff", size = 173788 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/c3/253a89ee03fc9b9682f1541728eb66db7db22148cd94f89ab22528cd1e1b/deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a", size = 11178 }, +] + +[[package]] +name = "distro" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277 }, +] + +[[package]] +name = "exceptiongroup" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/09/35/2495c4ac46b980e4ca1f6ad6db102322ef3ad2410b79fdde159a4b0f3b92/exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc", size = 28883 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453 }, +] + +[[package]] +name = "filelock" +version = "3.16.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/db/3ef5bb276dae18d6ec2124224403d1d67bccdbefc17af4cc8f553e341ab1/filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435", size = 18037 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0", size = 16163 }, +] + +[[package]] +name = "frozenlist" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/3d/2102257e7acad73efc4a0c306ad3953f68c504c16982bbdfee3ad75d8085/frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b", size = 37820 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/35/1328c7b0f780d34f8afc1d87ebdc2bb065a123b24766a0b475f0d67da637/frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac", size = 94315 }, + { url = "https://files.pythonhosted.org/packages/f4/d6/ca016b0adcf8327714ccef969740688808c86e0287bf3a639ff582f24e82/frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868", size = 53805 }, + { url = "https://files.pythonhosted.org/packages/ae/83/bcdaa437a9bd693ba658a0310f8cdccff26bd78e45fccf8e49897904a5cd/frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776", size = 52163 }, + { url = "https://files.pythonhosted.org/packages/d4/e9/759043ab7d169b74fe05ebfbfa9ee5c881c303ebc838e308346204309cd0/frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a", size = 238595 }, + { url = "https://files.pythonhosted.org/packages/f8/ce/b9de7dc61e753dc318cf0de862181b484178210c5361eae6eaf06792264d/frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad", size = 262428 }, + { url = "https://files.pythonhosted.org/packages/36/ce/dc6f29e0352fa34ebe45421960c8e7352ca63b31630a576e8ffb381e9c08/frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c", size = 258867 }, + { url = "https://files.pythonhosted.org/packages/51/47/159ac53faf8a11ae5ee8bb9db10327575557504e549cfd76f447b969aa91/frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe", size = 229412 }, + { url = "https://files.pythonhosted.org/packages/ec/25/0c87df2e53c0c5d90f7517ca0ff7aca78d050a8ec4d32c4278e8c0e52e51/frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a", size = 239539 }, + { url = "https://files.pythonhosted.org/packages/97/94/a1305fa4716726ae0abf3b1069c2d922fcfd442538cb850f1be543f58766/frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98", size = 253379 }, + { url = "https://files.pythonhosted.org/packages/53/82/274e19f122e124aee6d113188615f63b0736b4242a875f482a81f91e07e2/frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75", size = 245901 }, + { url = "https://files.pythonhosted.org/packages/b8/28/899931015b8cffbe155392fe9ca663f981a17e1adc69589ee0e1e7cdc9a2/frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5", size = 263797 }, + { url = "https://files.pythonhosted.org/packages/6e/4f/b8a5a2f10c4a58c52a52a40cf6cf1ffcdbf3a3b64f276f41dab989bf3ab5/frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950", size = 264415 }, + { url = "https://files.pythonhosted.org/packages/b0/2c/7be3bdc59dbae444864dbd9cde82790314390ec54636baf6b9ce212627ad/frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc", size = 253964 }, + { url = "https://files.pythonhosted.org/packages/2e/ec/4fb5a88f6b9a352aed45ab824dd7ce4801b7bcd379adcb927c17a8f0a1a8/frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1", size = 44559 }, + { url = "https://files.pythonhosted.org/packages/61/15/2b5d644d81282f00b61e54f7b00a96f9c40224107282efe4cd9d2bf1433a/frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439", size = 50434 }, + { url = "https://files.pythonhosted.org/packages/01/bc/8d33f2d84b9368da83e69e42720cff01c5e199b5a868ba4486189a4d8fa9/frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0", size = 97060 }, + { url = "https://files.pythonhosted.org/packages/af/b2/904500d6a162b98a70e510e743e7ea992241b4f9add2c8063bf666ca21df/frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49", size = 55347 }, + { url = "https://files.pythonhosted.org/packages/5b/9c/f12b69997d3891ddc0d7895999a00b0c6a67f66f79498c0e30f27876435d/frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced", size = 53374 }, + { url = "https://files.pythonhosted.org/packages/ac/6e/e0322317b7c600ba21dec224498c0c5959b2bce3865277a7c0badae340a9/frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0", size = 273288 }, + { url = "https://files.pythonhosted.org/packages/a7/76/180ee1b021568dad5b35b7678616c24519af130ed3fa1e0f1ed4014e0f93/frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106", size = 284737 }, + { url = "https://files.pythonhosted.org/packages/05/08/40159d706a6ed983c8aca51922a93fc69f3c27909e82c537dd4054032674/frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068", size = 280267 }, + { url = "https://files.pythonhosted.org/packages/e0/18/9f09f84934c2b2aa37d539a322267939770362d5495f37783440ca9c1b74/frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2", size = 258778 }, + { url = "https://files.pythonhosted.org/packages/b3/c9/0bc5ee7e1f5cc7358ab67da0b7dfe60fbd05c254cea5c6108e7d1ae28c63/frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19", size = 272276 }, + { url = "https://files.pythonhosted.org/packages/12/5d/147556b73a53ad4df6da8bbb50715a66ac75c491fdedac3eca8b0b915345/frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82", size = 272424 }, + { url = "https://files.pythonhosted.org/packages/83/61/2087bbf24070b66090c0af922685f1d0596c24bb3f3b5223625bdeaf03ca/frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec", size = 260881 }, + { url = "https://files.pythonhosted.org/packages/a8/be/a235bc937dd803258a370fe21b5aa2dd3e7bfe0287a186a4bec30c6cccd6/frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a", size = 282327 }, + { url = "https://files.pythonhosted.org/packages/5d/e7/b2469e71f082948066b9382c7b908c22552cc705b960363c390d2e23f587/frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74", size = 281502 }, + { url = "https://files.pythonhosted.org/packages/db/1b/6a5b970e55dffc1a7d0bb54f57b184b2a2a2ad0b7bca16a97ca26d73c5b5/frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2", size = 272292 }, + { url = "https://files.pythonhosted.org/packages/1a/05/ebad68130e6b6eb9b287dacad08ea357c33849c74550c015b355b75cc714/frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17", size = 44446 }, + { url = "https://files.pythonhosted.org/packages/b3/21/c5aaffac47fd305d69df46cfbf118768cdf049a92ee6b0b5cb029d449dcf/frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825", size = 50459 }, + { url = "https://files.pythonhosted.org/packages/b4/db/4cf37556a735bcdb2582f2c3fa286aefde2322f92d3141e087b8aeb27177/frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae", size = 93937 }, + { url = "https://files.pythonhosted.org/packages/46/03/69eb64642ca8c05f30aa5931d6c55e50b43d0cd13256fdd01510a1f85221/frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb", size = 53656 }, + { url = "https://files.pythonhosted.org/packages/3f/ab/c543c13824a615955f57e082c8a5ee122d2d5368e80084f2834e6f4feced/frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b", size = 51868 }, + { url = "https://files.pythonhosted.org/packages/a9/b8/438cfd92be2a124da8259b13409224d9b19ef8f5a5b2507174fc7e7ea18f/frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86", size = 280652 }, + { url = "https://files.pythonhosted.org/packages/54/72/716a955521b97a25d48315c6c3653f981041ce7a17ff79f701298195bca3/frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480", size = 286739 }, + { url = "https://files.pythonhosted.org/packages/65/d8/934c08103637567084568e4d5b4219c1016c60b4d29353b1a5b3587827d6/frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09", size = 289447 }, + { url = "https://files.pythonhosted.org/packages/70/bb/d3b98d83ec6ef88f9bd63d77104a305d68a146fd63a683569ea44c3085f6/frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a", size = 265466 }, + { url = "https://files.pythonhosted.org/packages/0b/f2/b8158a0f06faefec33f4dff6345a575c18095a44e52d4f10c678c137d0e0/frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd", size = 281530 }, + { url = "https://files.pythonhosted.org/packages/ea/a2/20882c251e61be653764038ece62029bfb34bd5b842724fff32a5b7a2894/frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6", size = 281295 }, + { url = "https://files.pythonhosted.org/packages/4c/f9/8894c05dc927af2a09663bdf31914d4fb5501653f240a5bbaf1e88cab1d3/frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1", size = 268054 }, + { url = "https://files.pythonhosted.org/packages/37/ff/a613e58452b60166507d731812f3be253eb1229808e59980f0405d1eafbf/frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b", size = 286904 }, + { url = "https://files.pythonhosted.org/packages/cc/6e/0091d785187f4c2020d5245796d04213f2261ad097e0c1cf35c44317d517/frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e", size = 290754 }, + { url = "https://files.pythonhosted.org/packages/a5/c2/e42ad54bae8bcffee22d1e12a8ee6c7717f7d5b5019261a8c861854f4776/frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8", size = 282602 }, + { url = "https://files.pythonhosted.org/packages/b6/61/56bad8cb94f0357c4bc134acc30822e90e203b5cb8ff82179947de90c17f/frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89", size = 44063 }, + { url = "https://files.pythonhosted.org/packages/3e/dc/96647994a013bc72f3d453abab18340b7f5e222b7b7291e3697ca1fcfbd5/frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5", size = 50452 }, + { url = "https://files.pythonhosted.org/packages/32/c7/cc0db0d69ee0dbd85fb453650ce86436f15c39a8cde4d2b432fddc77a80e/frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d", size = 97416 }, + { url = "https://files.pythonhosted.org/packages/07/eb/71b5531dfb71eb6272b6e2281139d7d46b6adaf43c59850bc8ff64ac1860/frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826", size = 55248 }, + { url = "https://files.pythonhosted.org/packages/a0/9f/255b4d34a4f8ff7f31db79406917c403032aa19b39a651ad0a0d6b467317/frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb", size = 53797 }, + { url = "https://files.pythonhosted.org/packages/3b/75/30ff63c92b4c561803662bb7e75b5a6863a2af434e6ff05be8a514a41dd2/frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6", size = 239543 }, + { url = "https://files.pythonhosted.org/packages/43/ec/362807e1682bb0f6a5f34d15994125d72fc7e52fb9b8e4953b13384dcc94/frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d", size = 256966 }, + { url = "https://files.pythonhosted.org/packages/b8/d5/35bba11c3f32283996611dbd88c5357b3ff7bcea63509f8e35b62fa9525a/frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887", size = 252874 }, + { url = "https://files.pythonhosted.org/packages/90/e4/d205655ac3db4dc1bb96ccb1dd59c0d38d54349408ad840bea85a3dd66e9/frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a", size = 231439 }, + { url = "https://files.pythonhosted.org/packages/45/4d/175b16d42daae8013bb1872f6d0870abd87da93e0a36706da4c9ba655d19/frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b", size = 240857 }, + { url = "https://files.pythonhosted.org/packages/0c/fa/ef6a96b7757c969b3d7be55c3e70951409509464f5177624d62c894656b6/frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701", size = 246935 }, + { url = "https://files.pythonhosted.org/packages/44/7e/f3177ed74571eb55779bc3c9ac486505ffc4306852f48c6ee5bd82baecb0/frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0", size = 239742 }, + { url = "https://files.pythonhosted.org/packages/eb/59/e4d3a794b2d9b7ca86a266b61a949f5cccec7a88d818f3b6ad8b80b3ad65/frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11", size = 257417 }, + { url = "https://files.pythonhosted.org/packages/31/fb/d6dc05b56cc30bf6abef2f2100ff6d6d417c33b956a642d768d5e11b5fdf/frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09", size = 255624 }, + { url = "https://files.pythonhosted.org/packages/dc/c9/21abed93eddf089dd0ddd7e09203f2f3dad5d2b784674603a319b0f0c02c/frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7", size = 248001 }, + { url = "https://files.pythonhosted.org/packages/05/6b/e76e740c826acc2ebb5ad5eb06bac15269cd950fc51bd86bbcdbbc04a863/frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497", size = 44799 }, + { url = "https://files.pythonhosted.org/packages/57/0e/63fba1e3a50f2e55d980aa633b8b58062ec7777333aabf0cc3a07a13eb5e/frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09", size = 50820 }, + { url = "https://files.pythonhosted.org/packages/d3/fb/6f2a22086065bc16797f77168728f0e59d5b89be76dd184e06b404f1e43b/frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e", size = 97291 }, + { url = "https://files.pythonhosted.org/packages/4d/23/7f01123d0e5adcc65cbbde5731378237dea7db467abd19e391f1ddd4130d/frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d", size = 55249 }, + { url = "https://files.pythonhosted.org/packages/8b/c9/a81e9af48291954a883d35686f32308238dc968043143133b8ac9e2772af/frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8", size = 53676 }, + { url = "https://files.pythonhosted.org/packages/57/15/172af60c7e150a1d88ecc832f2590721166ae41eab582172fe1e9844eab4/frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0", size = 239365 }, + { url = "https://files.pythonhosted.org/packages/8c/a4/3dc43e259960ad268ef8f2bf92912c2d2cd2e5275a4838804e03fd6f085f/frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b", size = 265592 }, + { url = "https://files.pythonhosted.org/packages/a0/c1/458cf031fc8cd29a751e305b1ec773785ce486106451c93986562c62a21e/frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0", size = 261274 }, + { url = "https://files.pythonhosted.org/packages/4a/32/21329084b61a119ecce0b2942d30312a34a7a0dccd01dcf7b40bda80f22c/frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897", size = 230787 }, + { url = "https://files.pythonhosted.org/packages/70/b0/6f1ebdabfb604e39a0f84428986b89ab55f246b64cddaa495f2c953e1f6b/frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7", size = 240674 }, + { url = "https://files.pythonhosted.org/packages/a3/05/50c53f1cdbfdf3d2cb9582a4ea5e12cd939ce33bd84403e6d07744563486/frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742", size = 255712 }, + { url = "https://files.pythonhosted.org/packages/b8/3d/cbc6f057f7d10efb7f1f410e458ac090f30526fd110ed2b29bb56ec38fe1/frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea", size = 247618 }, + { url = "https://files.pythonhosted.org/packages/96/86/d5e9cd583aed98c9ee35a3aac2ce4d022ce9de93518e963aadf34a18143b/frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5", size = 266868 }, + { url = "https://files.pythonhosted.org/packages/0f/6e/542af762beb9113f13614a590cafe661e0e060cddddee6107c8833605776/frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9", size = 266439 }, + { url = "https://files.pythonhosted.org/packages/ea/db/8b611e23fda75da5311b698730a598df54cfe6236678001f449b1dedb241/frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6", size = 256677 }, + { url = "https://files.pythonhosted.org/packages/eb/06/732cefc0c46c638e4426a859a372a50e4c9d62e65dbfa7ddcf0b13e6a4f2/frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932", size = 44825 }, + { url = "https://files.pythonhosted.org/packages/29/eb/2110c4be2f622e87864e433efd7c4ee6e4f8a59ff2a93c1aa426ee50a8b8/frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0", size = 50652 }, + { url = "https://files.pythonhosted.org/packages/83/10/466fe96dae1bff622021ee687f68e5524d6392b0a2f80d05001cd3a451ba/frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7", size = 11552 }, +] + +[[package]] +name = "fsspec" +version = "2024.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/62/7c/12b0943011daaaa9c35c2a2e22e5eb929ac90002f08f1259d69aedad84de/fsspec-2024.9.0.tar.gz", hash = "sha256:4b0afb90c2f21832df142f292649035d80b421f60a9e1c027802e5a0da2b04e8", size = 286206 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/a0/6aaea0c2fbea2f89bfd5db25fb1e3481896a423002ebe4e55288907a97a3/fsspec-2024.9.0-py3-none-any.whl", hash = "sha256:a0947d552d8a6efa72cc2c730b12c41d043509156966cca4fb157b0f2a0c574b", size = 179253 }, +] + +[[package]] +name = "getdaft" +version = "0.3.0.dev0" +source = { editable = "." } +dependencies = [ + { name = "fsspec" }, + { name = "pyarrow" }, + { name = "tqdm" }, + { name = "typing-extensions", marker = "python_full_version < '3.10'" }, +] + +[package.optional-dependencies] +all = [ + { name = "boto3" }, + { name = "connectorx" }, + { name = "deltalake" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pandas" }, + { name = "pyiceberg" }, + { name = "ray", extra = ["client", "data"] }, + { name = "sqlalchemy" }, + { name = "sqlglot" }, + { name = "unitycatalog" }, +] +aws = [ + { name = "boto3" }, +] +deltalake = [ + { name = "deltalake" }, +] +hudi = [ + { name = "pyarrow" }, +] +iceberg = [ + { name = "packaging" }, + { name = "pyiceberg" }, +] +lance = [ + { name = "lancedb" }, +] +numpy = [ + { name = "numpy" }, +] +pandas = [ + { name = "pandas" }, +] +ray = [ + { name = "packaging" }, + { name = "ray", extra = ["client", "data"] }, +] +sql = [ + { name = "connectorx" }, + { name = "sqlalchemy" }, + { name = "sqlglot" }, +] +unity = [ + { name = "unitycatalog" }, +] + +[package.metadata] +requires-dist = [ + { name = "boto3", marker = "extra == 'aws'" }, + { name = "connectorx", marker = "extra == 'sql'" }, + { name = "deltalake", marker = "extra == 'deltalake'" }, + { name = "fsspec" }, + { name = "getdaft", extras = ["aws", "azure", "gcp", "ray", "pandas", "numpy", "iceberg", "deltalake", "sql", "unity"], marker = "extra == 'all'" }, + { name = "lancedb", marker = "extra == 'lance'" }, + { name = "numpy", marker = "extra == 'numpy'" }, + { name = "packaging", marker = "extra == 'iceberg'" }, + { name = "packaging", marker = "extra == 'ray'" }, + { name = "pandas", marker = "extra == 'pandas'" }, + { name = "pyarrow", specifier = ">=7.0.0" }, + { name = "pyarrow", marker = "extra == 'hudi'", specifier = ">=8.0.0" }, + { name = "pyiceberg", marker = "extra == 'iceberg'", specifier = ">=0.4.0" }, + { name = "ray", extras = ["data", "client"], marker = "platform_system == 'Windows' and extra == 'ray'", specifier = ">=2.10.0" }, + { name = "ray", extras = ["data", "client"], marker = "platform_system != 'Windows' and extra == 'ray'", specifier = ">=2.0.0" }, + { name = "sqlalchemy", marker = "extra == 'sql'" }, + { name = "sqlglot", marker = "extra == 'sql'" }, + { name = "tqdm" }, + { name = "typing-extensions", marker = "python_full_version < '3.10'", specifier = ">=4.0.0" }, + { name = "unitycatalog", marker = "extra == 'unity'" }, +] + +[[package]] +name = "greenlet" +version = "3.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2f/ff/df5fede753cc10f6a5be0931204ea30c35fa2f2ea7a35b25bdaf4fe40e46/greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467", size = 186022 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/90/5234a78dc0ef6496a6eb97b67a42a8e96742a56f7dc808cb954a85390448/greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563", size = 271235 }, + { url = "https://files.pythonhosted.org/packages/7c/16/cd631fa0ab7d06ef06387135b7549fdcc77d8d859ed770a0d28e47b20972/greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83", size = 637168 }, + { url = "https://files.pythonhosted.org/packages/2f/b1/aed39043a6fec33c284a2c9abd63ce191f4f1a07319340ffc04d2ed3256f/greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0", size = 648826 }, + { url = "https://files.pythonhosted.org/packages/76/25/40e0112f7f3ebe54e8e8ed91b2b9f970805143efef16d043dfc15e70f44b/greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120", size = 644443 }, + { url = "https://files.pythonhosted.org/packages/fb/2f/3850b867a9af519794784a7eeed1dd5bc68ffbcc5b28cef703711025fd0a/greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc", size = 643295 }, + { url = "https://files.pythonhosted.org/packages/cf/69/79e4d63b9387b48939096e25115b8af7cd8a90397a304f92436bcb21f5b2/greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617", size = 599544 }, + { url = "https://files.pythonhosted.org/packages/46/1d/44dbcb0e6c323bd6f71b8c2f4233766a5faf4b8948873225d34a0b7efa71/greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7", size = 1125456 }, + { url = "https://files.pythonhosted.org/packages/e0/1d/a305dce121838d0278cee39d5bb268c657f10a5363ae4b726848f833f1bb/greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6", size = 1149111 }, + { url = "https://files.pythonhosted.org/packages/96/28/d62835fb33fb5652f2e98d34c44ad1a0feacc8b1d3f1aecab035f51f267d/greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80", size = 298392 }, + { url = "https://files.pythonhosted.org/packages/28/62/1c2665558618553c42922ed47a4e6d6527e2fa3516a8256c2f431c5d0441/greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70", size = 272479 }, + { url = "https://files.pythonhosted.org/packages/76/9d/421e2d5f07285b6e4e3a676b016ca781f63cfe4a0cd8eaecf3fd6f7a71ae/greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159", size = 640404 }, + { url = "https://files.pythonhosted.org/packages/e5/de/6e05f5c59262a584e502dd3d261bbdd2c97ab5416cc9c0b91ea38932a901/greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e", size = 652813 }, + { url = "https://files.pythonhosted.org/packages/49/93/d5f93c84241acdea15a8fd329362c2c71c79e1a507c3f142a5d67ea435ae/greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1", size = 648517 }, + { url = "https://files.pythonhosted.org/packages/15/85/72f77fc02d00470c86a5c982b8daafdf65d38aefbbe441cebff3bf7037fc/greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383", size = 647831 }, + { url = "https://files.pythonhosted.org/packages/f7/4b/1c9695aa24f808e156c8f4813f685d975ca73c000c2a5056c514c64980f6/greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a", size = 602413 }, + { url = "https://files.pythonhosted.org/packages/76/70/ad6e5b31ef330f03b12559d19fda2606a522d3849cde46b24f223d6d1619/greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511", size = 1129619 }, + { url = "https://files.pythonhosted.org/packages/f4/fb/201e1b932e584066e0f0658b538e73c459b34d44b4bd4034f682423bc801/greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395", size = 1155198 }, + { url = "https://files.pythonhosted.org/packages/12/da/b9ed5e310bb8b89661b80cbcd4db5a067903bbcd7fc854923f5ebb4144f0/greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39", size = 298930 }, + { url = "https://files.pythonhosted.org/packages/7d/ec/bad1ac26764d26aa1353216fcbfa4670050f66d445448aafa227f8b16e80/greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d", size = 274260 }, + { url = "https://files.pythonhosted.org/packages/66/d4/c8c04958870f482459ab5956c2942c4ec35cac7fe245527f1039837c17a9/greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79", size = 649064 }, + { url = "https://files.pythonhosted.org/packages/51/41/467b12a8c7c1303d20abcca145db2be4e6cd50a951fa30af48b6ec607581/greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa", size = 663420 }, + { url = "https://files.pythonhosted.org/packages/27/8f/2a93cd9b1e7107d5c7b3b7816eeadcac2ebcaf6d6513df9abaf0334777f6/greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441", size = 658035 }, + { url = "https://files.pythonhosted.org/packages/57/5c/7c6f50cb12be092e1dccb2599be5a942c3416dbcfb76efcf54b3f8be4d8d/greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36", size = 660105 }, + { url = "https://files.pythonhosted.org/packages/f1/66/033e58a50fd9ec9df00a8671c74f1f3a320564c6415a4ed82a1c651654ba/greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9", size = 613077 }, + { url = "https://files.pythonhosted.org/packages/19/c5/36384a06f748044d06bdd8776e231fadf92fc896bd12cb1c9f5a1bda9578/greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0", size = 1135975 }, + { url = "https://files.pythonhosted.org/packages/38/f9/c0a0eb61bdf808d23266ecf1d63309f0e1471f284300ce6dac0ae1231881/greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942", size = 1163955 }, + { url = "https://files.pythonhosted.org/packages/43/21/a5d9df1d21514883333fc86584c07c2b49ba7c602e670b174bd73cfc9c7f/greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01", size = 299655 }, + { url = "https://files.pythonhosted.org/packages/f3/57/0db4940cd7bb461365ca8d6fd53e68254c9dbbcc2b452e69d0d41f10a85e/greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1", size = 272990 }, + { url = "https://files.pythonhosted.org/packages/1c/ec/423d113c9f74e5e402e175b157203e9102feeb7088cee844d735b28ef963/greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff", size = 649175 }, + { url = "https://files.pythonhosted.org/packages/a9/46/ddbd2db9ff209186b7b7c621d1432e2f21714adc988703dbdd0e65155c77/greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a", size = 663425 }, + { url = "https://files.pythonhosted.org/packages/bc/f9/9c82d6b2b04aa37e38e74f0c429aece5eeb02bab6e3b98e7db89b23d94c6/greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e", size = 657736 }, + { url = "https://files.pythonhosted.org/packages/d9/42/b87bc2a81e3a62c3de2b0d550bf91a86939442b7ff85abb94eec3fc0e6aa/greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4", size = 660347 }, + { url = "https://files.pythonhosted.org/packages/37/fa/71599c3fd06336cdc3eac52e6871cfebab4d9d70674a9a9e7a482c318e99/greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e", size = 615583 }, + { url = "https://files.pythonhosted.org/packages/4e/96/e9ef85de031703ee7a4483489b40cf307f93c1824a02e903106f2ea315fe/greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1", size = 1133039 }, + { url = "https://files.pythonhosted.org/packages/87/76/b2b6362accd69f2d1889db61a18c94bc743e961e3cab344c2effaa4b4a25/greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c", size = 1160716 }, + { url = "https://files.pythonhosted.org/packages/1f/1b/54336d876186920e185066d8c3024ad55f21d7cc3683c856127ddb7b13ce/greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761", size = 299490 }, + { url = "https://files.pythonhosted.org/packages/5f/17/bea55bf36990e1638a2af5ba10c1640273ef20f627962cf97107f1e5d637/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011", size = 643731 }, + { url = "https://files.pythonhosted.org/packages/78/d2/aa3d2157f9ab742a08e0fd8f77d4699f37c22adfbfeb0c610a186b5f75e0/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13", size = 649304 }, + { url = "https://files.pythonhosted.org/packages/f1/8e/d0aeffe69e53ccff5a28fa86f07ad1d2d2d6537a9506229431a2a02e2f15/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475", size = 646537 }, + { url = "https://files.pythonhosted.org/packages/05/79/e15408220bbb989469c8871062c97c6c9136770657ba779711b90870d867/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b", size = 642506 }, + { url = "https://files.pythonhosted.org/packages/18/87/470e01a940307796f1d25f8167b551a968540fbe0551c0ebb853cb527dd6/greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822", size = 602753 }, + { url = "https://files.pythonhosted.org/packages/e2/72/576815ba674eddc3c25028238f74d7b8068902b3968cbe456771b166455e/greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01", size = 1122731 }, + { url = "https://files.pythonhosted.org/packages/ac/38/08cc303ddddc4b3d7c628c3039a61a3aae36c241ed01393d00c2fd663473/greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6", size = 1142112 }, + { url = "https://files.pythonhosted.org/packages/97/83/bdf5f69fcf304065ec7cf8fc7c08248479cfed9bcca02bf0001c07e000aa/greenlet-3.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9", size = 271017 }, + { url = "https://files.pythonhosted.org/packages/31/4a/2d4443adcb38e1e90e50c653a26b2be39998ea78ca1a4cf414dfdeb2e98b/greenlet-3.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111", size = 642888 }, + { url = "https://files.pythonhosted.org/packages/5a/c9/b5d9ac1b932aa772dd1eb90a8a2b30dbd7ad5569dcb7fdac543810d206b4/greenlet-3.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81", size = 655451 }, + { url = "https://files.pythonhosted.org/packages/a8/18/218e21caf7caba5b2236370196eaebc00987d4a2b2d3bf63cc4d4dd5a69f/greenlet-3.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba", size = 651409 }, + { url = "https://files.pythonhosted.org/packages/a7/25/de419a2b22fa6e18ce3b2a5adb01d33ec7b2784530f76fa36ba43d8f0fac/greenlet-3.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8", size = 650661 }, + { url = "https://files.pythonhosted.org/packages/d8/88/0ce16c0afb2d71d85562a7bcd9b092fec80a7767ab5b5f7e1bbbca8200f8/greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1", size = 605959 }, + { url = "https://files.pythonhosted.org/packages/5a/10/39a417ad0afb0b7e5b150f1582cdeb9416f41f2e1df76018434dfac4a6cc/greenlet-3.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd", size = 1132341 }, + { url = "https://files.pythonhosted.org/packages/9f/f5/e9b151ddd2ed0508b7a47bef7857e46218dbc3fd10e564617a3865abfaac/greenlet-3.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7", size = 1159409 }, + { url = "https://files.pythonhosted.org/packages/86/97/2c86989ca4e0f089fbcdc9229c972a01ef53abdafd5ae89e0f3dcdcd4adb/greenlet-3.1.1-cp38-cp38-win32.whl", hash = "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef", size = 281126 }, + { url = "https://files.pythonhosted.org/packages/d3/50/7b7a3e10ed82c760c1fd8d3167a7c95508e9fdfc0b0604f05ed1a9a9efdc/greenlet-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d", size = 298285 }, + { url = "https://files.pythonhosted.org/packages/8c/82/8051e82af6d6b5150aacb6789a657a8afd48f0a44d8e91cb72aaaf28553a/greenlet-3.1.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3", size = 270027 }, + { url = "https://files.pythonhosted.org/packages/f9/74/f66de2785880293780eebd18a2958aeea7cbe7814af1ccef634f4701f846/greenlet-3.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42", size = 634822 }, + { url = "https://files.pythonhosted.org/packages/68/23/acd9ca6bc412b02b8aa755e47b16aafbe642dde0ad2f929f836e57a7949c/greenlet-3.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f", size = 646866 }, + { url = "https://files.pythonhosted.org/packages/a9/ab/562beaf8a53dc9f6b2459f200e7bc226bb07e51862a66351d8b7817e3efd/greenlet-3.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437", size = 641985 }, + { url = "https://files.pythonhosted.org/packages/03/d3/1006543621f16689f6dc75f6bcf06e3c23e044c26fe391c16c253623313e/greenlet-3.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145", size = 641268 }, + { url = "https://files.pythonhosted.org/packages/2f/c1/ad71ce1b5f61f900593377b3f77b39408bce5dc96754790311b49869e146/greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c", size = 597376 }, + { url = "https://files.pythonhosted.org/packages/f7/ff/183226685b478544d61d74804445589e069d00deb8ddef042699733950c7/greenlet-3.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e", size = 1123359 }, + { url = "https://files.pythonhosted.org/packages/c0/8b/9b3b85a89c22f55f315908b94cd75ab5fed5973f7393bbef000ca8b2c5c1/greenlet-3.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e", size = 1147458 }, + { url = "https://files.pythonhosted.org/packages/b8/1c/248fadcecd1790b0ba793ff81fa2375c9ad6442f4c748bf2cc2e6563346a/greenlet-3.1.1-cp39-cp39-win32.whl", hash = "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c", size = 281131 }, + { url = "https://files.pythonhosted.org/packages/ae/02/e7d0aef2354a38709b764df50b2b83608f0621493e47f47694eb80922822/greenlet-3.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22", size = 298306 }, +] + +[[package]] +name = "grpcio" +version = "1.67.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/ae/3c47d71ab4abd4bd60a7e2806071fe0a4b6937b9eabe522291787087ea1f/grpcio-1.67.0.tar.gz", hash = "sha256:e090b2553e0da1c875449c8e75073dd4415dd71c9bde6a406240fdf4c0ee467c", size = 12569330 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/da/c4a24a5245aba95c411a21c7525a41113b669b646a79ab8523551c4185cf/grpcio-1.67.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:bd79929b3bb96b54df1296cd3bf4d2b770bd1df6c2bdf549b49bab286b925cdc", size = 5108503 }, + { url = "https://files.pythonhosted.org/packages/08/29/1f46e9d2d9d34f4117f7dccfd7e222f1b0ea1fa1c5bd319e7b7017f4bc32/grpcio-1.67.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:16724ffc956ea42967f5758c2f043faef43cb7e48a51948ab593570570d1e68b", size = 10930122 }, + { url = "https://files.pythonhosted.org/packages/f0/ff/20774848a070b544c52a6e198d4bb439528bd440678f3bd3f65a41a9d804/grpcio-1.67.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:2b7183c80b602b0ad816315d66f2fb7887614ead950416d60913a9a71c12560d", size = 5630547 }, + { url = "https://files.pythonhosted.org/packages/60/05/4986994d96011c6b853f2f40ea2bf0c7ed97fc3a2391d004064697de01b7/grpcio-1.67.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:efe32b45dd6d118f5ea2e5deaed417d8a14976325c93812dd831908522b402c9", size = 6237824 }, + { url = "https://files.pythonhosted.org/packages/fa/1c/772a501cd18baffba5f9eeb54ce353c8749e9217c262bb7953427417db40/grpcio-1.67.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe89295219b9c9e47780a0f1c75ca44211e706d1c598242249fe717af3385ec8", size = 5881526 }, + { url = "https://files.pythonhosted.org/packages/6c/38/6f0243ce5b5f2b5f4cc34c8e0ba6b466db4b333bfb643f61e459bbe0b92c/grpcio-1.67.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa8d025fae1595a207b4e47c2e087cb88d47008494db258ac561c00877d4c8f8", size = 6582793 }, + { url = "https://files.pythonhosted.org/packages/ed/9f/c489cd122618ea808593d20a47ff68722b3c99c030c175550b85bb256fb0/grpcio-1.67.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f95e15db43e75a534420e04822df91f645664bf4ad21dfaad7d51773c80e6bb4", size = 6162111 }, + { url = "https://files.pythonhosted.org/packages/b7/a6/6384d59d26a5dbc7adffc0abf3d88107494ba3eb92bc9bd3f7fc7c18679d/grpcio-1.67.0-cp310-cp310-win32.whl", hash = "sha256:a6b9a5c18863fd4b6624a42e2712103fb0f57799a3b29651c0e5b8119a519d65", size = 3614488 }, + { url = "https://files.pythonhosted.org/packages/6b/20/5da50579c2b6341490459a44a97fd53d23a5c0e928bea78cf80ce67f8b1a/grpcio-1.67.0-cp310-cp310-win_amd64.whl", hash = "sha256:b6eb68493a05d38b426604e1dc93bfc0137c4157f7ab4fac5771fd9a104bbaa6", size = 4350825 }, + { url = "https://files.pythonhosted.org/packages/86/a2/5d3b07fe984e3eab147ebe141f0111ab19eb0c27dfdf19360c3de60a0341/grpcio-1.67.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:e91d154689639932305b6ea6f45c6e46bb51ecc8ea77c10ef25aa77f75443ad4", size = 5116425 }, + { url = "https://files.pythonhosted.org/packages/79/23/18730cca0d18ffde1de132a9230745a5c113cbc6dd8cde71c2288a21f5a3/grpcio-1.67.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cb204a742997277da678611a809a8409657b1398aaeebf73b3d9563b7d154c13", size = 11005387 }, + { url = "https://files.pythonhosted.org/packages/33/30/f8fa49eb3f30e4c730f3f37aa33f49cbad592906b93a9445e8ceedeaa96c/grpcio-1.67.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:ae6de510f670137e755eb2a74b04d1041e7210af2444103c8c95f193340d17ee", size = 5627195 }, + { url = "https://files.pythonhosted.org/packages/80/39/e1f7ac3938ac7763732d545fcfdcff23ed8e993513321b3d21cae146beb4/grpcio-1.67.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74b900566bdf68241118f2918d312d3bf554b2ce0b12b90178091ea7d0a17b3d", size = 6237935 }, + { url = "https://files.pythonhosted.org/packages/8e/a5/b99333f0a9f4599468bb4b7cb59aa1a7e2a2f67a59b5b13fdc7ea0acf0ad/grpcio-1.67.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4e95e43447a02aa603abcc6b5e727d093d161a869c83b073f50b9390ecf0fa8", size = 5879332 }, + { url = "https://files.pythonhosted.org/packages/6a/22/b9800736805c5bddd0c9a9d3b1556c682a0dee8ae63051c565d888a2bc87/grpcio-1.67.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0bb94e66cd8f0baf29bd3184b6aa09aeb1a660f9ec3d85da615c5003154bc2bf", size = 6578617 }, + { url = "https://files.pythonhosted.org/packages/20/a5/dd2e69777767c321ddaa886047dccc555f09f4fcdfc5164e440f1f4b589d/grpcio-1.67.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:82e5bd4b67b17c8c597273663794a6a46a45e44165b960517fe6d8a2f7f16d23", size = 6160509 }, + { url = "https://files.pythonhosted.org/packages/b7/5a/b12f69f687d9eb593405fa450a24ba4ee8f6058c6c43d1995bed023c6a61/grpcio-1.67.0-cp311-cp311-win32.whl", hash = "sha256:7fc1d2b9fd549264ae585026b266ac2db53735510a207381be509c315b4af4e8", size = 3614902 }, + { url = "https://files.pythonhosted.org/packages/aa/81/5a3503b9757a89c7d1fa7672b788fcbcafce91cdc94a3e0c53513a3201d7/grpcio-1.67.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac11ecb34a86b831239cc38245403a8de25037b448464f95c3315819e7519772", size = 4352547 }, + { url = "https://files.pythonhosted.org/packages/b0/2d/b2a783f1d93735a259676de5558ef019ac3511e894b8e9d224edc0d7d034/grpcio-1.67.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:227316b5631260e0bef8a3ce04fa7db4cc81756fea1258b007950b6efc90c05d", size = 5086495 }, + { url = "https://files.pythonhosted.org/packages/7b/13/c1f537a88dad543ca0a7be4dfee80a21b3b02b7df27750997777355e5840/grpcio-1.67.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d90cfdafcf4b45a7a076e3e2a58e7bc3d59c698c4f6470b0bb13a4d869cf2273", size = 10979109 }, + { url = "https://files.pythonhosted.org/packages/b7/83/d7cb72f2202fe8d608d25c7e9d6d75184bf6ef658688c818821add102211/grpcio-1.67.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:77196216d5dd6f99af1c51e235af2dd339159f657280e65ce7e12c1a8feffd1d", size = 5586952 }, + { url = "https://files.pythonhosted.org/packages/e5/18/8df585d0158af9e2b46ee2388bdb21de0e7f5bf4a47a86a861ebdbf947b5/grpcio-1.67.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15c05a26a0f7047f720da41dc49406b395c1470eef44ff7e2c506a47ac2c0591", size = 6212460 }, + { url = "https://files.pythonhosted.org/packages/47/46/027f8943113961784ce1eb69a28544d9a62ffb286332820ba634d979c91c/grpcio-1.67.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3840994689cc8cbb73d60485c594424ad8adb56c71a30d8948d6453083624b52", size = 5849002 }, + { url = "https://files.pythonhosted.org/packages/eb/26/fb19d5bc277e665382c835d7af1f8c1e3197576eed76327824d79e2a4bef/grpcio-1.67.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5a1e03c3102b6451028d5dc9f8591131d6ab3c8a0e023d94c28cb930ed4b5f81", size = 6568222 }, + { url = "https://files.pythonhosted.org/packages/e0/cc/387efa986f166c068d48331c699e6ee662a057371065f35d3ca1bc09d799/grpcio-1.67.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:682968427a63d898759474e3b3178d42546e878fdce034fd7474ef75143b64e3", size = 6148002 }, + { url = "https://files.pythonhosted.org/packages/24/57/529504e3e3e910f0537a0a36184cb7241d0d111109d6588096a9f8c139bf/grpcio-1.67.0-cp312-cp312-win32.whl", hash = "sha256:d01793653248f49cf47e5695e0a79805b1d9d4eacef85b310118ba1dfcd1b955", size = 3596220 }, + { url = "https://files.pythonhosted.org/packages/1d/1f/acf03ee901313446d52c3916d527d4981de9f6f3edc69267d05509dcfa7b/grpcio-1.67.0-cp312-cp312-win_amd64.whl", hash = "sha256:985b2686f786f3e20326c4367eebdaed3e7aa65848260ff0c6644f817042cb15", size = 4343545 }, + { url = "https://files.pythonhosted.org/packages/7a/e7/cc7feccb18ef0b5aa67ccb7859a091fa836c5d361a0109b9fca578e59e64/grpcio-1.67.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:8c9a35b8bc50db35ab8e3e02a4f2a35cfba46c8705c3911c34ce343bd777813a", size = 5087009 }, + { url = "https://files.pythonhosted.org/packages/bd/56/10175f4b1600b16e601680df053361924a9fcd9e1c0ad9b8bd1ba2b4c864/grpcio-1.67.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:42199e704095b62688998c2d84c89e59a26a7d5d32eed86d43dc90e7a3bd04aa", size = 10937553 }, + { url = "https://files.pythonhosted.org/packages/aa/85/115538b1aeb09d66c6e637608a56eddacd59eb71ab0161ad59172c01d436/grpcio-1.67.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:c4c425f440fb81f8d0237c07b9322fc0fb6ee2b29fbef5f62a322ff8fcce240d", size = 5586507 }, + { url = "https://files.pythonhosted.org/packages/0f/db/f402a455e287154683235183c2843c27fffe2fc03fa4c45b57dd90011401/grpcio-1.67.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:323741b6699cd2b04a71cb38f502db98f90532e8a40cb675393d248126a268af", size = 6211948 }, + { url = "https://files.pythonhosted.org/packages/92/e4/5957806105aad556f7df6a420b6c69044b6f707926392118772a8ba96de4/grpcio-1.67.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:662c8e105c5e5cee0317d500eb186ed7a93229586e431c1bf0c9236c2407352c", size = 5849392 }, + { url = "https://files.pythonhosted.org/packages/88/ab/c496a406f4682c56e933bef6b0ed22b9eaec84c6915f83d5cddd94126e16/grpcio-1.67.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:f6bd2ab135c64a4d1e9e44679a616c9bc944547357c830fafea5c3caa3de5153", size = 6571359 }, + { url = "https://files.pythonhosted.org/packages/9e/a8/96b3ef565791d7282c300c07c2a7080471311e7d5a239db15678aaac47eb/grpcio-1.67.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:2f55c1e0e2ae9bdd23b3c63459ee4c06d223b68aeb1961d83c48fb63dc29bc03", size = 6147905 }, + { url = "https://files.pythonhosted.org/packages/cd/b7/846cc563209ff5af88bc7dcb269948210674c2f743e7fd8e1a2ad9708e89/grpcio-1.67.0-cp313-cp313-win32.whl", hash = "sha256:fd6bc27861e460fe28e94226e3673d46e294ca4673d46b224428d197c5935e69", size = 3594603 }, + { url = "https://files.pythonhosted.org/packages/bd/74/49d27908b369b72fd3373ec0f16d7f58614fb7101cb38b266afeab846cca/grpcio-1.67.0-cp313-cp313-win_amd64.whl", hash = "sha256:cf51d28063338608cd8d3cd64677e922134837902b70ce00dad7f116e3998210", size = 4345468 }, + { url = "https://files.pythonhosted.org/packages/e3/9d/56ebfd65c4012fd9ae13612e1170c279991ccb62b1233bdc989a5a8d6d25/grpcio-1.67.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:7f200aca719c1c5dc72ab68be3479b9dafccdf03df530d137632c534bb6f1ee3", size = 5109128 }, + { url = "https://files.pythonhosted.org/packages/60/07/68033e3700413b78bdeafca0a0bacdd9510970025f94e4723b302f39566e/grpcio-1.67.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0892dd200ece4822d72dd0952f7112c542a487fc48fe77568deaaa399c1e717d", size = 10977820 }, + { url = "https://files.pythonhosted.org/packages/16/94/b1fadec2cd5dc8b5b30f93dd16231f1e721d5e7d116b1b3543904415011f/grpcio-1.67.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:f4d613fbf868b2e2444f490d18af472ccb47660ea3df52f068c9c8801e1f3e85", size = 5631935 }, + { url = "https://files.pythonhosted.org/packages/70/b5/05b1fbf59611d737077b4bb1bb8e9863e711c69c567d0205abe9bc5b45ac/grpcio-1.67.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c69bf11894cad9da00047f46584d5758d6ebc9b5950c0dc96fec7e0bce5cde9", size = 6239192 }, + { url = "https://files.pythonhosted.org/packages/26/03/a112a78c9e87cd4d6efde03e7c244e6fdfd39354bd20b5d0b117336aa0bb/grpcio-1.67.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9bca3ca0c5e74dea44bf57d27e15a3a3996ce7e5780d61b7c72386356d231db", size = 5887119 }, + { url = "https://files.pythonhosted.org/packages/1e/d2/699cfda08ed6637956ceedb1c1ff279229ac72d8fa4552d8be0afe15c7a7/grpcio-1.67.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:014dfc020e28a0d9be7e93a91f85ff9f4a87158b7df9952fe23cc42d29d31e1e", size = 6579632 }, + { url = "https://files.pythonhosted.org/packages/4e/ae/bfefef38655f51b485881c9e2b76c93aa601d8c3300d1268d355def57cad/grpcio-1.67.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d4ea4509d42c6797539e9ec7496c15473177ce9abc89bc5c71e7abe50fc25737", size = 6169304 }, + { url = "https://files.pythonhosted.org/packages/fb/52/dd5f8290ced404734aa7e77f14de55d48ef45953951069bb28f99ae43f56/grpcio-1.67.0-cp38-cp38-win32.whl", hash = "sha256:9d75641a2fca9ae1ae86454fd25d4c298ea8cc195dbc962852234d54a07060ad", size = 3617231 }, + { url = "https://files.pythonhosted.org/packages/e6/9a/2ba7f427085ebaac337d1a0eed5fa46e2543c90347343ece5287531bbe81/grpcio-1.67.0-cp38-cp38-win_amd64.whl", hash = "sha256:cff8e54d6a463883cda2fab94d2062aad2f5edd7f06ae3ed030f2a74756db365", size = 4354524 }, + { url = "https://files.pythonhosted.org/packages/56/6d/8d3ee8d7bbac91605beced83ebe8f12f007dd5880eef8e77d3b24e271ec7/grpcio-1.67.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:62492bd534979e6d7127b8a6b29093161a742dee3875873e01964049d5250a74", size = 5108289 }, + { url = "https://files.pythonhosted.org/packages/c1/57/72897f615b4970d8df81f73d9f62ec52b8bf426573be8e28b258001beba1/grpcio-1.67.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eef1dce9d1a46119fd09f9a992cf6ab9d9178b696382439446ca5f399d7b96fe", size = 10993703 }, + { url = "https://files.pythonhosted.org/packages/4e/fa/5cdb964d3e616efe032cf61f6dcc2a2ecf7032094c826b72d1d314adbcd7/grpcio-1.67.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:f623c57a5321461c84498a99dddf9d13dac0e40ee056d884d6ec4ebcab647a78", size = 5630134 }, + { url = "https://files.pythonhosted.org/packages/eb/10/127ecd1133b7f541228a937d3769a4c8fbcb47742eea2815d647518e1cf3/grpcio-1.67.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54d16383044e681f8beb50f905249e4e7261dd169d4aaf6e52eab67b01cbbbe2", size = 6238899 }, + { url = "https://files.pythonhosted.org/packages/af/dc/c740006554d0a3430e9909efc3a1269df170aca690774355d912ccb809b4/grpcio-1.67.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2a44e572fb762c668e4812156b81835f7aba8a721b027e2d4bb29fb50ff4d33", size = 5881489 }, + { url = "https://files.pythonhosted.org/packages/b7/8a/067bb3a6ac2951e3e751971d9c7ec92b6e26fade51d2f01a2b409ff1e570/grpcio-1.67.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:391df8b0faac84d42f5b8dfc65f5152c48ed914e13c522fd05f2aca211f8bfad", size = 6584282 }, + { url = "https://files.pythonhosted.org/packages/28/fe/538fec0df3884bcf66daab497aa43d67d3562568851b879b427e5fb5f0e5/grpcio-1.67.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cfd9306511fdfc623a1ba1dc3bc07fbd24e6cfbe3c28b4d1e05177baa2f99617", size = 6161337 }, + { url = "https://files.pythonhosted.org/packages/cc/99/c8fbe867c9d44d7d542c828a4220785d389e177369463d03dd0a85551c63/grpcio-1.67.0-cp39-cp39-win32.whl", hash = "sha256:30d47dbacfd20cbd0c8be9bfa52fdb833b395d4ec32fe5cff7220afc05d08571", size = 3615233 }, + { url = "https://files.pythonhosted.org/packages/fe/bb/a4257cfdbef14b0c6e2dfa6b8c0242dae460d276dee34eba9941c563cb83/grpcio-1.67.0-cp39-cp39-win_amd64.whl", hash = "sha256:f55f077685f61f0fbd06ea355142b71e47e4a26d2d678b3ba27248abfe67163a", size = 4351210 }, +] + +[[package]] +name = "h11" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, +] + +[[package]] +name = "httpcore" +version = "1.0.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b6/44/ed0fa6a17845fb033bd885c03e842f08c1b9406c86a2e60ac1ae1b9206a6/httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f", size = 85180 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/89/b161908e2f51be56568184aeb4a880fd287178d176fd1c860d2217f41106/httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f", size = 78011 }, +] + +[[package]] +name = "httpx" +version = "0.27.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, + { name = "sniffio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/82/08f8c936781f67d9e6b9eeb8a0c8b4e406136ea4c3d1f89a5db71d42e0e6/httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2", size = 144189 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0", size = 76395 }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, +] + +[[package]] +name = "importlib-resources" +version = "6.4.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/be/f3e8c6081b684f176b761e6a2fef02a0be939740ed6f54109a2951d806f3/importlib_resources-6.4.5.tar.gz", hash = "sha256:980862a1d16c9e147a59603677fa2aa5fd82b87f223b6cb870695bcfce830065", size = 43372 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/6a/4604f9ae2fa62ef47b9de2fa5ad599589d28c9fd1d335f32759813dfa91e/importlib_resources-6.4.5-py3-none-any.whl", hash = "sha256:ac29d5f956f01d5e4bb63102a5a19957f1b9175e45649977264a1416783bb717", size = 36115 }, +] + +[[package]] +name = "jmespath" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/00/2a/e867e8531cf3e36b41201936b7fa7ba7b5702dbef42922193f05c8976cd6/jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe", size = 25843 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", size = 20256 }, +] + +[[package]] +name = "jsonschema" +version = "4.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "importlib-resources", marker = "python_full_version < '3.9'" }, + { name = "jsonschema-specifications" }, + { name = "pkgutil-resolve-name", marker = "python_full_version < '3.9'" }, + { name = "referencing" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/2e/03362ee4034a4c917f697890ccd4aec0800ccf9ded7f511971c75451deec/jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4", size = 325778 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566", size = 88462 }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2023.12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "importlib-resources", marker = "python_full_version < '3.9'" }, + { name = "referencing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/b9/cc0cc592e7c195fb8a650c1d5990b10175cf13b4c97465c72ec841de9e4b/jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc", size = 13983 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/07/44bd408781594c4d0a027666ef27fab1e441b109dc3b76b4f836f8fd04fe/jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c", size = 18482 }, +] + +[[package]] +name = "lancedb" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "cachetools" }, + { name = "click" }, + { name = "deprecation" }, + { name = "overrides" }, + { name = "pydantic" }, + { name = "pylance" }, + { name = "pyyaml" }, + { name = "ratelimiter" }, + { name = "requests" }, + { name = "retry" }, + { name = "semver" }, + { name = "tqdm" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/04/1c90de120516d92dfff1df4b93f5ad855fa33b0418a70f687a5613343d39/lancedb-0.6.3-cp38-abi3-macosx_10_15_x86_64.whl", hash = "sha256:0d090eb3211d594b0025d3d0978c6999db4f79b30633309eaabe1423ac593a23", size = 18643569 }, + { url = "https://files.pythonhosted.org/packages/3d/76/d1a3d98d3f5f560cf1ab35b28dbe352971c7a04aede6fc35267426fc921d/lancedb-0.6.3-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:56e68a1fab85d5ed9e203fb88813b707248c272f3d36d60d6e47aec77896b226", size = 17184126 }, + { url = "https://files.pythonhosted.org/packages/a0/45/5b529183f51b0571b76760ad00344647f7c998e2d7c349375c336ad41d0c/lancedb-0.6.3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fde7bc38a451e7721d2f3d5f3f7da1b754f575e211a91e8df9b2c779387a090b", size = 21777946 }, + { url = "https://files.pythonhosted.org/packages/09/69/d41b44107f67231527d0d8c74f196d20c97bc20e392cb38e0582c8c2d06e/lancedb-0.6.3-cp38-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:643df736abb4f0fc076b55078cdbe52d5e4b44909775a3e0bc0abd71c9dac808", size = 19566881 }, + { url = "https://files.pythonhosted.org/packages/aa/c3/a51f068029fa1eb21b3e059ffc559650a57ed619a36b0b7396a096e52294/lancedb-0.6.3-cp38-abi3-win_amd64.whl", hash = "sha256:ca87b8f10b696265226fedd3d04546806eeffa81d47dc1fee0be7835ad023d7c", size = 20793431 }, +] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, +] + +[[package]] +name = "mmh3" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/63/96/aa247e82878b123468f0079ce2ac77e948315bab91ce45d2934a62e0af95/mmh3-4.1.0.tar.gz", hash = "sha256:a1cf25348b9acd229dda464a094d6170f47d2850a1fcb762a3b6172d2ce6ca4a", size = 26357 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/5a/8609dc74421858f7e94a89dc69221ab9b2c14d0d63a139b46ec190eedc44/mmh3-4.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:be5ac76a8b0cd8095784e51e4c1c9c318c19edcd1709a06eb14979c8d850c31a", size = 39433 }, + { url = "https://files.pythonhosted.org/packages/93/6c/e7a0f07c7082c76964b1ff46aa852f36e2ec6a9c3530dec0afa0b3162fc2/mmh3-4.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:98a49121afdfab67cd80e912b36404139d7deceb6773a83620137aaa0da5714c", size = 29280 }, + { url = "https://files.pythonhosted.org/packages/76/84/60ca728ec7d7e1779a98000d64941c6221786124b4f07bf105a627055890/mmh3-4.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5259ac0535874366e7d1a5423ef746e0d36a9e3c14509ce6511614bdc5a7ef5b", size = 30130 }, + { url = "https://files.pythonhosted.org/packages/2a/22/f2ec190b491f712d9ef5ea6252204b6f05255ac9af54a7b505adc3128aed/mmh3-4.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5950827ca0453a2be357696da509ab39646044e3fa15cad364eb65d78797437", size = 68837 }, + { url = "https://files.pythonhosted.org/packages/ae/b9/c1e8065671e1d2f4e280c9c57389e74964f4a5792cac26717ad592002c7d/mmh3-4.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1dd0f652ae99585b9dd26de458e5f08571522f0402155809fd1dc8852a613a39", size = 72275 }, + { url = "https://files.pythonhosted.org/packages/6b/18/92bbdb102ab2b4e80084e927187d871758280eb067c649693e42bfc6d0d1/mmh3-4.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99d25548070942fab1e4a6f04d1626d67e66d0b81ed6571ecfca511f3edf07e6", size = 70919 }, + { url = "https://files.pythonhosted.org/packages/e2/cd/391ce1d1bb559871a5d3a6bbb30b82bf51d3e3b42c4e8589cccb201953da/mmh3-4.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53db8d9bad3cb66c8f35cbc894f336273f63489ce4ac416634932e3cbe79eb5b", size = 65885 }, + { url = "https://files.pythonhosted.org/packages/03/87/4b01a43336bd506478850d1bc3d180648b2d26b4acf1fc4bf1df72bf562f/mmh3-4.1.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75da0f615eb55295a437264cc0b736753f830b09d102aa4c2a7d719bc445ec05", size = 67610 }, + { url = "https://files.pythonhosted.org/packages/e8/12/b464149a1b7181c7ce431ebf3d24fa994863f2f1abc75b78d202dde966e0/mmh3-4.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b926b07fd678ea84b3a2afc1fa22ce50aeb627839c44382f3d0291e945621e1a", size = 74888 }, + { url = "https://files.pythonhosted.org/packages/fc/3e/f4eb45a23fc17b970394c1fe74eba157514577ae2d63757684241651d754/mmh3-4.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c5b053334f9b0af8559d6da9dc72cef0a65b325ebb3e630c680012323c950bb6", size = 72969 }, + { url = "https://files.pythonhosted.org/packages/c0/3b/83934fd9494371357da0ca026d55ad427c199d611b97b6ffeecacfd8e720/mmh3-4.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:5bf33dc43cd6de2cb86e0aa73a1cc6530f557854bbbe5d59f41ef6de2e353d7b", size = 80338 }, + { url = "https://files.pythonhosted.org/packages/b6/c4/5bcd709ea7269173d7e925402f05e05cf12194ef53cc9912a5ad166f8ded/mmh3-4.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fa7eacd2b830727ba3dd65a365bed8a5c992ecd0c8348cf39a05cc77d22f4970", size = 76580 }, + { url = "https://files.pythonhosted.org/packages/da/6a/4c0680d64475e551d7f4cc78bf0fd247c711ed2717f6bb311934993d1e69/mmh3-4.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:42dfd6742b9e3eec599f85270617debfa0bbb913c545bb980c8a4fa7b2d047da", size = 75325 }, + { url = "https://files.pythonhosted.org/packages/70/bc/e2ed99e580b3dd121f6462147bd5f521c57b3c81c692aa2d416b0678c89f/mmh3-4.1.0-cp310-cp310-win32.whl", hash = "sha256:2974ad343f0d39dcc88e93ee6afa96cedc35a9883bc067febd7ff736e207fa47", size = 31235 }, + { url = "https://files.pythonhosted.org/packages/73/2b/3aec865da7feb52830782d9fb7c54115cc18815680c244301adf9080622f/mmh3-4.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:74699a8984ded645c1a24d6078351a056f5a5f1fe5838870412a68ac5e28d865", size = 31271 }, + { url = "https://files.pythonhosted.org/packages/17/2a/925439189ccf562bdcb839aed6263d718359f0c376d673beb3b83d3864ac/mmh3-4.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:f0dc874cedc23d46fc488a987faa6ad08ffa79e44fb08e3cd4d4cf2877c00a00", size = 30147 }, + { url = "https://files.pythonhosted.org/packages/2e/d6/86beea107e7e9700df9522466346c23a2f54faa81337c86fd17002aa95a6/mmh3-4.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3280a463855b0eae64b681cd5b9ddd9464b73f81151e87bb7c91a811d25619e6", size = 39427 }, + { url = "https://files.pythonhosted.org/packages/1c/08/65fa5489044e2afc304e8540c6c607d5d7b136ddc5cd8315c13de0adc34c/mmh3-4.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:97ac57c6c3301769e757d444fa7c973ceb002cb66534b39cbab5e38de61cd896", size = 29281 }, + { url = "https://files.pythonhosted.org/packages/b3/aa/98511d3ea3f6ba958136d913be3be3c1009be935a20ecc7b2763f0a605b6/mmh3-4.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a7b6502cdb4dbd880244818ab363c8770a48cdccecf6d729ade0241b736b5ec0", size = 30130 }, + { url = "https://files.pythonhosted.org/packages/3c/b7/1a93f81643435b0e57f1046c4ffe46f0214693eaede0d9b0a1a236776e70/mmh3-4.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52ba2da04671a9621580ddabf72f06f0e72c1c9c3b7b608849b58b11080d8f14", size = 69072 }, + { url = "https://files.pythonhosted.org/packages/45/9e/2ff70246aefd9cf146bc6a420c28ed475a0d1a325f31ee203be02f9215d4/mmh3-4.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a5fef4c4ecc782e6e43fbeab09cff1bac82c998a1773d3a5ee6a3605cde343e", size = 72470 }, + { url = "https://files.pythonhosted.org/packages/dc/cb/57bc1fdbdbe6837aebfca982494e23e2498ee2a89585c9054713b22e4167/mmh3-4.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5135358a7e00991f73b88cdc8eda5203bf9de22120d10a834c5761dbeb07dd13", size = 71251 }, + { url = "https://files.pythonhosted.org/packages/4d/c2/46d7d2721b69fbdfd30231309e6395f62ff6744e5c00dd8113b9faa06fba/mmh3-4.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cff9ae76a54f7c6fe0167c9c4028c12c1f6de52d68a31d11b6790bb2ae685560", size = 66035 }, + { url = "https://files.pythonhosted.org/packages/6f/a4/7ba4bcc838818bcf018e26d118d5ddb605c23c4fad040dc4d811f1cfcb04/mmh3-4.1.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f02576a4d106d7830ca90278868bf0983554dd69183b7bbe09f2fcd51cf54f", size = 67844 }, + { url = "https://files.pythonhosted.org/packages/71/ed/8e80d1038e7bb15eaf739711d1fc36f2341acb6b1b95fa77003f2799c91e/mmh3-4.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:073d57425a23721730d3ff5485e2da489dd3c90b04e86243dd7211f889898106", size = 76724 }, + { url = "https://files.pythonhosted.org/packages/1c/22/a6a70ca81f0ce8fe2f3a68d89c1184c2d2d0fbe0ee305da50e972c5ff9fa/mmh3-4.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:71e32ddec7f573a1a0feb8d2cf2af474c50ec21e7a8263026e8d3b4b629805db", size = 75004 }, + { url = "https://files.pythonhosted.org/packages/73/20/abe50b605760f1f5b6e0b436c650649e69ca478d0f41b154f300367c09e4/mmh3-4.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7cbb20b29d57e76a58b40fd8b13a9130db495a12d678d651b459bf61c0714cea", size = 82230 }, + { url = "https://files.pythonhosted.org/packages/45/80/a1fc99d3ee50b573df0bfbb1ad518463af78d2ebca44bfca3b3f9473d651/mmh3-4.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:a42ad267e131d7847076bb7e31050f6c4378cd38e8f1bf7a0edd32f30224d5c9", size = 78679 }, + { url = "https://files.pythonhosted.org/packages/9e/51/6c9ee2ddf3b386f45ff83b6926a5e826635757d91dab04cbf16eee05f9a7/mmh3-4.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4a013979fc9390abadc445ea2527426a0e7a4495c19b74589204f9b71bcaafeb", size = 77382 }, + { url = "https://files.pythonhosted.org/packages/ee/fa/4b377f244c27fac5f0343cc4dc0d2eb0a08049afc8d5322d07be7461a768/mmh3-4.1.0-cp311-cp311-win32.whl", hash = "sha256:1d3b1cdad7c71b7b88966301789a478af142bddcb3a2bee563f7a7d40519a00f", size = 31232 }, + { url = "https://files.pythonhosted.org/packages/d1/b0/500ef56c29b276d796bfdb47c16d34fa18a68945e4d730a6fa7d483583ed/mmh3-4.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:0dc6dc32eb03727467da8e17deffe004fbb65e8b5ee2b502d36250d7a3f4e2ec", size = 31276 }, + { url = "https://files.pythonhosted.org/packages/cc/84/94795e6e710c3861f8f355a12be9c9f4b8433a538c983e75bd4c00496a8a/mmh3-4.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:9ae3a5c1b32dda121c7dc26f9597ef7b01b4c56a98319a7fe86c35b8bc459ae6", size = 30142 }, + { url = "https://files.pythonhosted.org/packages/18/45/b4d41e86b00eed8c500adbe0007129861710e181c7f49c507ef6beae9496/mmh3-4.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0033d60c7939168ef65ddc396611077a7268bde024f2c23bdc283a19123f9e9c", size = 39495 }, + { url = "https://files.pythonhosted.org/packages/a6/d4/f041b8704cb8d1aad3717105daa582e29818b78a540622dfed84cd00d88f/mmh3-4.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d6af3e2287644b2b08b5924ed3a88c97b87b44ad08e79ca9f93d3470a54a41c5", size = 29334 }, + { url = "https://files.pythonhosted.org/packages/cb/bb/8f75378e1a83b323f9ed06248333c383e7dac614c2f95e1419965cb91693/mmh3-4.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d82eb4defa245e02bb0b0dc4f1e7ee284f8d212633389c91f7fba99ba993f0a2", size = 30144 }, + { url = "https://files.pythonhosted.org/packages/3e/50/5e36c1945bd83e780a37361fc1999fc4c5a59ecc10a373557fdf0e58eb1f/mmh3-4.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba245e94b8d54765e14c2d7b6214e832557e7856d5183bc522e17884cab2f45d", size = 69094 }, + { url = "https://files.pythonhosted.org/packages/70/c7/6ae37e7519a938226469476b84bcea2650e2a2cc7a848e6a206ea98ecee3/mmh3-4.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb04e2feeabaad6231e89cd43b3d01a4403579aa792c9ab6fdeef45cc58d4ec0", size = 72611 }, + { url = "https://files.pythonhosted.org/packages/5e/47/6613f69f57f1e5045e66b22fae9c2fb39ef754c455805d3917f6073e316e/mmh3-4.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e3b1a27def545ce11e36158ba5d5390cdbc300cfe456a942cc89d649cf7e3b2", size = 71462 }, + { url = "https://files.pythonhosted.org/packages/e0/0a/e423db18ce7b479c4b96381a112b443f0985c611de420f95c58a9f934080/mmh3-4.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce0ab79ff736d7044e5e9b3bfe73958a55f79a4ae672e6213e92492ad5e734d5", size = 66165 }, + { url = "https://files.pythonhosted.org/packages/4c/7b/bfeb68bee5bddc8baf7ef630b93edc0a533202d84eb076dbb6c77e7e5fd5/mmh3-4.1.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b02268be6e0a8eeb8a924d7db85f28e47344f35c438c1e149878bb1c47b1cd3", size = 68088 }, + { url = "https://files.pythonhosted.org/packages/d4/a6/b82e30143997c05776887f5177f724e3b714aa7e7346fbe2ec70f52abcd0/mmh3-4.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:deb887f5fcdaf57cf646b1e062d56b06ef2f23421c80885fce18b37143cba828", size = 76241 }, + { url = "https://files.pythonhosted.org/packages/6c/60/a3d5872cf7610fcb13e36c472476020c5cf217b23c092bad452eb7784407/mmh3-4.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99dd564e9e2b512eb117bd0cbf0f79a50c45d961c2a02402787d581cec5448d5", size = 74538 }, + { url = "https://files.pythonhosted.org/packages/f6/d5/742173a94c78f4edab71c04097f6f9150c47f8fd034d592f5f34a9444719/mmh3-4.1.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:08373082dfaa38fe97aa78753d1efd21a1969e51079056ff552e687764eafdfe", size = 81793 }, + { url = "https://files.pythonhosted.org/packages/d0/7a/a1db0efe7c67b761d83be3d50e35ef26628ef56b3b8bc776d07412ee8b16/mmh3-4.1.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:54b9c6a2ea571b714e4fe28d3e4e2db37abfd03c787a58074ea21ee9a8fd1740", size = 78217 }, + { url = "https://files.pythonhosted.org/packages/b3/78/1ff8da7c859cd09704e2f500588d171eda9688fcf6f29e028ef261262a16/mmh3-4.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a7b1edf24c69e3513f879722b97ca85e52f9032f24a52284746877f6a7304086", size = 77052 }, + { url = "https://files.pythonhosted.org/packages/ed/c7/cf16ace81fc9fbe54a75c914306252af26c6ea485366bb3b579bf6e3dbb8/mmh3-4.1.0-cp312-cp312-win32.whl", hash = "sha256:411da64b951f635e1e2284b71d81a5a83580cea24994b328f8910d40bed67276", size = 31277 }, + { url = "https://files.pythonhosted.org/packages/d2/0b/b3b1637dca9414451edf287fd91e667e7231d5ffd7498137fe011951fc0a/mmh3-4.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:bebc3ecb6ba18292e3d40c8712482b4477abd6981c2ebf0e60869bd90f8ac3a9", size = 31318 }, + { url = "https://files.pythonhosted.org/packages/dd/6c/c0f06040c58112ccbd0df989055ede98f7c1a1f392dc6a3fc63ec6c124ec/mmh3-4.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:168473dd608ade6a8d2ba069600b35199a9af837d96177d3088ca91f2b3798e3", size = 30147 }, + { url = "https://files.pythonhosted.org/packages/a5/ee/95849aef81d7c781dae428c77a4376d54e43e3135e93c865c871ede903bf/mmh3-4.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:372f4b7e1dcde175507640679a2a8790185bb71f3640fc28a4690f73da986a3b", size = 39388 }, + { url = "https://files.pythonhosted.org/packages/16/08/6c0c63801bfa9c210e15bf35f8c2eec538f4b85bac2f0684c40aba0f0023/mmh3-4.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:438584b97f6fe13e944faf590c90fc127682b57ae969f73334040d9fa1c7ffa5", size = 29224 }, + { url = "https://files.pythonhosted.org/packages/14/47/0f55405b74c081d870dffde67fd3403f25dbe4b1748e9bf1835eb2f6912e/mmh3-4.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6e27931b232fc676675fac8641c6ec6b596daa64d82170e8597f5a5b8bdcd3b6", size = 30141 }, + { url = "https://files.pythonhosted.org/packages/f3/4d/08f59e29596b4dccdf598cf11d1eb8a126fc8f7456924c225166d6cf1c78/mmh3-4.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:571a92bad859d7b0330e47cfd1850b76c39b615a8d8e7aa5853c1f971fd0c4b1", size = 68883 }, + { url = "https://files.pythonhosted.org/packages/91/d2/334a308c0bba0df9ee4603145b50f7eb9ce6ba2ad592bac839f6914a7a6b/mmh3-4.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a69d6afe3190fa08f9e3a58e5145549f71f1f3fff27bd0800313426929c7068", size = 72197 }, + { url = "https://files.pythonhosted.org/packages/dc/64/2f8f319ba9962d69fc834125e37e13ba00ec1a9af0c414d905f56119b1b1/mmh3-4.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:afb127be0be946b7630220908dbea0cee0d9d3c583fa9114a07156f98566dc28", size = 71109 }, + { url = "https://files.pythonhosted.org/packages/95/ee/8a5c88609d4fb77076db21843d535ad857a5c69aff0d39d9b2d485bb5c36/mmh3-4.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:940d86522f36348ef1a494cbf7248ab3f4a1638b84b59e6c9e90408bd11ad729", size = 66130 }, + { url = "https://files.pythonhosted.org/packages/f1/94/d85f9de8bafb3ccb93b4025da9f36430b71bdcb35f28d98a411945859000/mmh3-4.1.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3dcccc4935686619a8e3d1f7b6e97e3bd89a4a796247930ee97d35ea1a39341", size = 67691 }, + { url = "https://files.pythonhosted.org/packages/aa/d8/4fc1e4153196777b322a609c49462e54170449078236df98786d1b161a29/mmh3-4.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01bb9b90d61854dfc2407c5e5192bfb47222d74f29d140cb2dd2a69f2353f7cc", size = 74885 }, + { url = "https://files.pythonhosted.org/packages/ab/c0/6bd289170b5c8779877cf9d26d407f95378ee082abda8a2ea2591641d373/mmh3-4.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:bcb1b8b951a2c0b0fb8a5426c62a22557e2ffc52539e0a7cc46eb667b5d606a9", size = 72783 }, + { url = "https://files.pythonhosted.org/packages/86/71/376f74e8fcd6ee42c6c817499a891a50fc1de01fe889e4cf55f63e056bf4/mmh3-4.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6477a05d5e5ab3168e82e8b106e316210ac954134f46ec529356607900aea82a", size = 80188 }, + { url = "https://files.pythonhosted.org/packages/8b/29/5826f65d846fd8a97500bdd998a8a4ad05339f75923fd4d1524f5b62362b/mmh3-4.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:da5892287e5bea6977364b15712a2573c16d134bc5fdcdd4cf460006cf849278", size = 76536 }, + { url = "https://files.pythonhosted.org/packages/ab/5c/7c521836df48f3dbcf625042bce40f5e44d32c97309541b4b8452e5e41a4/mmh3-4.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:99180d7fd2327a6fffbaff270f760576839dc6ee66d045fa3a450f3490fda7f5", size = 75303 }, + { url = "https://files.pythonhosted.org/packages/0f/b6/b5db6bab2b72486ca36e8e59465a7e77e223edc1e127e930e40b17672427/mmh3-4.1.0-cp38-cp38-win32.whl", hash = "sha256:9b0d4f3949913a9f9a8fb1bb4cc6ecd52879730aab5ff8c5a3d8f5b593594b73", size = 31242 }, + { url = "https://files.pythonhosted.org/packages/9b/40/4b4995eb79aa71a9f373cde713c1a03d03ce5e3b97810882e16d109787de/mmh3-4.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:598c352da1d945108aee0c3c3cfdd0e9b3edef74108f53b49d481d3990402169", size = 31307 }, + { url = "https://files.pythonhosted.org/packages/c6/a0/ec7ef6b2fdf577350f12be924c99e7a6cb32d7e4144a933607645b890174/mmh3-4.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:475d6d1445dd080f18f0f766277e1237fa2914e5fe3307a3b2a3044f30892103", size = 39437 }, + { url = "https://files.pythonhosted.org/packages/b7/23/26adff10bbfdb692355893e47cfdf0392ad8c4200f79a039dc7ba3c9c983/mmh3-4.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5ca07c41e6a2880991431ac717c2a049056fff497651a76e26fc22224e8b5732", size = 29280 }, + { url = "https://files.pythonhosted.org/packages/fa/69/d32240aeac0f5b1b7316cf583069be880550fc171f2ba10d579b254f121e/mmh3-4.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ebe052fef4bbe30c0548d12ee46d09f1b69035ca5208a7075e55adfe091be44", size = 30134 }, + { url = "https://files.pythonhosted.org/packages/1f/2f/acacf53cae23f16100267e36ca20aa814016502e8de30efed71ac4b31c1b/mmh3-4.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eaefd42e85afb70f2b855a011f7b4d8a3c7e19c3f2681fa13118e4d8627378c5", size = 68596 }, + { url = "https://files.pythonhosted.org/packages/47/ad/edd29f09bf2d22e384c36b9d854da0d3c5c19280463ccf1eba99a47e1334/mmh3-4.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0ae43caae5a47afe1b63a1ae3f0986dde54b5fb2d6c29786adbfb8edc9edfb", size = 72048 }, + { url = "https://files.pythonhosted.org/packages/c7/5d/0e9886147b1595ab702ff98a0920e1bd4eab4e6672edd7463a4ba6e5c5c4/mmh3-4.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6218666f74c8c013c221e7f5f8a693ac9cf68e5ac9a03f2373b32d77c48904de", size = 70725 }, + { url = "https://files.pythonhosted.org/packages/e1/5a/329aa48261fcca6d4b45ebf27a8d97e1ad2765a074792e8b9693f8a75459/mmh3-4.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac59294a536ba447b5037f62d8367d7d93b696f80671c2c45645fa9f1109413c", size = 65639 }, + { url = "https://files.pythonhosted.org/packages/0b/ba/b95031f05913f531be54ea6707a1c74e07f8b266c89711916cc1fc85aaa2/mmh3-4.1.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:086844830fcd1e5c84fec7017ea1ee8491487cfc877847d96f86f68881569d2e", size = 67372 }, + { url = "https://files.pythonhosted.org/packages/d3/5c/29db27fadce699e754627c10ea4edd182dd22d8fd6dfc900dd03c063c5bf/mmh3-4.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e42b38fad664f56f77f6fbca22d08450f2464baa68acdbf24841bf900eb98e87", size = 74482 }, + { url = "https://files.pythonhosted.org/packages/46/bd/47ed39b1fd4d405a53210f11e2243661be9d674ba3b835b5147863cb1e30/mmh3-4.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d08b790a63a9a1cde3b5d7d733ed97d4eb884bfbc92f075a091652d6bfd7709a", size = 72602 }, + { url = "https://files.pythonhosted.org/packages/54/5d/4d2c50b230093bddaf0c86b5b7199ad76a4fbcd88316e2bfa2ec27f381fa/mmh3-4.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:73ea4cc55e8aea28c86799ecacebca09e5f86500414870a8abaedfcbaf74d288", size = 79982 }, + { url = "https://files.pythonhosted.org/packages/c5/36/8f76b218d7def40104cc78470c136d7852e139bbed85bc740453475a0bdb/mmh3-4.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:f90938ff137130e47bcec8dc1f4ceb02f10178c766e2ef58a9f657ff1f62d124", size = 76232 }, + { url = "https://files.pythonhosted.org/packages/5f/1f/770a31814855d3324419ad7e51ba89c7bbd4d818277a60795ea26450cc16/mmh3-4.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:aa1f13e94b8631c8cd53259250556edcf1de71738936b60febba95750d9632bd", size = 74931 }, + { url = "https://files.pythonhosted.org/packages/2a/93/b905236459126bd498f7dae3a5ff86fc5c848852ae34bccc1dc45f6c3619/mmh3-4.1.0-cp39-cp39-win32.whl", hash = "sha256:a3b680b471c181490cf82da2142029edb4298e1bdfcb67c76922dedef789868d", size = 31240 }, + { url = "https://files.pythonhosted.org/packages/69/0a/25d58e35e0be0d8f5a85ee2b6dbfb90617273078b4a1e8818b748634a8eb/mmh3-4.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:fefef92e9c544a8dbc08f77a8d1b6d48006a750c4375bbcd5ff8199d761e263b", size = 31285 }, + { url = "https://files.pythonhosted.org/packages/bc/36/0308f4065d6ce635098c8a395ec3306874267fa6402128dfe690f8199a85/mmh3-4.1.0-cp39-cp39-win_arm64.whl", hash = "sha256:8e2c1f6a2b41723a4f82bd5a762a777836d29d664fc0095f17910bea0adfd4a6", size = 30146 }, +] + +[[package]] +name = "msgpack" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/d0/7555686ae7ff5731205df1012ede15dd9d927f6227ea151e901c7406af4f/msgpack-1.1.0.tar.gz", hash = "sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e", size = 167260 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/f9/a892a6038c861fa849b11a2bb0502c07bc698ab6ea53359e5771397d883b/msgpack-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ad442d527a7e358a469faf43fda45aaf4ac3249c8310a82f0ccff9164e5dccd", size = 150428 }, + { url = "https://files.pythonhosted.org/packages/df/7a/d174cc6a3b6bb85556e6a046d3193294a92f9a8e583cdbd46dc8a1d7e7f4/msgpack-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:74bed8f63f8f14d75eec75cf3d04ad581da6b914001b474a5d3cd3372c8cc27d", size = 84131 }, + { url = "https://files.pythonhosted.org/packages/08/52/bf4fbf72f897a23a56b822997a72c16de07d8d56d7bf273242f884055682/msgpack-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:914571a2a5b4e7606997e169f64ce53a8b1e06f2cf2c3a7273aa106236d43dd5", size = 81215 }, + { url = "https://files.pythonhosted.org/packages/02/95/dc0044b439b518236aaf012da4677c1b8183ce388411ad1b1e63c32d8979/msgpack-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c921af52214dcbb75e6bdf6a661b23c3e6417f00c603dd2070bccb5c3ef499f5", size = 371229 }, + { url = "https://files.pythonhosted.org/packages/ff/75/09081792db60470bef19d9c2be89f024d366b1e1973c197bb59e6aabc647/msgpack-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8ce0b22b890be5d252de90d0e0d119f363012027cf256185fc3d474c44b1b9e", size = 378034 }, + { url = "https://files.pythonhosted.org/packages/32/d3/c152e0c55fead87dd948d4b29879b0f14feeeec92ef1fd2ec21b107c3f49/msgpack-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73322a6cc57fcee3c0c57c4463d828e9428275fb85a27aa2aa1a92fdc42afd7b", size = 363070 }, + { url = "https://files.pythonhosted.org/packages/d9/2c/82e73506dd55f9e43ac8aa007c9dd088c6f0de2aa19e8f7330e6a65879fc/msgpack-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e1f3c3d21f7cf67bcf2da8e494d30a75e4cf60041d98b3f79875afb5b96f3a3f", size = 359863 }, + { url = "https://files.pythonhosted.org/packages/cb/a0/3d093b248837094220e1edc9ec4337de3443b1cfeeb6e0896af8ccc4cc7a/msgpack-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64fc9068d701233effd61b19efb1485587560b66fe57b3e50d29c5d78e7fef68", size = 368166 }, + { url = "https://files.pythonhosted.org/packages/e4/13/7646f14f06838b406cf5a6ddbb7e8dc78b4996d891ab3b93c33d1ccc8678/msgpack-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:42f754515e0f683f9c79210a5d1cad631ec3d06cea5172214d2176a42e67e19b", size = 370105 }, + { url = "https://files.pythonhosted.org/packages/67/fa/dbbd2443e4578e165192dabbc6a22c0812cda2649261b1264ff515f19f15/msgpack-1.1.0-cp310-cp310-win32.whl", hash = "sha256:3df7e6b05571b3814361e8464f9304c42d2196808e0119f55d0d3e62cd5ea044", size = 68513 }, + { url = "https://files.pythonhosted.org/packages/24/ce/c2c8fbf0ded750cb63cbcbb61bc1f2dfd69e16dca30a8af8ba80ec182dcd/msgpack-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:685ec345eefc757a7c8af44a3032734a739f8c45d1b0ac45efc5d8977aa4720f", size = 74687 }, + { url = "https://files.pythonhosted.org/packages/b7/5e/a4c7154ba65d93be91f2f1e55f90e76c5f91ccadc7efc4341e6f04c8647f/msgpack-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d364a55082fb2a7416f6c63ae383fbd903adb5a6cf78c5b96cc6316dc1cedc7", size = 150803 }, + { url = "https://files.pythonhosted.org/packages/60/c2/687684164698f1d51c41778c838d854965dd284a4b9d3a44beba9265c931/msgpack-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79ec007767b9b56860e0372085f8504db5d06bd6a327a335449508bbee9648fa", size = 84343 }, + { url = "https://files.pythonhosted.org/packages/42/ae/d3adea9bb4a1342763556078b5765e666f8fdf242e00f3f6657380920972/msgpack-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ad622bf7756d5a497d5b6836e7fc3752e2dd6f4c648e24b1803f6048596f701", size = 81408 }, + { url = "https://files.pythonhosted.org/packages/dc/17/6313325a6ff40ce9c3207293aee3ba50104aed6c2c1559d20d09e5c1ff54/msgpack-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e59bca908d9ca0de3dc8684f21ebf9a690fe47b6be93236eb40b99af28b6ea6", size = 396096 }, + { url = "https://files.pythonhosted.org/packages/a8/a1/ad7b84b91ab5a324e707f4c9761633e357820b011a01e34ce658c1dda7cc/msgpack-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1da8f11a3dd397f0a32c76165cf0c4eb95b31013a94f6ecc0b280c05c91b59", size = 403671 }, + { url = "https://files.pythonhosted.org/packages/bb/0b/fd5b7c0b308bbf1831df0ca04ec76fe2f5bf6319833646b0a4bd5e9dc76d/msgpack-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452aff037287acb1d70a804ffd022b21fa2bb7c46bee884dbc864cc9024128a0", size = 387414 }, + { url = "https://files.pythonhosted.org/packages/f0/03/ff8233b7c6e9929a1f5da3c7860eccd847e2523ca2de0d8ef4878d354cfa/msgpack-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8da4bf6d54ceed70e8861f833f83ce0814a2b72102e890cbdfe4b34764cdd66e", size = 383759 }, + { url = "https://files.pythonhosted.org/packages/1f/1b/eb82e1fed5a16dddd9bc75f0854b6e2fe86c0259c4353666d7fab37d39f4/msgpack-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:41c991beebf175faf352fb940bf2af9ad1fb77fd25f38d9142053914947cdbf6", size = 394405 }, + { url = "https://files.pythonhosted.org/packages/90/2e/962c6004e373d54ecf33d695fb1402f99b51832631e37c49273cc564ffc5/msgpack-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a52a1f3a5af7ba1c9ace055b659189f6c669cf3657095b50f9602af3a3ba0fe5", size = 396041 }, + { url = "https://files.pythonhosted.org/packages/f8/20/6e03342f629474414860c48aeffcc2f7f50ddaf351d95f20c3f1c67399a8/msgpack-1.1.0-cp311-cp311-win32.whl", hash = "sha256:58638690ebd0a06427c5fe1a227bb6b8b9fdc2bd07701bec13c2335c82131a88", size = 68538 }, + { url = "https://files.pythonhosted.org/packages/aa/c4/5a582fc9a87991a3e6f6800e9bb2f3c82972912235eb9539954f3e9997c7/msgpack-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fd2906780f25c8ed5d7b323379f6138524ba793428db5d0e9d226d3fa6aa1788", size = 74871 }, + { url = "https://files.pythonhosted.org/packages/e1/d6/716b7ca1dbde63290d2973d22bbef1b5032ca634c3ff4384a958ec3f093a/msgpack-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d", size = 152421 }, + { url = "https://files.pythonhosted.org/packages/70/da/5312b067f6773429cec2f8f08b021c06af416bba340c912c2ec778539ed6/msgpack-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2", size = 85277 }, + { url = "https://files.pythonhosted.org/packages/28/51/da7f3ae4462e8bb98af0d5bdf2707f1b8c65a0d4f496e46b6afb06cbc286/msgpack-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420", size = 82222 }, + { url = "https://files.pythonhosted.org/packages/33/af/dc95c4b2a49cff17ce47611ca9ba218198806cad7796c0b01d1e332c86bb/msgpack-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2", size = 392971 }, + { url = "https://files.pythonhosted.org/packages/f1/54/65af8de681fa8255402c80eda2a501ba467921d5a7a028c9c22a2c2eedb5/msgpack-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39", size = 401403 }, + { url = "https://files.pythonhosted.org/packages/97/8c/e333690777bd33919ab7024269dc3c41c76ef5137b211d776fbb404bfead/msgpack-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f", size = 385356 }, + { url = "https://files.pythonhosted.org/packages/57/52/406795ba478dc1c890559dd4e89280fa86506608a28ccf3a72fbf45df9f5/msgpack-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247", size = 383028 }, + { url = "https://files.pythonhosted.org/packages/e7/69/053b6549bf90a3acadcd8232eae03e2fefc87f066a5b9fbb37e2e608859f/msgpack-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c", size = 391100 }, + { url = "https://files.pythonhosted.org/packages/23/f0/d4101d4da054f04274995ddc4086c2715d9b93111eb9ed49686c0f7ccc8a/msgpack-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b", size = 394254 }, + { url = "https://files.pythonhosted.org/packages/1c/12/cf07458f35d0d775ff3a2dc5559fa2e1fcd06c46f1ef510e594ebefdca01/msgpack-1.1.0-cp312-cp312-win32.whl", hash = "sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b", size = 69085 }, + { url = "https://files.pythonhosted.org/packages/73/80/2708a4641f7d553a63bc934a3eb7214806b5b39d200133ca7f7afb0a53e8/msgpack-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f", size = 75347 }, + { url = "https://files.pythonhosted.org/packages/c8/b0/380f5f639543a4ac413e969109978feb1f3c66e931068f91ab6ab0f8be00/msgpack-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:071603e2f0771c45ad9bc65719291c568d4edf120b44eb36324dcb02a13bfddf", size = 151142 }, + { url = "https://files.pythonhosted.org/packages/c8/ee/be57e9702400a6cb2606883d55b05784fada898dfc7fd12608ab1fdb054e/msgpack-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0f92a83b84e7c0749e3f12821949d79485971f087604178026085f60ce109330", size = 84523 }, + { url = "https://files.pythonhosted.org/packages/7e/3a/2919f63acca3c119565449681ad08a2f84b2171ddfcff1dba6959db2cceb/msgpack-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1964df7b81285d00a84da4e70cb1383f2e665e0f1f2a7027e683956d04b734", size = 81556 }, + { url = "https://files.pythonhosted.org/packages/7c/43/a11113d9e5c1498c145a8925768ea2d5fce7cbab15c99cda655aa09947ed/msgpack-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59caf6a4ed0d164055ccff8fe31eddc0ebc07cf7326a2aaa0dbf7a4001cd823e", size = 392105 }, + { url = "https://files.pythonhosted.org/packages/2d/7b/2c1d74ca6c94f70a1add74a8393a0138172207dc5de6fc6269483519d048/msgpack-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0907e1a7119b337971a689153665764adc34e89175f9a34793307d9def08e6ca", size = 399979 }, + { url = "https://files.pythonhosted.org/packages/82/8c/cf64ae518c7b8efc763ca1f1348a96f0e37150061e777a8ea5430b413a74/msgpack-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65553c9b6da8166e819a6aa90ad15288599b340f91d18f60b2061f402b9a4915", size = 383816 }, + { url = "https://files.pythonhosted.org/packages/69/86/a847ef7a0f5ef3fa94ae20f52a4cacf596a4e4a010197fbcc27744eb9a83/msgpack-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7a946a8992941fea80ed4beae6bff74ffd7ee129a90b4dd5cf9c476a30e9708d", size = 380973 }, + { url = "https://files.pythonhosted.org/packages/aa/90/c74cf6e1126faa93185d3b830ee97246ecc4fe12cf9d2d31318ee4246994/msgpack-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4b51405e36e075193bc051315dbf29168d6141ae2500ba8cd80a522964e31434", size = 387435 }, + { url = "https://files.pythonhosted.org/packages/7a/40/631c238f1f338eb09f4acb0f34ab5862c4e9d7eda11c1b685471a4c5ea37/msgpack-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4c01941fd2ff87c2a934ee6055bda4ed353a7846b8d4f341c428109e9fcde8c", size = 399082 }, + { url = "https://files.pythonhosted.org/packages/e9/1b/fa8a952be252a1555ed39f97c06778e3aeb9123aa4cccc0fd2acd0b4e315/msgpack-1.1.0-cp313-cp313-win32.whl", hash = "sha256:7c9a35ce2c2573bada929e0b7b3576de647b0defbd25f5139dcdaba0ae35a4cc", size = 69037 }, + { url = "https://files.pythonhosted.org/packages/b6/bc/8bd826dd03e022153bfa1766dcdec4976d6c818865ed54223d71f07862b3/msgpack-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f", size = 75140 }, + { url = "https://files.pythonhosted.org/packages/77/68/6ddc40189295de4363af0597ecafb822ca7636ed1e91626f294cc8bc0d91/msgpack-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c40ffa9a15d74e05ba1fe2681ea33b9caffd886675412612d93ab17b58ea2fec", size = 375795 }, + { url = "https://files.pythonhosted.org/packages/55/f6/d4859a158a915be52eecd52dee9761ab3a5d84c834a1d13ffc198e068a48/msgpack-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1ba6136e650898082d9d5a5217d5906d1e138024f836ff48691784bbe1adf96", size = 381539 }, + { url = "https://files.pythonhosted.org/packages/98/6c/3b89221b0f6b2fd92572bd752545fc96ca4e494b76e2a02be8da56451909/msgpack-1.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0856a2b7e8dcb874be44fea031d22e5b3a19121be92a1e098f46068a11b0870", size = 369353 }, + { url = "https://files.pythonhosted.org/packages/ed/a1/16bd86502f1572a14c6ccfa057306be7f94ea3081ffec652308036cefbd2/msgpack-1.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:471e27a5787a2e3f974ba023f9e265a8c7cfd373632247deb225617e3100a3c7", size = 364560 }, + { url = "https://files.pythonhosted.org/packages/46/72/0454fa773fc4977ca70ae45471e38b1ab0cd831bef1990e9283d8683fe18/msgpack-1.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:646afc8102935a388ffc3914b336d22d1c2d6209c773f3eb5dd4d6d3b6f8c1cb", size = 374203 }, + { url = "https://files.pythonhosted.org/packages/fd/2f/885932948ec2f51509691684842f5870f960d908373744070400ac56e2d0/msgpack-1.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:13599f8829cfbe0158f6456374e9eea9f44eee08076291771d8ae93eda56607f", size = 375978 }, + { url = "https://files.pythonhosted.org/packages/37/60/1f79ed762cb2af7ab17bf8f6d7270e022aa26cff06facaf48a82b2c13473/msgpack-1.1.0-cp38-cp38-win32.whl", hash = "sha256:8a84efb768fb968381e525eeeb3d92857e4985aacc39f3c47ffd00eb4509315b", size = 68763 }, + { url = "https://files.pythonhosted.org/packages/a4/b7/1517b4d65caf3394c0e5f4e557dda8eaaed2ad00b4517b7d4c7c2bc86f77/msgpack-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:879a7b7b0ad82481c52d3c7eb99bf6f0645dbdec5134a4bddbd16f3506947feb", size = 74910 }, + { url = "https://files.pythonhosted.org/packages/f7/3b/544a5c5886042b80e1f4847a4757af3430f60d106d8d43bb7be72c9e9650/msgpack-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:53258eeb7a80fc46f62fd59c876957a2d0e15e6449a9e71842b6d24419d88ca1", size = 150713 }, + { url = "https://files.pythonhosted.org/packages/93/af/d63f25bcccd3d6f06fd518ba4a321f34a4370c67b579ca5c70b4a37721b4/msgpack-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e7b853bbc44fb03fbdba34feb4bd414322180135e2cb5164f20ce1c9795ee48", size = 84277 }, + { url = "https://files.pythonhosted.org/packages/92/9b/5c0dfb0009b9f96328664fecb9f8e4e9c8a1ae919e6d53986c1b813cb493/msgpack-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3e9b4936df53b970513eac1758f3882c88658a220b58dcc1e39606dccaaf01c", size = 81357 }, + { url = "https://files.pythonhosted.org/packages/d1/7c/3a9ee6ec9fc3e47681ad39b4d344ee04ff20a776b594fba92d88d8b68356/msgpack-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46c34e99110762a76e3911fc923222472c9d681f1094096ac4102c18319e6468", size = 371256 }, + { url = "https://files.pythonhosted.org/packages/f7/0a/8a213cecea7b731c540f25212ba5f9a818f358237ac51a44d448bd753690/msgpack-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a706d1e74dd3dea05cb54580d9bd8b2880e9264856ce5068027eed09680aa74", size = 377868 }, + { url = "https://files.pythonhosted.org/packages/1b/94/a82b0db0981e9586ed5af77d6cfb343da05d7437dceaae3b35d346498110/msgpack-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:534480ee5690ab3cbed89d4c8971a5c631b69a8c0883ecfea96c19118510c846", size = 363370 }, + { url = "https://files.pythonhosted.org/packages/93/fc/6c7f0dcc1c913e14861e16eaf494c07fc1dde454ec726ff8cebcf348ae53/msgpack-1.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8cf9e8c3a2153934a23ac160cc4cba0ec035f6867c8013cc6077a79823370346", size = 358970 }, + { url = "https://files.pythonhosted.org/packages/1f/c6/e4a04c0089deace870dabcdef5c9f12798f958e2e81d5012501edaff342f/msgpack-1.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3180065ec2abbe13a4ad37688b61b99d7f9e012a535b930e0e683ad6bc30155b", size = 366358 }, + { url = "https://files.pythonhosted.org/packages/b6/54/7d8317dac590cf16b3e08e3fb74d2081e5af44eb396f0effa13f17777f30/msgpack-1.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c5a91481a3cc573ac8c0d9aace09345d989dc4a0202b7fcb312c88c26d4e71a8", size = 370336 }, + { url = "https://files.pythonhosted.org/packages/dc/6f/a5a1f43b6566831e9630e5bc5d86034a8884386297302be128402555dde1/msgpack-1.1.0-cp39-cp39-win32.whl", hash = "sha256:f80bc7d47f76089633763f952e67f8214cb7b3ee6bfa489b3cb6a84cfac114cd", size = 68683 }, + { url = "https://files.pythonhosted.org/packages/5f/e8/2162621e18dbc36e2bc8492fd0e97b3975f5d89fe0472ae6d5f7fbdd8cf7/msgpack-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:4d1b7ff2d6146e16e8bd665ac726a89c74163ef8cd39fa8c1087d4e52d3a2325", size = 74787 }, +] + +[[package]] +name = "numpy" +version = "1.24.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a4/9b/027bec52c633f6556dba6b722d9a0befb40498b9ceddd29cbe67a45a127c/numpy-1.24.4.tar.gz", hash = "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463", size = 10911229 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/80/6cdfb3e275d95155a34659163b83c09e3a3ff9f1456880bec6cc63d71083/numpy-1.24.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64", size = 19789140 }, + { url = "https://files.pythonhosted.org/packages/64/5f/3f01d753e2175cfade1013eea08db99ba1ee4bdb147ebcf3623b75d12aa7/numpy-1.24.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1", size = 13854297 }, + { url = "https://files.pythonhosted.org/packages/5a/b3/2f9c21d799fa07053ffa151faccdceeb69beec5a010576b8991f614021f7/numpy-1.24.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4", size = 13995611 }, + { url = "https://files.pythonhosted.org/packages/10/be/ae5bf4737cb79ba437879915791f6f26d92583c738d7d960ad94e5c36adf/numpy-1.24.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6", size = 17282357 }, + { url = "https://files.pythonhosted.org/packages/c0/64/908c1087be6285f40e4b3e79454552a701664a079321cff519d8c7051d06/numpy-1.24.4-cp310-cp310-win32.whl", hash = "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc", size = 12429222 }, + { url = "https://files.pythonhosted.org/packages/22/55/3d5a7c1142e0d9329ad27cece17933b0e2ab4e54ddc5c1861fbfeb3f7693/numpy-1.24.4-cp310-cp310-win_amd64.whl", hash = "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e", size = 14841514 }, + { url = "https://files.pythonhosted.org/packages/a9/cc/5ed2280a27e5dab12994c884f1f4d8c3bd4d885d02ae9e52a9d213a6a5e2/numpy-1.24.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810", size = 19775508 }, + { url = "https://files.pythonhosted.org/packages/c0/bc/77635c657a3668cf652806210b8662e1aff84b818a55ba88257abf6637a8/numpy-1.24.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254", size = 13840033 }, + { url = "https://files.pythonhosted.org/packages/a7/4c/96cdaa34f54c05e97c1c50f39f98d608f96f0677a6589e64e53104e22904/numpy-1.24.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7", size = 13991951 }, + { url = "https://files.pythonhosted.org/packages/22/97/dfb1a31bb46686f09e68ea6ac5c63fdee0d22d7b23b8f3f7ea07712869ef/numpy-1.24.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5", size = 17278923 }, + { url = "https://files.pythonhosted.org/packages/35/e2/76a11e54139654a324d107da1d98f99e7aa2a7ef97cfd7c631fba7dbde71/numpy-1.24.4-cp311-cp311-win32.whl", hash = "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d", size = 12422446 }, + { url = "https://files.pythonhosted.org/packages/d8/ec/ebef2f7d7c28503f958f0f8b992e7ce606fb74f9e891199329d5f5f87404/numpy-1.24.4-cp311-cp311-win_amd64.whl", hash = "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694", size = 14834466 }, + { url = "https://files.pythonhosted.org/packages/11/10/943cfb579f1a02909ff96464c69893b1d25be3731b5d3652c2e0cf1281ea/numpy-1.24.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61", size = 19780722 }, + { url = "https://files.pythonhosted.org/packages/a7/ae/f53b7b265fdc701e663fbb322a8e9d4b14d9cb7b2385f45ddfabfc4327e4/numpy-1.24.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f", size = 13843102 }, + { url = "https://files.pythonhosted.org/packages/25/6f/2586a50ad72e8dbb1d8381f837008a0321a3516dfd7cb57fc8cf7e4bb06b/numpy-1.24.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e", size = 14039616 }, + { url = "https://files.pythonhosted.org/packages/98/5d/5738903efe0ecb73e51eb44feafba32bdba2081263d40c5043568ff60faf/numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc", size = 17316263 }, + { url = "https://files.pythonhosted.org/packages/d1/57/8d328f0b91c733aa9aa7ee540dbc49b58796c862b4fbcb1146c701e888da/numpy-1.24.4-cp38-cp38-win32.whl", hash = "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2", size = 12455660 }, + { url = "https://files.pythonhosted.org/packages/69/65/0d47953afa0ad569d12de5f65d964321c208492064c38fe3b0b9744f8d44/numpy-1.24.4-cp38-cp38-win_amd64.whl", hash = "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706", size = 14868112 }, + { url = "https://files.pythonhosted.org/packages/9a/cd/d5b0402b801c8a8b56b04c1e85c6165efab298d2f0ab741c2406516ede3a/numpy-1.24.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400", size = 19816549 }, + { url = "https://files.pythonhosted.org/packages/14/27/638aaa446f39113a3ed38b37a66243e21b38110d021bfcb940c383e120f2/numpy-1.24.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f", size = 13879950 }, + { url = "https://files.pythonhosted.org/packages/8f/27/91894916e50627476cff1a4e4363ab6179d01077d71b9afed41d9e1f18bf/numpy-1.24.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9", size = 14030228 }, + { url = "https://files.pythonhosted.org/packages/7a/7c/d7b2a0417af6428440c0ad7cb9799073e507b1a465f827d058b826236964/numpy-1.24.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d", size = 17311170 }, + { url = "https://files.pythonhosted.org/packages/18/9d/e02ace5d7dfccee796c37b995c63322674daf88ae2f4a4724c5dd0afcc91/numpy-1.24.4-cp39-cp39-win32.whl", hash = "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835", size = 12454918 }, + { url = "https://files.pythonhosted.org/packages/63/38/6cc19d6b8bfa1d1a459daf2b3fe325453153ca7019976274b6f33d8b5663/numpy-1.24.4-cp39-cp39-win_amd64.whl", hash = "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8", size = 14867441 }, + { url = "https://files.pythonhosted.org/packages/a4/fd/8dff40e25e937c94257455c237b9b6bf5a30d42dd1cc11555533be099492/numpy-1.24.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef", size = 19156590 }, + { url = "https://files.pythonhosted.org/packages/42/e7/4bf953c6e05df90c6d351af69966384fed8e988d0e8c54dad7103b59f3ba/numpy-1.24.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a", size = 16705744 }, + { url = "https://files.pythonhosted.org/packages/fc/dd/9106005eb477d022b60b3817ed5937a43dad8fd1f20b0610ea8a32fcb407/numpy-1.24.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2", size = 14734290 }, +] + +[[package]] +name = "overrides" +version = "7.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/36/86/b585f53236dec60aba864e050778b25045f857e17f6e5ea0ae95fe80edd2/overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a", size = 22812 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49", size = 17832 }, +] + +[[package]] +name = "packaging" +version = "24.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/51/65/50db4dda066951078f0a96cf12f4b9ada6e4b811516bf0262c0f4f7064d4/packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", size = 148788 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124", size = 53985 }, +] + +[[package]] +name = "pandas" +version = "2.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/a7/824332581e258b5aa4f3763ecb2a797e5f9a54269044ba2e50ac19936b32/pandas-2.0.3.tar.gz", hash = "sha256:c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c", size = 5284455 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/b2/0d4a5729ce1ce11630c4fc5d5522a33b967b3ca146c210f58efde7c40e99/pandas-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8", size = 11760908 }, + { url = "https://files.pythonhosted.org/packages/4a/f6/f620ca62365d83e663a255a41b08d2fc2eaf304e0b8b21bb6d62a7390fe3/pandas-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f", size = 10823486 }, + { url = "https://files.pythonhosted.org/packages/c2/59/cb4234bc9b968c57e81861b306b10cd8170272c57b098b724d3de5eda124/pandas-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce0c6f76a0f1ba361551f3e6dceaff06bde7514a374aa43e33b588ec10420183", size = 11571897 }, + { url = "https://files.pythonhosted.org/packages/e3/59/35a2892bf09ded9c1bf3804461efe772836a5261ef5dfb4e264ce813ff99/pandas-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba619e410a21d8c387a1ea6e8a0e49bb42216474436245718d7f2e88a2f8d7c0", size = 12306421 }, + { url = "https://files.pythonhosted.org/packages/94/71/3a0c25433c54bb29b48e3155b959ac78f4c4f2f06f94d8318aac612cb80f/pandas-2.0.3-cp310-cp310-win32.whl", hash = "sha256:3ef285093b4fe5058eefd756100a367f27029913760773c8bf1d2d8bebe5d210", size = 9540792 }, + { url = "https://files.pythonhosted.org/packages/ed/30/b97456e7063edac0e5a405128065f0cd2033adfe3716fb2256c186bd41d0/pandas-2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:9ee1a69328d5c36c98d8e74db06f4ad518a1840e8ccb94a4ba86920986bb617e", size = 10664333 }, + { url = "https://files.pythonhosted.org/packages/b3/92/a5e5133421b49e901a12e02a6a7ef3a0130e10d13db8cb657fdd0cba3b90/pandas-2.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b084b91d8d66ab19f5bb3256cbd5ea661848338301940e17f4492b2ce0801fe8", size = 11645672 }, + { url = "https://files.pythonhosted.org/packages/8f/bb/aea1fbeed5b474cb8634364718abe9030d7cc7a30bf51f40bd494bbc89a2/pandas-2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37673e3bdf1551b95bf5d4ce372b37770f9529743d2498032439371fc7b7eb26", size = 10693229 }, + { url = "https://files.pythonhosted.org/packages/d6/90/e7d387f1a416b14e59290baa7a454a90d719baebbf77433ff1bdcc727800/pandas-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9cb1e14fdb546396b7e1b923ffaeeac24e4cedd14266c3497216dd4448e4f2d", size = 11581591 }, + { url = "https://files.pythonhosted.org/packages/d0/28/88b81881c056376254618fad622a5e94b5126db8c61157ea1910cd1c040a/pandas-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9cd88488cceb7635aebb84809d087468eb33551097d600c6dad13602029c2df", size = 12219370 }, + { url = "https://files.pythonhosted.org/packages/e4/a5/212b9039e25bf8ebb97e417a96660e3dc925dacd3f8653d531b8f7fd9be4/pandas-2.0.3-cp311-cp311-win32.whl", hash = "sha256:694888a81198786f0e164ee3a581df7d505024fbb1f15202fc7db88a71d84ebd", size = 9482935 }, + { url = "https://files.pythonhosted.org/packages/9e/71/756a1be6bee0209d8c0d8c5e3b9fc72c00373f384a4017095ec404aec3ad/pandas-2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6a21ab5c89dcbd57f78d0ae16630b090eec626360085a4148693def5452d8a6b", size = 10607692 }, + { url = "https://files.pythonhosted.org/packages/78/a8/07dd10f90ca915ed914853cd57f79bfc22e1ef4384ab56cb4336d2fc1f2a/pandas-2.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4da0d45e7f34c069fe4d522359df7d23badf83abc1d1cef398895822d11061", size = 11653303 }, + { url = "https://files.pythonhosted.org/packages/53/c3/f8e87361f7fdf42012def602bfa2a593423c729f5cb7c97aed7f51be66ac/pandas-2.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:32fca2ee1b0d93dd71d979726b12b61faa06aeb93cf77468776287f41ff8fdc5", size = 10710932 }, + { url = "https://files.pythonhosted.org/packages/a7/87/828d50c81ce0f434163bf70b925a0eec6076808e0bca312a79322b141f66/pandas-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:258d3624b3ae734490e4d63c430256e716f488c4fcb7c8e9bde2d3aa46c29089", size = 11684018 }, + { url = "https://files.pythonhosted.org/packages/f8/7f/5b047effafbdd34e52c9e2d7e44f729a0655efafb22198c45cf692cdc157/pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eae3dc34fa1aa7772dd3fc60270d13ced7346fcbcfee017d3132ec625e23bb0", size = 12353723 }, + { url = "https://files.pythonhosted.org/packages/ea/ae/26a2eda7fa581347d69e51f93892493b2074ef3352ac71033c9f32c52389/pandas-2.0.3-cp38-cp38-win32.whl", hash = "sha256:f3421a7afb1a43f7e38e82e844e2bca9a6d793d66c1a7f9f0ff39a795bbc5e02", size = 9646403 }, + { url = "https://files.pythonhosted.org/packages/c3/6c/ea362eef61f05553aaf1a24b3e96b2d0603f5dc71a3bd35688a24ed88843/pandas-2.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:69d7f3884c95da3a31ef82b7618af5710dba95bb885ffab339aad925c3e8ce78", size = 10777638 }, + { url = "https://files.pythonhosted.org/packages/f8/c7/cfef920b7b457dff6928e824896cb82367650ea127d048ee0b820026db4f/pandas-2.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5247fb1ba347c1261cbbf0fcfba4a3121fbb4029d95d9ef4dc45406620b25c8b", size = 11834160 }, + { url = "https://files.pythonhosted.org/packages/6c/1c/689c9d99bc4e5d366a5fd871f0bcdee98a6581e240f96b78d2d08f103774/pandas-2.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81af086f4543c9d8bb128328b5d32e9986e0c84d3ee673a2ac6fb57fd14f755e", size = 10862752 }, + { url = "https://files.pythonhosted.org/packages/cc/b8/4d082f41c27c95bf90485d1447b647cc7e5680fea75e315669dc6e4cb398/pandas-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1994c789bf12a7c5098277fb43836ce090f1073858c10f9220998ac74f37c69b", size = 11715852 }, + { url = "https://files.pythonhosted.org/packages/9e/0d/91a9fd2c202f2b1d97a38ab591890f86480ecbb596cbc56d035f6f23fdcc/pandas-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ec591c48e29226bcbb316e0c1e9423622bc7a4eaf1ef7c3c9fa1a3981f89641", size = 12398496 }, + { url = "https://files.pythonhosted.org/packages/26/7d/d8aa0a2c4f3f5f8ea59fb946c8eafe8f508090ca73e2b08a9af853c1103e/pandas-2.0.3-cp39-cp39-win32.whl", hash = "sha256:04dbdbaf2e4d46ca8da896e1805bc04eb85caa9a82e259e8eed00254d5e0c682", size = 9630766 }, + { url = "https://files.pythonhosted.org/packages/9a/f2/0ad053856debbe90c83de1b4f05915f85fd2146f20faf9daa3b320d36df3/pandas-2.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:1168574b036cd8b93abc746171c9b4f1b83467438a5e45909fed645cf8692dbc", size = 10755902 }, +] + +[[package]] +name = "pkgutil-resolve-name" +version = "1.3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/70/f2/f2891a9dc37398696ddd945012b90ef8d0a034f0012e3f83c3f7a70b0f79/pkgutil_resolve_name-1.3.10.tar.gz", hash = "sha256:357d6c9e6a755653cfd78893817c0853af365dd51ec97f3d358a819373bbd174", size = 5054 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/5c/3d4882ba113fd55bdba9326c1e4c62a15e674a2501de4869e6bd6301f87e/pkgutil_resolve_name-1.3.10-py3-none-any.whl", hash = "sha256:ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e", size = 4734 }, +] + +[[package]] +name = "protobuf" +version = "5.28.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/a4/4579a61de526e19005ceeb93e478b61d77aa38c8a85ad958ff16a9906549/protobuf-5.28.2.tar.gz", hash = "sha256:59379674ff119717404f7454647913787034f03fe7049cbef1d74a97bb4593f0", size = 422494 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/30/231764750e0987755b7b8d66771f161e5f002e165d27b72154c776dbabf7/protobuf-5.28.2-cp310-abi3-win32.whl", hash = "sha256:eeea10f3dc0ac7e6b4933d32db20662902b4ab81bf28df12218aa389e9c2102d", size = 419662 }, + { url = "https://files.pythonhosted.org/packages/7d/46/3fdf7462160135aee6a530f1ec66665b5b4132fa2e1002ab971bc6ec2589/protobuf-5.28.2-cp310-abi3-win_amd64.whl", hash = "sha256:2c69461a7fcc8e24be697624c09a839976d82ae75062b11a0972e41fd2cd9132", size = 431479 }, + { url = "https://files.pythonhosted.org/packages/37/45/d2a760580f8f2ed2825ba44cb370e0a4011ddef85e728f46ea3dd565a8a5/protobuf-5.28.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a8b9403fc70764b08d2f593ce44f1d2920c5077bf7d311fefec999f8c40f78b7", size = 414736 }, + { url = "https://files.pythonhosted.org/packages/e6/23/ed718dc18e6a561445ece1e7a17d2dda0c634ad9cf663102b47f10005d8f/protobuf-5.28.2-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:35cfcb15f213449af7ff6198d6eb5f739c37d7e4f1c09b5d0641babf2cc0c68f", size = 316518 }, + { url = "https://files.pythonhosted.org/packages/23/08/a1ce0415a115c2b703bfa798f06f0e43ca91dbe29d6180bf86a9287b15e2/protobuf-5.28.2-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:5e8a95246d581eef20471b5d5ba010d55f66740942b95ba9b872d918c459452f", size = 316605 }, + { url = "https://files.pythonhosted.org/packages/0f/99/b71c43758cb96dcd28ebc34fc394883cb7ea99a63d4c93622c2ccee53ba9/protobuf-5.28.2-cp38-cp38-win32.whl", hash = "sha256:87317e9bcda04a32f2ee82089a204d3a2f0d3c8aeed16568c7daf4756e4f1fe0", size = 419600 }, + { url = "https://files.pythonhosted.org/packages/1b/99/8d51383f6f326003e59cf1915e315803c9b786459bacf709e5edca158c5e/protobuf-5.28.2-cp38-cp38-win_amd64.whl", hash = "sha256:c0ea0123dac3399a2eeb1a1443d82b7afc9ff40241433296769f7da42d142ec3", size = 431522 }, + { url = "https://files.pythonhosted.org/packages/2d/27/d10aaae326ffd446893d4d1ef18e22c4ece87eb4273ee560ce4e616f0959/protobuf-5.28.2-cp39-cp39-win32.whl", hash = "sha256:ca53faf29896c526863366a52a8f4d88e69cd04ec9571ed6082fa117fac3ab36", size = 419587 }, + { url = "https://files.pythonhosted.org/packages/94/12/af94b0654fa6bde64272b2abab39b221544c32e9e911284745569f65e73a/protobuf-5.28.2-cp39-cp39-win_amd64.whl", hash = "sha256:8ddc60bf374785fb7cb12510b267f59067fa10087325b8e1855b898a0d81d276", size = 431552 }, + { url = "https://files.pythonhosted.org/packages/9b/55/f24e3b801d2e108c48aa2b1b59bb791b5cffba89465cbbf66fc98de89270/protobuf-5.28.2-py3-none-any.whl", hash = "sha256:52235802093bd8a2811abbe8bf0ab9c5f54cca0a751fdd3f6ac2a21438bffece", size = 169566 }, +] + +[[package]] +name = "py" +version = "1.11.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/ff/fec109ceb715d2a6b4c4a85a61af3b40c723a961e8828319fbcb15b868dc/py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719", size = 207796 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/f0/10642828a8dfb741e5f3fbaac830550a518a775c7fff6f04a007259b0548/py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378", size = 98708 }, +] + +[[package]] +name = "pyarrow" +version = "17.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/27/4e/ea6d43f324169f8aec0e57569443a38bab4b398d09769ca64f7b4d467de3/pyarrow-17.0.0.tar.gz", hash = "sha256:4beca9521ed2c0921c1023e68d097d0299b62c362639ea315572a58f3f50fd28", size = 1112479 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/5d/78d4b040bc5ff2fc6c3d03e80fca396b742f6c125b8af06bcf7427f931bc/pyarrow-17.0.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a5c8b238d47e48812ee577ee20c9a2779e6a5904f1708ae240f53ecbee7c9f07", size = 28994846 }, + { url = "https://files.pythonhosted.org/packages/3b/73/8ed168db7642e91180330e4ea9f3ff8bab404678f00d32d7df0871a4933b/pyarrow-17.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db023dc4c6cae1015de9e198d41250688383c3f9af8f565370ab2b4cb5f62655", size = 27165908 }, + { url = "https://files.pythonhosted.org/packages/81/36/e78c24be99242063f6d0590ef68c857ea07bdea470242c361e9a15bd57a4/pyarrow-17.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da1e060b3876faa11cee287839f9cc7cdc00649f475714b8680a05fd9071d545", size = 39264209 }, + { url = "https://files.pythonhosted.org/packages/18/4c/3db637d7578f683b0a8fb8999b436bdbedd6e3517bd4f90c70853cf3ad20/pyarrow-17.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75c06d4624c0ad6674364bb46ef38c3132768139ddec1c56582dbac54f2663e2", size = 39862883 }, + { url = "https://files.pythonhosted.org/packages/81/3c/0580626896c842614a523e66b351181ed5bb14e5dfc263cd68cea2c46d90/pyarrow-17.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:fa3c246cc58cb5a4a5cb407a18f193354ea47dd0648194e6265bd24177982fe8", size = 38723009 }, + { url = "https://files.pythonhosted.org/packages/ee/fb/c1b47f0ada36d856a352da261a44d7344d8f22e2f7db3945f8c3b81be5dd/pyarrow-17.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:f7ae2de664e0b158d1607699a16a488de3d008ba99b3a7aa5de1cbc13574d047", size = 39855626 }, + { url = "https://files.pythonhosted.org/packages/19/09/b0a02908180a25d57312ab5919069c39fddf30602568980419f4b02393f6/pyarrow-17.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:5984f416552eea15fd9cee03da53542bf4cddaef5afecefb9aa8d1010c335087", size = 25147242 }, + { url = "https://files.pythonhosted.org/packages/f9/46/ce89f87c2936f5bb9d879473b9663ce7a4b1f4359acc2f0eb39865eaa1af/pyarrow-17.0.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:1c8856e2ef09eb87ecf937104aacfa0708f22dfeb039c363ec99735190ffb977", size = 29028748 }, + { url = "https://files.pythonhosted.org/packages/8d/8e/ce2e9b2146de422f6638333c01903140e9ada244a2a477918a368306c64c/pyarrow-17.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e19f569567efcbbd42084e87f948778eb371d308e137a0f97afe19bb860ccb3", size = 27190965 }, + { url = "https://files.pythonhosted.org/packages/3b/c8/5675719570eb1acd809481c6d64e2136ffb340bc387f4ca62dce79516cea/pyarrow-17.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b244dc8e08a23b3e352899a006a26ae7b4d0da7bb636872fa8f5884e70acf15", size = 39269081 }, + { url = "https://files.pythonhosted.org/packages/5e/78/3931194f16ab681ebb87ad252e7b8d2c8b23dad49706cadc865dff4a1dd3/pyarrow-17.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b72e87fe3e1db343995562f7fff8aee354b55ee83d13afba65400c178ab2597", size = 39864921 }, + { url = "https://files.pythonhosted.org/packages/d8/81/69b6606093363f55a2a574c018901c40952d4e902e670656d18213c71ad7/pyarrow-17.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dc5c31c37409dfbc5d014047817cb4ccd8c1ea25d19576acf1a001fe07f5b420", size = 38740798 }, + { url = "https://files.pythonhosted.org/packages/4c/21/9ca93b84b92ef927814cb7ba37f0774a484c849d58f0b692b16af8eebcfb/pyarrow-17.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:e3343cb1e88bc2ea605986d4b94948716edc7a8d14afd4e2c097232f729758b4", size = 39871877 }, + { url = "https://files.pythonhosted.org/packages/30/d1/63a7c248432c71c7d3ee803e706590a0b81ce1a8d2b2ae49677774b813bb/pyarrow-17.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:a27532c38f3de9eb3e90ecab63dfda948a8ca859a66e3a47f5f42d1e403c4d03", size = 25151089 }, + { url = "https://files.pythonhosted.org/packages/d4/62/ce6ac1275a432b4a27c55fe96c58147f111d8ba1ad800a112d31859fae2f/pyarrow-17.0.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:9b8a823cea605221e61f34859dcc03207e52e409ccf6354634143e23af7c8d22", size = 29019418 }, + { url = "https://files.pythonhosted.org/packages/8e/0a/dbd0c134e7a0c30bea439675cc120012337202e5fac7163ba839aa3691d2/pyarrow-17.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f1e70de6cb5790a50b01d2b686d54aaf73da01266850b05e3af2a1bc89e16053", size = 27152197 }, + { url = "https://files.pythonhosted.org/packages/cb/05/3f4a16498349db79090767620d6dc23c1ec0c658a668d61d76b87706c65d/pyarrow-17.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0071ce35788c6f9077ff9ecba4858108eebe2ea5a3f7cf2cf55ebc1dbc6ee24a", size = 39263026 }, + { url = "https://files.pythonhosted.org/packages/c2/0c/ea2107236740be8fa0e0d4a293a095c9f43546a2465bb7df34eee9126b09/pyarrow-17.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:757074882f844411fcca735e39aae74248a1531367a7c80799b4266390ae51cc", size = 39880798 }, + { url = "https://files.pythonhosted.org/packages/f6/b0/b9164a8bc495083c10c281cc65064553ec87b7537d6f742a89d5953a2a3e/pyarrow-17.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:9ba11c4f16976e89146781a83833df7f82077cdab7dc6232c897789343f7891a", size = 38715172 }, + { url = "https://files.pythonhosted.org/packages/f1/c4/9625418a1413005e486c006e56675334929fad864347c5ae7c1b2e7fe639/pyarrow-17.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b0c6ac301093b42d34410b187bba560b17c0330f64907bfa4f7f7f2444b0cf9b", size = 39874508 }, + { url = "https://files.pythonhosted.org/packages/ae/49/baafe2a964f663413be3bd1cf5c45ed98c5e42e804e2328e18f4570027c1/pyarrow-17.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:392bc9feabc647338e6c89267635e111d71edad5fcffba204425a7c8d13610d7", size = 25099235 }, + { url = "https://files.pythonhosted.org/packages/8d/bd/8f52c1d7b430260f80a349cffa2df351750a737b5336313d56dcadeb9ae1/pyarrow-17.0.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:af5ff82a04b2171415f1410cff7ebb79861afc5dae50be73ce06d6e870615204", size = 28999345 }, + { url = "https://files.pythonhosted.org/packages/64/d9/51e35550f2f18b8815a2ab25948f735434db32000c0e91eba3a32634782a/pyarrow-17.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:edca18eaca89cd6382dfbcff3dd2d87633433043650c07375d095cd3517561d8", size = 27168441 }, + { url = "https://files.pythonhosted.org/packages/18/d8/7161d87d07ea51be70c49f615004c1446d5723622a18b2681f7e4b71bf6e/pyarrow-17.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c7916bff914ac5d4a8fe25b7a25e432ff921e72f6f2b7547d1e325c1ad9d155", size = 39363163 }, + { url = "https://files.pythonhosted.org/packages/3f/08/bc497130789833de09e345e3ce4647e3ce86517c4f70f2144f0367ca378b/pyarrow-17.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f553ca691b9e94b202ff741bdd40f6ccb70cdd5fbf65c187af132f1317de6145", size = 39965253 }, + { url = "https://files.pythonhosted.org/packages/d3/2e/493dd7db889402b4c7871ca7dfdd20f2c5deedbff802d3eb8576359930f9/pyarrow-17.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:0cdb0e627c86c373205a2f94a510ac4376fdc523f8bb36beab2e7f204416163c", size = 38805378 }, + { url = "https://files.pythonhosted.org/packages/e6/c1/4c6bcdf7a820034aa91a8b4d25fef38809be79b42ca7aaa16d4680b0bbac/pyarrow-17.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:d7d192305d9d8bc9082d10f361fc70a73590a4c65cf31c3e6926cd72b76bc35c", size = 39958364 }, + { url = "https://files.pythonhosted.org/packages/d1/db/42ac644453cfdfc60fe002b46d647fe7a6dfad753ef7b28e99b4c936ad5d/pyarrow-17.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:02dae06ce212d8b3244dd3e7d12d9c4d3046945a5933d28026598e9dbbda1fca", size = 25229211 }, + { url = "https://files.pythonhosted.org/packages/43/e0/a898096d35be240aa61fb2d54db58b86d664b10e1e51256f9300f47565e8/pyarrow-17.0.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:13d7a460b412f31e4c0efa1148e1d29bdf18ad1411eb6757d38f8fbdcc8645fb", size = 29007881 }, + { url = "https://files.pythonhosted.org/packages/59/22/f7d14907ed0697b5dd488d393129f2738629fa5bcba863e00931b7975946/pyarrow-17.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9b564a51fbccfab5a04a80453e5ac6c9954a9c5ef2890d1bcf63741909c3f8df", size = 27178117 }, + { url = "https://files.pythonhosted.org/packages/bf/ee/661211feac0ed48467b1d5c57298c91403809ec3ab78b1d175e1d6ad03cf/pyarrow-17.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32503827abbc5aadedfa235f5ece8c4f8f8b0a3cf01066bc8d29de7539532687", size = 39273896 }, + { url = "https://files.pythonhosted.org/packages/af/61/bcd9b58e38ead6ad42b9ed00da33a3f862bc1d445e3d3164799c25550ac2/pyarrow-17.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a155acc7f154b9ffcc85497509bcd0d43efb80d6f733b0dc3bb14e281f131c8b", size = 39875438 }, + { url = "https://files.pythonhosted.org/packages/75/63/29d1bfcc57af73cde3fc3baccab2f37548de512dbe0ab294b033cd203516/pyarrow-17.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:dec8d129254d0188a49f8a1fc99e0560dc1b85f60af729f47de4046015f9b0a5", size = 38735092 }, + { url = "https://files.pythonhosted.org/packages/39/f4/90258b4de753df7cc61cefb0312f8abcf226672e96cc64996e66afce817a/pyarrow-17.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:a48ddf5c3c6a6c505904545c25a4ae13646ae1f8ba703c4df4a1bfe4f4006bda", size = 39867610 }, + { url = "https://files.pythonhosted.org/packages/e7/f6/b75d4816c32f1618ed31a005ee635dd1d91d8164495d94f2ea092f594661/pyarrow-17.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:42bf93249a083aca230ba7e2786c5f673507fa97bbd9725a1e2754715151a204", size = 25148611 }, +] + +[[package]] +name = "pydantic" +version = "2.9.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a9/b7/d9e3f12af310e1120c21603644a1cd86f59060e040ec5c3a80b8f05fae30/pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f", size = 769917 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/e4/ba44652d562cbf0bf320e0f3810206149c8a4e99cdbf66da82e97ab53a15/pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12", size = 434928 }, +] + +[[package]] +name = "pydantic-core" +version = "2.23.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e2/aa/6b6a9b9f8537b872f552ddd46dd3da230367754b6f707b8e1e963f515ea3/pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863", size = 402156 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/8b/d3ae387f66277bd8104096d6ec0a145f4baa2966ebb2cad746c0920c9526/pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b", size = 1867835 }, + { url = "https://files.pythonhosted.org/packages/46/76/f68272e4c3a7df8777798282c5e47d508274917f29992d84e1898f8908c7/pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166", size = 1776689 }, + { url = "https://files.pythonhosted.org/packages/cc/69/5f945b4416f42ea3f3bc9d2aaec66c76084a6ff4ff27555bf9415ab43189/pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb", size = 1800748 }, + { url = "https://files.pythonhosted.org/packages/50/ab/891a7b0054bcc297fb02d44d05c50e68154e31788f2d9d41d0b72c89fdf7/pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916", size = 1806469 }, + { url = "https://files.pythonhosted.org/packages/31/7c/6e3fa122075d78f277a8431c4c608f061881b76c2b7faca01d317ee39b5d/pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07", size = 2002246 }, + { url = "https://files.pythonhosted.org/packages/ad/6f/22d5692b7ab63fc4acbc74de6ff61d185804a83160adba5e6cc6068e1128/pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232", size = 2659404 }, + { url = "https://files.pythonhosted.org/packages/11/ac/1e647dc1121c028b691028fa61a4e7477e6aeb5132628fde41dd34c1671f/pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2", size = 2053940 }, + { url = "https://files.pythonhosted.org/packages/91/75/984740c17f12c3ce18b5a2fcc4bdceb785cce7df1511a4ce89bca17c7e2d/pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f", size = 1921437 }, + { url = "https://files.pythonhosted.org/packages/a0/74/13c5f606b64d93f0721e7768cd3e8b2102164866c207b8cd6f90bb15d24f/pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3", size = 1966129 }, + { url = "https://files.pythonhosted.org/packages/18/03/9c4aa5919457c7b57a016c1ab513b1a926ed9b2bb7915bf8e506bf65c34b/pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071", size = 2110908 }, + { url = "https://files.pythonhosted.org/packages/92/2c/053d33f029c5dc65e5cf44ff03ceeefb7cce908f8f3cca9265e7f9b540c8/pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119", size = 1735278 }, + { url = "https://files.pythonhosted.org/packages/de/81/7dfe464eca78d76d31dd661b04b5f2036ec72ea8848dd87ab7375e185c23/pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f", size = 1917453 }, + { url = "https://files.pythonhosted.org/packages/5d/30/890a583cd3f2be27ecf32b479d5d615710bb926d92da03e3f7838ff3e58b/pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8", size = 1865160 }, + { url = "https://files.pythonhosted.org/packages/1d/9a/b634442e1253bc6889c87afe8bb59447f106ee042140bd57680b3b113ec7/pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d", size = 1776777 }, + { url = "https://files.pythonhosted.org/packages/75/9a/7816295124a6b08c24c96f9ce73085032d8bcbaf7e5a781cd41aa910c891/pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e", size = 1799244 }, + { url = "https://files.pythonhosted.org/packages/a9/8f/89c1405176903e567c5f99ec53387449e62f1121894aa9fc2c4fdc51a59b/pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607", size = 1805307 }, + { url = "https://files.pythonhosted.org/packages/d5/a5/1a194447d0da1ef492e3470680c66048fef56fc1f1a25cafbea4bc1d1c48/pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd", size = 2000663 }, + { url = "https://files.pythonhosted.org/packages/13/a5/1df8541651de4455e7d587cf556201b4f7997191e110bca3b589218745a5/pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea", size = 2655941 }, + { url = "https://files.pythonhosted.org/packages/44/31/a3899b5ce02c4316865e390107f145089876dff7e1dfc770a231d836aed8/pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e", size = 2052105 }, + { url = "https://files.pythonhosted.org/packages/1b/aa/98e190f8745d5ec831f6d5449344c48c0627ac5fed4e5340a44b74878f8e/pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b", size = 1919967 }, + { url = "https://files.pythonhosted.org/packages/ae/35/b6e00b6abb2acfee3e8f85558c02a0822e9a8b2f2d812ea8b9079b118ba0/pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0", size = 1964291 }, + { url = "https://files.pythonhosted.org/packages/13/46/7bee6d32b69191cd649bbbd2361af79c472d72cb29bb2024f0b6e350ba06/pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64", size = 2109666 }, + { url = "https://files.pythonhosted.org/packages/39/ef/7b34f1b122a81b68ed0a7d0e564da9ccdc9a2924c8d6c6b5b11fa3a56970/pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f", size = 1732940 }, + { url = "https://files.pythonhosted.org/packages/2f/76/37b7e76c645843ff46c1d73e046207311ef298d3f7b2f7d8f6ac60113071/pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3", size = 1916804 }, + { url = "https://files.pythonhosted.org/packages/74/7b/8e315f80666194b354966ec84b7d567da77ad927ed6323db4006cf915f3f/pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231", size = 1856459 }, + { url = "https://files.pythonhosted.org/packages/14/de/866bdce10ed808323d437612aca1ec9971b981e1c52e5e42ad9b8e17a6f6/pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee", size = 1770007 }, + { url = "https://files.pythonhosted.org/packages/dc/69/8edd5c3cd48bb833a3f7ef9b81d7666ccddd3c9a635225214e044b6e8281/pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87", size = 1790245 }, + { url = "https://files.pythonhosted.org/packages/80/33/9c24334e3af796ce80d2274940aae38dd4e5676298b4398eff103a79e02d/pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8", size = 1801260 }, + { url = "https://files.pythonhosted.org/packages/a5/6f/e9567fd90104b79b101ca9d120219644d3314962caa7948dd8b965e9f83e/pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327", size = 1996872 }, + { url = "https://files.pythonhosted.org/packages/2d/ad/b5f0fe9e6cfee915dd144edbd10b6e9c9c9c9d7a56b69256d124b8ac682e/pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2", size = 2661617 }, + { url = "https://files.pythonhosted.org/packages/06/c8/7d4b708f8d05a5cbfda3243aad468052c6e99de7d0937c9146c24d9f12e9/pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36", size = 2071831 }, + { url = "https://files.pythonhosted.org/packages/89/4d/3079d00c47f22c9a9a8220db088b309ad6e600a73d7a69473e3a8e5e3ea3/pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126", size = 1917453 }, + { url = "https://files.pythonhosted.org/packages/e9/88/9df5b7ce880a4703fcc2d76c8c2d8eb9f861f79d0c56f4b8f5f2607ccec8/pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e", size = 1968793 }, + { url = "https://files.pythonhosted.org/packages/e3/b9/41f7efe80f6ce2ed3ee3c2dcfe10ab7adc1172f778cc9659509a79518c43/pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24", size = 2116872 }, + { url = "https://files.pythonhosted.org/packages/63/08/b59b7a92e03dd25554b0436554bf23e7c29abae7cce4b1c459cd92746811/pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84", size = 1738535 }, + { url = "https://files.pythonhosted.org/packages/88/8d/479293e4d39ab409747926eec4329de5b7129beaedc3786eca070605d07f/pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9", size = 1917992 }, + { url = "https://files.pythonhosted.org/packages/ad/ef/16ee2df472bf0e419b6bc68c05bf0145c49247a1095e85cee1463c6a44a1/pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc", size = 1856143 }, + { url = "https://files.pythonhosted.org/packages/da/fa/bc3dbb83605669a34a93308e297ab22be82dfb9dcf88c6cf4b4f264e0a42/pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd", size = 1770063 }, + { url = "https://files.pythonhosted.org/packages/4e/48/e813f3bbd257a712303ebdf55c8dc46f9589ec74b384c9f652597df3288d/pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05", size = 1790013 }, + { url = "https://files.pythonhosted.org/packages/b4/e0/56eda3a37929a1d297fcab1966db8c339023bcca0b64c5a84896db3fcc5c/pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d", size = 1801077 }, + { url = "https://files.pythonhosted.org/packages/04/be/5e49376769bfbf82486da6c5c1683b891809365c20d7c7e52792ce4c71f3/pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510", size = 1996782 }, + { url = "https://files.pythonhosted.org/packages/bc/24/e3ee6c04f1d58cc15f37bcc62f32c7478ff55142b7b3e6d42ea374ea427c/pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6", size = 2661375 }, + { url = "https://files.pythonhosted.org/packages/c1/f8/11a9006de4e89d016b8de74ebb1db727dc100608bb1e6bbe9d56a3cbbcce/pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b", size = 2071635 }, + { url = "https://files.pythonhosted.org/packages/7c/45/bdce5779b59f468bdf262a5bc9eecbae87f271c51aef628d8c073b4b4b4c/pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327", size = 1916994 }, + { url = "https://files.pythonhosted.org/packages/d8/fa/c648308fe711ee1f88192cad6026ab4f925396d1293e8356de7e55be89b5/pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6", size = 1968877 }, + { url = "https://files.pythonhosted.org/packages/16/16/b805c74b35607d24d37103007f899abc4880923b04929547ae68d478b7f4/pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f", size = 2116814 }, + { url = "https://files.pythonhosted.org/packages/d1/58/5305e723d9fcdf1c5a655e6a4cc2a07128bf644ff4b1d98daf7a9dbf57da/pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769", size = 1738360 }, + { url = "https://files.pythonhosted.org/packages/a5/ae/e14b0ff8b3f48e02394d8acd911376b7b66e164535687ef7dc24ea03072f/pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5", size = 1919411 }, + { url = "https://files.pythonhosted.org/packages/b0/3f/790c72662823955c4803487bcda8dfce5a9e2ddcaf709f7993e12ede29fd/pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555", size = 1867828 }, + { url = "https://files.pythonhosted.org/packages/89/f6/6ceeeb0005fabdf3f99a7fa1be52db41c328b438ebfa88f7b3f2815fb157/pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658", size = 1748962 }, + { url = "https://files.pythonhosted.org/packages/13/08/c1c49218a87c6e079730fed0357a5883c2f6fbf43e9da0eb2501384e0975/pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271", size = 1800821 }, + { url = "https://files.pythonhosted.org/packages/0a/92/e8f4de3453a3446ca2da5dc5d636fbd644dc9923f74812cfb63549df79ee/pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665", size = 1805527 }, + { url = "https://files.pythonhosted.org/packages/3e/06/cb8891f40d4b1d5744c24a3082e3031b16727fdc927cf4dc6bbe2fb9e9a3/pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368", size = 2002267 }, + { url = "https://files.pythonhosted.org/packages/a3/3b/7d2ab72afa3deb18baeb6c3373ad3181922da541bfae63aecbef51a9fadc/pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13", size = 2654837 }, + { url = "https://files.pythonhosted.org/packages/a5/a4/229432a701acd98575b88ccaff82e8435c75c44cb30522004afb263e3756/pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad", size = 2054177 }, + { url = "https://files.pythonhosted.org/packages/50/bd/4a40a83e476af0a86e1f57559dd324b922b5e60faaa866de400efe033ca1/pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12", size = 1920918 }, + { url = "https://files.pythonhosted.org/packages/4b/98/857e2bdae80432efff030812add720d6797b63c790f13e123c8274a3337b/pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2", size = 1965814 }, + { url = "https://files.pythonhosted.org/packages/ab/87/cacb1152a821340e11f870e0fbd6613c2f05278dab5def47c7818eac1a22/pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb", size = 2111058 }, + { url = "https://files.pythonhosted.org/packages/5c/ce/a3bd2de2582be6e5b187218896cac734377fcc8d5a54f98b83d710125ef0/pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6", size = 1734749 }, + { url = "https://files.pythonhosted.org/packages/db/c8/e6ed2172bb2594a256c7756a70109fa31ab80d1cebb9003ad6c54e10c0d1/pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556", size = 1920302 }, + { url = "https://files.pythonhosted.org/packages/7a/04/2580b2deaae37b3e30fc30c54298be938b973990b23612d6b61c7bdd01c7/pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a", size = 1868200 }, + { url = "https://files.pythonhosted.org/packages/39/6e/e311bd0751505350f0cdcee3077841eb1f9253c5a1ddbad048cd9fbf7c6e/pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36", size = 1749316 }, + { url = "https://files.pythonhosted.org/packages/d0/b4/95b5eb47c6dc8692508c3ca04a1f8d6f0884c9dacb34cf3357595cbe73be/pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b", size = 1800880 }, + { url = "https://files.pythonhosted.org/packages/da/79/41c4f817acd7f42d94cd1e16526c062a7b089f66faed4bd30852314d9a66/pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323", size = 1807077 }, + { url = "https://files.pythonhosted.org/packages/fb/53/d13d1eb0a97d5c06cf7a225935d471e9c241afd389a333f40c703f214973/pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3", size = 2002859 }, + { url = "https://files.pythonhosted.org/packages/53/7d/6b8a1eff453774b46cac8c849e99455b27167971a003212f668e94bc4c9c/pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df", size = 2661437 }, + { url = "https://files.pythonhosted.org/packages/6c/ea/8820f57f0b46e6148ee42d8216b15e8fe3b360944284bbc705bf34fac888/pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c", size = 2054404 }, + { url = "https://files.pythonhosted.org/packages/0f/36/d4ae869e473c3c7868e1cd1e2a1b9e13bce5cd1a7d287f6ac755a0b1575e/pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55", size = 1921680 }, + { url = "https://files.pythonhosted.org/packages/0d/f8/eed5c65b80c4ac4494117e2101973b45fc655774ef647d17dde40a70f7d2/pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040", size = 1966093 }, + { url = "https://files.pythonhosted.org/packages/e8/c8/1d42ce51d65e571ab53d466cae83434325a126811df7ce4861d9d97bee4b/pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605", size = 2111437 }, + { url = "https://files.pythonhosted.org/packages/aa/c9/7fea9d13383c2ec6865919e09cffe44ab77e911eb281b53a4deaafd4c8e8/pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6", size = 1735049 }, + { url = "https://files.pythonhosted.org/packages/98/95/dd7045c4caa2b73d0bf3b989d66b23cfbb7a0ef14ce99db15677a000a953/pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29", size = 1920180 }, + { url = "https://files.pythonhosted.org/packages/13/a9/5d582eb3204464284611f636b55c0a7410d748ff338756323cb1ce721b96/pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5", size = 1857135 }, + { url = "https://files.pythonhosted.org/packages/2c/57/faf36290933fe16717f97829eabfb1868182ac495f99cf0eda9f59687c9d/pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec", size = 1740583 }, + { url = "https://files.pythonhosted.org/packages/91/7c/d99e3513dc191c4fec363aef1bf4c8af9125d8fa53af7cb97e8babef4e40/pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480", size = 1793637 }, + { url = "https://files.pythonhosted.org/packages/29/18/812222b6d18c2d13eebbb0f7cdc170a408d9ced65794fdb86147c77e1982/pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068", size = 1941963 }, + { url = "https://files.pythonhosted.org/packages/0f/36/c1f3642ac3f05e6bb4aec3ffc399fa3f84895d259cf5f0ce3054b7735c29/pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801", size = 1915332 }, + { url = "https://files.pythonhosted.org/packages/f7/ca/9c0854829311fb446020ebb540ee22509731abad886d2859c855dd29b904/pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728", size = 1957926 }, + { url = "https://files.pythonhosted.org/packages/c0/1c/7836b67c42d0cd4441fcd9fafbf6a027ad4b79b6559f80cf11f89fd83648/pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433", size = 2100342 }, + { url = "https://files.pythonhosted.org/packages/a9/f9/b6bcaf874f410564a78908739c80861a171788ef4d4f76f5009656672dfe/pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753", size = 1920344 }, + { url = "https://files.pythonhosted.org/packages/32/fd/ac9cdfaaa7cf2d32590b807d900612b39acb25e5527c3c7e482f0553025b/pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21", size = 1857850 }, + { url = "https://files.pythonhosted.org/packages/08/fe/038f4b2bcae325ea643c8ad353191187a4c92a9c3b913b139289a6f2ef04/pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb", size = 1740265 }, + { url = "https://files.pythonhosted.org/packages/51/14/b215c9c3cbd1edaaea23014d4b3304260823f712d3fdee52549b19b25d62/pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59", size = 1793912 }, + { url = "https://files.pythonhosted.org/packages/62/de/2c3ad79b63ba564878cbce325be725929ba50089cd5156f89ea5155cb9b3/pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577", size = 1942870 }, + { url = "https://files.pythonhosted.org/packages/cb/55/c222af19e4644c741b3f3fe4fd8bbb6b4cdca87d8a49258b61cf7826b19e/pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744", size = 1915610 }, + { url = "https://files.pythonhosted.org/packages/c4/7a/9a8760692a6f76bb54bcd43f245ff3d8b603db695899bbc624099c00af80/pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef", size = 1958403 }, + { url = "https://files.pythonhosted.org/packages/4c/91/9b03166feb914bb5698e2f6499e07c2617e2eebf69f9374d0358d7eb2009/pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8", size = 2101154 }, + { url = "https://files.pythonhosted.org/packages/1d/d9/1d7ecb98318da4cb96986daaf0e20d66f1651d0aeb9e2d4435b916ce031d/pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e", size = 1920855 }, +] + +[[package]] +name = "pygments" +version = "2.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/62/8336eff65bcbc8e4cb5d05b55faf041285951b6e80f33e2bff2024788f31/pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", size = 4891905 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", size = 1205513 }, +] + +[[package]] +name = "pyiceberg" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "fsspec" }, + { name = "mmh3" }, + { name = "pydantic" }, + { name = "pyparsing" }, + { name = "requests" }, + { name = "rich" }, + { name = "sortedcontainers" }, + { name = "strictyaml" }, + { name = "tenacity" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/a0/7e371eafe0f1f757fc4f9e071caf4fd5c1dbf195bd3523fd1b63da1a78ee/pyiceberg-0.7.1.tar.gz", hash = "sha256:2fd8f9717b02673cb9cabe7aed82fc38933241b2bd15cbdc1ff7371e70317a47", size = 568827 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bb/df/f4c4b507845b74d333235d13dd086994e83507dab8ee79cf5092f2a06a7e/pyiceberg-0.7.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:9e0cc837d41e100df81f1f5e580a89668aade694d8c616941d6e11c3a27e49cb", size = 534974 }, + { url = "https://files.pythonhosted.org/packages/9a/80/cd8f215f09c1b1d9a57c39ba873f58b226a36e960ba3df86588e495ac043/pyiceberg-0.7.1-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:71c053c2d484505d1beabd7d5167fe2e835ca865f52ad91ef4852f0d91fa4a25", size = 536578 }, + { url = "https://files.pythonhosted.org/packages/d7/78/3fd8bea871e20710c859ebc998ba42fc028d6e773c329cbb34e567c7e8ba/pyiceberg-0.7.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:0549ab1843bc07037a7d212c2db527ff1755f5d8f80420907952b5b080eb3663", size = 530698 }, + { url = "https://files.pythonhosted.org/packages/a4/a6/821dcd2e4ce67aea7ff6e845d934ed8f6df90726c1bbffae2879cda26bfc/pyiceberg-0.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec4a8000f0bb6ce6ec47f3368ca99f3191e9105662eeef7be2fbb493363cba96", size = 1003347 }, + { url = "https://files.pythonhosted.org/packages/78/cf/9f67f202a6e84444b25254350042d524dc3fd96598af36524eb1b308f58e/pyiceberg-0.7.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0ef6636d3cf370b796529f9a8dbd84e892a2151f0310a8015b9a1e702647ad90", size = 1002989 }, + { url = "https://files.pythonhosted.org/packages/4c/f2/4b6208b84dfbfb1943aa91d14be3db8be7fd22d7f0317e56e3d669658bab/pyiceberg-0.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:9b49320f3e9624075879a4ddb4fa5ddff7d4a03f6561ad6fd73d514c63095367", size = 529640 }, + { url = "https://files.pythonhosted.org/packages/47/3a/dd56ae4fcb1550d6a6c8c869a02e9300e65f2e4a52d425610f388fd0cc18/pyiceberg-0.7.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:27e9b4033691411ef7c49d93df7b3b7f3ed85fe8019cbf0dab5a5ba888b27f34", size = 573861 }, + { url = "https://files.pythonhosted.org/packages/95/d2/8edeedbfc7f5e3baf266f3b6310c7d4e05038346cc7a5edeb40798adc76b/pyiceberg-0.7.1-cp311-cp311-macosx_13_0_x86_64.whl", hash = "sha256:7262ba4f95e05a1421567e24c0db57288dc59974c94676aba34afef121544694", size = 575756 }, + { url = "https://files.pythonhosted.org/packages/92/d3/eb080a2fd8dc7f4793cdc6c95daa7669e04ddd880fd99cb73f630eeb7e46/pyiceberg-0.7.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3eb1fc1d47085b16973999c2111d252fab2a394625c0f25da6515b8c3233c853", size = 567588 }, + { url = "https://files.pythonhosted.org/packages/0c/71/1ec3ca0537112546f2896b40142102881634e0599f04ceeade26f3bb0d76/pyiceberg-0.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1856c5d64197c9335817b8cf7081e490b601385623e5178cb094ee645d4fb24c", size = 1217034 }, + { url = "https://files.pythonhosted.org/packages/d4/9f/2f3200d6294068802bbd3cfce8cad68d3b684d0acce673f08aa9155cf82b/pyiceberg-0.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b6b64006c361220ce103b5bb2f50381a3f851452668adf5a6c61d39f5611e832", size = 1212220 }, + { url = "https://files.pythonhosted.org/packages/d9/a4/8623938d21386ce04de37db69ac703572acef843c7edf624cff22a28bf24/pyiceberg-0.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:57a0b1fb390d26a5b7155de011300300058343e5c2561f4839d69c1775df1d7e", size = 565493 }, + { url = "https://files.pythonhosted.org/packages/75/0f/1a33ed9a1c002f9b65c32449eb0236b6444391a680aaf03e80779cade0b5/pyiceberg-0.7.1-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:84f2119705e31929aa75beb9a8ce97210e56f498e863e31dc499a2120c2842bd", size = 457686 }, + { url = "https://files.pythonhosted.org/packages/2f/51/61d09e664237ab1b9b1246bdc5856a459dd088b826d6489e791fa5e10e02/pyiceberg-0.7.1-cp38-cp38-macosx_13_0_x86_64.whl", hash = "sha256:f99ab8d71a2968af0b512fff1d3dcbd145705a95a26b05121c0df712683c9e0c", size = 458374 }, + { url = "https://files.pythonhosted.org/packages/90/55/dd6a463ac9a94492b802fd7e9f254f9614ce40f322b5aa179a491ccab24a/pyiceberg-0.7.1-cp38-cp38-macosx_14_0_arm64.whl", hash = "sha256:5dc17aa1f53f5b8be12eae35dbcb9885b2534138bdecd31a0088680651fbb98e", size = 456324 }, + { url = "https://files.pythonhosted.org/packages/60/71/fcc5c88f740905de67964de96487f8786072e46c876ce770e2299a3e4e35/pyiceberg-0.7.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:917fdfd372922f9534fe9b6652881a79f82f94d7d3645ddb1925688e3d9aaf4d", size = 613649 }, + { url = "https://files.pythonhosted.org/packages/be/ee/99c8de9c98d1880d9c7870ab90e440e4b4ef45cc5ed24b869845394f82e6/pyiceberg-0.7.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:910fab27c039d62a1fe4a199aaea63d08ada30ead6fd27d56bf038c487837691", size = 613588 }, + { url = "https://files.pythonhosted.org/packages/1f/8b/c81b467a77053ab12353cc39625915bf6a6d33c48acd0110f596e8dfbcd7/pyiceberg-0.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:98db6d18dca335682c32b25406d7ab5afad8f1baea4fbdafda166cbc6557409c", size = 457594 }, + { url = "https://files.pythonhosted.org/packages/06/34/751bf6b8451d5c05b1973b769df9905c2117ee3577ddd3bb1001219a11c1/pyiceberg-0.7.1-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:c76ea44cc1b02c15b65e1b0cc81b5b3f813ba40a4e262416d7a1e84345f44cf1", size = 496603 }, + { url = "https://files.pythonhosted.org/packages/f5/7e/1dd47a3b554636bc75253a76adda16d1f0c28c51d7a5dc9d41f6d73959b6/pyiceberg-0.7.1-cp39-cp39-macosx_13_0_x86_64.whl", hash = "sha256:57485e9331c7e8b1771ea1b2ecdc417dc7a13c7a9a538d74f3f00de98676958b", size = 497762 }, + { url = "https://files.pythonhosted.org/packages/41/47/3105048ae719455c0f2433a98ac4ded44b2d25a98b5251e3eb30b4f026ff/pyiceberg-0.7.1-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:bbc79698292482360be86f8d728237b78ef8eb416e21aea9d53e4a1b4f429ce7", size = 493807 }, + { url = "https://files.pythonhosted.org/packages/fb/dd/fb25822abaf7edc3691f3d099ba708d2b7925180de08309b37f833ede79b/pyiceberg-0.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f84d912fc12866f22882f5de157cbbfab3dcbad8e0a4378557e5b84a0c3f360", size = 809756 }, + { url = "https://files.pythonhosted.org/packages/5a/4b/b8b6446b5755a84119d09bac43d0abcb5a8bed73c4ee19137013064ce241/pyiceberg-0.7.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f86c535735e57f1a0c76fd0f505e0b172cc212c96a3789f3845220695e792157", size = 809516 }, + { url = "https://files.pythonhosted.org/packages/fd/84/e3b87a9d9200bfb2ec6deb1e86660063086abfcfded32e02712e030d0782/pyiceberg-0.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:d8bee5aa4b34e6028f0465cf405bc4e963e160ac52efbe4bdbc499bb55bc2780", size = 493898 }, + { url = "https://files.pythonhosted.org/packages/a0/90/5718ebc67c4992200dc63a5b8c20f3c2398096b9f4a974ed19723195c1ca/pyiceberg-0.7.1-pp310-pypy310_pp73-macosx_12_0_x86_64.whl", hash = "sha256:9ae56197db8570553491173adfd2e01a03ae116a1f9fa78ba5a1a1c4e2ad3dbf", size = 669140 }, + { url = "https://files.pythonhosted.org/packages/87/d7/711dcbeef3b997cd516bdb9025fe12aed802066ca09470171a43aa9d473c/pyiceberg-0.7.1-pp310-pypy310_pp73-macosx_13_0_x86_64.whl", hash = "sha256:e28adc58500ca72e45a07ee4dcd90b63699a8875f178001bd12ace37294c5814", size = 668770 }, + { url = "https://files.pythonhosted.org/packages/37/cf/b1a99eb222574c92eb149a558c4d29641d10dbc73783db9b2068e8c15f71/pyiceberg-0.7.1-pp310-pypy310_pp73-macosx_14_0_arm64.whl", hash = "sha256:1ae47f2d0e87dccd158ae8dafc47125f9739858068fc3add8940f5585ea40ead", size = 657202 }, + { url = "https://files.pythonhosted.org/packages/c8/65/244d68f414f93b5f8732a4bdfffacdacdbef07bf556ffe9816064a020d56/pyiceberg-0.7.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb94c3e11354f85daafb2b2f3e13a245bcb35848135b5ed4e8c83e61393c36ea", size = 1329793 }, + { url = "https://files.pythonhosted.org/packages/83/cb/82b141dbea405c640335c5df330a437617cb0ef23669b86503ee5f905101/pyiceberg-0.7.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4fe212b0594128d183711c6efb1a40ea5f17372e11595a84f4565eb9fe97c703", size = 657765 }, + { url = "https://files.pythonhosted.org/packages/19/38/73f150156d96ff6f5e84633bcc058483d198078bd6c05718dfa1b364a090/pyiceberg-0.7.1-pp38-pypy38_pp73-macosx_12_0_x86_64.whl", hash = "sha256:35ce27243b86f7057fbd4594dbe5d6b2a1ccd738ba6b65c2a4f3af249f1e8364", size = 605077 }, + { url = "https://files.pythonhosted.org/packages/88/f6/f60b2adfb0d6bf98d6c9224539d37901689970bf2b7318f0bb996e796755/pyiceberg-0.7.1-pp38-pypy38_pp73-macosx_13_0_x86_64.whl", hash = "sha256:56e254623669ab03e779e4b696b7e36cd1c6973e8523200ccc232695742e269d", size = 606270 }, + { url = "https://files.pythonhosted.org/packages/54/98/fc75924117892ae5a4b521ba8a751a77deda8d3b7035f3e7ab7f268512ee/pyiceberg-0.7.1-pp38-pypy38_pp73-macosx_14_0_arm64.whl", hash = "sha256:e07b59a5998c6d4cac258763c6c160234e1e3362a2097808bd02e05e0c16208a", size = 597103 }, + { url = "https://files.pythonhosted.org/packages/ce/13/a56fe9e30dca5f1e7cba0f87f5f3065901eb764903658501b2280edc46de/pyiceberg-0.7.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cde005aa075fc0e5ed0095438b0a4d39534e3cb84889b93d6aa265dd2e072eff", size = 1254229 }, + { url = "https://files.pythonhosted.org/packages/8c/02/deb8c2cf111a34cd817ba3198aac7de39d41929026eddbefee441931b217/pyiceberg-0.7.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:1950f2186f1c99e0d187ffee86e2f8d6bbbad9b0079573a7255b85ffaaa82e79", size = 596072 }, + { url = "https://files.pythonhosted.org/packages/44/3f/4039bb4b8126bf9e7e5259663f38337e1e5ee593d69c0c301fe1828c0317/pyiceberg-0.7.1-pp39-pypy39_pp73-macosx_12_0_x86_64.whl", hash = "sha256:273b4b642168a5e64fedc0073e18fd481b11d6891f9e44ceb5ce27126fe418f7", size = 637098 }, + { url = "https://files.pythonhosted.org/packages/61/04/d89ba1c6cc553d164f7b39e1d0bfe86f18368fc1488156a0c6e18a56c16b/pyiceberg-0.7.1-pp39-pypy39_pp73-macosx_13_0_x86_64.whl", hash = "sha256:9a2dbc621cdd4f0c92f5b2520f2b266b976317ff8a984aec2ce9240ee3d80471", size = 637515 }, + { url = "https://files.pythonhosted.org/packages/1e/38/92616c4852f0111e73f3bc5793eb22839333fdd099bfec3f4fb625e3ca07/pyiceberg-0.7.1-pp39-pypy39_pp73-macosx_14_0_arm64.whl", hash = "sha256:34c2d6e9d027b66f8d531fcefeb5cda8b2a37e70170c01f6f1c977954d733c45", size = 627135 }, + { url = "https://files.pythonhosted.org/packages/fd/b8/27b538bfe88fcc21097a0760b83595ce5a482491957d6306c8d62f5fd5a4/pyiceberg-0.7.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3e97fb65862db191685355e1eb8d97d41d00679a3df1fbd7a1c2560b9e3e6d8", size = 1292023 }, + { url = "https://files.pythonhosted.org/packages/ce/a4/484082b02e362dad071a140da3f0c673205f5ad1ac58de67b93bb4b524c2/pyiceberg-0.7.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:98a0de3c2f194907b07522769facbcacdff0ec9577f9710273ba7e0aa8465652", size = 626908 }, +] + +[[package]] +name = "pylance" +version = "0.10.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "pyarrow" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/4e/c67870c01a06f9a69090159a1b0b68bad697eabd836f3edba6109f6b5ceb/pylance-0.10.2-cp38-abi3-macosx_10_15_x86_64.whl", hash = "sha256:e045609dde4701c37136d3c1a047a7dff072a2ca06c9440bb0ca2c56b629a35f", size = 20405298 }, + { url = "https://files.pythonhosted.org/packages/4e/56/e46bd80259017da7408d883e1bd7abc605ad0a51741ceeba874c72a6b50e/pylance-0.10.2-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c801fc8da73418f049e60c494431cd613253bcd195bd93abe13713f2a122df0c", size = 18780440 }, + { url = "https://files.pythonhosted.org/packages/49/51/8623a6e96e44c9421accca7e60e06d03ceb6b68a43629e2df2b30430bcd4/pylance-0.10.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbec7eeb29d479319db61c7fd3bb91f096c8fd13824feab0773a5b5e268ca698", size = 21561718 }, + { url = "https://files.pythonhosted.org/packages/b5/01/7aa996ad7fe25aad3b8c18e54a24c2fcd5aa399494e672b3c6bc2f747684/pylance-0.10.2-cp38-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:86c1ef6cefccf23e1b65a8686054aea6498af6cbcf370c35a92cd6f5bc87db11", size = 19940659 }, + { url = "https://files.pythonhosted.org/packages/e2/02/f9526aefee1b4c784a6de792607e5811daeeaa505a365742855f7d89bc84/pylance-0.10.2-cp38-abi3-win_amd64.whl", hash = "sha256:cdb776f9c22bd4b488792a40f68c3750b2e06795c053f4beb0356fcf34aab8ad", size = 22030224 }, +] + +[[package]] +name = "pyparsing" +version = "3.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/08/13f3bce01b2061f2bbd582c9df82723de943784cf719a35ac886c652043a/pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032", size = 900231 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/0c/0e3c05b1c87bb6a1c76d281b0f35e78d2d80ac91b5f8f524cebf77f51049/pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c", size = 104100 }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, +] + +[[package]] +name = "pytz" +version = "2024.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/31/3c70bf7603cc2dca0f19bdc53b4537a797747a58875b552c8c413d963a3f/pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a", size = 319692 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/c3/005fcca25ce078d2cc29fd559379817424e94885510568bc1bc53d7d5846/pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725", size = 508002 }, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/95/a3fac87cb7158e231b5a6012e438c647e1a87f09f8e0d123acec8ab8bf71/PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", size = 184199 }, + { url = "https://files.pythonhosted.org/packages/c7/7a/68bd47624dab8fd4afbfd3c48e3b79efe09098ae941de5b58abcbadff5cb/PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", size = 171758 }, + { url = "https://files.pythonhosted.org/packages/49/ee/14c54df452143b9ee9f0f29074d7ca5516a36edb0b4cc40c3f280131656f/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", size = 718463 }, + { url = "https://files.pythonhosted.org/packages/4d/61/de363a97476e766574650d742205be468921a7b532aa2499fcd886b62530/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", size = 719280 }, + { url = "https://files.pythonhosted.org/packages/6b/4e/1523cb902fd98355e2e9ea5e5eb237cbc5f3ad5f3075fa65087aa0ecb669/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", size = 751239 }, + { url = "https://files.pythonhosted.org/packages/b7/33/5504b3a9a4464893c32f118a9cc045190a91637b119a9c881da1cf6b7a72/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", size = 695802 }, + { url = "https://files.pythonhosted.org/packages/5c/20/8347dcabd41ef3a3cdc4f7b7a2aff3d06598c8779faa189cdbf878b626a4/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", size = 720527 }, + { url = "https://files.pythonhosted.org/packages/be/aa/5afe99233fb360d0ff37377145a949ae258aaab831bde4792b32650a4378/PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", size = 144052 }, + { url = "https://files.pythonhosted.org/packages/b5/84/0fa4b06f6d6c958d207620fc60005e241ecedceee58931bb20138e1e5776/PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", size = 161774 }, + { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612 }, + { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040 }, + { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829 }, + { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167 }, + { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952 }, + { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301 }, + { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638 }, + { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850 }, + { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980 }, + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, + { url = "https://files.pythonhosted.org/packages/74/d9/323a59d506f12f498c2097488d80d16f4cf965cee1791eab58b56b19f47a/PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a", size = 183218 }, + { url = "https://files.pythonhosted.org/packages/74/cc/20c34d00f04d785f2028737e2e2a8254e1425102e730fee1d6396f832577/PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5", size = 728067 }, + { url = "https://files.pythonhosted.org/packages/20/52/551c69ca1501d21c0de51ddafa8c23a0191ef296ff098e98358f69080577/PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d", size = 757812 }, + { url = "https://files.pythonhosted.org/packages/fd/7f/2c3697bba5d4aa5cc2afe81826d73dfae5f049458e44732c7a0938baa673/PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083", size = 746531 }, + { url = "https://files.pythonhosted.org/packages/8c/ab/6226d3df99900e580091bb44258fde77a8433511a86883bd4681ea19a858/PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706", size = 800820 }, + { url = "https://files.pythonhosted.org/packages/a0/99/a9eb0f3e710c06c5d922026f6736e920d431812ace24aae38228d0d64b04/PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a", size = 145514 }, + { url = "https://files.pythonhosted.org/packages/75/8a/ee831ad5fafa4431099aa4e078d4c8efd43cd5e48fbc774641d233b683a9/PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff", size = 162702 }, + { url = "https://files.pythonhosted.org/packages/65/d8/b7a1db13636d7fb7d4ff431593c510c8b8fca920ade06ca8ef20015493c5/PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", size = 184777 }, + { url = "https://files.pythonhosted.org/packages/0a/02/6ec546cd45143fdf9840b2c6be8d875116a64076218b61d68e12548e5839/PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", size = 172318 }, + { url = "https://files.pythonhosted.org/packages/0e/9a/8cc68be846c972bda34f6c2a93abb644fb2476f4dcc924d52175786932c9/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", size = 720891 }, + { url = "https://files.pythonhosted.org/packages/e9/6c/6e1b7f40181bc4805e2e07f4abc10a88ce4648e7e95ff1abe4ae4014a9b2/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", size = 722614 }, + { url = "https://files.pythonhosted.org/packages/3d/32/e7bd8535d22ea2874cef6a81021ba019474ace0d13a4819c2a4bce79bd6a/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", size = 737360 }, + { url = "https://files.pythonhosted.org/packages/d7/12/7322c1e30b9be969670b672573d45479edef72c9a0deac3bb2868f5d7469/PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", size = 699006 }, + { url = "https://files.pythonhosted.org/packages/82/72/04fcad41ca56491995076630c3ec1e834be241664c0c09a64c9a2589b507/PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", size = 723577 }, + { url = "https://files.pythonhosted.org/packages/ed/5e/46168b1f2757f1fcd442bc3029cd8767d88a98c9c05770d8b420948743bb/PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", size = 144593 }, + { url = "https://files.pythonhosted.org/packages/19/87/5124b1c1f2412bb95c59ec481eaf936cd32f0fe2a7b16b97b81c4c017a6a/PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", size = 162312 }, +] + +[[package]] +name = "ratelimiter" +version = "1.2.0.post0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5b/e0/b36010bddcf91444ff51179c076e4a09c513674a56758d7cfea4f6520e29/ratelimiter-1.2.0.post0.tar.gz", hash = "sha256:5c395dcabdbbde2e5178ef3f89b568a3066454a6ddc223b76473dac22f89b4f7", size = 9182 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/80/2164fa1e863ad52cc8d870855fba0fbb51edd943edffd516d54b5f6f8ff8/ratelimiter-1.2.0.post0-py3-none-any.whl", hash = "sha256:a52be07bc0bb0b3674b4b304550f10c769bbb00fead3072e035904474259809f", size = 6642 }, +] + +[[package]] +name = "ray" +version = "2.36.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiosignal" }, + { name = "click" }, + { name = "filelock" }, + { name = "frozenlist" }, + { name = "jsonschema" }, + { name = "msgpack" }, + { name = "packaging" }, + { name = "protobuf" }, + { name = "pyyaml" }, + { name = "requests" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/d7/5e4fe972b42a8942e0dd7c73f51cd28f31cfdb320208bf533c96f7867228/ray-2.36.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:3ea9059396c1c9541c45d3f4bf2be77de1dcb3214c47bd6c2294d42e063da8a1", size = 65791371 }, + { url = "https://files.pythonhosted.org/packages/da/59/ed84996548a2386cd74a7da5881036977d7892df65067af12a94c5186733/ray-2.36.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e17446ddc6f335f87d90401b8c00f167b40326601e984635745e13a89110dd7", size = 63231064 }, + { url = "https://files.pythonhosted.org/packages/b2/9b/c3aba01cda2c678f35e8136817823b1472b2b91e8f7b5325f9149577b7f0/ray-2.36.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:cca1d310eab2a4b6220aa938e05dfeb5e1b55f6f1f0a9edcdeecb1be52ff126f", size = 64564147 }, + { url = "https://files.pythonhosted.org/packages/5a/b8/16dcdca811e52c42f13ebc60f1082b406f8a8207bd3feea626ad4e7a6d09/ray-2.36.1-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:ef8af267a488437a415feb5938a8dfe57a553a1ca845123c465964463e78e768", size = 65451610 }, + { url = "https://files.pythonhosted.org/packages/9e/19/03474bc660f8c92309b59255a4c041d3ca98db7ee7f5736a7f50379b6c86/ray-2.36.1-cp310-cp310-win_amd64.whl", hash = "sha256:afc6c5cda6fbedbb84b5f7504563cd1742a603e3c2491a4096a8b97ce7a29945", size = 24897232 }, + { url = "https://files.pythonhosted.org/packages/d0/ed/28f7c971275f4971a4c10ef4950b567dcb404b4cf11cd6eea3637b23408e/ray-2.36.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:1a2aa037d6537bf9576f1762170178fd8443e24893a023ebbb5f30754f46bd52", size = 65729990 }, + { url = "https://files.pythonhosted.org/packages/e4/df/5916c5afeb04125d82943f11d387c921b96cec1c35d2e18e47187ad84f6b/ray-2.36.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7211d236aeb7ed197c0c29b0d421945ccdd378a39355e545723a6ef91222f509", size = 63166090 }, + { url = "https://files.pythonhosted.org/packages/c1/5c/4e9a9638e7fbe0824f5fa5c454c8d6fdf94cf841098cf0582fb60b0bc2ee/ray-2.36.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:17d7aad7590fe3ffa7e5d2d9635e565197f209c671ebfee7dbb6b9032bef04a3", size = 64674892 }, + { url = "https://files.pythonhosted.org/packages/26/0f/1d97c13f8d8ef74dbe5d4b91da7cc7748faf726cbf8fb9609430c8888467/ray-2.36.1-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:58089d955ceac983d585b03d4024379f1515880b091eacf5a1a326f32120c423", size = 65552679 }, + { url = "https://files.pythonhosted.org/packages/62/21/7c406717d8c5871ca3b951a56c7ce3b1d7039198d45766a6e040857fa9fc/ray-2.36.1-cp311-cp311-win_amd64.whl", hash = "sha256:41c78f5154a8adfdc9f7d0604802cde6eda233a1dbe6a481946d8125eda585ba", size = 24837835 }, + { url = "https://files.pythonhosted.org/packages/af/10/ba201c3f3712257484250f2d67e86e1b1fca9bcf48be44690c6dfaecfb47/ray-2.36.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:08eff8f26e2bce3f87b707518a4a5e7a0a76eb56a6125d8d83874001d21bf087", size = 65710448 }, + { url = "https://files.pythonhosted.org/packages/44/9b/72c0a6b4c9611b573360b539ef8decf10571e2c1380f9239a81ba7a0d2c8/ray-2.36.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:28431bb429193c9501de5e9b724258400c364dd7f4d55d34476541a65398aa7f", size = 63149214 }, + { url = "https://files.pythonhosted.org/packages/80/a0/0c756ca452c501dca3bdfa3e0063d8dde3e517e3f110b680c89268a11fb0/ray-2.36.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:dbaed259f3330c6d34f419d62295ed44bf8ba46c3a00ef2386f8b74a46b49c2d", size = 64697084 }, + { url = "https://files.pythonhosted.org/packages/60/97/ffb0e858bd8c814f7f65ce52d7768b8822afc158a63bcffb9ddd36e02419/ray-2.36.1-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:57ac9edc74d793c35835aba2d416d7c89c26b5d2d9bab6ec2221fc2e9578adc7", size = 65599082 }, + { url = "https://files.pythonhosted.org/packages/b6/95/2d8398f8ab44d6f97d5bb3d581a8a70a4a2d2b5e50328414ed74e30fe004/ray-2.36.1-cp312-cp312-win_amd64.whl", hash = "sha256:ac9b3bbe0922fc4799b97a63bdb016061e27328f40b94c529f7fa45b1eaa0f5a", size = 24829765 }, + { url = "https://files.pythonhosted.org/packages/4f/2b/6ea66467785b6dc0337c55c94e903a1c06ce939327d7151ae4aa7791de23/ray-2.36.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:2cabef80e4ce8b3cfe6e49c525607b9cf8dc25391bb9f147fcd31f9fbae34d15", size = 65807180 }, + { url = "https://files.pythonhosted.org/packages/9d/9b/6c5cf2249691fc116f9c12c34366f23363d55de5f26ea7d8a5781f00cd3a/ray-2.36.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:566fe0d1b3372bd0f86dbecec3d111f5cfe0d64358b9fac75ab8fc05af06bb21", size = 63239349 }, + { url = "https://files.pythonhosted.org/packages/a3/5e/d6d7edbd1ba817e67eb15d432b6937a1208321c93d47598e3900043c6062/ray-2.36.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:7ffe43609d22d05065a0c5b225ce7344119ac88e32a8e54c4f1105485a9e3ea7", size = 64592017 }, + { url = "https://files.pythonhosted.org/packages/25/54/e65cbc04f5dc08badaac608d5fcac4c5c8acc8b29714d6460c7ee95a9604/ray-2.36.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:f336c9fee461928c1d811513f4e6584f8e95eb1b27bdb286af434f2eb921b66b", size = 65480123 }, + { url = "https://files.pythonhosted.org/packages/7d/97/cbc21fb04249ac590fbe322b8f732d687bf8a688542d2f8cffcb5a052ed3/ray-2.36.1-cp39-cp39-win_amd64.whl", hash = "sha256:08bc2e7e19a51fb31364da3a88427edc9b30c7468144ef9532eb9035dd033994", size = 24907187 }, +] + +[package.optional-dependencies] +client = [ + { name = "grpcio" }, +] +data = [ + { name = "fsspec" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "pyarrow" }, +] + +[[package]] +name = "referencing" +version = "0.35.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/5b/73ca1f8e72fff6fa52119dbd185f73a907b1989428917b24cff660129b6d/referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c", size = 62991 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de", size = 26684 }, +] + +[[package]] +name = "requests" +version = "2.32.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, +] + +[[package]] +name = "retry" +version = "0.9.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "decorator" }, + { name = "py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/72/75d0b85443fbc8d9f38d08d2b1b67cc184ce35280e4a3813cda2f445f3a4/retry-0.9.2.tar.gz", hash = "sha256:f8bfa8b99b69c4506d6f5bd3b0aabf77f98cdb17f3c9fc3f5ca820033336fba4", size = 6448 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/0d/53aea75710af4528a25ed6837d71d117602b01946b307a3912cb3cfcbcba/retry-0.9.2-py2.py3-none-any.whl", hash = "sha256:ccddf89761fa2c726ab29391837d4327f819ea14d244c232a1d24c67a2f98606", size = 7986 }, +] + +[[package]] +name = "rich" +version = "13.9.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/aa/9e/1784d15b057b0075e5136445aaea92d23955aad2c93eaede673718a40d95/rich-13.9.2.tar.gz", hash = "sha256:51a2c62057461aaf7152b4d611168f93a9fc73068f8ded2790f29fe2b5366d0c", size = 222843 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl", hash = "sha256:8c82a3d3f8dcfe9e734771313e606b39d8247bb6b826e196f4914b333b743cf1", size = 242117 }, +] + +[[package]] +name = "rpds-py" +version = "0.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/55/64/b693f262791b818880d17268f3f8181ef799b0d187f6f731b1772e05a29a/rpds_py-0.20.0.tar.gz", hash = "sha256:d72a210824facfdaf8768cf2d7ca25a042c30320b3020de2fa04640920d4e121", size = 25814 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/2d/a7e60483b72b91909e18f29a5c5ae847bac4e2ae95b77bb77e1f41819a58/rpds_py-0.20.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3ad0fda1635f8439cde85c700f964b23ed5fc2d28016b32b9ee5fe30da5c84e2", size = 318432 }, + { url = "https://files.pythonhosted.org/packages/b5/b4/f15b0c55a6d880ce74170e7e28c3ed6c5acdbbd118df50b91d1dabf86008/rpds_py-0.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9bb4a0d90fdb03437c109a17eade42dfbf6190408f29b2744114d11586611d6f", size = 311333 }, + { url = "https://files.pythonhosted.org/packages/36/10/3f4e490fe6eb069c07c22357d0b4804cd94cb9f8d01345ef9b1d93482b9d/rpds_py-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6377e647bbfd0a0b159fe557f2c6c602c159fc752fa316572f012fc0bf67150", size = 366697 }, + { url = "https://files.pythonhosted.org/packages/f5/c8/cd6ab31b4424c7fab3b17e153b6ea7d1bb0d7cabea5c1ef683cc8adb8bc2/rpds_py-0.20.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb851b7df9dda52dc1415ebee12362047ce771fc36914586b2e9fcbd7d293b3e", size = 368386 }, + { url = "https://files.pythonhosted.org/packages/60/5e/642a44fda6dda90b5237af7a0ef1d088159c30a504852b94b0396eb62125/rpds_py-0.20.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e0f80b739e5a8f54837be5d5c924483996b603d5502bfff79bf33da06164ee2", size = 395374 }, + { url = "https://files.pythonhosted.org/packages/7c/b5/ff18c093c9e72630f6d6242e5ccb0728ef8265ba0a154b5972f89d23790a/rpds_py-0.20.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a8c94dad2e45324fc74dce25e1645d4d14df9a4e54a30fa0ae8bad9a63928e3", size = 433189 }, + { url = "https://files.pythonhosted.org/packages/4a/6d/1166a157b227f2333f8e8ae320b6b7ea2a6a38fbe7a3563ad76dffc8608d/rpds_py-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e604fe73ba048c06085beaf51147eaec7df856824bfe7b98657cf436623daf", size = 354849 }, + { url = "https://files.pythonhosted.org/packages/70/a4/70ea49863ea09ae4c2971f2eef58e80b757e3c0f2f618c5815bb751f7847/rpds_py-0.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:df3de6b7726b52966edf29663e57306b23ef775faf0ac01a3e9f4012a24a4140", size = 373233 }, + { url = "https://files.pythonhosted.org/packages/3b/d3/822a28152a1e7e2ba0dc5d06cf8736f4cd64b191bb6ec47fb51d1c3c5ccf/rpds_py-0.20.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf258ede5bc22a45c8e726b29835b9303c285ab46fc7c3a4cc770736b5304c9f", size = 541852 }, + { url = "https://files.pythonhosted.org/packages/c6/a5/6ef91e4425dc8b3445ff77d292fc4c5e37046462434a0423c4e0a596a8bd/rpds_py-0.20.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:55fea87029cded5df854ca7e192ec7bdb7ecd1d9a3f63d5c4eb09148acf4a7ce", size = 547630 }, + { url = "https://files.pythonhosted.org/packages/72/f8/d5625ee05c4e5c478954a16d9359069c66fe8ac8cd5ddf28f80d3b321837/rpds_py-0.20.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ae94bd0b2f02c28e199e9bc51485d0c5601f58780636185660f86bf80c89af94", size = 525766 }, + { url = "https://files.pythonhosted.org/packages/94/3c/1ff1ed6ae323b3e16fdfcdae0f0a67f373a6c3d991229dc32b499edeffb7/rpds_py-0.20.0-cp310-none-win32.whl", hash = "sha256:28527c685f237c05445efec62426d285e47a58fb05ba0090a4340b73ecda6dee", size = 199174 }, + { url = "https://files.pythonhosted.org/packages/ec/ba/5762c0aee2403dfea14ed74b0f8a2415cfdbb21cf745d600d9a8ac952c5b/rpds_py-0.20.0-cp310-none-win_amd64.whl", hash = "sha256:238a2d5b1cad28cdc6ed15faf93a998336eb041c4e440dd7f902528b8891b399", size = 213543 }, + { url = "https://files.pythonhosted.org/packages/ab/2a/191374c52d7be0b056cc2a04d718d2244c152f915d4a8d2db2aacc526189/rpds_py-0.20.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac2f4f7a98934c2ed6505aead07b979e6f999389f16b714448fb39bbaa86a489", size = 318369 }, + { url = "https://files.pythonhosted.org/packages/0e/6a/2c9fdcc6d235ac0d61ec4fd9981184689c3e682abd05e3caa49bccb9c298/rpds_py-0.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:220002c1b846db9afd83371d08d239fdc865e8f8c5795bbaec20916a76db3318", size = 311303 }, + { url = "https://files.pythonhosted.org/packages/d2/b2/725487d29633f64ef8f9cbf4729111a0b61702c8f8e94db1653930f52cce/rpds_py-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db", size = 366424 }, + { url = "https://files.pythonhosted.org/packages/7a/8c/668195ab9226d01b7cf7cd9e59c1c0be1df05d602df7ec0cf46f857dcf59/rpds_py-0.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:758406267907b3781beee0f0edfe4a179fbd97c0be2e9b1154d7f0a1279cf8e5", size = 368359 }, + { url = "https://files.pythonhosted.org/packages/52/28/356f6a39c1adeb02cf3e5dd526f5e8e54e17899bef045397abcfbf50dffa/rpds_py-0.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d61339e9f84a3f0767b1995adfb171a0d00a1185192718a17af6e124728e0f5", size = 394886 }, + { url = "https://files.pythonhosted.org/packages/a2/65/640fb1a89080a8fb6f4bebd3dafb65a2edba82e2e44c33e6eb0f3e7956f1/rpds_py-0.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1259c7b3705ac0a0bd38197565a5d603218591d3f6cee6e614e380b6ba61c6f6", size = 432416 }, + { url = "https://files.pythonhosted.org/packages/a7/e8/85835077b782555d6b3416874b702ea6ebd7db1f145283c9252968670dd5/rpds_py-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c1dc0f53856b9cc9a0ccca0a7cc61d3d20a7088201c0937f3f4048c1718a209", size = 354819 }, + { url = "https://files.pythonhosted.org/packages/4f/87/1ac631e923d65cbf36fbcfc6eaa702a169496de1311e54be142f178e53ee/rpds_py-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7e60cb630f674a31f0368ed32b2a6b4331b8350d67de53c0359992444b116dd3", size = 373282 }, + { url = "https://files.pythonhosted.org/packages/e4/ce/cb316f7970189e217b998191c7cf0da2ede3d5437932c86a7210dc1e9994/rpds_py-0.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dbe982f38565bb50cb7fb061ebf762c2f254ca3d8c20d4006878766e84266272", size = 541540 }, + { url = "https://files.pythonhosted.org/packages/90/d7/4112d7655ec8aff168ecc91d4ceb51c557336edde7e6ccf6463691a2f253/rpds_py-0.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:514b3293b64187172bc77c8fb0cdae26981618021053b30d8371c3a902d4d5ad", size = 547640 }, + { url = "https://files.pythonhosted.org/packages/ab/44/4f61d64dfed98cc71623f3a7fcb612df636a208b4b2c6611eaa985e130a9/rpds_py-0.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d0a26ffe9d4dd35e4dfdd1e71f46401cff0181c75ac174711ccff0459135fa58", size = 525555 }, + { url = "https://files.pythonhosted.org/packages/35/f2/a862d81eacb21f340d584cd1c749c289979f9a60e9229f78bffc0418a199/rpds_py-0.20.0-cp311-none-win32.whl", hash = "sha256:89c19a494bf3ad08c1da49445cc5d13d8fefc265f48ee7e7556839acdacf69d0", size = 199338 }, + { url = "https://files.pythonhosted.org/packages/cc/ec/77d0674f9af4872919f3738018558dd9d37ad3f7ad792d062eadd4af7cba/rpds_py-0.20.0-cp311-none-win_amd64.whl", hash = "sha256:c638144ce971df84650d3ed0096e2ae7af8e62ecbbb7b201c8935c370df00a2c", size = 213585 }, + { url = "https://files.pythonhosted.org/packages/89/b7/f9682c5cc37fcc035f4a0fc33c1fe92ec9cbfdee0cdfd071cf948f53e0df/rpds_py-0.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a84ab91cbe7aab97f7446652d0ed37d35b68a465aeef8fc41932a9d7eee2c1a6", size = 321468 }, + { url = "https://files.pythonhosted.org/packages/b8/ad/fc82be4eaceb8d444cb6fc1956ce972b3a0795104279de05e0e4131d0a47/rpds_py-0.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:56e27147a5a4c2c21633ff8475d185734c0e4befd1c989b5b95a5d0db699b21b", size = 313062 }, + { url = "https://files.pythonhosted.org/packages/0e/1c/6039e80b13a08569a304dc13476dc986352dca4598e909384db043b4e2bb/rpds_py-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2580b0c34583b85efec8c5c5ec9edf2dfe817330cc882ee972ae650e7b5ef739", size = 370168 }, + { url = "https://files.pythonhosted.org/packages/dc/c9/5b9aa35acfb58946b4b785bc8e700ac313669e02fb100f3efa6176a83e81/rpds_py-0.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b80d4a7900cf6b66bb9cee5c352b2d708e29e5a37fe9bf784fa97fc11504bf6c", size = 371376 }, + { url = "https://files.pythonhosted.org/packages/7b/dd/0e0dbeb70d8a5357d2814764d467ded98d81d90d3570de4fb05ec7224f6b/rpds_py-0.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50eccbf054e62a7b2209b28dc7a22d6254860209d6753e6b78cfaeb0075d7bee", size = 397200 }, + { url = "https://files.pythonhosted.org/packages/e4/da/a47d931eb688ccfd77a7389e45935c79c41e8098d984d87335004baccb1d/rpds_py-0.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49a8063ea4296b3a7e81a5dfb8f7b2d73f0b1c20c2af401fb0cdf22e14711a96", size = 426824 }, + { url = "https://files.pythonhosted.org/packages/0f/f7/a59a673594e6c2ff2dbc44b00fd4ecdec2fc399bb6a7bd82d612699a0121/rpds_py-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea438162a9fcbee3ecf36c23e6c68237479f89f962f82dae83dc15feeceb37e4", size = 357967 }, + { url = "https://files.pythonhosted.org/packages/5f/61/3ba1905396b2cb7088f9503a460b87da33452da54d478cb9241f6ad16d00/rpds_py-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18d7585c463087bddcfa74c2ba267339f14f2515158ac4db30b1f9cbdb62c8ef", size = 378905 }, + { url = "https://files.pythonhosted.org/packages/08/31/6d0df9356b4edb0a3a077f1ef714e25ad21f9f5382fc490c2383691885ea/rpds_py-0.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d4c7d1a051eeb39f5c9547e82ea27cbcc28338482242e3e0b7768033cb083821", size = 546348 }, + { url = "https://files.pythonhosted.org/packages/ae/15/d33c021de5cb793101df9961c3c746dfc476953dbbf5db337d8010dffd4e/rpds_py-0.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4df1e3b3bec320790f699890d41c59d250f6beda159ea3c44c3f5bac1976940", size = 553152 }, + { url = "https://files.pythonhosted.org/packages/70/2d/5536d28c507a4679179ab15aa0049440e4d3dd6752050fa0843ed11e9354/rpds_py-0.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2cf126d33a91ee6eedc7f3197b53e87a2acdac63602c0f03a02dd69e4b138174", size = 528807 }, + { url = "https://files.pythonhosted.org/packages/e3/62/7ebe6ec0d3dd6130921f8cffb7e34afb7f71b3819aa0446a24c5e81245ec/rpds_py-0.20.0-cp312-none-win32.whl", hash = "sha256:8bc7690f7caee50b04a79bf017a8d020c1f48c2a1077ffe172abec59870f1139", size = 200993 }, + { url = "https://files.pythonhosted.org/packages/ec/2f/b938864d66b86a6e4acadefdc56de75ef56f7cafdfd568a6464605457bd5/rpds_py-0.20.0-cp312-none-win_amd64.whl", hash = "sha256:0e13e6952ef264c40587d510ad676a988df19adea20444c2b295e536457bc585", size = 214458 }, + { url = "https://files.pythonhosted.org/packages/99/32/43b919a0a423c270a838ac2726b1c7168b946f2563fd99a51aaa9692d00f/rpds_py-0.20.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:aa9a0521aeca7d4941499a73ad7d4f8ffa3d1affc50b9ea11d992cd7eff18a29", size = 321465 }, + { url = "https://files.pythonhosted.org/packages/58/a9/c4d899cb28e9e47b0ff12462e8f827381f243176036f17bef9c1604667f2/rpds_py-0.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1f1d51eccb7e6c32ae89243cb352389228ea62f89cd80823ea7dd1b98e0b91", size = 312900 }, + { url = "https://files.pythonhosted.org/packages/8f/90/9e51670575b5dfaa8c823369ef7d943087bfb73d4f124a99ad6ef19a2b26/rpds_py-0.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a86a9b96070674fc88b6f9f71a97d2c1d3e5165574615d1f9168ecba4cecb24", size = 370973 }, + { url = "https://files.pythonhosted.org/packages/fc/c1/523f2a03f853fc0d4c1acbef161747e9ab7df0a8abf6236106e333540921/rpds_py-0.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c8ef2ebf76df43f5750b46851ed1cdf8f109d7787ca40035fe19fbdc1acc5a7", size = 370890 }, + { url = "https://files.pythonhosted.org/packages/51/ca/2458a771f16b0931de4d384decbe43016710bc948036c8f4562d6e063437/rpds_py-0.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b25f024b421d5859d156750ea9a65651793d51b76a2e9238c05c9d5f203a9", size = 397174 }, + { url = "https://files.pythonhosted.org/packages/00/7d/6e06807f6305ea2408b364efb0eef83a6e21b5e7b5267ad6b473b9a7e416/rpds_py-0.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57eb94a8c16ab08fef6404301c38318e2c5a32216bf5de453e2714c964c125c8", size = 426449 }, + { url = "https://files.pythonhosted.org/packages/8c/d1/6c9e65260a819a1714510a7d69ac1d68aa23ee9ce8a2d9da12187263c8fc/rpds_py-0.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1940dae14e715e2e02dfd5b0f64a52e8374a517a1e531ad9412319dc3ac7879", size = 357698 }, + { url = "https://files.pythonhosted.org/packages/5d/fb/ecea8b5286d2f03eec922be7173a03ed17278944f7c124348f535116db15/rpds_py-0.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d20277fd62e1b992a50c43f13fbe13277a31f8c9f70d59759c88f644d66c619f", size = 378530 }, + { url = "https://files.pythonhosted.org/packages/e3/e3/ac72f858957f52a109c588589b73bd2fad4a0fc82387fb55fb34aeb0f9cd/rpds_py-0.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:06db23d43f26478303e954c34c75182356ca9aa7797d22c5345b16871ab9c45c", size = 545753 }, + { url = "https://files.pythonhosted.org/packages/b2/a4/a27683b519d5fc98e4390a3b130117d80fd475c67aeda8aac83c0e8e326a/rpds_py-0.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b2a5db5397d82fa847e4c624b0c98fe59d2d9b7cf0ce6de09e4d2e80f8f5b3f2", size = 552443 }, + { url = "https://files.pythonhosted.org/packages/a1/ed/c074d248409b4432b1ccb2056974175fa0af2d1bc1f9c21121f80a358fa3/rpds_py-0.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a35df9f5548fd79cb2f52d27182108c3e6641a4feb0f39067911bf2adaa3e57", size = 528380 }, + { url = "https://files.pythonhosted.org/packages/d5/bd/04caf938895d2d78201e89c0c8a94dfd9990c34a19ff52fb01d0912343e3/rpds_py-0.20.0-cp313-none-win32.whl", hash = "sha256:fd2d84f40633bc475ef2d5490b9c19543fbf18596dcb1b291e3a12ea5d722f7a", size = 200540 }, + { url = "https://files.pythonhosted.org/packages/95/cc/109eb8b9863680411ae703664abacaa035820c7755acc9686d5dd02cdd2e/rpds_py-0.20.0-cp313-none-win_amd64.whl", hash = "sha256:9bc2d153989e3216b0559251b0c260cfd168ec78b1fac33dd485750a228db5a2", size = 214111 }, + { url = "https://files.pythonhosted.org/packages/37/cf/0081318cde7d7e89f802b4939ec8d079d7b59b0ee3fc168435bde31e861c/rpds_py-0.20.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:f2fbf7db2012d4876fb0d66b5b9ba6591197b0f165db8d99371d976546472a24", size = 319397 }, + { url = "https://files.pythonhosted.org/packages/09/4e/ea988bb4fe0f39613dd2b868fc698c19fd970e33dfe4f1bd90658f94fed3/rpds_py-0.20.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1e5f3cd7397c8f86c8cc72d5a791071431c108edd79872cdd96e00abd8497d29", size = 311674 }, + { url = "https://files.pythonhosted.org/packages/9e/38/d4a1f901068dfcb51183266a91bcef614f616d4d820a4dd288ccaff83cbb/rpds_py-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce9845054c13696f7af7f2b353e6b4f676dab1b4b215d7fe5e05c6f8bb06f965", size = 367607 }, + { url = "https://files.pythonhosted.org/packages/7a/e3/dc75f3f118f3dc29be962f68729b2d203be9ad52ad34b1ae907c60271302/rpds_py-0.20.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c3e130fd0ec56cb76eb49ef52faead8ff09d13f4527e9b0c400307ff72b408e1", size = 367870 }, + { url = "https://files.pythonhosted.org/packages/8d/23/2b6acbc76fddb7f89ef2382f136a7a4cf10e078e6e149508a59d7448e2e1/rpds_py-0.20.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b16aa0107ecb512b568244ef461f27697164d9a68d8b35090e9b0c1c8b27752", size = 395245 }, + { url = "https://files.pythonhosted.org/packages/53/21/9d405f690986f0215d655c2980de10f63c073e66c56bd5f4d039214d1624/rpds_py-0.20.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa7f429242aae2947246587d2964fad750b79e8c233a2367f71b554e9447949c", size = 431699 }, + { url = "https://files.pythonhosted.org/packages/88/9d/07fedb6afebe0fe6f1c2981223ffa82c3ff3cc09ffeab8c9859b4852d7e3/rpds_py-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af0fc424a5842a11e28956e69395fbbeab2c97c42253169d87e90aac2886d751", size = 355123 }, + { url = "https://files.pythonhosted.org/packages/16/80/857ed7ca6dbb33805f2c8298868d029f9cf0a06f182d7058c8484b47941b/rpds_py-0.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b8c00a3b1e70c1d3891f0db1b05292747f0dbcfb49c43f9244d04c70fbc40eb8", size = 373349 }, + { url = "https://files.pythonhosted.org/packages/97/69/ae242d3c59f04ca3f56d9dbd768e7cabfc093cfb9e030dfc8fbd7fadbc4d/rpds_py-0.20.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:40ce74fc86ee4645d0a225498d091d8bc61f39b709ebef8204cb8b5a464d3c0e", size = 542737 }, + { url = "https://files.pythonhosted.org/packages/9f/c1/06d6c461c41e73c8187471595ce1c9a67c280d533fbd705889e6a0e9da2f/rpds_py-0.20.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4fe84294c7019456e56d93e8ababdad5a329cd25975be749c3f5f558abb48253", size = 547562 }, + { url = "https://files.pythonhosted.org/packages/1c/0b/918acbb2aa360822f18c6bc8672ee3c231d357f55d5e7f980d8207360742/rpds_py-0.20.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:338ca4539aad4ce70a656e5187a3a31c5204f261aef9f6ab50e50bcdffaf050a", size = 525769 }, + { url = "https://files.pythonhosted.org/packages/0e/7f/446eb1f1ed22ca855e3966e1b97e10f68f3a40578d9596a4b83323456cef/rpds_py-0.20.0-cp38-none-win32.whl", hash = "sha256:54b43a2b07db18314669092bb2de584524d1ef414588780261e31e85846c26a5", size = 199321 }, + { url = "https://files.pythonhosted.org/packages/3d/c7/ae73dfcf417fa1bb087341b670083afc3228d6a496d0d2221afd5b20d95f/rpds_py-0.20.0-cp38-none-win_amd64.whl", hash = "sha256:a1862d2d7ce1674cffa6d186d53ca95c6e17ed2b06b3f4c476173565c862d232", size = 213048 }, + { url = "https://files.pythonhosted.org/packages/a1/55/228f6d9a8c6940c8d5e49db5e0434ffcbad669c33509ac39cb0af061b0fa/rpds_py-0.20.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3fde368e9140312b6e8b6c09fb9f8c8c2f00999d1823403ae90cc00480221b22", size = 319496 }, + { url = "https://files.pythonhosted.org/packages/68/61/074236253586feb550954f8b4359d38eefb45bafcbbb7d2e74062a82f386/rpds_py-0.20.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9824fb430c9cf9af743cf7aaf6707bf14323fb51ee74425c380f4c846ea70789", size = 311837 }, + { url = "https://files.pythonhosted.org/packages/03/67/ed6c2fe076bf78296934d4356145fedf3c7c2f8d490e099bcf6f31794dc0/rpds_py-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11ef6ce74616342888b69878d45e9f779b95d4bd48b382a229fe624a409b72c5", size = 367819 }, + { url = "https://files.pythonhosted.org/packages/30/25/4a9e7b89b6760ac032f375cb236e4f8e518ad1fad685c40b6a9752056d6f/rpds_py-0.20.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c52d3f2f82b763a24ef52f5d24358553e8403ce05f893b5347098014f2d9eff2", size = 368322 }, + { url = "https://files.pythonhosted.org/packages/67/17/0255bb0e564517b53343ea672ebec9fb7ad40e9083ca09a4080fbc986bb9/rpds_py-0.20.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d35cef91e59ebbeaa45214861874bc6f19eb35de96db73e467a8358d701a96c", size = 395552 }, + { url = "https://files.pythonhosted.org/packages/af/6e/77c65ccb0d7cdc39ec2be19b918a4d4fe9e2d2a1c5cab36745b36f2c1e59/rpds_py-0.20.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d72278a30111e5b5525c1dd96120d9e958464316f55adb030433ea905866f4de", size = 433735 }, + { url = "https://files.pythonhosted.org/packages/04/d8/e73d56b1908a6c0e3e5982365eb293170cd458cc25a19363f69c76e00fd2/rpds_py-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c29cbbba378759ac5786730d1c3cb4ec6f8ababf5c42a9ce303dc4b3d08cda", size = 355542 }, + { url = "https://files.pythonhosted.org/packages/47/df/e72c79053b0c882b818bfd8f0ed1f1ace550bc9cdba27165cb73dddb9394/rpds_py-0.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6632f2d04f15d1bd6fe0eedd3b86d9061b836ddca4c03d5cf5c7e9e6b7c14580", size = 373644 }, + { url = "https://files.pythonhosted.org/packages/7f/00/3e16cb08c0cc6a233f0f61e4d009e3098cbe280ec975d14f28935bd15316/rpds_py-0.20.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d0b67d87bb45ed1cd020e8fbf2307d449b68abc45402fe1a4ac9e46c3c8b192b", size = 543139 }, + { url = "https://files.pythonhosted.org/packages/41/71/799c6b6f6031ed535f22fcf6802601cc7f981842bd28007bb7bb4bd10b2f/rpds_py-0.20.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ec31a99ca63bf3cd7f1a5ac9fe95c5e2d060d3c768a09bc1d16e235840861420", size = 548007 }, + { url = "https://files.pythonhosted.org/packages/53/58/ad03eb6718e814fa045198c72d45d2ae60180eb48338f22c9fa34bd89964/rpds_py-0.20.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22e6c9976e38f4d8c4a63bd8a8edac5307dffd3ee7e6026d97f3cc3a2dc02a0b", size = 526102 }, + { url = "https://files.pythonhosted.org/packages/78/99/a52e5b460f2311fc8ee75ff769e8d67e76208947180eacb4f153af2d9967/rpds_py-0.20.0-cp39-none-win32.whl", hash = "sha256:569b3ea770c2717b730b61998b6c54996adee3cef69fc28d444f3e7920313cf7", size = 199391 }, + { url = "https://files.pythonhosted.org/packages/0c/7d/fd42a27fe392a69faf4a5e635870fc425edcb998485ee73afbc734ecef16/rpds_py-0.20.0-cp39-none-win_amd64.whl", hash = "sha256:e6900ecdd50ce0facf703f7a00df12374b74bbc8ad9fe0f6559947fb20f82364", size = 213205 }, + { url = "https://files.pythonhosted.org/packages/06/39/bf1f664c347c946ef56cecaa896e3693d91acc741afa78ebb3fdb7aba08b/rpds_py-0.20.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:617c7357272c67696fd052811e352ac54ed1d9b49ab370261a80d3b6ce385045", size = 319444 }, + { url = "https://files.pythonhosted.org/packages/c1/71/876135d3cb90d62468540b84e8e83ff4dc92052ab309bfdea7ea0b9221ad/rpds_py-0.20.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9426133526f69fcaba6e42146b4e12d6bc6c839b8b555097020e2b78ce908dcc", size = 311699 }, + { url = "https://files.pythonhosted.org/packages/f7/da/8ccaeba6a3dda7467aebaf893de9eafd56275e2c90773c83bf15fb0b8374/rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deb62214c42a261cb3eb04d474f7155279c1a8a8c30ac89b7dcb1721d92c3c02", size = 367825 }, + { url = "https://files.pythonhosted.org/packages/04/b6/02a54c47c178d180395b3c9a8bfb3b93906e08f9acf7b4a1067d27c3fae0/rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fcaeb7b57f1a1e071ebd748984359fef83ecb026325b9d4ca847c95bc7311c92", size = 369046 }, + { url = "https://files.pythonhosted.org/packages/a7/64/df4966743aa4def8727dc13d06527c8b13eb7412c1429def2d4701bee520/rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d454b8749b4bd70dd0a79f428731ee263fa6995f83ccb8bada706e8d1d3ff89d", size = 395896 }, + { url = "https://files.pythonhosted.org/packages/6f/d9/7ff03ff3642c600f27ff94512bb158a8d815fea5ed4162c75a7e850d6003/rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d807dc2051abe041b6649681dce568f8e10668e3c1c6543ebae58f2d7e617855", size = 432427 }, + { url = "https://files.pythonhosted.org/packages/b8/c6/e1b886f7277b3454e55e85332e165091c19114eecb5377b88d892fd36ccf/rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c20f0ddeb6e29126d45f89206b8291352b8c5b44384e78a6499d68b52ae511", size = 355403 }, + { url = "https://files.pythonhosted.org/packages/e2/62/e26bd5b944e547c7bfd0b6ca7e306bfa430f8bd298ab72a1217976a7ca8d/rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b7f19250ceef892adf27f0399b9e5afad019288e9be756d6919cb58892129f51", size = 374491 }, + { url = "https://files.pythonhosted.org/packages/c3/92/93c5a530898d3a5d1ce087455071ba714b77806ed9ffee4070d0c7a53b7e/rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4f1ed4749a08379555cebf4650453f14452eaa9c43d0a95c49db50c18b7da075", size = 543622 }, + { url = "https://files.pythonhosted.org/packages/01/9e/d68fba289625b5d3c9d1925825d7da716fbf812bda2133ac409021d5db13/rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:dcedf0b42bcb4cfff4101d7771a10532415a6106062f005ab97d1d0ab5681c60", size = 548558 }, + { url = "https://files.pythonhosted.org/packages/bf/d6/4b2fad4898154365f0f2bd72ffd190349274a4c1d6a6f94f02a83bb2b8f1/rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:39ed0d010457a78f54090fafb5d108501b5aa5604cc22408fc1c0c77eac14344", size = 525753 }, + { url = "https://files.pythonhosted.org/packages/d2/ea/6f121d1802f3adae1981aea4209ea66f9d3c7f2f6d6b85ef4f13a61d17ef/rpds_py-0.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:bb273176be34a746bdac0b0d7e4e2c467323d13640b736c4c477881a3220a989", size = 213529 }, + { url = "https://files.pythonhosted.org/packages/0a/6f/7ab47005469f0d73dad89d29b733e3555d454a45146c30f5628242e56d33/rpds_py-0.20.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f918a1a130a6dfe1d7fe0f105064141342e7dd1611f2e6a21cd2f5c8cb1cfb3e", size = 320800 }, + { url = "https://files.pythonhosted.org/packages/cc/a1/bef9e0ef30f89c7516559ca7acc40e8ae70397535a0b1a4535a4a01d9ed0/rpds_py-0.20.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f60012a73aa396be721558caa3a6fd49b3dd0033d1675c6d59c4502e870fcf0c", size = 312001 }, + { url = "https://files.pythonhosted.org/packages/31/44/9093c5dca95ee463c3669651e710af182eb6f9cd83626b15a2ebde2247b1/rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d2b1ad682a3dfda2a4e8ad8572f3100f95fad98cb99faf37ff0ddfe9cbf9d03", size = 369279 }, + { url = "https://files.pythonhosted.org/packages/6f/ac/0c36e067681fa3fe4c60a9422b011ec0ccc80c1e124f5210951f7982e887/rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:614fdafe9f5f19c63ea02817fa4861c606a59a604a77c8cdef5aa01d28b97921", size = 369716 }, + { url = "https://files.pythonhosted.org/packages/6b/78/8896e08625d46ea5bfdd526ee688b91eeafecbc3cf7223612c82ed77905b/rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa518bcd7600c584bf42e6617ee8132869e877db2f76bcdc281ec6a4113a53ab", size = 396708 }, + { url = "https://files.pythonhosted.org/packages/24/5f/d865ae460e47e46fd2b489f2aceed34439bd8f18a1ff414c299142e0e22a/rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0475242f447cc6cb8a9dd486d68b2ef7fbee84427124c232bff5f63b1fe11e5", size = 433356 }, + { url = "https://files.pythonhosted.org/packages/bd/8b/04031937ffa565021f934a9acf44bb6b1b60ea19fa9e58950b32357e85a1/rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f90a4cd061914a60bd51c68bcb4357086991bd0bb93d8aa66a6da7701370708f", size = 356157 }, + { url = "https://files.pythonhosted.org/packages/3a/64/1f0471b1e688704a716e07340b85f4145109359951feb08676a1f3b8cec4/rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:def7400461c3a3f26e49078302e1c1b38f6752342c77e3cf72ce91ca69fb1bc1", size = 374826 }, + { url = "https://files.pythonhosted.org/packages/73/4e/082c0c5eba463e29dff1c6b49557f6ad0d6faae4b46832fa9c1e5b69b7ba/rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:65794e4048ee837494aea3c21a28ad5fc080994dfba5b036cf84de37f7ad5074", size = 544549 }, + { url = "https://files.pythonhosted.org/packages/cd/ee/f4af0a62d1ba912c4a3a7f5ec04350946ddd59017f3f3d1c227b20ddf558/rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:faefcc78f53a88f3076b7f8be0a8f8d35133a3ecf7f3770895c25f8813460f08", size = 549245 }, + { url = "https://files.pythonhosted.org/packages/59/42/34601dc773be86a85a9ca47f68301a69fdb019aaae0c1426813f265f5ac0/rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5b4f105deeffa28bbcdff6c49b34e74903139afa690e35d2d9e3c2c2fba18cec", size = 526722 }, + { url = "https://files.pythonhosted.org/packages/ff/4f/280745d5180c9d78df6b53b6e8b65336f8b6adeb958a8fd19c749fded637/rpds_py-0.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fdfc3a892927458d98f3d55428ae46b921d1f7543b89382fdb483f5640daaec8", size = 214379 }, +] + +[[package]] +name = "s3transfer" +version = "0.10.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "botocore" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a0/a8/e0a98fd7bd874914f0608ef7c90ffde17e116aefad765021de0f012690a2/s3transfer-0.10.3.tar.gz", hash = "sha256:4f50ed74ab84d474ce614475e0b8d5047ff080810aac5d01ea25231cfc944b0c", size = 144591 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/c0/b0fba8259b61c938c9733da9346b9f93e00881a9db22aafdd72f6ae0ec05/s3transfer-0.10.3-py3-none-any.whl", hash = "sha256:263ed587a5803c6c708d3ce44dc4dfedaab4c1a32e8329bab818933d79ddcf5d", size = 82625 }, +] + +[[package]] +name = "semver" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/6c/a536cc008f38fd83b3c1b98ce19ead13b746b5588c9a0cb9dd9f6ea434bc/semver-3.0.2.tar.gz", hash = "sha256:6253adb39c70f6e51afed2fa7152bcd414c411286088fb4b9effb133885ab4cc", size = 214988 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/77/0cc7a8a3bc7e53d07e8f47f147b92b0960e902b8254859f4aee5c4d7866b/semver-3.0.2-py3-none-any.whl", hash = "sha256:b1ea4686fe70b981f85359eda33199d60c53964284e0cfb4977d243e37cf4bf4", size = 17099 }, +] + +[[package]] +name = "six" +version = "1.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/71/39/171f1c67cd00715f190ba0b100d606d440a28c93c7714febeca8b79af85e/six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", size = 34041 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254", size = 11053 }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, +] + +[[package]] +name = "sortedcontainers" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575 }, +] + +[[package]] +name = "sqlalchemy" +version = "2.0.36" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "greenlet", marker = "(python_full_version < '3.13' and platform_machine == 'AMD64') or (python_full_version < '3.13' and platform_machine == 'WIN32') or (python_full_version < '3.13' and platform_machine == 'aarch64') or (python_full_version < '3.13' and platform_machine == 'amd64') or (python_full_version < '3.13' and platform_machine == 'ppc64le') or (python_full_version < '3.13' and platform_machine == 'win32') or (python_full_version < '3.13' and platform_machine == 'x86_64')" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/65/9cbc9c4c3287bed2499e05033e207473504dc4df999ce49385fb1f8b058a/sqlalchemy-2.0.36.tar.gz", hash = "sha256:7f2767680b6d2398aea7082e45a774b2b0767b5c8d8ffb9c8b683088ea9b29c5", size = 9574485 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/72/14ab694b8b3f0e35ef5beb74a8fea2811aa791ba1611c44dc90cdf46af17/SQLAlchemy-2.0.36-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:59b8f3adb3971929a3e660337f5dacc5942c2cdb760afcabb2614ffbda9f9f72", size = 2092604 }, + { url = "https://files.pythonhosted.org/packages/1e/59/333fcbca58b79f5b8b61853d6137530198823392151fa8fd9425f367519e/SQLAlchemy-2.0.36-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37350015056a553e442ff672c2d20e6f4b6d0b2495691fa239d8aa18bb3bc908", size = 2083796 }, + { url = "https://files.pythonhosted.org/packages/6c/a0/ec3c188d2b0c1bc742262e76408d44104598d7247c23f5b06bb97ee21bfa/SQLAlchemy-2.0.36-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8318f4776c85abc3f40ab185e388bee7a6ea99e7fa3a30686580b209eaa35c08", size = 3066165 }, + { url = "https://files.pythonhosted.org/packages/07/15/68ef91de5b8b7f80fb2d2b3b31ed42180c6227fe0a701aed9d01d34f98ec/SQLAlchemy-2.0.36-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c245b1fbade9c35e5bd3b64270ab49ce990369018289ecfde3f9c318411aaa07", size = 3074428 }, + { url = "https://files.pythonhosted.org/packages/e2/4c/9dfea5e63b87325eef6d9cdaac913459aa6a157a05a05ea6ff20004aee8e/SQLAlchemy-2.0.36-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:69f93723edbca7342624d09f6704e7126b152eaed3cdbb634cb657a54332a3c5", size = 3030477 }, + { url = "https://files.pythonhosted.org/packages/16/a5/fcfde8e74ea5f683b24add22463bfc21e431d4a5531c8a5b55bc6fbea164/SQLAlchemy-2.0.36-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f9511d8dd4a6e9271d07d150fb2f81874a3c8c95e11ff9af3a2dfc35fe42ee44", size = 3055942 }, + { url = "https://files.pythonhosted.org/packages/3c/ee/c22c415a771d791ae99146d72ffdb20e43625acd24835ea7fc157436d59f/SQLAlchemy-2.0.36-cp310-cp310-win32.whl", hash = "sha256:c3f3631693003d8e585d4200730616b78fafd5a01ef8b698f6967da5c605b3fa", size = 2064960 }, + { url = "https://files.pythonhosted.org/packages/aa/af/ad9c25cadc79bd851bdb9d82b68af9bdb91ff05f56d0da2f8a654825974f/SQLAlchemy-2.0.36-cp310-cp310-win_amd64.whl", hash = "sha256:a86bfab2ef46d63300c0f06936bd6e6c0105faa11d509083ba8f2f9d237fb5b5", size = 2089078 }, + { url = "https://files.pythonhosted.org/packages/00/4e/5a67963fd7cbc1beb8bd2152e907419f4c940ef04600b10151a751fe9e06/SQLAlchemy-2.0.36-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fd3a55deef00f689ce931d4d1b23fa9f04c880a48ee97af488fd215cf24e2a6c", size = 2093782 }, + { url = "https://files.pythonhosted.org/packages/b3/24/30e33b6389ebb5a17df2a4243b091bc709fb3dfc9a48c8d72f8e037c943d/SQLAlchemy-2.0.36-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4f5e9cd989b45b73bd359f693b935364f7e1f79486e29015813c338450aa5a71", size = 2084180 }, + { url = "https://files.pythonhosted.org/packages/10/1e/70e9ed2143a27065246be40f78637ad5160ea0f5fd32f8cab819a31ff54d/SQLAlchemy-2.0.36-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ddd9db6e59c44875211bc4c7953a9f6638b937b0a88ae6d09eb46cced54eff", size = 3202469 }, + { url = "https://files.pythonhosted.org/packages/b4/5f/95e0ed74093ac3c0db6acfa944d4d8ac6284ef5e1136b878a327ea1f975a/SQLAlchemy-2.0.36-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2519f3a5d0517fc159afab1015e54bb81b4406c278749779be57a569d8d1bb0d", size = 3202464 }, + { url = "https://files.pythonhosted.org/packages/91/95/2cf9b85a6bc2ee660e40594dffe04e777e7b8617fd0c6d77a0f782ea96c9/SQLAlchemy-2.0.36-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59b1ee96617135f6e1d6f275bbe988f419c5178016f3d41d3c0abb0c819f75bb", size = 3139508 }, + { url = "https://files.pythonhosted.org/packages/92/ea/f0c01bc646456e4345c0fb5a3ddef457326285c2dc60435b0eb96b61bf31/SQLAlchemy-2.0.36-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:39769a115f730d683b0eb7b694db9789267bcd027326cccc3125e862eb03bfd8", size = 3159837 }, + { url = "https://files.pythonhosted.org/packages/a6/93/c8edbf153ee38fe529773240877bf1332ed95328aceef6254288f446994e/SQLAlchemy-2.0.36-cp311-cp311-win32.whl", hash = "sha256:66bffbad8d6271bb1cc2f9a4ea4f86f80fe5e2e3e501a5ae2a3dc6a76e604e6f", size = 2064529 }, + { url = "https://files.pythonhosted.org/packages/b1/03/d12b7c1d36fd80150c1d52e121614cf9377dac99e5497af8d8f5b2a8db64/SQLAlchemy-2.0.36-cp311-cp311-win_amd64.whl", hash = "sha256:23623166bfefe1487d81b698c423f8678e80df8b54614c2bf4b4cfcd7c711959", size = 2089874 }, + { url = "https://files.pythonhosted.org/packages/b8/bf/005dc47f0e57556e14512d5542f3f183b94fde46e15ff1588ec58ca89555/SQLAlchemy-2.0.36-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7b64e6ec3f02c35647be6b4851008b26cff592a95ecb13b6788a54ef80bbdd4", size = 2092378 }, + { url = "https://files.pythonhosted.org/packages/94/65/f109d5720779a08e6e324ec89a744f5f92c48bd8005edc814bf72fbb24e5/SQLAlchemy-2.0.36-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:46331b00096a6db1fdc052d55b101dbbfc99155a548e20a0e4a8e5e4d1362855", size = 2082778 }, + { url = "https://files.pythonhosted.org/packages/60/f6/d9aa8c49c44f9b8c9b9dada1f12fa78df3d4c42aa2de437164b83ee1123c/SQLAlchemy-2.0.36-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdf3386a801ea5aba17c6410dd1dc8d39cf454ca2565541b5ac42a84e1e28f53", size = 3232191 }, + { url = "https://files.pythonhosted.org/packages/8a/ab/81d4514527c068670cb1d7ab62a81a185df53a7c379bd2a5636e83d09ede/SQLAlchemy-2.0.36-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac9dfa18ff2a67b09b372d5db8743c27966abf0e5344c555d86cc7199f7ad83a", size = 3243044 }, + { url = "https://files.pythonhosted.org/packages/35/b4/f87c014ecf5167dc669199cafdb20a7358ff4b1d49ce3622cc48571f811c/SQLAlchemy-2.0.36-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:90812a8933df713fdf748b355527e3af257a11e415b613dd794512461eb8a686", size = 3178511 }, + { url = "https://files.pythonhosted.org/packages/ea/09/badfc9293bc3ccba6ede05e5f2b44a760aa47d84da1fc5a326e963e3d4d9/SQLAlchemy-2.0.36-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1bc330d9d29c7f06f003ab10e1eaced295e87940405afe1b110f2eb93a233588", size = 3205147 }, + { url = "https://files.pythonhosted.org/packages/c8/60/70e681de02a13c4b27979b7b78da3058c49bacc9858c89ba672e030f03f2/SQLAlchemy-2.0.36-cp312-cp312-win32.whl", hash = "sha256:79d2e78abc26d871875b419e1fd3c0bca31a1cb0043277d0d850014599626c2e", size = 2062709 }, + { url = "https://files.pythonhosted.org/packages/b7/ed/f6cd9395e41bfe47dd253d74d2dfc3cab34980d4e20c8878cb1117306085/SQLAlchemy-2.0.36-cp312-cp312-win_amd64.whl", hash = "sha256:b544ad1935a8541d177cb402948b94e871067656b3a0b9e91dbec136b06a2ff5", size = 2088433 }, + { url = "https://files.pythonhosted.org/packages/78/5c/236398ae3678b3237726819b484f15f5c038a9549da01703a771f05a00d6/SQLAlchemy-2.0.36-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b5cc79df7f4bc3d11e4b542596c03826063092611e481fcf1c9dfee3c94355ef", size = 2087651 }, + { url = "https://files.pythonhosted.org/packages/a8/14/55c47420c0d23fb67a35af8be4719199b81c59f3084c28d131a7767b0b0b/SQLAlchemy-2.0.36-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3c01117dd36800f2ecaa238c65365b7b16497adc1522bf84906e5710ee9ba0e8", size = 2078132 }, + { url = "https://files.pythonhosted.org/packages/3d/97/1e843b36abff8c4a7aa2e37f9bea364f90d021754c2de94d792c2d91405b/SQLAlchemy-2.0.36-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bc633f4ee4b4c46e7adcb3a9b5ec083bf1d9a97c1d3854b92749d935de40b9b", size = 3164559 }, + { url = "https://files.pythonhosted.org/packages/7b/c5/07f18a897b997f6d6b234fab2bf31dccf66d5d16a79fe329aefc95cd7461/SQLAlchemy-2.0.36-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e46ed38affdfc95d2c958de328d037d87801cfcbea6d421000859e9789e61c2", size = 3177897 }, + { url = "https://files.pythonhosted.org/packages/b3/cd/e16f3cbefd82b5c40b33732da634ec67a5f33b587744c7ab41699789d492/SQLAlchemy-2.0.36-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b2985c0b06e989c043f1dc09d4fe89e1616aadd35392aea2844f0458a989eacf", size = 3111289 }, + { url = "https://files.pythonhosted.org/packages/15/85/5b8a3b0bc29c9928aa62b5c91fcc8335f57c1de0a6343873b5f372e3672b/SQLAlchemy-2.0.36-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a121d62ebe7d26fec9155f83f8be5189ef1405f5973ea4874a26fab9f1e262c", size = 3139491 }, + { url = "https://files.pythonhosted.org/packages/a1/95/81babb6089938680dfe2cd3f88cd3fd39cccd1543b7cb603b21ad881bff1/SQLAlchemy-2.0.36-cp313-cp313-win32.whl", hash = "sha256:0572f4bd6f94752167adfd7c1bed84f4b240ee6203a95e05d1e208d488d0d436", size = 2060439 }, + { url = "https://files.pythonhosted.org/packages/c1/ce/5f7428df55660d6879d0522adc73a3364970b5ef33ec17fa125c5dbcac1d/SQLAlchemy-2.0.36-cp313-cp313-win_amd64.whl", hash = "sha256:8c78ac40bde930c60e0f78b3cd184c580f89456dd87fc08f9e3ee3ce8765ce88", size = 2084574 }, + { url = "https://files.pythonhosted.org/packages/db/da/443679a0b9e0a009f00d1542595c8a4d582ece1809704e703c4843f18768/SQLAlchemy-2.0.36-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3d6718667da04294d7df1670d70eeddd414f313738d20a6f1d1f379e3139a545", size = 2097524 }, + { url = "https://files.pythonhosted.org/packages/60/88/08249dc5651d976b64c257250ade16ec02444257b44e404e258f2862c201/SQLAlchemy-2.0.36-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:72c28b84b174ce8af8504ca28ae9347d317f9dba3999e5981a3cd441f3712e24", size = 2088207 }, + { url = "https://files.pythonhosted.org/packages/19/41/feb0216cced91211c9dd045f08fa020a3bd2e188110217d24b6b2a90b6a2/SQLAlchemy-2.0.36-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b11d0cfdd2b095e7b0686cf5fabeb9c67fae5b06d265d8180715b8cfa86522e3", size = 3090690 }, + { url = "https://files.pythonhosted.org/packages/80/fe/0055147b71de2007e716ddc686438aefb390b03fd2e382ff4a8588b78b58/SQLAlchemy-2.0.36-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e32092c47011d113dc01ab3e1d3ce9f006a47223b18422c5c0d150af13a00687", size = 3097567 }, + { url = "https://files.pythonhosted.org/packages/4e/55/52eaef72f071b89e2e965decc264d16b6031a39365a6593067053ba8bb97/SQLAlchemy-2.0.36-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6a440293d802d3011028e14e4226da1434b373cbaf4a4bbb63f845761a708346", size = 3044686 }, + { url = "https://files.pythonhosted.org/packages/2d/c8/6fb6179ad2eb9baab61132786488fa10e5b588ef2b008f57f560ae7f39d1/SQLAlchemy-2.0.36-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c54a1e53a0c308a8e8a7dffb59097bff7facda27c70c286f005327f21b2bd6b1", size = 3067814 }, + { url = "https://files.pythonhosted.org/packages/52/84/be7227a06c24418f131a877159eb962c62447883069390c868d1a782f01d/SQLAlchemy-2.0.36-cp38-cp38-win32.whl", hash = "sha256:1e0d612a17581b6616ff03c8e3d5eff7452f34655c901f75d62bd86449d9750e", size = 2067569 }, + { url = "https://files.pythonhosted.org/packages/df/4f/9c70c53a5bd6de5957db78578cb0491732da636032566d3e8748659513cb/SQLAlchemy-2.0.36-cp38-cp38-win_amd64.whl", hash = "sha256:8958b10490125124463095bbdadda5aa22ec799f91958e410438ad6c97a7b793", size = 2092329 }, + { url = "https://files.pythonhosted.org/packages/43/10/c1c865afeb50270677942cda17ed78b55b0a0068e426d22284a625d7341f/SQLAlchemy-2.0.36-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc022184d3e5cacc9579e41805a681187650e170eb2fd70e28b86192a479dcaa", size = 2095474 }, + { url = "https://files.pythonhosted.org/packages/25/cb/78d7663ad1c82ca8b5cbc7532b8e3c9f80a53f1bdaafd8f5314525700a01/SQLAlchemy-2.0.36-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b817d41d692bf286abc181f8af476c4fbef3fd05e798777492618378448ee689", size = 2086708 }, + { url = "https://files.pythonhosted.org/packages/5c/5b/f9b5cf759865b0dd8b20579b3d920ed87b6160fce75e2b7ed697ddbf0008/SQLAlchemy-2.0.36-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4e46a888b54be23d03a89be510f24a7652fe6ff660787b96cd0e57a4ebcb46d", size = 3080607 }, + { url = "https://files.pythonhosted.org/packages/18/f6/afaef83a3fbeff40b9289508b985c5630c0e8303d08106a0117447c680d9/SQLAlchemy-2.0.36-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4ae3005ed83f5967f961fd091f2f8c5329161f69ce8480aa8168b2d7fe37f06", size = 3088410 }, + { url = "https://files.pythonhosted.org/packages/62/60/ec2b8c14b3c15b4a915ae821b455823fbafa6f38c4011b27c0a76f94928a/SQLAlchemy-2.0.36-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:03e08af7a5f9386a43919eda9de33ffda16b44eb11f3b313e6822243770e9763", size = 3047623 }, + { url = "https://files.pythonhosted.org/packages/40/a2/9f748bdaf769eceb780c438b3dd7a37b8b8cbc6573e2a3748b0d5c2e9d80/SQLAlchemy-2.0.36-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3dbb986bad3ed5ceaf090200eba750b5245150bd97d3e67343a3cfed06feecf7", size = 3074096 }, + { url = "https://files.pythonhosted.org/packages/01/f7/290d7193c81d1ff0f751bd9430f3762bee0f53efd0273aba7ba18eb10520/SQLAlchemy-2.0.36-cp39-cp39-win32.whl", hash = "sha256:9fe53b404f24789b5ea9003fc25b9a3988feddebd7e7b369c8fac27ad6f52f28", size = 2067304 }, + { url = "https://files.pythonhosted.org/packages/6f/a0/dc1a808d6ac466b190ca570f7ce52a1761308279eab4a09367ccf2cd6bd7/SQLAlchemy-2.0.36-cp39-cp39-win_amd64.whl", hash = "sha256:af148a33ff0349f53512a049c6406923e4e02bf2f26c5fb285f143faf4f0e46a", size = 2091520 }, + { url = "https://files.pythonhosted.org/packages/b8/49/21633706dd6feb14cd3f7935fc00b60870ea057686035e1a99ae6d9d9d53/SQLAlchemy-2.0.36-py3-none-any.whl", hash = "sha256:fddbe92b4760c6f5d48162aef14824add991aeda8ddadb3c31d56eb15ca69f8e", size = 1883787 }, +] + +[[package]] +name = "sqlglot" +version = "25.25.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/89/42/a14757a85eb3f6386a54332037765a035b932ec3790e93625a72be62b965/sqlglot-25.25.1.tar.gz", hash = "sha256:a71097685eef491ecad778b85be7d0b09f205c4c704e188fdff9d3ac388db732", size = 19539259 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/19/882b3a18eeb54ffc15538e3b98b5119a486973042bfb0e8146ac1e72f8e4/sqlglot-25.25.1-py3-none-any.whl", hash = "sha256:0f9eb40c830a478312c262b6d0aa49c6ee9ef27725764430251e8920e6480951", size = 419522 }, +] + +[[package]] +name = "strictyaml" +version = "1.7.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/08/efd28d49162ce89c2ad61a88bd80e11fb77bc9f6c145402589112d38f8af/strictyaml-1.7.3.tar.gz", hash = "sha256:22f854a5fcab42b5ddba8030a0e4be51ca89af0267961c8d6cfa86395586c407", size = 115206 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/7c/a81ef5ef10978dd073a854e0fa93b5d8021d0594b639cc8f6453c3c78a1d/strictyaml-1.7.3-py3-none-any.whl", hash = "sha256:fb5c8a4edb43bebb765959e420f9b3978d7f1af88c80606c03fb420888f5d1c7", size = 123917 }, +] + +[[package]] +name = "tenacity" +version = "8.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/4d/6a19536c50b849338fcbe9290d562b52cbdcf30d8963d3588a68a4107df1/tenacity-8.5.0.tar.gz", hash = "sha256:8bc6c0c8a09b31e6cad13c47afbed1a567518250a9a171418582ed8d9c20ca78", size = 47309 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/3f/8ba87d9e287b9d385a02a7114ddcef61b26f86411e121c9003eb509a1773/tenacity-8.5.0-py3-none-any.whl", hash = "sha256:b594c2a5945830c267ce6b79a166228323ed52718f30302c1359836112346687", size = 28165 }, +] + +[[package]] +name = "tqdm" +version = "4.66.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "platform_system == 'Windows'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/83/6ba9844a41128c62e810fddddd72473201f3eacde02046066142a2d96cc5/tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad", size = 169504 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/5d/acf5905c36149bbaec41ccf7f2b68814647347b72075ac0b1fe3022fdc73/tqdm-4.66.5-py3-none-any.whl", hash = "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd", size = 78351 }, +] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, +] + +[[package]] +name = "tzdata" +version = "2024.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/34/943888654477a574a86a98e9896bae89c7aa15078ec29f490fef2f1e5384/tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc", size = 193282 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a6/ab/7e5f53c3b9d14972843a647d8d7a853969a58aecc7559cb3267302c94774/tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd", size = 346586 }, +] + +[[package]] +name = "unitycatalog" +version = "0.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "distro" }, + { name = "httpx" }, + { name = "pydantic" }, + { name = "sniffio" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a5/01/4e225d7b12333177c904085fd1d16dbcae4a17cd9fe148a2e103c09dabe6/unitycatalog-0.1.1.tar.gz", hash = "sha256:4833cec4856a0d875f64e416886cbec0dce588bdebb7791f7f3d5bab649ace92", size = 64305 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/6d/1f23bb47548d1c6053cccc9a914ceb06e4d19661598b8d540d53929128c0/unitycatalog-0.1.1-py3-none-any.whl", hash = "sha256:3e0f340871067beb962aee7db3a1c282d664dfadc69ea906a5ad5b8718335185", size = 97607 }, +] + +[[package]] +name = "urllib3" +version = "1.26.20" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/e8/6ff5e6bc22095cfc59b6ea711b687e2b7ed4bdb373f7eeec370a97d7392f/urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32", size = 307380 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/cf/8435d5a7159e2a9c83a95896ed596f68cf798005fe107cc655b5c5c14704/urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e", size = 144225 }, +] + +[[package]] +name = "zipp" +version = "3.20.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/bf/5c0000c44ebc80123ecbdddba1f5dcd94a5ada602a9c225d84b5aaa55e86/zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29", size = 24199 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350", size = 9200 }, +]