summaryrefslogtreecommitdiffstats
path: root/docs/tutorials/tutorial-lib/formats/tutorial-lib/tutorial.sql
blob: 281335775325561eb8937ff090ab1f27d0a1a960 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
-- Tracks the current step in the tutorial
CREATE TABLE lnav_tutorial_step
(
    name TEXT    NOT NULL PRIMARY KEY,
    step INTEGER NOT NULL
);

INSERT INTO lnav_tutorial_step
    VALUES ('tutorial1', 1);

-- A description of each step in the tutorial with its achievements
CREATE TABLE lnav_tutorial_steps
(
    name         TEXT    NOT NULL,
    step         INTEGER NOT NULL,
    achievements TEXT    NOT NULL,
    PRIMARY KEY (name, step)
);

-- Tracks the progress through the achievements in a step of the tutorial
CREATE TABLE IF NOT EXISTS lnav_tutorial_progress
(
    name     TEXT    NOT NULL,
    step     INTEGER NOT NULL,
    achieved TEXT    NOT NULL,

    PRIMARY KEY (name, step, achieved)
);

CREATE TABLE IF NOT EXISTS lnav_tutorial_lines
(
    name        TEXT    NOT NULL,
    step        INTEGER NOT NULL,
    view_ptr    TEXT    NOT NULL,
    view_value  TEXT    NOT NULL,
    achievement TEXT    NOT NULL,
    log_comment TEXT
);

-- Copy the tutorial data from the markdown frontmatter to
-- the appropriate tables.
CREATE TRIGGER IF NOT EXISTS add_tutorial_data
    AFTER INSERT
    ON lnav_events
    WHEN jget(new.content, '/$schema') = 'https://lnav.org/event-file-format-detected-v1.schema.json' AND
         jget(new.content, '/format') = 'text/markdown'
BEGIN
    INSERT INTO lnav_tutorial_steps
    SELECT jget(tutorial_meta, '/name'),
           key + 1,
           value
        FROM (SELECT yaml_to_json(lnav_file_metadata.content) AS tutorial_meta
                  FROM lnav_file_metadata
                  WHERE filepath = jget(new.content, '/filename')) AS meta_content,
            json_each(jget(meta_content.tutorial_meta, '/steps'));

    REPLACE INTO lnav_tutorial_lines
    SELECT name,
           step,
           jget(value, '/view_ptr'),
           jget(value, '/view_value'),
           key,
           jget(value, '/comment')
        FROM lnav_tutorial_steps,
            json_each(achievements)
        WHERE jget(value, '/view_ptr') IS NOT NULL;

    REPLACE INTO lnav_user_notifications (id, views, message)
    SELECT *
        FROM lnav_tutorial_log_notification;
END;

CREATE TRIGGER IF NOT EXISTS tutorial_move_log_after_load
    AFTER INSERT
    ON lnav_events
    WHEN jget(new.content, '/$schema') = 'https://lnav.org/event-session-loaded-v1.schema.json'
BEGIN
    UPDATE lnav_views SET top = 0 WHERE name = 'log';
END;

CREATE TRIGGER IF NOT EXISTS lnav_tutorial_view_listener UPDATE OF top
    ON lnav_views_echo
    WHEN new.name = 'log'
BEGIN
    INSERT OR IGNORE INTO lnav_tutorial_progress
    SELECT lnav_tutorial_lines.name,
           lnav_tutorial_lines.step,
           achievement
        FROM lnav_tutorial_step,
             lnav_tutorial_lines
        WHERE lnav_tutorial_step.step = lnav_tutorial_lines.step
          AND jget(json_object('top', new.top,
                               'left', new.left,
                               'search', new.search),
                   view_ptr) = view_value;
    UPDATE all_logs
    SET log_comment = (SELECT log_comment
                           FROM lnav_tutorial_step,
                                lnav_tutorial_lines
                           WHERE lnav_tutorial_step.step = lnav_tutorial_lines.step
                             AND lnav_tutorial_lines.log_comment IS NOT NULL
                             AND jget(json_object('top', new.top,
                                                  'left', new.left,
                                                  'search', new.search), view_ptr) = view_value)
        WHERE log_line = new.top
          AND log_comment IS NULL;
END;

CREATE TABLE lnav_tutorial_message
(
    msgid INTEGER PRIMARY KEY,
    msg   TEXT
);

CREATE VIEW lnav_tutorial_current_achievements AS
SELECT key AS achievement, value
    FROM lnav_tutorial_step,
         lnav_tutorial_steps, json_each(lnav_tutorial_steps.achievements)
    WHERE lnav_tutorial_step.step = lnav_tutorial_steps.step;

CREATE VIEW lnav_tutorial_current_progress AS
SELECT achieved
    FROM lnav_tutorial_step,
         lnav_tutorial_progress
    WHERE lnav_tutorial_step.step = lnav_tutorial_progress.step;

CREATE VIEW lnav_tutorial_remaining_achievements AS
SELECT *
    FROM lnav_tutorial_current_achievements
    WHERE achievement NOT IN (SELECT * FROM lnav_tutorial_current_progress);

CREATE VIEW lnav_tutorial_log_notification AS
SELECT *
    FROM (SELECT 'org.lnav.tutorial.log' AS id, '["log"]' AS views, jget(value, '/notification') AS message
              FROM lnav_tutorial_remaining_achievements
          UNION ALL
          SELECT 'org.lnav.tutorial.log'                            AS id,
                 '["log"]'                                          AS views,
                 'Press `y` to go to the next step in the tutorial' AS message)
    LIMIT 1;

CREATE TRIGGER IF NOT EXISTS lnav_tutorial_progress_listener
    AFTER INSERT
    ON lnav_tutorial_progress
BEGIN
    DELETE FROM lnav_user_notifications WHERE id = 'org.lnav.tutorial.log';
    REPLACE INTO lnav_user_notifications (id, views, message)
    SELECT *
        FROM lnav_tutorial_log_notification;
END;

REPLACE INTO lnav_user_notifications (id, views, message)
    VALUES ('org.lnav.tutorial.text', '["text"]', 'Press `q` to go to the log view')