diff --git a/src/django_clickhouse/clickhouse_models.py b/src/django_clickhouse/clickhouse_models.py index af0bc3d..327cb7c 100644 --- a/src/django_clickhouse/clickhouse_models.py +++ b/src/django_clickhouse/clickhouse_models.py @@ -9,6 +9,7 @@ from typing import List, Tuple from django.db.models import Model as DjangoModel from django.utils.timezone import now from infi.clickhouse_orm.database import Database +from infi.clickhouse_orm.engines import CollapsingMergeTree from infi.clickhouse_orm.models import Model as InfiModel, ModelBase as InfiModelBase from six import with_metaclass from statsd.defaults.django import statsd @@ -91,8 +92,11 @@ class ClickHouseModel(with_metaclass(ClickHouseModelMeta, InfiModel)): def _prepare_val_for_eq(self, field_name, field, val): if isinstance(val, datetime.datetime): return val.replace(microsecond=0) - elif field_name == '_version': - return True # Независимо от версии должно сравнение быть истиной + + # Sign column for collapsing should be ignored + if isinstance(self.engine, CollapsingMergeTree) and field_name == self.engine.sign_col: + return True + return val def __eq__(self, other): @@ -184,4 +188,6 @@ class ClickHouseModel(with_metaclass(ClickHouseModelMeta, InfiModel)): if last_sync_time is None: return True + print(last_sync_time) + return (last_sync_time - datetime.datetime.now()).total_seconds() >= cls.get_sync_delay() diff --git a/src/django_clickhouse/compatibility.py b/src/django_clickhouse/compatibility.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/clickhouse_models.py b/tests/clickhouse_models.py index 3ee3b3f..362e648 100644 --- a/tests/clickhouse_models.py +++ b/tests/clickhouse_models.py @@ -1,3 +1,5 @@ +from enum import Enum + from django_clickhouse.clickhouse_models import ClickHouseModel from django_clickhouse.engines import MergeTree, CollapsingMergeTree from infi.clickhouse_orm import fields @@ -25,4 +27,4 @@ class ClickHouseCollapseTestModel(ClickHouseModel): value = fields.Int32Field() sign = fields.Int8Field() - engine = CollapsingMergeTree('created_date', ('id',), 'sign') \ No newline at end of file + engine = CollapsingMergeTree('created_date', ('id',), 'sign') diff --git a/tests/test_clickhouse_models.py b/tests/test_clickhouse_models.py new file mode 100644 index 0000000..a757f72 --- /dev/null +++ b/tests/test_clickhouse_models.py @@ -0,0 +1,29 @@ +import datetime + +from django.test import TestCase + +from tests.clickhouse_models import ClickHouseTestModel + + +class ClickHouseModelTest(TestCase): + def setUp(self): + self.storage = ClickHouseTestModel.get_storage() + self.storage.flush() + + def test_need_sync(self): + # sync is disabled by default + self.assertFalse(ClickHouseTestModel.need_sync()) + + # There were no syncs. So it should be done + ClickHouseTestModel.sync_enabled = True + self.assertTrue(ClickHouseTestModel.need_sync()) + + # Time hasn't passed - no sync + self.storage.set_last_sync_time(ClickHouseTestModel.get_import_key(), datetime.datetime.now()) + self.assertFalse(ClickHouseTestModel.need_sync()) + + # Time has passed + sync_delay = ClickHouseTestModel.get_sync_delay() + self.storage.set_last_sync_time(ClickHouseTestModel.get_import_key(), + datetime.datetime.now() - datetime.timedelta(seconds=sync_delay)) + self.assertFalse(ClickHouseTestModel.need_sync())