@@ -1,4 +1,6 @@
1+{-# language AllowAmbiguousTypes #-}
1{-# language DataKinds #-}
2{-# language DataKinds #-}
3+{-# language DefaultSignatures #-}
2{-# language FlexibleInstances #-}
4{-# language FlexibleInstances #-}
3{-# language NamedFieldPuns #-}
5{-# language NamedFieldPuns #-}
4{-# language ScopedTypeVariables #-}
6{-# language ScopedTypeVariables #-}
@@ -10,7 +12,7 @@
10{-# language ViewPatterns #-}
12{-# language ViewPatterns #-}
12module Rel8.Table.Ord
14module Rel8.Table.Ord
13− ( OrdTable, (<:), (<=:), (>:), (>=:), least, greatest
15+ ( OrdTable( ordTable ), (<:), (<=:), (>:), (>=:), least, greatest
@@ -24,7 +26,6 @@ import Rel8.Expr ( Expr, Col(..) )
24import Rel8.Expr.Bool ( (||.), (&&.), false, true )
26import Rel8.Expr.Bool ( (||.), (&&.), false, true )
25import Rel8.Expr.Eq ( (==.) )
27import Rel8.Expr.Eq ( (==.) )
26import Rel8.Expr.Ord ( (<.), (>.) )
28import Rel8.Expr.Ord ( (<.), (>.) )
27−import Rel8.Opaque ( Opaque )
28import Rel8.Schema.Dict ( Dict( Dict ) )
29import Rel8.Schema.Dict ( Dict( Dict ) )
29import Rel8.Schema.HTable ( HConstrainTable, htabulateA, hfield, hdicts )
30import Rel8.Schema.HTable ( HConstrainTable, htabulateA, hfield, hdicts )
30import Rel8.Schema.Spec.ConstrainDBType ( ConstrainDBType )
31import Rel8.Schema.Spec.ConstrainDBType ( ConstrainDBType )
@@ -32,21 +33,24 @@ import Rel8.Table ( Columns, toColumns )
32import Rel8.Table.Bool ( bool )
33import Rel8.Table.Bool ( bool )
33import Rel8.Table.Eq ( EqTable )
34import Rel8.Table.Eq ( EqTable )
34import Rel8.Type.Ord ( DBOrd )
35import Rel8.Type.Ord ( DBOrd )
36+import Rel8.Schema.Nullability (Sql)
37-- | The class of 'Table's that can be ordered. Ordering on tables is defined
39-- | The class of 'Table's that can be ordered. Ordering on tables is defined
38-- by their lexicographic ordering of all columns, so this class means "all
40-- by their lexicographic ordering of all columns, so this class means "all
39-- columns in a 'Table' have an instance of 'DBOrd'".
41-- columns in a 'Table' have an instance of 'DBOrd'".
40type OrdTable :: Type -> Constraint
42type OrdTable :: Type -> Constraint
41−class
43+class EqTable a => OrdTable a where
42− ( EqTable a
44+ ordTable :: Columns a (Dict (ConstrainDBType DBOrd))
43− , HConstrainTable (Columns a) (ConstrainDBType DBOrd)
46+ default ordTable :: HConstrainTable (Columns a) (ConstrainDBType DBOrd) => Columns a (Dict (ConstrainDBType DBOrd))
44− ) => OrdTable a
47+ ordTable = hdicts @(Columns a) @(ConstrainDBType DBOrd)
47− , HConstrainTable (Columns a) (ConstrainDBType DBOrd)
50+instance (EqTable (t Expr), f ~ Expr, HConstrainTable (Columns (t Expr)) (ConstrainDBType DBOrd)) => OrdTable (t f)
49−instance {-# OVERLAPPING #-} OrdTable Opaque
53+instance Sql DBOrd a => OrdTable (Expr a)
52-- | Test if one 'Table' sorts before another. Corresponds to comparing all
56-- | Test if one 'Table' sorts before another. Corresponds to comparing all
@@ -55,10 +59,9 @@ instance {-# OVERLAPPING #-} OrdTable Opaque
55(toColumns -> as) <: (toColumns -> bs) =
59(toColumns -> as) <: (toColumns -> bs) =
56 foldr @[] go false $ getConst $ htabulateA $ \field ->
60 foldr @[] go false $ getConst $ htabulateA $ \field ->
57 case (hfield as field, hfield bs field) of
61 case (hfield as field, hfield bs field) of
58− (DB a, DB b) -> case hfield dicts field of
62+ (DB a, DB b) -> case hfield (ordTable @a) field of
59 Dict -> Const [(a <. b, a ==. b)]
63 Dict -> Const [(a <. b, a ==. b)]
61− dicts = hdicts @(Columns a) @(ConstrainDBType DBOrd)
62 go (lt, eq) a = lt ||. (eq &&. a)
65 go (lt, eq) a = lt ||. (eq &&. a)
@@ -69,10 +72,9 @@ infix 4 <:
69(toColumns -> as) <=: (toColumns -> bs) =
72(toColumns -> as) <=: (toColumns -> bs) =
70 foldr @[] go true $ getConst $ htabulateA $ \field ->
73 foldr @[] go true $ getConst $ htabulateA $ \field ->
71 case (hfield as field, hfield bs field) of
74 case (hfield as field, hfield bs field) of
72− (DB a, DB b) -> case hfield dicts field of
75+ (DB a, DB b) -> case hfield (ordTable @a) field of
73 Dict -> Const [(a <. b, a ==. b)]
76 Dict -> Const [(a <. b, a ==. b)]
75− dicts = hdicts @(Columns a) @(ConstrainDBType DBOrd)
76 go (lt, eq) a = lt ||. (eq &&. a)
78 go (lt, eq) a = lt ||. (eq &&. a)
77infix 4 <=:
79infix 4 <=:
@@ -83,10 +85,9 @@ infix 4 <=:
83(toColumns -> as) >: (toColumns -> bs) =
85(toColumns -> as) >: (toColumns -> bs) =
84 foldr @[] go false $ getConst $ htabulateA $ \field ->
86 foldr @[] go false $ getConst $ htabulateA $ \field ->
85 case (hfield as field, hfield bs field) of
87 case (hfield as field, hfield bs field) of
86− (DB a, DB b) -> case hfield dicts field of
88+ (DB a, DB b) -> case hfield (ordTable @a) field of
87 Dict -> Const [(a >. b, a ==. b)]
89 Dict -> Const [(a >. b, a ==. b)]
89− dicts = hdicts @(Columns a) @(ConstrainDBType DBOrd)
90 go (gt, eq) a = gt ||. (eq &&. a)
91 go (gt, eq) a = gt ||. (eq &&. a)
@@ -97,10 +98,9 @@ infix 4 >:
97(toColumns -> as) >=: (toColumns -> bs) =
98(toColumns -> as) >=: (toColumns -> bs) =
98 foldr @[] go true $ getConst $ htabulateA $ \field ->
99 foldr @[] go true $ getConst $ htabulateA $ \field ->
99 case (hfield as field, hfield bs field) of
100 case (hfield as field, hfield bs field) of
100− (DB a, DB b) -> case hfield dicts field of
101+ (DB a, DB b) -> case hfield (ordTable @a) field of
101 Dict -> Const [(a >. b, a ==. b)]
102 Dict -> Const [(a >. b, a ==. b)]
103− dicts = hdicts @(Columns a) @(ConstrainDBType DBOrd)
104 go (gt, eq) a = gt ||. (eq &&. a)
104 go (gt, eq) a = gt ||. (eq &&. a)
105infix 4 >=:
105infix 4 >=: