├── .github └── workflows │ └── release.yml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── Makefile ├── README.md ├── examples └── usage.py ├── polars_fuzzy_match ├── __init__.py └── util.py ├── pyproject.toml ├── requirements-dev.txt └── src ├── fuzzy_match.rs └── lib.rs /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | # This file is autogenerated by maturin v1.4.0 2 | # To update, run 3 | # 4 | # maturin generate-ci github 5 | # 6 | name: CI 7 | 8 | on: 9 | push: 10 | tags: 11 | - "v[0-9]+.[0-9]+.[0-9]+" 12 | 13 | concurrency: 14 | group: ${{ github.workflow }}-${{ github.ref }} 15 | cancel-in-progress: true 16 | 17 | permissions: 18 | contents: read 19 | 20 | # Make sure CI fails on all warnings, including Clippy lints 21 | env: 22 | RUSTFLAGS: "-Dwarnings" 23 | 24 | jobs: 25 | linux: 26 | runs-on: ubuntu-latest 27 | strategy: 28 | matrix: 29 | target: [x86_64, x86, aarch64, armv7] 30 | env: 31 | PYO3_USE_ABI3_FORWARD_COMPATIBILITY: 1 32 | steps: 33 | - uses: actions/checkout@v3 34 | - uses: actions/setup-python@v4 35 | with: 36 | python-version: "3.8" 37 | - name: Build wheels 38 | uses: PyO3/maturin-action@v1 39 | with: 40 | target: ${{ matrix.target }} 41 | args: --release --out dist --find-interpreter 42 | sccache: "true" 43 | manylinux: auto 44 | - name: Upload wheels 45 | uses: actions/upload-artifact@v3 46 | with: 47 | name: wheels 48 | path: dist 49 | 50 | windows: 51 | runs-on: windows-latest 52 | strategy: 53 | matrix: 54 | target: [x64, x86] 55 | steps: 56 | - uses: actions/checkout@v3 57 | - uses: actions/setup-python@v4 58 | with: 59 | python-version: "3.8" 60 | architecture: ${{ matrix.target }} 61 | - name: Build wheels 62 | uses: PyO3/maturin-action@v1 63 | with: 64 | target: ${{ matrix.target }} 65 | args: --release --out dist --find-interpreter 66 | sccache: "true" 67 | - name: Upload wheels 68 | uses: actions/upload-artifact@v3 69 | with: 70 | name: wheels 71 | path: dist 72 | 73 | macos: 74 | runs-on: macos-latest 75 | strategy: 76 | matrix: 77 | target: [x86_64, aarch64] 78 | steps: 79 | - uses: actions/checkout@v3 80 | - uses: actions/setup-python@v4 81 | with: 82 | python-version: "3.8" 83 | - name: Build wheels 84 | uses: PyO3/maturin-action@v1 85 | with: 86 | target: ${{ matrix.target }} 87 | args: --release --out dist --find-interpreter 88 | sccache: "true" 89 | - name: Upload wheels 90 | uses: actions/upload-artifact@v3 91 | with: 92 | name: wheels 93 | path: dist 94 | 95 | sdist: 96 | runs-on: ubuntu-latest 97 | steps: 98 | - uses: actions/checkout@v3 99 | - name: Build sdist 100 | uses: PyO3/maturin-action@v1 101 | with: 102 | command: sdist 103 | args: --out dist 104 | - name: Upload sdist 105 | uses: actions/upload-artifact@v3 106 | with: 107 | name: wheels 108 | path: dist 109 | 110 | release: 111 | name: Release 112 | runs-on: ubuntu-latest 113 | if: "startsWith(github.ref, 'refs/tags/v')" 114 | needs: [linux, windows, macos, sdist] 115 | environment: release 116 | permissions: 117 | id-token: write 118 | steps: 119 | - uses: actions/download-artifact@v3 120 | with: 121 | name: wheels 122 | - name: Publish to PyPI 123 | uses: PyO3/maturin-action@v1 124 | with: 125 | command: upload 126 | args: --non-interactive --skip-existing * 127 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # rust 2 | target/ 3 | .build-dev 4 | polars_fuzzy_match/*.so 5 | 6 | # python 7 | __pycache__/ 8 | *.py[cod] 9 | *$py.class 10 | *.pyc 11 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "ahash" 7 | version = "0.8.9" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "d713b3834d76b85304d4d525563c1276e2e30dc97cc67bfb4585a4a29fc2c89f" 10 | dependencies = [ 11 | "cfg-if", 12 | "getrandom", 13 | "once_cell", 14 | "version_check", 15 | "zerocopy", 16 | ] 17 | 18 | [[package]] 19 | name = "aho-corasick" 20 | version = "1.1.2" 21 | source = "registry+https://github.com/rust-lang/crates.io-index" 22 | checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" 23 | dependencies = [ 24 | "memchr", 25 | ] 26 | 27 | [[package]] 28 | name = "allocator-api2" 29 | version = "0.2.16" 30 | source = "registry+https://github.com/rust-lang/crates.io-index" 31 | checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" 32 | 33 | [[package]] 34 | name = "android-tzdata" 35 | version = "0.1.1" 36 | source = "registry+https://github.com/rust-lang/crates.io-index" 37 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 38 | 39 | [[package]] 40 | name = "android_system_properties" 41 | version = "0.1.5" 42 | source = "registry+https://github.com/rust-lang/crates.io-index" 43 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 44 | dependencies = [ 45 | "libc", 46 | ] 47 | 48 | [[package]] 49 | name = "argminmax" 50 | version = "0.6.1" 51 | source = "registry+https://github.com/rust-lang/crates.io-index" 52 | checksum = "202108b46429b765ef483f8a24d5c46f48c14acfdacc086dd4ab6dddf6bcdbd2" 53 | dependencies = [ 54 | "num-traits", 55 | ] 56 | 57 | [[package]] 58 | name = "array-init-cursor" 59 | version = "0.2.0" 60 | source = "registry+https://github.com/rust-lang/crates.io-index" 61 | checksum = "bf7d0a018de4f6aa429b9d33d69edf69072b1c5b1cb8d3e4a5f7ef898fc3eb76" 62 | 63 | [[package]] 64 | name = "atoi" 65 | version = "2.0.0" 66 | source = "registry+https://github.com/rust-lang/crates.io-index" 67 | checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 68 | dependencies = [ 69 | "num-traits", 70 | ] 71 | 72 | [[package]] 73 | name = "atoi_simd" 74 | version = "0.15.6" 75 | source = "registry+https://github.com/rust-lang/crates.io-index" 76 | checksum = "9ae037714f313c1353189ead58ef9eec30a8e8dc101b2622d461418fd59e28a9" 77 | 78 | [[package]] 79 | name = "autocfg" 80 | version = "1.1.0" 81 | source = "registry+https://github.com/rust-lang/crates.io-index" 82 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 83 | 84 | [[package]] 85 | name = "base64" 86 | version = "0.21.7" 87 | source = "registry+https://github.com/rust-lang/crates.io-index" 88 | checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 89 | 90 | [[package]] 91 | name = "bitflags" 92 | version = "1.3.2" 93 | source = "registry+https://github.com/rust-lang/crates.io-index" 94 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 95 | 96 | [[package]] 97 | name = "bitflags" 98 | version = "2.4.2" 99 | source = "registry+https://github.com/rust-lang/crates.io-index" 100 | checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" 101 | 102 | [[package]] 103 | name = "bumpalo" 104 | version = "3.15.3" 105 | source = "registry+https://github.com/rust-lang/crates.io-index" 106 | checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b" 107 | 108 | [[package]] 109 | name = "bytemuck" 110 | version = "1.14.3" 111 | source = "registry+https://github.com/rust-lang/crates.io-index" 112 | checksum = "a2ef034f05691a48569bd920a96c81b9d91bbad1ab5ac7c4616c1f6ef36cb79f" 113 | dependencies = [ 114 | "bytemuck_derive", 115 | ] 116 | 117 | [[package]] 118 | name = "bytemuck_derive" 119 | version = "1.5.0" 120 | source = "registry+https://github.com/rust-lang/crates.io-index" 121 | checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" 122 | dependencies = [ 123 | "proc-macro2", 124 | "quote", 125 | "syn 2.0.51", 126 | ] 127 | 128 | [[package]] 129 | name = "byteorder" 130 | version = "1.5.0" 131 | source = "registry+https://github.com/rust-lang/crates.io-index" 132 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 133 | 134 | [[package]] 135 | name = "bytes" 136 | version = "1.5.0" 137 | source = "registry+https://github.com/rust-lang/crates.io-index" 138 | checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" 139 | 140 | [[package]] 141 | name = "cc" 142 | version = "1.0.88" 143 | source = "registry+https://github.com/rust-lang/crates.io-index" 144 | checksum = "02f341c093d19155a6e41631ce5971aac4e9a868262212153124c15fa22d1cdc" 145 | dependencies = [ 146 | "libc", 147 | ] 148 | 149 | [[package]] 150 | name = "cfg-if" 151 | version = "1.0.0" 152 | source = "registry+https://github.com/rust-lang/crates.io-index" 153 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 154 | 155 | [[package]] 156 | name = "chrono" 157 | version = "0.4.34" 158 | source = "registry+https://github.com/rust-lang/crates.io-index" 159 | checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" 160 | dependencies = [ 161 | "android-tzdata", 162 | "iana-time-zone", 163 | "num-traits", 164 | "windows-targets 0.52.3", 165 | ] 166 | 167 | [[package]] 168 | name = "chrono-tz" 169 | version = "0.8.6" 170 | source = "registry+https://github.com/rust-lang/crates.io-index" 171 | checksum = "d59ae0466b83e838b81a54256c39d5d7c20b9d7daa10510a242d9b75abd5936e" 172 | dependencies = [ 173 | "chrono", 174 | "chrono-tz-build", 175 | "phf", 176 | ] 177 | 178 | [[package]] 179 | name = "chrono-tz-build" 180 | version = "0.2.1" 181 | source = "registry+https://github.com/rust-lang/crates.io-index" 182 | checksum = "433e39f13c9a060046954e0592a8d0a4bcb1040125cbf91cb8ee58964cfb350f" 183 | dependencies = [ 184 | "parse-zoneinfo", 185 | "phf", 186 | "phf_codegen", 187 | ] 188 | 189 | [[package]] 190 | name = "comfy-table" 191 | version = "7.1.0" 192 | source = "registry+https://github.com/rust-lang/crates.io-index" 193 | checksum = "7c64043d6c7b7a4c58e39e7efccfdea7b93d885a795d0c054a69dbbf4dd52686" 194 | dependencies = [ 195 | "crossterm", 196 | "strum", 197 | "strum_macros", 198 | "unicode-width", 199 | ] 200 | 201 | [[package]] 202 | name = "core-foundation-sys" 203 | version = "0.8.6" 204 | source = "registry+https://github.com/rust-lang/crates.io-index" 205 | checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" 206 | 207 | [[package]] 208 | name = "crossbeam-channel" 209 | version = "0.5.11" 210 | source = "registry+https://github.com/rust-lang/crates.io-index" 211 | checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" 212 | dependencies = [ 213 | "crossbeam-utils", 214 | ] 215 | 216 | [[package]] 217 | name = "crossbeam-deque" 218 | version = "0.8.5" 219 | source = "registry+https://github.com/rust-lang/crates.io-index" 220 | checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" 221 | dependencies = [ 222 | "crossbeam-epoch", 223 | "crossbeam-utils", 224 | ] 225 | 226 | [[package]] 227 | name = "crossbeam-epoch" 228 | version = "0.9.18" 229 | source = "registry+https://github.com/rust-lang/crates.io-index" 230 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 231 | dependencies = [ 232 | "crossbeam-utils", 233 | ] 234 | 235 | [[package]] 236 | name = "crossbeam-queue" 237 | version = "0.3.11" 238 | source = "registry+https://github.com/rust-lang/crates.io-index" 239 | checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" 240 | dependencies = [ 241 | "crossbeam-utils", 242 | ] 243 | 244 | [[package]] 245 | name = "crossbeam-utils" 246 | version = "0.8.19" 247 | source = "registry+https://github.com/rust-lang/crates.io-index" 248 | checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" 249 | 250 | [[package]] 251 | name = "crossterm" 252 | version = "0.27.0" 253 | source = "registry+https://github.com/rust-lang/crates.io-index" 254 | checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" 255 | dependencies = [ 256 | "bitflags 2.4.2", 257 | "crossterm_winapi", 258 | "libc", 259 | "parking_lot", 260 | "winapi", 261 | ] 262 | 263 | [[package]] 264 | name = "crossterm_winapi" 265 | version = "0.9.1" 266 | source = "registry+https://github.com/rust-lang/crates.io-index" 267 | checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" 268 | dependencies = [ 269 | "winapi", 270 | ] 271 | 272 | [[package]] 273 | name = "dyn-clone" 274 | version = "1.0.17" 275 | source = "registry+https://github.com/rust-lang/crates.io-index" 276 | checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" 277 | 278 | [[package]] 279 | name = "either" 280 | version = "1.10.0" 281 | source = "registry+https://github.com/rust-lang/crates.io-index" 282 | checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" 283 | 284 | [[package]] 285 | name = "enum_dispatch" 286 | version = "0.3.12" 287 | source = "registry+https://github.com/rust-lang/crates.io-index" 288 | checksum = "8f33313078bb8d4d05a2733a94ac4c2d8a0df9a2b84424ebf4f33bfc224a890e" 289 | dependencies = [ 290 | "once_cell", 291 | "proc-macro2", 292 | "quote", 293 | "syn 2.0.51", 294 | ] 295 | 296 | [[package]] 297 | name = "equivalent" 298 | version = "1.0.1" 299 | source = "registry+https://github.com/rust-lang/crates.io-index" 300 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 301 | 302 | [[package]] 303 | name = "ethnum" 304 | version = "1.5.0" 305 | source = "registry+https://github.com/rust-lang/crates.io-index" 306 | checksum = "b90ca2580b73ab6a1f724b76ca11ab632df820fd6040c336200d2c1df7b3c82c" 307 | 308 | [[package]] 309 | name = "fast-float" 310 | version = "0.2.0" 311 | source = "registry+https://github.com/rust-lang/crates.io-index" 312 | checksum = "95765f67b4b18863968b4a1bd5bb576f732b29a4a28c7cd84c09fa3e2875f33c" 313 | 314 | [[package]] 315 | name = "foreign_vec" 316 | version = "0.1.0" 317 | source = "registry+https://github.com/rust-lang/crates.io-index" 318 | checksum = "ee1b05cbd864bcaecbd3455d6d967862d446e4ebfc3c2e5e5b9841e53cba6673" 319 | 320 | [[package]] 321 | name = "getrandom" 322 | version = "0.2.12" 323 | source = "registry+https://github.com/rust-lang/crates.io-index" 324 | checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" 325 | dependencies = [ 326 | "cfg-if", 327 | "js-sys", 328 | "libc", 329 | "wasi", 330 | "wasm-bindgen", 331 | ] 332 | 333 | [[package]] 334 | name = "glob" 335 | version = "0.3.1" 336 | source = "registry+https://github.com/rust-lang/crates.io-index" 337 | checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" 338 | 339 | [[package]] 340 | name = "hashbrown" 341 | version = "0.14.3" 342 | source = "registry+https://github.com/rust-lang/crates.io-index" 343 | checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" 344 | dependencies = [ 345 | "ahash", 346 | "allocator-api2", 347 | "rayon", 348 | ] 349 | 350 | [[package]] 351 | name = "heck" 352 | version = "0.4.1" 353 | source = "registry+https://github.com/rust-lang/crates.io-index" 354 | checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" 355 | 356 | [[package]] 357 | name = "hex" 358 | version = "0.4.3" 359 | source = "registry+https://github.com/rust-lang/crates.io-index" 360 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 361 | 362 | [[package]] 363 | name = "home" 364 | version = "0.5.9" 365 | source = "registry+https://github.com/rust-lang/crates.io-index" 366 | checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" 367 | dependencies = [ 368 | "windows-sys", 369 | ] 370 | 371 | [[package]] 372 | name = "iana-time-zone" 373 | version = "0.1.60" 374 | source = "registry+https://github.com/rust-lang/crates.io-index" 375 | checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" 376 | dependencies = [ 377 | "android_system_properties", 378 | "core-foundation-sys", 379 | "iana-time-zone-haiku", 380 | "js-sys", 381 | "wasm-bindgen", 382 | "windows-core", 383 | ] 384 | 385 | [[package]] 386 | name = "iana-time-zone-haiku" 387 | version = "0.1.2" 388 | source = "registry+https://github.com/rust-lang/crates.io-index" 389 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 390 | dependencies = [ 391 | "cc", 392 | ] 393 | 394 | [[package]] 395 | name = "indexmap" 396 | version = "2.2.3" 397 | source = "registry+https://github.com/rust-lang/crates.io-index" 398 | checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" 399 | dependencies = [ 400 | "equivalent", 401 | "hashbrown", 402 | ] 403 | 404 | [[package]] 405 | name = "indoc" 406 | version = "2.0.4" 407 | source = "registry+https://github.com/rust-lang/crates.io-index" 408 | checksum = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8" 409 | 410 | [[package]] 411 | name = "iter-read" 412 | version = "0.3.1" 413 | source = "registry+https://github.com/rust-lang/crates.io-index" 414 | checksum = "c397ca3ea05ad509c4ec451fea28b4771236a376ca1c69fd5143aae0cf8f93c4" 415 | 416 | [[package]] 417 | name = "itoa" 418 | version = "1.0.10" 419 | source = "registry+https://github.com/rust-lang/crates.io-index" 420 | checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" 421 | 422 | [[package]] 423 | name = "itoap" 424 | version = "1.0.1" 425 | source = "registry+https://github.com/rust-lang/crates.io-index" 426 | checksum = "9028f49264629065d057f340a86acb84867925865f73bbf8d47b4d149a7e88b8" 427 | 428 | [[package]] 429 | name = "js-sys" 430 | version = "0.3.68" 431 | source = "registry+https://github.com/rust-lang/crates.io-index" 432 | checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" 433 | dependencies = [ 434 | "wasm-bindgen", 435 | ] 436 | 437 | [[package]] 438 | name = "libc" 439 | version = "0.2.153" 440 | source = "registry+https://github.com/rust-lang/crates.io-index" 441 | checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" 442 | 443 | [[package]] 444 | name = "libm" 445 | version = "0.2.8" 446 | source = "registry+https://github.com/rust-lang/crates.io-index" 447 | checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" 448 | 449 | [[package]] 450 | name = "lock_api" 451 | version = "0.4.11" 452 | source = "registry+https://github.com/rust-lang/crates.io-index" 453 | checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" 454 | dependencies = [ 455 | "autocfg", 456 | "scopeguard", 457 | ] 458 | 459 | [[package]] 460 | name = "log" 461 | version = "0.4.20" 462 | source = "registry+https://github.com/rust-lang/crates.io-index" 463 | checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" 464 | 465 | [[package]] 466 | name = "lz4" 467 | version = "1.24.0" 468 | source = "registry+https://github.com/rust-lang/crates.io-index" 469 | checksum = "7e9e2dd86df36ce760a60f6ff6ad526f7ba1f14ba0356f8254fb6905e6494df1" 470 | dependencies = [ 471 | "libc", 472 | "lz4-sys", 473 | ] 474 | 475 | [[package]] 476 | name = "lz4-sys" 477 | version = "1.9.4" 478 | source = "registry+https://github.com/rust-lang/crates.io-index" 479 | checksum = "57d27b317e207b10f69f5e75494119e391a96f48861ae870d1da6edac98ca900" 480 | dependencies = [ 481 | "cc", 482 | "libc", 483 | ] 484 | 485 | [[package]] 486 | name = "memchr" 487 | version = "2.7.1" 488 | source = "registry+https://github.com/rust-lang/crates.io-index" 489 | checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" 490 | 491 | [[package]] 492 | name = "memmap2" 493 | version = "0.7.1" 494 | source = "registry+https://github.com/rust-lang/crates.io-index" 495 | checksum = "f49388d20533534cd19360ad3d6a7dadc885944aa802ba3995040c5ec11288c6" 496 | dependencies = [ 497 | "libc", 498 | ] 499 | 500 | [[package]] 501 | name = "memoffset" 502 | version = "0.9.0" 503 | source = "registry+https://github.com/rust-lang/crates.io-index" 504 | checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" 505 | dependencies = [ 506 | "autocfg", 507 | ] 508 | 509 | [[package]] 510 | name = "multiversion" 511 | version = "0.7.3" 512 | source = "registry+https://github.com/rust-lang/crates.io-index" 513 | checksum = "b2c7b9d7fe61760ce5ea19532ead98541f6b4c495d87247aff9826445cf6872a" 514 | dependencies = [ 515 | "multiversion-macros", 516 | "target-features", 517 | ] 518 | 519 | [[package]] 520 | name = "multiversion-macros" 521 | version = "0.7.3" 522 | source = "registry+https://github.com/rust-lang/crates.io-index" 523 | checksum = "26a83d8500ed06d68877e9de1dde76c1dbb83885dcdbda4ef44ccbc3fbda2ac8" 524 | dependencies = [ 525 | "proc-macro2", 526 | "quote", 527 | "syn 1.0.109", 528 | "target-features", 529 | ] 530 | 531 | [[package]] 532 | name = "now" 533 | version = "0.1.3" 534 | source = "registry+https://github.com/rust-lang/crates.io-index" 535 | checksum = "6d89e9874397a1f0a52fc1f197a8effd9735223cb2390e9dcc83ac6cd02923d0" 536 | dependencies = [ 537 | "chrono", 538 | ] 539 | 540 | [[package]] 541 | name = "ntapi" 542 | version = "0.4.1" 543 | source = "registry+https://github.com/rust-lang/crates.io-index" 544 | checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" 545 | dependencies = [ 546 | "winapi", 547 | ] 548 | 549 | [[package]] 550 | name = "nucleo" 551 | version = "0.4.0" 552 | source = "registry+https://github.com/rust-lang/crates.io-index" 553 | checksum = "7eee5490d254bf40930ff213259a507242df1014a8aeea9ebced2906cab4f44e" 554 | dependencies = [ 555 | "nucleo-matcher", 556 | "parking_lot", 557 | "rayon", 558 | ] 559 | 560 | [[package]] 561 | name = "nucleo-matcher" 562 | version = "0.3.1" 563 | source = "registry+https://github.com/rust-lang/crates.io-index" 564 | checksum = "bf33f538733d1a5a3494b836ba913207f14d9d4a1d3cd67030c5061bdd2cac85" 565 | dependencies = [ 566 | "memchr", 567 | "unicode-segmentation", 568 | ] 569 | 570 | [[package]] 571 | name = "num-bigint" 572 | version = "0.4.4" 573 | source = "registry+https://github.com/rust-lang/crates.io-index" 574 | checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" 575 | dependencies = [ 576 | "autocfg", 577 | "num-integer", 578 | "num-traits", 579 | ] 580 | 581 | [[package]] 582 | name = "num-integer" 583 | version = "0.1.46" 584 | source = "registry+https://github.com/rust-lang/crates.io-index" 585 | checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 586 | dependencies = [ 587 | "num-traits", 588 | ] 589 | 590 | [[package]] 591 | name = "num-traits" 592 | version = "0.2.18" 593 | source = "registry+https://github.com/rust-lang/crates.io-index" 594 | checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" 595 | dependencies = [ 596 | "autocfg", 597 | "libm", 598 | ] 599 | 600 | [[package]] 601 | name = "once_cell" 602 | version = "1.19.0" 603 | source = "registry+https://github.com/rust-lang/crates.io-index" 604 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 605 | 606 | [[package]] 607 | name = "parking_lot" 608 | version = "0.12.1" 609 | source = "registry+https://github.com/rust-lang/crates.io-index" 610 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 611 | dependencies = [ 612 | "lock_api", 613 | "parking_lot_core", 614 | ] 615 | 616 | [[package]] 617 | name = "parking_lot_core" 618 | version = "0.9.9" 619 | source = "registry+https://github.com/rust-lang/crates.io-index" 620 | checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" 621 | dependencies = [ 622 | "cfg-if", 623 | "libc", 624 | "redox_syscall", 625 | "smallvec", 626 | "windows-targets 0.48.5", 627 | ] 628 | 629 | [[package]] 630 | name = "parse-zoneinfo" 631 | version = "0.3.0" 632 | source = "registry+https://github.com/rust-lang/crates.io-index" 633 | checksum = "c705f256449c60da65e11ff6626e0c16a0a0b96aaa348de61376b249bc340f41" 634 | dependencies = [ 635 | "regex", 636 | ] 637 | 638 | [[package]] 639 | name = "percent-encoding" 640 | version = "2.3.1" 641 | source = "registry+https://github.com/rust-lang/crates.io-index" 642 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 643 | 644 | [[package]] 645 | name = "phf" 646 | version = "0.11.2" 647 | source = "registry+https://github.com/rust-lang/crates.io-index" 648 | checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" 649 | dependencies = [ 650 | "phf_shared", 651 | ] 652 | 653 | [[package]] 654 | name = "phf_codegen" 655 | version = "0.11.2" 656 | source = "registry+https://github.com/rust-lang/crates.io-index" 657 | checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" 658 | dependencies = [ 659 | "phf_generator", 660 | "phf_shared", 661 | ] 662 | 663 | [[package]] 664 | name = "phf_generator" 665 | version = "0.11.2" 666 | source = "registry+https://github.com/rust-lang/crates.io-index" 667 | checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" 668 | dependencies = [ 669 | "phf_shared", 670 | "rand", 671 | ] 672 | 673 | [[package]] 674 | name = "phf_shared" 675 | version = "0.11.2" 676 | source = "registry+https://github.com/rust-lang/crates.io-index" 677 | checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" 678 | dependencies = [ 679 | "siphasher", 680 | ] 681 | 682 | [[package]] 683 | name = "pkg-config" 684 | version = "0.3.30" 685 | source = "registry+https://github.com/rust-lang/crates.io-index" 686 | checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" 687 | 688 | [[package]] 689 | name = "planus" 690 | version = "0.3.1" 691 | source = "registry+https://github.com/rust-lang/crates.io-index" 692 | checksum = "fc1691dd09e82f428ce8d6310bd6d5da2557c82ff17694d2a32cad7242aea89f" 693 | dependencies = [ 694 | "array-init-cursor", 695 | ] 696 | 697 | [[package]] 698 | name = "polars" 699 | version = "0.37.0" 700 | source = "registry+https://github.com/rust-lang/crates.io-index" 701 | checksum = "e43795c49010cb851d45227caa17769e83760e21d260ba6285c563b754e1652f" 702 | dependencies = [ 703 | "getrandom", 704 | "polars-core", 705 | "polars-io", 706 | "polars-lazy", 707 | "polars-ops", 708 | "polars-sql", 709 | "polars-time", 710 | "version_check", 711 | ] 712 | 713 | [[package]] 714 | name = "polars-arrow" 715 | version = "0.37.0" 716 | source = "registry+https://github.com/rust-lang/crates.io-index" 717 | checksum = "faacd21a2548fa6d50c72d6b8d4649a8e029a0f3c6c5545b7f436f0610e49b0f" 718 | dependencies = [ 719 | "ahash", 720 | "atoi", 721 | "atoi_simd", 722 | "bytemuck", 723 | "chrono", 724 | "chrono-tz", 725 | "dyn-clone", 726 | "either", 727 | "ethnum", 728 | "fast-float", 729 | "foreign_vec", 730 | "getrandom", 731 | "hashbrown", 732 | "itoa", 733 | "itoap", 734 | "lz4", 735 | "multiversion", 736 | "num-traits", 737 | "polars-arrow-format", 738 | "polars-error", 739 | "polars-utils", 740 | "ryu", 741 | "simdutf8", 742 | "streaming-iterator", 743 | "strength_reduce", 744 | "version_check", 745 | "zstd", 746 | ] 747 | 748 | [[package]] 749 | name = "polars-arrow-format" 750 | version = "0.1.0" 751 | source = "registry+https://github.com/rust-lang/crates.io-index" 752 | checksum = "19b0ef2474af9396b19025b189d96e992311e6a47f90c53cd998b36c4c64b84c" 753 | dependencies = [ 754 | "planus", 755 | "serde", 756 | ] 757 | 758 | [[package]] 759 | name = "polars-compute" 760 | version = "0.37.0" 761 | source = "registry+https://github.com/rust-lang/crates.io-index" 762 | checksum = "32d9dc87f8003ae0edeef5ad9ac92b2a345480bbe17adad64496113ae84706dd" 763 | dependencies = [ 764 | "bytemuck", 765 | "num-traits", 766 | "polars-arrow", 767 | "polars-error", 768 | "polars-utils", 769 | "version_check", 770 | ] 771 | 772 | [[package]] 773 | name = "polars-core" 774 | version = "0.37.0" 775 | source = "registry+https://github.com/rust-lang/crates.io-index" 776 | checksum = "befd4d280a82219a01035c4f901319ceba65998c594d0c64f9a439cdee1d7777" 777 | dependencies = [ 778 | "ahash", 779 | "bitflags 2.4.2", 780 | "bytemuck", 781 | "chrono", 782 | "chrono-tz", 783 | "comfy-table", 784 | "either", 785 | "hashbrown", 786 | "indexmap", 787 | "num-traits", 788 | "once_cell", 789 | "polars-arrow", 790 | "polars-compute", 791 | "polars-error", 792 | "polars-row", 793 | "polars-utils", 794 | "rand", 795 | "rand_distr", 796 | "rayon", 797 | "regex", 798 | "smartstring", 799 | "thiserror", 800 | "version_check", 801 | "xxhash-rust", 802 | ] 803 | 804 | [[package]] 805 | name = "polars-error" 806 | version = "0.37.0" 807 | source = "registry+https://github.com/rust-lang/crates.io-index" 808 | checksum = "50f2435b02d1ba36d8c1f6a722cad04e4c0b2705a3112c5706e6960d405d7798" 809 | dependencies = [ 810 | "polars-arrow-format", 811 | "regex", 812 | "simdutf8", 813 | "thiserror", 814 | ] 815 | 816 | [[package]] 817 | name = "polars-ffi" 818 | version = "0.37.0" 819 | source = "registry+https://github.com/rust-lang/crates.io-index" 820 | checksum = "f02331289626c8894e7b68467cd2de84d010f90def9bdd479e00e4fbafced7a9" 821 | dependencies = [ 822 | "polars-arrow", 823 | "polars-core", 824 | ] 825 | 826 | [[package]] 827 | name = "polars-io" 828 | version = "0.37.0" 829 | source = "registry+https://github.com/rust-lang/crates.io-index" 830 | checksum = "b51fba2cf014cb39c2b38353d601540fb9db643be65abb9ca8ff44b9c4c4a88e" 831 | dependencies = [ 832 | "ahash", 833 | "atoi_simd", 834 | "bytes", 835 | "chrono", 836 | "fast-float", 837 | "home", 838 | "itoa", 839 | "memchr", 840 | "memmap2", 841 | "num-traits", 842 | "once_cell", 843 | "percent-encoding", 844 | "polars-arrow", 845 | "polars-core", 846 | "polars-error", 847 | "polars-time", 848 | "polars-utils", 849 | "rayon", 850 | "regex", 851 | "ryu", 852 | "simdutf8", 853 | "smartstring", 854 | ] 855 | 856 | [[package]] 857 | name = "polars-lazy" 858 | version = "0.37.0" 859 | source = "registry+https://github.com/rust-lang/crates.io-index" 860 | checksum = "d83343e413346f048f3a5ad07c0ea4b5d0bada701a482878213142970b0ddff8" 861 | dependencies = [ 862 | "ahash", 863 | "bitflags 2.4.2", 864 | "glob", 865 | "once_cell", 866 | "polars-arrow", 867 | "polars-core", 868 | "polars-io", 869 | "polars-ops", 870 | "polars-pipe", 871 | "polars-plan", 872 | "polars-time", 873 | "polars-utils", 874 | "rayon", 875 | "smartstring", 876 | "version_check", 877 | ] 878 | 879 | [[package]] 880 | name = "polars-ops" 881 | version = "0.37.0" 882 | source = "registry+https://github.com/rust-lang/crates.io-index" 883 | checksum = "6395f5fd5e1adf016fd6403c0a493181c1a349a7a145b2687cdf50a0d630310a" 884 | dependencies = [ 885 | "ahash", 886 | "argminmax", 887 | "base64", 888 | "bytemuck", 889 | "chrono", 890 | "chrono-tz", 891 | "either", 892 | "hashbrown", 893 | "hex", 894 | "indexmap", 895 | "memchr", 896 | "num-traits", 897 | "polars-arrow", 898 | "polars-compute", 899 | "polars-core", 900 | "polars-error", 901 | "polars-utils", 902 | "rayon", 903 | "regex", 904 | "smartstring", 905 | "unicode-reverse", 906 | "version_check", 907 | ] 908 | 909 | [[package]] 910 | name = "polars-pipe" 911 | version = "0.37.0" 912 | source = "registry+https://github.com/rust-lang/crates.io-index" 913 | checksum = "390a831b864bc57a4cb260b0595030dfb6a4260a3723cf8ca17968ee2078b8ff" 914 | dependencies = [ 915 | "crossbeam-channel", 916 | "crossbeam-queue", 917 | "enum_dispatch", 918 | "hashbrown", 919 | "num-traits", 920 | "polars-arrow", 921 | "polars-compute", 922 | "polars-core", 923 | "polars-io", 924 | "polars-ops", 925 | "polars-plan", 926 | "polars-row", 927 | "polars-utils", 928 | "rayon", 929 | "smartstring", 930 | "version_check", 931 | ] 932 | 933 | [[package]] 934 | name = "polars-plan" 935 | version = "0.37.0" 936 | source = "registry+https://github.com/rust-lang/crates.io-index" 937 | checksum = "7fb7d7527be2aa33baace9000f6772eb9df7cd57ec010a4b273435d2dc1349e8" 938 | dependencies = [ 939 | "ahash", 940 | "bytemuck", 941 | "chrono-tz", 942 | "once_cell", 943 | "percent-encoding", 944 | "polars-arrow", 945 | "polars-core", 946 | "polars-io", 947 | "polars-ops", 948 | "polars-time", 949 | "polars-utils", 950 | "rayon", 951 | "regex", 952 | "smartstring", 953 | "strum_macros", 954 | "version_check", 955 | ] 956 | 957 | [[package]] 958 | name = "polars-row" 959 | version = "0.37.0" 960 | source = "registry+https://github.com/rust-lang/crates.io-index" 961 | checksum = "f4984d97aad3d0db92afe76ebcab10b5e37a1216618b5703ae0d2917ccd6168c" 962 | dependencies = [ 963 | "polars-arrow", 964 | "polars-error", 965 | "polars-utils", 966 | ] 967 | 968 | [[package]] 969 | name = "polars-sql" 970 | version = "0.37.0" 971 | source = "registry+https://github.com/rust-lang/crates.io-index" 972 | checksum = "77f62a8b8f93146ec1eb2ef340d77eeb174e8010035e449bfdd424d2b1fd944a" 973 | dependencies = [ 974 | "hex", 975 | "polars-arrow", 976 | "polars-core", 977 | "polars-error", 978 | "polars-lazy", 979 | "polars-plan", 980 | "rand", 981 | "serde", 982 | "serde_json", 983 | "sqlparser", 984 | ] 985 | 986 | [[package]] 987 | name = "polars-time" 988 | version = "0.37.0" 989 | source = "registry+https://github.com/rust-lang/crates.io-index" 990 | checksum = "6d75348a51d0c97f3b83df860ecb35a6ac6c5dafc6278cac4e1ac101d96dc753" 991 | dependencies = [ 992 | "atoi", 993 | "chrono", 994 | "chrono-tz", 995 | "now", 996 | "once_cell", 997 | "polars-arrow", 998 | "polars-core", 999 | "polars-error", 1000 | "polars-ops", 1001 | "polars-utils", 1002 | "regex", 1003 | "smartstring", 1004 | ] 1005 | 1006 | [[package]] 1007 | name = "polars-utils" 1008 | version = "0.37.0" 1009 | source = "registry+https://github.com/rust-lang/crates.io-index" 1010 | checksum = "38f9c955bb1e9b55d835aeb7fe4e4e8826e01abe5f0ada979ceb7d2b9af7b569" 1011 | dependencies = [ 1012 | "ahash", 1013 | "bytemuck", 1014 | "hashbrown", 1015 | "indexmap", 1016 | "num-traits", 1017 | "once_cell", 1018 | "polars-error", 1019 | "rayon", 1020 | "smartstring", 1021 | "sysinfo", 1022 | "version_check", 1023 | ] 1024 | 1025 | [[package]] 1026 | name = "polars_fuzzy_match" 1027 | version = "0.1.2" 1028 | dependencies = [ 1029 | "nucleo", 1030 | "nucleo-matcher", 1031 | "polars", 1032 | "pyo3", 1033 | "pyo3-polars", 1034 | "serde", 1035 | ] 1036 | 1037 | [[package]] 1038 | name = "portable-atomic" 1039 | version = "1.6.0" 1040 | source = "registry+https://github.com/rust-lang/crates.io-index" 1041 | checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" 1042 | 1043 | [[package]] 1044 | name = "ppv-lite86" 1045 | version = "0.2.17" 1046 | source = "registry+https://github.com/rust-lang/crates.io-index" 1047 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 1048 | 1049 | [[package]] 1050 | name = "proc-macro2" 1051 | version = "1.0.78" 1052 | source = "registry+https://github.com/rust-lang/crates.io-index" 1053 | checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" 1054 | dependencies = [ 1055 | "unicode-ident", 1056 | ] 1057 | 1058 | [[package]] 1059 | name = "pyo3" 1060 | version = "0.20.3" 1061 | source = "registry+https://github.com/rust-lang/crates.io-index" 1062 | checksum = "53bdbb96d49157e65d45cc287af5f32ffadd5f4761438b527b055fb0d4bb8233" 1063 | dependencies = [ 1064 | "cfg-if", 1065 | "indoc", 1066 | "libc", 1067 | "memoffset", 1068 | "parking_lot", 1069 | "portable-atomic", 1070 | "pyo3-build-config", 1071 | "pyo3-ffi", 1072 | "pyo3-macros", 1073 | "unindent", 1074 | ] 1075 | 1076 | [[package]] 1077 | name = "pyo3-build-config" 1078 | version = "0.20.3" 1079 | source = "registry+https://github.com/rust-lang/crates.io-index" 1080 | checksum = "deaa5745de3f5231ce10517a1f5dd97d53e5a2fd77aa6b5842292085831d48d7" 1081 | dependencies = [ 1082 | "once_cell", 1083 | "target-lexicon", 1084 | ] 1085 | 1086 | [[package]] 1087 | name = "pyo3-ffi" 1088 | version = "0.20.3" 1089 | source = "registry+https://github.com/rust-lang/crates.io-index" 1090 | checksum = "62b42531d03e08d4ef1f6e85a2ed422eb678b8cd62b762e53891c05faf0d4afa" 1091 | dependencies = [ 1092 | "libc", 1093 | "pyo3-build-config", 1094 | ] 1095 | 1096 | [[package]] 1097 | name = "pyo3-macros" 1098 | version = "0.20.3" 1099 | source = "registry+https://github.com/rust-lang/crates.io-index" 1100 | checksum = "7305c720fa01b8055ec95e484a6eca7a83c841267f0dd5280f0c8b8551d2c158" 1101 | dependencies = [ 1102 | "proc-macro2", 1103 | "pyo3-macros-backend", 1104 | "quote", 1105 | "syn 2.0.51", 1106 | ] 1107 | 1108 | [[package]] 1109 | name = "pyo3-macros-backend" 1110 | version = "0.20.3" 1111 | source = "registry+https://github.com/rust-lang/crates.io-index" 1112 | checksum = "7c7e9b68bb9c3149c5b0cade5d07f953d6d125eb4337723c4ccdb665f1f96185" 1113 | dependencies = [ 1114 | "heck", 1115 | "proc-macro2", 1116 | "pyo3-build-config", 1117 | "quote", 1118 | "syn 2.0.51", 1119 | ] 1120 | 1121 | [[package]] 1122 | name = "pyo3-polars" 1123 | version = "0.11.3" 1124 | source = "registry+https://github.com/rust-lang/crates.io-index" 1125 | checksum = "7fa311764163c831c75f9ca49499abacbf7ece676cad0b059d962a384aa18224" 1126 | dependencies = [ 1127 | "polars", 1128 | "polars-core", 1129 | "polars-ffi", 1130 | "polars-plan", 1131 | "pyo3", 1132 | "pyo3-polars-derive", 1133 | "serde", 1134 | "serde-pickle", 1135 | "thiserror", 1136 | ] 1137 | 1138 | [[package]] 1139 | name = "pyo3-polars-derive" 1140 | version = "0.5.0" 1141 | source = "registry+https://github.com/rust-lang/crates.io-index" 1142 | checksum = "e654e869ba1b0b440dde8e11890fb3578fccd75a4b007672e44eed70071517b4" 1143 | dependencies = [ 1144 | "polars-core", 1145 | "polars-ffi", 1146 | "polars-plan", 1147 | "proc-macro2", 1148 | "quote", 1149 | "syn 2.0.51", 1150 | ] 1151 | 1152 | [[package]] 1153 | name = "quote" 1154 | version = "1.0.35" 1155 | source = "registry+https://github.com/rust-lang/crates.io-index" 1156 | checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" 1157 | dependencies = [ 1158 | "proc-macro2", 1159 | ] 1160 | 1161 | [[package]] 1162 | name = "rand" 1163 | version = "0.8.5" 1164 | source = "registry+https://github.com/rust-lang/crates.io-index" 1165 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1166 | dependencies = [ 1167 | "libc", 1168 | "rand_chacha", 1169 | "rand_core", 1170 | ] 1171 | 1172 | [[package]] 1173 | name = "rand_chacha" 1174 | version = "0.3.1" 1175 | source = "registry+https://github.com/rust-lang/crates.io-index" 1176 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1177 | dependencies = [ 1178 | "ppv-lite86", 1179 | "rand_core", 1180 | ] 1181 | 1182 | [[package]] 1183 | name = "rand_core" 1184 | version = "0.6.4" 1185 | source = "registry+https://github.com/rust-lang/crates.io-index" 1186 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1187 | dependencies = [ 1188 | "getrandom", 1189 | ] 1190 | 1191 | [[package]] 1192 | name = "rand_distr" 1193 | version = "0.4.3" 1194 | source = "registry+https://github.com/rust-lang/crates.io-index" 1195 | checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" 1196 | dependencies = [ 1197 | "num-traits", 1198 | "rand", 1199 | ] 1200 | 1201 | [[package]] 1202 | name = "rayon" 1203 | version = "1.8.1" 1204 | source = "registry+https://github.com/rust-lang/crates.io-index" 1205 | checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" 1206 | dependencies = [ 1207 | "either", 1208 | "rayon-core", 1209 | ] 1210 | 1211 | [[package]] 1212 | name = "rayon-core" 1213 | version = "1.12.1" 1214 | source = "registry+https://github.com/rust-lang/crates.io-index" 1215 | checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" 1216 | dependencies = [ 1217 | "crossbeam-deque", 1218 | "crossbeam-utils", 1219 | ] 1220 | 1221 | [[package]] 1222 | name = "redox_syscall" 1223 | version = "0.4.1" 1224 | source = "registry+https://github.com/rust-lang/crates.io-index" 1225 | checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" 1226 | dependencies = [ 1227 | "bitflags 1.3.2", 1228 | ] 1229 | 1230 | [[package]] 1231 | name = "regex" 1232 | version = "1.10.3" 1233 | source = "registry+https://github.com/rust-lang/crates.io-index" 1234 | checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" 1235 | dependencies = [ 1236 | "aho-corasick", 1237 | "memchr", 1238 | "regex-automata", 1239 | "regex-syntax", 1240 | ] 1241 | 1242 | [[package]] 1243 | name = "regex-automata" 1244 | version = "0.4.5" 1245 | source = "registry+https://github.com/rust-lang/crates.io-index" 1246 | checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" 1247 | dependencies = [ 1248 | "aho-corasick", 1249 | "memchr", 1250 | "regex-syntax", 1251 | ] 1252 | 1253 | [[package]] 1254 | name = "regex-syntax" 1255 | version = "0.8.2" 1256 | source = "registry+https://github.com/rust-lang/crates.io-index" 1257 | checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" 1258 | 1259 | [[package]] 1260 | name = "rustversion" 1261 | version = "1.0.14" 1262 | source = "registry+https://github.com/rust-lang/crates.io-index" 1263 | checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" 1264 | 1265 | [[package]] 1266 | name = "ryu" 1267 | version = "1.0.17" 1268 | source = "registry+https://github.com/rust-lang/crates.io-index" 1269 | checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" 1270 | 1271 | [[package]] 1272 | name = "scopeguard" 1273 | version = "1.2.0" 1274 | source = "registry+https://github.com/rust-lang/crates.io-index" 1275 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1276 | 1277 | [[package]] 1278 | name = "serde" 1279 | version = "1.0.197" 1280 | source = "registry+https://github.com/rust-lang/crates.io-index" 1281 | checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" 1282 | dependencies = [ 1283 | "serde_derive", 1284 | ] 1285 | 1286 | [[package]] 1287 | name = "serde-pickle" 1288 | version = "1.1.1" 1289 | source = "registry+https://github.com/rust-lang/crates.io-index" 1290 | checksum = "c762ad136a26407c6a80825813600ceeab5e613660d93d79a41f0ec877171e71" 1291 | dependencies = [ 1292 | "byteorder", 1293 | "iter-read", 1294 | "num-bigint", 1295 | "num-traits", 1296 | "serde", 1297 | ] 1298 | 1299 | [[package]] 1300 | name = "serde_derive" 1301 | version = "1.0.197" 1302 | source = "registry+https://github.com/rust-lang/crates.io-index" 1303 | checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" 1304 | dependencies = [ 1305 | "proc-macro2", 1306 | "quote", 1307 | "syn 2.0.51", 1308 | ] 1309 | 1310 | [[package]] 1311 | name = "serde_json" 1312 | version = "1.0.114" 1313 | source = "registry+https://github.com/rust-lang/crates.io-index" 1314 | checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" 1315 | dependencies = [ 1316 | "itoa", 1317 | "ryu", 1318 | "serde", 1319 | ] 1320 | 1321 | [[package]] 1322 | name = "simdutf8" 1323 | version = "0.1.4" 1324 | source = "registry+https://github.com/rust-lang/crates.io-index" 1325 | checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" 1326 | 1327 | [[package]] 1328 | name = "siphasher" 1329 | version = "0.3.11" 1330 | source = "registry+https://github.com/rust-lang/crates.io-index" 1331 | checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" 1332 | 1333 | [[package]] 1334 | name = "smallvec" 1335 | version = "1.13.1" 1336 | source = "registry+https://github.com/rust-lang/crates.io-index" 1337 | checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" 1338 | 1339 | [[package]] 1340 | name = "smartstring" 1341 | version = "1.0.1" 1342 | source = "registry+https://github.com/rust-lang/crates.io-index" 1343 | checksum = "3fb72c633efbaa2dd666986505016c32c3044395ceaf881518399d2f4127ee29" 1344 | dependencies = [ 1345 | "autocfg", 1346 | "static_assertions", 1347 | "version_check", 1348 | ] 1349 | 1350 | [[package]] 1351 | name = "sqlparser" 1352 | version = "0.39.0" 1353 | source = "registry+https://github.com/rust-lang/crates.io-index" 1354 | checksum = "743b4dc2cbde11890ccb254a8fc9d537fa41b36da00de2a1c5e9848c9bc42bd7" 1355 | dependencies = [ 1356 | "log", 1357 | ] 1358 | 1359 | [[package]] 1360 | name = "static_assertions" 1361 | version = "1.1.0" 1362 | source = "registry+https://github.com/rust-lang/crates.io-index" 1363 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 1364 | 1365 | [[package]] 1366 | name = "streaming-iterator" 1367 | version = "0.1.9" 1368 | source = "registry+https://github.com/rust-lang/crates.io-index" 1369 | checksum = "2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520" 1370 | 1371 | [[package]] 1372 | name = "strength_reduce" 1373 | version = "0.2.4" 1374 | source = "registry+https://github.com/rust-lang/crates.io-index" 1375 | checksum = "fe895eb47f22e2ddd4dabc02bce419d2e643c8e3b585c78158b349195bc24d82" 1376 | 1377 | [[package]] 1378 | name = "strum" 1379 | version = "0.25.0" 1380 | source = "registry+https://github.com/rust-lang/crates.io-index" 1381 | checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" 1382 | 1383 | [[package]] 1384 | name = "strum_macros" 1385 | version = "0.25.3" 1386 | source = "registry+https://github.com/rust-lang/crates.io-index" 1387 | checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" 1388 | dependencies = [ 1389 | "heck", 1390 | "proc-macro2", 1391 | "quote", 1392 | "rustversion", 1393 | "syn 2.0.51", 1394 | ] 1395 | 1396 | [[package]] 1397 | name = "syn" 1398 | version = "1.0.109" 1399 | source = "registry+https://github.com/rust-lang/crates.io-index" 1400 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 1401 | dependencies = [ 1402 | "proc-macro2", 1403 | "quote", 1404 | "unicode-ident", 1405 | ] 1406 | 1407 | [[package]] 1408 | name = "syn" 1409 | version = "2.0.51" 1410 | source = "registry+https://github.com/rust-lang/crates.io-index" 1411 | checksum = "6ab617d94515e94ae53b8406c628598680aa0c9587474ecbe58188f7b345d66c" 1412 | dependencies = [ 1413 | "proc-macro2", 1414 | "quote", 1415 | "unicode-ident", 1416 | ] 1417 | 1418 | [[package]] 1419 | name = "sysinfo" 1420 | version = "0.30.5" 1421 | source = "registry+https://github.com/rust-lang/crates.io-index" 1422 | checksum = "1fb4f3438c8f6389c864e61221cbc97e9bca98b4daf39a5beb7bea660f528bb2" 1423 | dependencies = [ 1424 | "cfg-if", 1425 | "core-foundation-sys", 1426 | "libc", 1427 | "ntapi", 1428 | "once_cell", 1429 | "windows", 1430 | ] 1431 | 1432 | [[package]] 1433 | name = "target-features" 1434 | version = "0.1.5" 1435 | source = "registry+https://github.com/rust-lang/crates.io-index" 1436 | checksum = "cfb5fa503293557c5158bd215fdc225695e567a77e453f5d4452a50a193969bd" 1437 | 1438 | [[package]] 1439 | name = "target-lexicon" 1440 | version = "0.12.14" 1441 | source = "registry+https://github.com/rust-lang/crates.io-index" 1442 | checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" 1443 | 1444 | [[package]] 1445 | name = "thiserror" 1446 | version = "1.0.57" 1447 | source = "registry+https://github.com/rust-lang/crates.io-index" 1448 | checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" 1449 | dependencies = [ 1450 | "thiserror-impl", 1451 | ] 1452 | 1453 | [[package]] 1454 | name = "thiserror-impl" 1455 | version = "1.0.57" 1456 | source = "registry+https://github.com/rust-lang/crates.io-index" 1457 | checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" 1458 | dependencies = [ 1459 | "proc-macro2", 1460 | "quote", 1461 | "syn 2.0.51", 1462 | ] 1463 | 1464 | [[package]] 1465 | name = "unicode-ident" 1466 | version = "1.0.12" 1467 | source = "registry+https://github.com/rust-lang/crates.io-index" 1468 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 1469 | 1470 | [[package]] 1471 | name = "unicode-reverse" 1472 | version = "1.0.8" 1473 | source = "registry+https://github.com/rust-lang/crates.io-index" 1474 | checksum = "0bea5dacebb0d2d0a69a6700a05b59b3908bf801bf563a49bd27a1b60122962c" 1475 | dependencies = [ 1476 | "unicode-segmentation", 1477 | ] 1478 | 1479 | [[package]] 1480 | name = "unicode-segmentation" 1481 | version = "1.11.0" 1482 | source = "registry+https://github.com/rust-lang/crates.io-index" 1483 | checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" 1484 | 1485 | [[package]] 1486 | name = "unicode-width" 1487 | version = "0.1.11" 1488 | source = "registry+https://github.com/rust-lang/crates.io-index" 1489 | checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" 1490 | 1491 | [[package]] 1492 | name = "unindent" 1493 | version = "0.2.3" 1494 | source = "registry+https://github.com/rust-lang/crates.io-index" 1495 | checksum = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce" 1496 | 1497 | [[package]] 1498 | name = "version_check" 1499 | version = "0.9.4" 1500 | source = "registry+https://github.com/rust-lang/crates.io-index" 1501 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 1502 | 1503 | [[package]] 1504 | name = "wasi" 1505 | version = "0.11.0+wasi-snapshot-preview1" 1506 | source = "registry+https://github.com/rust-lang/crates.io-index" 1507 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1508 | 1509 | [[package]] 1510 | name = "wasm-bindgen" 1511 | version = "0.2.91" 1512 | source = "registry+https://github.com/rust-lang/crates.io-index" 1513 | checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" 1514 | dependencies = [ 1515 | "cfg-if", 1516 | "wasm-bindgen-macro", 1517 | ] 1518 | 1519 | [[package]] 1520 | name = "wasm-bindgen-backend" 1521 | version = "0.2.91" 1522 | source = "registry+https://github.com/rust-lang/crates.io-index" 1523 | checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" 1524 | dependencies = [ 1525 | "bumpalo", 1526 | "log", 1527 | "once_cell", 1528 | "proc-macro2", 1529 | "quote", 1530 | "syn 2.0.51", 1531 | "wasm-bindgen-shared", 1532 | ] 1533 | 1534 | [[package]] 1535 | name = "wasm-bindgen-macro" 1536 | version = "0.2.91" 1537 | source = "registry+https://github.com/rust-lang/crates.io-index" 1538 | checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" 1539 | dependencies = [ 1540 | "quote", 1541 | "wasm-bindgen-macro-support", 1542 | ] 1543 | 1544 | [[package]] 1545 | name = "wasm-bindgen-macro-support" 1546 | version = "0.2.91" 1547 | source = "registry+https://github.com/rust-lang/crates.io-index" 1548 | checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" 1549 | dependencies = [ 1550 | "proc-macro2", 1551 | "quote", 1552 | "syn 2.0.51", 1553 | "wasm-bindgen-backend", 1554 | "wasm-bindgen-shared", 1555 | ] 1556 | 1557 | [[package]] 1558 | name = "wasm-bindgen-shared" 1559 | version = "0.2.91" 1560 | source = "registry+https://github.com/rust-lang/crates.io-index" 1561 | checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" 1562 | 1563 | [[package]] 1564 | name = "winapi" 1565 | version = "0.3.9" 1566 | source = "registry+https://github.com/rust-lang/crates.io-index" 1567 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1568 | dependencies = [ 1569 | "winapi-i686-pc-windows-gnu", 1570 | "winapi-x86_64-pc-windows-gnu", 1571 | ] 1572 | 1573 | [[package]] 1574 | name = "winapi-i686-pc-windows-gnu" 1575 | version = "0.4.0" 1576 | source = "registry+https://github.com/rust-lang/crates.io-index" 1577 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1578 | 1579 | [[package]] 1580 | name = "winapi-x86_64-pc-windows-gnu" 1581 | version = "0.4.0" 1582 | source = "registry+https://github.com/rust-lang/crates.io-index" 1583 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1584 | 1585 | [[package]] 1586 | name = "windows" 1587 | version = "0.52.0" 1588 | source = "registry+https://github.com/rust-lang/crates.io-index" 1589 | checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" 1590 | dependencies = [ 1591 | "windows-core", 1592 | "windows-targets 0.52.3", 1593 | ] 1594 | 1595 | [[package]] 1596 | name = "windows-core" 1597 | version = "0.52.0" 1598 | source = "registry+https://github.com/rust-lang/crates.io-index" 1599 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 1600 | dependencies = [ 1601 | "windows-targets 0.52.3", 1602 | ] 1603 | 1604 | [[package]] 1605 | name = "windows-sys" 1606 | version = "0.52.0" 1607 | source = "registry+https://github.com/rust-lang/crates.io-index" 1608 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1609 | dependencies = [ 1610 | "windows-targets 0.52.3", 1611 | ] 1612 | 1613 | [[package]] 1614 | name = "windows-targets" 1615 | version = "0.48.5" 1616 | source = "registry+https://github.com/rust-lang/crates.io-index" 1617 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 1618 | dependencies = [ 1619 | "windows_aarch64_gnullvm 0.48.5", 1620 | "windows_aarch64_msvc 0.48.5", 1621 | "windows_i686_gnu 0.48.5", 1622 | "windows_i686_msvc 0.48.5", 1623 | "windows_x86_64_gnu 0.48.5", 1624 | "windows_x86_64_gnullvm 0.48.5", 1625 | "windows_x86_64_msvc 0.48.5", 1626 | ] 1627 | 1628 | [[package]] 1629 | name = "windows-targets" 1630 | version = "0.52.3" 1631 | source = "registry+https://github.com/rust-lang/crates.io-index" 1632 | checksum = "d380ba1dc7187569a8a9e91ed34b8ccfc33123bbacb8c0aed2d1ad7f3ef2dc5f" 1633 | dependencies = [ 1634 | "windows_aarch64_gnullvm 0.52.3", 1635 | "windows_aarch64_msvc 0.52.3", 1636 | "windows_i686_gnu 0.52.3", 1637 | "windows_i686_msvc 0.52.3", 1638 | "windows_x86_64_gnu 0.52.3", 1639 | "windows_x86_64_gnullvm 0.52.3", 1640 | "windows_x86_64_msvc 0.52.3", 1641 | ] 1642 | 1643 | [[package]] 1644 | name = "windows_aarch64_gnullvm" 1645 | version = "0.48.5" 1646 | source = "registry+https://github.com/rust-lang/crates.io-index" 1647 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 1648 | 1649 | [[package]] 1650 | name = "windows_aarch64_gnullvm" 1651 | version = "0.52.3" 1652 | source = "registry+https://github.com/rust-lang/crates.io-index" 1653 | checksum = "68e5dcfb9413f53afd9c8f86e56a7b4d86d9a2fa26090ea2dc9e40fba56c6ec6" 1654 | 1655 | [[package]] 1656 | name = "windows_aarch64_msvc" 1657 | version = "0.48.5" 1658 | source = "registry+https://github.com/rust-lang/crates.io-index" 1659 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 1660 | 1661 | [[package]] 1662 | name = "windows_aarch64_msvc" 1663 | version = "0.52.3" 1664 | source = "registry+https://github.com/rust-lang/crates.io-index" 1665 | checksum = "8dab469ebbc45798319e69eebf92308e541ce46760b49b18c6b3fe5e8965b30f" 1666 | 1667 | [[package]] 1668 | name = "windows_i686_gnu" 1669 | version = "0.48.5" 1670 | source = "registry+https://github.com/rust-lang/crates.io-index" 1671 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 1672 | 1673 | [[package]] 1674 | name = "windows_i686_gnu" 1675 | version = "0.52.3" 1676 | source = "registry+https://github.com/rust-lang/crates.io-index" 1677 | checksum = "2a4e9b6a7cac734a8b4138a4e1044eac3404d8326b6c0f939276560687a033fb" 1678 | 1679 | [[package]] 1680 | name = "windows_i686_msvc" 1681 | version = "0.48.5" 1682 | source = "registry+https://github.com/rust-lang/crates.io-index" 1683 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 1684 | 1685 | [[package]] 1686 | name = "windows_i686_msvc" 1687 | version = "0.52.3" 1688 | source = "registry+https://github.com/rust-lang/crates.io-index" 1689 | checksum = "28b0ec9c422ca95ff34a78755cfa6ad4a51371da2a5ace67500cf7ca5f232c58" 1690 | 1691 | [[package]] 1692 | name = "windows_x86_64_gnu" 1693 | version = "0.48.5" 1694 | source = "registry+https://github.com/rust-lang/crates.io-index" 1695 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 1696 | 1697 | [[package]] 1698 | name = "windows_x86_64_gnu" 1699 | version = "0.52.3" 1700 | source = "registry+https://github.com/rust-lang/crates.io-index" 1701 | checksum = "704131571ba93e89d7cd43482277d6632589b18ecf4468f591fbae0a8b101614" 1702 | 1703 | [[package]] 1704 | name = "windows_x86_64_gnullvm" 1705 | version = "0.48.5" 1706 | source = "registry+https://github.com/rust-lang/crates.io-index" 1707 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 1708 | 1709 | [[package]] 1710 | name = "windows_x86_64_gnullvm" 1711 | version = "0.52.3" 1712 | source = "registry+https://github.com/rust-lang/crates.io-index" 1713 | checksum = "42079295511643151e98d61c38c0acc444e52dd42ab456f7ccfd5152e8ecf21c" 1714 | 1715 | [[package]] 1716 | name = "windows_x86_64_msvc" 1717 | version = "0.48.5" 1718 | source = "registry+https://github.com/rust-lang/crates.io-index" 1719 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 1720 | 1721 | [[package]] 1722 | name = "windows_x86_64_msvc" 1723 | version = "0.52.3" 1724 | source = "registry+https://github.com/rust-lang/crates.io-index" 1725 | checksum = "0770833d60a970638e989b3fa9fd2bb1aaadcf88963d1659fd7d9990196ed2d6" 1726 | 1727 | [[package]] 1728 | name = "xxhash-rust" 1729 | version = "0.8.10" 1730 | source = "registry+https://github.com/rust-lang/crates.io-index" 1731 | checksum = "927da81e25be1e1a2901d59b81b37dd2efd1fc9c9345a55007f09bf5a2d3ee03" 1732 | 1733 | [[package]] 1734 | name = "zerocopy" 1735 | version = "0.7.32" 1736 | source = "registry+https://github.com/rust-lang/crates.io-index" 1737 | checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" 1738 | dependencies = [ 1739 | "zerocopy-derive", 1740 | ] 1741 | 1742 | [[package]] 1743 | name = "zerocopy-derive" 1744 | version = "0.7.32" 1745 | source = "registry+https://github.com/rust-lang/crates.io-index" 1746 | checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" 1747 | dependencies = [ 1748 | "proc-macro2", 1749 | "quote", 1750 | "syn 2.0.51", 1751 | ] 1752 | 1753 | [[package]] 1754 | name = "zstd" 1755 | version = "0.13.0" 1756 | source = "registry+https://github.com/rust-lang/crates.io-index" 1757 | checksum = "bffb3309596d527cfcba7dfc6ed6052f1d39dfbd7c867aa2e865e4a449c10110" 1758 | dependencies = [ 1759 | "zstd-safe", 1760 | ] 1761 | 1762 | [[package]] 1763 | name = "zstd-safe" 1764 | version = "7.0.0" 1765 | source = "registry+https://github.com/rust-lang/crates.io-index" 1766 | checksum = "43747c7422e2924c11144d5229878b98180ef8b06cca4ab5af37afc8a8d8ea3e" 1767 | dependencies = [ 1768 | "zstd-sys", 1769 | ] 1770 | 1771 | [[package]] 1772 | name = "zstd-sys" 1773 | version = "2.0.9+zstd.1.5.5" 1774 | source = "registry+https://github.com/rust-lang/crates.io-index" 1775 | checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" 1776 | dependencies = [ 1777 | "cc", 1778 | "pkg-config", 1779 | ] 1780 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "polars_fuzzy_match" 3 | version = "0.1.3" 4 | edition = "2021" 5 | 6 | [lib] 7 | name = "polars_fuzzy_match" 8 | crate-type = ["cdylib"] 9 | 10 | [dependencies] 11 | nucleo = "0.4.0" 12 | nucleo-matcher = "0.3.1" 13 | polars = { version = "*" } 14 | pyo3 = { version = "*", features = ["extension-module", "abi3-py38"] } 15 | pyo3-polars = { version = "*", features = ["derive"] } 16 | serde = { version = "*", features = ["derive"] } 17 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 bnm3k 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .SILENT: 2 | .DEFAULT_GOAL:=dev 3 | 4 | .PHONY: run build-dev clean format lint 5 | dev: build-dev 6 | python examples/usage.py 7 | 8 | build-dev: .build-dev 9 | 10 | .build-dev: $(wildcard src/*.rs) 11 | maturin develop 12 | touch .build-dev 13 | 14 | format: 15 | ruff format polars_fuzzy_match/ 16 | cargo fmt --all 17 | 18 | lint: 19 | cargo clippy --all-features 20 | 21 | clean: 22 | rm .build-dev 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Polars Fuzzy Matching 2 | 3 | ## Installation 4 | 5 | ``` 6 | pip install polars 7 | pip install polars-fuzzy-match 8 | ``` 9 | 10 | ## Usage 11 | 12 | With both the plugin and polars installed, usage is as follows: 13 | 14 | ```python 15 | import polars as pl 16 | from polars_fuzzy_match import fuzzy_match_score 17 | 18 | 19 | df = pl.DataFrame( 20 | { 21 | 'strs': ['foo', 'foo quz BAR', 'baaarfoo', 'quz'], 22 | } 23 | ) 24 | pattern = 'bar' 25 | out = df.with_columns( 26 | score=fuzzy_match_score( 27 | pl.col('strs'), 28 | pattern, 29 | ) 30 | ) 31 | print(out) 32 | ``` 33 | 34 | This outputs: 35 | 36 | ``` 37 | shape: (4, 2) 38 | ┌─────────────┬───────┐ 39 | │ strs ┆ score │ 40 | │ --- ┆ --- │ 41 | │ str ┆ u32 │ 42 | ╞═════════════╪═══════╡ 43 | │ foo ┆ null │ 44 | │ foo quz BAR ┆ 88 │ 45 | │ baaarfoo ┆ 74 │ 46 | │ quz ┆ null │ 47 | └─────────────┴───────┘ 48 | ``` 49 | 50 | When there is no match, score is `null`. When the pattern matches the value in 51 | the given column, score is non-null. The higher the score, the closer the value 52 | is to the pattern. Therefore, we can filter out values that do not match and 53 | order by score: 54 | 55 | ```python 56 | pattern = 'bar' 57 | out = ( 58 | df.with_columns( 59 | score=fuzzy_match_score( 60 | pl.col('strs'), 61 | pattern, 62 | ) 63 | ) 64 | .filter(pl.col('score').is_not_null()) 65 | .sort(by='score', descending=True) 66 | ) 67 | print(out) 68 | ``` 69 | 70 | This outputs: 71 | 72 | ``` 73 | shape: (2, 2) 74 | ┌─────────────┬───────┐ 75 | │ strs ┆ score │ 76 | │ --- ┆ --- │ 77 | │ str ┆ u32 │ 78 | ╞═════════════╪═══════╡ 79 | │ foo quz BAR ┆ 88 │ 80 | │ baaarfoo ┆ 74 │ 81 | └─────────────┴───────┘ 82 | ``` 83 | 84 | ### Fzf-style search syntax 85 | 86 | This plugin supports Fzf-style search syntax for the pattern. It's worth noting 87 | that this section is taken almost verbatim from the Fzf README: 88 | 89 | | Pattern | Match type | Description | 90 | | --------- | -------------------------- | ------------------------------------------- | 91 | | `bar` | fuzzy | items that fuzzy match `bar` e.g. 'bXXaXXr' | 92 | | `'foo` | substring exact match | items that include `foo` e.g. 'is foo ok' | 93 | | `^music` | prefix exact match | items that start with `music` | 94 | | `.mp3$` | suffix exact match | items that end with `.mp3` | 95 | | `!fire` | inverse exact match | items that do not include `fire` | 96 | | `!^music` | inverse prefix exact match | items that do not start with `music` | 97 | | `!.mp3$` | inverse suffix exact match | items that do not end with `.mp3` | 98 | 99 | ## Credits 100 | 101 | 1. Marco Gorelli's Tutorial on writing Polars Plugin. See 102 | [here](https://marcogorelli.github.io/polars-plugins-tutorial/). 103 | 2. The Helix Editor team for the 104 | [Nucleo fuzzy matching library](https://github.com/helix-editor/nucleo). 105 | -------------------------------------------------------------------------------- /examples/usage.py: -------------------------------------------------------------------------------- 1 | import polars as pl 2 | from polars_fuzzy_match import fuzzy_match_score 3 | 4 | 5 | df = pl.DataFrame( 6 | { 7 | 'strs': ['foo', 'foo quz BAR', 'baaarfoo', 'quz'], 8 | } 9 | ) 10 | pattern = 'bar' 11 | out = ( 12 | df.with_columns( 13 | score=fuzzy_match_score( 14 | pl.col('strs'), 15 | pattern, 16 | ) 17 | ) 18 | .filter(pl.col('score').is_not_null()) 19 | .sort(by='score', descending=True) 20 | ) 21 | print(out) 22 | -------------------------------------------------------------------------------- /polars_fuzzy_match/__init__.py: -------------------------------------------------------------------------------- 1 | from enum import Enum 2 | from pathlib import Path 3 | import polars as pl 4 | from polars.type_aliases import IntoExpr 5 | from polars.plugins import register_plugin_function 6 | 7 | from polars_fuzzy_match.util import parse_into_expr 8 | 9 | 10 | 11 | class Normalization(Enum): 12 | """ 13 | Enum representing different values for configuring handling of unicode 14 | normalization when matching against a pattern. 15 | 16 | Attributes: 17 | NEVER: 18 | Neither the pattern nor the string being search is normalized. 19 | Characters do not match against their normalized version (a != ä). 20 | 21 | SMART: 22 | The pattern is not normalized but the string being searched is 23 | normalized. If the pattern is 'äää' and the string being searched is 24 | 'aaa', both do not match. However if the pattern is 'aaa' and the string 25 | being search is 'äää', the string is normalized to 'aaa' and then 26 | matched 27 | """ 28 | 29 | NEVER = 'Never' 30 | SMART = 'Smart' 31 | 32 | def __str__(self) -> str: 33 | return self.value 34 | 35 | 36 | class CaseMatching(Enum): 37 | """ 38 | Enum representing different values for configuring case mismatch (how to 39 | treat uppercase and lowercase characters when searching) 40 | 41 | Attributes: 42 | RESPECT: 43 | the pattern matches case exactly 44 | 45 | IGNORE: 46 | both the pattern and the string being searched for the pattern 47 | are lowercased before carrying out the search. 48 | 49 | SMART: 50 | If the pattern contains only lowercase letters, then the string 51 | being search is lowercased before search. If the pattern contains 52 | one or more uppercase letters, the pattern matches case exactly 53 | """ 54 | 55 | RESPECT = 'Respect' 56 | IGNORE = 'Ignore' 57 | SMART = 'Smart' 58 | 59 | def __str__(self) -> str: 60 | return self.value 61 | 62 | 63 | def fuzzy_match_score( 64 | expr: IntoExpr, 65 | pattern: str, 66 | normalization: Normalization = Normalization.SMART, 67 | case_matching: CaseMatching = CaseMatching.SMART, 68 | ) -> pl.Expr: 69 | expr = parse_into_expr(expr) 70 | return register_plugin_function( 71 | plugin_path=Path(__file__).parent, 72 | function_name="fuzzy_match_score", 73 | is_elementwise=True, 74 | args=expr, 75 | kwargs={ 76 | "pattern": pattern, 77 | "normalization": str(normalization), 78 | "case_matching": str(case_matching), 79 | }, 80 | ) 81 | 82 | -------------------------------------------------------------------------------- /polars_fuzzy_match/util.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | from typing import TYPE_CHECKING 4 | 5 | import polars as pl 6 | 7 | if TYPE_CHECKING: 8 | from polars.type_aliases import ( 9 | IntoExpr, 10 | PolarsDataType, 11 | ) 12 | 13 | 14 | def parse_into_expr( 15 | expr: IntoExpr, 16 | *, 17 | str_as_lit: bool = False, 18 | list_as_lit: bool = True, 19 | dtype: PolarsDataType | None = None, 20 | ) -> pl.Expr: 21 | """ 22 | Parse a single input into an expression. 23 | 24 | Parameters 25 | ---------- 26 | expr 27 | The input to be parsed as an expression. 28 | str_as_lit 29 | Interpret string input as a string literal. If set to `False` (default), 30 | strings are parsed as column names. 31 | list_as_lit 32 | Interpret list input as a lit literal, If set to `False`, 33 | lists are parsed as `Series` literals. 34 | dtype 35 | If the input is expected to resolve to a literal with a known dtype, pass 36 | this to the `lit` constructor. 37 | 38 | Returns 39 | ------- 40 | polars.Expr 41 | """ 42 | if isinstance(expr, pl.Expr): 43 | pass 44 | elif isinstance(expr, str) and not str_as_lit: 45 | expr = pl.col(expr) 46 | elif isinstance(expr, list) and not list_as_lit: 47 | expr = pl.lit(pl.Series(expr), dtype=dtype) 48 | else: 49 | expr = pl.lit(expr, dtype=dtype) 50 | return expr 51 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "polars-fuzzy-match" 3 | description = "Polars extension for fzf-style fuzzy matching " 4 | readme = "README.md" 5 | license = { file = "LICENSE" } 6 | classifiers = [ 7 | "Programming Language :: Rust", 8 | "Programming Language :: Python :: Implementation :: CPython", 9 | "Programming Language :: Python :: Implementation :: PyPy", 10 | ] 11 | requires-python = ">=3.8" 12 | 13 | [project.urls] 14 | "Repository" = "https://github.com/bnm3k/polars-fuzzy-match" 15 | "Documentation" = "https://github.com/bnm3k/polars-fuzzy-match/blob/master/README.md" 16 | "Change Log" = "https://github.com/bnm3k/polars-fuzzy-match/releases" 17 | "Issue Tracker" = "https://github.com/bnm3k/polars-fuzzy-match/issues" 18 | 19 | [build-system] 20 | requires = ["maturin>=1.0,<2.0", "polars>=0.20.6"] 21 | build-backend = "maturin" 22 | 23 | [tool.ruff] 24 | line-length = 80 25 | indent-width = 4 26 | 27 | [tool.ruff.format] 28 | quote-style = "double" 29 | indent-style = "space" 30 | docstring-code-format = true 31 | line-ending = "lf" 32 | 33 | [tool.ruff.lint.pycodestyle] 34 | max-doc-length = 72 35 | -------------------------------------------------------------------------------- /requirements-dev.txt: -------------------------------------------------------------------------------- 1 | ruff==0.2.2 2 | -------------------------------------------------------------------------------- /src/fuzzy_match.rs: -------------------------------------------------------------------------------- 1 | #![allow(clippy::unused_unit)] 2 | use polars::prelude::*; 3 | use pyo3_polars::derive::polars_expr; 4 | use pyo3_polars::export::polars_core::utils::CustomIterTools; 5 | 6 | use nucleo::Utf32Str; 7 | use nucleo_matcher::pattern::{CaseMatching, Normalization}; 8 | use serde::Deserialize; 9 | 10 | #[derive(Deserialize, Debug)] 11 | struct FuzzyMatchKwargs { 12 | pattern: String, 13 | normalization: Option, 14 | case_matching: Option, 15 | } 16 | 17 | impl FuzzyMatchKwargs { 18 | fn to_pattern(&self) -> nucleo_matcher::pattern::Pattern { 19 | let n = { 20 | use PatternNormalization::*; 21 | match self.normalization.as_ref().unwrap_or(&Smart) { 22 | Smart => Normalization::Smart, 23 | Never => Normalization::Never, 24 | } 25 | }; 26 | let c = { 27 | use PatternCaseMatching::*; 28 | match self.case_matching.as_ref().unwrap_or(&Smart) { 29 | Respect => CaseMatching::Respect, 30 | Ignore => CaseMatching::Ignore, 31 | Smart => CaseMatching::Smart, 32 | } 33 | }; 34 | nucleo::pattern::Pattern::parse(&self.pattern, c, n) 35 | } 36 | } 37 | 38 | #[derive(Deserialize, Debug)] 39 | pub enum PatternNormalization { 40 | Never, 41 | Smart, 42 | } 43 | 44 | #[derive(Deserialize, Debug)] 45 | pub enum PatternCaseMatching { 46 | Respect, 47 | Ignore, 48 | Smart, 49 | } 50 | 51 | // exact match 52 | #[polars_expr(output_type=UInt32)] 53 | fn fuzzy_match_score(haystack: &[Series], kwargs: FuzzyMatchKwargs) -> PolarsResult { 54 | let ca = haystack[0].str()?; 55 | 56 | // config 57 | let config = nucleo::Config::DEFAULT; 58 | let mut matcher = nucleo::Matcher::new(config); 59 | let pattern = kwargs.to_pattern(); 60 | let mut buf = Vec::new(); 61 | let out: UInt32Chunked = ca 62 | .into_iter() 63 | .map(|v: Option<&str>| { 64 | if let Some(s) = v { 65 | let haystack = Utf32Str::new(s, &mut buf); 66 | pattern.score(haystack, &mut matcher) 67 | } else { 68 | None 69 | } 70 | }) 71 | .collect_trusted(); 72 | Ok(out.into_series()) 73 | } 74 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | mod fuzzy_match; 2 | --------------------------------------------------------------------------------