//Scans the full the Cog and returns iterator. iterator scan_full_array( struct cog *cog) { if( cog->type == COG_BTREE ) { struct cog *a = cog->data.btree.lhs; struct cog *b = cog->data.btree.rhs; return iter_concat( scan_full_array(a), scan_full_array(b) ); } if( cog->type == COG_CONCAT ) { struct cog *a = cog->data.concat.lhs; struct cog *b = cog->data.concat.rhs; return iter_concat( scan_full_array(a), scan_full_array(b) ); } if( cog->type == COG_SORTEDARRAY ) { int start = cog->data.array.start; int len = cog->data.array.len; struct record *in = buffer_start(cog->data.array.records, start); struct buffer *out = buffer_alloc(cog->data.sortedarray.len + 1); int i, tgt; iterator ret; for(i = 0, tgt = 0; i < len; i++){ record_copy(&(in[i]), &(out->data[tgt])); tgt++; } ret = array_iter_alloc(out, 0, tgt); return ret; } if( cog->type == COG_ARRAY ) { int start = cog->data.array.start; int len = cog->data.array.len; struct record *in = buffer_start(cog->data.array.records, start); struct buffer *out = buffer_alloc(cog->data.array.len ); int i, tgt; iterator ret; for(i = 0, tgt = 0; i < len; i++){ record_copy(&(in[i]), &(out->data[tgt])); tgt++; } ret = array_iter_alloc(out, 0, tgt); return ret; } fprintf(stderr, "Invalid Cog Type %d\n", cog->type); exit(-1); }
struct record *record_dup(const struct record *src) { struct record *dest = g_new(struct record, 1); record_copy(dest, src); return dest; }