relay-knowledge 1.1.9

Graph-database-based knowledge graph project.
Documentation
use rusqlite::{Transaction, params};

use crate::storage::StorageError;

use super::super::super::{SearchDocumentInserter, code_search::delete_search_documents_for_kind};

pub(super) fn rebuild_reference_search_documents(
    transaction: &Transaction<'_>,
    source_scope: &str,
) -> Result<(), StorageError> {
    delete_search_documents_for_kind(transaction, source_scope, "reference")?;
    let mut select = transaction.prepare(
        "
        SELECT reference.reference_id, reference.path, coalesce(file.language_id, ''),
               reference.name, reference.kind, coalesce(reference.target_hint, '')
        FROM code_repository_references reference
        LEFT JOIN code_repository_files file
          ON file.source_scope = reference.source_scope
         AND file.path = reference.path
        WHERE reference.source_scope = ?1
        ",
    )?;
    let mut rows = select.query(params![source_scope])?;
    let mut inserter = SearchDocumentInserter::new(transaction)?;
    while let Some(row) = rows.next()? {
        let record_id = row.get::<_, String>(0)?;
        let path = row.get::<_, String>(1)?;
        let language_id = row.get::<_, String>(2)?;
        let name = row.get::<_, String>(3)?;
        let kind = row.get::<_, String>(4)?;
        let target_hint = row.get::<_, String>(5)?;
        inserter.insert(
            source_scope,
            "reference",
            &record_id,
            &path,
            &language_id,
            [
                name.as_str(),
                kind.as_str(),
                target_hint.as_str(),
                path.as_str(),
            ],
        )?;
    }

    Ok(())
}

pub(super) fn rebuild_import_search_documents(
    transaction: &Transaction<'_>,
    source_scope: &str,
) -> Result<(), StorageError> {
    delete_search_documents_for_kind(transaction, source_scope, "import")?;
    let mut select = transaction.prepare(
        "
        SELECT import.import_id, import.path, coalesce(file.language_id, ''),
               import.module, coalesce(import.target_hint, '')
        FROM code_repository_imports import
        LEFT JOIN code_repository_files file
          ON file.source_scope = import.source_scope
         AND file.path = import.path
        WHERE import.source_scope = ?1
        ",
    )?;
    let mut rows = select.query(params![source_scope])?;
    let mut inserter = SearchDocumentInserter::new(transaction)?;
    while let Some(row) = rows.next()? {
        let record_id = row.get::<_, String>(0)?;
        let path = row.get::<_, String>(1)?;
        let language_id = row.get::<_, String>(2)?;
        let module = row.get::<_, String>(3)?;
        let target_hint = row.get::<_, String>(4)?;
        inserter.insert(
            source_scope,
            "import",
            &record_id,
            &path,
            &language_id,
            [module.as_str(), target_hint.as_str(), path.as_str()],
        )?;
    }

    Ok(())
}

pub(super) fn rebuild_call_search_documents(
    transaction: &Transaction<'_>,
    source_scope: &str,
) -> Result<(), StorageError> {
    delete_search_documents_for_kind(transaction, source_scope, "call")?;
    let mut select = transaction.prepare(
        "
        SELECT call.call_id, call.path, coalesce(file.language_id, ''),
               coalesce(call.caller_name, ''), call.callee_name,
               coalesce(call.target_hint, ''), coalesce(caller.signature, ''),
               coalesce(callee.signature, '')
        FROM code_repository_calls call
        LEFT JOIN code_repository_files file
          ON file.source_scope = call.source_scope
         AND file.path = call.path
        LEFT JOIN code_repository_symbols caller
          ON caller.source_scope = call.source_scope
         AND caller.symbol_snapshot_id = call.caller_symbol_snapshot_id
        LEFT JOIN code_repository_symbols callee
          ON callee.source_scope = call.source_scope
         AND callee.symbol_snapshot_id = call.callee_symbol_snapshot_id
        WHERE call.source_scope = ?1
        ",
    )?;
    let mut rows = select.query(params![source_scope])?;
    let mut inserter = SearchDocumentInserter::new(transaction)?;
    while let Some(row) = rows.next()? {
        let record_id = row.get::<_, String>(0)?;
        let path = row.get::<_, String>(1)?;
        let language_id = row.get::<_, String>(2)?;
        let caller_name = row.get::<_, String>(3)?;
        let callee_name = row.get::<_, String>(4)?;
        let target_hint = row.get::<_, String>(5)?;
        let caller_signature = row.get::<_, String>(6)?;
        let callee_signature = row.get::<_, String>(7)?;
        inserter.insert(
            source_scope,
            "call",
            &record_id,
            &path,
            &language_id,
            [
                caller_name.as_str(),
                callee_name.as_str(),
                target_hint.as_str(),
                caller_signature.as_str(),
                callee_signature.as_str(),
                path.as_str(),
            ],
        )?;
    }

    Ok(())
}