REMOVE FUNCTION IF EXISTS fn::vector_search; DEFINE FUNCTION IF NOT EXISTS fn::vector_search($query: array, $match_count: int, $sources: bool, $show_notes: bool, $min_similarity: float) { let $source_embedding_search = IF $sources {( SELECT source.id as id, source.title as title, content, source.id as parent_id, vector::similarity::cosine(embedding, $query) as similarity FROM source_embedding WHERE vector::similarity::cosine(embedding, $query) >= $min_similarity ORDER BY similarity DESC LIMIT $match_count )} ELSE { [] }; let $source_insight_search = IF $sources {( SELECT id, insight_type + ' - ' + (source.title OR '') as title, content, source.id as parent_id, vector::similarity::cosine(embedding, $query) as similarity FROM source_insight WHERE vector::similarity::cosine(embedding, $query) >= $min_similarity ORDER BY similarity DESC LIMIT $match_count )} ELSE { [] }; let $note_content_search = IF $show_notes {( SELECT id, title, content, id as parent_id, vector::similarity::cosine(embedding, $query) as similarity FROM note WHERE vector::similarity::cosine(embedding, $query) >= $min_similarity ORDER BY similarity DESC LIMIT $match_count )} ELSE { [] }; let $all_results = array::union( array::union($source_embedding_search, $source_insight_search), $note_content_search ); RETURN (select id, parent_id, title, math::max(similarity) as similarity, array::flatten(content) as matches from $all_results where id is not None group by id, parent_id, title ORDER BY similarity DESC LIMIT $match_count); };