Changeset: 15361647fecc for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=15361647fecc Modified Files: sql/backends/monet5/bam/bam_lib.c Branch: bamloader Log Message:
Improve seq_length_bat by direct appending instead of usign BUNappend and make code of reverse_seq_bat and reverse_qual_bat more generic diffs (296 lines): diff --git a/sql/backends/monet5/bam/bam_lib.c b/sql/backends/monet5/bam/bam_lib.c --- a/sql/backends/monet5/bam/bam_lib.c +++ b/sql/backends/monet5/bam/bam_lib.c @@ -283,15 +283,6 @@ seq_char(str * ret, int * ref_pos, str * output->T->nonil = output->T->nonil && *cur_out != TPE##_nil; \ } -#define update_props_str() { \ - output->tsorted = output->tsorted && \ - (c == 0 || strcmp(*cur_out, prev_out) >= 0); \ - output->trevsorted = output->trevsorted && \ - (c == 0 || strcmp(*cur_out, prev_out) <= 0); \ - output->T->nil = output->T->nil || *cur_out == str_nil; \ - output->T->nonil = output->T->nonil && *cur_out != str_nil; \ -} - #define finish_props() { \ BATsetcount(output, BATcount(input)); \ BATseqbase(output, input->hseqbase); \ @@ -344,221 +335,102 @@ bam_flag_bat(bat * ret, bat * bid, str * return MAL_SUCCEED; } -/* Commented out, since string heap addition needs to be added -str -reverse_seq_bat(bat * ret, bat * bid) -{ - BAT *input, *output; - str prev_out = 0; - str *cur_in; - str *cur_out; - BUN c; - str msg; - - assert(ret != NULL && bid != NULL); - - if ((input = BATdescriptor(*bid)) == NULL) - throw(MAL, "reverse_seq_bat", RUNTIME_OBJECT_MISSING); -*/ - /* allocate result BAT */ -/* output = BATnew(TYPE_void, TYPE_str, BATcount(input), TRANSIENT); - if (output == NULL) { - throw(MAL, "reverse_seq_bat", MAL_MALLOC_FAIL); - } - - init_props(); - cur_in = (str *) Tloc(input, BUNfirst(input)); - cur_out = (str *) Tloc(output, BUNfirst(output)); - for(c = 0; c < BATcount(input); ++c) { - if ((msg = reverse_seq(cur_out, cur_in)) != MAL_SUCCEED) { - BBPreleaseref(output->batCacheid); - return msg; - } - update_props_str(); - cur_in++; - prev_out = *cur_out++; - } - finish_props(); -*/ - /* release input BAT-descriptor */ -/* BBPreleaseref(input->batCacheid); - - BBPkeepref((*ret = output->batCacheid)); - - return MAL_SUCCEED; -}*/ +#define transform_strbat(transform_fn) { \ + BAT *input, *output; \ + BATiter li; \ + BUN p = 0, q = 0; \ + \ + assert(ret != NULL && bid != NULL); \ + \ + if ((input = BATdescriptor(*bid)) == NULL) \ + throw(MAL, "reverse_seq_bat", RUNTIME_OBJECT_MISSING); \ + \ + /* allocate result BAT */ \ + output = BATnew(TYPE_void, TYPE_str, BATcount(input), TRANSIENT); \ + if (output == NULL) { \ + BBPreleaseref(input->batCacheid); \ + throw(MAL, "reverse_seq_bat", MAL_MALLOC_FAIL); \ + } \ + BATseqbase(output, input->hseqbase); \ + \ + li = bat_iterator(input); \ + \ + BATloop(input, p, q) { \ + str t = (str) BUNtail(li, p); \ + str r, msg; \ + \ + if ((msg = transform_fn(&r, &t)) != MAL_SUCCEED) { \ + BBPreleaseref(input->batCacheid); \ + BBPreleaseref(output->batCacheid); \ + return msg; \ + } \ + BUNappend(output, (ptr) r, FALSE); \ + GDKfree(r); \ + } \ + \ + /* release input BAT-descriptor */ \ + BBPreleaseref(input->batCacheid); \ + \ + BBPkeepref((*ret = output->batCacheid)); \ + \ + return MAL_SUCCEED; \ +} str reverse_seq_bat(bat * ret, bat * bid) { - BAT *seqs, *result; - BATiter li; - BUN p = 0, q = 0; - - assert(ret != NULL && bid != NULL); - - if ((seqs = BATdescriptor(*bid)) == NULL) - throw(MAL, "reverse_seq_bat", RUNTIME_OBJECT_MISSING); - - /* allocate result BAT */ - result = BATnew(TYPE_void, TYPE_str, BATcount(seqs), TRANSIENT); - if (result == NULL) { - BBPreleaseref(seqs->batCacheid); - throw(MAL, "reverse_seq_bat", MAL_MALLOC_FAIL); - } - BATseqbase(result, seqs->hseqbase); - - li = bat_iterator(seqs); - - BATloop(seqs, p, q) { - str t = (str) BUNtail(li, p); - str r, msg; - - if ((msg = reverse_seq(&r, &t)) != MAL_SUCCEED) { - BBPreleaseref(seqs->batCacheid); - BBPreleaseref(result->batCacheid); - return msg; - } - BUNappend(result, (ptr) r, FALSE); - GDKfree(r); - } - - /* release input BAT-descriptor */ - BBPreleaseref(seqs->batCacheid); - - BBPkeepref((*ret = result->batCacheid)); - - return MAL_SUCCEED; + transform_strbat(reverse_seq); } str reverse_qual_bat(bat * ret, bat * bid) { - BAT *quals, *result; - BATiter li; - BUN p = 0, q = 0; - - assert(ret != NULL && bid != NULL); - - if ((quals = BATdescriptor(*bid)) == NULL) - throw(MAL, "reverse_qual_bat", RUNTIME_OBJECT_MISSING); - - /* allocate result BAT */ - result = BATnew(TYPE_void, TYPE_str, BATcount(quals), TRANSIENT); - if (result == NULL) { - BBPreleaseref(quals->batCacheid); - throw(MAL, "reverse_qual_bat", MAL_MALLOC_FAIL); - } - BATseqbase(result, quals->hseqbase); - - li = bat_iterator(quals); - - BATloop(quals, p, q) { - str t = (str) BUNtail(li, p); - str r, msg; - - if ((msg = reverse_qual(&r, &t)) != MAL_SUCCEED) { - BBPreleaseref(quals->batCacheid); - BBPreleaseref(result->batCacheid); - return msg; - } - BUNappend(result, (ptr) r, FALSE); - GDKfree(r); - } - - /* release input BAT-descriptor */ - BBPreleaseref(quals->batCacheid); - - BBPkeepref((*ret = result->batCacheid)); - - return MAL_SUCCEED; + transform_strbat(reverse_qual); } -/*str Does not work, probably has to do with we not being able to traverse the - CIGAR string input BAT like this +str seq_length_bat(bat * ret, bat * bid) { BAT *input, *output; sht prev_out = 0; - str *cur_in; + str cur_in; int *cur_out; - BUN c; + BATiter li; + BUN c = 0, p = 0, q = 0; str msg; assert(ret != NULL && bid != NULL); if ((input = BATdescriptor(*bid)) == NULL) throw(MAL, "seq_length_bat", RUNTIME_OBJECT_MISSING); -*/ + /* allocate result BAT */ -/* output = BATnew(TYPE_void, TYPE_int, BATcount(input), TRANSIENT); + output = BATnew(TYPE_void, TYPE_int, BATcount(input), TRANSIENT); if (output == NULL) { throw(MAL, "seq_length_bat", MAL_MALLOC_FAIL); } init_props(); - cur_in = (str *) Tloc(input, BUNfirst(input)); + li = bat_iterator(input); cur_out = (int *) Tloc(output, BUNfirst(output)); - for(c = 0; c < BATcount(input); ++c) { - if ((msg = seq_length(cur_out, cur_in)) != MAL_SUCCEED) { + BATloop(input, p, q) { + cur_in = (str) BUNtail(li, p); + if ((msg = seq_length(cur_out, &cur_in)) != MAL_SUCCEED) { BBPreleaseref(output->batCacheid); return msg; } update_props(int); - cur_in++; + ++c; prev_out = *cur_out++; } finish_props(); -*/ + /* release input BAT-descriptor */ -/* BBPreleaseref(input->batCacheid); + BBPreleaseref(input->batCacheid); BBPkeepref((*ret = output->batCacheid)); return MAL_SUCCEED; -}*/ - -str -seq_length_bat(bat * ret, bat * bid) -{ - BAT *cigars, *result; - BATiter li; - BUN p = 0, q = 0; - - assert(ret != NULL && bid != NULL); - - if ((cigars = BATdescriptor(*bid)) == NULL) - throw(MAL, "seq_length_bat", RUNTIME_OBJECT_MISSING); - - /* allocate result BAT */ - result = BATnew(TYPE_void, TYPE_int, BATcount(cigars), TRANSIENT); - if (result == NULL) { - BBPreleaseref(cigars->batCacheid); - throw(MAL, "seq_length_bat", MAL_MALLOC_FAIL); - } - BATseqbase(result, cigars->hseqbase); - - li = bat_iterator(cigars); - - BATloop(cigars, p, q) { - str t = (str) BUNtail(li, p); - str msg; - int r; - - if ((msg = seq_length(&r, &t)) != MAL_SUCCEED) { - BBPreleaseref(cigars->batCacheid); - BBPreleaseref(result->batCacheid); - return msg; - } - BUNappend(result, (ptr) &r, FALSE); - } - - /* release input BAT-descriptor */ - BBPreleaseref(cigars->batCacheid); - - BBPkeepref((*ret = result->batCacheid)); - - return MAL_SUCCEED; } str _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list