Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 12 additions & 3 deletions migrations/core/01-initial/up.sql
Original file line number Diff line number Diff line change
Expand Up @@ -99,18 +99,27 @@ CREATE TABLE path_edges (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
path_id INTEGER NOT NULL,
index_in_path INTEGER NOT NULL,
edge_id INTEGER NOT NULL,
FOREIGN KEY(edge_id) REFERENCES edges(id),
block_group_edge_id INTEGER NOT NULL,
FOREIGN KEY(block_group_edge_id) REFERENCES block_group_edges(id),
FOREIGN KEY(path_id) REFERENCES paths(id)
) STRICT;
CREATE UNIQUE INDEX path_edges_uidx ON path_edges(path_id, edge_id, index_in_path);
CREATE UNIQUE INDEX path_edges_uidx ON path_edges(path_id, block_group_edge_id, index_in_path);

CREATE TABLE phase_layers (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
chromosome_index INTEGER NOT NULL,
is_reference INTEGER NOT NULL DEFAULT 0
) STRICT;
CREATE UNIQUE INDEX phase_layer_uidx ON phase_layers(chromosome_index, is_reference) WHERE is_reference = 1;

CREATE TABLE block_group_edges (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
block_group_id INTEGER NOT NULL,
edge_id INTEGER NOT NULL,
chromosome_index INTEGER,
phased INTEGER NOT NULL,
source_phase_layer_id INTEGER DEFAULT 0,
target_phase_layer_id INTEGER DEFAULT 0,
FOREIGN KEY(block_group_id) REFERENCES block_groups(id),
FOREIGN KEY(edge_id) REFERENCES edges(id)
) STRICT;
Expand Down
115 changes: 90 additions & 25 deletions src/diffs/gfa.rs
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,11 @@ mod tests {
Strand::Forward,
);

println!("here1");
println!("block group id: {}", block_group.id);
println!("edge1 id: {}", edge1.id);
println!("edge2 id: {}", edge2.id);
println!("edge3 id: {}", edge3.id);
let edge_ids = [edge1.id, edge2.id, edge3.id];
let block_group_edges = edge_ids
.iter()
Expand All @@ -312,11 +317,18 @@ mod tests {
edge_id,
chromosome_index: 0,
phased: 0,
source_phase_layer_id: 0,
target_phase_layer_id: 0,
})
.collect::<Vec<BlockGroupEdgeData>>();
BlockGroupEdge::bulk_create(&conn, &block_group_edges);
let block_group_edge_ids = BlockGroupEdge::bulk_create(&conn, &block_group_edges);

let _path1 = Path::create(&conn, "parent", block_group.id, &edge_ids);
println!("here2");
for bgei in block_group_edge_ids.iter() {
println!("block group edge id: {}", bgei);
}
println!("block group id: {}", block_group.id);
let _path1 = Path::create(&conn, "parent", block_group.id, &block_group_edge_ids);

// Set up child
let _child_sample = Sample::get_or_create_child(&conn, collection_name, "child", None);
Expand Down Expand Up @@ -354,11 +366,20 @@ mod tests {
edge_id,
chromosome_index: 0,
phased: 0,
source_phase_layer_id: 0,
target_phase_layer_id: 0,
})
.collect::<Vec<BlockGroupEdgeData>>();
BlockGroupEdge::bulk_create(&conn, &child_block_group_edges);
let block_group_edge_ids = BlockGroupEdge::bulk_create(&conn, &child_block_group_edges);
let original_child_path = BlockGroup::get_current_path(&conn, child_block_group.id);
let _child_path = original_child_path.new_path_with(&conn, 2, 6, &edge4, &edge5);
let _child_path = original_child_path.new_path_with(
&conn,
2,
6,
block_group_edge_ids[0],
block_group_edge_ids[1],
node3_id,
);

let temp_dir = tempdir().unwrap();
let gfa_path = temp_dir.path().join("parent-child-diff.gfa");
Expand Down Expand Up @@ -419,13 +440,22 @@ mod tests {
edge_id,
chromosome_index: 0,
phased: 0,
source_phase_layer_id: 0,
target_phase_layer_id: 0,
})
.collect::<Vec<BlockGroupEdgeData>>();
BlockGroupEdge::bulk_create(&conn, &grandchild_block_group_edges);
let block_group_edge_ids =
BlockGroupEdge::bulk_create(&conn, &grandchild_block_group_edges);
let original_grandchild_path =
BlockGroup::get_current_path(&conn, grandchild_block_group.id);
let _grandchild_path =
original_grandchild_path.new_path_with(&conn, 10, 14, &edge6, &edge7);
let _grandchild_path = original_grandchild_path.new_path_with(
&conn,
10,
14,
block_group_edge_ids[0],
block_group_edge_ids[1],
node4_id,
);

let gfa_path = temp_dir.path().join("parent-grandchild-diff.gfa");
gfa_sample_diff(&conn, collection_name, &gfa_path, None, Some("grandchild"));
Expand Down Expand Up @@ -539,11 +569,13 @@ mod tests {
edge_id,
chromosome_index: 0,
phased: 0,
source_phase_layer_id: 0,
target_phase_layer_id: 0,
})
.collect::<Vec<BlockGroupEdgeData>>();
BlockGroupEdge::bulk_create(&conn, &block_group_edges);
let block_group_edge_ids = BlockGroupEdge::bulk_create(&conn, &block_group_edges);

let _path1 = Path::create(&conn, "test path", block_group.id, &edge_ids);
let _path1 = Path::create(&conn, "test path", block_group.id, &block_group_edge_ids);

let temp_dir = tempdir().unwrap();
let gfa_path = temp_dir.path().join("diff-against-nothing.gfa");
Expand Down Expand Up @@ -626,11 +658,13 @@ mod tests {
edge_id,
chromosome_index: 0,
phased: 0,
source_phase_layer_id: 0,
target_phase_layer_id: 0,
})
.collect::<Vec<BlockGroupEdgeData>>();
BlockGroupEdge::bulk_create(&conn, &block_group_edges);
let block_group_edge_ids = BlockGroupEdge::bulk_create(&conn, &block_group_edges);

let _path1 = Path::create(&conn, "test path", block_group.id, &edge_ids);
let _path1 = Path::create(&conn, "test path", block_group.id, &block_group_edge_ids);

let temp_dir = tempdir().unwrap();
let gfa_path = temp_dir.path().join("self-diff.gfa");
Expand Down Expand Up @@ -715,11 +749,13 @@ mod tests {
edge_id,
chromosome_index: 0,
phased: 0,
source_phase_layer_id: 0,
target_phase_layer_id: 0,
})
.collect::<Vec<BlockGroupEdgeData>>();
BlockGroupEdge::bulk_create(&conn, &block_group_edges);
let block_group_edge_ids = BlockGroupEdge::bulk_create(&conn, &block_group_edges);

let _path1 = Path::create(&conn, "parent", block_group.id, &edge_ids);
let _path1 = Path::create(&conn, "parent", block_group.id, &block_group_edge_ids);

let _sample2 = Sample::get_or_create(&conn, "sample2");
let block_group2 = BlockGroup::create(
Expand Down Expand Up @@ -775,11 +811,13 @@ mod tests {
edge_id,
chromosome_index: 0,
phased: 0,
source_phase_layer_id: 0,
target_phase_layer_id: 0,
})
.collect::<Vec<BlockGroupEdgeData>>();
BlockGroupEdge::bulk_create(&conn, &block_group_edges);
let block_group_edge_ids = BlockGroupEdge::bulk_create(&conn, &block_group_edges);

let _path2 = Path::create(&conn, "parent", block_group2.id, &edge_ids);
let _path2 = Path::create(&conn, "parent", block_group2.id, &block_group_edge_ids);

let temp_dir = tempdir().unwrap();
let gfa_path = temp_dir.path().join("unrelated-diff.gfa");
Expand Down Expand Up @@ -865,11 +903,13 @@ mod tests {
edge_id,
chromosome_index: 0,
phased: 0,
source_phase_layer_id: 0,
target_phase_layer_id: 0,
})
.collect::<Vec<BlockGroupEdgeData>>();
BlockGroupEdge::bulk_create(&conn, &block_group_edges);
let block_group_edge_ids = BlockGroupEdge::bulk_create(&conn, &block_group_edges);

let _path1 = Path::create(&conn, "parent", block_group.id, &edge_ids);
let _path1 = Path::create(&conn, "parent", block_group.id, &block_group_edge_ids);

let _sample2 = Sample::get_or_create(&conn, "sample2");
let block_group2 =
Expand Down Expand Up @@ -921,11 +961,13 @@ mod tests {
edge_id,
chromosome_index: 0,
phased: 0,
source_phase_layer_id: 0,
target_phase_layer_id: 0,
})
.collect::<Vec<BlockGroupEdgeData>>();
BlockGroupEdge::bulk_create(&conn, &block_group_edges);
let block_group_edge_ids = BlockGroupEdge::bulk_create(&conn, &block_group_edges);

let _path2 = Path::create(&conn, "parent", block_group2.id, &edge_ids);
let _path2 = Path::create(&conn, "parent", block_group2.id, &block_group_edge_ids);

let temp_dir = tempdir().unwrap();
let gfa_path = temp_dir.path().join("unrelated-diff.gfa");
Expand Down Expand Up @@ -996,11 +1038,15 @@ mod tests {
edge_id,
chromosome_index: 0,
phased: 0,
source_phase_layer_id: 0,
target_phase_layer_id: 0,
})
.collect::<Vec<BlockGroupEdgeData>>();
BlockGroupEdge::bulk_create(&conn, &block_group_edges);
let block_group_edge_ids = BlockGroupEdge::bulk_create(&conn, &block_group_edges);
let bge1_id = block_group_edge_ids[0];
let bge2_id = block_group_edge_ids[1];

let _path1 = Path::create(&conn, "parent", block_group.id, &[edge1.id, edge2.id]);
let _path1 = Path::create(&conn, "parent", block_group.id, &[bge1_id, bge2_id]);

// Set up child
let _child_sample = Sample::get_or_create_child(&conn, collection_name, "child", None);
Expand Down Expand Up @@ -1038,11 +1084,20 @@ mod tests {
edge_id,
chromosome_index: 0,
phased: 0,
source_phase_layer_id: 0,
target_phase_layer_id: 0,
})
.collect::<Vec<BlockGroupEdgeData>>();
BlockGroupEdge::bulk_create(&conn, &child_block_group_edges);
let block_group_edge_ids = BlockGroupEdge::bulk_create(&conn, &child_block_group_edges);
let original_child_path = BlockGroup::get_current_path(&conn, child_block_group.id);
let _child_path = original_child_path.new_path_with(&conn, 2, 6, &edge3, &edge4);
let _child_path = original_child_path.new_path_with(
&conn,
2,
6,
block_group_edge_ids[0],
block_group_edge_ids[1],
node2_id,
);

let temp_dir = tempdir().unwrap();
let gfa_path = temp_dir.path().join("parent-child-diff.gfa");
Expand Down Expand Up @@ -1103,12 +1158,22 @@ mod tests {
edge_id,
chromosome_index: 0,
phased: 0,
source_phase_layer_id: 0,
target_phase_layer_id: 0,
})
.collect::<Vec<BlockGroupEdgeData>>();
BlockGroupEdge::bulk_create(&conn, &grandchild_block_group_edges);
let block_group_edge_ids =
BlockGroupEdge::bulk_create(&conn, &grandchild_block_group_edges);
let original_grandchild_path =
BlockGroup::get_current_path(&conn, grandchild_block_group.id);
let _grandchild_path = original_grandchild_path.new_path_with(&conn, 4, 10, &edge5, &edge6);
let _grandchild_path = original_grandchild_path.new_path_with(
&conn,
4,
10,
block_group_edge_ids[0],
block_group_edge_ids[1],
node3_id,
);

let gfa_path = temp_dir.path().join("parent-grandchild-diff.gfa");
gfa_sample_diff(&conn, collection_name, &gfa_path, None, Some("grandchild"));
Expand Down
3 changes: 3 additions & 0 deletions src/exports/genbank.rs
Original file line number Diff line number Diff line change
Expand Up @@ -678,6 +678,7 @@ mod tests {
path_start: 0,
path_end: 30,
strand: Forward,
phase_layer_id: 0,
},
PathBlock {
id: 0,
Expand All @@ -688,6 +689,7 @@ mod tests {
path_start: 30,
path_end: 60,
strand: Forward,
phase_layer_id: 0,
},
];
assert_eq!(
Expand Down Expand Up @@ -802,6 +804,7 @@ mod tests {
path_start: 0,
path_end: 8302,
strand: Forward,
phase_layer_id: 0,
}];
assert_eq!(
get_path_nodes(&graph, &path_blocks),
Expand Down
22 changes: 14 additions & 8 deletions src/exports/gfa.rs
Original file line number Diff line number Diff line change
Expand Up @@ -330,46 +330,51 @@ mod tests {
Strand::Forward,
);

let new_block_group_edges = vec![
let block_group_edges = vec![
BlockGroupEdgeData {
block_group_id: block_group.id,
edge_id: edge1.id,
chromosome_index: 0,
phased: 0,
source_phase_layer_id: 0,
target_phase_layer_id: 0,
},
BlockGroupEdgeData {
block_group_id: block_group.id,
edge_id: edge2.id,
chromosome_index: 0,
phased: 0,
source_phase_layer_id: 0,
target_phase_layer_id: 0,
},
BlockGroupEdgeData {
block_group_id: block_group.id,
edge_id: edge3.id,
chromosome_index: 0,
phased: 0,
source_phase_layer_id: 0,
target_phase_layer_id: 0,
},
BlockGroupEdgeData {
block_group_id: block_group.id,
edge_id: edge4.id,
chromosome_index: 0,
phased: 0,
source_phase_layer_id: 0,
target_phase_layer_id: 0,
},
BlockGroupEdgeData {
block_group_id: block_group.id,
edge_id: edge5.id,
chromosome_index: 0,
phased: 0,
source_phase_layer_id: 0,
target_phase_layer_id: 0,
},
];
BlockGroupEdge::bulk_create(&conn, &new_block_group_edges);
let block_group_edge_ids = BlockGroupEdge::bulk_create(&conn, &block_group_edges);

Path::create(
&conn,
"1234",
block_group.id,
&[edge1.id, edge2.id, edge3.id, edge4.id, edge5.id],
);
Path::create(&conn, "1234", block_group.id, &block_group_edge_ids);

let all_sequences = BlockGroup::get_all_sequences(&conn, block_group.id, false);

Expand Down Expand Up @@ -495,6 +500,7 @@ mod tests {
path_start: 7,
path_end: 15,
strand: Strand::Forward,
phase_layer_id: 0,
};
let change = PathChange {
block_group_id,
Expand Down
2 changes: 2 additions & 0 deletions src/graph.rs
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,7 @@ pub fn flatten_to_interval_tree(
sequence_start: source_node.sequence_start,
sequence_end: source_node.sequence_end,
strand: edge.source_strand,
phase_layer_id: 0,
});
spans.insert(NodeIntervalBlock {
block_id: target_node.block_id,
Expand All @@ -304,6 +305,7 @@ pub fn flatten_to_interval_tree(
sequence_start: target_node.sequence_start,
sequence_end: target_node.sequence_end,
strand: edge.target_strand,
phase_layer_id: 0,
});
if remove_ambiguous_positions {
for (node_id, node_range) in [
Expand Down
Loading