relay-knowledge 1.1.14

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

use crate::{
    domain::{CodebaseViewDependency, CodebaseViewRequest, RepositoryCodeRange},
    storage::StorageError,
};

use super::{FilterColumns, collect_rows, filtered_sql};

pub(super) fn dependencies(
    connection: &Connection,
    source_scope: &str,
    request: &CodebaseViewRequest,
    limit: usize,
) -> Result<Vec<CodebaseViewDependency>, StorageError> {
    let (sql, values) = filtered_sql(
        "
        SELECT dependency_id, path, language_id, ecosystem, package_name, requirement,
               resolved_version, dependency_group, source_kind, line_start, line_end
        FROM code_repository_dependencies
        WHERE source_scope = ?1
        ",
        source_scope,
        request,
        FilterColumns::new("path", Some("language_id")),
        |_, _| {},
        "
        ORDER BY is_lockfile ASC, path ASC, package_name ASC, dependency_id ASC
        ",
        limit,
    );
    let mut statement = connection.prepare(&sql)?;
    let rows = statement.query_map(params_from_iter(values.iter()), |row| {
        Ok(CodebaseViewDependency {
            dependency_id: row.get(0)?,
            path: row.get(1)?,
            language_id: row.get(2)?,
            ecosystem: row.get(3)?,
            package_name: row.get(4)?,
            requirement: row.get(5)?,
            resolved_version: row.get(6)?,
            dependency_group: row.get(7)?,
            source_kind: row.get(8)?,
            line_range: RepositoryCodeRange {
                start: row.get(9)?,
                end: row.get(10)?,
            },
        })
    })?;

    collect_rows(rows)
}

#[cfg(test)]
#[path = "dependencies_tests.rs"]
mod tests;