Mesin JSONPath eksperimental untuk menanyakan kumpulan data yang dialirkan secara besar-besaran.
Peti rsonpath
menyediakan parser JSONPath dan mesin eksekusi kueri rq
, yang menggunakan instruksi SIMD untuk memberikan peningkatan throughput besar-besaran dibandingkan mesin konvensional.
Tolok ukur rsonpath
terhadap mesin referensi tanpa SIMD pada kumpulan data Pison. CATATAN: Skala adalah logaritmik!
Untuk menjalankan kueri JSONPath pada file, jalankan:
rq '$..a.b' ./file.json
Jika file dihilangkan, mesin membaca input standar. JSON juga dapat diteruskan secara inline:
$ rq ' $..a.b ' --json ' {"c":{"a":{"b":42}}} '
42
Untuk detailnya, lihat rq --help
atau rsonbook.
Hasil menjalankan kueri adalah rangkaian nilai yang cocok, dibatasi oleh baris baru. Alternatifnya, meneruskan --result count
hanya akan mengembalikan jumlah kecocokan, yang mungkin jauh lebih cepat. Untuk mode hasil lainnya, lihat halaman penggunaan --help
.
Lihat Rilis untuk biner yang telah dikompilasi untuk semua target dukungan kelas satu.
cargo
Cara termudah untuk menginstal adalah melalui cargo
.
$ cargo install rsonpath
...
Jika kecepatan maksimum adalah yang terpenting, Anda harus menginstal rsonpath
dengan dukungan instruksi CPU asli. Hal ini akan menghasilkan biner yang tidak portabel dan mungkin tidak berfungsi dengan benar pada mesin lain, namun akan memeras setiap bit throughput terakhir.
Untuk melakukannya, jalankan varian cargo install
berikut:
$ RUSTFLAGS= " -C target-cpu=native " cargo install rsonpath
...
Lihat bab yang relevan di rsonbook.
Proyek ini dikembangkan secara aktif dan saat ini hanya mendukung sebagian dari bahasa kueri JSONPath. Kueri adalah rangkaian segmen, masing-masing berisi satu atau lebih penyeleksi.
Segmen | Sintaksis | Didukung | Sejak | Masalah Pelacakan |
---|---|---|---|---|
Segmen turunan (tunggal) | [<selector>] | ✔️ | v0.1.0 | |
Segmen turunan (banyak) | [<selector1>,...,<selectorN>] | |||
Segmen keturunan (tunggal) | ..[<selector>] | ✔️ | v0.1.0 | |
Segmen keturunan (banyak) | ..[<selector1>,...,<selectorN>] |
Pemilih | Sintaksis | Didukung | Sejak | Masalah Pelacakan |
---|---|---|---|---|
Akar | $ | ✔️ | v0.1.0 | |
Nama | .<member> , [<member>] | ✔️ | v0.1.0 | |
karakter pengganti | .* , ..* , [*] | ✔️ | v0.4.0 | |
Indeks (indeks array) | [<index>] | ✔️ | v0.5.0 | |
Indeks (indeks array dari akhir) | [-<index>] | |||
Irisan array (maju, batas positif) | [<start>:<end>:<step>] | ✔️ | v0.9.0 | #152 |
Irisan array (maju, batas sembarang) | [<start>:<end>:<step>] | |||
Irisan array (mundur, batas sewenang-wenang) | [<start>:<end>:-<step>] | |||
Filter – tes eksistensial | [?<path>] | #154 | ||
Filter – perbandingan atom konstan | [?<path> <binop> <atom>] | #156 | ||
Filter – ekspresi logis | && , || , ! | |||
Filter – bersarang | [?<expr>[?<expr>]...] | |||
Filter – perbandingan sewenang-wenang | [?<path> <binop> <path>] | |||
Filter – ekstensi fungsi | [?func(<path>)] |
Peti ini terus dibuat untuk semua target Rust Tingkat 1, dan pengujian terus dijalankan untuk target yang dapat dijalankan dengan gambar tindakan GitHub. SIMD hanya didukung pada platform x86/x86_64.
Targetkan tiga kali lipat | build nosimd | dukungan SIMD | Pengujian berkelanjutan | Masalah pelacakan |
---|---|---|---|---|
aarch64-tidak diketahui-linux-gnu | ✔️ | ✔️ | #21, #115 | |
i686-tidak diketahui-linux-gnu | ✔️ | ✔️ | ✔️ | |
x86_64-tidak diketahui-linux-gnu | ✔️ | ✔️ | ✔️ | |
x86_64-apple-darwin | ✔️ | ✔️ | ✔️ | |
i686-pc-windows-gnu | ✔️ | ✔️ | ✔️ | |
i686-pc-windows-msvc | ✔️ | ✔️ | ✔️ | |
x86_64-pc-windows-gnu | ✔️ | ✔️ | ✔️ | |
x86_64-pc-windows-msvc | ✔️ | ✔️ | ✔️ |
Dukungan SIMD diaktifkan berdasarkan modul demi modul. Umumnya, setiap CPU yang dirilis dalam dekade terakhir mendukung AVX2, yang memungkinkan semua pengoptimalan yang tersedia.
CPU lama dengan SSE2 atau lebih tinggi mendapatkan dukungan parsial. Anda dapat memeriksa apa yang sebenarnya diaktifkan dengan rq --version
– periksa bidang SIMD support
:
$ rq --version
rq 0.9.1
Commit SHA: c024e1bab89610455537b77aed249d2a05a81ed6
Features: default,simd
Opt level: 3
Target triple: x86_64-unknown-linux-gnu
Codegen flags: link-arg=-fuse-ld=lld
SIMD support: avx2;fast_quotes;fast_popcnt
Kemampuan fast_quotes
bergantung pada instruksi pclmulqdq
, dan fast_popcnt
pada instruksi popcnt
.
Tidak semua penyeleksi didukung, lihat tabel dukungan di atas.
Mesin berasumsi bahwa setiap objek dalam input JSON tidak memiliki kunci duplikat. Perilaku pada kunci duplikat tidak dijamin stabil, namun saat ini mesin hanya akan mencocokkan kunci pertama tersebut.
$ rq ' $.key ' --json ' {"key":"value","key":"other value"} '
"value"
Mesin tidak mengurai urutan escape unicode dalam nama anggota. Artinya kunci "a"
berbeda dengan kunci "u0041"
, meskipun secara semantik keduanya mewakili string yang sama. Ini sebenarnya dirancang sesuai dengan spesifikasi JSONPath saat ini. Mengurai urutan unicode membutuhkan biaya yang besar, sehingga dukungan untuk ini ditunda demi kinerja tinggi. Ini dilacak sebagai #117.
Intinya: fork, implementasikan, buat PR kembali ke sini. Detail selengkapnya ada di dokumen KONTRIBUSI.
Alur kerja dev just
menggunakan . Gunakan Justfile
yang disertakan. Ini akan secara otomatis menginstal Rust untuk Anda menggunakan alat rustup
jika mendeteksi tidak ada Cargo di lingkungan Anda.
$ just build
...
$ just test
...
Tolok ukur untuk rsonpath
terletak di repositori terpisah, disertakan sebagai submodul git di repositori utama ini.
Cara termudah untuk menjalankan semua benchmark just bench
. Untuk detailnya, lihat README di submodul.
Kami memiliki makalah tentang rsonpath
yang akan diterbitkan di ASPLOS '24! Anda dapat membacanya di sini.
Proyek ini disusun sebagai tesis saya. Anda dapat membacanya untuk mengetahui detail latar belakang teori tentang mesin dan detail implementasinya.
Menampilkan ketergantungan langsung, untuk grafik lengkap lihat di bawah.
cargo tree --package rsonpath --edges normal --depth 1
rsonpath v0.9.1 (/home/mat/src/rsonpath/crates/rsonpath)
├── clap v4.5.4
├── color-eyre v0.6.3
├── eyre v0.6.12
├── log v0.4.21
├── rsonpath-lib v0.9.1 (/home/mat/src/rsonpath/crates/rsonpath-lib)
├── rsonpath-syntax v0.3.1 (/home/mat/src/rsonpath/crates/rsonpath-syntax)
└── simple_logger v4.3.3
[build-dependencies]
├── rustflags v0.1.5
└── vergen v8.3.1
[build-dependencies]
cargo tree --package rsonpath-lib --edges normal --depth 1
rsonpath-lib v0.9.1 (/home/mat/src/rsonpath/crates/rsonpath-lib)
├── arbitrary v1.3.2
├── cfg-if v1.0.0
├── log v0.4.21
├── memmap2 v0.9.4
├── nom v7.1.3
├── rsonpath-syntax v0.3.1 (/home/mat/src/rsonpath/crates/rsonpath-syntax)
├── smallvec v1.13.2
├── static_assertions v1.1.0
├── thiserror v1.0.58
└── vector-map v1.0.1
clap
– peti standar untuk menyediakan CLI.color-eyre
, eyre
– pesan kesalahan yang lebih mudah diakses untuk parser.log
, simple-logger
– log diagnostik selama kompilasi dan eksekusi.cfg-if
– digunakan untuk mendukung versi SIMD dan tanpa SIMD.memmap2
– untuk membaca cepat file sumber melalui peta memori, bukan salinan buffer.nom
– untuk implementasi parser.smallvec
– penting untuk kinerja tumpukan kecil.static_assertions
– keandalan tambahan dengan beberapa asumsi konstan yang divalidasi pada waktu kompilasi.thiserror
– Implementasi Error
idiomatis.vector_map
– digunakan dalam kompiler kueri untuk kinerja yang jauh lebih baik. cargo tree --package rsonpath --edges normal
rsonpath v0.9.1 (/home/mat/src/rsonpath/crates/rsonpath)
├── clap v4.5.4
│ ├── clap_builder v4.5.2
│ │ ├── anstream v0.6.13
│ │ │ ├── anstyle v1.0.6
│ │ │ ├── anstyle-parse v0.2.3
│ │ │ │ └── utf8parse v0.2.1
│ │ │ ├── anstyle-query v1.0.2
│ │ │ │ └── windows-sys v0.52.0
│ │ │ │ └── windows-targets v0.52.4
│ │ │ │ ├── windows_aarch64_gnullvm v0.52.4
│ │ │ │ ├── windows_aarch64_msvc v0.52.4
│ │ │ │ ├── windows_i686_gnu v0.52.4
│ │ │ │ ├── windows_i686_msvc v0.52.4
│ │ │ │ ├── windows_x86_64_gnu v0.52.4
│ │ │ │ ├── windows_x86_64_gnullvm v0.52.4
│ │ │ │ └── windows_x86_64_msvc v0.52.4
│ │ │ ├── anstyle-wincon v3.0.2
│ │ │ │ ├── anstyle v1.0.6
│ │ │ │ └── windows-sys v0.52.0 (*)
│ │ │ ├── colorchoice v1.0.0
│ │ │ └── utf8parse v0.2.1
│ │ ├── anstyle v1.0.6
│ │ ├── clap_lex v0.7.0
│ │ ├── strsim v0.11.1
│ │ └── terminal_size v0.3.0
│ │ ├── rustix v0.38.32
│ │ │ ├── bitflags v2.5.0
│ │ │ ├── errno v0.3.8
│ │ │ │ ├── libc v0.2.153
│ │ │ │ └── windows-sys v0.52.0 (*)
│ │ │ ├── libc v0.2.153
│ │ │ ├── linux-raw-sys v0.4.13
│ │ │ └── windows-sys v0.52.0 (*)
│ │ └── windows-sys v0.48.0
│ │ └── windows-targets v0.48.5
│ │ ├── windows_aarch64_gnullvm v0.48.5
│ │ ├── windows_aarch64_msvc v0.48.5
│ │ ├── windows_i686_gnu v0.48.5
│ │ ├── windows_i686_msvc v0.48.5
│ │ ├── windows_x86_64_gnu v0.48.5
│ │ ├── windows_x86_64_gnullvm v0.48.5
│ │ └── windows_x86_64_msvc v0.48.5
│ └── clap_derive v4.5.4 (proc-macro)
│ ├── heck v0.5.0
│ ├── proc-macro2 v1.0.79
│ │ └── unicode-ident v1.0.12
│ ├── quote v1.0.35
│ │ └── proc-macro2 v1.0.79 (*)
│ └── syn v2.0.58
│ ├── proc-macro2 v1.0.79 (*)
│ ├── quote v1.0.35 (*)
│ └── unicode-ident v1.0.12
├── color-eyre v0.6.3
│ ├── backtrace v0.3.71
│ │ ├── addr2line v0.21.0
│ │ │ └── gimli v0.28.1
│ │ ├── cfg-if v1.0.0
│ │ ├── libc v0.2.153
│ │ ├── miniz_oxide v0.7.2
│ │ │ └── adler v1.0.2
│ │ ├── object v0.32.2
│ │ │ └── memchr v2.7.2
│ │ └── rustc-demangle v0.1.23
│ │ [build-dependencies]
│ │ └── cc v1.0.90
│ ├── eyre v0.6.12
│ │ ├── indenter v0.3.3
│ │ └── once_cell v1.19.0
│ ├── indenter v0.3.3
│ ├── once_cell v1.19.0
│ └── owo-colors v3.5.0
├── eyre v0.6.12 (*)
├── log v0.4.21
├── rsonpath-lib v0.9.1 (/home/mat/src/rsonpath/crates/rsonpath-lib)
│ ├── cfg-if v1.0.0
│ ├── log v0.4.21
│ ├── memmap2 v0.9.4
│ │ └── libc v0.2.153
│ ├── nom v7.1.3
│ │ ├── memchr v2.7.2
│ │ └── minimal-lexical v0.2.1
│ ├── rsonpath-syntax v0.3.1 (/home/mat/src/rsonpath/crates/rsonpath-syntax)
│ │ ├── nom v7.1.3 (*)
│ │ ├── owo-colors v4.0.0
│ │ ├── thiserror v1.0.58
│ │ │ └── thiserror-impl v1.0.58 (proc-macro)
│ │ │ ├── proc-macro2 v1.0.79 (*)
│ │ │ ├── quote v1.0.35 (*)
│ │ │ └── syn v2.0.58 (*)
│ │ └── unicode-width v0.1.11
│ ├── smallvec v1.13.2
│ ├── static_assertions v1.1.0
│ ├── thiserror v1.0.58 (*)
│ └── vector-map v1.0.1
│ ├── contracts v0.4.0 (proc-macro)
│ │ ├── proc-macro2 v1.0.79 (*)
│ │ ├── quote v1.0.35 (*)
│ │ └── syn v1.0.109
│ │ ├── proc-macro2 v1.0.79 (*)
│ │ ├── quote v1.0.35 (*)
│ │ └── unicode-ident v1.0.12
│ └── rand v0.7.3
│ ├── getrandom v0.1.16
│ │ ├── cfg-if v1.0.0
│ │ ├── libc v0.2.153
│ │ └── wasi v0.9.0+wasi-snapshot-preview1
│ ├── libc v0.2.153
│ ├── rand_chacha v0.2.2
│ │ ├── ppv-lite86 v0.2.17
│ │ └── rand_core v0.5.1
│ │ └── getrandom v0.1.16 (*)
│ ├── rand_core v0.5.1 (*)
│ └── rand_hc v0.2.0
│ └── rand_core v0.5.1 (*)
├── rsonpath-syntax v0.3.1 (/home/mat/src/rsonpath/crates/rsonpath-syntax) (*)
└── simple_logger v4.3.3
├── colored v2.1.0
│ ├── lazy_static v1.4.0
│ └── windows-sys v0.48.0 (*)
├── log v0.4.21
├── time v0.3.34
│ ├── deranged v0.3.11
│ │ └── powerfmt v0.2.0
│ ├── itoa v1.0.11
│ ├── libc v0.2.153
│ ├── num-conv v0.1.0
│ ├── num_threads v0.1.7
│ │ └── libc v0.2.153
│ ├── powerfmt v0.2.0
│ ├── time-core v0.1.2
│ └── time-macros v0.2.17 (proc-macro)
│ ├── num-conv v0.1.0
│ └── time-core v0.1.2
└── windows-sys v0.48.0 (*)
[build-dependencies]
├── rustflags v0.1.5
└── vergen v8.3.1
├── anyhow v1.0.81
├── cargo_metadata v0.18.1
│ ├── camino v1.1.6
│ │ └── serde v1.0.197
│ │ └── serde_derive v1.0.197 (proc-macro)
│ │ ├── proc-macro2 v1.0.79 (*)
│ │ ├── quote v1.0.35 (*)
│ │ └── syn v2.0.58 (*)
│ ├── cargo-platform v0.1.8
│ │ └── serde v1.0.197 (*)
│ ├── semver v1.0.22
│ │ └── serde v1.0.197 (*)
│ ├── serde v1.0.197 (*)
│ ├── serde_json v1.0.115
│ │ ├── itoa v1.0.11
│ │ ├── ryu v1.0.17
│ │ └── serde v1.0.197 (*)
│ └── thiserror v1.0.58 (*)
├── cfg-if v1.0.0
├── regex v1.10.4
│ ├── aho-corasick v1.1.3
│ │ └── memchr v2.7.2
│ ├── memchr v2.7.2
│ ├── regex-automata v0.4.6
│ │ ├── aho-corasick v1.1.3 (*)
│ │ ├── memchr v2.7.2
│ │ └── regex-syntax v0.8.3
│ └── regex-syntax v0.8.3
├── rustc_version v0.4.0
│ └── semver v1.0.22 (*)
└── time v0.3.34
├── deranged v0.3.11 (*)
├── itoa v1.0.11
├── libc v0.2.153
├── num-conv v0.1.0
├── num_threads v0.1.7 (*)
├── powerfmt v0.2.0
└── time-core v0.1.2
[build-dependencies]
└── rustversion v1.0.14 (proc-macro)