datanotes 3.1.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/api/index.cjs +175 -8
  2. package/dist/api/index.js +175 -8
  3. package/dist/api/mcp.cjs +175 -8
  4. package/dist/api/mcp.js +175 -8
  5. package/dist/datanotes.cjs +591 -139
  6. package/dist/docs/api/operations/add_column.md +1 -0
  7. package/dist/docs/api/operations/add_constraint.md +2 -0
  8. package/dist/docs/api/operations/alter_column.md +1 -1
  9. package/dist/docs/api/operations/alter_table.md +3 -2
  10. package/dist/docs/api/operations/check_table.md +1 -1
  11. package/dist/docs/api/operations/create_table.md +3 -1
  12. package/dist/docs/api/operations/describe_table.md +1 -1
  13. package/dist/docs/api/operations/insert_row.md +2 -2
  14. package/dist/docs/api/operations/tags/rows-dml.md +1 -1
  15. package/dist/docs/api.md +2 -2
  16. package/dist/docs/guides/data-quality/check-constraints.md +14 -13
  17. package/dist/docs/guides/data-quality/hand-edits.md +10 -10
  18. package/dist/docs/guides/database-objects/bases.md +11 -11
  19. package/dist/docs/guides/database-objects/catalogs-and-schemas.md +16 -10
  20. package/dist/docs/guides/database-objects/columns.md +38 -38
  21. package/dist/docs/guides/database-objects/relations.md +173 -36
  22. package/dist/docs/guides/database-objects/tables.md +80 -35
  23. package/dist/docs/guides/database-objects/views.md +44 -44
  24. package/dist/docs/guides/history/change-data-feed.md +34 -34
  25. package/dist/docs/guides/history/journal-and-undo.md +12 -12
  26. package/dist/docs/guides/history/restore.md +20 -20
  27. package/dist/docs/guides/history/table-history.md +31 -31
  28. package/dist/docs/guides/read-and-write/automatic-links.md +15 -15
  29. package/dist/docs/guides/read-and-write/import-notes.md +21 -21
  30. package/dist/docs/guides/read-and-write/joins-and-aggregates.md +7 -7
  31. package/dist/docs/guides/read-and-write/read-and-filter.md +10 -10
  32. package/dist/docs/guides/read-and-write/write-rows.md +10 -10
  33. package/dist/docs/guides/search/text.md +1 -1
  34. package/dist/docs/reference/cli.md +1 -1
  35. package/dist/docs/reference/errors.md +1 -1
  36. package/dist/docs/reference/operations/auxiliary.md +2 -2
  37. package/dist/docs/reference/operations/rows.md +1 -1
  38. package/dist/docs/reference/operations/schema.md +15 -11
  39. package/dist/docs/reference/operations.md +28 -28
  40. package/dist/docs/release-notes.md +24 -0
  41. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  # Relations and hierarchies
2
2
 
3
- > Link rows to rows of other tables, keep two-way links in step, take allowed values from a table, build trees and limit link targets.
3
+ > Link rows to rows of other tables, keep two-way links in step, take allowed values from a table, build trees, keep dependencies free of cycles and limit link targets.
4
4
 
5
5
  A link column holds a wikilink to a note, such as `[[Charade]]`, and `ref` names the table that note must be a row of. The link points to a row of the other table, and you reach that row’s columns through the link.
6
6
 
@@ -56,7 +56,7 @@ Answer:
56
56
  "op": "create_table",
57
57
  "planned_texts": ["datanotes/metastore.yaml"],
58
58
  "commits": [{ "table": "main.public.watch", "version": 0, "operation": "CREATE TABLE" }],
59
- "migration_id": "20261014T191519-create_table-create-table-main-public-watch"
59
+ "migration_id": "20261019T040640-create_table-create-table-main-public-watch"
60
60
  }
61
61
  ```
62
62
 
@@ -85,7 +85,7 @@ Answer:
85
85
  "files_created": 1,
86
86
  "planned_creates": ["datanotes/main/public/watch/2026-03-14T2030.md"],
87
87
  "commits": [{ "table": "main.public.watch", "version": 1, "operation": "WRITE" }],
88
- "migration_id": "20261014T191519-insert_row-insert-into-watch"
88
+ "migration_id": "20261019T040640-insert_row-insert-into-watch"
89
89
  }
90
90
  ```
91
91
 
@@ -94,7 +94,7 @@ Answer:
94
94
  ```markdown
95
95
  ---
96
96
  table: main.public.watch
97
- id: 01a13bd7-29c4-790f-bb11-5bcb70ba79cf
97
+ id: 01a15257-1334-78ef-a884-7dec625383fb
98
98
  film: "[[His Girl Friday]]"
99
99
  where: cinema
100
100
  place: the film club downtown
@@ -189,7 +189,7 @@ Answer:
189
189
  "op": "add_column",
190
190
  "planned_texts": ["datanotes/metastore.yaml"],
191
191
  "commits": [{ "table": "main.public.actor", "version": 4, "operation": "ADD COLUMNS" }],
192
- "migration_id": "20261014T191519-add_column-add-column-films-to-actor"
192
+ "migration_id": "20261019T040640-add_column-add-column-films-to-actor"
193
193
  }
194
194
  ```
195
195
 
@@ -217,7 +217,7 @@ Answer:
217
217
  "op": "add_column",
218
218
  "planned_texts": ["datanotes/metastore.yaml"],
219
219
  "commits": [{ "table": "main.public.film", "version": 4, "operation": "ADD COLUMNS" }],
220
- "migration_id": "20261014T191519-add_column-add-column-cast-to-film"
220
+ "migration_id": "20261019T040640-add_column-add-column-cast-to-film"
221
221
  }
222
222
  ```
223
223
 
@@ -259,7 +259,7 @@ Answer:
259
259
  { "table": "main.public.actor", "version": 5, "operation": "UPDATE" },
260
260
  { "table": "main.public.film", "version": 5, "operation": "UPDATE" }
261
261
  ],
262
- "migration_id": "20261014T191519-update_row-update-film"
262
+ "migration_id": "20261019T040640-update_row-update-film"
263
263
  }
264
264
  ```
265
265
 
@@ -268,7 +268,7 @@ Answer:
268
268
  ```markdown
269
269
  ---
270
270
  table: main.public.film
271
- id: 01a13bd7-299b-7edc-b1ed-cf26ab668970
271
+ id: 01a15257-1318-7711-9b6a-1133ed5ade2a
272
272
  title: Charade
273
273
  year: 1963
274
274
  minutes: 113
@@ -291,7 +291,7 @@ Answer:
291
291
  ```markdown
292
292
  ---
293
293
  table: main.public.actor
294
- id: 01a13bd7-294c-784d-8436-19760ff440a9
294
+ id: 01a15257-12f4-74ff-9c67-ad018a33f0ad
295
295
  name: Cary Grant
296
296
  born: 1904-01-18
297
297
  films:
@@ -359,7 +359,7 @@ Answer:
359
359
  {
360
360
  "path": "datanotes/main/public/actor/Cary Grant.md",
361
361
  "table": "main.public.actor",
362
- "id": "01a13bd7-294c-784d-8436-19760ff440a9",
362
+ "id": "01a15257-12f4-74ff-9c67-ad018a33f0ad",
363
363
  "name": "Cary Grant",
364
364
  "born": "1904-01-18",
365
365
  "films": ["[[Charade]]", "[[His Girl Friday]]"]
@@ -367,7 +367,7 @@ Answer:
367
367
  {
368
368
  "path": "datanotes/main/public/actor/Audrey Hepburn.md",
369
369
  "table": "main.public.actor",
370
- "id": "01a13bd7-2978-7561-9e4e-769c1a55fe6e",
370
+ "id": "01a15257-1302-766a-9b85-dcc175445424",
371
371
  "name": "Audrey Hepburn",
372
372
  "born": "1929-05-04",
373
373
  "films": ["[[Charade]]"]
@@ -423,7 +423,7 @@ Answer:
423
423
  "op": "alter_column",
424
424
  "planned_texts": ["datanotes/metastore.yaml"],
425
425
  "commits": [{ "table": "main.public.film", "version": 9, "operation": "CHANGE COLUMN" }],
426
- "migration_id": "20261014T191519-alter_column-alter-column-see_also-in-film"
426
+ "migration_id": "20261019T040640-alter_column-alter-column-see_also-in-film"
427
427
  }
428
428
  ```
429
429
 
@@ -479,7 +479,7 @@ Answer:
479
479
  "commits": [
480
480
  { "table": "main.public.film", "version": 10, "operation": "ALIGN RELATIONS" }
481
481
  ],
482
- "migration_id": "20261014T191519-align_relations-align-inverse-links-of-main-pu"
482
+ "migration_id": "20261019T040640-align_relations-align-inverse-links-of-main-pu"
483
483
  }
484
484
  ```
485
485
 
@@ -573,7 +573,7 @@ Answer:
573
573
  "op": "add_column",
574
574
  "planned_texts": ["datanotes/metastore.yaml"],
575
575
  "commits": [{ "table": "main.public.film", "version": 11, "operation": "ADD COLUMNS" }],
576
- "migration_id": "20261014T191519-add_column-add-column-tags-to-film"
576
+ "migration_id": "20261019T040640-add_column-add-column-tags-to-film"
577
577
  }
578
578
  ```
579
579
 
@@ -629,7 +629,7 @@ Answer:
629
629
  }
630
630
  ],
631
631
  "commits": [{ "table": "main.public.film", "version": 12, "operation": "UPDATE" }],
632
- "migration_id": "20261014T191519-update_row-update-film-4"
632
+ "migration_id": "20261019T040640-update_row-update-film-4"
633
633
  }
634
634
  ```
635
635
 
@@ -677,7 +677,7 @@ Answer:
677
677
  "op": "create_table",
678
678
  "planned_texts": ["datanotes/metastore.yaml"],
679
679
  "commits": [{ "table": "main.public.genre", "version": 0, "operation": "CREATE TABLE" }],
680
- "migration_id": "20261014T191519-create_table-create-table-main-public-genre"
680
+ "migration_id": "20261019T040640-create_table-create-table-main-public-genre"
681
681
  }
682
682
  ```
683
683
 
@@ -753,10 +753,130 @@ Refused:
753
753
  ```text
754
754
  update_row refused — nothing was written:
755
755
  invalid datanotes/main/public/genre/Cinema.md: parent would make "Cinema" its own ancestor (Cinema → Screwball comedy → Sound film → Cinema)
756
- Hint: A row cannot be its own ancestor: point the hierarchy column to a row that is not below this one. Then call update_row again (dry_run: true checks without writing).
756
+ Hint: A row cannot be its own ancestor in a hierarchy column, nor depend on itself through an acyclic column: the message shows the path. Point the column to a row that is not on that path. Then call update_row again (dry_run: true checks without writing).
757
757
  Docs: https://datanotes.dev/guides/database-objects/relations.md#build-a-tree-of-rows-with-a-parent-link (offline: read_docs("guides/database-objects/relations#build-a-tree-of-rows-with-a-parent-link"))
758
758
  ```
759
759
 
760
+ ## Keep dependencies free of cycles with `acyclic`
761
+
762
+ `acyclic: true` keeps the links of a column free of cycles. It works on a link, or a list of links, to the same table (`ref: self`). Here `watch_after` lists the films to watch first, and `watch_before` is its inverse.
763
+
764
+ The engine refuses a write that closes a cycle:
765
+
766
+ * **Through the column**: a film can’t wait for a film that already waits for it
767
+ * **Through the inverse**: `watch_before` adds the matching `watch_after` link, and the engine checks that link too
768
+ * **On existing rows**: `alter_column` refuses `acyclic: true` while rows already form a cycle, and lists them
769
+
770
+ `hierarchy` refuses cycles too, but takes one parent per row. `acyclic` takes any number of links.
771
+
772
+ **`add_column`**
773
+
774
+ ```json
775
+ {
776
+ "table": "film",
777
+ "column": {
778
+ "name": "watch_after",
779
+ "type": "list",
780
+ "items": "link",
781
+ "ref": "self",
782
+ "acyclic": true,
783
+ "description": "Films to watch before this one"
784
+ }
785
+ }
786
+ ```
787
+
788
+ Answer:
789
+
790
+ ```json
791
+ {
792
+ "ok": true,
793
+ "op": "add_column",
794
+ "planned_texts": ["datanotes/metastore.yaml"],
795
+ "commits": [{ "table": "main.public.film", "version": 13, "operation": "ADD COLUMNS" }],
796
+ "migration_id": "20261019T040640-add_column-add-column-watch_after-to-film"
797
+ }
798
+ ```
799
+
800
+ **`add_column`**
801
+
802
+ ```json
803
+ {
804
+ "table": "film",
805
+ "column": {
806
+ "name": "watch_before",
807
+ "type": "list",
808
+ "items": "link",
809
+ "ref": "self",
810
+ "inverse": "watch_after",
811
+ "description": "Films to watch after this one"
812
+ }
813
+ }
814
+ ```
815
+
816
+ **`update_row`**
817
+
818
+ ```json
819
+ {
820
+ "table": "film",
821
+ "path": "datanotes/main/public/film/Night of the Living Dead.md",
822
+ "set": { "watch_after": ["[[Charade]]"] }
823
+ }
824
+ ```
825
+
826
+ **`update_row`**
827
+
828
+ ```json
829
+ {
830
+ "table": "film",
831
+ "path": "datanotes/main/public/film/Charade.md",
832
+ "set": { "watch_after": ["[[His Girl Friday]]"] }
833
+ }
834
+ ```
835
+
836
+ His Girl Friday can’t wait for Night of the Living Dead, which waits for it through Charade:
837
+
838
+ **`update_row`**
839
+
840
+ ```json
841
+ {
842
+ "table": "film",
843
+ "path": "datanotes/main/public/film/His Girl Friday.md",
844
+ "set": { "watch_after": ["[[Night of the Living Dead]]"] }
845
+ }
846
+ ```
847
+
848
+ Refused:
849
+
850
+ ```text
851
+ update_row refused — nothing was written:
852
+ invalid datanotes/main/public/film/His Girl Friday.md: watch_after would close a cycle in "watch_after" (His Girl Friday → Night of the Living Dead → Charade → His Girl Friday)
853
+ invalid datanotes/main/public/film/Night of the Living Dead.md: watch_after would close a cycle in "watch_after" (Night of the Living Dead → Charade → His Girl Friday → Night of the Living Dead)
854
+ Hint: A row cannot depend on itself through an acyclic column: the message shows the cycle. Remove one of its links, or link to a row that is not on it; check_table lists the cycles already there. Then call update_row again (dry_run: true checks without writing).
855
+ Docs: https://datanotes.dev/guides/database-objects/relations.md#keep-dependencies-free-of-cycles-with-acyclic (offline: read_docs("guides/database-objects/relations#keep-dependencies-free-of-cycles-with-acyclic"))
856
+ ```
857
+
858
+ Setting the inverse closes the same cycle, so the engine refuses it too:
859
+
860
+ **`update_row`**
861
+
862
+ ```json
863
+ {
864
+ "table": "film",
865
+ "path": "datanotes/main/public/film/Night of the Living Dead.md",
866
+ "set": { "watch_before": ["[[His Girl Friday]]"] }
867
+ }
868
+ ```
869
+
870
+ Refused:
871
+
872
+ ```text
873
+ update_row refused — nothing was written:
874
+ invalid datanotes/main/public/film/His Girl Friday.md: watch_after would close a cycle in "watch_after" (His Girl Friday → Night of the Living Dead → Charade → His Girl Friday)
875
+ invalid datanotes/main/public/film/Night of the Living Dead.md: watch_after would close a cycle in "watch_after" (Night of the Living Dead → Charade → His Girl Friday → Night of the Living Dead)
876
+ Hint: A row cannot depend on itself through an acyclic column: the message shows the cycle. Remove one of its links, or link to a row that is not on it; check_table lists the cycles already there. Then call update_row again (dry_run: true checks without writing).
877
+ Docs: https://datanotes.dev/guides/database-objects/relations.md#keep-dependencies-free-of-cycles-with-acyclic (offline: read_docs("guides/database-objects/relations#keep-dependencies-free-of-cycles-with-acyclic"))
878
+ ```
879
+
760
880
  ## Limit link targets with `ref_by` and `ref_where`
761
881
 
762
882
  A link column can limit which rows it points to, without a CHECK. `ref_by` reads a column of the row itself. With `levels: [cinema, era, genre]`, Cinema has no parent, an era’s parent must be Cinema, and a genre’s parent must be an era.
@@ -787,7 +907,7 @@ Answer:
787
907
  "commits": [
788
908
  { "table": "main.public.genre", "version": 10, "operation": "CHANGE COLUMN" }
789
909
  ],
790
- "migration_id": "20261014T191521-alter_column-alter-column-parent-in-genre"
910
+ "migration_id": "20261019T040642-alter_column-alter-column-parent-in-genre"
791
911
  }
792
912
  ```
793
913
 
@@ -944,8 +1064,8 @@ Answer:
944
1064
  "ok": true,
945
1065
  "op": "add_column",
946
1066
  "planned_texts": ["datanotes/metastore.yaml"],
947
- "commits": [{ "table": "main.public.film", "version": 13, "operation": "ADD COLUMNS" }],
948
- "migration_id": "20261014T191521-add_column-add-column-genre-to-film"
1067
+ "commits": [{ "table": "main.public.film", "version": 17, "operation": "ADD COLUMNS" }],
1068
+ "migration_id": "20261019T040642-add_column-add-column-genre-to-film"
949
1069
  }
950
1070
  ```
951
1071
 
@@ -1027,7 +1147,7 @@ Answer:
1027
1147
  "op": "add_column",
1028
1148
  "planned_texts": ["datanotes/metastore.yaml"],
1029
1149
  "commits": [{ "table": "main.public.watch", "version": 3, "operation": "ADD COLUMNS" }],
1030
- "migration_id": "20261014T191521-add_column-add-column-on_day-to-watch"
1150
+ "migration_id": "20261019T040642-add_column-add-column-on_day-to-watch"
1031
1151
  }
1032
1152
  ```
1033
1153
 
@@ -1056,7 +1176,7 @@ Answer:
1056
1176
  "files_created": 1,
1057
1177
  "planned_creates": ["datanotes/main/public/watch/2026-10-31T2300.md"],
1058
1178
  "commits": [{ "table": "main.public.watch", "version": 4, "operation": "WRITE" }],
1059
- "migration_id": "20261014T191521-insert_row-insert-into-watch"
1179
+ "migration_id": "20261019T040642-insert_row-insert-into-watch"
1060
1180
  }
1061
1181
  ```
1062
1182
 
@@ -1065,7 +1185,7 @@ Answer:
1065
1185
  ```markdown
1066
1186
  ---
1067
1187
  table: main.public.watch
1068
- id: 01a13bd7-31d3-73b7-b24a-735b30d93502
1188
+ id: 01a15257-1c26-7cdc-8409-61767eceb696
1069
1189
  film: "[[Night of the Living Dead]]"
1070
1190
  where: cinema
1071
1191
  place: the film club downtown
@@ -1094,7 +1214,7 @@ Refused:
1094
1214
 
1095
1215
  ```text
1096
1216
  delete_rows refused — nothing was written:
1097
- conflict datanotes/main/public/film/Charade.md: referenced by datanotes/main/public/actor/Audrey Hepburn.md, datanotes/main/public/actor/Cary Grant.md, datanotes/main/public/film/His Girl Friday.md, datanotes/main/public/watch/2026-09-26T2130.md
1217
+ conflict datanotes/main/public/film/Charade.md: referenced by datanotes/main/public/actor/Audrey Hepburn.md, datanotes/main/public/actor/Cary Grant.md, datanotes/main/public/film/His Girl Friday.md, datanotes/main/public/film/Night of the Living Dead.md, datanotes/main/public/watch/2026-09-26T2130.md
1098
1218
  Hint: Other rows link to it: pass on_referenced ("set_null" or "ignore"), or change those rows first.
1099
1219
  Docs: https://datanotes.dev/guides/database-objects/relations.md#delete-a-row-that-other-notes-link-to (offline: read_docs("guides/database-objects/relations#delete-a-row-that-other-notes-link-to"))
1100
1220
  ```
@@ -1135,20 +1255,20 @@ Delete the viewing and the film together with `batch`. The viewing goes first, t
1135
1255
  }
1136
1256
  ```
1137
1257
 
1138
- Answer (72 lines)
1258
+ Answer (77 lines)
1139
1259
 
1140
1260
  ```json
1141
1261
  {
1142
1262
  "ok": true,
1143
1263
  "op": "batch",
1144
1264
  "dry_run": false,
1145
- "migration_id": "20261014T191521-batch-remove-charade-and-its-viewing",
1265
+ "migration_id": "20261019T040643-batch-remove-charade-and-its-viewing",
1146
1266
  "steps": [
1147
1267
  {
1148
1268
  "index": 0,
1149
1269
  "op": "delete_rows",
1150
1270
  "ok": true,
1151
- "migration_id": "20261014T191521-delete_rows-archive-1-rows-of-watch",
1271
+ "migration_id": "20261019T040643-delete_rows-archive-1-rows-of-watch",
1152
1272
  "result": {
1153
1273
  "ok": true,
1154
1274
  "op": "delete_rows",
@@ -1160,18 +1280,18 @@ Answer (72 lines)
1160
1280
  }
1161
1281
  ],
1162
1282
  "commits": [{ "table": "main.public.watch", "version": 5, "operation": "DELETE" }],
1163
- "migration_id": "20261014T191521-delete_rows-archive-1-rows-of-watch"
1283
+ "migration_id": "20261019T040643-delete_rows-archive-1-rows-of-watch"
1164
1284
  }
1165
1285
  },
1166
1286
  {
1167
1287
  "index": 1,
1168
1288
  "op": "delete_rows",
1169
1289
  "ok": true,
1170
- "migration_id": "20261014T191521-delete_rows-archive-1-rows-of-film",
1290
+ "migration_id": "20261019T040643-delete_rows-archive-1-rows-of-film",
1171
1291
  "result": {
1172
1292
  "ok": true,
1173
1293
  "op": "delete_rows",
1174
- "notes_changed": 4,
1294
+ "notes_changed": 5,
1175
1295
  "files_moved": 1,
1176
1296
  "planned_edits": [
1177
1297
  {
@@ -1186,7 +1306,12 @@ Answer (72 lines)
1186
1306
  },
1187
1307
  {
1188
1308
  "path": "datanotes/main/public/film/His Girl Friday.md",
1189
- "set": { "see_also": [] },
1309
+ "set": { "see_also": [], "watch_before": [] },
1310
+ "remove": []
1311
+ },
1312
+ {
1313
+ "path": "datanotes/main/public/film/Night of the Living Dead.md",
1314
+ "set": { "watch_after": [] },
1190
1315
  "remove": []
1191
1316
  },
1192
1317
  {
@@ -1203,9 +1328,9 @@ Answer (72 lines)
1203
1328
  ],
1204
1329
  "commits": [
1205
1330
  { "table": "main.public.actor", "version": 7, "operation": "DELETE" },
1206
- { "table": "main.public.film", "version": 14, "operation": "DELETE" }
1331
+ { "table": "main.public.film", "version": 18, "operation": "DELETE" }
1207
1332
  ],
1208
- "migration_id": "20261014T191521-delete_rows-archive-1-rows-of-film"
1333
+ "migration_id": "20261019T040643-delete_rows-archive-1-rows-of-film"
1209
1334
  }
1210
1335
  }
1211
1336
  ]
@@ -1223,7 +1348,7 @@ Answer:
1223
1348
  ```markdown
1224
1349
  ---
1225
1350
  table: main.public.actor
1226
- id: 01a13bd7-294c-784d-8436-19760ff440a9
1351
+ id: 01a15257-12f4-74ff-9c67-ad018a33f0ad
1227
1352
  name: Cary Grant
1228
1353
  born: 1904-01-18
1229
1354
  films:
@@ -1237,7 +1362,7 @@ The engine wrote this file with the relations from this page:
1237
1362
 
1238
1363
  * **Link columns**: each with its `ref`, and `self` kept as written
1239
1364
  * **`inverse`**: on one side only
1240
- * **`vocabulary`, `hierarchy` and `ref_where`**: as declared
1365
+ * **`vocabulary`, `hierarchy`, `acyclic` and `ref_where`**: as declared
1241
1366
  * **`ref_by`**: with the `levels` shortcut kept as written
1242
1367
  * **Generated link**: the `on_day` column with its template
1243
1368
 
@@ -1245,7 +1370,7 @@ The engine wrote this file with the relations from this page:
1245
1370
 
1246
1371
  ```yaml
1247
1372
  # Metastore (Datanotes): catalogs, schemas, tables, columns, views.
1248
- id: 01a13bd7-28e9-7fae-aac4-f73856dcd3a3
1373
+ id: 01a15257-12e1-7b62-b27c-c29567a21bea
1249
1374
  config:
1250
1375
  history: true
1251
1376
 
@@ -1323,6 +1448,18 @@ catalogs:
1323
1448
  items: string
1324
1449
  description: My tags for the film, from the tag table
1325
1450
  vocabulary: main.public.tag
1451
+ - name: watch_after
1452
+ type: list
1453
+ items: link
1454
+ ref: self
1455
+ description: Films to watch before this one
1456
+ acyclic: true
1457
+ - name: watch_before
1458
+ type: list
1459
+ items: link
1460
+ ref: self
1461
+ description: Films to watch after this one
1462
+ inverse: watch_after
1326
1463
  - name: genre
1327
1464
  type: link
1328
1465
  ref: main.public.genre