join iterate

This commit is contained in:
John Kerl 2015-07-08 22:10:27 -04:00
parent 59958fb0f9
commit d230ed8fb3
4 changed files with 28 additions and 25 deletions

View file

@ -128,6 +128,9 @@ ap:
evl:
$(CCDEBUG) -D__LREC_EVALUATORS_MAIN__ mapping/lrec_evaluators.c mapping/mlr_val.c containers/mlr_dsl_ast.c containers/sllv.c containers/slls.c lib/mlrutil.c lib/mtrand.c containers/lrec.c -lm
lrim:
$(CCDEBUG) -DLREC_READER_IN_MEMORY_MAIN input/lrec_reader_in_memory.c containers/sllv.c containers/lrec.c containers/slls.c lib/mlrutil.c lib/mlr_globals.c input/lrec_reader_stdio_dkvp.c input/file_reader_stdio.c output/lrec_writer_dkvp.c -lm
# ----------------------------------------------------------------
clean:
@rm -vf mlr mlrd mlrg mlrp tester

View file

@ -25,7 +25,7 @@ static lrec_t* lrec_reader_stdio_dkvp_process(void* pvhandle, void* pvstate, con
}
// No-op for stateless readers such as this one.
static void lrec_reader_csv_sof(void* pvstate) {
static void lrec_reader_stdio_dkvp_sof(void* pvstate) {
}
// No-op for stateless readers such as this one.
@ -45,7 +45,7 @@ lrec_reader_t* lrec_reader_stdio_dkvp_alloc(char irs, char ifs, char ips, int al
plrec_reader->popen_func = &file_reader_stdio_vopen;
plrec_reader->pclose_func = &file_reader_stdio_vclose;
plrec_reader->pprocess_func = &lrec_reader_stdio_dkvp_process;
plrec_reader->psof_func = &lrec_reader_csv_sof;
plrec_reader->psof_func = &lrec_reader_stdio_dkvp_sof;
plrec_reader->pfree_func = &lrec_reader_stdio_dkvp_free;
return plrec_reader;

View file

@ -19,6 +19,8 @@ lrec_reader_t* lrec_reader_mmap_dkvp_alloc(char irs, char ifs, char ips, int all
lrec_reader_t* lrec_reader_mmap_nidx_alloc(char irs, char ifs, int allow_repeat_ifs);
lrec_reader_t* lrec_reader_mmap_xtab_alloc(char irs, char ips, int allow_repeat_ips);
lrec_reader_t* lrec_reader_in_memory_alloc(sllv_t* precords);
// ----------------------------------------------------------------
// These entry points are made public for unit test
lrec_t* lrec_parse_stdio_nidx(char* line, char ifs, int allow_repeat_ifs);

View file

@ -149,17 +149,6 @@ static int join_bucket_keeper_get_state(join_bucket_keeper_t* pkeeper) {
// xxx put bucket & bucket-keeper into separate files with separate UTs
static void join_bucket_keeper_initial_fill(join_bucket_keeper_t* pkeeper, slls_t* pleft_field_names) {
//pkeeper->pbucket;
//pkeeper->prec_peek;
//pkeeper->leof;
//pkeeper->plrec_reader;
//pkeeper->pvhandle;
//pkeeper->pctx;
//pbucket->pleft_field_values;
//pbucket->precords;
pkeeper->prec_peek = pkeeper->plrec_reader->pprocess_func(pkeeper->pvhandle,
pkeeper->plrec_reader->pvstate, pkeeper->pctx);
if (pkeeper->prec_peek == NULL) {
@ -188,6 +177,7 @@ static void join_bucket_keeper_initial_fill(join_bucket_keeper_t* pkeeper, slls_
sllv_add(pkeeper->pbucket->precords, pkeeper->prec_peek);
pkeeper->prec_peek = NULL;
}
}
// if (pkeeper->leof) {
// int cmp = slls_compare_lexically(pkeeper->pbucket->pjoin_values, pright_field_values);
@ -230,8 +220,6 @@ static void join_bucket_keeper_initial_fill(join_bucket_keeper_t* pkeeper, slls_
// sllv_add(pfoo, pleft_rec);
// *ppbucket_paired = pfoo;
}
// xxx cmt re who frees
static void join_bucket_keeper_emit(join_bucket_keeper_t* pkeeper,
slls_t* pleft_field_names, slls_t* pright_field_values,
@ -247,22 +235,32 @@ static void join_bucket_keeper_emit(join_bucket_keeper_t* pkeeper,
pkeeper->state = join_bucket_keeper_get_state(pkeeper);
}
//typedef struct _join_bucket_t {
// slls_t* pleft_field_values;
// sllv_t* precords;
// int was_paired;
//} join_bucket_t;
//
//typedef struct _join_bucket_keeper_t {
// lrec_reader_t* plrec_reader;
// void* pvhandle;
// context_t* pctx;
//
// int state;
// join_bucket_t* pbucket;
// lrec_t* prec_peek;
// int leof;
//} join_bucket_keeper_t;
switch (pkeeper->state) {
case LEFT_STATE_1_FULL:
case LEFT_STATE_2_LAST_BUCKET: // Intentional fall-through
cmp = slls_compare_lexically(pkeeper->pbucket->pleft_field_values, pright_field_values);
if (cmp < 0) {
// Lunp <- bucket
// paired = null
// next state is 2 / 3 respectively
*ppbucket_left_unpaired = pkeeper->pbucket->precords;
// xxx advance left ...
} else if (cmp == 0) {
// Lunp = null
// paired = bucket
// next state is 1 / 2 respectively
} else {
// Lunp = null
// paired = null
// next state is 1 / 2 respectively
*ppbucket_paired = pkeeper->pbucket->precords;
}
break;