|
| 1 | +/* eslint-disable no-unused-expressions */ |
1 | 2 | const mysql = require('mysql');
|
| 3 | +const _ = require('lodash'); |
2 | 4 | const config = require('./config.js');
|
3 | 5 | const transform = require('./transform.js');
|
4 |
| -const _ = require('lodash'); |
| 6 | +const util = require('./util.js'); |
5 | 7 |
|
6 | 8 | const DEBUG = 1;
|
7 | 9 |
|
8 | 10 | // Connect to the source database
|
9 |
| -const source = mysql .createConnection({ |
| 11 | +const source = mysql.createConnection({ |
10 | 12 | host: config.host,
|
11 | 13 | user: config.user,
|
12 | 14 | password: config.password,
|
13 |
| - database: config.db.source |
| 15 | + database: config.db.source, |
14 | 16 | });
|
15 |
| -source.connect(function(err) { |
| 17 | +source.connect((err) => { |
16 | 18 | if (err) { throw err; }
|
17 | 19 | console.log('Connected to source');
|
18 | 20 | });
|
19 | 21 |
|
20 | 22 | // Connect to the destination
|
21 |
| -const dest = mysql .createConnection({ |
| 23 | +const dest = mysql.createConnection({ |
22 | 24 | host: config.host,
|
23 | 25 | user: config.user,
|
24 | 26 | password: config.password,
|
25 |
| - database: config.db.destination |
26 |
| -}) |
27 |
| -dest.connect(function(err) { |
| 27 | + database: config.db.destination, |
| 28 | +}); |
| 29 | +dest.connect((err) => { |
28 | 30 | if (err) { throw err; }
|
29 | 31 | console.log('Connected to destination');
|
30 | 32 | });
|
31 | 33 |
|
32 | 34 |
|
| 35 | +// Start execution |
33 | 36 | _.forEach(transform, (rule) => {
|
34 |
| - let select_query = null; |
| 37 | + let selectQuery = null; |
35 | 38 | if (rule.table.old.union) {
|
36 | 39 | console.log('union');
|
37 |
| - select_query = 'SELECT * FROM ' + rule.table.old.union[0] + ' INNER JOIN ('; |
| 40 | + selectQuery = `SELECT * FROM ${rule.table.old.union[0]} INNER JOIN (`; |
38 | 41 |
|
39 | 42 | let count = 0;
|
40 | 43 | _.forEach(rule.table.old.union, (table) => {
|
41 |
| - |
42 |
| - if (count == 0) { |
| 44 | + if (count === 0) { |
43 | 45 | console.log('hi');
|
44 |
| - } else if (count == 1) { |
45 |
| - select_query += table; |
| 46 | + } else if (count === 1) { |
| 47 | + selectQuery += table; |
46 | 48 | } else {
|
47 |
| - select_query += ', ' + table; |
| 49 | + selectQuery += `, ${table}`; |
48 | 50 | }
|
49 |
| - count++; |
| 51 | + count += 1; |
50 | 52 | });
|
51 | 53 |
|
52 |
| - select_query += ') ON (' + rule.table.old.on + ')'; |
| 54 | + selectQuery += `) ON (${rule.table.old.on})`; |
53 | 55 | } else {
|
54 |
| - select_query = 'SELECT * FROM ' + rule.table.old; |
| 56 | + selectQuery = `SELECT * FROM ${rule.table.old}`; |
55 | 57 | }
|
56 |
| - DEBUG && (select_query += ' LIMIT 5'); |
57 |
| - select_query += ';'; |
58 |
| - console.log(select_query); |
| 58 | + DEBUG && (selectQuery += ' LIMIT 5'); |
| 59 | + selectQuery += ';'; |
| 60 | + console.log(selectQuery); |
59 | 61 |
|
60 | 62 | // Run the query
|
61 |
| - source.query(select_query, function(err, tuples, fields) { |
62 |
| - |
| 63 | + source.query(selectQuery, (err, tuples) => { |
63 | 64 | if (err) { throw err; }
|
64 |
| - console.log('\nCopying table ' + rule.table.new); |
| 65 | + console.log(`\nCopying table ${rule.table.new}`); |
65 | 66 |
|
66 | 67 | _.forEach(tuples, (tuple) => {
|
67 |
| - |
68 | 68 | let query = 'INSERT INTO ';
|
69 | 69 | query += rule.table.new;
|
70 | 70 | query += ' (';
|
71 | 71 |
|
72 | 72 | // Load fields in order
|
73 | 73 | let values = '';
|
74 | 74 | let count = 0;
|
75 |
| - _.forEach(rule.fields, (field, field_name) => { |
76 |
| - |
| 75 | + _.forEach(rule.fields, (field, fieldName) => { |
77 | 76 | // Add comma if not the first item
|
78 |
| - if (count != 0) { |
| 77 | + if (count !== 0) { |
79 | 78 | query += ', ';
|
80 | 79 | values += ', ';
|
81 | 80 | }
|
82 | 81 |
|
83 | 82 | // Add field name to query
|
84 |
| - query += field_name; |
| 83 | + query += fieldName; |
85 | 84 |
|
86 | 85 | // TODO: Add various data cleaning techniques here
|
87 |
| - let attribute = field; |
| 86 | + const attribute = field; |
88 | 87 |
|
89 | 88 | // check if there's a condition
|
90 | 89 | if (attribute.if) {
|
91 |
| - |
92 |
| - if (condition_eval(attribute.if.condition, tuple)) { |
93 |
| - values += '"' + attribute.if.pass.value + '"'; |
| 90 | + if (util.conditionEval(attribute.if.condition, tuple)) { |
| 91 | + values += `"${attribute.if.pass.value}"`; |
94 | 92 | } else {
|
95 |
| - values += '"' + attribute.if.fail.value + '"'; |
| 93 | + values += `"${attribute.if.fail.value}"`; |
96 | 94 | }
|
97 |
| - |
98 | 95 | } else {
|
99 |
| - values += '"' + tuple[field] + '"'; |
100 |
| - count++; |
| 96 | + values += `"${tuple[field]}"`; |
| 97 | + count += 1; |
101 | 98 | }
|
102 | 99 | }); // end forEach(fields)
|
103 | 100 |
|
104 |
| - query += ') VALUES (' + values; |
| 101 | + query += `) VALUES (${values}`; |
105 | 102 | query += ');';
|
106 | 103 |
|
107 | 104 | // Run the query
|
108 |
| - DEBUG && console.log(query + '\n'); |
109 |
| - DEBUG || dest.query(query, function(err, ans) { |
110 |
| - if (err) { throw err; } |
111 |
| - else { |
| 105 | + DEBUG && console.log(`${query}\n`); |
| 106 | + DEBUG || dest.query(query, (error) => { |
| 107 | + if (error) { throw err; } else { |
112 | 108 | console.log(query);
|
113 | 109 | }
|
114 | 110 | });
|
115 |
| - |
116 | 111 | }); // end of forEach(res)
|
117 | 112 | });
|
118 | 113 | });
|
119 |
| - |
120 |
| -function condition_eval(condition, data) { |
121 |
| - if (condition.eval) { |
122 |
| - let first = data[condition.eval.first_attribute] || condition.eval.first_value || null; |
123 |
| - let second = data[condition.eval.second_attribute] || condition.eval.second_value || null; |
124 |
| - |
125 |
| - switch (condition.eval.operator) { |
126 |
| - case '==': |
127 |
| - case '===': |
128 |
| - if (first == second) { |
129 |
| - return true; |
130 |
| - } else { |
131 |
| - return false; |
132 |
| - } |
133 |
| - break; |
134 |
| - default: |
135 |
| - throw 'Operator not supported'; |
136 |
| - } |
137 |
| - } else if (condition.or) { |
138 |
| - // TODO: make this variable |
139 |
| - return condition_eval(condition.or[0], data) || condition_eval(condition.or[1], data); |
140 |
| - } else if (condition.and) { |
141 |
| - // TODO: make this variable |
142 |
| - return condition_eval(condition.or[0], data) && condition_eval(condition.or[1], data); |
143 |
| - } else { |
144 |
| - throw 'Could not find eval or a condition'; |
145 |
| - } |
146 |
| -} |
0 commit comments