ソースを参照

narrow to waking hours

Pi 3 ヶ月 前
コミット
9837804078
1 ファイル変更21 行追加73 行削除
  1. 21 73
      activities/www/chart.sql

+ 21 - 73
activities/www/chart.sql

@@ -35,25 +35,17 @@ SELECT 'chart' AS component
 , 'green' AS color
 , 'red' AS color
 ;
-
-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
-            );
+SET ":any" = 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, 'Unknown' AS series WHERE :any;
+SELECT NULL AS x, NULL AS y, 'Eating' AS series WHERE :any;
+SELECT NULL AS x, NULL AS y, 'Not eating' AS series WHERE :any;
+SET ":morning_offset" = '08:00:00.000';
+SET ":evening_offset" = '03:00:00.000';
 WITH plot AS (
     SELECT ROW_NUMBER() OVER (ORDER BY ts) AS row
     , ts
@@ -66,11 +58,7 @@ WITH plot AS (
         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
-            )
+            AND :any
             ORDER BY ts DESC
             LIMIT 1
         )
@@ -78,54 +66,28 @@ WITH plot AS (
         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
-            )
+            AND :any
             ORDER BY ts DESC
             LIMIT 1
         )
     )
 )
-SELECT datetime(:start_of_day, '+06:00:00.000') AS x, 1 AS y, (
+SELECT datetime(:start_of_day, '+'||:morning_offset) 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
-            )
+    WHERE user = :user AND datetime(ts, 'localtime') <= datetime(:start_of_day, '+'||:morning_offset)
+    AND :any
     ORDER BY ts DESC
     LIMIT 1
 ) AS series
 UNION
-SELECT datetime(:end_of_day, '-02:00:00.000') AS x, 1 AS y, (
+SELECT datetime(:end_of_day, '-'||:evening_offset) 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
-            )
+    WHERE user = :user AND datetime(ts, 'localtime') <= datetime(:end_of_day, '-'||:evening_offset)
+    AND :any
     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
@@ -146,21 +108,7 @@ SELECT datetime(x, 'localtime') AS x, CASE value WHEN 0 THEN NULL ELSE value END
     AND plot.activity <> next.activity
 ) q
 WHERE
-    datetime(datetime(x, 'localtime'), '-06:00:00.000') >= :start_of_day
+    datetime(datetime(x, 'localtime'), '-'||:morning_offset) >= :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
+    datetime(datetime(x, 'localtime'), '+'||:evening_offset) <= :end_of_day
 ;