This is an automated email from the ASF dual-hosted git repository.

morningman pushed a commit to branch orc-for-doris-21
in repository https://gitbox.apache.org/repos/asf/doris-thirdparty.git


The following commit(s) were added to refs/heads/orc-for-doris-21 by this push:
     new 6edc5432331 [opt] Decompress zlib by libdeflate. (#319) (#320)
6edc5432331 is described below

commit 6edc5432331dc10a2fc50d0c874df9a46bb909ee
Author: Qi Chen <che...@selectdb.com>
AuthorDate: Thu May 29 11:12:38 2025 +0800

    [opt] Decompress zlib by libdeflate. (#319) (#320)
---
 c++/src/Compression.cc | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)

diff --git a/c++/src/Compression.cc b/c++/src/Compression.cc
index 94be774ab48..5efb6c1d3ab 100644
--- a/c++/src/Compression.cc
+++ b/c++/src/Compression.cc
@@ -27,6 +27,13 @@
 #include <array>
 #include <iomanip>
 #include <iostream>
+
+// Only used on x86 or x86_64
+#if defined(__x86_64__) || defined(_M_X64) || defined(i386) || 
defined(__i386__) || \
+  defined(__i386) || defined(_M_IX86)
+#include <libdeflate.h>
+#endif
+
 #include <sstream>
 
 #include "zlib.h"
@@ -785,6 +792,43 @@ namespace orc {
     outputBufferLength = 0;
   }
 
+// Only used on x86 or x86_64
+#if defined(__x86_64__) || defined(_M_X64) || defined(i386) || 
defined(__i386__) || \
+  defined(__i386) || defined(_M_IX86)
+  class ZlibDecompressionStreamByLibDeflate : public BlockDecompressionStream {
+   public:
+    ZlibDecompressionStreamByLibDeflate(std::unique_ptr<SeekableInputStream> 
inStream, size_t blockSize, MemoryPool& _pool,
+                                  ReaderMetrics* _metrics)
+        : BlockDecompressionStream(std::move(inStream), blockSize, _pool, 
_metrics) {
+      decompressor = libdeflate_alloc_decompressor();
+      if (decompressor == nullptr) {
+        throw std::runtime_error("libdeflate allocate decompressor failed");
+      }
+    }
+
+    ~ZlibDecompressionStreamByLibDeflate() override { 
libdeflate_free_decompressor(decompressor); }
+
+    std::string getName() const override {
+      std::ostringstream result;
+      result << "ZlibDecompressionStreamByLibDeflate(" << getStreamName() << 
")";
+      return result.str();
+    }
+
+   protected:
+    uint64_t decompress(const char* inputPtr, uint64_t length, char* output, 
size_t maxOutputLength) override {
+      size_t actual = 0;
+      auto res = libdeflate_deflate_decompress(decompressor, inputPtr, length, 
output, maxOutputLength, &actual);
+      if (res != LIBDEFLATE_SUCCESS) {
+        throw ParseError("libdeflate deflate decompress failed");
+      }
+      return actual;
+    }
+
+   private:
+    libdeflate_decompressor* decompressor;
+  };
+#endif
+
   class SnappyDecompressionStream : public BlockDecompressionStream {
    public:
     SnappyDecompressionStream(std::unique_ptr<SeekableInputStream> inStream, 
size_t blockSize,
@@ -1186,8 +1230,15 @@ namespace orc {
       case CompressionKind_NONE:
         return input;
       case CompressionKind_ZLIB:
+// Only used on x86 or x86_64
+#if defined(__x86_64__) || defined(_M_X64) || defined(i386) || 
defined(__i386__) || \
+  defined(__i386) || defined(_M_IX86)
+        return 
std::make_unique<ZlibDecompressionStreamByLibDeflate>(std::move(input), 
blockSize, pool,
+                                                               metrics);
+#else
         return std::make_unique<ZlibDecompressionStream>(std::move(input), 
blockSize, pool,
                                                          metrics);
+#endif
       case CompressionKind_SNAPPY:
         return std::make_unique<SnappyDecompressionStream>(std::move(input), 
blockSize, pool,
                                                            metrics);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to