17
17
API_USERNAME = config [ "api_username" ]
18
18
TOPIC_QUERY_ID = config [ "topics_query_id" ]
19
19
POST_QUERY_ID = config [ "posts_query_id" ]
20
+ LIKES_QUERY_ID = config [ "likes_query_id" ]
20
21
21
22
sqlite_conn = SQLite3 ::Database . new ( "dump.db" )
22
23
conn = MiniSql ::Connection . get ( sqlite_conn )
@@ -37,11 +38,17 @@ def run_report(query_id:, min_id: 0, limit:)
37
38
request [ "Api-Username" ] = API_USERNAME
38
39
39
40
response = http . request ( request )
41
+ if response . code != "200"
42
+ puts "Error: #{ response . code } #{ response . message } "
43
+ puts response . body
44
+ exit 1
45
+ end
46
+
40
47
JSON . parse ( response . body )
41
48
end
42
49
43
50
def create_schema ( conn )
44
- conn . exec <<- SQL
51
+ conn . exec <<~ SQL
45
52
CREATE TABLE IF NOT EXISTS topics (
46
53
id INTEGER PRIMARY KEY,
47
54
category,
@@ -52,15 +59,15 @@ def create_schema(conn)
52
59
)
53
60
SQL
54
61
55
- conn . exec <<- SQL
62
+ conn . exec <<~ SQL
56
63
CREATE TABLE IF NOT EXISTS users(
57
64
id INTEGER PRIMARY KEY,
58
65
username,
59
66
name
60
67
)
61
68
SQL
62
69
63
- conn . exec <<- SQL
70
+ conn . exec <<~ SQL
64
71
CREATE TABLE IF NOT EXISTS posts(
65
72
id INTEGER PRIMARY KEY,
66
73
raw,
@@ -71,7 +78,21 @@ def create_schema(conn)
71
78
)
72
79
SQL
73
80
74
- conn . exec ( "create index idxTopic on posts(topic_id,post_number)" )
81
+ conn . exec <<~SQL
82
+ CREATE TABLE IF NOT EXISTS likes(
83
+ post_id,
84
+ user_id,
85
+ created_at
86
+ )
87
+ SQL
88
+
89
+ conn . exec (
90
+ "create unique index IF NOT EXISTS idxLikes on likes(post_id,user_id)"
91
+ )
92
+
93
+ conn . exec (
94
+ "create index IF NOT EXISTS idxTopic on posts(topic_id,post_number)"
95
+ )
75
96
end
76
97
77
98
def load_posts ( conn , rows )
@@ -139,32 +160,74 @@ def load_users_from_json(conn, json)
139
160
end
140
161
end
141
162
142
- create_schema ( conn )
163
+ def load_likes ( conn , json )
164
+ result = { highest_id : 0 , likes_loaded : 0 }
165
+
166
+ conn . exec "BEGIN TRANSACTION"
167
+
168
+ json [ "rows" ] . each do |row |
169
+ conn . exec <<~SQL , *row
170
+ -- id: ?
171
+ INSERT OR IGNORE INTO likes(post_id, user_id, created_at)
172
+ VALUES (?, ?, ?)
173
+ SQL
174
+ result [ :highest_id ] = row [ 0 ] if row [ 0 ] > result [ :highest_id ]
175
+ result [ :likes_loaded ] += 1
176
+ end
143
177
144
- min_id = 0
145
- while true
146
- response_data =
147
- run_report ( query_id : TOPIC_QUERY_ID , min_id : min_id , limit : 10_000 )
178
+ conn . exec "COMMIT TRANSACTION"
179
+
180
+ result
181
+ end
182
+
183
+ def download_topics ( conn )
184
+ min_id = 0
185
+ while true
186
+ response_data =
187
+ run_report ( query_id : TOPIC_QUERY_ID , min_id : min_id , limit : 10_000 )
188
+
189
+ load_users_from_json ( conn , response_data )
190
+
191
+ result = load_topics ( conn , response_data [ "rows" ] )
192
+ puts "Loaded #{ result [ :topics_loaded ] } topics (highest id is #{ result [ :highest_id ] } )"
193
+
194
+ min_id = result [ :highest_id ]
195
+ break if result [ :topics_loaded ] == 0
196
+ end
197
+ end
148
198
149
- load_users_from_json ( conn , response_data )
199
+ def download_posts ( conn )
200
+ min_id = 0
201
+ while true
202
+ response_data =
203
+ run_report ( query_id : POST_QUERY_ID , min_id : min_id , limit : 10_000 )
150
204
151
- result = load_topics ( conn , response_data [ "rows" ] )
152
- puts "Loaded #{ result [ :topics_loaded ] } topics (highest id is #{ result [ :highest_id ] } )"
205
+ load_users_from_json ( conn , response_data )
153
206
154
- min_id = result [ :highest_id ]
155
- break if result [ :topics_loaded ] == 0
207
+ result = load_posts ( conn , response_data [ "rows" ] )
208
+ puts "Loaded #{ result [ :posts_loaded ] } posts (highest id is #{ result [ :highest_id ] } )"
209
+
210
+ min_id = result [ :highest_id ]
211
+ break if result [ :posts_loaded ] == 0
212
+ end
156
213
end
157
214
158
- min_id = 0
159
- while true
160
- response_data =
161
- run_report ( query_id : POST_QUERY_ID , min_id : min_id , limit : 10_000 )
215
+ def download_likes ( conn )
216
+ min_id = 0
217
+ while true
218
+ response_data =
219
+ run_report ( query_id : LIKES_QUERY_ID , min_id : min_id , limit : 10_000 )
162
220
163
- load_users_from_json ( conn , response_data )
221
+ result = load_likes ( conn , response_data )
164
222
165
- result = load_posts ( conn , response_data [ "rows" ] )
166
- puts "Loaded #{ result [ :posts_loaded ] } posts (highest id is #{ result [ :highest_id ] } )"
223
+ puts "Loaded #{ result [ :likes_loaded ] } likes (highest id is #{ result [ :highest_id ] } )"
167
224
168
- min_id = result [ :highest_id ]
169
- break if result [ :posts_loaded ] == 0
225
+ min_id = result [ :highest_id ]
226
+ break if result [ :likes_loaded ] == 0
227
+ end
170
228
end
229
+
230
+ create_schema ( conn )
231
+ download_topics ( conn )
232
+ download_posts ( conn )
233
+ download_likes ( conn )
0 commit comments