Skip to content

Commit dba8394

Browse files
Merge pull request #435 from apache/fix_theta_compressed_stream
fixed compressed theta stream serialization
2 parents c5283ad + 6be246d commit dba8394

3 files changed

Lines changed: 43 additions & 1 deletion

File tree

theta/include/theta_sketch_impl.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,7 @@ void compact_theta_sketch_alloc<A>::serialize_version_4(std::ostream& os) const
506506
previous = entries_[i];
507507
offset = pack_bits(delta, entry_bits, ptr, offset);
508508
}
509+
if (offset > 0) ++ptr;
509510
write(os, buffer.data(), ptr - buffer.data());
510511
}
511512
}

theta/test/theta_sketch_serialize_for_java.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ TEST_CASE("theta sketch generate compressed", "[serialize_for_java]") {
4343
REQUIRE_FALSE(sketch.is_empty());
4444
REQUIRE(sketch.get_estimate() == Approx(n).margin(n * 0.03));
4545
std::ofstream os("theta_compressed_n" + std::to_string(n) + "_cpp.sk", std::ios::binary);
46-
sketch.compact().serialize(os);
46+
sketch.compact().serialize_compressed(os);
4747
}
4848
}
4949

theta/test/theta_sketch_test.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,47 @@ TEST_CASE("theta sketch: wrap compact v2 estimation from java", "[theta_sketch]"
517517
}
518518
}
519519

520+
TEST_CASE("theta sketch: serialize deserialize small compressed", "[theta_sketch]") {
521+
auto update_sketch = update_theta_sketch::builder().build();
522+
for (int i = 0; i < 10; i++) update_sketch.update(i);
523+
auto compact_sketch = update_sketch.compact();
524+
525+
auto bytes = compact_sketch.serialize_compressed();
526+
REQUIRE(bytes.size() == compact_sketch.get_serialized_size_bytes(true));
527+
{ // deserialize bytes
528+
auto deserialized_sketch = compact_theta_sketch::deserialize(bytes.data(), bytes.size());
529+
REQUIRE(deserialized_sketch.get_num_retained() == compact_sketch.get_num_retained());
530+
REQUIRE(deserialized_sketch.get_theta() == compact_sketch.get_theta());
531+
auto iter = deserialized_sketch.begin();
532+
for (const auto key: compact_sketch) {
533+
REQUIRE(*iter == key);
534+
++iter;
535+
}
536+
}
537+
{ // wrap bytes
538+
auto wrapped_sketch = wrapped_compact_theta_sketch::wrap(bytes.data(), bytes.size());
539+
REQUIRE(wrapped_sketch.get_num_retained() == compact_sketch.get_num_retained());
540+
REQUIRE(wrapped_sketch.get_theta() == compact_sketch.get_theta());
541+
auto iter = wrapped_sketch.begin();
542+
for (const auto key: compact_sketch) {
543+
REQUIRE(*iter == key);
544+
++iter;
545+
}
546+
}
547+
548+
std::stringstream s(std::ios::in | std::ios::out | std::ios::binary);
549+
compact_sketch.serialize_compressed(s);
550+
REQUIRE(static_cast<size_t>(s.tellp()) == compact_sketch.get_serialized_size_bytes(true));
551+
auto deserialized_sketch = compact_theta_sketch::deserialize(s);
552+
REQUIRE(deserialized_sketch.get_num_retained() == compact_sketch.get_num_retained());
553+
REQUIRE(deserialized_sketch.get_theta() == compact_sketch.get_theta());
554+
auto iter = deserialized_sketch.begin();
555+
for (const auto key: compact_sketch) {
556+
REQUIRE(*iter == key);
557+
++iter;
558+
}
559+
}
560+
520561
TEST_CASE("theta sketch: serialize deserialize compressed", "[theta_sketch]") {
521562
auto update_sketch = update_theta_sketch::builder().build();
522563
for (int i = 0; i < 10000; i++) update_sketch.update(i);

0 commit comments

Comments
 (0)