1
1
//! The class to support .skm/.skd reading and writing, containing multiple [`Sketch`] objects
2
+ use anyhow:: anyhow;
2
3
use anyhow:: bail;
3
4
use anyhow:: Error ;
4
- use anyhow:: { Result , anyhow} ;
5
5
// use thiserror::Error;
6
6
use core:: panic;
7
7
use std:: fmt;
@@ -17,6 +17,9 @@ use crate::sketch::{Sketch, BBITS};
17
17
use crate :: sketch_datafile:: SketchArrayFile ;
18
18
19
19
use std:: collections:: HashSet ;
20
+
21
+ use rusqlite:: { params, Connection , Result } ;
22
+
20
23
#[ derive( Serialize , Deserialize ) ]
21
24
pub struct MultiSketch {
22
25
pub sketch_size : u64 ,
@@ -66,14 +69,35 @@ impl MultiSketch {
66
69
67
70
/// Saves the metadata
68
71
pub fn save_metadata ( & self , file_prefix : & str ) -> Result < ( ) , Error > {
69
- let filename = format ! ( "{}.skm " , file_prefix) ;
72
+ let filename = format ! ( "{}.db " , file_prefix) ;
70
73
log:: info!( "Saving sketch metadata to {filename}" ) ;
71
- let serial_file = BufWriter :: new ( File :: create ( filename) ?) ;
72
- let mut compress_writer = snap:: write:: FrameEncoder :: new ( serial_file) ;
73
- ciborium:: ser:: into_writer ( self , & mut compress_writer) ?;
74
+ // Creates database
75
+ let conn = Connection :: open ( filename) ?;
76
+ // Initialise table in database
77
+ conn. execute (
78
+ "CREATE TABLE sketch_metadata (
79
+ id INTEGER PRIMARY KEY,
80
+ name TEXT NOT NULL,
81
+ length INTEGER
82
+ )" ,
83
+ ( ) ,
84
+ ) ?;
85
+ // Iterate over metadata and add to database
86
+ for ( index, metadata) in self . sketch_metadata . iter ( ) . enumerate ( ) {
87
+ conn. execute (
88
+ "INSERT INTO sketch_metadata (id, name, length) VALUES (?1, ?2, ?3)" ,
89
+ ( index, metadata. name ( ) , metadata. seq_length ( ) ) ,
90
+ ) ?;
91
+ }
74
92
Ok ( ( ) )
75
93
}
76
94
95
+ pub fn query_metadata < T > ( path : String , args : T ) -> Result < Option < Vec < usize > > , Error > {
96
+ let conn = Connection :: open ( path) ?;
97
+ conn. execute ( "SELECT id FROM sketch_metadata WHERE" , ( ) ) ?;
98
+ todo ! ( )
99
+ }
100
+
77
101
pub fn load ( file_prefix : & str ) -> Result < Self , Error > {
78
102
let filename = format ! ( "{}.skm" , file_prefix) ;
79
103
log:: info!( "Loading sketch metadata from {filename}" ) ;
@@ -206,10 +230,8 @@ impl MultiSketch {
206
230
let mut removed_samples = Vec :: new ( ) ;
207
231
208
232
for sketch in & self . sketch_metadata {
209
-
210
233
if !genome_ids_to_remove. contains ( & ( * sketch. name ( ) ) . to_string ( ) ) {
211
234
new_sketch_metadata. push ( sketch. clone ( ) ) ;
212
-
213
235
} else {
214
236
removed_samples. push ( sketch. name ( ) ) ;
215
237
}
@@ -219,7 +241,10 @@ impl MultiSketch {
219
241
let set2: HashSet < & str > = genome_ids_to_remove. iter ( ) . map ( AsRef :: as_ref) . collect ( ) ;
220
242
let missing: Vec < & & str > = set2. difference ( & set1) . collect ( ) ;
221
243
if !missing. is_empty ( ) {
222
- bail ! ( "The following samples have not been found in the database: {:?}" , missing) ;
244
+ bail ! (
245
+ "The following samples have not been found in the database: {:?}" ,
246
+ missing
247
+ ) ;
223
248
}
224
249
225
250
self . sketch_metadata = new_sketch_metadata;
@@ -232,7 +257,7 @@ impl MultiSketch {
232
257
input_prefix : & str ,
233
258
output_file : & str ,
234
259
genome_ids_to_remove : & [ String ] ,
235
- ) -> anyhow:: Result < ( ) > {
260
+ ) -> anyhow:: Result < ( ) > {
236
261
let mut positions_to_remove = Vec :: new ( ) ;
237
262
let mut missing_ids = Vec :: new ( ) ;
238
263
0 commit comments