BEGIN; SET TRANSACTION READ ONLY; DO $$ DECLARE embedding_type TEXT; embedding_count BIGINT; active_count BIGINT; profile_count BIGINT; invalid_norm_count BIGINT; BEGIN SELECT format_type(attribute.atttypid, attribute.atttypmod) INTO embedding_type FROM pg_attribute AS attribute WHERE attribute.attrelid = 'public.place_embeddings_semantic_v1'::regclass AND attribute.attname = 'embedding' AND NOT attribute.attisdropped; IF embedding_type IS DISTINCT FROM 'vector(768)' THEN RAISE EXCEPTION 'Expected place_embeddings_semantic_v1.embedding vector(768), got %', embedding_type; END IF; IF to_regprocedure('public.match_places_semantic_v1(vector,integer,jsonb)') IS NULL THEN RAISE EXCEPTION 'match_places_semantic_v1 is missing'; END IF; IF to_regprocedure('public.search_places_semantic_v1(text,vector,integer,jsonb)') IS NULL THEN RAISE EXCEPTION 'search_places_semantic_v1 is missing'; END IF; IF NOT EXISTS ( SELECT 1 FROM pg_indexes WHERE schemaname = 'public' AND tablename = 'place_embeddings_semantic_v1' AND indexdef ILIKE '%USING hnsw%' ) THEN RAISE EXCEPTION 'Places semantic HNSW index is missing'; END IF; SELECT count(*) INTO embedding_count FROM public.place_embeddings_semantic_v1; IF embedding_count = 0 THEN RAISE EXCEPTION 'place_embeddings_semantic_v1 is empty; run the backfill first'; END IF; SELECT count(*) FILTER (WHERE place.is_active) INTO active_count FROM public.place_embeddings_semantic_v1 AS place; IF active_count = 0 THEN RAISE EXCEPTION 'place_embeddings_semantic_v1 has no active rows'; END IF; SELECT count(DISTINCT ( place.embedding_model, place.embedding_version, place.metadata->>'semantic_document_version' )) INTO profile_count FROM public.place_embeddings_semantic_v1 AS place; IF profile_count <> 1 OR EXISTS ( SELECT 1 FROM public.place_embeddings_semantic_v1 AS place WHERE place.metadata->>'semantic_document_version' IS NULL ) THEN RAISE EXCEPTION 'Expected exactly one model/version/document profile, got %', profile_count; END IF; SELECT count(*) INTO invalid_norm_count FROM public.place_embeddings_semantic_v1 AS place WHERE abs(1.0 + (place.embedding <#> place.embedding)) > 0.02; IF invalid_norm_count > 0 THEN RAISE EXCEPTION 'Found % embeddings outside the expected unit-norm tolerance', invalid_norm_count; END IF; END $$; -- Every provider vector is L2-normalized before it is written. The negative -- inner product of a vector with itself is its squared norm. SELECT count(*) AS rows, count(DISTINCT place.external_id) AS unique_ids, count(*) FILTER (WHERE place.is_active) AS active_rows, min(sqrt(GREATEST(0.0, -(place.embedding <#> place.embedding)))) AS min_norm, max(sqrt(GREATEST(0.0, -(place.embedding <#> place.embedding)))) AS max_norm FROM public.place_embeddings_semantic_v1 AS place; SELECT place.embedding_model, place.embedding_version, place.metadata->>'semantic_document_version' AS document_version, count(*) AS rows FROM public.place_embeddings_semantic_v1 AS place GROUP BY 1, 2, 3 ORDER BY 1, 2, 3; -- Inspect this plan after a representative backfill. With enough rows, the -- nearest-neighbor branch should use the HNSW index rather than materializing -- the entire eligible corpus before ordering. EXPLAIN (ANALYZE, BUFFERS, COSTS, VERBOSE) SELECT place.external_id FROM public.place_embeddings_semantic_v1 AS place WHERE place.is_active = true ORDER BY place.embedding <=> ( SELECT sample.embedding FROM public.place_embeddings_semantic_v1 AS sample LIMIT 1 ) LIMIT 20; ROLLBACK;