1 // ================================================================
2 // Data structures for mlr join, sorted case. Please see descriptive
3 // comments at the top of join_bucket_keeper.h.
4 // ================================================================
5 
6 #ifndef JOIN_BUCKET_KEEPER_H
7 #define JOIN_BUCKET_KEEPER_H
8 
9 #include "lib/context.h"
10 #include "cli/mlrcli.h"
11 #include "containers/lrec.h"
12 #include "containers/slls.h"
13 #include "containers/sllv.h"
14 #include "input/lrec_reader.h"
15 
16 // ----------------------------------------------------------------
17 typedef struct _join_bucket_t {
18 	slls_t* pleft_field_values;
19 	sllv_t* precords;
20 	int     was_paired;
21 } join_bucket_t;
22 
23 typedef struct _join_bucket_keeper_t {
24 	lrec_reader_t* plrec_reader;
25 	void*          pvhandle;
26 	context_t*     pctx;
27 
28 	slls_t*        pleft_field_names;
29 
30 	join_bucket_t* pbucket;
31 	lrec_t*        prec_peek;
32 
33 	int            leof;
34 	int            state;
35 } join_bucket_keeper_t;
36 
37 // ----------------------------------------------------------------
38 join_bucket_keeper_t* join_bucket_keeper_alloc(
39 	char* prepipe,
40 	char* left_file_name,
41 	cli_reader_opts_t* popts,
42 	slls_t* pleft_field_names);
43 
44 join_bucket_keeper_t* join_bucket_keeper_alloc_from_reader(
45 	lrec_reader_t* plrec_reader,
46 	char*          prepipe,
47 	char*          left_file_name,
48 	slls_t*        pleft_field_names);
49 
50 void join_bucket_keeper_free(join_bucket_keeper_t* pkeeper, char* prepipe);
51 
52 // *pprecords_paired should not be freed by the caller.
53 // *pprecords_left_unpaired should be freed by the caller.
54 void join_bucket_keeper_emit(
55 	join_bucket_keeper_t* pkeeper,
56 	slls_t*               pright_field_values,
57 	sllv_t**              pprecords_paired,
58 	sllv_t**              pprecords_left_unpaired);
59 
60 void join_bucket_print(join_bucket_t* pbucket, char* indent);
61 void join_bucket_keeper_print(join_bucket_keeper_t* pkeeper);
62 void join_bucket_keeper_print_aux(join_bucket_keeper_t* pkeeper, slls_t* pright_field_values,
63 	sllv_t** pprecords_paired, sllv_t** pprecords_left_unpaired);
64 
65 #endif // JOIN_BUCKET_KEEPER_H
66