Mercurial > urweb
annotate tests/tags.ur @ 2084:0d48cfb59b29
More aggressive inlining of 'let' with record literals, plus some changes to Monoization of queries, to make inlining more common
author | Adam Chlipala <adam@chlipala.net> |
---|---|
date | Thu, 04 Dec 2014 02:47:24 -0500 |
parents | 884673e5f7d5 |
children |
rev | line source |
---|---|
adam@2031 | 1 table images : { Id : int, Content : blob } |
adam@2031 | 2 table tags : { Id : int, Tag : string } |
adam@2031 | 3 |
adam@2031 | 4 datatype mode = Present | Absent |
adam@2031 | 5 type condition = { Tag : string, Mode : mode } |
adam@2031 | 6 |
adam@2031 | 7 type tag_query = sql_query [] [] [] [Id = int] |
adam@2031 | 8 |
adam@2031 | 9 fun addCondition (c : condition) (q : tag_query) : tag_query = |
adam@2031 | 10 case c.Mode of |
adam@2031 | 11 Present => (SELECT I.Id AS Id |
adam@2031 | 12 FROM ({{q}}) AS I |
adam@2031 | 13 JOIN tags ON tags.Id = I.Id AND tags.Tag = {[c.Tag]}) |
adam@2032 | 14 | Absent => (SELECT I.Id AS Id |
adam@2032 | 15 FROM ({{q}}) AS I |
adam@2032 | 16 LEFT JOIN tags ON tags.Id = I.Id AND tags.Tag = {[c.Tag]} |
adam@2032 | 17 WHERE tags.Tag IS NULL) |
adam@2031 | 18 |
adam@2031 | 19 fun withConditions (cs : list condition) : tag_query = |
adam@2031 | 20 List.foldl addCondition (SELECT images.Id AS Id FROM images) cs |
adam@2031 | 21 |
adam@2031 | 22 fun main (cs : list condition) : transaction page = |
adam@2031 | 23 x <- queryX (withConditions cs) (fn r => <xml><li>{[r.Id]}</li></xml>); |
adam@2031 | 24 return <xml><body> |
adam@2031 | 25 {x} |
adam@2031 | 26 </body></xml> |