on dev help sign in
Range module
commitb11f955a0b399f0eff8febcc55638a66f7a5195e authorEitan Chatav <eitan@EEM109LMBP-1.local> dateWed 10 Jul 2019, 09:02 (7 years ago) parentc2d4fa8
5 files changed+108−47
squeal-postgresql/squeal-postgresql.cabal+1 squeal-postgresql/src/Squeal/PostgreSQL.hs+1 squeal-postgresql/src/Squeal/PostgreSQL/Expression/Collection.hs−16 squeal-postgresql/src/Squeal/PostgreSQL/Expression/Range.hs+106 squeal-postgresql/src/Squeal/PostgreSQL/PG.hs−31
squeal-postgresql/squeal-postgresql.cabal+1
@@ -35,6 +35,7 @@ library
3535 Squeal.PostgreSQL.Expression.Math
3636 Squeal.PostgreSQL.Expression.Null
3737 Squeal.PostgreSQL.Expression.Parameter
38+ Squeal.PostgreSQL.Expression.Range
3839 Squeal.PostgreSQL.Expression.SetOf
3940 Squeal.PostgreSQL.Expression.Sort
4041 Squeal.PostgreSQL.Expression.Subquery
squeal-postgresql/src/Squeal/PostgreSQL.hs+1
@@ -205,6 +205,7 @@ import Squeal.PostgreSQL.Expression.Logic as X
205205import Squeal.PostgreSQL.Expression.Math as X
206206import Squeal.PostgreSQL.Expression.Null as X
207207import Squeal.PostgreSQL.Expression.Parameter as X
208+import Squeal.PostgreSQL.Expression.Range as X
208209import Squeal.PostgreSQL.Expression.SetOf as X
209210import Squeal.PostgreSQL.Expression.Sort as X
210211import Squeal.PostgreSQL.Expression.Subquery as X
squeal-postgresql/src/Squeal/PostgreSQL/Expression/Collection.hs−16
@@ -33,10 +33,8 @@ module Squeal.PostgreSQL.Expression.Collection
3333 , unnest
3434 , row
3535 , field
36− , range
3736 ) where
3837
39−import Data.Bool
4038import Data.String
4139import Data.Word (Word64)
4240
@@ -46,7 +44,6 @@ import Squeal.PostgreSQL.Alias
4644import Squeal.PostgreSQL.Expression
4745import Squeal.PostgreSQL.Expression.SetOf
4846import Squeal.PostgreSQL.List
49−import Squeal.PostgreSQL.PG
5047import Squeal.PostgreSQL.Render
5148import Squeal.PostgreSQL.Schema
5249
@@ -170,16 +167,3 @@ field
170167field td fld expr = UnsafeExpression $
171168 parenthesized (renderSQL expr <> "::" <> renderSQL td)
172169 <> "." <> renderSQL fld
173−
174−-- | >>> printSQL $ range (Closed (Just now)) (Open Nothing)
175−-- [now(), )
176−range
177− :: Bound (Expression outer commons grp schemas params from ('NotNull ty))
178− -> Bound (Expression outer commons grp schemas params from ('NotNull ty))
179− -> Expression outer commons grp schemas params from (null ('PGrange ty))
180−range l u = UnsafeExpression $ commaSeparated [renderLower l, renderUpper u]
181− where
182− renderLower (Bound isClosed x) =
183− bool "(" "[" isClosed <> maybe "" renderSQL x
184− renderUpper (Bound isClosed x) =
185− maybe "" renderSQL x <> bool ")" "]" isClosed
squeal-postgresql/src/Squeal/PostgreSQL/Expression/Range.hsnew file+106
@@ -0,0 +1,106 @@
1+{-|
2+Module: Squeal.PostgreSQL.Expression.Range
3+Description: range types and functions
4+Copyright: (c) Eitan Chatav, 2019
5+Maintainer: eitan@morphism.tech
6+Stability: experimental
7+
8+Range types and functions
9+-}
10+
11+{-# LANGUAGE
12+ AllowAmbiguousTypes
13+ , DataKinds
14+ , DeriveAnyClass
15+ , DeriveGeneric
16+ , DeriveFoldable
17+ , DerivingStrategies
18+ , DeriveTraversable
19+ , FlexibleContexts
20+ , FlexibleInstances
21+ , LambdaCase
22+ , MultiParamTypeClasses
23+ , OverloadedLabels
24+ , OverloadedStrings
25+ , PatternSynonyms
26+ , RankNTypes
27+ , ScopedTypeVariables
28+ , TypeApplications
29+ , TypeFamilies
30+ , TypeOperators
31+ , UndecidableInstances
32+#-}
33+
34+module Squeal.PostgreSQL.Expression.Range
35+ ( range
36+ , Range (..)
37+ , (<=..<=), (<..<), (<=..<), (<..<=)
38+ , pattern HalfGT, pattern HalfGTE
39+ , pattern HalfLT, pattern HalfLTE
40+ , Bound (..)
41+ , pattern Closed, pattern Open
42+ ) where
43+
44+import Data.Bool
45+
46+import qualified GHC.Generics as GHC
47+import qualified Generics.SOP as SOP
48+
49+import Squeal.PostgreSQL.Expression
50+import Squeal.PostgreSQL.PG
51+import Squeal.PostgreSQL.Render
52+import Squeal.PostgreSQL.Schema
53+
54+-- $setup
55+-- >>> import Squeal.PostgreSQL
56+
57+-- | >>> printSQL $ range (HalfGTE now)
58+-- [now(), )
59+-- >>> printSQL $ range (0 <..<= (pi & astype numeric))
60+-- (0, (pi() :: numeric)]
61+range
62+ :: Range (Expression outer commons grp schemas params from ('NotNull ty))
63+ -> Expression outer commons grp schemas params from (null ('PGrange ty))
64+range = UnsafeExpression . renderSQL
65+
66+data Bound x = Bound
67+ { closedBound :: Bool
68+ , getBound :: Maybe x
69+ } deriving
70+ ( Eq, Ord, Show, Read, GHC.Generic
71+ , Functor, Foldable, Traversable )
72+ deriving anyclass (SOP.Generic, SOP.HasDatatypeInfo)
73+pattern Closed, Open :: Maybe x -> Bound x
74+pattern Closed x = Bound True x
75+pattern Open x = Bound False x
76+
77+data Range x
78+ = Empty
79+ | NonEmpty (Bound x) (Bound x)
80+ deriving
81+ ( Eq, Ord, Show, Read, GHC.Generic
82+ , Functor, Foldable, Traversable )
83+ deriving anyclass (SOP.Generic, SOP.HasDatatypeInfo)
84+type instance PG (Range x) = 'PGrange (PG x)
85+
86+instance RenderSQL x => RenderSQL (Range x) where
87+ renderSQL = \case
88+ Empty -> "empty"
89+ NonEmpty l u -> commaSeparated [renderLower l, renderUpper u]
90+ where
91+ renderLower (Bound isClosed x) =
92+ bool "(" "[" isClosed <> maybe "" renderSQL x
93+ renderUpper (Bound isClosed x) =
94+ maybe "" renderSQL x <> bool ")" "]" isClosed
95+
96+(<=..<=), (<..<), (<=..<), (<..<=) :: x -> x -> Range x
97+x <=..<= y = NonEmpty (Closed (Just x)) (Closed (Just y))
98+x <..< y = NonEmpty (Open (Just x)) (Open (Just y))
99+x <=..< y = NonEmpty (Closed (Just x)) (Open (Just y))
100+x <..<= y = NonEmpty (Open (Just x)) (Closed (Just y))
101+
102+pattern HalfGT, HalfGTE, HalfLT, HalfLTE :: x -> Range x
103+pattern HalfGT x = NonEmpty (Open (Just x)) (Open Nothing)
104+pattern HalfGTE x = NonEmpty (Closed (Just x)) (Open Nothing)
105+pattern HalfLT x = NonEmpty (Open Nothing) (Open (Just x))
106+pattern HalfLTE x = NonEmpty (Open Nothing) (Closed (Just x))
squeal-postgresql/src/Squeal/PostgreSQL/PG.hs−31
@@ -46,10 +46,6 @@ module Squeal.PostgreSQL.PG
4646 , Enumerated (..)
4747 , VarArray (..)
4848 , FixArray (..)
49− , Bound (..)
50− , pattern Closed
51− , pattern Open
52− , (<=..<=), (<..<), (<=..<), (<..<=)
5349 -- * Type families
5450 , LabelsPG
5551 , DimPG
@@ -368,30 +364,3 @@ newtype FixArray arr = FixArray {getFixArray :: arr}
368364 deriving (Eq, Ord, Show, Read, GHC.Generic)
369365-- | `PGfixarray` @(@`DimPG` @hask) (@`FixPG` @hask)@
370366type instance PG (FixArray hask) = 'PGfixarray (DimPG hask) (FixPG hask)
371−
372−data Bound x = Bound
373− { closedBound :: Bool
374− , getBound :: Maybe x
375− } deriving
376− ( Eq, Ord, Show, Read, GHC.Generic
377− , Functor, Foldable, Traversable )
378−pattern Closed, Open :: Maybe x -> Bound x
379−pattern Closed x = Bound True x
380−pattern Open x = Bound False x
381−type instance PG (Bound x, Bound x) = 'PGrange (PG x)
382−
383−data Range x
384− = Empty
385− | NonEmpty (Bound x) (Bound x)
386− deriving
387− ( Eq, Ord, Show, Read, GHC.Generic
388− , Functor, Foldable, Traversable )
389−-- instance RenderSQL x => RenderSQL
390−(<=..<=), (<..<), (<=..<), (<..<=) :: x -> x -> Range x
391−x <=..<= y = NonEmpty (Closed (Just x)) (Closed (Just y))
392−x <..< y = NonEmpty (Open (Just x)) (Open (Just y))
393−x <=..< y = NonEmpty (Closed (Just x)) (Open (Just y))
394−x <..<= y = NonEmpty (Open (Just x)) (Closed (Just y))
395−pattern Above, Below :: Bound x -> Range x
396−pattern Above x = NonEmpty (Open Nothing) x
397−pattern Below x = NonEmpty x (Open Nothing)