aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/clickhouse/src/Storages/CompressionCodecSelector.h
diff options
context:
space:
mode:
authorvitalyisaev <vitalyisaev@ydb.tech>2023-11-14 09:58:56 +0300
committervitalyisaev <vitalyisaev@ydb.tech>2023-11-14 10:20:20 +0300
commitc2b2dfd9827a400a8495e172a56343462e3ceb82 (patch)
treecd4e4f597d01bede4c82dffeb2d780d0a9046bd0 /contrib/clickhouse/src/Storages/CompressionCodecSelector.h
parentd4ae8f119e67808cb0cf776ba6e0cf95296f2df7 (diff)
downloadydb-c2b2dfd9827a400a8495e172a56343462e3ceb82.tar.gz
YQ Connector: move tests from yql to ydb (OSS)
Перенос папки с тестами на Коннектор из папки yql в папку ydb (синхронизируется с github).
Diffstat (limited to 'contrib/clickhouse/src/Storages/CompressionCodecSelector.h')
-rw-r--r--contrib/clickhouse/src/Storages/CompressionCodecSelector.h101
1 files changed, 101 insertions, 0 deletions
diff --git a/contrib/clickhouse/src/Storages/CompressionCodecSelector.h b/contrib/clickhouse/src/Storages/CompressionCodecSelector.h
new file mode 100644
index 0000000000..ad6e943e82
--- /dev/null
+++ b/contrib/clickhouse/src/Storages/CompressionCodecSelector.h
@@ -0,0 +1,101 @@
+#pragma once
+#include <IO/ReadHelpers.h>
+#include <Common/Exception.h>
+#include <Common/StringUtils/StringUtils.h>
+#include <Poco/Util/AbstractConfiguration.h>
+#include <Compression/ICompressionCodec.h>
+#include <Compression/CompressionFactory.h>
+#include <Compression/CompressionInfo.h>
+
+namespace DB
+{
+
+namespace ErrorCodes
+{
+ extern const int UNKNOWN_ELEMENT_IN_CONFIG;
+}
+
+
+/** Allows you to select the compression settings for the conditions specified in the configuration file.
+ * The config looks like this
+
+ <compression>
+
+ <!-- Set of options. Options are checked in a row. The last worked option wins. If none has worked, then lz4 is used. -->
+ <case>
+
+ <!-- Conditions. All must be satisfied simultaneously. Some conditions may not be specified. -->
+ <min_part_size>10000000000</min_part_size> <!-- The minimum size of a part in bytes. -->
+ <min_part_size_ratio>0.01</min_part_size_ratio> <!-- The minimum size of the part relative to all the data in the table. -->
+
+ <!-- Which compression method to choose. -->
+ <method>zstd</method>
+ <level>2</level>
+ </case>
+
+ <case>
+ ...
+ </case>
+ </compression>
+ */
+class CompressionCodecSelector
+{
+private:
+ struct Element
+ {
+ size_t min_part_size = 0;
+ double min_part_size_ratio = 0;
+ std::string family_name;
+ std::optional<int> level;
+
+
+ Element(const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix)
+ {
+ min_part_size = config.getUInt64(config_prefix + ".min_part_size", 0);
+ min_part_size_ratio = config.getDouble(config_prefix + ".min_part_size_ratio", 0);
+
+ family_name = config.getString(config_prefix + ".method", "lz4");
+ if (config.has(config_prefix + ".level"))
+ level = config.getInt64(config_prefix + ".level");
+ }
+
+ bool check(size_t part_size, double part_size_ratio) const
+ {
+ return part_size >= min_part_size
+ && part_size_ratio >= min_part_size_ratio;
+ }
+ };
+
+ std::vector<Element> elements;
+
+public:
+ CompressionCodecSelector() = default; /// Always returns the default method.
+
+ CompressionCodecSelector(const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix)
+ {
+ Poco::Util::AbstractConfiguration::Keys keys;
+ config.keys(config_prefix, keys);
+
+ for (const auto & name : keys)
+ {
+ if (!startsWith(name, "case"))
+ throw Exception(ErrorCodes::UNKNOWN_ELEMENT_IN_CONFIG, "Unknown element in config: {}.{}, must be 'case'", config_prefix, name);
+
+ elements.emplace_back(config, config_prefix + "." + name);
+ }
+ }
+
+ CompressionCodecPtr choose(size_t part_size, double part_size_ratio) const
+ {
+ const auto & factory = CompressionCodecFactory::instance();
+ CompressionCodecPtr res = factory.getDefaultCodec();
+
+ for (const auto & element : elements)
+ if (element.check(part_size, part_size_ratio))
+ res = factory.get(element.family_name, element.level);
+
+ return res;
+ }
+};
+
+}