This file is indexed.

/usr/share/doc/libghc-haskelldb-doc/html/src/Database-HaskellDB-Query.html is in libghc-haskelldb-doc 2.2.2-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://code.haskell.org/~malcolm/hscolour/ -->
<title>src/Database/HaskellDB/Query.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances
<a name="line-2"></a>  , FlexibleContexts, UndecidableInstances
<a name="line-3"></a>  , TypeSynonymInstances #-}</span>
<a name="line-4"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-5"></a><span class='hs-comment'>-- |</span>
<a name="line-6"></a><span class='hs-comment'>-- Module      :  Query</span>
<a name="line-7"></a><span class='hs-comment'>-- Copyright   :  Daan Leijen (c) 1999, daan@cs.uu.nl</span>
<a name="line-8"></a><span class='hs-comment'>--                HWT Group (c) 2003, haskelldb-users@lists.sourceforge.net</span>
<a name="line-9"></a><span class='hs-comment'>-- License     :  BSD-style</span>
<a name="line-10"></a><span class='hs-comment'>-- </span>
<a name="line-11"></a><span class='hs-comment'>-- Maintainer  :  haskelldb-users@lists.sourceforge.net</span>
<a name="line-12"></a><span class='hs-comment'>-- Stability   :  experimental</span>
<a name="line-13"></a><span class='hs-comment'>-- Portability :  non portable</span>
<a name="line-14"></a><span class='hs-comment'>-- </span>
<a name="line-15"></a><span class='hs-comment'>-- Basic combinators for building type-safe queries.</span>
<a name="line-16"></a><span class='hs-comment'>-- The Query monad constructs a relational expression</span>
<a name="line-17"></a><span class='hs-comment'>-- ('PrimQuery'). </span>
<a name="line-18"></a><span class='hs-comment'>--</span>
<a name="line-19"></a><span class='hs-comment'>-- </span>
<a name="line-20"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-21"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Database</span><span class='hs-varop'>.</span><span class='hs-conid'>HaskellDB</span><span class='hs-varop'>.</span><span class='hs-conid'>Query</span> <span class='hs-layout'>(</span>
<a name="line-22"></a>	      <span class='hs-comment'>-- * Data and class declarations</span>
<a name="line-23"></a>	     <span class='hs-conid'>Rel</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>Attr</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>Table</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>Query</span><span class='hs-layout'>,</span> <span class='hs-conid'>Expr</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>OrderExpr</span>
<a name="line-24"></a>	     <span class='hs-layout'>,</span> <span class='hs-conid'>ToPrimExprs</span><span class='hs-layout'>,</span> <span class='hs-conid'>ConstantRecord</span>
<a name="line-25"></a>	     <span class='hs-layout'>,</span> <span class='hs-conid'>ShowConstant</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>ExprC</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>ProjectExpr</span><span class='hs-layout'>,</span> <span class='hs-conid'>ProjectRec</span><span class='hs-layout'>,</span> <span class='hs-conid'>InsertRec</span>
<a name="line-26"></a>	     <span class='hs-layout'>,</span> <span class='hs-conid'>ExprAggr</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>ExprDefault</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>
<a name="line-27"></a>	     <span class='hs-layout'>,</span> <span class='hs-varid'>copy</span><span class='hs-layout'>,</span> <span class='hs-varid'>copyAll</span><span class='hs-layout'>,</span> <span class='hs-conid'>RelToRec</span>
<a name="line-28"></a>	      <span class='hs-comment'>-- * Operators</span>
<a name="line-29"></a>	     <span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>.==.</span><span class='hs-layout'>)</span> <span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>.&lt;&gt;.</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>.&lt;.</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>.&lt;=.</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>.&gt;.</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>.&gt;=.</span><span class='hs-layout'>)</span>
<a name="line-30"></a>	     <span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>.&amp;&amp;.</span><span class='hs-layout'>)</span> <span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>.||.</span><span class='hs-layout'>)</span>
<a name="line-31"></a>	     <span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>.*.</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>./.</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>.+.</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>.-.</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>.%.</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>.++.</span><span class='hs-layout'>)</span>
<a name="line-32"></a>             <span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>&lt;&lt;</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>&lt;&lt;-</span><span class='hs-layout'>)</span>
<a name="line-33"></a>	      <span class='hs-comment'>-- * Function declarations</span>
<a name="line-34"></a>	     <span class='hs-layout'>,</span> <span class='hs-varid'>project</span><span class='hs-layout'>,</span> <span class='hs-varid'>restrict</span><span class='hs-layout'>,</span> <span class='hs-varid'>table</span><span class='hs-layout'>,</span> <span class='hs-varid'>unique</span>
<a name="line-35"></a>	     <span class='hs-layout'>,</span> <span class='hs-varid'>union</span><span class='hs-layout'>,</span> <span class='hs-varid'>intersect</span><span class='hs-layout'>,</span> <span class='hs-varid'>divide</span><span class='hs-layout'>,</span> <span class='hs-varid'>minus</span>
<a name="line-36"></a>	     <span class='hs-layout'>,</span> <span class='hs-sel'>_not</span><span class='hs-layout'>,</span> <span class='hs-varid'>like</span><span class='hs-layout'>,</span> <span class='hs-sel'>_in</span><span class='hs-layout'>,</span> <span class='hs-varid'>cat</span><span class='hs-layout'>,</span> <span class='hs-sel'>_length</span>
<a name="line-37"></a>	     <span class='hs-layout'>,</span> <span class='hs-varid'>isNull</span><span class='hs-layout'>,</span> <span class='hs-varid'>notNull</span>
<a name="line-38"></a>	     <span class='hs-layout'>,</span> <span class='hs-varid'>fromNull</span><span class='hs-layout'>,</span> <span class='hs-varid'>fromVal</span>
<a name="line-39"></a>	     <span class='hs-layout'>,</span> <span class='hs-varid'>constant</span><span class='hs-layout'>,</span> <span class='hs-varid'>constVal</span><span class='hs-layout'>,</span> <span class='hs-varid'>constNull</span><span class='hs-layout'>,</span> <span class='hs-varid'>constExpr</span>
<a name="line-40"></a>	     <span class='hs-layout'>,</span> <span class='hs-varid'>param</span><span class='hs-layout'>,</span> <span class='hs-varid'>namedParam</span><span class='hs-layout'>,</span> <span class='hs-conid'>Args</span><span class='hs-layout'>,</span> <span class='hs-varid'>func</span><span class='hs-layout'>,</span> <span class='hs-varid'>cast</span>
<a name="line-41"></a>	     <span class='hs-layout'>,</span> <span class='hs-varid'>toStr</span><span class='hs-layout'>,</span> <span class='hs-varid'>coerce</span> <span class='hs-layout'>,</span> <span class='hs-varid'>select</span>
<a name="line-42"></a>	     <span class='hs-layout'>,</span> <span class='hs-varid'>count</span><span class='hs-layout'>,</span> <span class='hs-sel'>_sum</span><span class='hs-layout'>,</span> <span class='hs-sel'>_max</span><span class='hs-layout'>,</span> <span class='hs-sel'>_min</span><span class='hs-layout'>,</span> <span class='hs-varid'>avg</span> <span class='hs-layout'>,</span> <span class='hs-varid'>literal</span>
<a name="line-43"></a>	     <span class='hs-layout'>,</span> <span class='hs-varid'>stddev</span><span class='hs-layout'>,</span> <span class='hs-varid'>stddevP</span><span class='hs-layout'>,</span> <span class='hs-varid'>variance</span><span class='hs-layout'>,</span> <span class='hs-varid'>varianceP</span>
<a name="line-44"></a>	     <span class='hs-layout'>,</span> <span class='hs-varid'>asc</span><span class='hs-layout'>,</span> <span class='hs-varid'>desc</span><span class='hs-layout'>,</span> <span class='hs-varid'>order</span> <span class='hs-layout'>,</span> <span class='hs-varid'>top</span>
<a name="line-45"></a>	     <span class='hs-layout'>,</span> <span class='hs-sel'>_case</span> <span class='hs-layout'>,</span> <span class='hs-sel'>_default</span>
<a name="line-46"></a>	     <span class='hs-comment'>-- * Internals</span>
<a name="line-47"></a>	     <span class='hs-layout'>,</span> <span class='hs-varid'>runQuery</span><span class='hs-layout'>,</span> <span class='hs-varid'>runQueryRel</span><span class='hs-layout'>,</span> <span class='hs-varid'>unQuery</span>
<a name="line-48"></a>	     <span class='hs-layout'>,</span> <span class='hs-varid'>subQuery</span>
<a name="line-49"></a>	     <span class='hs-layout'>,</span> <span class='hs-varid'>attribute</span><span class='hs-layout'>,</span> <span class='hs-varid'>attributeName</span><span class='hs-layout'>,</span> <span class='hs-varid'>tableName</span><span class='hs-layout'>,</span> <span class='hs-varid'>baseTable</span><span class='hs-layout'>,</span> <span class='hs-varid'>emptyTable</span>
<a name="line-50"></a>	     <span class='hs-layout'>,</span> <span class='hs-varid'>exprs</span><span class='hs-layout'>,</span> <span class='hs-varid'>labels</span><span class='hs-layout'>,</span> <span class='hs-varid'>tableRec</span> 
<a name="line-51"></a>	     <span class='hs-layout'>,</span> <span class='hs-varid'>constantRecord</span>
<a name="line-52"></a>	     <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-53"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Database</span><span class='hs-varop'>.</span><span class='hs-conid'>HaskellDB</span><span class='hs-varop'>.</span><span class='hs-conid'>HDBRec</span> 
<a name="line-54"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Database</span><span class='hs-varop'>.</span><span class='hs-conid'>HaskellDB</span><span class='hs-varop'>.</span><span class='hs-conid'>PrimQuery</span>
<a name="line-55"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Database</span><span class='hs-varop'>.</span><span class='hs-conid'>HaskellDB</span><span class='hs-varop'>.</span><span class='hs-conid'>BoundedString</span>
<a name="line-56"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Database</span><span class='hs-varop'>.</span><span class='hs-conid'>HaskellDB</span><span class='hs-varop'>.</span><span class='hs-conid'>BoundedList</span>
<a name="line-57"></a>
<a name="line-58"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>Time</span> <span class='hs-layout'>(</span><span class='hs-conid'>CalendarTime</span><span class='hs-layout'>)</span>
<a name="line-59"></a>
<a name="line-60"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-61"></a><span class='hs-comment'>-- Operators</span>
<a name="line-62"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-63"></a>
<a name="line-64"></a><span class='hs-keyword'>infix</span>   <span class='hs-num'>8</span> <span class='hs-varop'>`like`</span><span class='hs-layout'>,</span> <span class='hs-varop'>`_in`</span>
<a name="line-65"></a><span class='hs-keyword'>infixl</span>  <span class='hs-num'>7</span> <span class='hs-varop'>.*.</span><span class='hs-layout'>,</span> <span class='hs-varop'>./.</span><span class='hs-layout'>,</span> <span class='hs-varop'>.%.</span>
<a name="line-66"></a><span class='hs-keyword'>infixl</span>  <span class='hs-num'>6</span> <span class='hs-varop'>.+.</span><span class='hs-layout'>,</span><span class='hs-varop'>.-.</span>
<a name="line-67"></a><span class='hs-keyword'>infix</span>   <span class='hs-num'>6</span> <span class='hs-varop'>&lt;&lt;</span><span class='hs-layout'>,</span> <span class='hs-varop'>&lt;&lt;-</span>
<a name="line-68"></a><span class='hs-keyword'>infixr</span>  <span class='hs-num'>5</span> <span class='hs-varop'>.++.</span>
<a name="line-69"></a><span class='hs-keyword'>infix</span>   <span class='hs-num'>4</span> <span class='hs-varop'>.==.</span><span class='hs-layout'>,</span> <span class='hs-varop'>.&lt;&gt;.</span><span class='hs-layout'>,</span> <span class='hs-varop'>.&lt;.</span><span class='hs-layout'>,</span> <span class='hs-varop'>.&lt;=.</span><span class='hs-layout'>,</span> <span class='hs-varop'>.&gt;.</span><span class='hs-layout'>,</span> <span class='hs-varop'>.&gt;=.</span>
<a name="line-70"></a><span class='hs-keyword'>infixr</span>  <span class='hs-num'>3</span> <span class='hs-varop'>.&amp;&amp;.</span>
<a name="line-71"></a><span class='hs-keyword'>infixr</span>  <span class='hs-num'>2</span> <span class='hs-varop'>.||.</span>
<a name="line-72"></a>
<a name="line-73"></a><span class='hs-comment'>----------------------------------------------------------</span>
<a name="line-74"></a><span class='hs-comment'>-- Data definitions. </span>
<a name="line-75"></a><span class='hs-comment'>----------------------------------------------------------</span>
<a name="line-76"></a>
<a name="line-77"></a><a name="Rel"></a><span class='hs-comment'>-- | Type of relations, contains the attributes</span>
<a name="line-78"></a><a name="Rel"></a><span class='hs-comment'>--   of the relation and an 'Alias' to which the</span>
<a name="line-79"></a><a name="Rel"></a><span class='hs-comment'>--   attributes are renamed in the 'PrimQuery'.</span>
<a name="line-80"></a><a name="Rel"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Rel</span> <span class='hs-conid'>Alias</span> <span class='hs-conid'>Scheme</span>
<a name="line-81"></a>
<a name="line-82"></a><a name="Expr"></a><span class='hs-comment'>-- | Type of normal expressions, contains the untyped PrimExpr.</span>
<a name="line-83"></a><a name="Expr"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>PrimExpr</span>
<a name="line-84"></a>		<span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Read</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-85"></a>
<a name="line-86"></a><a name="ExprAggr"></a><span class='hs-comment'>-- | Type of aggregate expressions.</span>
<a name="line-87"></a><a name="ExprAggr"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>ExprAggr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ExprAggr</span> <span class='hs-conid'>PrimExpr</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Read</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-88"></a>
<a name="line-89"></a><a name="ExprDefault"></a><span class='hs-comment'>-- | The type of default expressions.</span>
<a name="line-90"></a><a name="ExprDefault"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>ExprDefault</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ExprDefault</span> <span class='hs-conid'>PrimExpr</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Read</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-91"></a>
<a name="line-92"></a><a name="Table"></a><span class='hs-comment'>-- | Basic tables, contains table name and an</span>
<a name="line-93"></a><a name="Table"></a><span class='hs-comment'>--   association from attributes to attribute</span>
<a name="line-94"></a><a name="Table"></a><span class='hs-comment'>--   names in the real table.</span>
<a name="line-95"></a><a name="Table"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Table</span> <span class='hs-varid'>r</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Table</span> <span class='hs-conid'>TableName</span> <span class='hs-conid'>Assoc</span>
<a name="line-96"></a>
<a name="line-97"></a><a name="Attr"></a><span class='hs-comment'>-- | Typed attributes</span>
<a name="line-98"></a><a name="Attr"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Attr</span> <span class='hs-varid'>f</span> <span class='hs-varid'>a</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Attr</span> <span class='hs-conid'>Attribute</span>
<a name="line-99"></a>
<a name="line-100"></a><a name="Alias"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Alias</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Int</span>
<a name="line-101"></a>
<a name="line-102"></a><a name="QState"></a><span class='hs-comment'>-- | A Query monad provides unique names (aliases)</span>
<a name="line-103"></a><a name="QState"></a><span class='hs-comment'>--   and constructs a PrimQuery.</span>
<a name="line-104"></a><a name="QState"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>QState</span>     <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Alias</span><span class='hs-layout'>,</span><span class='hs-conid'>PrimQuery</span><span class='hs-layout'>)</span>
<a name="line-105"></a>
<a name="line-106"></a><a name="Query"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Query</span> <span class='hs-varid'>a</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>QState</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-conid'>QState</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-107"></a>
<a name="line-108"></a>
<a name="line-109"></a><a name="scheme"></a><span class='hs-definition'>scheme</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Scheme</span>
<a name="line-110"></a><span class='hs-definition'>scheme</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>s</span>
<a name="line-111"></a>
<a name="line-112"></a><a name="attributeName"></a><span class='hs-definition'>attributeName</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Attr</span> <span class='hs-varid'>f</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Attribute</span>
<a name="line-113"></a><span class='hs-definition'>attributeName</span> <span class='hs-layout'>(</span><span class='hs-conid'>Attr</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>name</span>
<a name="line-114"></a>
<a name="line-115"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-116"></a><span class='hs-comment'>-- Expression and record classes.</span>
<a name="line-117"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-118"></a>
<a name="line-119"></a><a name="ExprC"></a><span class='hs-comment'>-- | Class of expression types.</span>
<a name="line-120"></a><a name="ExprC"></a><span class='hs-keyword'>class</span> <span class='hs-conid'>ExprC</span> <span class='hs-varid'>e</span> <span class='hs-keyword'>where</span>
<a name="line-121"></a>    <span class='hs-comment'>-- | Get the underlying untyped 'PrimExpr'.</span>
<a name="line-122"></a>    <span class='hs-varid'>primExpr</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>e</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PrimExpr</span>
<a name="line-123"></a><a name="instance%20ExprC%20Expr"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>ExprC</span> <span class='hs-conid'>Expr</span> <span class='hs-keyword'>where</span> <span class='hs-varid'>primExpr</span> <span class='hs-keyglyph'>~</span><span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>e</span>
<a name="line-124"></a><a name="instance%20ExprC%20ExprAggr"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>ExprC</span> <span class='hs-conid'>ExprAggr</span> <span class='hs-keyword'>where</span> <span class='hs-varid'>primExpr</span> <span class='hs-keyglyph'>~</span><span class='hs-layout'>(</span><span class='hs-conid'>ExprAggr</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>e</span>
<a name="line-125"></a><a name="instance%20ExprC%20ExprDefault"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>ExprC</span> <span class='hs-conid'>ExprDefault</span> <span class='hs-keyword'>where</span> <span class='hs-varid'>primExpr</span> <span class='hs-keyglyph'>~</span><span class='hs-layout'>(</span><span class='hs-conid'>ExprDefault</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>e</span>
<a name="line-126"></a>
<a name="line-127"></a><a name="InsertExpr"></a><span class='hs-comment'>-- | Class of expressions that can be used with 'insert'.</span>
<a name="line-128"></a><a name="InsertExpr"></a><span class='hs-keyword'>class</span> <span class='hs-conid'>ExprC</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>InsertExpr</span> <span class='hs-varid'>e</span>
<a name="line-129"></a><a name="instance%20InsertRec%20(RecCons%20f%20(e%20a)%20r)%20(RecCons%20f%20(Expr%20a)%20er)%20--%20%7c%20Class%20of%20expressions%20that%20can%20be%20used%20with%20'project'.%20class%20ExprC%20e%20=%3e%20ProjectExpr%20e%20instance%20ProjectExpr%20Expr%20instance%20ProjectExpr%20ExprAggr%20--%20%7c%20Class%20of%20records%20that%20can%20be%20used%20with%20'project'.%20--%20All%20all%20the%20values%20must%20be%20instances%20of%20'ProjectExpr'%20for%20the%20--%20record%20to%20be%20an%20instance%20of%20'ProjectRec'.%20class%20ProjectRec%20r%20er%20%7c%20r%20-%3e%20er%20instance%20ProjectRec%20RecNil%20RecNil%20instance%20(ProjectExpr%20e,%20ProjectRec%20r%20er)%20=%3e%20ProjectRec%20(RecCons%20f%20(e%20a)%20r)%20(RecCons%20f%20(Expr%20a)%20er)%20-----------------------------------------------------------%20--%20Record%20operators%20-----------------------------------------------------------%20--%20%7c%20Creates%20a%20record%20field.%20--%20Similar%20to%20'(.=.)',%20but%20gets%20the%20field%20label%20from%20an%20'Attr'.%20(%20%3c%3c%20)%20::%20Attr%20f%20a%20--%20%5e%20Label%20-%3e%20e%20a%20--%20%5e%20Expression%20-%3e%20Record%20(RecCons%20f%20(e%20a)%20RecNil)%20--%20%5e%20New%20record%20_%20%3c%3c%20x%20=%20RecCons%20x%20--%20%7c%20Convenience%20operator%20for%20constructing%20records%20of%20constants.%20--%20Useful%20primarily%20with%20'insert'.%20--%20@f%20%3c%3c-%20x@%20is%20the%20same%20as%20@f%20%3c%3c%20constant%20x@%20(%20%3c%3c-%20)%20::%20ShowConstant%20a%20=%3e%20Attr%20f%20a%20--%20%5e%20Field%20label%20-%3e%20a%20--%20%5e%20Field%20value%20-%3e%20Record%20(RecCons%20f%20(Expr%20a)%20RecNil)%20--%20%5e%20New%20record%20f%20%3c%3c-%20x%20=%20f%20%3c%3c%20constant%20x%20--%20%7c%20Creates%20a%20single-field%20record%20from%20an%20attribute%20and%20a%20table.%20Useful%20--%20for%20building%20projections%20that%20will%20re-use%20the%20same%20attribute%20name.%20@copy%20attr%20tbl@%20is%20--%20equivalent%20to:%20--%20--%20@attr%20.=.%20(tbl%20.!.%20attr)@%20--%20copy%20::%20(HasField%20f%20r)%20=%3e%20Attr%20f%20a%20-%3e%20Rel%20r%20-%3e%20Record%20(RecCons%20f%20(Expr%20a)%20RecNil)%20copy%20attr%20tbl%20=%20attr%20%3c%3c%20tbl%20!%20attr%20--%20%7c%20Copies%20all%20columns%20in%20the%20relation%20given.%20Useful%20for%20appending%20--%20the%20remaining%20columns%20in%20a%20table%20to%20a%20projection.%20For%20example:%20--%20--%20%3e%20query%20=%20do%20--%20%3e%20tbl%20%3c-%20table%20some_table%20--%20%3e%20project%20$%20copyAll%20tbl%20--%20--%20will%20add%20all%20columns%20in%20%22some_table%22%20to%20the%20query.%20copyAll%20::%20(RelToRec%20r)%20=%3e%20Rel%20r%20-%3e%20Record%20r%20copyAll%20=%20relToRec%20--%20%7c%20Helper%20class%20which%20gives%20a%20polymorphic%20--%20copy%20function%20that%20can%20turn%20a%20Rel%20into%20a%20Record.%20class%20RelToRec%20a"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>InsertExpr</span> <span class='hs-conid'>Expr</span>
<a name="line-130"></a><a name="instance%20InsertRec%20(RecCons%20f%20(e%20a)%20r)%20(RecCons%20f%20(Expr%20a)%20er)%20--%20%7c%20Class%20of%20expressions%20that%20can%20be%20used%20with%20'project'.%20class%20ExprC%20e%20=%3e%20ProjectExpr%20e%20instance%20ProjectExpr%20Expr%20instance%20ProjectExpr%20ExprAggr%20--%20%7c%20Class%20of%20records%20that%20can%20be%20used%20with%20'project'.%20--%20All%20all%20the%20values%20must%20be%20instances%20of%20'ProjectExpr'%20for%20the%20--%20record%20to%20be%20an%20instance%20of%20'ProjectRec'.%20class%20ProjectRec%20r%20er%20%7c%20r%20-%3e%20er%20instance%20ProjectRec%20RecNil%20RecNil%20instance%20(ProjectExpr%20e,%20ProjectRec%20r%20er)%20=%3e%20ProjectRec%20(RecCons%20f%20(e%20a)%20r)%20(RecCons%20f%20(Expr%20a)%20er)%20-----------------------------------------------------------%20--%20Record%20operators%20-----------------------------------------------------------%20--%20%7c%20Creates%20a%20record%20field.%20--%20Similar%20to%20'(.=.)',%20but%20gets%20the%20field%20label%20from%20an%20'Attr'.%20(%20%3c%3c%20)%20::%20Attr%20f%20a%20--%20%5e%20Label%20-%3e%20e%20a%20--%20%5e%20Expression%20-%3e%20Record%20(RecCons%20f%20(e%20a)%20RecNil)%20--%20%5e%20New%20record%20_%20%3c%3c%20x%20=%20RecCons%20x%20--%20%7c%20Convenience%20operator%20for%20constructing%20records%20of%20constants.%20--%20Useful%20primarily%20with%20'insert'.%20--%20@f%20%3c%3c-%20x@%20is%20the%20same%20as%20@f%20%3c%3c%20constant%20x@%20(%20%3c%3c-%20)%20::%20ShowConstant%20a%20=%3e%20Attr%20f%20a%20--%20%5e%20Field%20label%20-%3e%20a%20--%20%5e%20Field%20value%20-%3e%20Record%20(RecCons%20f%20(Expr%20a)%20RecNil)%20--%20%5e%20New%20record%20f%20%3c%3c-%20x%20=%20f%20%3c%3c%20constant%20x%20--%20%7c%20Creates%20a%20single-field%20record%20from%20an%20attribute%20and%20a%20table.%20Useful%20--%20for%20building%20projections%20that%20will%20re-use%20the%20same%20attribute%20name.%20@copy%20attr%20tbl@%20is%20--%20equivalent%20to:%20--%20--%20@attr%20.=.%20(tbl%20.!.%20attr)@%20--%20copy%20::%20(HasField%20f%20r)%20=%3e%20Attr%20f%20a%20-%3e%20Rel%20r%20-%3e%20Record%20(RecCons%20f%20(Expr%20a)%20RecNil)%20copy%20attr%20tbl%20=%20attr%20%3c%3c%20tbl%20!%20attr%20--%20%7c%20Copies%20all%20columns%20in%20the%20relation%20given.%20Useful%20for%20appending%20--%20the%20remaining%20columns%20in%20a%20table%20to%20a%20projection.%20For%20example:%20--%20--%20%3e%20query%20=%20do%20--%20%3e%20tbl%20%3c-%20table%20some_table%20--%20%3e%20project%20$%20copyAll%20tbl%20--%20--%20will%20add%20all%20columns%20in%20%22some_table%22%20to%20the%20query.%20copyAll%20::%20(RelToRec%20r)%20=%3e%20Rel%20r%20-%3e%20Record%20r%20copyAll%20=%20relToRec%20--%20%7c%20Helper%20class%20which%20gives%20a%20polymorphic%20--%20copy%20function%20that%20can%20turn%20a%20Rel%20into%20a%20Record.%20class%20RelToRec%20a"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>InsertExpr</span> <span class='hs-conid'>ExprDefault</span>
<a name="line-131"></a>
<a name="line-132"></a><a name="InsertRec"></a><span class='hs-comment'>-- | Class of records that can be used with 'insert'. </span>
<a name="line-133"></a><a name="InsertRec"></a><span class='hs-comment'>--   All all the values must be instances of 'InsertExpr' for the</span>
<a name="line-134"></a><a name="InsertRec"></a><span class='hs-comment'>--   record to be an instance of 'InsertRec'.</span>
<a name="line-135"></a><a name="InsertRec"></a><span class='hs-keyword'>class</span> <span class='hs-conid'>InsertRec</span> <span class='hs-varid'>r</span> <span class='hs-varid'>er</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>er</span>
<a name="line-136"></a><a name="instance%20InsertRec%20(RecCons%20f%20(e%20a)%20r)%20(RecCons%20f%20(Expr%20a)%20er)%20--%20%7c%20Class%20of%20expressions%20that%20can%20be%20used%20with%20'project'.%20class%20ExprC%20e%20=%3e%20ProjectExpr%20e%20instance%20ProjectExpr%20Expr%20instance%20ProjectExpr%20ExprAggr%20--%20%7c%20Class%20of%20records%20that%20can%20be%20used%20with%20'project'.%20--%20All%20all%20the%20values%20must%20be%20instances%20of%20'ProjectExpr'%20for%20the%20--%20record%20to%20be%20an%20instance%20of%20'ProjectRec'.%20class%20ProjectRec%20r%20er%20%7c%20r%20-%3e%20er%20instance%20ProjectRec%20RecNil%20RecNil%20instance%20(ProjectExpr%20e,%20ProjectRec%20r%20er)%20=%3e%20ProjectRec%20(RecCons%20f%20(e%20a)%20r)%20(RecCons%20f%20(Expr%20a)%20er)%20-----------------------------------------------------------%20--%20Record%20operators%20-----------------------------------------------------------%20--%20%7c%20Creates%20a%20record%20field.%20--%20Similar%20to%20'(.=.)',%20but%20gets%20the%20field%20label%20from%20an%20'Attr'.%20(%20%3c%3c%20)%20::%20Attr%20f%20a%20--%20%5e%20Label%20-%3e%20e%20a%20--%20%5e%20Expression%20-%3e%20Record%20(RecCons%20f%20(e%20a)%20RecNil)%20--%20%5e%20New%20record%20_%20%3c%3c%20x%20=%20RecCons%20x%20--%20%7c%20Convenience%20operator%20for%20constructing%20records%20of%20constants.%20--%20Useful%20primarily%20with%20'insert'.%20--%20@f%20%3c%3c-%20x@%20is%20the%20same%20as%20@f%20%3c%3c%20constant%20x@%20(%20%3c%3c-%20)%20::%20ShowConstant%20a%20=%3e%20Attr%20f%20a%20--%20%5e%20Field%20label%20-%3e%20a%20--%20%5e%20Field%20value%20-%3e%20Record%20(RecCons%20f%20(Expr%20a)%20RecNil)%20--%20%5e%20New%20record%20f%20%3c%3c-%20x%20=%20f%20%3c%3c%20constant%20x%20--%20%7c%20Creates%20a%20single-field%20record%20from%20an%20attribute%20and%20a%20table.%20Useful%20--%20for%20building%20projections%20that%20will%20re-use%20the%20same%20attribute%20name.%20@copy%20attr%20tbl@%20is%20--%20equivalent%20to:%20--%20--%20@attr%20.=.%20(tbl%20.!.%20attr)@%20--%20copy%20::%20(HasField%20f%20r)%20=%3e%20Attr%20f%20a%20-%3e%20Rel%20r%20-%3e%20Record%20(RecCons%20f%20(Expr%20a)%20RecNil)%20copy%20attr%20tbl%20=%20attr%20%3c%3c%20tbl%20!%20attr%20--%20%7c%20Copies%20all%20columns%20in%20the%20relation%20given.%20Useful%20for%20appending%20--%20the%20remaining%20columns%20in%20a%20table%20to%20a%20projection.%20For%20example:%20--%20--%20%3e%20query%20=%20do%20--%20%3e%20tbl%20%3c-%20table%20some_table%20--%20%3e%20project%20$%20copyAll%20tbl%20--%20--%20will%20add%20all%20columns%20in%20%22some_table%22%20to%20the%20query.%20copyAll%20::%20(RelToRec%20r)%20=%3e%20Rel%20r%20-%3e%20Record%20r%20copyAll%20=%20relToRec%20--%20%7c%20Helper%20class%20which%20gives%20a%20polymorphic%20--%20copy%20function%20that%20can%20turn%20a%20Rel%20into%20a%20Record.%20class%20RelToRec%20a"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>InsertRec</span> <span class='hs-conid'>RecNil</span> <span class='hs-conid'>RecNil</span>
<a name="line-137"></a><a name="instance%20InsertRec%20(RecCons%20f%20(e%20a)%20r)%20(RecCons%20f%20(Expr%20a)%20er)%20--%20%7c%20Class%20of%20expressions%20that%20can%20be%20used%20with%20'project'.%20class%20ExprC%20e%20=%3e%20ProjectExpr%20e%20instance%20ProjectExpr%20Expr%20instance%20ProjectExpr%20ExprAggr%20--%20%7c%20Class%20of%20records%20that%20can%20be%20used%20with%20'project'.%20--%20All%20all%20the%20values%20must%20be%20instances%20of%20'ProjectExpr'%20for%20the%20--%20record%20to%20be%20an%20instance%20of%20'ProjectRec'.%20class%20ProjectRec%20r%20er%20%7c%20r%20-%3e%20er%20instance%20ProjectRec%20RecNil%20RecNil%20instance%20(ProjectExpr%20e,%20ProjectRec%20r%20er)%20=%3e%20ProjectRec%20(RecCons%20f%20(e%20a)%20r)%20(RecCons%20f%20(Expr%20a)%20er)%20-----------------------------------------------------------%20--%20Record%20operators%20-----------------------------------------------------------%20--%20%7c%20Creates%20a%20record%20field.%20--%20Similar%20to%20'(.=.)',%20but%20gets%20the%20field%20label%20from%20an%20'Attr'.%20(%20%3c%3c%20)%20::%20Attr%20f%20a%20--%20%5e%20Label%20-%3e%20e%20a%20--%20%5e%20Expression%20-%3e%20Record%20(RecCons%20f%20(e%20a)%20RecNil)%20--%20%5e%20New%20record%20_%20%3c%3c%20x%20=%20RecCons%20x%20--%20%7c%20Convenience%20operator%20for%20constructing%20records%20of%20constants.%20--%20Useful%20primarily%20with%20'insert'.%20--%20@f%20%3c%3c-%20x@%20is%20the%20same%20as%20@f%20%3c%3c%20constant%20x@%20(%20%3c%3c-%20)%20::%20ShowConstant%20a%20=%3e%20Attr%20f%20a%20--%20%5e%20Field%20label%20-%3e%20a%20--%20%5e%20Field%20value%20-%3e%20Record%20(RecCons%20f%20(Expr%20a)%20RecNil)%20--%20%5e%20New%20record%20f%20%3c%3c-%20x%20=%20f%20%3c%3c%20constant%20x%20--%20%7c%20Creates%20a%20single-field%20record%20from%20an%20attribute%20and%20a%20table.%20Useful%20--%20for%20building%20projections%20that%20will%20re-use%20the%20same%20attribute%20name.%20@copy%20attr%20tbl@%20is%20--%20equivalent%20to:%20--%20--%20@attr%20.=.%20(tbl%20.!.%20attr)@%20--%20copy%20::%20(HasField%20f%20r)%20=%3e%20Attr%20f%20a%20-%3e%20Rel%20r%20-%3e%20Record%20(RecCons%20f%20(Expr%20a)%20RecNil)%20copy%20attr%20tbl%20=%20attr%20%3c%3c%20tbl%20!%20attr%20--%20%7c%20Copies%20all%20columns%20in%20the%20relation%20given.%20Useful%20for%20appending%20--%20the%20remaining%20columns%20in%20a%20table%20to%20a%20projection.%20For%20example:%20--%20--%20%3e%20query%20=%20do%20--%20%3e%20tbl%20%3c-%20table%20some_table%20--%20%3e%20project%20$%20copyAll%20tbl%20--%20--%20will%20add%20all%20columns%20in%20%22some_table%22%20to%20the%20query.%20copyAll%20::%20(RelToRec%20r)%20=%3e%20Rel%20r%20-%3e%20Record%20r%20copyAll%20=%20relToRec%20--%20%7c%20Helper%20class%20which%20gives%20a%20polymorphic%20--%20copy%20function%20that%20can%20turn%20a%20Rel%20into%20a%20Record.%20class%20RelToRec%20a"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>InsertExpr</span> <span class='hs-varid'>e</span><span class='hs-layout'>,</span> <span class='hs-conid'>InsertRec</span> <span class='hs-varid'>r</span> <span class='hs-varid'>er</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> 
<a name="line-138"></a>  <span class='hs-conid'>InsertRec</span> <span class='hs-layout'>(</span><span class='hs-conid'>RecCons</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>e</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>RecCons</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-varid'>er</span><span class='hs-layout'>)</span>
<a name="line-139"></a>
<a name="line-140"></a><a name="ProjectExpr"></a><span class='hs-comment'>-- | Class of expressions that can be used with 'project'.</span>
<a name="line-141"></a><a name="ProjectExpr"></a><span class='hs-keyword'>class</span> <span class='hs-conid'>ExprC</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>ProjectExpr</span> <span class='hs-varid'>e</span>
<a name="line-142"></a><a name="instance%20ProjectRec%20(RecCons%20f%20(e%20a)%20r)%20(RecCons%20f%20(Expr%20a)%20er)%20-----------------------------------------------------------%20--%20Record%20operators%20-----------------------------------------------------------%20--%20%7c%20Creates%20a%20record%20field.%20--%20Similar%20to%20'(.=.)',%20but%20gets%20the%20field%20label%20from%20an%20'Attr'.%20(%20%3c%3c%20)%20::%20Attr%20f%20a%20--%20%5e%20Label%20-%3e%20e%20a%20--%20%5e%20Expression%20-%3e%20Record%20(RecCons%20f%20(e%20a)%20RecNil)%20--%20%5e%20New%20record%20_%20%3c%3c%20x%20=%20RecCons%20x%20--%20%7c%20Convenience%20operator%20for%20constructing%20records%20of%20constants.%20--%20Useful%20primarily%20with%20'insert'.%20--%20@f%20%3c%3c-%20x@%20is%20the%20same%20as%20@f%20%3c%3c%20constant%20x@%20(%20%3c%3c-%20)%20::%20ShowConstant%20a%20=%3e%20Attr%20f%20a%20--%20%5e%20Field%20label%20-%3e%20a%20--%20%5e%20Field%20value%20-%3e%20Record%20(RecCons%20f%20(Expr%20a)%20RecNil)%20--%20%5e%20New%20record%20f%20%3c%3c-%20x%20=%20f%20%3c%3c%20constant%20x%20--%20%7c%20Creates%20a%20single-field%20record%20from%20an%20attribute%20and%20a%20table.%20Useful%20--%20for%20building%20projections%20that%20will%20re-use%20the%20same%20attribute%20name.%20@copy%20attr%20tbl@%20is%20--%20equivalent%20to:%20--%20--%20@attr%20.=.%20(tbl%20.!.%20attr)@%20--%20copy%20::%20(HasField%20f%20r)%20=%3e%20Attr%20f%20a%20-%3e%20Rel%20r%20-%3e%20Record%20(RecCons%20f%20(Expr%20a)%20RecNil)%20copy%20attr%20tbl%20=%20attr%20%3c%3c%20tbl%20!%20attr%20--%20%7c%20Copies%20all%20columns%20in%20the%20relation%20given.%20Useful%20for%20appending%20--%20the%20remaining%20columns%20in%20a%20table%20to%20a%20projection.%20For%20example:%20--%20--%20%3e%20query%20=%20do%20--%20%3e%20tbl%20%3c-%20table%20some_table%20--%20%3e%20project%20$%20copyAll%20tbl%20--%20--%20will%20add%20all%20columns%20in%20%22some_table%22%20to%20the%20query.%20copyAll%20::%20(RelToRec%20r)%20=%3e%20Rel%20r%20-%3e%20Record%20r%20copyAll%20=%20relToRec%20--%20%7c%20Helper%20class%20which%20gives%20a%20polymorphic%20--%20copy%20function%20that%20can%20turn%20a%20Rel%20into%20a%20Record.%20class%20RelToRec%20a"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>ProjectExpr</span> <span class='hs-conid'>Expr</span>
<a name="line-143"></a><a name="instance%20ProjectRec%20(RecCons%20f%20(e%20a)%20r)%20(RecCons%20f%20(Expr%20a)%20er)%20-----------------------------------------------------------%20--%20Record%20operators%20-----------------------------------------------------------%20--%20%7c%20Creates%20a%20record%20field.%20--%20Similar%20to%20'(.=.)',%20but%20gets%20the%20field%20label%20from%20an%20'Attr'.%20(%20%3c%3c%20)%20::%20Attr%20f%20a%20--%20%5e%20Label%20-%3e%20e%20a%20--%20%5e%20Expression%20-%3e%20Record%20(RecCons%20f%20(e%20a)%20RecNil)%20--%20%5e%20New%20record%20_%20%3c%3c%20x%20=%20RecCons%20x%20--%20%7c%20Convenience%20operator%20for%20constructing%20records%20of%20constants.%20--%20Useful%20primarily%20with%20'insert'.%20--%20@f%20%3c%3c-%20x@%20is%20the%20same%20as%20@f%20%3c%3c%20constant%20x@%20(%20%3c%3c-%20)%20::%20ShowConstant%20a%20=%3e%20Attr%20f%20a%20--%20%5e%20Field%20label%20-%3e%20a%20--%20%5e%20Field%20value%20-%3e%20Record%20(RecCons%20f%20(Expr%20a)%20RecNil)%20--%20%5e%20New%20record%20f%20%3c%3c-%20x%20=%20f%20%3c%3c%20constant%20x%20--%20%7c%20Creates%20a%20single-field%20record%20from%20an%20attribute%20and%20a%20table.%20Useful%20--%20for%20building%20projections%20that%20will%20re-use%20the%20same%20attribute%20name.%20@copy%20attr%20tbl@%20is%20--%20equivalent%20to:%20--%20--%20@attr%20.=.%20(tbl%20.!.%20attr)@%20--%20copy%20::%20(HasField%20f%20r)%20=%3e%20Attr%20f%20a%20-%3e%20Rel%20r%20-%3e%20Record%20(RecCons%20f%20(Expr%20a)%20RecNil)%20copy%20attr%20tbl%20=%20attr%20%3c%3c%20tbl%20!%20attr%20--%20%7c%20Copies%20all%20columns%20in%20the%20relation%20given.%20Useful%20for%20appending%20--%20the%20remaining%20columns%20in%20a%20table%20to%20a%20projection.%20For%20example:%20--%20--%20%3e%20query%20=%20do%20--%20%3e%20tbl%20%3c-%20table%20some_table%20--%20%3e%20project%20$%20copyAll%20tbl%20--%20--%20will%20add%20all%20columns%20in%20%22some_table%22%20to%20the%20query.%20copyAll%20::%20(RelToRec%20r)%20=%3e%20Rel%20r%20-%3e%20Record%20r%20copyAll%20=%20relToRec%20--%20%7c%20Helper%20class%20which%20gives%20a%20polymorphic%20--%20copy%20function%20that%20can%20turn%20a%20Rel%20into%20a%20Record.%20class%20RelToRec%20a"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>ProjectExpr</span> <span class='hs-conid'>ExprAggr</span>
<a name="line-144"></a>
<a name="line-145"></a><a name="ProjectRec"></a><span class='hs-comment'>-- | Class of records that can be used with 'project'. </span>
<a name="line-146"></a><a name="ProjectRec"></a><span class='hs-comment'>--   All all the values must be instances of 'ProjectExpr' for the</span>
<a name="line-147"></a><a name="ProjectRec"></a><span class='hs-comment'>--   record to be an instance of 'ProjectRec'.</span>
<a name="line-148"></a><a name="ProjectRec"></a><span class='hs-keyword'>class</span> <span class='hs-conid'>ProjectRec</span> <span class='hs-varid'>r</span> <span class='hs-varid'>er</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>er</span>
<a name="line-149"></a><a name="instance%20ProjectRec%20(RecCons%20f%20(e%20a)%20r)%20(RecCons%20f%20(Expr%20a)%20er)%20-----------------------------------------------------------%20--%20Record%20operators%20-----------------------------------------------------------%20--%20%7c%20Creates%20a%20record%20field.%20--%20Similar%20to%20'(.=.)',%20but%20gets%20the%20field%20label%20from%20an%20'Attr'.%20(%20%3c%3c%20)%20::%20Attr%20f%20a%20--%20%5e%20Label%20-%3e%20e%20a%20--%20%5e%20Expression%20-%3e%20Record%20(RecCons%20f%20(e%20a)%20RecNil)%20--%20%5e%20New%20record%20_%20%3c%3c%20x%20=%20RecCons%20x%20--%20%7c%20Convenience%20operator%20for%20constructing%20records%20of%20constants.%20--%20Useful%20primarily%20with%20'insert'.%20--%20@f%20%3c%3c-%20x@%20is%20the%20same%20as%20@f%20%3c%3c%20constant%20x@%20(%20%3c%3c-%20)%20::%20ShowConstant%20a%20=%3e%20Attr%20f%20a%20--%20%5e%20Field%20label%20-%3e%20a%20--%20%5e%20Field%20value%20-%3e%20Record%20(RecCons%20f%20(Expr%20a)%20RecNil)%20--%20%5e%20New%20record%20f%20%3c%3c-%20x%20=%20f%20%3c%3c%20constant%20x%20--%20%7c%20Creates%20a%20single-field%20record%20from%20an%20attribute%20and%20a%20table.%20Useful%20--%20for%20building%20projections%20that%20will%20re-use%20the%20same%20attribute%20name.%20@copy%20attr%20tbl@%20is%20--%20equivalent%20to:%20--%20--%20@attr%20.=.%20(tbl%20.!.%20attr)@%20--%20copy%20::%20(HasField%20f%20r)%20=%3e%20Attr%20f%20a%20-%3e%20Rel%20r%20-%3e%20Record%20(RecCons%20f%20(Expr%20a)%20RecNil)%20copy%20attr%20tbl%20=%20attr%20%3c%3c%20tbl%20!%20attr%20--%20%7c%20Copies%20all%20columns%20in%20the%20relation%20given.%20Useful%20for%20appending%20--%20the%20remaining%20columns%20in%20a%20table%20to%20a%20projection.%20For%20example:%20--%20--%20%3e%20query%20=%20do%20--%20%3e%20tbl%20%3c-%20table%20some_table%20--%20%3e%20project%20$%20copyAll%20tbl%20--%20--%20will%20add%20all%20columns%20in%20%22some_table%22%20to%20the%20query.%20copyAll%20::%20(RelToRec%20r)%20=%3e%20Rel%20r%20-%3e%20Record%20r%20copyAll%20=%20relToRec%20--%20%7c%20Helper%20class%20which%20gives%20a%20polymorphic%20--%20copy%20function%20that%20can%20turn%20a%20Rel%20into%20a%20Record.%20class%20RelToRec%20a"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>ProjectRec</span> <span class='hs-conid'>RecNil</span> <span class='hs-conid'>RecNil</span>
<a name="line-150"></a><a name="instance%20ProjectRec%20(RecCons%20f%20(e%20a)%20r)%20(RecCons%20f%20(Expr%20a)%20er)%20-----------------------------------------------------------%20--%20Record%20operators%20-----------------------------------------------------------%20--%20%7c%20Creates%20a%20record%20field.%20--%20Similar%20to%20'(.=.)',%20but%20gets%20the%20field%20label%20from%20an%20'Attr'.%20(%20%3c%3c%20)%20::%20Attr%20f%20a%20--%20%5e%20Label%20-%3e%20e%20a%20--%20%5e%20Expression%20-%3e%20Record%20(RecCons%20f%20(e%20a)%20RecNil)%20--%20%5e%20New%20record%20_%20%3c%3c%20x%20=%20RecCons%20x%20--%20%7c%20Convenience%20operator%20for%20constructing%20records%20of%20constants.%20--%20Useful%20primarily%20with%20'insert'.%20--%20@f%20%3c%3c-%20x@%20is%20the%20same%20as%20@f%20%3c%3c%20constant%20x@%20(%20%3c%3c-%20)%20::%20ShowConstant%20a%20=%3e%20Attr%20f%20a%20--%20%5e%20Field%20label%20-%3e%20a%20--%20%5e%20Field%20value%20-%3e%20Record%20(RecCons%20f%20(Expr%20a)%20RecNil)%20--%20%5e%20New%20record%20f%20%3c%3c-%20x%20=%20f%20%3c%3c%20constant%20x%20--%20%7c%20Creates%20a%20single-field%20record%20from%20an%20attribute%20and%20a%20table.%20Useful%20--%20for%20building%20projections%20that%20will%20re-use%20the%20same%20attribute%20name.%20@copy%20attr%20tbl@%20is%20--%20equivalent%20to:%20--%20--%20@attr%20.=.%20(tbl%20.!.%20attr)@%20--%20copy%20::%20(HasField%20f%20r)%20=%3e%20Attr%20f%20a%20-%3e%20Rel%20r%20-%3e%20Record%20(RecCons%20f%20(Expr%20a)%20RecNil)%20copy%20attr%20tbl%20=%20attr%20%3c%3c%20tbl%20!%20attr%20--%20%7c%20Copies%20all%20columns%20in%20the%20relation%20given.%20Useful%20for%20appending%20--%20the%20remaining%20columns%20in%20a%20table%20to%20a%20projection.%20For%20example:%20--%20--%20%3e%20query%20=%20do%20--%20%3e%20tbl%20%3c-%20table%20some_table%20--%20%3e%20project%20$%20copyAll%20tbl%20--%20--%20will%20add%20all%20columns%20in%20%22some_table%22%20to%20the%20query.%20copyAll%20::%20(RelToRec%20r)%20=%3e%20Rel%20r%20-%3e%20Record%20r%20copyAll%20=%20relToRec%20--%20%7c%20Helper%20class%20which%20gives%20a%20polymorphic%20--%20copy%20function%20that%20can%20turn%20a%20Rel%20into%20a%20Record.%20class%20RelToRec%20a"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>ProjectExpr</span> <span class='hs-varid'>e</span><span class='hs-layout'>,</span> <span class='hs-conid'>ProjectRec</span> <span class='hs-varid'>r</span> <span class='hs-varid'>er</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> 
<a name="line-151"></a>  <span class='hs-conid'>ProjectRec</span> <span class='hs-layout'>(</span><span class='hs-conid'>RecCons</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>e</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>RecCons</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-varid'>er</span><span class='hs-layout'>)</span>
<a name="line-152"></a>
<a name="line-153"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-154"></a><span class='hs-comment'>-- Record operators</span>
<a name="line-155"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-156"></a>
<a name="line-157"></a><span class='hs-comment'>-- | Creates a record field.</span>
<a name="line-158"></a><span class='hs-comment'>--   Similar to '(.=.)', but gets the field label from an 'Attr'.</span>
<a name="line-159"></a><span class='hs-layout'>(</span> <span class='hs-varop'>&lt;&lt;</span> <span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Attr</span> <span class='hs-varid'>f</span> <span class='hs-varid'>a</span>        <span class='hs-comment'>-- ^ Label</span>
<a name="line-160"></a>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>e</span> <span class='hs-varid'>a</span>                        <span class='hs-comment'>-- ^ Expression</span>
<a name="line-161"></a>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Record</span> <span class='hs-layout'>(</span><span class='hs-conid'>RecCons</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>e</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-conid'>RecNil</span><span class='hs-layout'>)</span>  <span class='hs-comment'>-- ^ New record</span>
<a name="line-162"></a><span class='hs-keyword'>_</span> <span class='hs-varop'>&lt;&lt;</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>RecCons</span> <span class='hs-varid'>x</span>
<a name="line-163"></a>
<a name="line-164"></a><span class='hs-comment'>-- | Convenience operator for constructing records of constants.</span>
<a name="line-165"></a><span class='hs-comment'>--   Useful primarily with 'insert'.</span>
<a name="line-166"></a><span class='hs-comment'>--   @f &lt;&lt;- x@ is the same as @f &lt;&lt; constant x@</span>
<a name="line-167"></a><span class='hs-layout'>(</span> <span class='hs-varop'>&lt;&lt;-</span> <span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ShowConstant</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span>
<a name="line-168"></a>         <span class='hs-conid'>Attr</span> <span class='hs-varid'>f</span> <span class='hs-varid'>a</span>        <span class='hs-comment'>-- ^ Field label</span>
<a name="line-169"></a>      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span>                        <span class='hs-comment'>-- ^ Field value</span>
<a name="line-170"></a>      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Record</span> <span class='hs-layout'>(</span><span class='hs-conid'>RecCons</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-conid'>RecNil</span><span class='hs-layout'>)</span>  <span class='hs-comment'>-- ^ New record</span>
<a name="line-171"></a><a name="%3c%3c-"></a><span class='hs-definition'>f</span> <span class='hs-varop'>&lt;&lt;-</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span> <span class='hs-varop'>&lt;&lt;</span> <span class='hs-varid'>constant</span> <span class='hs-varid'>x</span>
<a name="line-172"></a>
<a name="line-173"></a><a name="copy"></a><span class='hs-comment'>-- | Creates a single-field record from an attribute and a table. Useful</span>
<a name="line-174"></a><span class='hs-comment'>-- for building projections that will re-use the same attribute name. @copy attr tbl@ is</span>
<a name="line-175"></a><span class='hs-comment'>-- equivalent to:</span>
<a name="line-176"></a><span class='hs-comment'>--</span>
<a name="line-177"></a><span class='hs-comment'>--   @attr .=. (tbl .!. attr)@</span>
<a name="line-178"></a><span class='hs-comment'>--</span>
<a name="line-179"></a><span class='hs-definition'>copy</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>HasField</span> <span class='hs-varid'>f</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Attr</span> <span class='hs-varid'>f</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Record</span> <span class='hs-layout'>(</span><span class='hs-conid'>RecCons</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-conid'>RecNil</span><span class='hs-layout'>)</span>
<a name="line-180"></a><span class='hs-definition'>copy</span> <span class='hs-varid'>attr</span> <span class='hs-varid'>tbl</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>attr</span> <span class='hs-varop'>&lt;&lt;</span> <span class='hs-varid'>tbl</span> <span class='hs-varop'>!</span> <span class='hs-varid'>attr</span>
<a name="line-181"></a>
<a name="line-182"></a><a name="copyAll"></a><span class='hs-comment'>-- | Copies all columns in the relation given. Useful for appending</span>
<a name="line-183"></a><span class='hs-comment'>-- the remaining columns in a table to a projection. For example:</span>
<a name="line-184"></a><span class='hs-comment'>--</span>
<a name="line-185"></a><span class='hs-comment'>-- &gt;   query = do</span>
<a name="line-186"></a><span class='hs-comment'>-- &gt;     tbl &lt;- table some_table</span>
<a name="line-187"></a><span class='hs-comment'>-- &gt;     project $ copyAll tbl</span>
<a name="line-188"></a><span class='hs-comment'>--</span>
<a name="line-189"></a><span class='hs-comment'>-- will add all columns in "some_table" to the query.</span>
<a name="line-190"></a><span class='hs-definition'>copyAll</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>RelToRec</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Record</span> <span class='hs-varid'>r</span>
<a name="line-191"></a><span class='hs-definition'>copyAll</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>relToRec</span>
<a name="line-192"></a>
<a name="line-193"></a><a name="RelToRec"></a><span class='hs-comment'>-- | Helper class which gives a polymorphic</span>
<a name="line-194"></a><a name="RelToRec"></a><span class='hs-comment'>-- copy function that can turn a Rel into a Record.</span>
<a name="line-195"></a><a name="RelToRec"></a><span class='hs-keyword'>class</span> <span class='hs-conid'>RelToRec</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>where</span>
<a name="line-196"></a>  <span class='hs-varid'>relToRec</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rel</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Record</span> <span class='hs-varid'>a</span>
<a name="line-197"></a>
<a name="line-198"></a><a name="instance%20RelToRec%20RecNil"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>RelToRec</span> <span class='hs-conid'>RecNil</span> <span class='hs-keyword'>where</span>
<a name="line-199"></a>  <span class='hs-varid'>relToRec</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>unRel</span> <span class='hs-varid'>v</span>
<a name="line-200"></a>    <span class='hs-keyword'>where</span> 
<a name="line-201"></a>      <span class='hs-varid'>unRel</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>r</span>
<a name="line-202"></a>      <span class='hs-varid'>unRel</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"unRel RelToRec RecNil"</span>
<a name="line-203"></a>
<a name="line-204"></a><a name="instance%20RelToRec%20(RecCons%20f%20(Expr%20a)%20rest)"></a><span class='hs-comment'>-- All this type magic takes the first field off the Rel (Record ...) type, </span>
<a name="line-205"></a><a name="instance%20RelToRec%20(RecCons%20f%20(Expr%20a)%20rest)"></a><span class='hs-comment'>-- turns it into a (Record ...) type, and prepends it to the rest of the </span>
<a name="line-206"></a><a name="instance%20RelToRec%20(RecCons%20f%20(Expr%20a)%20rest)"></a><span class='hs-comment'>-- converted record. </span>
<a name="line-207"></a><a name="instance%20RelToRec%20(RecCons%20f%20(Expr%20a)%20rest)"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>RelToRec</span> <span class='hs-varid'>rest</span><span class='hs-layout'>,</span> <span class='hs-conid'>FieldTag</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>RelToRec</span> <span class='hs-layout'>(</span><span class='hs-conid'>RecCons</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-varid'>rest</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-208"></a>  <span class='hs-varid'>relToRec</span> <span class='hs-varid'>t</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>copy</span> <span class='hs-layout'>(</span><span class='hs-varid'>attr</span> <span class='hs-varop'>.</span> <span class='hs-varid'>fieldT</span> <span class='hs-varop'>$</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-varid'>t</span> <span class='hs-cpp'>#</span> <span class='hs-varid'>relToRec</span> <span class='hs-layout'>(</span><span class='hs-varid'>restT</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> 
<a name="line-209"></a>    <span class='hs-keyword'>where</span>
<a name="line-210"></a>      <span class='hs-varid'>attr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FieldTag</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Attr</span> <span class='hs-varid'>f</span> <span class='hs-varid'>a</span>
<a name="line-211"></a>      <span class='hs-varid'>attr</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Attr</span> <span class='hs-varop'>.</span> <span class='hs-varid'>fieldName</span>
<a name="line-212"></a>      <span class='hs-varid'>fieldT</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rel</span> <span class='hs-layout'>(</span><span class='hs-conid'>RecCons</span> <span class='hs-varid'>f</span> <span class='hs-varid'>a</span> <span class='hs-varid'>rest</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>f</span> 
<a name="line-213"></a>      <span class='hs-varid'>fieldT</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"fieldT"</span>
<a name="line-214"></a>      <span class='hs-varid'>restT</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rel</span> <span class='hs-layout'>(</span><span class='hs-conid'>RecCons</span> <span class='hs-varid'>f</span> <span class='hs-varid'>a</span> <span class='hs-varid'>rest</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rel</span> <span class='hs-varid'>rest</span>
<a name="line-215"></a>      <span class='hs-varid'>restT</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Rel</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span>
<a name="line-216"></a>
<a name="line-217"></a><a name="instance%20Select%20(Attr%20f%20a)%20(Rel%20r)%20(Expr%20a)"></a><span class='hs-comment'>-- | Field selection operator. It is overloaded to work for both</span>
<a name="line-218"></a><a name="instance%20Select%20(Attr%20f%20a)%20(Rel%20r)%20(Expr%20a)"></a><span class='hs-comment'>--   relations in a query and the result of a query.</span>
<a name="line-219"></a><a name="instance%20Select%20(Attr%20f%20a)%20(Rel%20r)%20(Expr%20a)"></a><span class='hs-comment'>--   That is, it corresponds to both '!' and '!.' from the original</span>
<a name="line-220"></a><a name="instance%20Select%20(Attr%20f%20a)%20(Rel%20r)%20(Expr%20a)"></a><span class='hs-comment'>--   HaskellDB. An overloaded operator was selected because users</span>
<a name="line-221"></a><a name="instance%20Select%20(Attr%20f%20a)%20(Rel%20r)%20(Expr%20a)"></a><span class='hs-comment'>--   (and the developers) always forgot to use !. instead of !</span>
<a name="line-222"></a><a name="instance%20Select%20(Attr%20f%20a)%20(Rel%20r)%20(Expr%20a)"></a><span class='hs-comment'>--   on query results.</span>
<a name="line-223"></a><a name="instance%20Select%20(Attr%20f%20a)%20(Rel%20r)%20(Expr%20a)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>HasField</span> <span class='hs-varid'>f</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Select</span> <span class='hs-layout'>(</span><span class='hs-conid'>Attr</span> <span class='hs-varid'>f</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-224"></a>    <span class='hs-layout'>(</span><span class='hs-varop'>!</span><span class='hs-layout'>)</span> <span class='hs-varid'>rel</span> <span class='hs-varid'>attr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>select</span> <span class='hs-varid'>attr</span> <span class='hs-varid'>rel</span>
<a name="line-225"></a>
<a name="line-226"></a><a name="select"></a><span class='hs-definition'>select</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HasField</span> <span class='hs-varid'>f</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Attr</span> <span class='hs-varid'>f</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span>
<a name="line-227"></a><span class='hs-definition'>select</span> <span class='hs-layout'>(</span><span class='hs-conid'>Attr</span> <span class='hs-varid'>attribute</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>alias</span> <span class='hs-varid'>scheme</span><span class='hs-layout'>)</span>
<a name="line-228"></a>        <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>AttrExpr</span> <span class='hs-layout'>(</span><span class='hs-varid'>fresh</span> <span class='hs-varid'>alias</span> <span class='hs-varid'>attribute</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-229"></a>
<a name="line-230"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-231"></a><span class='hs-comment'>-- Basic relational operators</span>
<a name="line-232"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-233"></a>
<a name="line-234"></a><a name="project"></a><span class='hs-comment'>-- | Specifies a subset of the columns in the table.</span>
<a name="line-235"></a><span class='hs-definition'>project</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>ShowLabels</span> <span class='hs-varid'>r</span><span class='hs-layout'>,</span> <span class='hs-conid'>ToPrimExprs</span> <span class='hs-varid'>r</span><span class='hs-layout'>,</span> <span class='hs-conid'>ProjectRec</span> <span class='hs-varid'>r</span> <span class='hs-varid'>er</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Record</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>er</span><span class='hs-layout'>)</span>
<a name="line-236"></a><span class='hs-definition'>project</span> <span class='hs-varid'>r</span>
<a name="line-237"></a>        <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-238"></a>	  <span class='hs-varid'>alias</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newAlias</span>
<a name="line-239"></a>          <span class='hs-keyword'>let</span> <span class='hs-varid'>scheme</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>labels</span> <span class='hs-varid'>r</span>
<a name="line-240"></a>	      <span class='hs-varid'>assoc</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>zip</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>fresh</span> <span class='hs-varid'>alias</span><span class='hs-layout'>)</span> <span class='hs-varid'>scheme</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>exprs</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-241"></a>	  <span class='hs-varid'>updatePrimQuery</span> <span class='hs-layout'>(</span><span class='hs-varid'>extend</span> <span class='hs-varid'>assoc</span><span class='hs-layout'>)</span>
<a name="line-242"></a>          <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>alias</span> <span class='hs-varid'>scheme</span><span class='hs-layout'>)</span>
<a name="line-243"></a>
<a name="line-244"></a><a name="restrict"></a><span class='hs-comment'>-- | Restricts the records to only those who evaluates the </span>
<a name="line-245"></a><span class='hs-comment'>-- expression to True.</span>
<a name="line-246"></a><span class='hs-definition'>restrict</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Query</span> <span class='hs-conid'>()</span>
<a name="line-247"></a><span class='hs-definition'>restrict</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>primExpr</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>updatePrimQuery_</span> <span class='hs-layout'>(</span><span class='hs-conid'>Restrict</span> <span class='hs-varid'>primExpr</span><span class='hs-layout'>)</span>
<a name="line-248"></a>
<a name="line-249"></a><a name="unique"></a><span class='hs-comment'>-- | Restricts the relation given to only return unique records. Upshot</span>
<a name="line-250"></a><span class='hs-comment'>-- is all projected attributes will be 'grouped'.</span>
<a name="line-251"></a><span class='hs-definition'>unique</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Query</span> <span class='hs-conid'>()</span>
<a name="line-252"></a><span class='hs-definition'>unique</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span> <span class='hs-varid'>primQ</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-253"></a>    <span class='hs-comment'>-- Add all non-aggregate expressions in the query</span>
<a name="line-254"></a>    <span class='hs-comment'>-- to a groupby association list. This list holds the name</span>
<a name="line-255"></a>    <span class='hs-comment'>-- of the expression and the expression itself. Those expressions</span>
<a name="line-256"></a>    <span class='hs-comment'>-- will later by added to the groupby list in the SqlSelect built.</span>
<a name="line-257"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>nonAggr</span> <span class='hs-varid'>primQ</span> <span class='hs-keyword'>of</span>
<a name="line-258"></a>      <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>()</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span><span class='hs-layout'>,</span> <span class='hs-varid'>primQ</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- No non-aggregate expressions - no-op.</span>
<a name="line-259"></a>      <span class='hs-varid'>newCols</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>()</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span><span class='hs-layout'>,</span> <span class='hs-conid'>Group</span> <span class='hs-varid'>newCols</span> <span class='hs-varid'>primQ</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-260"></a>  <span class='hs-keyword'>where</span>
<a name="line-261"></a>    <span class='hs-comment'>-- Find all non-aggregate expressions and convert</span>
<a name="line-262"></a>    <span class='hs-comment'>-- them to attribute expressions for use in group by.</span>
<a name="line-263"></a>    <span class='hs-varid'>nonAggr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PrimQuery</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Assoc</span>
<a name="line-264"></a>    <span class='hs-varid'>nonAggr</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-varid'>toAttrExpr</span> <span class='hs-varop'>.</span> <span class='hs-varid'>filter</span> <span class='hs-layout'>(</span><span class='hs-varid'>not</span> <span class='hs-varop'>.</span> <span class='hs-varid'>isAggregate</span> <span class='hs-varop'>.</span> <span class='hs-varid'>snd</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>projected</span> <span class='hs-varop'>$</span> <span class='hs-varid'>p</span> 
<a name="line-265"></a>    <span class='hs-varid'>toAttrExpr</span> <span class='hs-layout'>(</span><span class='hs-varid'>col</span><span class='hs-layout'>,</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>col</span><span class='hs-layout'>,</span> <span class='hs-conid'>AttrExpr</span> <span class='hs-varid'>col</span><span class='hs-layout'>)</span>
<a name="line-266"></a>    <span class='hs-comment'>-- Find all projected columns from subqueries.</span>
<a name="line-267"></a>    <span class='hs-varid'>projected</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PrimQuery</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Assoc</span>
<a name="line-268"></a>    <span class='hs-varid'>projected</span> <span class='hs-layout'>(</span><span class='hs-conid'>Project</span> <span class='hs-varid'>cols</span> <span class='hs-varid'>q</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cols</span>
<a name="line-269"></a>    <span class='hs-varid'>projected</span> <span class='hs-layout'>(</span><span class='hs-conid'>Restrict</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>q</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>projected</span> <span class='hs-varid'>q</span>
<a name="line-270"></a>    <span class='hs-varid'>projected</span> <span class='hs-layout'>(</span><span class='hs-conid'>Binary</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>q1</span> <span class='hs-varid'>q2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>projected</span> <span class='hs-varid'>q1</span> <span class='hs-varop'>++</span> <span class='hs-varid'>projected</span> <span class='hs-varid'>q2</span>
<a name="line-271"></a>    <span class='hs-varid'>projected</span> <span class='hs-layout'>(</span><span class='hs-conid'>BaseTable</span> <span class='hs-varid'>tblName</span> <span class='hs-varid'>cols</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>zip</span> <span class='hs-varid'>cols</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-conid'>AttrExpr</span> <span class='hs-varid'>cols</span><span class='hs-layout'>)</span>
<a name="line-272"></a>    <span class='hs-varid'>projected</span> <span class='hs-layout'>(</span><span class='hs-conid'>Special</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>q</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>projected</span> <span class='hs-varid'>q</span>
<a name="line-273"></a>    <span class='hs-comment'>-- Group and Empty are no-ops</span>
<a name="line-274"></a>    <span class='hs-varid'>projected</span> <span class='hs-layout'>(</span><span class='hs-conid'>Group</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-275"></a>    <span class='hs-varid'>projected</span> <span class='hs-conid'>Empty</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-276"></a>
<a name="line-277"></a>
<a name="line-278"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-279"></a><span class='hs-comment'>-- Binary operations</span>
<a name="line-280"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-281"></a>
<a name="line-282"></a><a name="binrel"></a><span class='hs-definition'>binrel</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RelOp</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-283"></a><span class='hs-definition'>binrel</span> <span class='hs-varid'>op</span> <span class='hs-layout'>(</span><span class='hs-conid'>Query</span> <span class='hs-varid'>q1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Query</span> <span class='hs-varid'>q2</span><span class='hs-layout'>)</span>
<a name="line-284"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span><span class='hs-varid'>primQ</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-285"></a>      <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>a1</span> <span class='hs-varid'>scheme1</span><span class='hs-layout'>,</span><span class='hs-layout'>(</span><span class='hs-varid'>j</span><span class='hs-layout'>,</span><span class='hs-varid'>primQ1</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>q1</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span><span class='hs-varid'>primQ</span><span class='hs-layout'>)</span>
<a name="line-286"></a>          <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>a2</span> <span class='hs-varid'>scheme2</span><span class='hs-layout'>,</span><span class='hs-layout'>(</span><span class='hs-varid'>alias</span><span class='hs-layout'>,</span><span class='hs-varid'>primQ2</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>q2</span> <span class='hs-layout'>(</span><span class='hs-varid'>j</span><span class='hs-layout'>,</span><span class='hs-varid'>primQ</span><span class='hs-layout'>)</span>
<a name="line-287"></a>          
<a name="line-288"></a>          <span class='hs-varid'>scheme</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>scheme1</span>
<a name="line-289"></a>
<a name="line-290"></a>          <span class='hs-varid'>assoc1</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>zip</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>fresh</span> <span class='hs-varid'>alias</span><span class='hs-layout'>)</span> <span class='hs-varid'>scheme1</span><span class='hs-layout'>)</span>
<a name="line-291"></a>          		<span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-conid'>AttrExpr</span> <span class='hs-varop'>.</span> <span class='hs-varid'>fresh</span> <span class='hs-varid'>a1</span><span class='hs-layout'>)</span> <span class='hs-varid'>scheme1</span><span class='hs-layout'>)</span>
<a name="line-292"></a>          <span class='hs-varid'>assoc2</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>zip</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>fresh</span> <span class='hs-varid'>alias</span><span class='hs-layout'>)</span> <span class='hs-varid'>scheme2</span><span class='hs-layout'>)</span>
<a name="line-293"></a>          		<span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-conid'>AttrExpr</span> <span class='hs-varop'>.</span> <span class='hs-varid'>fresh</span> <span class='hs-varid'>a2</span><span class='hs-layout'>)</span> <span class='hs-varid'>scheme2</span><span class='hs-layout'>)</span>
<a name="line-294"></a>
<a name="line-295"></a>          <span class='hs-varid'>r1</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Project</span> <span class='hs-varid'>assoc1</span> <span class='hs-varid'>primQ1</span>
<a name="line-296"></a>          <span class='hs-varid'>r2</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Project</span> <span class='hs-varid'>assoc2</span> <span class='hs-varid'>primQ2</span>
<a name="line-297"></a>          <span class='hs-varid'>r</span>       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Binary</span> <span class='hs-varid'>op</span> <span class='hs-varid'>r1</span> <span class='hs-varid'>r2</span>
<a name="line-298"></a>      <span class='hs-keyword'>in</span>
<a name="line-299"></a>          <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>alias</span> <span class='hs-varid'>scheme</span><span class='hs-layout'>,</span><span class='hs-layout'>(</span><span class='hs-varid'>alias</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span><span class='hs-layout'>,</span> <span class='hs-varid'>times</span> <span class='hs-varid'>r</span> <span class='hs-varid'>primQ</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>)</span>
<a name="line-300"></a>
<a name="line-301"></a><a name="union"></a><span class='hs-comment'>-- | Return all records which are present in at least</span>
<a name="line-302"></a><span class='hs-comment'>--   one of the relations.</span>
<a name="line-303"></a><span class='hs-definition'>union</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-304"></a><span class='hs-definition'>union</span>           <span class='hs-keyglyph'>=</span> <span class='hs-varid'>binrel</span> <span class='hs-conid'>Union</span>
<a name="line-305"></a>
<a name="line-306"></a><a name="intersect"></a><span class='hs-comment'>-- | Return all records which are present in both relations.</span>
<a name="line-307"></a><span class='hs-definition'>intersect</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> 
<a name="line-308"></a><span class='hs-definition'>intersect</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>binrel</span> <span class='hs-conid'>Intersect</span>
<a name="line-309"></a>
<a name="line-310"></a><a name="divide"></a><span class='hs-comment'>-- | Not in SQL92.</span>
<a name="line-311"></a><span class='hs-definition'>divide</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> 
<a name="line-312"></a><span class='hs-definition'>divide</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>binrel</span> <span class='hs-conid'>Divide</span>
<a name="line-313"></a>
<a name="line-314"></a><a name="minus"></a><span class='hs-comment'>-- | Return all records from the first relation that are not </span>
<a name="line-315"></a><span class='hs-comment'>--   present in the second relation.</span>
<a name="line-316"></a><span class='hs-definition'>minus</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-317"></a><span class='hs-definition'>minus</span>           <span class='hs-keyglyph'>=</span> <span class='hs-varid'>binrel</span> <span class='hs-conid'>Difference</span>
<a name="line-318"></a>
<a name="line-319"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-320"></a><span class='hs-comment'>-- Tables</span>
<a name="line-321"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-322"></a>
<a name="line-323"></a><a name="table"></a><span class='hs-comment'>-- | Return all records from a specific table.</span>
<a name="line-324"></a><span class='hs-definition'>table</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>ShowRecRow</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Table</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-325"></a><span class='hs-definition'>table</span> <span class='hs-layout'>(</span><span class='hs-conid'>Table</span> <span class='hs-varid'>name</span> <span class='hs-varid'>assoc</span><span class='hs-layout'>)</span>
<a name="line-326"></a>        <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-327"></a>	  <span class='hs-varid'>alias</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newAlias</span>
<a name="line-328"></a>          <span class='hs-keyword'>let</span> <span class='hs-varid'>newAssoc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-varid'>attr</span><span class='hs-layout'>,</span><span class='hs-varid'>expr</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>fresh</span> <span class='hs-varid'>alias</span> <span class='hs-varid'>attr</span><span class='hs-layout'>,</span><span class='hs-varid'>expr</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>assoc</span>
<a name="line-329"></a>	      <span class='hs-varid'>scheme</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-varid'>fst</span> <span class='hs-varid'>assoc</span>
<a name="line-330"></a>	      <span class='hs-varid'>q</span>        <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Project</span> <span class='hs-varid'>newAssoc</span> <span class='hs-layout'>(</span><span class='hs-conid'>BaseTable</span> <span class='hs-varid'>name</span> <span class='hs-varid'>scheme</span><span class='hs-layout'>)</span>
<a name="line-331"></a>	  <span class='hs-varid'>updatePrimQuery</span> <span class='hs-layout'>(</span><span class='hs-varid'>times</span> <span class='hs-varid'>q</span><span class='hs-layout'>)</span>
<a name="line-332"></a>          <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>alias</span> <span class='hs-varid'>scheme</span><span class='hs-layout'>)</span>
<a name="line-333"></a>
<a name="line-334"></a><a name="tableName"></a><span class='hs-comment'>-- | Get the name of a table.</span>
<a name="line-335"></a><span class='hs-definition'>tableName</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Table</span> <span class='hs-varid'>t</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TableName</span>
<a name="line-336"></a><span class='hs-definition'>tableName</span> <span class='hs-layout'>(</span><span class='hs-conid'>Table</span> <span class='hs-varid'>n</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>n</span>
<a name="line-337"></a>
<a name="line-338"></a><a name="tableRec"></a><span class='hs-comment'>-- Type-level function to return the type of a table's row.</span>
<a name="line-339"></a><span class='hs-definition'>tableRec</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Table</span> <span class='hs-layout'>(</span><span class='hs-conid'>Record</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Record</span> <span class='hs-varid'>r</span>
<a name="line-340"></a><span class='hs-definition'>tableRec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"tableRec should never be evaluated."</span>
<a name="line-341"></a>
<a name="line-342"></a><a name="baseTable"></a><span class='hs-comment'>-- used in table definitions</span>
<a name="line-343"></a><span class='hs-definition'>baseTable</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>ShowLabels</span> <span class='hs-varid'>r</span><span class='hs-layout'>,</span> <span class='hs-conid'>ToPrimExprs</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>TableName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Record</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Table</span> <span class='hs-varid'>r</span>
<a name="line-344"></a><span class='hs-definition'>baseTable</span> <span class='hs-varid'>t</span> <span class='hs-varid'>r</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Table</span> <span class='hs-varid'>t</span> <span class='hs-layout'>(</span><span class='hs-varid'>zip</span> <span class='hs-layout'>(</span><span class='hs-varid'>labels</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>exprs</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-345"></a>
<a name="line-346"></a><a name="emptyTable"></a><span class='hs-comment'>-- | For queries against fake tables, such as</span>
<a name="line-347"></a><span class='hs-comment'>-- 'information_schema.information_schema_catalog_name'. Useful for</span>
<a name="line-348"></a><span class='hs-comment'>-- constructing queries that contain constant data (and do not select</span>
<a name="line-349"></a><span class='hs-comment'>-- from columns) but need a table to select from.</span>
<a name="line-350"></a><span class='hs-definition'>emptyTable</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TableName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Table</span> <span class='hs-layout'>(</span><span class='hs-conid'>Record</span> <span class='hs-conid'>RecNil</span><span class='hs-layout'>)</span>
<a name="line-351"></a><span class='hs-definition'>emptyTable</span> <span class='hs-varid'>t</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Table</span> <span class='hs-varid'>t</span> <span class='hs-conid'>[]</span>
<a name="line-352"></a>
<a name="line-353"></a><a name="attribute"></a><span class='hs-definition'>attribute</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span>
<a name="line-354"></a><span class='hs-definition'>attribute</span> <span class='hs-varid'>name</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>AttrExpr</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span>
<a name="line-355"></a>
<a name="line-356"></a><a name="namedParam"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-357"></a><span class='hs-comment'>-- Expressions</span>
<a name="line-358"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-359"></a><span class='hs-comment'>-- | Create a named parameter with a default value.</span>
<a name="line-360"></a><span class='hs-definition'>namedParam</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-comment'>-- ^ Name of the parameter.</span>
<a name="line-361"></a>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-comment'>-- ^ Default value for the parameter.</span>
<a name="line-362"></a>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> 
<a name="line-363"></a><span class='hs-definition'>namedParam</span> <span class='hs-varid'>n</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>def</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>ParamExpr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-varid'>def</span><span class='hs-layout'>)</span> 
<a name="line-364"></a>
<a name="line-365"></a><a name="param"></a><span class='hs-comment'>-- | Create an anonymous parameter with a default value.</span>
<a name="line-366"></a><span class='hs-definition'>param</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-comment'>-- ^ Default value.</span>
<a name="line-367"></a>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span>
<a name="line-368"></a><span class='hs-definition'>param</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>def</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>ParamExpr</span> <span class='hs-conid'>Nothing</span> <span class='hs-varid'>def</span><span class='hs-layout'>)</span> 
<a name="line-369"></a>
<a name="line-370"></a><a name="unop"></a><span class='hs-definition'>unop</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>UnOp</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>b</span>
<a name="line-371"></a><span class='hs-definition'>unop</span> <span class='hs-varid'>op</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>primExpr</span><span class='hs-layout'>)</span>
<a name="line-372"></a>                <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>UnExpr</span> <span class='hs-varid'>op</span> <span class='hs-varid'>primExpr</span><span class='hs-layout'>)</span>
<a name="line-373"></a>
<a name="line-374"></a><a name="binop"></a><span class='hs-definition'>binop</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>BinOp</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>c</span>
<a name="line-375"></a><span class='hs-definition'>binop</span> <span class='hs-varid'>op</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>primExpr1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>primExpr2</span><span class='hs-layout'>)</span>
<a name="line-376"></a>                <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>BinExpr</span> <span class='hs-varid'>op</span> <span class='hs-varid'>primExpr1</span> <span class='hs-varid'>primExpr2</span><span class='hs-layout'>)</span>
<a name="line-377"></a>
<a name="line-378"></a><a name=".==."></a><span class='hs-comment'>-- | Equality comparison on Exprs, = in SQL.</span>
<a name="line-379"></a><span class='hs-layout'>(</span><span class='hs-varop'>.==.</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Eq</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Bool</span>
<a name="line-380"></a><span class='hs-layout'>(</span><span class='hs-varop'>.==.</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>binop</span> <span class='hs-conid'>OpEq</span>
<a name="line-381"></a>
<a name="line-382"></a><a name=".%3c%3e."></a><span class='hs-comment'>-- | Inequality on Exprs, &lt;&gt; in SQL.</span>
<a name="line-383"></a><span class='hs-layout'>(</span><span class='hs-varop'>.&lt;&gt;.</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Eq</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Bool</span>
<a name="line-384"></a><span class='hs-layout'>(</span><span class='hs-varop'>.&lt;&gt;.</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>binop</span> <span class='hs-conid'>OpNotEq</span>
<a name="line-385"></a>
<a name="line-386"></a><a name=".%3c."></a><span class='hs-layout'>(</span><span class='hs-varop'>.&lt;.</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Bool</span>
<a name="line-387"></a><span class='hs-layout'>(</span><span class='hs-varop'>.&lt;.</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>binop</span> <span class='hs-conid'>OpLt</span>
<a name="line-388"></a>
<a name="line-389"></a><a name=".%3c=."></a><span class='hs-layout'>(</span><span class='hs-varop'>.&lt;=.</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Bool</span>
<a name="line-390"></a><span class='hs-layout'>(</span><span class='hs-varop'>.&lt;=.</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>binop</span> <span class='hs-conid'>OpLtEq</span>
<a name="line-391"></a>
<a name="line-392"></a><a name=".%3e."></a><span class='hs-layout'>(</span><span class='hs-varop'>.&gt;.</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Bool</span>
<a name="line-393"></a><span class='hs-layout'>(</span><span class='hs-varop'>.&gt;.</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>binop</span> <span class='hs-conid'>OpGt</span>
<a name="line-394"></a>
<a name="line-395"></a><a name=".%3e=."></a><span class='hs-layout'>(</span><span class='hs-varop'>.&gt;=.</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Bool</span>
<a name="line-396"></a><span class='hs-layout'>(</span><span class='hs-varop'>.&gt;=.</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>binop</span> <span class='hs-conid'>OpGtEq</span>
<a name="line-397"></a>
<a name="line-398"></a><span class='hs-comment'>-- | The inverse of an Expr Bool.</span>
<a name="line-399"></a><span class='hs-sel'>_not</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Bool</span>
<a name="line-400"></a><span class='hs-sel'>_not</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unop</span> <span class='hs-conid'>OpNot</span>
<a name="line-401"></a>
<a name="line-402"></a><a name=".&&."></a><span class='hs-comment'>-- | \"Logical and\" on 'Expr', AND in SQL.</span>
<a name="line-403"></a><span class='hs-layout'>(</span><span class='hs-varop'>.&amp;&amp;.</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>::</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Bool</span>
<a name="line-404"></a><span class='hs-layout'>(</span><span class='hs-varop'>.&amp;&amp;.</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>binop</span> <span class='hs-conid'>OpAnd</span>
<a name="line-405"></a>
<a name="line-406"></a><a name=".%7c%7c."></a><span class='hs-comment'>-- | \"Logical or\" on 'Expr'. OR in SQL.</span>
<a name="line-407"></a><span class='hs-layout'>(</span><span class='hs-varop'>.||.</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Bool</span>
<a name="line-408"></a><span class='hs-layout'>(</span><span class='hs-varop'>.||.</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>binop</span> <span class='hs-conid'>OpOr</span>
<a name="line-409"></a>
<a name="line-410"></a><a name="like"></a><span class='hs-comment'>-- | The HaskellDB counterpart to the SQL LIKE keyword.</span>
<a name="line-411"></a><span class='hs-comment'>-- In the expresions, % is a wildcard representing any characters</span>
<a name="line-412"></a><span class='hs-comment'>-- in the same position relavtive to the given characters and</span>
<a name="line-413"></a><span class='hs-comment'>-- _ is a wildcard representing one character e.g.</span>
<a name="line-414"></a><span class='hs-comment'>--</span>
<a name="line-415"></a><span class='hs-comment'>-- &gt; like (constant "ABCDEFFF") (constant "AB%F_F")</span>
<a name="line-416"></a><span class='hs-comment'>-- </span>
<a name="line-417"></a><span class='hs-comment'>-- is true while</span>
<a name="line-418"></a><span class='hs-comment'>-- </span>
<a name="line-419"></a><span class='hs-comment'>-- &gt; like (constant "ABCDEF") (constant "AC%F") </span>
<a name="line-420"></a><span class='hs-comment'>-- </span>
<a name="line-421"></a><span class='hs-comment'>-- is false.</span>
<a name="line-422"></a><span class='hs-comment'>--</span>
<a name="line-423"></a><span class='hs-comment'>-- Note that SQL92 does not specify whether LIKE is case-sensitive or not.</span>
<a name="line-424"></a><span class='hs-comment'>-- Different database systems implement this differently.</span>
<a name="line-425"></a><span class='hs-definition'>like</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Bool</span>
<a name="line-426"></a><span class='hs-definition'>like</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>binop</span> <span class='hs-conid'>OpLike</span>
<a name="line-427"></a>
<a name="line-428"></a><span class='hs-comment'>-- | Returns true if the value of the first operand is</span>
<a name="line-429"></a><span class='hs-comment'>--   equal to the value of any of the expressions in the </span>
<a name="line-430"></a><span class='hs-comment'>--   list operand. </span>
<a name="line-431"></a><span class='hs-sel'>_in</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Eq</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Bool</span>
<a name="line-432"></a><span class='hs-sel'>_in</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>ys</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>BinExpr</span> <span class='hs-conid'>OpIn</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-conid'>ListExpr</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>y</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>ys</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-433"></a>
<a name="line-434"></a>
<a name="line-435"></a><a name="cat"></a><span class='hs-comment'>-- | Produces the concatenation of two String-expressions.</span>
<a name="line-436"></a><span class='hs-definition'>cat</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>String</span>
<a name="line-437"></a><span class='hs-definition'>cat</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>binop</span> <span class='hs-conid'>OpCat</span>
<a name="line-438"></a>
<a name="line-439"></a><a name=".++."></a><span class='hs-comment'>-- | Concatenates two String-expressions. </span>
<a name="line-440"></a><span class='hs-layout'>(</span><span class='hs-varop'>.++.</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>String</span>
<a name="line-441"></a><span class='hs-layout'>(</span><span class='hs-varop'>.++.</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cat</span>
<a name="line-442"></a>
<a name="line-443"></a><span class='hs-comment'>-- | Gets the length of a string.</span>
<a name="line-444"></a><span class='hs-sel'>_length</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Int</span>
<a name="line-445"></a><span class='hs-sel'>_length</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unop</span> <span class='hs-conid'>OpLength</span>
<a name="line-446"></a>
<a name="line-447"></a><a name="numop"></a><span class='hs-definition'>numop</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Num</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>BinOp</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span>
<a name="line-448"></a><span class='hs-definition'>numop</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>binop</span>
<a name="line-449"></a>
<a name="line-450"></a><a name=".+."></a><span class='hs-comment'>-- | Addition</span>
<a name="line-451"></a><span class='hs-layout'>(</span><span class='hs-varop'>.+.</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Num</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span>
<a name="line-452"></a><span class='hs-layout'>(</span><span class='hs-varop'>.+.</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>numop</span> <span class='hs-conid'>OpPlus</span>
<a name="line-453"></a><a name=".-."></a><span class='hs-comment'>-- | Subtraction </span>
<a name="line-454"></a><span class='hs-layout'>(</span><span class='hs-varop'>.-.</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Num</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span>
<a name="line-455"></a><span class='hs-layout'>(</span><span class='hs-varop'>.-.</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>numop</span> <span class='hs-conid'>OpMinus</span>
<a name="line-456"></a><a name=".*."></a><span class='hs-comment'>-- | Multiplication</span>
<a name="line-457"></a><span class='hs-layout'>(</span><span class='hs-varop'>.*.</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Num</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span>
<a name="line-458"></a><span class='hs-layout'>(</span><span class='hs-varop'>.*.</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>numop</span> <span class='hs-conid'>OpMul</span>
<a name="line-459"></a><a name="./."></a><span class='hs-comment'>-- | Division</span>
<a name="line-460"></a><span class='hs-layout'>(</span><span class='hs-varop'>./.</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Num</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span>
<a name="line-461"></a><span class='hs-layout'>(</span><span class='hs-varop'>./.</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>numop</span> <span class='hs-conid'>OpDiv</span>
<a name="line-462"></a><a name=".%25."></a><span class='hs-comment'>-- | Modulo</span>
<a name="line-463"></a><span class='hs-layout'>(</span><span class='hs-varop'>.%.</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Num</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span>
<a name="line-464"></a><span class='hs-layout'>(</span><span class='hs-varop'>.%.</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>numop</span> <span class='hs-conid'>OpMod</span>
<a name="line-465"></a>
<a name="line-466"></a><a name="isNull"></a><span class='hs-comment'>-- | Returns true if the expression is Null.</span>
<a name="line-467"></a><span class='hs-definition'>isNull</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Bool</span>
<a name="line-468"></a><span class='hs-definition'>isNull</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unop</span> <span class='hs-conid'>OpIsNull</span>
<a name="line-469"></a>
<a name="line-470"></a><a name="notNull"></a><span class='hs-comment'>-- | The inverse of 'isNull', returns false</span>
<a name="line-471"></a><span class='hs-comment'>-- if the expression supplied is Null.</span>
<a name="line-472"></a><span class='hs-definition'>notNull</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-conid'>Bool</span>
<a name="line-473"></a><span class='hs-definition'>notNull</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unop</span> <span class='hs-conid'>OpIsNotNull</span>
<a name="line-474"></a>
<a name="line-475"></a><span class='hs-comment'>-- | Creates a conditional expression.</span>
<a name="line-476"></a><span class='hs-comment'>--   Returns the value of the expression corresponding to the first </span>
<a name="line-477"></a><span class='hs-comment'>--   true condition. If none of the conditions are true, the value of</span>
<a name="line-478"></a><span class='hs-comment'>--   the else-expression is returned.</span>
<a name="line-479"></a><span class='hs-sel'>_case</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>,</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-comment'>-- ^ A list of conditions and expressions.</span>
<a name="line-480"></a>      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span>                <span class='hs-comment'>-- ^ Else-expression. </span>
<a name="line-481"></a>      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span>
<a name="line-482"></a><span class='hs-sel'>_case</span> <span class='hs-varid'>cs</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>el</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>CaseExpr</span> <span class='hs-keyglyph'>[</span> <span class='hs-layout'>(</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>cs</span><span class='hs-keyglyph'>]</span> <span class='hs-varid'>el</span><span class='hs-layout'>)</span>
<a name="line-483"></a>
<a name="line-484"></a><a name="BStrToStr"></a><span class='hs-comment'>-- | Class which can convert BoundedStrings to normal strings,</span>
<a name="line-485"></a><a name="BStrToStr"></a><span class='hs-comment'>-- even inside type constructors. Useful when a field</span>
<a name="line-486"></a><a name="BStrToStr"></a><span class='hs-comment'>-- is defined as a BoundedString (e.g. "Expr BStr10" or "Expr (Maybe BStr20)") but</span>
<a name="line-487"></a><a name="BStrToStr"></a><span class='hs-comment'>-- it needs to be used in an expression context. The example below illustrates a</span>
<a name="line-488"></a><a name="BStrToStr"></a><span class='hs-comment'>-- table with at least two fields, strField and bStrField. The first is defined as</span>
<a name="line-489"></a><a name="BStrToStr"></a><span class='hs-comment'>-- containing strings, the second as containing strings up to 10 characters long. The</span>
<a name="line-490"></a><a name="BStrToStr"></a><span class='hs-comment'>-- @toStr@ function must be used to convert the bStrField into the appropriate type for</span>
<a name="line-491"></a><a name="BStrToStr"></a><span class='hs-comment'>-- projecting as the strField:</span>
<a name="line-492"></a><a name="BStrToStr"></a><span class='hs-comment'>--</span>
<a name="line-493"></a><a name="BStrToStr"></a><span class='hs-comment'>-- &gt; type SomeTable = (RecCons StrField (Expr String)</span>
<a name="line-494"></a><a name="BStrToStr"></a><span class='hs-comment'>-- &gt;                    (RecCons BStrField (Expr BStr10) ... ))</span>
<a name="line-495"></a><a name="BStrToStr"></a><span class='hs-comment'>--</span>
<a name="line-496"></a><a name="BStrToStr"></a><span class='hs-comment'>-- &gt; someTable :: Table SomeTable</span>
<a name="line-497"></a><a name="BStrToStr"></a><span class='hs-comment'>-- &gt; someTable = ...</span>
<a name="line-498"></a><a name="BStrToStr"></a><span class='hs-comment'>--</span>
<a name="line-499"></a><a name="BStrToStr"></a><span class='hs-comment'>-- &gt; strField :: Attr StrField String</span>
<a name="line-500"></a><a name="BStrToStr"></a><span class='hs-comment'>-- &gt; strField = ...</span>
<a name="line-501"></a><a name="BStrToStr"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-502"></a><a name="BStrToStr"></a><span class='hs-comment'>-- &gt; bstrField :: Attr BStrField (BStr10)</span>
<a name="line-503"></a><a name="BStrToStr"></a><span class='hs-comment'>-- &gt; bstrField = ...</span>
<a name="line-504"></a><a name="BStrToStr"></a><span class='hs-comment'>-- &gt; </span>
<a name="line-505"></a><a name="BStrToStr"></a><span class='hs-comment'>-- &gt; query = do</span>
<a name="line-506"></a><a name="BStrToStr"></a><span class='hs-comment'>-- &gt;  t &lt;- table someTable</span>
<a name="line-507"></a><a name="BStrToStr"></a><span class='hs-comment'>-- &gt;  project $ strField &lt;&lt; toStr $ t ! bstrField</span>
<a name="line-508"></a><a name="BStrToStr"></a><span class='hs-comment'>--</span>
<a name="line-509"></a><a name="BStrToStr"></a><span class='hs-keyword'>class</span> <span class='hs-conid'>BStrToStr</span> <span class='hs-varid'>s</span> <span class='hs-varid'>d</span> <span class='hs-keyword'>where</span>
<a name="line-510"></a>  <span class='hs-comment'>-- | Convert a bounded string to a real string.</span>
<a name="line-511"></a>  <span class='hs-varid'>toStr</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>d</span>
<a name="line-512"></a>
<a name="line-513"></a><a name="instance%20BStrToStr%20(Expr%20(BoundedString%20n))%20(Expr%20String)"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Size</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>BStrToStr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>BoundedString</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-conid'>String</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-514"></a>  <span class='hs-varid'>toStr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span>
<a name="line-515"></a>
<a name="line-516"></a><a name="instance%20BStrToStr%20(Expr%20(Maybe%20(BoundedString%20n)))%20(Expr%20(Maybe%20String))"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Size</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>BStrToStr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>BoundedString</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>String</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-517"></a>  <span class='hs-varid'>toStr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span>
<a name="line-518"></a>
<a name="line-519"></a><a name="instance%20BStrToStr%20(Expr%20(Maybe%20String))%20(Expr%20(Maybe%20String))"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>BStrToStr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>String</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>String</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-520"></a>  <span class='hs-varid'>toStr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span>
<a name="line-521"></a>
<a name="line-522"></a><a name="instance%20BStrToStr%20(Expr%20String)%20(Expr%20String)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>BStrToStr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-conid'>String</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-conid'>String</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-523"></a>  <span class='hs-varid'>toStr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span>
<a name="line-524"></a>
<a name="line-525"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-526"></a><span class='hs-comment'>-- Using arbitrary SQL functions in a type-safe way.</span>
<a name="line-527"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-528"></a>
<a name="line-529"></a><a name="IsExpr"></a><span class='hs-comment'>-- | Used to implement variable length arguments to @func@, below.</span>
<a name="line-530"></a><a name="IsExpr"></a><span class='hs-keyword'>class</span> <span class='hs-conid'>Args</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>where</span>
<a name="line-531"></a>  <span class='hs-varid'>arg_</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>PrimExpr</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span>
<a name="line-532"></a>
<a name="line-533"></a><a name="IsExpr"></a><span class='hs-comment'>-- | Used to limit variable argument form of @func@ to only take @Expr@ types,</span>
<a name="line-534"></a><a name="IsExpr"></a><span class='hs-comment'>-- and ignore @ExprAggr@ types.</span>
<a name="line-535"></a><a name="IsExpr"></a><span class='hs-keyword'>class</span> <span class='hs-conid'>IsExpr</span> <span class='hs-varid'>a</span>
<a name="line-536"></a>
<a name="line-537"></a><a name="instance%20IsExpr%20(Expr%20a%20-%3e%20tail)%20instance%20IsExpr%20(Expr%20a)%20instance%20(IsExpr%20tail,%20Args%20tail)%20=%3e%20Args%20(Expr%20a%20-%3e%20tail)"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>IsExpr</span> <span class='hs-varid'>tail</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>IsExpr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>tail</span><span class='hs-layout'>)</span>
<a name="line-538"></a>
<a name="line-539"></a><a name="instance%20Args%20(Expr%20a%20-%3e%20tail)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>IsExpr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-540"></a>
<a name="line-541"></a><a name="instance%20Args%20(Expr%20a%20-%3e%20tail)"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>IsExpr</span> <span class='hs-varid'>tail</span><span class='hs-layout'>,</span> <span class='hs-conid'>Args</span> <span class='hs-varid'>tail</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Args</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>tail</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-542"></a>  <span class='hs-varid'>arg_</span> <span class='hs-varid'>name</span> <span class='hs-varid'>exprs</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>prim</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>arg_</span> <span class='hs-varid'>name</span> <span class='hs-layout'>(</span><span class='hs-varid'>prim</span> <span class='hs-conop'>:</span> <span class='hs-varid'>exprs</span><span class='hs-layout'>)</span>
<a name="line-543"></a>
<a name="line-544"></a><a name="instance%20Args%20(Expr%20a)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Args</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-545"></a>  <span class='hs-comment'>-- Reverse necessary because arguments are built in reverse order by instances</span>
<a name="line-546"></a>  <span class='hs-comment'>-- of Args above.</span>
<a name="line-547"></a>  <span class='hs-varid'>arg_</span> <span class='hs-varid'>name</span> <span class='hs-varid'>exprs</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>FunExpr</span> <span class='hs-varid'>name</span> <span class='hs-layout'>(</span><span class='hs-varid'>reverse</span> <span class='hs-varid'>exprs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-548"></a>
<a name="line-549"></a><a name="instance%20Args%20(Expr%20a%20-%3e%20ExprAggr%20c)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Args</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ExprAggr</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-550"></a>  <span class='hs-varid'>arg_</span> <span class='hs-varid'>name</span> <span class='hs-varid'>exprs</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>prim</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ExprAggr</span> <span class='hs-layout'>(</span><span class='hs-conid'>AggrExpr</span> <span class='hs-layout'>(</span><span class='hs-conid'>AggrOther</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span> <span class='hs-varid'>prim</span><span class='hs-layout'>)</span>
<a name="line-551"></a>
<a name="line-552"></a><a name="func"></a><span class='hs-comment'>{- | Can be used to define SQL functions which will
<a name="line-553"></a>appear in queries. Each argument for the function is specified by its own Expr value. 
<a name="line-554"></a>Examples include:
<a name="line-555"></a>
<a name="line-556"></a>&gt;  lower :: Expr a -&gt; Expr (Maybe String) 
<a name="line-557"></a>&gt;  lower str = func "lower" str
<a name="line-558"></a>
<a name="line-559"></a>The arguments to the function do not have to be Expr if they can
<a name="line-560"></a>be converted to Expr:
<a name="line-561"></a>
<a name="line-562"></a>&gt;  data DatePart = Day | Century deriving Show 
<a name="line-563"></a>
<a name="line-564"></a>&gt;  datePart :: DatePart -&gt; Expr (Maybe CalendarTime) -&gt; Expr (Maybe Int) 
<a name="line-565"></a>&gt;  datePart date col = func "date_part" (constant $ show date) col
<a name="line-566"></a>
<a name="line-567"></a>Aggregate functions can also be defined. For example:
<a name="line-568"></a>
<a name="line-569"></a> &gt;  every :: Expr Bool -&gt; ExprAggr Bool 
<a name="line-570"></a> &gt;  every col = func "every" col
<a name="line-571"></a>
<a name="line-572"></a>Aggregates are implemented to always take one argument, so any attempt to
<a name="line-573"></a>define an aggregate with any more or less arguments will result in an error.
<a name="line-574"></a>
<a name="line-575"></a>Note that type signatures are usually required for each function defined,
<a name="line-576"></a>unless the arguments can be inferred.-}</span>
<a name="line-577"></a><span class='hs-definition'>func</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Args</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> 
<a name="line-578"></a><span class='hs-definition'>func</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>arg_</span> <span class='hs-varid'>name</span> <span class='hs-conid'>[]</span> 
<a name="line-579"></a>
<a name="line-580"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-581"></a><span class='hs-comment'>-- Default values</span>
<a name="line-582"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-583"></a>
<a name="line-584"></a><span class='hs-comment'>-- | The default value of the column. Only works with 'insert'.</span>
<a name="line-585"></a><span class='hs-sel'>_default</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ExprDefault</span> <span class='hs-varid'>a</span>
<a name="line-586"></a><span class='hs-sel'>_default</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ExprDefault</span> <span class='hs-layout'>(</span><span class='hs-conid'>ConstExpr</span> <span class='hs-conid'>DefaultLit</span><span class='hs-layout'>)</span>
<a name="line-587"></a>
<a name="line-588"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-589"></a><span class='hs-comment'>-- Constants</span>
<a name="line-590"></a><span class='hs-comment'>-- Maybe we should change the set according to the </span>
<a name="line-591"></a><span class='hs-comment'>-- database backend</span>
<a name="line-592"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-593"></a>
<a name="line-594"></a><a name="ShowConstant"></a><span class='hs-keyword'>class</span> <span class='hs-conid'>ShowConstant</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>where</span>
<a name="line-595"></a>    <span class='hs-varid'>showConstant</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Literal</span>
<a name="line-596"></a>
<a name="line-597"></a><a name="instance%20ShowConstant%20String"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>ShowConstant</span> <span class='hs-conid'>String</span> <span class='hs-keyword'>where</span>
<a name="line-598"></a>    <span class='hs-varid'>showConstant</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>StringLit</span>
<a name="line-599"></a><a name="instance%20ShowConstant%20Int"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>ShowConstant</span> <span class='hs-conid'>Int</span> <span class='hs-keyword'>where</span>
<a name="line-600"></a>    <span class='hs-varid'>showConstant</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>IntegerLit</span> <span class='hs-varop'>.</span> <span class='hs-varid'>fromIntegral</span>
<a name="line-601"></a><a name="instance%20ShowConstant%20Integer"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>ShowConstant</span> <span class='hs-conid'>Integer</span> <span class='hs-keyword'>where</span>
<a name="line-602"></a>    <span class='hs-varid'>showConstant</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>IntegerLit</span>
<a name="line-603"></a><a name="instance%20ShowConstant%20Double"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>ShowConstant</span> <span class='hs-conid'>Double</span> <span class='hs-keyword'>where</span>
<a name="line-604"></a>    <span class='hs-varid'>showConstant</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>DoubleLit</span>
<a name="line-605"></a><a name="instance%20ShowConstant%20Bool"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>ShowConstant</span> <span class='hs-conid'>Bool</span> <span class='hs-keyword'>where</span>
<a name="line-606"></a>    <span class='hs-varid'>showConstant</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BoolLit</span>
<a name="line-607"></a>
<a name="line-608"></a><a name="instance%20ShowConstant%20CalendarTime"></a><span class='hs-comment'>-- this assumes that all databases accept both date and time even when they</span>
<a name="line-609"></a><a name="instance%20ShowConstant%20CalendarTime"></a><span class='hs-comment'>-- only want date.</span>
<a name="line-610"></a><a name="instance%20ShowConstant%20CalendarTime"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>ShowConstant</span> <span class='hs-conid'>CalendarTime</span> <span class='hs-keyword'>where</span>
<a name="line-611"></a>    <span class='hs-varid'>showConstant</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>DateLit</span>
<a name="line-612"></a>
<a name="line-613"></a><a name="instance%20ShowConstant%20(Maybe%20a)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>ShowConstant</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>ShowConstant</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-614"></a>    <span class='hs-varid'>showConstant</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>maybe</span> <span class='hs-conid'>NullLit</span> <span class='hs-varid'>showConstant</span>
<a name="line-615"></a>
<a name="line-616"></a><a name="instance%20ShowConstant%20(BoundedString%20n)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Size</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>ShowConstant</span> <span class='hs-layout'>(</span><span class='hs-conid'>BoundedString</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-617"></a>    <span class='hs-varid'>showConstant</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>showConstant</span> <span class='hs-varop'>.</span> <span class='hs-varid'>fromBounded</span>
<a name="line-618"></a>
<a name="line-619"></a><a name="constant"></a><span class='hs-comment'>-- | Creates a constant expression from a haskell value.</span>
<a name="line-620"></a><span class='hs-definition'>constant</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ShowConstant</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span>
<a name="line-621"></a><span class='hs-definition'>constant</span> <span class='hs-varid'>x</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>ConstExpr</span> <span class='hs-layout'>(</span><span class='hs-varid'>showConstant</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-622"></a>
<a name="line-623"></a><a name="literal"></a><span class='hs-comment'>-- | Inserts the string literally - no escaping, no quoting.</span>
<a name="line-624"></a><span class='hs-definition'>literal</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span>
<a name="line-625"></a><span class='hs-definition'>literal</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>ConstExpr</span> <span class='hs-layout'>(</span><span class='hs-conid'>OtherLit</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-626"></a>
<a name="line-627"></a><a name="fromNull"></a><span class='hs-comment'>-- | Takes a default value a and a nullable value. If the value is NULL,</span>
<a name="line-628"></a><span class='hs-comment'>--   the default value is returned, otherwise the value itself is returned.</span>
<a name="line-629"></a><span class='hs-comment'>--   Simliar to 'fromMaybe'</span>
<a name="line-630"></a><span class='hs-definition'>fromNull</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span>         <span class='hs-comment'>-- ^ Default value (to be returned for 'Nothing')</span>
<a name="line-631"></a>	 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- ^ A nullable expression</span>
<a name="line-632"></a>	 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span>
<a name="line-633"></a><span class='hs-definition'>fromNull</span> <span class='hs-varid'>d</span> <span class='hs-varid'>x</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>px</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-sel'>_case</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>isNull</span> <span class='hs-varid'>x</span><span class='hs-layout'>,</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>px</span><span class='hs-layout'>)</span>
<a name="line-634"></a>
<a name="line-635"></a><a name="fromVal"></a><span class='hs-comment'>-- | Similar to fromNull, but takes a </span>
<a name="line-636"></a><span class='hs-comment'>-- value argument rather than an Expr.</span>
<a name="line-637"></a><span class='hs-definition'>fromVal</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ShowConstant</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>a</span> 
<a name="line-638"></a>        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-639"></a>        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span>
<a name="line-640"></a><span class='hs-definition'>fromVal</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromNull</span> <span class='hs-varop'>.</span> <span class='hs-varid'>constant</span> 
<a name="line-641"></a>
<a name="line-642"></a><a name="constExpr"></a><span class='hs-comment'>-- | Turn constant data into a nullable expression. </span>
<a name="line-643"></a><span class='hs-comment'>--   Same as @constant . Just@</span>
<a name="line-644"></a><span class='hs-definition'>constExpr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-645"></a><span class='hs-definition'>constExpr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-646"></a>
<a name="line-647"></a><a name="constVal"></a><span class='hs-comment'>-- | Turn constant data into a nullable expression. </span>
<a name="line-648"></a><span class='hs-comment'>--   Same as @constant . Just@</span>
<a name="line-649"></a><span class='hs-definition'>constVal</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ShowConstant</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-650"></a><span class='hs-definition'>constVal</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>constant</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-651"></a>
<a name="line-652"></a><a name="constNull"></a><span class='hs-comment'>-- | Represents a null value.</span>
<a name="line-653"></a><span class='hs-definition'>constNull</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-654"></a><span class='hs-definition'>constNull</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>ConstExpr</span> <span class='hs-conid'>NullLit</span><span class='hs-layout'>)</span>
<a name="line-655"></a>
<a name="line-656"></a><a name="cast"></a><span class='hs-comment'>-- | Generates a 'CAST' expression for the given</span>
<a name="line-657"></a><span class='hs-comment'>-- expression, using the argument given as the destination</span>
<a name="line-658"></a><span class='hs-comment'>-- type. </span>
<a name="line-659"></a><span class='hs-definition'>cast</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-comment'>-- ^ Destination type.</span>
<a name="line-660"></a>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-comment'>-- ^ Source expression.</span>
<a name="line-661"></a>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>b</span>
<a name="line-662"></a><span class='hs-definition'>cast</span> <span class='hs-varid'>typ</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>expr</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Expr</span> <span class='hs-layout'>(</span><span class='hs-conid'>CastExpr</span> <span class='hs-varid'>typ</span> <span class='hs-varid'>expr</span><span class='hs-layout'>)</span>
<a name="line-663"></a>
<a name="line-664"></a><a name="coerce"></a><span class='hs-comment'>-- | Coerce the type of an expression</span>
<a name="line-665"></a><span class='hs-comment'>-- to another type. Does not affect the actual</span>
<a name="line-666"></a><span class='hs-comment'>-- primitive value - only the `phantom' type.</span>
<a name="line-667"></a><span class='hs-definition'>coerce</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-comment'>-- ^ Source expression</span>
<a name="line-668"></a>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>b</span> <span class='hs-comment'>-- ^ Destination type.</span>
<a name="line-669"></a><span class='hs-definition'>coerce</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>e</span>
<a name="line-670"></a>
<a name="line-671"></a><a name="ConstantRecord"></a><span class='hs-comment'>-- | Converts records w/o Expr (usually from database</span>
<a name="line-672"></a><a name="ConstantRecord"></a><span class='hs-comment'>-- queries) to records with Expr types. </span>
<a name="line-673"></a><a name="ConstantRecord"></a><span class='hs-keyword'>class</span> <span class='hs-conid'>ConstantRecord</span> <span class='hs-varid'>r</span> <span class='hs-varid'>cr</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>cr</span> <span class='hs-keyword'>where</span>
<a name="line-674"></a>    <span class='hs-varid'>constantRecord</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>cr</span>
<a name="line-675"></a>
<a name="line-676"></a><a name="instance%20ConstantRecord%20(Record%20r)%20(Record%20cr)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>ConstantRecord</span> <span class='hs-varid'>r</span> <span class='hs-varid'>cr</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>ConstantRecord</span> <span class='hs-layout'>(</span><span class='hs-conid'>Record</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Record</span> <span class='hs-varid'>cr</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-677"></a>    <span class='hs-varid'>constantRecord</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>n</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>constantRecord</span> <span class='hs-layout'>(</span><span class='hs-varid'>r</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>
<a name="line-678"></a>
<a name="line-679"></a><a name="instance%20ConstantRecord%20RecNil%20RecNil"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>ConstantRecord</span> <span class='hs-conid'>RecNil</span> <span class='hs-conid'>RecNil</span> <span class='hs-keyword'>where</span>
<a name="line-680"></a>    <span class='hs-varid'>constantRecord</span> <span class='hs-conid'>RecNil</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>RecNil</span>
<a name="line-681"></a>
<a name="line-682"></a><a name="instance%20ConstantRecord%20(RecCons%20f%20a%20r)%20(RecCons%20f%20(Expr%20a)%20cr)"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>ShowConstant</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>ConstantRecord</span> <span class='hs-varid'>r</span> <span class='hs-varid'>cr</span><span class='hs-layout'>)</span>
<a name="line-683"></a>    <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>ConstantRecord</span> <span class='hs-layout'>(</span><span class='hs-conid'>RecCons</span> <span class='hs-varid'>f</span> <span class='hs-varid'>a</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>RecCons</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-varid'>cr</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-684"></a>    <span class='hs-varid'>constantRecord</span> <span class='hs-keyglyph'>~</span><span class='hs-layout'>(</span><span class='hs-conid'>RecCons</span> <span class='hs-varid'>x</span> <span class='hs-varid'>rs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>RecCons</span> <span class='hs-layout'>(</span><span class='hs-varid'>constant</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>constantRecord</span> <span class='hs-varid'>rs</span><span class='hs-layout'>)</span>
<a name="line-685"></a>
<a name="line-686"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-687"></a><span class='hs-comment'>-- Aggregate operators</span>
<a name="line-688"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-689"></a>
<a name="line-690"></a><a name="aggregate"></a><span class='hs-definition'>aggregate</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>AggrOp</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ExprAggr</span> <span class='hs-varid'>b</span>
<a name="line-691"></a><span class='hs-definition'>aggregate</span> <span class='hs-varid'>op</span> <span class='hs-layout'>(</span><span class='hs-conid'>Expr</span> <span class='hs-varid'>primExpr</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ExprAggr</span> <span class='hs-layout'>(</span><span class='hs-conid'>AggrExpr</span> <span class='hs-varid'>op</span> <span class='hs-varid'>primExpr</span><span class='hs-layout'>)</span>
<a name="line-692"></a>
<a name="line-693"></a><a name="count"></a><span class='hs-comment'>-- | Returns the number of records (=rows) in a query.</span>
<a name="line-694"></a><span class='hs-definition'>count</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ExprAggr</span> <span class='hs-conid'>Int</span>
<a name="line-695"></a><span class='hs-definition'>count</span> <span class='hs-varid'>x</span>		<span class='hs-keyglyph'>=</span> <span class='hs-varid'>aggregate</span> <span class='hs-conid'>AggrCount</span> <span class='hs-varid'>x</span>
<a name="line-696"></a>
<a name="line-697"></a><span class='hs-comment'>-- | Returns the total sum of a column.</span>
<a name="line-698"></a><span class='hs-sel'>_sum</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Num</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ExprAggr</span> <span class='hs-varid'>a</span>
<a name="line-699"></a><span class='hs-sel'>_sum</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>aggregate</span> <span class='hs-conid'>AggrSum</span> <span class='hs-varid'>x</span>
<a name="line-700"></a>
<a name="line-701"></a><span class='hs-comment'>-- | Returns the highest value of a column.</span>
<a name="line-702"></a><span class='hs-sel'>_max</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ExprAggr</span> <span class='hs-varid'>a</span>
<a name="line-703"></a><span class='hs-sel'>_max</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>aggregate</span> <span class='hs-conid'>AggrMax</span> <span class='hs-varid'>x</span>
<a name="line-704"></a>
<a name="line-705"></a><span class='hs-comment'>-- | Returns the lowest value of a column.</span>
<a name="line-706"></a><span class='hs-sel'>_min</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ExprAggr</span> <span class='hs-varid'>a</span>
<a name="line-707"></a><span class='hs-sel'>_min</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>aggregate</span> <span class='hs-conid'>AggrMin</span> <span class='hs-varid'>x</span>
<a name="line-708"></a>
<a name="line-709"></a><a name="avg"></a><span class='hs-comment'>-- | Returns the average of a column.</span>
<a name="line-710"></a><span class='hs-definition'>avg</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Num</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ExprAggr</span> <span class='hs-varid'>a</span>
<a name="line-711"></a><span class='hs-definition'>avg</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>aggregate</span> <span class='hs-conid'>AggrAvg</span> <span class='hs-varid'>x</span>
<a name="line-712"></a>
<a name="line-713"></a><a name="stddev"></a><span class='hs-comment'>-- | Returns the standard deviation of a column.</span>
<a name="line-714"></a><span class='hs-definition'>stddev</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Num</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ExprAggr</span> <span class='hs-varid'>a</span>
<a name="line-715"></a><span class='hs-definition'>stddev</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>aggregate</span> <span class='hs-conid'>AggrStdDev</span> <span class='hs-varid'>x</span>
<a name="line-716"></a>
<a name="line-717"></a><a name="stddevP"></a><span class='hs-definition'>stddevP</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Num</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ExprAggr</span> <span class='hs-varid'>a</span>
<a name="line-718"></a><span class='hs-definition'>stddevP</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>aggregate</span> <span class='hs-conid'>AggrStdDevP</span> <span class='hs-varid'>x</span>
<a name="line-719"></a>
<a name="line-720"></a><a name="variance"></a><span class='hs-comment'>-- | Returns the standard variance of a column.</span>
<a name="line-721"></a><span class='hs-definition'>variance</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Num</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ExprAggr</span> <span class='hs-varid'>a</span>
<a name="line-722"></a><span class='hs-definition'>variance</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>aggregate</span> <span class='hs-conid'>AggrVar</span> <span class='hs-varid'>x</span>
<a name="line-723"></a>
<a name="line-724"></a><a name="varianceP"></a><span class='hs-definition'>varianceP</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Num</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ExprAggr</span> <span class='hs-varid'>a</span>
<a name="line-725"></a><span class='hs-definition'>varianceP</span> <span class='hs-varid'>x</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>aggregate</span> <span class='hs-conid'>AggrVarP</span> <span class='hs-varid'>x</span>
<a name="line-726"></a>
<a name="line-727"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-728"></a><span class='hs-comment'>-- Special ops</span>
<a name="line-729"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-730"></a>
<a name="line-731"></a><a name="top"></a><span class='hs-comment'>-- | Return the n topmost records.</span>
<a name="line-732"></a><span class='hs-definition'>top</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Query</span> <span class='hs-conid'>()</span>
<a name="line-733"></a><span class='hs-definition'>top</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>updatePrimQuery_</span> <span class='hs-layout'>(</span><span class='hs-conid'>Special</span> <span class='hs-layout'>(</span><span class='hs-conid'>Top</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-734"></a>
<a name="line-735"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-736"></a><span class='hs-comment'>-- Ordering results</span>
<a name="line-737"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-738"></a>
<a name="line-739"></a><a name="orderOp"></a><span class='hs-definition'>orderOp</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HasField</span> <span class='hs-varid'>f</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>OrderOp</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Attr</span> <span class='hs-varid'>f</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OrderExpr</span>
<a name="line-740"></a><span class='hs-definition'>orderOp</span> <span class='hs-varid'>op</span> <span class='hs-varid'>rel</span> <span class='hs-varid'>attr</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>OrderExpr</span> <span class='hs-varid'>op</span> <span class='hs-varid'>expr</span>
<a name="line-741"></a>    <span class='hs-keyword'>where</span> <span class='hs-conid'>Expr</span> <span class='hs-varid'>expr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>select</span> <span class='hs-varid'>attr</span> <span class='hs-varid'>rel</span>
<a name="line-742"></a>
<a name="line-743"></a><a name="asc"></a><span class='hs-comment'>-- | Use this together with the function 'order' to </span>
<a name="line-744"></a><span class='hs-comment'>-- order the results of a query in ascending order.</span>
<a name="line-745"></a><span class='hs-comment'>-- Takes a relation and an attribute of that relation, which</span>
<a name="line-746"></a><span class='hs-comment'>-- is used for the ordering.</span>
<a name="line-747"></a><span class='hs-definition'>asc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HasField</span> <span class='hs-varid'>f</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Attr</span> <span class='hs-varid'>f</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OrderExpr</span>
<a name="line-748"></a><span class='hs-definition'>asc</span> <span class='hs-varid'>rel</span> <span class='hs-varid'>attr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>orderOp</span> <span class='hs-conid'>OpAsc</span> <span class='hs-varid'>rel</span> <span class='hs-varid'>attr</span>
<a name="line-749"></a>
<a name="line-750"></a><a name="desc"></a><span class='hs-comment'>-- | Use this together with the function 'order' to </span>
<a name="line-751"></a><span class='hs-comment'>-- order the results of a query in descending order.</span>
<a name="line-752"></a><span class='hs-comment'>-- Takes a relation and an attribute of that relation, which</span>
<a name="line-753"></a><span class='hs-comment'>-- is used for the ordering.</span>
<a name="line-754"></a><span class='hs-definition'>desc</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>HasField</span> <span class='hs-varid'>f</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Attr</span> <span class='hs-varid'>f</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OrderExpr</span>
<a name="line-755"></a><span class='hs-definition'>desc</span> <span class='hs-varid'>rel</span> <span class='hs-varid'>attr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>orderOp</span> <span class='hs-conid'>OpDesc</span> <span class='hs-varid'>rel</span> <span class='hs-varid'>attr</span>
<a name="line-756"></a>
<a name="line-757"></a><a name="order"></a><span class='hs-comment'>-- | Order the results of a query.</span>
<a name="line-758"></a><span class='hs-comment'>-- Use this with the 'asc' or 'desc' functions.</span>
<a name="line-759"></a><span class='hs-definition'>order</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>OrderExpr</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Query</span> <span class='hs-conid'>()</span>
<a name="line-760"></a><span class='hs-definition'>order</span> <span class='hs-varid'>xs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>updatePrimQuery_</span> <span class='hs-layout'>(</span><span class='hs-conid'>Special</span> <span class='hs-layout'>(</span><span class='hs-conid'>Order</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-761"></a>
<a name="line-762"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-763"></a><span class='hs-comment'>-- Query Monad</span>
<a name="line-764"></a><span class='hs-comment'>-----------------------------------------------------------</span>
<a name="line-765"></a>
<a name="line-766"></a><a name="unQuery"></a><span class='hs-definition'>unQuery</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Query</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span>
<a name="line-767"></a><span class='hs-definition'>unQuery</span> <span class='hs-layout'>(</span><span class='hs-conid'>Query</span> <span class='hs-varid'>g</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fst</span> <span class='hs-varop'>$</span> <span class='hs-varid'>g</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-layout'>,</span> <span class='hs-conid'>Empty</span><span class='hs-layout'>)</span>
<a name="line-768"></a>
<a name="line-769"></a><a name="runQuery"></a><span class='hs-definition'>runQuery</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PrimQuery</span>
<a name="line-770"></a><span class='hs-definition'>runQuery</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fst</span> <span class='hs-varop'>.</span> <span class='hs-varid'>runQueryRel</span>
<a name="line-771"></a>
<a name="line-772"></a><a name="runQueryRel"></a><span class='hs-definition'>runQueryRel</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimQuery</span><span class='hs-layout'>,</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-773"></a><span class='hs-definition'>runQueryRel</span> <span class='hs-layout'>(</span><span class='hs-conid'>Query</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>
<a name="line-774"></a>        <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>alias</span> <span class='hs-varid'>scheme</span><span class='hs-layout'>,</span><span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span><span class='hs-varid'>primQuery</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-layout'>,</span><span class='hs-conid'>Empty</span><span class='hs-layout'>)</span>
<a name="line-775"></a>              <span class='hs-varid'>assoc</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>zip</span> <span class='hs-varid'>scheme</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-conid'>AttrExpr</span> <span class='hs-varop'>.</span> <span class='hs-varid'>fresh</span> <span class='hs-varid'>alias</span><span class='hs-layout'>)</span> <span class='hs-varid'>scheme</span><span class='hs-layout'>)</span>
<a name="line-776"></a>          <span class='hs-keyword'>in</span>  <span class='hs-layout'>(</span><span class='hs-conid'>Project</span> <span class='hs-varid'>assoc</span> <span class='hs-varid'>primQuery</span><span class='hs-layout'>,</span> <span class='hs-conid'>Rel</span> <span class='hs-num'>0</span> <span class='hs-varid'>scheme</span><span class='hs-layout'>)</span>
<a name="line-777"></a>
<a name="line-778"></a><a name="subQuery"></a><span class='hs-comment'>-- | Allows a subquery to be created between another query and</span>
<a name="line-779"></a><span class='hs-comment'>-- this query. Normally query definition is associative and query definition</span>
<a name="line-780"></a><span class='hs-comment'>-- is interleaved. This combinator ensures the given query is</span>
<a name="line-781"></a><span class='hs-comment'>-- added as a whole piece.</span>
<a name="line-782"></a><span class='hs-definition'>subQuery</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-783"></a><span class='hs-definition'>subQuery</span> <span class='hs-layout'>(</span><span class='hs-conid'>Query</span> <span class='hs-varid'>qs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Query</span> <span class='hs-varid'>make</span>
<a name="line-784"></a>  <span class='hs-keyword'>where</span>
<a name="line-785"></a>    <span class='hs-varid'>make</span> <span class='hs-layout'>(</span><span class='hs-varid'>currentAlias</span><span class='hs-layout'>,</span> <span class='hs-varid'>currentQry</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-786"></a>        <span class='hs-comment'>-- Take the query to add and run it first, using the current alias as</span>
<a name="line-787"></a>        <span class='hs-comment'>-- a seed.</span>
<a name="line-788"></a>        <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>otherAlias</span> <span class='hs-varid'>otherScheme</span><span class='hs-layout'>,</span><span class='hs-layout'>(</span><span class='hs-varid'>newestAlias</span><span class='hs-layout'>,</span> <span class='hs-varid'>otherQuery</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>qs</span> <span class='hs-layout'>(</span><span class='hs-varid'>currentAlias</span><span class='hs-layout'>,</span><span class='hs-conid'>Empty</span><span class='hs-layout'>)</span>
<a name="line-789"></a>            <span class='hs-comment'>-- Effectively renames all columns in otherQuery to make them unique in this</span>
<a name="line-790"></a>            <span class='hs-comment'>-- query.</span>
<a name="line-791"></a>            <span class='hs-varid'>assoc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>zip</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>fresh</span> <span class='hs-varid'>newestAlias</span><span class='hs-layout'>)</span> <span class='hs-varid'>otherScheme</span><span class='hs-layout'>)</span>
<a name="line-792"></a>                        <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-conid'>AttrExpr</span> <span class='hs-varop'>.</span> <span class='hs-varid'>fresh</span> <span class='hs-varid'>otherAlias</span><span class='hs-layout'>)</span> <span class='hs-varid'>otherScheme</span><span class='hs-layout'>)</span>
<a name="line-793"></a>            <span class='hs-comment'>-- Produce a query which is a cross product of the other query and the current query.</span>
<a name="line-794"></a>        <span class='hs-keyword'>in</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rel</span> <span class='hs-varid'>newestAlias</span> <span class='hs-varid'>otherScheme</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>newestAlias</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span><span class='hs-layout'>,</span> <span class='hs-varid'>times</span> <span class='hs-layout'>(</span><span class='hs-conid'>Project</span> <span class='hs-varid'>assoc</span> <span class='hs-varid'>otherQuery</span><span class='hs-layout'>)</span> <span class='hs-varid'>currentQry</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-795"></a>            
<a name="line-796"></a><a name="instance%20Functor%20Query"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Functor</span> <span class='hs-conid'>Query</span> <span class='hs-keyword'>where</span>
<a name="line-797"></a>  <span class='hs-varid'>fmap</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>Query</span> <span class='hs-varid'>g</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>q0</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span><span class='hs-varid'>q1</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>g</span> <span class='hs-varid'>q0</span>  <span class='hs-keyword'>in</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>x</span><span class='hs-layout'>,</span><span class='hs-varid'>q1</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-798"></a>
<a name="line-799"></a><a name="instance%20Monad%20Query"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monad</span> <span class='hs-conid'>Query</span> <span class='hs-keyword'>where</span>
<a name="line-800"></a>  <span class='hs-varid'>return</span> <span class='hs-varid'>x</span>              <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>q0</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span><span class='hs-varid'>q0</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-801"></a>  <span class='hs-layout'>(</span><span class='hs-conid'>Query</span> <span class='hs-varid'>g</span><span class='hs-layout'>)</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>f</span>       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>q0</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span><span class='hs-varid'>q1</span><span class='hs-layout'>)</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>g</span> <span class='hs-varid'>q0</span>
<a name="line-802"></a>                                            <span class='hs-layout'>(</span><span class='hs-conid'>Query</span> <span class='hs-varid'>h</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span>
<a name="line-803"></a>                                        <span class='hs-keyword'>in</span>  <span class='hs-layout'>(</span><span class='hs-varid'>h</span> <span class='hs-varid'>q1</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-804"></a>
<a name="line-805"></a><a name="updatePrimQuery"></a><span class='hs-definition'>updatePrimQuery</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimQuery</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PrimQuery</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Query</span> <span class='hs-conid'>PrimQuery</span>
<a name="line-806"></a><span class='hs-definition'>updatePrimQuery</span> <span class='hs-varid'>f</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span><span class='hs-varid'>qt</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>qt</span><span class='hs-layout'>,</span><span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span><span class='hs-varid'>f</span> <span class='hs-varid'>qt</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-807"></a>
<a name="line-808"></a><a name="updatePrimQuery_"></a><span class='hs-definition'>updatePrimQuery_</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimQuery</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PrimQuery</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Query</span> <span class='hs-conid'>()</span>
<a name="line-809"></a><span class='hs-definition'>updatePrimQuery_</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>updatePrimQuery</span> <span class='hs-varid'>f</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-810"></a>
<a name="line-811"></a><a name="newAlias"></a><span class='hs-definition'>newAlias</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Query</span> <span class='hs-conid'>Alias</span>
<a name="line-812"></a><span class='hs-definition'>newAlias</span>                <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span><span class='hs-varid'>qt</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span><span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>,</span><span class='hs-varid'>qt</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-813"></a>
<a name="line-814"></a><a name="fresh"></a><span class='hs-comment'>-- fresh 0 is used in the 'Database' module</span>
<a name="line-815"></a><span class='hs-definition'>fresh</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Alias</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Attribute</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Attribute</span>
<a name="line-816"></a><span class='hs-definition'>fresh</span> <span class='hs-num'>0</span>     <span class='hs-varid'>attribute</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>attribute</span>
<a name="line-817"></a><span class='hs-definition'>fresh</span> <span class='hs-varid'>alias</span> <span class='hs-varid'>attribute</span>   <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>attribute</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>alias</span><span class='hs-layout'>)</span>
<a name="line-818"></a>
<a name="line-819"></a><a name="labels"></a><span class='hs-definition'>labels</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ShowLabels</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span>
<a name="line-820"></a><span class='hs-definition'>labels</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>recordLabels</span>
<a name="line-821"></a>
<a name="line-822"></a><a name="exprs"></a><span class='hs-comment'>-- Type safe version of exprs below. If we use this, we must add</span>
<a name="line-823"></a><span class='hs-comment'>--  ToPrimExprs r to a lot of functions</span>
<a name="line-824"></a><span class='hs-definition'>exprs</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ToPrimExprs</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Record</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>PrimExpr</span><span class='hs-keyglyph'>]</span>
<a name="line-825"></a><span class='hs-definition'>exprs</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>toPrimExprs</span> <span class='hs-layout'>(</span><span class='hs-varid'>r</span> <span class='hs-conid'>RecNil</span><span class='hs-layout'>)</span>
<a name="line-826"></a>
<a name="line-827"></a><a name="ToPrimExprs"></a><span class='hs-keyword'>class</span> <span class='hs-conid'>ToPrimExprs</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>where</span>
<a name="line-828"></a>    <span class='hs-varid'>toPrimExprs</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>PrimExpr</span><span class='hs-keyglyph'>]</span>
<a name="line-829"></a>
<a name="line-830"></a><a name="instance%20ToPrimExprs%20RecNil"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>ToPrimExprs</span> <span class='hs-conid'>RecNil</span> <span class='hs-keyword'>where</span>
<a name="line-831"></a>    <span class='hs-varid'>toPrimExprs</span> <span class='hs-keyglyph'>~</span><span class='hs-conid'>RecNil</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-832"></a>
<a name="line-833"></a><a name="instance%20ToPrimExprs%20(RecCons%20l%20(e%20a)%20r)"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>ExprC</span> <span class='hs-varid'>e</span><span class='hs-layout'>,</span> <span class='hs-conid'>ToPrimExprs</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>ToPrimExprs</span> <span class='hs-layout'>(</span><span class='hs-conid'>RecCons</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-varid'>e</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-834"></a>    <span class='hs-varid'>toPrimExprs</span> <span class='hs-keyglyph'>~</span><span class='hs-layout'>(</span><span class='hs-conid'>RecCons</span> <span class='hs-varid'>e</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>primExpr</span> <span class='hs-varid'>e</span> <span class='hs-conop'>:</span> <span class='hs-varid'>toPrimExprs</span> <span class='hs-varid'>r</span>
<a name="line-835"></a>
</pre></body>
</html>