1#include "dsdgen.hpp"
2#include "duckdb/common/exception.hpp"
3#include "duckdb/common/types/data_chunk.hpp"
4#include "duckdb/storage/data_table.hpp"
5#include "tpcds_constants.hpp"
6#include "append_info.hpp"
7#include "dsdgen_helpers.hpp"
8
9using namespace duckdb;
10using namespace std;
11
12namespace tpcds {
13
14void dbgen(double flt_scale, DuckDB &db, string schema, string suffix) {
15 Connection con(db);
16
17 con.Query("BEGIN TRANSACTION");
18 // FIXME: No restart support yet, suspect only fix is init_rand
19 // FIXME: no schema/suffix support yet
20
21 for (int t = 0; t < TPCDS_TABLE_COUNT; t++) {
22 con.Query(TPCDS_TABLE_DDL_NOKEYS[t]);
23 }
24
25 con.Query("COMMIT");
26
27 if (flt_scale == 0) {
28 // schema only
29 return;
30 }
31
32 InitializeDSDgen();
33
34 // populate append info
35 vector<unique_ptr<tpcds_append_information>> append_info;
36 append_info.resize(DBGEN_VERSION);
37
38 int tmin = CALL_CENTER, tmax = DBGEN_VERSION;
39
40 for (int table_id = tmin; table_id < tmax; table_id++) {
41 auto table_def = GetTDefByNumber(table_id);
42 assert(table_def.name);
43 auto append = make_unique<tpcds_append_information>(db, schema, table_def.name);
44 append->table_def = table_def;
45 append_info[table_id] = move(append);
46 }
47
48 // actually generate tables using modified data generator functions
49 for (int table_id = tmin; table_id < tmax; table_id++) {
50 // child tables are created in parent loaders
51 if (append_info[table_id]->table_def.fl_child) {
52 continue;
53 }
54
55 ds_key_t kRowCount = GetRowCount(table_id), kFirstRow = 1;
56
57 // TODO: verify this is correct and required here
58 /*
59 * small tables use a constrained set of geography information
60 */
61 if (append_info[table_id]->table_def.fl_small) {
62 ResetCountCount();
63 }
64
65 auto builder_func = GetTDefFunctionByNumber(table_id);
66 assert(builder_func);
67
68 for (ds_key_t i = kFirstRow; kRowCount; i++, kRowCount--) {
69 // append happens directly in builders since they dump child tables
70 // immediately
71 if (builder_func((void *)&append_info, i)) {
72 throw Exception("Table generation failed");
73 }
74 }
75 }
76
77 // flush any incomplete chunks
78 for (int table_id = tmin; table_id < tmax; table_id++) {
79 append_info[table_id]->appender.Close();
80 }
81}
82
83string get_query(int query) {
84 if (query <= 0 || query > TPCDS_QUERIES_COUNT) {
85 throw SyntaxException("Out of range TPC-DS query number %d", query);
86 }
87 return TPCDS_QUERIES[query - 1];
88}
89
90string get_answer(double sf, int query) {
91 if (query <= 0 || query > TPCDS_QUERIES_COUNT) {
92 throw SyntaxException("Out of range TPC-DS query number %d", query);
93 }
94 return "";
95}
96
97} // namespace tpcds
98