CREATE EXTENSION IF NOT EXISTS pgcontext;

DROP TABLE IF EXISTS public.example_pgvector_docs;
CREATE TABLE public.example_pgvector_docs (
    id bigint PRIMARY KEY,
    embedding pgcontext.vector NOT NULL,
    body text NOT NULL
);

INSERT INTO public.example_pgvector_docs (id, embedding, body) VALUES
    (1, '[1,0,0]'::pgcontext.vector, 'postgres vector migration'),
    (2, '[0,1,0]'::pgcontext.vector, 'hybrid search with text'),
    (3, '[0,0,1]'::pgcontext.vector, 'recall validation example');

SELECT pgcontext.create_collection('example_pgvector_docs', 'public.example_pgvector_docs');
SELECT pgcontext.register_vector('example_pgvector_docs', 'embedding', 'embedding', 3, 'cosine');
SELECT pgcontext.upsert_points('example_pgvector_docs', ARRAY['1', '2', '3']);

SELECT source_key, score
FROM pgcontext.search('example_pgvector_docs', '[1,0,0]'::pgcontext.vector, 3);

SELECT id,
       pgcontext.cosine_distance(embedding, '[1,0,0]'::pgcontext.vector) AS score
FROM public.example_pgvector_docs
ORDER BY embedding OPERATOR(pgcontext.<=>) '[1,0,0]'::pgcontext.vector;

WITH exact AS (
    SELECT array_agg(point_id ORDER BY score, point_id) AS point_ids
    FROM pgcontext.search('example_pgvector_docs', '[1,0,0]'::pgcontext.vector, 3)
)
SELECT *
FROM pgcontext.recall_check(
    (SELECT point_ids FROM exact),
    (SELECT point_ids FROM exact),
    1.0
);
