litestack 0.4.1 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/.standard.yml +3 -0
  3. data/BENCHMARKS.md +23 -7
  4. data/CHANGELOG.md +11 -0
  5. data/Gemfile +1 -7
  6. data/Gemfile.lock +92 -0
  7. data/README.md +120 -6
  8. data/ROADMAP.md +45 -0
  9. data/Rakefile +3 -1
  10. data/WHYLITESTACK.md +1 -1
  11. data/assets/litecache_metrics.png +0 -0
  12. data/assets/litedb_metrics.png +0 -0
  13. data/assets/litemetric_logo_teal.png +0 -0
  14. data/assets/litesearch_logo_teal.png +0 -0
  15. data/bench/bench.rb +17 -10
  16. data/bench/bench_cache_rails.rb +10 -13
  17. data/bench/bench_cache_raw.rb +17 -22
  18. data/bench/bench_jobs_rails.rb +18 -12
  19. data/bench/bench_jobs_raw.rb +17 -10
  20. data/bench/bench_queue.rb +4 -6
  21. data/bench/rails_job.rb +5 -7
  22. data/bench/skjob.rb +4 -4
  23. data/bench/uljob.rb +6 -6
  24. data/lib/action_cable/subscription_adapter/litecable.rb +5 -8
  25. data/lib/active_job/queue_adapters/litejob_adapter.rb +6 -8
  26. data/lib/active_record/connection_adapters/litedb_adapter.rb +65 -75
  27. data/lib/active_support/cache/litecache.rb +38 -41
  28. data/lib/generators/litestack/install/install_generator.rb +3 -3
  29. data/lib/generators/litestack/install/templates/database.yml +7 -1
  30. data/lib/litestack/liteboard/liteboard.rb +269 -149
  31. data/lib/litestack/litecable.rb +41 -37
  32. data/lib/litestack/litecable.sql.yml +22 -11
  33. data/lib/litestack/litecache.rb +79 -88
  34. data/lib/litestack/litecache.sql.yml +81 -22
  35. data/lib/litestack/litecache.yml +1 -1
  36. data/lib/litestack/litedb.rb +35 -40
  37. data/lib/litestack/litejob.rb +30 -29
  38. data/lib/litestack/litejobqueue.rb +63 -65
  39. data/lib/litestack/litemetric.rb +80 -92
  40. data/lib/litestack/litemetric.sql.yml +244 -234
  41. data/lib/litestack/litemetric_collector.sql.yml +38 -41
  42. data/lib/litestack/litequeue.rb +39 -41
  43. data/lib/litestack/litequeue.sql.yml +39 -31
  44. data/lib/litestack/litescheduler.rb +15 -15
  45. data/lib/litestack/litesearch/index.rb +93 -63
  46. data/lib/litestack/litesearch/model.rb +66 -65
  47. data/lib/litestack/litesearch/schema.rb +53 -56
  48. data/lib/litestack/litesearch/schema_adapters/backed_adapter.rb +46 -50
  49. data/lib/litestack/litesearch/schema_adapters/basic_adapter.rb +44 -35
  50. data/lib/litestack/litesearch/schema_adapters/contentless_adapter.rb +3 -6
  51. data/lib/litestack/litesearch/schema_adapters/standalone_adapter.rb +7 -9
  52. data/lib/litestack/litesearch/schema_adapters.rb +4 -9
  53. data/lib/litestack/litesearch.rb +6 -9
  54. data/lib/litestack/litesupport.rb +76 -86
  55. data/lib/litestack/railtie.rb +1 -1
  56. data/lib/litestack/version.rb +2 -2
  57. data/lib/litestack.rb +6 -4
  58. data/lib/railties/rails/commands/dbconsole.rb +11 -15
  59. data/lib/sequel/adapters/litedb.rb +16 -21
  60. data/lib/sequel/adapters/shared/litedb.rb +168 -168
  61. data/scripts/build_metrics.rb +91 -0
  62. data/scripts/test_cable.rb +30 -0
  63. data/scripts/test_job_retry.rb +33 -0
  64. data/scripts/test_metrics.rb +60 -0
  65. data/template.rb +2 -2
  66. metadata +101 -6
@@ -5,335 +5,345 @@ schema:
5
5
  name TEXT PRIMARY KEY NOT NULL,
6
6
  state TEXT,
7
7
  updated_at INTEGER
8
- );
9
-
8
+ );
9
+
10
10
  create_events: >
11
11
  CREATE TABLE IF NOT EXISTS events(
12
- topic TEXT NOT NULL references topics(name) ON DELETE CASCADE,
13
- name TEXT DEFAULT('___') NOT NULL ON CONFLICT REPLACE,
14
- key TEXT DEFAULT('___') NOT NULL ON CONFLICT REPLACE,
15
- count INTEGER DEFAULT(0) NOT NULL ON CONFLICT REPLACE,
16
- value REAL,
17
- minimum REAL,
18
- maximum REAL,
19
- created_at INTEGER DEFAULT((unixepoch()/300*300)) NOT NULL,
20
- resolution TEXT DEFAULT('minute') NOT NULL,
12
+ topic TEXT NOT NULL references topics(name) ON DELETE CASCADE,
13
+ name TEXT DEFAULT('___') NOT NULL ON CONFLICT REPLACE,
14
+ key TEXT DEFAULT('___') NOT NULL ON CONFLICT REPLACE,
15
+ count INTEGER DEFAULT(0) NOT NULL ON CONFLICT REPLACE,
16
+ value REAL,
17
+ minimum REAL,
18
+ maximum REAL,
19
+ created_at INTEGER DEFAULT((unixepoch()/300*300)) NOT NULL,
20
+ resolution TEXT DEFAULT('minute') NOT NULL,
21
21
  PRIMARY KEY(resolution, created_at, topic, name, key)
22
- ) STRICT;
22
+ ) STRICT;
23
23
 
24
- create_topic_index_on_events: CREATE INDEX events_topic_index ON events (resolution, created_at, topic) WHERE name = '___';
25
- create_event_index_on_events: CREATE INDEX events_event_index ON events (resolution, created_at , topic, name) WHERE key = '___';
24
+ create_topic_index_on_events: >
25
+ CREATE INDEX events_topic_index ON events (resolution, created_at, topic) WHERE name = '___';
26
+ create_event_index_on_events: >
27
+ CREATE INDEX events_event_index ON events (resolution, created_at , topic, name) WHERE key = '___';
26
28
 
27
29
  create_events_search: >
28
30
  CREATE VIRTUAL TABLE IF NOT EXISTS events_search USING fts5 (
29
- topic,
30
- name,
31
- key,
32
- resolution,
33
- content=events,
31
+ topic,
32
+ name,
33
+ key,
34
+ resolution,
35
+ content=events,
34
36
  tokeniz="trigram"
35
- )
36
-
37
+ );
38
+
37
39
  create_events_insert_trigger: >
38
- CREATE TRIGGER events_insert AFTER INSERT ON events
40
+ CREATE TRIGGER events_insert AFTER INSERT ON events
39
41
  BEGIN
40
- INSERT INTO
41
- events_search(rowid, topic, name, key, resolution)
42
+ INSERT INTO
43
+ events_search(rowid, topic, name, key, resolution)
42
44
  VALUES
43
45
  (new.rowid, new.topic, new.name, new.key, new.resolution);
44
46
  END;
45
-
47
+
46
48
  create_events_delete_trigger: >
47
- CREATE TRIGGER events_delete AFTER DELETE ON events
49
+ CREATE TRIGGER events_delete AFTER DELETE ON events
48
50
  BEGIN
49
51
  INSERT INTO
50
- events_search(events_search, rowid, topic, name, key, resolution)
52
+ events_search(events_search, rowid, topic, name, key, resolution)
51
53
  VALUES
52
- ('delete', old.rowid, old.topic, old.name, old.key, old.resolution);
54
+ ('delete', old.rowid, old.topic, old.name, old.key, old.resolution);
53
55
  END;
54
56
 
55
57
  create_events_update_trigger: >
56
- CREATE TRIGGER events_update AFTER UPDATE ON events
58
+ CREATE TRIGGER events_update AFTER UPDATE ON events
57
59
  BEGIN
58
60
  INSERT INTO
59
- events_search(events_search, rowid, topic, name, key, resolution)
61
+ events_search(events_search, rowid, topic, name, key, resolution)
60
62
  VALUES
61
- ('delete', old.rowid, old.topic, old.name, old.key, old.resolution);
62
- INSERT INTO
63
- events_search(rowid, topic, name, key, resolution)
63
+ ('delete', old.rowid, old.topic, old.name, old.key, old.resolution);
64
+ INSERT INTO
65
+ events_search(rowid, topic, name, key, resolution)
64
66
  VALUES
65
67
  (new.rowid, new.topic, new.name, new.key, new.resolution);
66
68
  END;
67
69
 
68
70
  rebuild_index: >
69
71
  INSERT INTO events_search(events_search) VALUES ('rebuild');
70
-
71
-
72
-
73
72
 
74
73
  stmts:
75
-
76
74
  register_topic: >
77
- INSERT INTO topics (name, updated_at) VALUES (?, unixepoch())
78
- ON CONFLICT DO
79
- UPDATE SET updated_at = unixepoch();
80
-
75
+ INSERT INTO topics (name, updated_at) VALUES (?, unixepoch())
76
+ ON CONFLICT DO UPDATE
77
+ SET updated_at = unixepoch();
78
+
81
79
  capture_state: >
82
- UPDATE topics
83
- SET state = ?2, updated_at = unixepoch()
84
- WHERE name = ?1
80
+ UPDATE topics
81
+ SET state = ?2, updated_at = unixepoch()
82
+ WHERE name = ?1;
85
83
 
86
84
  snapshot: >
87
85
  SELECT state, datetime(updated_at, 'unixepoch')
88
- FROM topics
89
- WHERE name = ?1
86
+ FROM topics
87
+ WHERE name = ?1;
90
88
 
91
89
  capture_event: >
92
- INSERT INTO events(topic, name, key, created_at, count, value, minimum, maximum) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8)
93
- ON CONFLICT DO
94
- UPDATE SET count = count + EXCLUDED.count, value = value + EXCLUDED.value, minimum = min(minimum, EXCLUDED.minimum), maximum = max(maximum, EXCLUDED.maximum)
95
-
90
+ INSERT INTO events(topic, name, key, created_at, count, value, minimum, maximum)
91
+ VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8)
92
+ ON CONFLICT DO UPDATE
93
+ SET
94
+ count = count + EXCLUDED.count,
95
+ value = value + EXCLUDED.value,
96
+ minimum = min(minimum, EXCLUDED.minimum),
97
+ maximum = max(maximum, EXCLUDED.maximum);
98
+
96
99
  # requires an index on (resolution, created_at)
97
100
  summarize_events: >
98
- INSERT INTO
99
- events (topic, name, key, count, value, minimum, maximum, created_at, resolution )
100
- SELECT
101
- topic,
102
- name,
103
- key,
104
- sum(count),
105
- sum(value),
106
- min(minimum),
107
- max(maximum),
108
- (created_at/(?1))*?1 as created,
109
- ?2
110
- FROM events
111
- WHERE resolution = ?3
101
+ INSERT INTO
102
+ events (topic, name, key, count, value, minimum, maximum, created_at, resolution)
103
+ SELECT
104
+ topic,
105
+ name,
106
+ key,
107
+ sum(count),
108
+ sum(value),
109
+ min(minimum),
110
+ max(maximum),
111
+ (created_at/(?1))*?1 as created,
112
+ ?2
113
+ FROM events
114
+ WHERE resolution = ?3
112
115
  GROUP BY topic, name, key, created
113
- ON CONFLICT DO
114
- UPDATE SET count = EXCLUDED.count, value = EXCLUDED.value, minimum = EXCLUDED.minimum, maximum = EXCLUDED.maximum
116
+ ON CONFLICT DO UPDATE
117
+ SET
118
+ count = EXCLUDED.count,
119
+ value = EXCLUDED.value,
120
+ minimum = EXCLUDED.minimum,
121
+ maximum = EXCLUDED.maximum;
115
122
 
116
123
  # requires an index on (resolution, created_at) #TODO: fix deletion boundary (use the date mapping)
117
- delete_events: DELETE FROM events WHERE resolution = ?1 AND (created_at /(?2)) * ?2 < ((unixepoch()/(?2)) * ?2 - ?2);
124
+ delete_events: >
125
+ DELETE FROM events
126
+ WHERE resolution = ?1
127
+ AND (created_at /(?2)) * ?2 < ((unixepoch()/(?2)) * ?2 - ?2);
118
128
 
119
129
  # select topics from the topics table
120
- list_topics: SELECT name FROM topics ORDER BY name ASC;
130
+ list_topics: >
131
+ SELECT name FROM topics ORDER BY name ASC;
121
132
 
122
- # select topics, their event counts, total values, min and max values
133
+ # select topics, their event counts, total values, min and max values
123
134
  topics_summaries: >
124
- SELECT
125
- topic,
126
- count(distinct name) as events,
127
- count(distinct key) as keys,
128
- sum(count) as rcount
129
- from events
130
- where resolution = ?1
131
- AND created_at <= unixepoch()
132
- AND created_at >= unixepoch() -?2
133
- AND name = '___'
134
- AND iif(length(?4) > 0, rowid IN (SELECT rowid FROM events_search WHERE topic LIKE ?4), TRUE)
135
- GROUP BY topic
136
- ORDER BY
137
- iif(?3 = 'events', events,
138
- iif(?3 = 'keys', keys,
139
- iif(?3 = 'rcount', rcount, topic)))
135
+ SELECT
136
+ topic,
137
+ count(distinct name) as events,
138
+ count(distinct key) as keys,
139
+ sum(count) as rcount
140
+ FROM events
141
+ WHERE resolution = ?1
142
+ AND created_at <= unixepoch()
143
+ AND created_at >= unixepoch() -?2
144
+ AND name = '___'
145
+ AND iif(length(?4) > 0, rowid IN (SELECT rowid FROM events_search WHERE topic LIKE ?4), TRUE)
146
+ GROUP BY topic
147
+ ORDER BY
148
+ iif(?3 = 'events', events,
149
+ iif(?3 = 'keys', keys,
150
+ iif(?3 = 'rcount', rcount, topic)))
140
151
  DESC;
141
-
152
+
142
153
  topics_summaries_asc: >
143
- SELECT
144
- topic,
145
- count(distinct name) as events,
146
- count(distinct key) as keys,
147
- sum(count) as rcount
148
- from events
149
- where resolution = ?1
150
- AND created_at <= unixepoch()
151
- AND created_at >= unixepoch() -?2
152
- AND name = '___'
153
- AND iif(length(?4) > 0, rowid IN (SELECT rowid FROM events_search WHERE topic LIKE ?4), TRUE)
154
- GROUP BY topic
155
- ORDER BY
156
- iif(?3 = 'events', events,
157
- iif(?3 = 'keys', keys,
158
- iif(?3 = 'rcount', rcount, topic)))
154
+ SELECT
155
+ topic,
156
+ count(distinct name) as events,
157
+ count(distinct key) as keys,
158
+ sum(count) as rcount
159
+ FROM events
160
+ WHERE resolution = ?1
161
+ AND created_at <= unixepoch()
162
+ AND created_at >= unixepoch() -?2
163
+ AND name = '___'
164
+ AND iif(length(?4) > 0, rowid IN (SELECT rowid FROM events_search WHERE topic LIKE ?4), TRUE)
165
+ GROUP BY topic
166
+ ORDER BY
167
+ iif(?3 = 'events', events,
168
+ iif(?3 = 'keys', keys,
169
+ iif(?3 = 'rcount', rcount, topic)))
159
170
  ASC;
160
171
 
161
172
  events_summaries: >
162
- SELECT
163
- name,
164
- count(DISTINCT key) AS keys,
173
+ SELECT
174
+ name,
175
+ count(DISTINCT key) AS keys,
165
176
  sum(count) as rcount,
166
- cast(sum(value) as double) / sum(count) as ravg,
167
- sum(value) AS rtotal,
168
- min(minimum) AS rmin,
169
- max(maximum) AS rmax
170
- FROM events
171
- WHERE topic = ?1 AND resolution = ?2
177
+ cast(sum(value) as double) / sum(count) as ravg,
178
+ sum(value) AS rtotal,
179
+ min(minimum) AS rmin,
180
+ max(maximum) AS rmax
181
+ FROM events
182
+ WHERE topic = ?1 AND resolution = ?2
172
183
  AND created_at <= unixepoch()
173
- AND created_at >= unixepoch() - ?5
184
+ AND created_at >= unixepoch() - ?5
174
185
  AND name != '___'
175
186
  AND key = '___'
176
187
  AND iif(length(?4) > 0, rowid IN (SELECT rowid FROM events_search WHERE name LIKE ?4), TRUE)
177
- GROUP BY name
178
- ORDER BY
179
- iif(?3 = 'rcount', rcount,
180
- iif(?3 = 'ravg', ravg,
181
- iif(?3 = 'rtotal', rtotal,
182
- iif(?3 = 'rmin', rmin,
183
- iif(?3 = 'rmax', rmax,
184
- iif(?3 = 'keys', keys,
185
- iif(?3 = 'name', name, rcount)))))))
186
- DESC
188
+ GROUP BY name
189
+ ORDER BY
190
+ iif(?3 = 'rcount', rcount,
191
+ iif(?3 = 'ravg', ravg,
192
+ iif(?3 = 'rtotal', rtotal,
193
+ iif(?3 = 'rmin', rmin,
194
+ iif(?3 = 'rmax', rmax,
195
+ iif(?3 = 'keys', keys,
196
+ iif(?3 = 'name', name, rcount)))))))
197
+ DESC
187
198
  LIMIT 20;
188
199
 
189
200
  events_summaries_asc: >
190
- SELECT
191
- name,
192
- count(DISTINCT key) AS keys,
201
+ SELECT
202
+ name,
203
+ count(DISTINCT key) AS keys,
193
204
  sum(count) as rcount,
194
- cast(sum(value) as double) / sum(count) as ravg,
195
- sum(value) AS rtotal,
196
- min(minimum) AS rmin,
197
- max(maximum) AS rmax
198
- FROM events
199
- WHERE topic = ?1 AND resolution = ?2
205
+ cast(sum(value) as double) / sum(count) as ravg,
206
+ sum(value) AS rtotal,
207
+ min(minimum) AS rmin,
208
+ max(maximum) AS rmax
209
+ FROM events
210
+ WHERE topic = ?1 AND resolution = ?2
200
211
  AND created_at <= unixepoch()
201
- AND created_at >= unixepoch() -?5
212
+ AND created_at >= unixepoch() -?5
202
213
  AND name != '___'
203
214
  AND key = '___'
204
215
  AND iif(length(?4) > 0, rowid IN (SELECT rowid FROM events_search WHERE name LIKE ?4), TRUE)
205
- GROUP BY name
206
- ORDER BY
207
- iif(?3 = 'rcount', rcount,
208
- iif(?3 = 'ravg', ravg,
209
- iif(?3 = 'rtotal', rtotal,
210
- iif(?3 = 'rmin', rmin,
211
- iif(?3 = 'rmax', rmax,
212
- iif(?3 = 'keys', keys,
213
- iif(?3 = 'name', name, rcount)))))))
214
- ASC
216
+ GROUP BY name
217
+ ORDER BY
218
+ iif(?3 = 'rcount', rcount,
219
+ iif(?3 = 'ravg', ravg,
220
+ iif(?3 = 'rtotal', rtotal,
221
+ iif(?3 = 'rmin', rmin,
222
+ iif(?3 = 'rmax', rmax,
223
+ iif(?3 = 'keys', keys,
224
+ iif(?3 = 'name', name, rcount)))))))
225
+ ASC
215
226
  LIMIT 20;
216
227
 
217
-
218
228
  keys_summaries: >
219
- SELECT
220
- key,
229
+ SELECT
230
+ key,
221
231
  sum(count) AS rcount,
222
- cast(sum(value) AS double) / sum(count) AS ravg,
223
- sum(value) AS rtotal,
224
- min(minimum) AS rmin,
225
- max(maximum) AS rmax
226
- FROM events
227
- WHERE topic = ?1 AND name = ?2 AND resolution = ?3
232
+ cast(sum(value) AS double) / sum(count) AS ravg,
233
+ sum(value) AS rtotal,
234
+ min(minimum) AS rmin,
235
+ max(maximum) AS rmax
236
+ FROM events
237
+ WHERE topic = ?1 AND name = ?2 AND resolution = ?3
228
238
  AND created_at <= unixepoch()
229
- AND created_at >= unixepoch() - ?6
239
+ AND created_at >= unixepoch() - ?6
230
240
  AND key != '___'
231
241
  AND iif(length(?5) > 0, rowid IN (SELECT rowid FROM events_search WHERE key LIKE ?5), TRUE)
232
242
  GROUP BY key
233
- ORDER BY
234
- iif(?4 = 'rcount', rcount,
235
- iif(?4 = 'ravg', ravg,
236
- iif(?4 = 'rtotal', rtotal,
237
- iif(?4 = 'rmin', rmin,
238
- iif(?4 = 'rmax', rmax,
239
- iif(?4 = 'key', key, rcount))))))
243
+ ORDER BY
244
+ iif(?4 = 'rcount', rcount,
245
+ iif(?4 = 'ravg', ravg,
246
+ iif(?4 = 'rtotal', rtotal,
247
+ iif(?4 = 'rmin', rmin,
248
+ iif(?4 = 'rmax', rmax,
249
+ iif(?4 = 'key', key, rcount))))))
240
250
  DESC
241
251
  LIMIT 20;
242
252
 
243
253
  keys_summaries_asc: >
244
- SELECT
245
- key,
254
+ SELECT
255
+ key,
246
256
  sum(count) AS rcount,
247
- cast(sum(value) AS double) / sum(count) AS ravg,
248
- sum(value) AS rtotal,
249
- min(minimum) AS rmin,
250
- max(maximum) AS rmax
251
- FROM events
252
- WHERE topic = ?1 AND name = ?2 AND resolution = ?3
257
+ cast(sum(value) AS double) / sum(count) AS ravg,
258
+ sum(value) AS rtotal,
259
+ min(minimum) AS rmin,
260
+ max(maximum) AS rmax
261
+ FROM events
262
+ WHERE topic = ?1 AND name = ?2 AND resolution = ?3
253
263
  AND created_at <= unixepoch()
254
- AND created_at >= unixepoch() - ?6
264
+ AND created_at >= unixepoch() - ?6
255
265
  AND key != '___'
256
266
  AND iif(length(?5) > 0, rowid IN (SELECT rowid FROM events_search WHERE key LIKE ?5), TRUE)
257
267
  GROUP BY key
258
- ORDER BY
259
- iif(?4 = 'rcount', rcount,
260
- iif(?4 = 'ravg', ravg,
261
- iif(?4 = 'rtotal', rtotal,
262
- iif(?4 = 'rmin', rmin,
263
- iif(?4 = 'rmax', rmax,
264
- iif(?4 = 'key', key, rcount))))))
268
+ ORDER BY
269
+ iif(?4 = 'rcount', rcount,
270
+ iif(?4 = 'ravg', ravg,
271
+ iif(?4 = 'rtotal', rtotal,
272
+ iif(?4 = 'rmin', rmin,
273
+ iif(?4 = 'rmax', rmax,
274
+ iif(?4 = 'key', key, rcount))))))
265
275
  ASC
266
276
  LIMIT 20;
267
277
 
268
- # list data points at the topic, event, or key level
269
- # needs: duration, limit, resolution, topic, name (optional), key (optional)
278
+ # list data points at the topic, event, or key level
279
+ # needs: duration, limit, resolution, topic, name (optional), key (optional)
270
280
 
271
281
  topic_data_points: >
272
- SELECT
273
- datetime(ts.slot, 'unixepoch') AS rtime,
274
- ts.slot AS unixtime,
275
- sum(events.count) AS rcount,
276
- avg(events.value/events.count) AS ravg
282
+ SELECT
283
+ datetime(ts.slot, 'unixepoch') AS rtime,
284
+ ts.slot AS unixtime,
285
+ sum(events.count) AS rcount,
286
+ avg(events.value/events.count) AS ravg
277
287
  FROM (
278
- WITH RECURSIVE timeslot(x) AS (
279
- SELECT (unixepoch()/(?1))*(?1)
280
- UNION ALL
281
- SELECT x - (?1) FROM timeslot LIMIT ?2
282
- ) SELECT x as slot FROM timeslot
283
- ) AS ts
284
- LEFT OUTER JOIN events
285
- ON ts.slot = events.created_at
286
- AND events.resolution = ?3
287
- AND events.topic = ?4
288
- AND events.created_at <= UNIXEPOCH()
289
- AND events.name = '___'
288
+ WITH RECURSIVE timeslot(x) AS (
289
+ SELECT (unixepoch()/(?1))*(?1)
290
+ UNION ALL
291
+ SELECT x - (?1) FROM timeslot LIMIT ?2
292
+ ) SELECT x as slot FROM timeslot
293
+ ) AS ts
294
+ LEFT OUTER JOIN events
295
+ ON ts.slot = events.created_at
296
+ AND events.resolution = ?3
297
+ AND events.topic = ?4
298
+ AND events.created_at <= UNIXEPOCH()
299
+ AND events.name = '___'
290
300
  GROUP BY ts.slot
291
301
  ORDER BY ts.slot ASC;
292
-
302
+
293
303
  event_data_points: >
294
- SELECT
295
- datetime(ts.slot, 'unixepoch') AS rtime,
296
- ts.slot AS unixtime,
297
- events.count AS rcount,
298
- events.value / events.count AS ravg,
299
- events.value AS rtotal
304
+ SELECT
305
+ datetime(ts.slot, 'unixepoch') AS rtime,
306
+ ts.slot AS unixtime,
307
+ events.count AS rcount,
308
+ events.value / events.count AS ravg,
309
+ events.value AS rtotal
300
310
  FROM (
301
- WITH RECURSIVE timeslot(x) AS (
302
- SELECT (unixepoch()/(?1))*(?1)
303
- UNION ALL
304
- SELECT x - (?1) FROM timeslot LIMIT ?2
305
- ) SELECT x as slot FROM timeslot
306
- ) AS ts
307
- LEFT OUTER JOIN events
308
- ON ts.slot = events.created_at
309
- AND events.resolution = ?3
310
- AND events.topic = ?4
311
- AND events.name = ?5
312
- AND events.key = '___'
313
- AND events.created_at <= UNIXEPOCH()
311
+ WITH RECURSIVE timeslot(x) AS (
312
+ SELECT (unixepoch()/(?1))*(?1)
313
+ UNION ALL
314
+ SELECT x - (?1) FROM timeslot LIMIT ?2
315
+ ) SELECT x as slot FROM timeslot
316
+ ) AS ts
317
+ LEFT OUTER JOIN events
318
+ ON ts.slot = events.created_at
319
+ AND events.resolution = ?3
320
+ AND events.topic = ?4
321
+ AND events.name = ?5
322
+ AND events.key = '___'
323
+ AND events.created_at <= UNIXEPOCH()
314
324
  GROUP BY ts.slot
315
325
  ORDER BY ts.slot ASC;
316
-
326
+
317
327
  key_data_points: >
318
- SELECT
319
- datetime(ts.slot, 'unixepoch') AS rtime,
320
- ts.slot AS unixtime,
321
- events.count AS rcount,
322
- events.value / events.count AS ravg,
323
- events.value AS rtotal
328
+ SELECT
329
+ datetime(ts.slot, 'unixepoch') AS rtime,
330
+ ts.slot AS unixtime,
331
+ events.count AS rcount,
332
+ events.value / events.count AS ravg,
333
+ events.value AS rtotal
324
334
  FROM (
325
- WITH RECURSIVE timeslot(x) AS (
326
- SELECT (unixepoch()/(?1))*(?1)
327
- UNION ALL
328
- SELECT x - (?1) FROM timeslot LIMIT ?2
329
- ) SELECT x as slot FROM timeslot
330
- ) AS ts
331
- LEFT OUTER JOIN events
332
- ON ts.slot = events.created_at
333
- AND events.resolution = ?3
334
- AND events.topic = ?4
335
- AND events.name = ?5
336
- AND events.key = ?6
337
- AND events.created_at <= UNIXEPOCH()
335
+ WITH RECURSIVE timeslot(x) AS (
336
+ SELECT (unixepoch()/(?1))*(?1)
337
+ UNION ALL
338
+ SELECT x - (?1) FROM timeslot LIMIT ?2
339
+ ) SELECT x as slot FROM timeslot
340
+ ) AS ts
341
+ LEFT OUTER JOIN events
342
+ ON ts.slot = events.created_at
343
+ AND events.resolution = ?3
344
+ AND events.topic = ?4
345
+ AND events.name = ?5
346
+ AND events.key = ?6
347
+ AND events.created_at <= UNIXEPOCH()
338
348
  GROUP BY ts.slot
339
349
  ORDER BY ts.slot ASC;