File size: 5,615 Bytes
d76e281
 
 
 
 
 
 
 
 
 
 
5c793cc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2100726
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
baaa888
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
from pathlib import Path


def test_hybrid_search_dynamic_sql_escapes_format_percent_signs() -> None:
    contract = Path("sql/aws_pgvector_contract.sql").read_text(encoding="utf-8")
    dynamic_sql = contract.split("RETURN QUERY EXECUTE format($query$", maxsplit=1)[1]
    dynamic_sql = dynamic_sql.split("$query$, target_table)", maxsplit=1)[0]

    remaining_percent_signs = dynamic_sql.replace("%%", "").replace("%I", "")

    assert "%" not in remaining_percent_signs


def test_post_feed_contract_is_synchronized() -> None:
    migration = Path("sql/migrate_post_feed_v1.sql").read_text(encoding="utf-8")
    base_contract = Path("sql/aws_pgvector_contract.sql").read_text(encoding="utf-8")
    full_setup = Path("sql/aws_pgvector_full_setup.psql.sql").read_text(encoding="utf-8")
    required = {
        "post_cluster_runs",
        "post_cluster_memberships",
        "post_embedding_tombstones",
        "user_interest_embeddings",
        "post_sync_checkpoints",
        "get_post_feed_features",
        "deactivate_post_embedding",
        "validate_post_cluster_run",
        "fail_post_cluster_run",
        "get_post_cluster_run",
        "reset_user_interest_profiles",
        "reset_post_sync_checkpoint",
        "activate_post_cluster_run",
    }
    assert all(name in migration for name in required)
    base_required = {
        "post_cluster_runs",
        "post_cluster_memberships",
        "post_embedding_tombstones",
        "user_interest_embeddings",
        "post_sync_checkpoints",
    }
    assert all(name in base_contract for name in base_required)
    assert "\\ir migrate_post_feed_v1.sql" in full_setup
    assert "\\ir migrate_post_feed_v2.sql" in full_setup
    assert Path("sql/verify_post_feed_v1.sql").exists()
    assert Path("sql/rollback_post_feed_v1.sql").exists()


def test_post_feed_v2_and_convergent_schema_are_present() -> None:
    migration = Path("sql/migrate_post_feed_v2.sql").read_text(encoding="utf-8")
    verifier = Path("sql/verify_post_feed_v2.sql").read_text(encoding="utf-8")
    convergent = Path("sql/new_pgvector_schema.sql").read_text(encoding="utf-8")

    assert "source_version es obligatorio" in migration
    assert "EXCLUDED.source_version > post_embeddings.source_version" in migration
    assert "cluster_count <> expected_k" in migration
    assert "post_embedding_dimension_ok" in verifier
    assert "aws_pgvector_contract" not in convergent  # contenido inline, sin includes
    assert "CREATE TABLE IF NOT EXISTS post_embeddings" in convergent
    assert "CREATE OR REPLACE FUNCTION public.get_post_feed_features" in convergent
    assert "migrate_post_feed_v2.sql" not in convergent  # contenido inline, sin includes


def test_global_search_candidate_filters_are_convergent_and_incremental() -> None:
    contract = Path("sql/aws_pgvector_contract.sql").read_text(encoding="utf-8")
    convergent = Path("sql/new_pgvector_schema.sql").read_text(encoding="utf-8")
    migration = Path(
        "sql/migrations/20260712_01_global_search_candidate_filters.sql"
    ).read_text(encoding="utf-8")
    verifier = Path("sql/verify_global_search_candidate_filters.sql")

    for token in (
        "event_active_at",
        "min_semantic_score",
        "min_lexical_score",
        "make_interval",
        "try_parse_timestamptz",
        "try_parse_positive_integer",
    ):
        assert token in contract
        assert token in convergent
        assert token in migration
    upper_migration = migration.upper()
    assert "BEGIN;" in upper_migration
    assert "COMMIT;" in upper_migration
    assert "CREATE OR REPLACE FUNCTION PUBLIC.SEARCH_RESOURCE_EMBEDDINGS" in upper_migration
    assert "CREATE TABLE" not in upper_migration
    assert "ALTER TABLE" not in upper_migration
    assert "CREATE INDEX" not in upper_migration
    assert "DROP FUNCTION" not in upper_migration
    assert "TO NLP_READER" in upper_migration
    assert verifier.exists()
    verifier_sql = verifier.read_text(encoding="utf-8")
    assert "RAISE EXCEPTION 'Verify search V2" in verifier_sql
    assert "SET TRANSACTION READ ONLY" in verifier_sql


def test_global_search_sql_does_not_directly_cast_untrusted_event_metadata() -> None:
    for path in (
        Path("sql/aws_pgvector_contract.sql"),
        Path("sql/new_pgvector_schema.sql"),
        Path("sql/migrations/20260712_01_global_search_candidate_filters.sql"),
    ):
        sql = path.read_text(encoding="utf-8")
        assert "NULLIF(e.metadata->>'start_time', '')::timestamptz" not in sql
        assert "(e.metadata->>'duration_minutes')::integer" not in sql


def test_places_semantic_index_is_additive_and_hybrid() -> None:
    migration = Path(
        "sql/migrations/20260716_02_places_semantic_v1.sql"
    ).read_text(encoding="utf-8")
    upper = migration.upper()

    assert "PLACE_EMBEDDINGS_SEMANTIC_V1" in upper
    assert "VECTOR(768)" in upper
    assert "SEARCH_PLACES_SEMANTIC_V1" in upper
    assert "FULL OUTER JOIN" in upper
    assert "WEBSEARCH_TO_TSQUERY" in upper
    assert "USING HNSW" in upper
    assert "AS MATERIALIZED" not in upper
    assert "FROM PUBLIC.PLACE_EMBEDDINGS_SEMANTIC_V1 AS PLACE" in upper
    assert "ALTER TABLE PUBLIC.PLACE_EMBEDDINGS" not in upper
    assert "DROP TABLE" not in upper

    verifier = Path("sql/verify_places_semantic_v1.sql")
    assert verifier.exists()
    verifier_sql = verifier.read_text(encoding="utf-8").upper()
    assert "SET TRANSACTION READ ONLY" in verifier_sql
    assert "VECTOR(768)" in verifier_sql
    assert "USING HNSW" in verifier_sql
    assert "EXPLAIN (ANALYZE, BUFFERS" in verifier_sql