Skip to content

Commit 1c7a160

Browse files
committed
add rust bindings
1 parent 951251b commit 1c7a160

File tree

7 files changed

+64
-0
lines changed

7 files changed

+64
-0
lines changed

keyvi/bin/keyvi_c/c_api.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,29 @@ keyvi_bytes keyvi_match_get_msgpacked_value(const struct keyvi_match* match) {
182182
return keyvi_bytes{data_size, static_cast<const uint8_t*>(data_ptr)};
183183
}
184184

185+
keyvi_bytes keyvi_match_get_msgpacked_value_compressed(const struct keyvi_match* match,
186+
keyvi::compression::CompressionAlgorithm compression) {
187+
const keyvi_bytes empty_keyvi_bytes{0, nullptr};
188+
189+
if (!match->obj_) {
190+
return empty_keyvi_bytes;
191+
}
192+
193+
const std::string compressed_value = match->obj_->GetMsgPackedValueAsString(compression);
194+
195+
const size_t data_size = compressed_value.size();
196+
if (0 == data_size) {
197+
return empty_keyvi_bytes;
198+
}
199+
auto* data_ptr = malloc(data_size);
200+
if (nullptr == data_ptr) {
201+
return empty_keyvi_bytes;
202+
}
203+
memcpy(data_ptr, compressed_value.c_str(), data_size);
204+
205+
return keyvi_bytes{data_size, static_cast<const uint8_t*>(data_ptr)};
206+
}
207+
185208
char* keyvi_match_get_matched_string(const keyvi_match* match) {
186209
return std_2_c_string(match->obj_ ? match->obj_->GetMatchedString() : "");
187210
}

keyvi/include/keyvi/c_api/c_api.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ extern "C" {
3232
#include <stddef.h>
3333
#include <stdint.h>
3434

35+
#include "keyvi/compression/compression_algorithm.h"
36+
3537
struct keyvi_dictionary;
3638
struct keyvi_match;
3739
struct keyvi_match_iterator;
@@ -92,6 +94,9 @@ char* keyvi_match_get_value_as_string(const struct keyvi_match*);
9294

9395
keyvi_bytes keyvi_match_get_msgpacked_value(const struct keyvi_match*);
9496

97+
keyvi_bytes keyvi_match_get_msgpacked_value_compressed(const struct keyvi_match*,
98+
keyvi::compression::CompressionAlgorithm);
99+
95100
char* keyvi_match_get_matched_string(const struct keyvi_match*);
96101

97102
//////////////////////

rust/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@ serde_json = ">=1.0"
1919
[dev-dependencies]
2020
rayon = "0.9"
2121
rand = ">=0.4"
22+
snap = "1.1"

rust/build.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,10 @@ fn main() {
4949
.header("keyvi_core/keyvi/include/keyvi/c_api/c_api.h")
5050
.clang_arg("-x")
5151
.clang_arg("c++")
52+
.clang_arg("-Ikeyvi_core/keyvi/include")
5253
.enable_cxx_namespaces()
5354
.layout_tests(true)
55+
.rustified_enum("keyvi::compression::CompressionAlgorithm")
5456
.allowlist_function("keyvi_bytes_destroy")
5557
.allowlist_function("keyvi_string_destroy")
5658
.allowlist_function("keyvi_create_dictionary")
@@ -65,6 +67,7 @@ fn main() {
6567
.allowlist_function("keyvi_match_destroy")
6668
.allowlist_function("keyvi_match_get_matched_string")
6769
.allowlist_function("keyvi_match_get_msgpacked_value")
70+
.allowlist_function("keyvi_match_get_msgpacked_value_compressed")
6871
.allowlist_function("keyvi_match_get_score")
6972
.allowlist_function("keyvi_match_get_value_as_string")
7073
.allowlist_function("keyvi_match_is_empty")

rust/src/keyvi_match.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,20 @@ impl KeyviMatch {
7373
msgpacked_value
7474
}
7575

76+
pub fn get_msgpacked_value_compressed(&self, compression_algorithm: root::keyvi::compression::CompressionAlgorithm) -> Vec<u8> {
77+
let kv_bytes = unsafe { root::keyvi_match_get_msgpacked_value_compressed(self.match_ptr_, compression_algorithm) };
78+
let msgpacked_value = if kv_bytes.data_size == 0 {
79+
Vec::new()
80+
} else {
81+
unsafe {
82+
slice::from_raw_parts(kv_bytes.data_ptr, kv_bytes.data_size as usize).to_vec()
83+
}
84+
};
85+
unsafe { root::keyvi_bytes_destroy(kv_bytes) };
86+
87+
msgpacked_value
88+
}
89+
7690
pub fn is_empty(&self) -> bool {
7791
unsafe { root::keyvi_match_is_empty(self.match_ptr_) }
7892
}

rust/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,5 @@ pub mod dictionary;
3636
pub mod keyvi_match;
3737
pub mod keyvi_match_iterator;
3838
pub mod keyvi_string;
39+
40+
pub type Compression = bindings::root::keyvi::compression::CompressionAlgorithm;

rust/tests/tests.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
extern crate rand;
22
extern crate rayon;
33
extern crate serde_json;
4+
extern crate snap;
45

56
extern crate keyvi;
67

@@ -10,6 +11,7 @@ mod tests {
1011
use rand::Rng;
1112
use rayon::prelude::*;
1213
use serde_json::Value;
14+
use snap::raw::Decoder;
1315

1416
use keyvi::dictionary;
1517

@@ -85,6 +87,20 @@ mod tests {
8587
assert!(m.get_value_as_string().is_empty());
8688
}
8789

90+
#[test]
91+
fn match_msgpacked_value_compressed_array() {
92+
let m = dictionary::Dictionary::new("test_data/test.kv")
93+
.unwrap()
94+
.get("a");
95+
96+
assert_eq!(m.get_msgpacked_value_compressed(keyvi::Compression::NO_COMPRESSION), vec![146, 12, 13]);
97+
98+
let mut snap_decoder = Decoder::new();
99+
let value_compressed = m.get_msgpacked_value_compressed(keyvi::Compression::SNAPPY_COMPRESSION);
100+
let value_uncompressed = snap_decoder.decompress_vec(&value_compressed);
101+
assert_eq!(value_uncompressed.unwrap(), vec![146, 12, 13]);
102+
}
103+
88104
#[test]
89105
fn match_value() {
90106
let d = dictionary::Dictionary::new("test_data/test.kv").unwrap();

0 commit comments

Comments
 (0)