REMOVE TABLE IF EXISTS chat_session;

REMOVE TABLE IF EXISTS refers_to;


REMOVE FUNCTION fn::vector_search;


DEFINE FUNCTION IF NOT EXISTS fn::vector_search($query: array<float>, $match_count: int, $sources:bool, $show_notes:bool) {
   
    let $source_embedding_search = 
         IF $sources {(
            SELECT source as item_id, content, vector::similarity::cosine(embedding, $query) as similarity
            FROM source_embedding LIMIT $match_count)}
        ELSE { [] };

    
    let $source_insight_search = 
         IF $sources {(
             SELECT source as item_id, content, vector::similarity::cosine(embedding, $query) as similarity
                FROM source_insight LIMIT $match_count)}
        ELSE { [] };

    
     let $note_content_search = 
         IF $show_notes {(
                SELECT id as item_id, content, vector::similarity::cosine(embedding, $query) as similarity
                FROM note LIMIT $match_count)}

        ELSE { [] };

    let $source_chunk_results = array::union($source_embedding_search, $source_insight_search);
    
    let $source_results = array::union($source_chunk_results, $source_insight_search);

    let $note_results = $note_content_search;
    let $final_results = array::union($source_results, $note_results );

    RETURN (SELECT item_id, math::max(similarity) as similarity from $final_results
        group by item_id ORDER BY similarity DESC LIMIT $match_count);
    
    
};

REMOVE FUNCTION fn::text_search;


DEFINE FUNCTION IF NOT EXISTS fn::text_search($query_text: string, $match_count: int, $sources:bool, $show_notes:bool) {
  
    let $source_title_search = 
        IF $sources {(
            SELECT id as item_id, math::max(search::score(1)) AS relevance
            FROM source
            WHERE title @1@ $query_text
            GROUP BY item_id)}
        ELSE { [] };
    
    let $source_embedding_search = 
         IF $sources {(
             SELECT source as item_id, math::max(search::score(1)) AS relevance
            FROM source_embedding
            WHERE content @1@ $query_text
            GROUP BY item_id)}
        ELSE { [] };

    let $source_full_search = 
         IF $sources {(
            SELECT source as item_id, math::max(search::score(1)) AS relevance
            FROM source
            WHERE full_text @1@ $query_text
            GROUP BY item_id)}
        ELSE { [] };
    
    let $source_insight_search = 
         IF $sources {(
             SELECT source as item_id, math::max(search::score(1)) AS relevance
            FROM source_insight
            WHERE content @1@ $query_text
            GROUP BY item_id)}
        ELSE { [] };

    let $note_title_search = 
         IF $show_notes {(
             SELECT id as item_id, math::max(search::score(1)) AS relevance
            FROM note
            WHERE title @1@ $query_text
            GROUP BY item_id)}
        ELSE { [] };

     let $note_content_search = 
         IF $show_notes {(
             SELECT id as item_id, math::max(search::score(1)) AS relevance
            FROM note
            WHERE content @1@ $query_text
            GROUP BY item_id)}
        ELSE { [] };

    let $source_chunk_results = array::union($source_embedding_search, $source_full_search);
    
    let $source_asset_results = array::union($source_title_search, $source_insight_search);

    let $source_results = array::union($source_chunk_results, $source_asset_results );
    let $note_results = array::union($note_title_search, $note_content_search );
    let $final_results = array::union($source_results, $note_results );

    RETURN (SELECT item_id, math::max(relevance) as relevance from $final_results
        group by item_id ORDER BY relevance DESC LIMIT $match_count);
    
    
};
