/ learning / sql / src / seeds / samples.sql
samples.sql
 1  INSERT INTO samples (time, event_name, source, type, metric_id, instance_index, value)
 2  SELECT
 3      events.time,
 4      events.name,
 5      events.source,
 6      events.type,
 7      metrics.id,
 8      metric_extraction.instance_index,
 9      metric_extraction.metric_value
10  FROM events
11  CROSS JOIN LATERAL (
12      SELECT
13          COALESCE((temperature_instance ->> 'instance_index')::int, 0) AS instance_index,
14          temperature_metric.metric_name,
15          temperature_metric.metric_value
16      FROM jsonb_array_elements(events.data -> 'instances') AS temperature_instance
17      CROSS JOIN LATERAL (
18          VALUES
19              ('temperature_celsius', (temperature_instance ->> 'temperature_celsius')::double precision),
20              ('relative_humidity_percent', (temperature_instance ->> 'relative_humidity_percent')::double precision)
21      ) AS temperature_metric(metric_name, metric_value)
22      WHERE events.type = 'sensors.temperature_and_humidity.v1'
23        AND jsonb_typeof(events.data -> 'instances') = 'array'
24  
25      UNION ALL
26  
27      SELECT
28          0 AS instance_index,
29          'wind_speed_kilometers_per_hour'::text AS metric_name,
30          (events.data ->> 'wind_speed_kilometers_per_hour')::double precision AS metric_value
31      WHERE events.type = 'sensors.wind_speed.v1'
32  
33      UNION ALL
34  
35      SELECT
36          0 AS instance_index,
37          wind_direction_metric.metric_name,
38          wind_direction_metric.metric_value
39      FROM (
40          VALUES
41              ('wind_direction_angle', (events.data ->> 'wind_direction_angle')::double precision),
42              ('wind_direction_slice', (events.data ->> 'wind_direction_slice')::double precision)
43      ) AS wind_direction_metric(metric_name, metric_value)
44      WHERE events.type = 'sensors.wind_direction.v1'
45  
46      UNION ALL
47  
48      SELECT
49          0 AS instance_index,
50          soil_metric.metric_name,
51          soil_metric.metric_value
52      FROM (
53          VALUES
54              ('temperature_celsius', (events.data ->> 'temperature_celsius')::double precision),
55              ('moisture_percent', (events.data ->> 'moisture_percent')::double precision),
56              ('conductivity', (events.data ->> 'conductivity')::double precision),
57              ('salinity', (events.data ->> 'salinity')::double precision),
58              ('tds', (events.data ->> 'tds')::double precision)
59      ) AS soil_metric(metric_name, metric_value)
60      WHERE events.type = 'sensors.soil.v1'
61  
62      UNION ALL
63  
64      SELECT
65          0 AS instance_index,
66          'solar_radiation_watts_per_square_meter'::text AS metric_name,
67          (events.data ->> 'solar_radiation_watts_per_square_meter')::double precision AS metric_value
68      WHERE events.type = 'sensors.solar_radiation.v1'
69  
70      UNION ALL
71  
72      SELECT
73          0 AS instance_index,
74          status_metric.metric_name,
75          status_metric.metric_value
76      FROM (
77          VALUES
78              ('memory_heap', (events.data ->> 'memory_heap')::double precision),
79              ('chip_cores', (events.data ->> 'chip_cores')::double precision),
80              ('chip_revision', (events.data ->> 'chip_revision')::double precision),
81              ('wifi_rssi', (events.data ->> 'wifi_rssi')::double precision),
82              ('uptime_seconds', (events.data ->> 'uptime_seconds')::double precision)
83      ) AS status_metric(metric_name, metric_value)
84      WHERE events.type = 'status.v1'
85  ) AS metric_extraction(instance_index, metric_name, metric_value)
86  JOIN metrics
87      ON metrics.type = events.type
88     AND metrics.name = metric_extraction.metric_name;