Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <getopt.h>
- #include "tpch_q6.h"
- int loadData_q6_rowwise(FILE *tbl, lineitem_t *table, size_t length) {
- int i;
- int ep1, ep2, d1, d2, t1, t2;
- int sd1, sd2, sd3, cd1, cd2, cd3, rd1, rd2, rd3;
- char misc[1000];
- for (i = 0; i < length; i++) {
- lineitem_t *l = table + i;
- int ret =
- fscanf(tbl,
- "%d|%d|%d|%d|%d|%d.%d|%d.%d|%d.%d|%c|%c|%d-%d-%d|%d-%d-%d|%d-%d-%d|%[^\n]",
- &l->l_orderkey, &l->l_partkey, &l->l_suppkey,
- &l->l_linenumber, &l->l_quantity, &ep1, &ep2, &d1, &d2,
- &t1, &t2, &l->l_returnflag, &l->l_linestatus, &sd1,
- &sd2, &sd3, &cd1, &cd2, &cd3, &rd1, &rd2, &rd3,
- &misc[0]);
- if (ret == EOF) {
- break;
- }
- l->l_extendedprice = ep1 * 100 + ep2;
- l->l_discount = d1 * 100 + d2;
- l->l_tax = t1 * 100 + t2;
- l->l_shipdate = sd1 * 10000 + sd2 * 100 + sd3;
- l->l_commitdate = cd1 * 10000 + cd2 * 100 + cd3;
- l->l_receiptdate = rd1 * 10000 + rd2 * 100 + rd3;
- }
- return i;
- }
- int parse_date(const char *date) {
- char *buf, *tofree;
- tofree = buf = strdup(date);
- char *c;
- char *token;
- long value;
- long result[3];
- int i = 0;
- while ((token = strsep((char **) (&buf), "-")) != NULL) {
- value = strtoul(token, &c, 10);
- if (token == c) {
- fprintf(stderr, "[parse_date]\t couldn't parse date %s\n", date);
- exit(1);
- }
- result[i] = value;
- i++;
- if (i > 3)
- break;
- }
- free(tofree);
- return result[2] + result[1] * 100 + result[0] * 10000;
- }
- double parse_double(const char *str) {
- char *c;
- double result = strtod(str, &c);
- if (c == str) {
- fprintf(stderr, "[parse_double]\t couldn't parse double %s\n", str);
- exit(1);
- }
- return result;
- }
- int loadData_q6_columnar(FILE *tbl, int *c_shipdate, int *c_discount,
- int *c_quantity, int *c_extendedprice, size_t length) {
- const int size = 4096;
- char *buf = (char *) malloc(size);
- int i = 0;
- if (!tbl) {
- perror("couldn't open data file");
- return -1;;
- }
- while (fgets(buf, size, tbl)) {
- char *line = buf;
- char *token;
- int column = 0;
- if (i >= length)
- break;
- while ((token = strsep(&line, "|")) != NULL) {
- double value;
- switch (column) {
- case L_SHIPDATE:
- c_shipdate[i] = parse_date(token);
- break;
- case L_QUANTITY:
- value = parse_double(token);
- c_quantity[i] = (int) value;
- break;
- case L_DISCOUNT:
- value = parse_double(token);
- value *= 100;
- c_discount[i] = (int) value;
- break;
- case L_EXTENDEDPRICE:
- value = parse_double(token);
- value *= 100;
- c_extendedprice[i] = (int) value;
- break;
- }
- column++;
- }
- i++;
- }
- return i;
- }
- void parse_args(int argc, char ** argv, cmd_param_t * cmd_params) {
- char c;
- while (1) {
- static struct option long_options[] = { { "relation-path",
- required_argument, 0, 'r' }, { "layout", required_argument, 0,
- 'l' }, { "help", no_argument, 0, 'h' }, { 0, 0, 0, 0 } };
- int option_index = 0;
- c = getopt_long(argc, argv, "r:l:hv", long_options,
- &option_index);
- if (c == -1)
- break;
- char *path;
- int val;
- switch (c) {
- case 0:
- /* If this option set a flag, do nothing else now. */
- if (long_options[option_index].flag != 0)
- break;
- printf("option %s", long_options[option_index].name);
- if (optarg)
- printf(" with arg %s", optarg);
- printf("\n");
- break;
- case 'r':
- path = realpath(optarg, NULL);
- if (path)
- cmd_params->relation_path = path;
- break;
- case 'l':
- val = atoi(optarg);
- if (val != 0 && val != 1) {
- printf(
- "Incorrect layout type - %d, must be 0(row-wise) or 1(columnar)",
- val);
- exit(EXIT_FAILURE);
- }
- cmd_params->layout = val;
- break;
- case 'h':
- case '?':
- /* getopt_long already printed an error message. */
- printf(
- "Usage: %s -r [path to lineitems table] -l [layout: 0 for columnar, 1 for row-wise]\n",
- argv[0]);
- exit(EXIT_SUCCESS);
- break;
- default:
- break;
- }
- }
- }
- lineitem_t table[N];
- int column_shipdate[N];
- int column_discount[N];
- int column_quantity[N];
- int column_extendedprice[N];
- int main(int argc, char **argv) {
- cmd_param_t params;
- parse_args(argc, argv, ¶ms);
- FILE *tbl;
- int count;
- printf("Loading data from %s...\n", params.relation_path);
- fflush(stdout);
- tbl = fopen(params.relation_path, "r");
- if (params.layout) {
- count = loadData_q6_rowwise(tbl, table, N);
- } else {
- count = loadData_q6_columnar(tbl, column_shipdate, column_discount,
- column_quantity, column_extendedprice, N);
- }
- fclose(tbl);
- fprintf(stderr, "loaded %d lines!\n", count);
- return EXIT_SUCCESS;
- }
Add Comment
Please, Sign In to add comment