|
@@ -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
|
|
|
;
|