/* 
Query all columns in two models, reduce the table to a content hash and compare
the hashes across both.

You must pass a col name that exists in both models to sort them in order to 
make serialization stable. It is recommended to pass the PK.
*/
{% macro compare_table_hashes(model_1, model_2, order_by_col) %}

    {% set table_1 = ref(model_1) %}
    {% set table_2 = ref(model_2) %}

    {# Build query 1 #}
    {% set query_1 %}
    SELECT md5(array_agg(md5((t1.*)::varchar))::varchar) AS hash_val
    FROM (
      SELECT *
      FROM {{ table_1 }}
      ORDER BY {{ order_by_col }}
    ) AS t1
    {% endset %}

    {# Build query 2 #}
    {% set query_2 %}
    SELECT md5(array_agg(md5((t1.*)::varchar))::varchar) AS hash_val
    FROM (
      SELECT *
      FROM {{ table_2 }}
      ORDER BY {{ order_by_col }}
    ) AS t1
    {% endset %}

    {# Execute queries #}
    {% set result_1 = run_query(query_1) %}
    {% set result_2 = run_query(query_2) %}

    {% if result_1 and result_2 %}
        {% set hash_1 = result_1.columns[0].values()[0] %}
        {% set hash_2 = result_2.columns[0].values()[0] %}

        {{ log("Hash for " ~ model_1 ~ ": " ~ hash_1, info=True) }}
        {{ log("Hash for " ~ model_2 ~ ": " ~ hash_2, info=True) }}

        {% if hash_1 == hash_2 %} {{ log("✅ Table hashes match!", info=True) }}
        {% else %} {{ log("❌ Table hashes do NOT match!", info=True) }}
        {% endif %}
    {% else %}
        {{ log("❗ Could not retrieve hashes for one or both models.", info=True) }}
    {% endif %}
{% endmacro %}
