From 5f2825b9f20d8612b22709db3dca52b60035250f Mon Sep 17 00:00:00 2001 From: solebox Date: Mon, 3 Jun 2024 15:17:47 +0300 Subject: [PATCH 1/2] added AggregatingMergeTree engine --- src/infi/clickhouse_orm/engines.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/infi/clickhouse_orm/engines.py b/src/infi/clickhouse_orm/engines.py index 7fb83be..294f384 100644 --- a/src/infi/clickhouse_orm/engines.py +++ b/src/infi/clickhouse_orm/engines.py @@ -135,6 +135,19 @@ class CollapsingMergeTree(MergeTree): return params +class AggregatingMergeTree(MergeTree): + + def __init__(self, date_col=None, order_by=(), sampling_expr=None, + index_granularity=8192, replica_table_path=None, replica_name=None, partition_key=None, + primary_key=None): + super(AggregatingMergeTree, self).__init__(date_col, order_by, sampling_expr, index_granularity, + replica_table_path, replica_name, partition_key, primary_key) + + def _build_sql_params(self, db): + params = super(AggregatingMergeTree, self)._build_sql_params(db) + return params + + class SummingMergeTree(MergeTree): def __init__(self, date_col=None, order_by=(), summing_cols=None, sampling_expr=None, From c1f14b4dad3c9457e121950a5604cb180ddd2f42 Mon Sep 17 00:00:00 2001 From: solebox Date: Mon, 3 Jun 2024 15:23:11 +0300 Subject: [PATCH 2/2] added validation for final and test --- src/infi/clickhouse_orm/query.py | 6 +++--- tests/test_engines.py | 5 +++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/infi/clickhouse_orm/query.py b/src/infi/clickhouse_orm/query.py index 1998e2d..004fe4a 100644 --- a/src/infi/clickhouse_orm/query.py +++ b/src/infi/clickhouse_orm/query.py @@ -538,10 +538,10 @@ class QuerySet(object): def final(self): """ Adds a FINAL modifier to table, meaning data will be collapsed to final version. - Can be used with the `CollapsingMergeTree` and `ReplacingMergeTree` engines only. + Can be used with the `CollapsingMergeTree`, `ReplacingMergeTree` and `AggregatingMergeTree` engines only. """ - from .engines import CollapsingMergeTree, ReplacingMergeTree - if not isinstance(self._model_cls.engine, (CollapsingMergeTree, ReplacingMergeTree)): + from .engines import CollapsingMergeTree, ReplacingMergeTree, AggregatingMergeTree + if not isinstance(self._model_cls.engine, (CollapsingMergeTree, ReplacingMergeTree, AggregatingMergeTree)): raise TypeError('final() method can be used only with the CollapsingMergeTree and ReplacingMergeTree engines') qs = copy(self) diff --git a/tests/test_engines.py b/tests/test_engines.py index b2e0e5d..40e1c95 100644 --- a/tests/test_engines.py +++ b/tests/test_engines.py @@ -73,6 +73,11 @@ class EnginesTestCase(_EnginesHelperTestCase): engine = ReplacingMergeTree('date', ('date', 'event_id', 'event_group'), 'event_uversion') self._create_and_insert(TestModel) + def test_aggregating_merge_tree(self): + class TestModel(SampleModel): + engine = AggregatingMergeTree('date', ('date', 'event_group')) + self._create_and_insert(TestModel) + def test_tiny_log(self): class TestModel(SampleModel): engine = TinyLog()