Changeset: 3df92304df1c for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3df92304df1c
Modified Files:
        monetdb5/extras/dvf/dvf.c
        monetdb5/extras/dvf/opt_dvf.c
        sql/backends/monet5/bam/Tests/benchmark1.sql
        sql/backends/monet5/bam/bam_loader.c
        sql/backends/monet5/bam/bam_schema_1.sql
Branch: DVframework_bam
Log Message:

Did some work on adapting dvf.c and opt_dvf.c for working with the BAM schema 
(these files will have to be made more generic later on).
Worked some on benchmark1.sql.
Did some bugfixing in bam_loader and made a minor change to the schema.


diffs (truncated from 527 to 300 lines):

diff --git a/monetdb5/extras/dvf/dvf.c b/monetdb5/extras/dvf/dvf.c
--- a/monetdb5/extras/dvf/dvf.c
+++ b/monetdb5/extras/dvf/dvf.c
@@ -10,7 +10,7 @@
 
 int get_column_type(str schema_name, str table_name, int column_num)
 {
-       if(strcmp(schema_name, "mseed") != 0 || strcmp(table_name, "data") != 0)
+       /*if(strcmp(schema_name, "mseed") != 0 || strcmp(table_name, "data") != 
0)
                return -1;
 
        switch(column_num)
@@ -25,12 +25,37 @@ int get_column_type(str schema_name, str
                        return TYPE_int;
                default:
                        return -1;
+       }*/
+       
+       if(strcmp(schema_name, "bam") != 0 || strcmp(table_name, "alignments") 
!= 0)
+               return -1;
+
+       switch(column_num)
+       {
+               case 0:
+                       return TYPE_lng;
+               case 1:
+               case 3:
+               case 6:
+                   return TYPE_sht;
+               case 2:
+               case 4:
+               case 7:
+               case 8:
+               case 11:
+               case 12:
+                   return TYPE_str;
+               case 5:
+               case 9:
+               case 10:
+                   return TYPE_int;
+           default: return -1;
        }
 }
 
 int get_column_num(str schema_name, str table_name, str column_name)
 {
-       if(strcmp(schema_name, "mseed") != 0 || strcmp(table_name, "data") != 0)
+       /*if(strcmp(schema_name, "mseed") != 0 || strcmp(table_name, "data") != 
0)
                return -1;
 
        if(strcmp(column_name, "file_location") == 0)
@@ -42,12 +67,44 @@ int get_column_num(str schema_name, str 
        else if(strcmp(column_name, "sample_value") == 0)
                return 3;
        else
+               return -1;*/
+               
+       if(strcmp(schema_name, "bam") != 0 || strcmp(table_name, "alignments") 
!= 0)
+               return -1;
+
+       if(strcmp(column_name, "virtual_offset") == 0)
+               return 0;
+       else if(strcmp(column_name, "file_id") == 0)
+               return 1;
+       else if(strcmp(column_name, "qname") == 0)
+               return 2;
+       else if(strcmp(column_name, "flag") == 0)
+               return 3;
+       else if(strcmp(column_name, "rname") == 0)
+               return 4;
+       else if(strcmp(column_name, "pos") == 0)
+               return 5;
+       else if(strcmp(column_name, "mapq") == 0)
+               return 6;
+       else if(strcmp(column_name, "cigar") == 0)
+               return 7;
+       else if(strcmp(column_name, "rnext") == 0)
+               return 8;
+       else if(strcmp(column_name, "pnext") == 0)
+               return 9;
+       else if(strcmp(column_name, "tlen") == 0)
+               return 10;
+       else if(strcmp(column_name, "seq") == 0)
+               return 11;
+       else if(strcmp(column_name, "qual") == 0)
+               return 12;
+       else
                return -1;
 }
 
 str plan_modifier(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
-       str data_table_identifier = "data";
+       str data_table_identifier = "alignments";
        str mountRef = putName("mount", 5);
        str miniseedRef = putName("miniseed", 8);
        str dvfRef = putName("dvf", 3);
diff --git a/monetdb5/extras/dvf/opt_dvf.c b/monetdb5/extras/dvf/opt_dvf.c
--- a/monetdb5/extras/dvf/opt_dvf.c
+++ b/monetdb5/extras/dvf/opt_dvf.c
@@ -101,9 +101,9 @@ OPTdvfImplementation(Client cntxt, MalBl
 {
        //TODO: Replace these with a proper (global) constants
        str sys_schema_name = "sys";
-       str schema_name = "mseed";
-       str data_table_identifier = "data";
-       str file_location_identifier = "file_location";
+       str schema_name = "bam";
+       str data_table_identifier = "alignments";
+       str file_location_identifier = "file_id";
        str mountRef = putName("mount", 5);
        str miniseedRef = putName("miniseed", 8);
        str dvfRef = putName("dvf", 3);
diff --git a/sql/backends/monet5/bam/Tests/benchmark1.sql 
b/sql/backends/monet5/bam/Tests/benchmark1.sql
--- a/sql/backends/monet5/bam/Tests/benchmark1.sql
+++ b/sql/backends/monet5/bam/Tests/benchmark1.sql
@@ -3,7 +3,7 @@
 
--------------------------------------------------------------------------------------------------------------------------------------
 
 SELECT * 
-FROM alignments 
+FROM bam.alignments 
 WHERE file_id = 1
 ORDER BY qname;
 
@@ -21,7 +21,7 @@ ORDER BY qname;
 
--------------------------------------------------------------------------------------------------------------------------------------
 
 SELECT * 
-FROM alignments 
+FROM bam.alignments 
 WHERE file_id = 1
 ORDER BY rname, pos;
 
@@ -39,7 +39,7 @@ ORDER BY rname, pos;
 
--------------------------------------------------------------------------------------------------------------------------------------
 
 SELECT *
-FROM alignments
+FROM bam.alignments
 WHERE file_id = 1
   AND (rname <= 'chr22' OR rname >= 'chr11')
   AND (pos <= 2000000 OR pos >= 1000000);
@@ -58,6 +58,6 @@ WHERE file_id = 1
 
--------------------------------------------------------------------------------------------------------------------------------------
 
 SELECT *
-FROM alignments
+FROM bam.alignments
 WHERE file_id = 1
 AND qname = 'sim_22_1_a'
diff --git a/sql/backends/monet5/bam/bam_loader.c 
b/sql/backends/monet5/bam/bam_loader.c
--- a/sql/backends/monet5/bam/bam_loader.c
+++ b/sql/backends/monet5/bam/bam_loader.c
@@ -24,15 +24,6 @@
         continue; \
     }
 
-
-#define _append_option_to_bat_cond_flt(ret_tc, opt, cmp, table, col, 
appendErr, flag, f) \
-    if(strcmp((opt)->tag, (cmp)) == 0) \
-    { \
-        (f) = strtof((opt)->value, NULL); \
-        _append_option_to_bat((ret_tc), (ptr)&f, (table), (col), (appendErr), 
(flag)); \
-        continue; \
-    } \
-
 #define _append_option_to_bat(ret_tc, value, table, col, appendErr, flag) \
     if(BUNappend((ret_tc)->tables_columns[(table)].column_bats[(col)], 
(value), TRUE) == NULL) \
         *appendErr = TRUE; \
@@ -93,13 +84,13 @@ sht _num_col_pg                  = 6;
 sht _num_col_alignments_extra    = 5;
 
 str _coln_files[]  = {"file_id", "file_location", "format_version", 
"sorting_order", "comments"};
-int _colt_files[]  = {TYPE_sht , TYPE_str       , TYPE_flt        , TYPE_str   
    , TYPE_str  };
+int _colt_files[]  = {TYPE_sht , TYPE_str       , TYPE_str        , TYPE_str   
    , TYPE_str  };
 
 str _coln_sq[]  = {"sn"    , "file_id", "ln"    , "as"    , "m5"    , "sp"    
, "ur"    };
 int _colt_sq[]  = {TYPE_str, TYPE_sht , TYPE_int, TYPE_int, TYPE_str, 
TYPE_str, TYPE_str};
 
 str _coln_rg[]  = {"id"    , "file_id", "cn"    , "ds"    , "dt"    , "fo"    
, "ks"    , "lb"    , "pg"    , "pi"    , "pl"    , "pu"    , "sm"    };
-int _colt_rg[]  = {TYPE_str, TYPE_sht , TYPE_str, TYPE_str, TYPE_int, 
TYPE_str, TYPE_str, TYPE_str, TYPE_str, TYPE_int, TYPE_str, TYPE_str, TYPE_str};
+int _colt_rg[]  = {TYPE_str, TYPE_sht , TYPE_str, TYPE_str, TYPE_lng, 
TYPE_str, TYPE_str, TYPE_str, TYPE_str, TYPE_int, TYPE_str, TYPE_str, TYPE_str};
 
 str _coln_pg[]  = {"id"    , "file_id", "pn"    , "cl"    , "pp"    , "vn"     
 };
 int _colt_pg[]  = {TYPE_str, TYPE_sht , TYPE_str, TYPE_str, TYPE_str, TYPE_str 
 };
@@ -111,6 +102,8 @@ int _colt_alignments_extra[]  = {TYPE_st
 
 
 /* File format specific functions */
+static lng _get_line_num(str filename);
+static lng _get_file_paths(str repo_path, str** ret_file_paths);
 static str _next_file_id(Client cntxt, MalBlkPtr mb, sht *next_file_id);
 static str _init_temp_container(_temp_container *ret_tc, sht dbschema);
 static str _init_temp_container_simple(_temp_container *ret_tc);
@@ -136,40 +129,167 @@ bam_loader(Client cntxt, MalBlkPtr mb, M
     /* TODO: This function is now called for BAM files, eventually there will 
have to be one generic */
     /* function that e.g. receives the file format for which a DV should be 
initialized as an argument */
     
-    str *repo_path = (str*) getArgReference(stk,pci,pci->retc); /* arg 1: 
repo_path, used as filepath right now */
+    str *repo_path = (str*) getArgReference(stk,pci,pci->retc); /* arg 1: 
repo_path */
        sht dbschema = *(sht*) getArgReference(stk,pci,pci->retc+1); /* arg 2: 
schema to use, see bam_loader.h for possible options */
-       sht num_threads = *(sht*) getArgReference(stk,pci,pci->retc+2); /* arg 
3: 1: no threads, >1: multi-threaded */
+       sht nr_threads = *(sht*) getArgReference(stk,pci,pci->retc+2); /* arg 
3: 1: no threads, >1: multi-threaded */
     
-    sht next_file_id = 0;
+    str *file_paths;
+    int nr_files, k;
     
-    str err1 = NULL, err2 = NULL;
-    _temp_container *tc = (_temp_container 
*)GDKmalloc(sizeof(_temp_container));
+    /* Get the file list */
+    if((nr_files = _get_file_paths(*repo_path, &file_paths)) < 0)
+        throw(MAL, "bam_loader", "Couldn't retrieve file list from file 
'%s'\n", *repo_path);
     
-    if(tc == NULL)
-        throw(MAL, "bamloader", MAL_MALLOC_FAIL);
-    else if((err1 = _next_file_id(cntxt, mb, &next_file_id)) != MAL_SUCCEED)
-        err2 = "Error while retrieving next file_id: %s\n";
-    else if((err1 = _init_temp_container(tc, dbschema)) != MAL_SUCCEED)
-        err2 = "Error while creating _temp_container: %s\n";
-    else if((err1 = _loadfile(*repo_path, tc, dbschema, next_file_id)) != 
MAL_SUCCEED)
+    for(k=0; k<nr_files; k++)
     {
+        str file_path = file_paths[k];
+        sht next_file_id = 0;
+        str err1 = NULL, err2 = NULL;
+        _temp_container *tc = (_temp_container 
*)GDKmalloc(sizeof(_temp_container));
+    
+        if(tc == NULL)
+            throw(MAL, "bam_loader", MAL_MALLOC_FAIL);
+        
+        if((err1 = _next_file_id(cntxt, mb, &next_file_id)) != MAL_SUCCEED)
+            err2 = "Error while retrieving next file_id: %s\n";
+        else if((err1 = _init_temp_container(tc, dbschema)) != MAL_SUCCEED)
+            err2 = "Error while creating _temp_container: %s\n";
+        else if((err1 = _loadfile(file_path, tc, dbschema, next_file_id)) != 
MAL_SUCCEED)
+        {
+            _free_temp_container(tc);
+            err2 = "Error while loading BAM file: %s\n";
+        }
+        else if((err1 = _insert_into_vault(cntxt, tc)) != MAL_SUCCEED)
+        {
+            _free_temp_container(tc);
+            err2 = "Error inserting data into database: %s\n";
+        }
+        
+        if(err2 != NULL)
+        {
+            GDKfree(file_paths);
+            throw(MAL, "bam_loader", err2, err1);
+        }
         _free_temp_container(tc);
-        err2 = "Error while loading BAM file: %s\n";
-    }
-    else if((err1 = _insert_into_vault(cntxt, tc)) != MAL_SUCCEED)
-    {
-        _free_temp_container(tc);
-        err2 = "Error inserting data into database: %s\n";
     }
 
-    if(err2 != NULL)
-        throw(MAL, "bamloader", err2, err1);
+    GDKfree(file_paths);
         
-    (void)num_threads;
+    (void)nr_threads;
     
     return MAL_SUCCEED;
 }
 
+
+/*
+ * Note: Copied directly from registrar.c
+ 
+ * returns number of lines in a file.
+ *
+ * WARNING: always counts EOF as a line. So proper return is taken if the file 
does
+ * not have a newline at the end.
+ */
+static lng 
+_get_line_num(str filename)
+{
+       FILE *f;
+       char c;
+       lng lines = 0;
+
+       f = fopen(filename, "r");
+
+       if(f == NULL)
+               return 0;
+
+       while((c = fgetc(f)) != EOF)
+               if(c == '\n')
+                       lines++;
+
+       fclose(f);
+
+/*     if(c != '\n') */
+/*             lines++; */
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to