Guest User

Untitled

a guest
Nov 18th, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.53 KB | None | 0 0
  1. #include <getopt.h>
  2.  
  3. #include "tpch_q6.h"
  4.  
  5. int loadData_q6_rowwise(FILE *tbl, lineitem_t *table, size_t length) {
  6. int i;
  7. int ep1, ep2, d1, d2, t1, t2;
  8. int sd1, sd2, sd3, cd1, cd2, cd3, rd1, rd2, rd3;
  9. char misc[1000];
  10.  
  11. for (i = 0; i < length; i++) {
  12. lineitem_t *l = table + i;
  13. int ret =
  14. fscanf(tbl,
  15. "%d|%d|%d|%d|%d|%d.%d|%d.%d|%d.%d|%c|%c|%d-%d-%d|%d-%d-%d|%d-%d-%d|%[^\n]",
  16. &l->l_orderkey, &l->l_partkey, &l->l_suppkey,
  17. &l->l_linenumber, &l->l_quantity, &ep1, &ep2, &d1, &d2,
  18. &t1, &t2, &l->l_returnflag, &l->l_linestatus, &sd1,
  19. &sd2, &sd3, &cd1, &cd2, &cd3, &rd1, &rd2, &rd3,
  20. &misc[0]);
  21.  
  22. if (ret == EOF) {
  23. break;
  24. }
  25.  
  26. l->l_extendedprice = ep1 * 100 + ep2;
  27. l->l_discount = d1 * 100 + d2;
  28. l->l_tax = t1 * 100 + t2;
  29. l->l_shipdate = sd1 * 10000 + sd2 * 100 + sd3;
  30. l->l_commitdate = cd1 * 10000 + cd2 * 100 + cd3;
  31. l->l_receiptdate = rd1 * 10000 + rd2 * 100 + rd3;
  32. }
  33.  
  34. return i;
  35. }
  36.  
  37. int parse_date(const char *date) {
  38. char *buf, *tofree;
  39.  
  40. tofree = buf = strdup(date);
  41.  
  42. char *c;
  43. char *token;
  44. long value;
  45. long result[3];
  46.  
  47. int i = 0;
  48. while ((token = strsep((char **) (&buf), "-")) != NULL) {
  49.  
  50. value = strtoul(token, &c, 10);
  51. if (token == c) {
  52. fprintf(stderr, "[parse_date]\t couldn't parse date %s\n", date);
  53. exit(1);
  54. }
  55.  
  56. result[i] = value;
  57. i++;
  58.  
  59. if (i > 3)
  60. break;
  61. }
  62.  
  63. free(tofree);
  64. return result[2] + result[1] * 100 + result[0] * 10000;
  65. }
  66.  
  67. double parse_double(const char *str) {
  68. char *c;
  69. double result = strtod(str, &c);
  70. if (c == str) {
  71. fprintf(stderr, "[parse_double]\t couldn't parse double %s\n", str);
  72. exit(1);
  73. }
  74.  
  75. return result;
  76. }
  77.  
  78. int loadData_q6_columnar(FILE *tbl, int *c_shipdate, int *c_discount,
  79. int *c_quantity, int *c_extendedprice, size_t length) {
  80.  
  81. const int size = 4096;
  82.  
  83. char *buf = (char *) malloc(size);
  84.  
  85. int i = 0;
  86.  
  87. if (!tbl) {
  88. perror("couldn't open data file");
  89. return -1;;
  90. }
  91.  
  92. while (fgets(buf, size, tbl)) {
  93.  
  94. char *line = buf;
  95. char *token;
  96. int column = 0;
  97.  
  98. if (i >= length)
  99. break;
  100.  
  101. while ((token = strsep(&line, "|")) != NULL) {
  102. double value;
  103. switch (column) {
  104. case L_SHIPDATE:
  105. c_shipdate[i] = parse_date(token);
  106. break;
  107. case L_QUANTITY:
  108. value = parse_double(token);
  109. c_quantity[i] = (int) value;
  110. break;
  111. case L_DISCOUNT:
  112. value = parse_double(token);
  113. value *= 100;
  114. c_discount[i] = (int) value;
  115. break;
  116. case L_EXTENDEDPRICE:
  117. value = parse_double(token);
  118. value *= 100;
  119. c_extendedprice[i] = (int) value;
  120. break;
  121. }
  122. column++;
  123. }
  124. i++;
  125. }
  126. return i;
  127. }
  128.  
  129. void parse_args(int argc, char ** argv, cmd_param_t * cmd_params) {
  130. char c;
  131.  
  132. while (1) {
  133. static struct option long_options[] = { { "relation-path",
  134. required_argument, 0, 'r' }, { "layout", required_argument, 0,
  135. 'l' }, { "help", no_argument, 0, 'h' }, { 0, 0, 0, 0 } };
  136. int option_index = 0;
  137.  
  138. c = getopt_long(argc, argv, "r:l:hv", long_options,
  139. &option_index);
  140. if (c == -1)
  141. break;
  142. char *path;
  143. int val;
  144. switch (c) {
  145. case 0:
  146. /* If this option set a flag, do nothing else now. */
  147. if (long_options[option_index].flag != 0)
  148. break;
  149. printf("option %s", long_options[option_index].name);
  150. if (optarg)
  151. printf(" with arg %s", optarg);
  152. printf("\n");
  153. break;
  154. case 'r':
  155. path = realpath(optarg, NULL);
  156. if (path)
  157. cmd_params->relation_path = path;
  158. break;
  159. case 'l':
  160. val = atoi(optarg);
  161. if (val != 0 && val != 1) {
  162. printf(
  163. "Incorrect layout type - %d, must be 0(row-wise) or 1(columnar)",
  164. val);
  165. exit(EXIT_FAILURE);
  166. }
  167. cmd_params->layout = val;
  168. break;
  169. case 'h':
  170. case '?':
  171. /* getopt_long already printed an error message. */
  172. printf(
  173. "Usage: %s -r [path to lineitems table] -l [layout: 0 for columnar, 1 for row-wise]\n",
  174. argv[0]);
  175. exit(EXIT_SUCCESS);
  176. break;
  177. default:
  178. break;
  179. }
  180. }
  181. }
  182.  
  183. lineitem_t table[N];
  184. int column_shipdate[N];
  185. int column_discount[N];
  186. int column_quantity[N];
  187. int column_extendedprice[N];
  188.  
  189. int main(int argc, char **argv) {
  190. cmd_param_t params;
  191. parse_args(argc, argv, &params);
  192.  
  193. FILE *tbl;
  194. int count;
  195. printf("Loading data from %s...\n", params.relation_path);
  196. fflush(stdout);
  197.  
  198. tbl = fopen(params.relation_path, "r");
  199. if (params.layout) {
  200. count = loadData_q6_rowwise(tbl, table, N);
  201. } else {
  202. count = loadData_q6_columnar(tbl, column_shipdate, column_discount,
  203. column_quantity, column_extendedprice, N);
  204. }
  205. fclose(tbl);
  206.  
  207. fprintf(stderr, "loaded %d lines!\n", count);
  208. return EXIT_SUCCESS;
  209. }
Add Comment
Please, Sign In to add comment