Explorar el Código

WIP - improve activity rollover

Pi hace 3 meses
padre
commit
a3b5827ce6
Se han modificado 1 ficheros con 97 adiciones y 7 borrados
  1. 97 7
      activities/www/chart.sql

+ 97 - 7
activities/www/chart.sql

@@ -32,13 +32,28 @@ SELECT 'chart' AS component
 --
 --  SELECT DISTINCT color(activity) FROM activities ORDER BY activity;
 , 'azure' AS color
-, 'red' AS color
 , 'green' AS color
+, 'red' AS color
 ;
 
---SELECT 'table' AS component;
--- TODO: ensure every series is present to stabalize colors
---   SELECT DISTINCT :date AS x, NULL as y, activity AS series FROM activities ORDER BY activity;
+SELECT NULL AS x, NULL AS y, 'Unknown' AS series
+            WHERE EXISTS (SELECT * FROM activities
+                WHERE user = :user
+                AND datetime(ts, 'localtime') BETWEEN :start_of_day AND :end_of_day
+                LIMIT 1
+            );
+SELECT NULL AS x, NULL AS y, 'Eating' AS series
+            WHERE EXISTS (SELECT * FROM activities
+                WHERE user = :user
+                AND datetime(ts, 'localtime') BETWEEN :start_of_day AND :end_of_day
+                LIMIT 1
+            );
+SELECT NULL AS x, NULL AS y, 'Not eating' AS series
+            WHERE EXISTS (SELECT * FROM activities
+                WHERE user = :user
+                AND datetime(ts, 'localtime') BETWEEN :start_of_day AND :end_of_day
+                LIMIT 1
+            );
 WITH plot AS (
     SELECT ROW_NUMBER() OVER (ORDER BY ts) AS row
     , ts
@@ -48,11 +63,69 @@ WITH plot AS (
         WHERE user = :user
         AND datetime(ts, 'localtime') BETWEEN :start_of_day AND :end_of_day
         UNION
-        SELECT datetime(:start_of_day, 'utc'), 'Unknown'
+        SELECT datetime(:start_of_day, 'utc'), (
+            SELECT activity FROM activities
+            WHERE user = :user AND datetime(ts, 'localtime') <= :start_of_day
+            AND EXISTS (SELECT * FROM activities
+                WHERE user = :user
+                AND datetime(ts, 'localtime') BETWEEN :start_of_day AND :end_of_day
+                LIMIT 1
+            )
+            ORDER BY ts DESC
+            LIMIT 1
+        )
         UNION
-        SELECT datetime(:end_of_day, 'utc'), 'Unknown'
+        SELECT datetime(:end_of_day, 'utc'), (
+            SELECT activity FROM activities
+            WHERE user = :user AND datetime(ts, 'localtime') <= :end_of_day
+            AND EXISTS (SELECT * FROM activities
+                WHERE user = :user
+                AND datetime(ts, 'localtime') BETWEEN :start_of_day AND :end_of_day
+                LIMIT 1
+            )
+            ORDER BY ts DESC
+            LIMIT 1
+        )
     )
 )
+SELECT datetime(:start_of_day, '+06:00:00.000') AS x, 1 AS y, (
+    SELECT activity FROM activities
+    WHERE user = :user AND datetime(ts, 'localtime') <= datetime(:start_of_day, '+06:00:00.000')
+            AND EXISTS (SELECT * FROM activities
+                WHERE user = :user
+                AND datetime(ts, 'localtime') BETWEEN :start_of_day AND :end_of_day
+                LIMIT 1
+            )
+    ORDER BY ts DESC
+    LIMIT 1
+) AS series
+UNION
+SELECT datetime(:end_of_day, '-02:00:00.000') AS x, 1 AS y, (
+    SELECT activity FROM activities
+    WHERE user = :user AND datetime(ts, 'localtime') <= datetime(:end_of_day, '-02:00:00.000')
+            AND EXISTS (SELECT * FROM activities
+                WHERE user = :user
+                AND datetime(ts, 'localtime') BETWEEN :start_of_day AND :end_of_day
+                LIMIT 1
+            )
+    ORDER BY ts DESC
+    LIMIT 1
+) AS series
+UNION
+--SELECT datetime(:start_of_day, '+06:00:00.000') AS x, NULL AS y, 'Unknown' AS series
+--UNION
+--SELECT datetime(:start_of_day, '+06:00:00.000') AS x, 1 AS y, prev.activity AS series
+--FROM plot
+--LEFT JOIN plot prev
+--WHERE
+--    plot.row = prev.row + 1
+--AND
+--    (plot.activity <> prev.activity OR prev.activity IS NULL)
+--AND
+--    datetime(datetime(plot.ts, 'localtime'), '-06:00:00.000') >= :start_of_day
+--AND
+--    (datetime(datetime(prev.ts, 'localtime'), '-06:00:00.000') <= :start_of_day OR prev.ts IS NULL)
+--UNION
 SELECT datetime(x, 'localtime') AS x, CASE value WHEN 0 THEN NULL ELSE value END AS y, series FROM (
     SELECT datetime(next.ts, '-00:00:01.000') AS x, 0 AS value, next.activity AS series
     FROM plot, plot next
@@ -72,5 +145,22 @@ SELECT datetime(x, 'localtime') AS x, CASE value WHEN 0 THEN NULL ELSE value END
     WHERE plot.row = next.row - 1
     AND plot.activity <> next.activity
 ) q
-ORDER BY series DESC, x ASC
+WHERE
+    datetime(datetime(x, 'localtime'), '-06:00:00.000') >= :start_of_day
+AND
+    datetime(datetime(x, 'localtime'), '+02:00:00.000') <= :end_of_day
+--UNION
+--SELECT datetime(:end_of_day, '-02:00:00.000') AS x, 1 AS y, plot.activity AS series
+--FROM plot
+--LEFT JOIN plot next
+--WHERE
+--    plot.row = next.row - 1
+--AND
+--    (plot.activity <> next.activity OR next.activity IS NULL)
+--AND
+--    datetime(datetime(plot.ts, 'localtime'), '+02:00:00.000') <= :end_of_day
+--AND
+--    (datetime(datetime(next.ts, 'localtime'), '+02:00:00.000') >= :end_of_day OR next.ts IS NULL)
+--UNION
+--SELECT datetime(:end_of_day, '-02:00:00.000') AS x, NULL AS y, 'Unknown' AS series
 ;