Selaa lähdekoodia

fix datetime handling

Pi 3 kuukautta sitten
vanhempi
säilyke
da6ecfd309
3 muutettua tiedostoa jossa 47 lisäystä ja 30 poistoa
  1. 33 29
      activities/www/chart.sql
  2. 1 1
      activities/www/index.sql
  3. 13 0
      docker-compose.yml

+ 33 - 29
activities/www/chart.sql

@@ -1,25 +1,29 @@
 SET ":user" = COALESCE(:user, $user, '');
---SET ":date" = (SELECT COALESCE(CASE COALESCE(:date, '')
---  WHEN '' THEN NULL
---  ELSE :date
---END, CASE COALESCE($date, '')
---  WHEN '' THEN NULL
---  ELSE $date
---END, CURRENT_TIMESTAMP));
 SET ":date" = COALESCE(:date, $date, CURRENT_TIMESTAMP);
-SET ":date" = (SELECT datetime(datetime(:date, 'localtime'), 'start of day'));
+SET ":start_of_day" = (SELECT datetime(datetime(:date, 'localtime'), 'start of day'));
+SET ":end_of_day" = (SELECT datetime(:start_of_day, '+1 days'));
 
 SELECT 'chart' AS component
-, '' AS title -- date(:date) AS title
+, '' AS title
 , TRUE AS time
 , 'area' AS type
 , 1 AS ymax
 , 0 AS ymin
 , 1 AS ystep
 , '100' AS height
+-- TODO: fix color to series
+--
+--   SELECT DISTINCT color(activity) FROM activities ORDER BY activity;
+, 'azure' AS color
+, 'green' AS color
+, 'red' AS color
 ;
 
 --SELECT 'table' AS component;
+SELECT :start_of_day AS x, NULL as y, 'Unknown' AS series;
+-- 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 :end_of_day AS x, NULL as y, 'Unknown' AS series;
 SELECT datetime(CASE y
   WHEN 0 THEN datetime(x, '-00:00:01.000')
   WHEN 2 THEN datetime(x, '+00:00:01.000')
@@ -30,49 +34,49 @@ SELECT ts AS x
 , 0 AS y
 FROM activities a
 WHERE user = :user
-AND datetime(datetime(ts, 'localtime'), 'start of day') = :date
-AND EXISTS (SELECT * FROM (
-  SELECT lag.activity
-  FROM activities lag
-  WHERE lag.ts < a.ts
-  ORDER BY ts ASC
-  LIMIT 1
-) q WHERE q.activity <> activity)
+AND datetime(datetime(ts, 'localtime'), 'start of day') = :start_of_day
+--AND EXISTS (SELECT * FROM (
+--  SELECT lag.activity
+--  FROM activities lag
+--  WHERE lag.ts < a.ts
+--  ORDER BY ts ASC
+--  LIMIT 1
+--) q WHERE q.activity <> activity)
 UNION
 SELECT ts AS x
 , activity AS series
 , 1 AS y
 FROM activities a
 WHERE user = :user
-AND datetime(datetime(ts, 'localtime'), 'start of day') = :date
+AND datetime(datetime(ts, 'localtime'), 'start of day') = :start_of_day
 UNION
 SELECT COALESCE((
-  SELECT lag.ts
+  SELECT min(lag.ts, datetime(:end_of_day, 'utc'))
   FROM activities lag
   WHERE lag.ts > a.ts AND lag.activity <> a.activity
-  AND datetime(datetime(lag.ts, 'localtime'), 'start of day') = :date
-  ORDER BY ts ASC
+  --AND datetime(datetime(a.ts, 'localtime'), 'start of day') = :start_of_day
+  ORDER BY lag.ts ASC
   LIMIT 1
-), CURRENT_TIMESTAMP) AS x
+), min(CURRENT_TIMESTAMP, datetime(:end_of_day, 'utc'))) AS x
 , activity AS series
 , 1 AS y
 FROM activities a
 WHERE user = :user
-AND datetime(datetime(ts, 'localtime'), 'start of day') = :date
+AND datetime(datetime(ts, 'localtime'), 'start of day') = :start_of_day
 UNION
 SELECT COALESCE((
-  SELECT lag.ts
+  SELECT min(lag.ts, datetime(:end_of_day, 'utc'))
   FROM activities lag
   WHERE lag.ts > a.ts AND lag.activity <> a.activity
-  AND datetime(datetime(lag.ts, 'localtime'), 'start of day') = :date
-  ORDER BY ts ASC
+  --AND datetime(datetime(a.ts, 'localtime'), 'start of day') = :start_of_day
+  ORDER BY lag.ts ASC
   LIMIT 1
-), CURRENT_TIMESTAMP) AS x
+), min(CURRENT_TIMESTAMP, datetime(:end_of_day, 'utc'))) AS x
 , activity AS series
 , 2 AS y
 FROM activities a
 WHERE user = :user
-AND datetime(datetime(ts, 'localtime'), 'start of day') = :date
+AND datetime(datetime(ts, 'localtime'), 'start of day') = :start_of_day
 ) q
-ORDER BY x ASC, y ASC
+ORDER BY series, x ASC, y ASC
 ;

+ 1 - 1
activities/www/index.sql

@@ -39,7 +39,7 @@ SELECT 'datetime-local' AS type
 , 1 AS columns
 ;
 
-SELECT date(datetime(CURRENT_TIMESTAMP, '-'|| value ||'  days')) AS title
+SELECT date(datetime(CURRENT_TIMESTAMP, '-'|| value ||'  days'), 'localtime') AS title
 , '/activity/chart.sql'||
 '?user='||:user||
 '&date='|| REPLACE(datetime(CURRENT_TIMESTAMP, '-'|| value ||'  days'), ' ', '+') ||

+ 13 - 0
docker-compose.yml

@@ -1,4 +1,17 @@
 services:
+  activities:
+    image: lovasoa/sqlpage:latest
+    hostname: activities
+    volumes:
+      - /etc/timezone:/etc/timezone:ro
+      - /etc/localtime:/etc/localtime:ro
+      - ./activities/www/:/var/www/
+      - ./activities/sqlpage:/etc/sqlpage/
+      - ./activities/activities.db:/var/www/activities.db
+    networks:
+      - traefik
+    restart: always
+
   util-sqlpage:
     image: lovasoa/sqlpage
     hostname: util-sqlpage