diff tests/tags.ur @ 2031:d11a7a9c4a73

New syntactic shorthand for antiquoting subqueries
author Adam Chlipala <adam@chlipala.net>
date Wed, 25 Jun 2014 14:04:13 -0400
parents
children 884673e5f7d5
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/tags.ur	Wed Jun 25 14:04:13 2014 -0400
@@ -0,0 +1,23 @@
+table images : { Id : int, Content : blob }
+table tags : { Id : int, Tag : string }
+
+datatype mode = Present | Absent
+type condition = { Tag : string, Mode : mode }
+
+type tag_query = sql_query [] [] [] [Id = int]
+
+fun addCondition (c : condition) (q : tag_query) : tag_query =
+    case c.Mode of
+        Present => (SELECT I.Id AS Id
+                    FROM ({{q}}) AS I
+                      JOIN tags ON tags.Id = I.Id AND tags.Tag = {[c.Tag]})
+      | Absent => q
+
+fun withConditions (cs : list condition) : tag_query =
+    List.foldl addCondition (SELECT images.Id AS Id FROM images) cs
+
+fun main (cs : list condition) : transaction page =
+    x <- queryX (withConditions cs) (fn r => <xml><li>{[r.Id]}</li></xml>);
+    return <xml><body>
+      {x}
+    </body></xml>