import pytest
from helpers.cluster import ClickHouseCluster

cluster = ClickHouseCluster(__file__)

node1 = cluster.add_instance('node1', with_zookeeper=True)
node2 = cluster.add_instance('node2', with_zookeeper=True)

# no adaptive granularity by default
node3 = cluster.add_instance('node3', image='yandex/clickhouse-server:19.9.5.36', with_installed_binary=True, stay_alive=True)

@pytest.fixture(scope="module")
def start_cluster():
    try:
        cluster.start()

        yield cluster
    finally:
        cluster.shutdown()


def test_attach_detach(start_cluster):

    node1.query("""
        CREATE TABLE test (key UInt64)
        ENGINE = ReplicatedMergeTree('/clickhouse/test', '1')
        ORDER BY tuple()
        SETTINGS index_granularity_bytes = 0""")

    node1.query("INSERT INTO test VALUES (1), (2)")

    node2.query("""
        CREATE TABLE test (key UInt64)
        ENGINE = ReplicatedMergeTree('/clickhouse/test', '2')
        ORDER BY tuple()""")

    node2.query("INSERT INTO test VALUES (3), (4)")

    node1.query("SYSTEM SYNC REPLICA test")
    node2.query("SYSTEM SYNC REPLICA test")

    assert node1.query("SELECT COUNT() FROM  test") == "4\n"
    assert node2.query("SELECT COUNT() FROM  test") == "4\n"

    node1.query("DETACH TABLE test")
    node2.query("DETACH TABLE test")

    node1.query("ATTACH TABLE test")
    node2.query("ATTACH TABLE test")

    assert node1.query("SELECT COUNT() FROM  test") == "4\n"
    assert node2.query("SELECT COUNT() FROM  test") == "4\n"


def test_mutate_with_mixed_granularity(start_cluster):
    node3.query("""
        CREATE TABLE test (date Date, key UInt64, value1 String, value2 String)
        ENGINE = MergeTree
        ORDER BY key PARTITION BY date""")

    node3.query("INSERT INTO test SELECT toDate('2019-10-01') + number % 5, number, toString(number), toString(number * number) FROM numbers(500)")

    assert node3.query("SELECT COUNT() FROM test") == "500\n"

    node3.restart_with_latest_version()

    assert node3.query("SELECT COUNT() FROM test") == "500\n"

    node3.query("ALTER TABLE test MODIFY SETTING enable_mixed_granularity_parts = 1")

    node3.query("INSERT INTO test SELECT toDate('2019-10-01') + number % 5, number, toString(number), toString(number * number) FROM numbers(500, 500)")

    assert node3.query("SELECT COUNT() FROM test") == "1000\n"
    assert node3.query("SELECT COUNT() FROM test WHERE key % 100 == 0") == "10\n"

    node3.query("ALTER TABLE test DELETE WHERE key % 100 == 0", settings={"mutations_sync": "2"})

    assert node3.query("SELECT COUNT() FROM test WHERE key % 100 == 0") == "0\n"
