on master help sign in
Switch to CalendarDiffTime
ca7aaefShane O'Brien
src/Rel8/Expr/Time.hs+22−21
@@ -13,7 +13,7 @@ module Rel8.Expr.Time
13 , diffTime
13 , diffTime
14 , subtractTime
14 , subtractTime
15
15
16− -- * Working with @NominalDiffTime@
16+ -- * Working with @CalendarDiffTime@
17 , scaleInterval
17 , scaleInterval
18 , second, seconds
18 , second, seconds
19 , minute, minutes
19 , minute, minutes
@@ -35,7 +35,8 @@ import Rel8.Expr.Opaleye ( unsafeCastExpr, unsafeLiteral )
35
35
36-- time
36-- time
37import Data.Time.Calendar ( Day )
37import Data.Time.Calendar ( Day )
38−import Data.Time.Clock ( NominalDiffTime, UTCTime )
38+import Data.Time.Clock ( UTCTime )
39+import Data.Time.LocalTime ( CalendarDiffTime )
39
40
40
41
41-- | Corresponds to @date(now())@.
42-- | Corresponds to @date(now())@.
@@ -74,93 +75,93 @@ now = nullaryFunction "now"
74
75
75
76
76-- | Add a time interval to a point in time, yielding a new point in time.
77-- | Add a time interval to a point in time, yielding a new point in time.
77−addTime :: Expr NominalDiffTime -> Expr UTCTime -> Expr UTCTime
78+addTime :: Expr CalendarDiffTime -> Expr UTCTime -> Expr UTCTime
78addTime = flip (binaryOperator "+")
79addTime = flip (binaryOperator "+")
79
80
80
81
81-- | Find the duration between two times.
82-- | Find the duration between two times.
82−diffTime :: Expr UTCTime -> Expr UTCTime -> Expr NominalDiffTime
83+diffTime :: Expr UTCTime -> Expr UTCTime -> Expr CalendarDiffTime
83diffTime = binaryOperator "-"
84diffTime = binaryOperator "-"
84
85
85
86
86-- | Subtract a time interval from a point in time, yielding a new point in time.
87-- | Subtract a time interval from a point in time, yielding a new point in time.
87−subtractTime :: Expr NominalDiffTime -> Expr UTCTime -> Expr UTCTime
88+subtractTime :: Expr CalendarDiffTime -> Expr UTCTime -> Expr UTCTime
88subtractTime = flip (binaryOperator "-")
89subtractTime = flip (binaryOperator "-")
89
90
90
91
91−scaleInterval :: Expr Double -> Expr NominalDiffTime -> Expr NominalDiffTime
92+scaleInterval :: Expr Double -> Expr CalendarDiffTime -> Expr CalendarDiffTime
92scaleInterval = binaryOperator "*"
93scaleInterval = binaryOperator "*"
93
94
94
95
95-- | An interval of one second.
96-- | An interval of one second.
96−second :: Expr NominalDiffTime
97+second :: Expr CalendarDiffTime
97second = singleton "second"
98second = singleton "second"
98
99
99
100
100-- | Create a literal interval from a number of seconds.
101-- | Create a literal interval from a number of seconds.
101−seconds :: Expr Double -> Expr NominalDiffTime
102+seconds :: Expr Double -> Expr CalendarDiffTime
102seconds = (`scaleInterval` second)
103seconds = (`scaleInterval` second)
103
104
104
105
105-- | An interval of one minute.
106-- | An interval of one minute.
106−minute :: Expr NominalDiffTime
107+minute :: Expr CalendarDiffTime
107minute = singleton "minute"
108minute = singleton "minute"
108
109
109
110
110-- | Create a literal interval from a number of minutes.
111-- | Create a literal interval from a number of minutes.
111−minutes :: Expr Double -> Expr NominalDiffTime
112+minutes :: Expr Double -> Expr CalendarDiffTime
112minutes = (`scaleInterval` minute)
113minutes = (`scaleInterval` minute)
113
114
114
115
115-- | An interval of one hour.
116-- | An interval of one hour.
116−hour :: Expr NominalDiffTime
117+hour :: Expr CalendarDiffTime
117hour = singleton "hour"
118hour = singleton "hour"
118
119
119
120
120-- | Create a literal interval from a number of hours.
121-- | Create a literal interval from a number of hours.
121−hours :: Expr Double -> Expr NominalDiffTime
122+hours :: Expr Double -> Expr CalendarDiffTime
122hours = (`scaleInterval` hour)
123hours = (`scaleInterval` hour)
123
124
124
125
125-- | An interval of one day.
126-- | An interval of one day.
126−day :: Expr NominalDiffTime
127+day :: Expr CalendarDiffTime
127day = singleton "day"
128day = singleton "day"
128
129
129
130
130-- | Create a literal interval from a number of days.
131-- | Create a literal interval from a number of days.
131−days :: Expr Double -> Expr NominalDiffTime
132+days :: Expr Double -> Expr CalendarDiffTime
132days = (`scaleInterval` day)
133days = (`scaleInterval` day)
133
134
134
135
135-- | An interval of one week.
136-- | An interval of one week.
136−week :: Expr NominalDiffTime
137+week :: Expr CalendarDiffTime
137week = singleton "week"
138week = singleton "week"
138
139
139
140
140-- | Create a literal interval from a number of weeks.
141-- | Create a literal interval from a number of weeks.
141−weeks :: Expr Double -> Expr NominalDiffTime
142+weeks :: Expr Double -> Expr CalendarDiffTime
142weeks = (`scaleInterval` week)
143weeks = (`scaleInterval` week)
143
144
144
145
145-- | An interval of one month.
146-- | An interval of one month.
146−month :: Expr NominalDiffTime
147+month :: Expr CalendarDiffTime
147month = singleton "month"
148month = singleton "month"
148
149
149
150
150-- | Create a literal interval from a number of months.
151-- | Create a literal interval from a number of months.
151−months :: Expr Double -> Expr NominalDiffTime
152+months :: Expr Double -> Expr CalendarDiffTime
152months = (`scaleInterval` month)
153months = (`scaleInterval` month)
153
154
154
155
155-- | An interval of one year.
156-- | An interval of one year.
156−year :: Expr NominalDiffTime
157+year :: Expr CalendarDiffTime
157year = singleton "year"
158year = singleton "year"
158
159
159
160
160-- | Create a literal interval from a number of years.
161-- | Create a literal interval from a number of years.
161−years :: Expr Double -> Expr NominalDiffTime
162+years :: Expr Double -> Expr CalendarDiffTime
162years = (`scaleInterval` year)
163years = (`scaleInterval` year)
163
164
164
165
165−singleton :: String -> Expr NominalDiffTime
166+singleton :: String -> Expr CalendarDiffTime
166singleton unit = unsafeLiteral $ "'1 " ++ unit ++ "'"
167singleton unit = unsafeLiteral $ "'1 " ++ unit ++ "'"
src/Rel8/Type.hs+9−10
@@ -58,8 +58,12 @@ import qualified Data.Text.Lazy.Encoding as Lazy ( decodeUtf8 )
58
58
59-- time
59-- time
60import Data.Time.Calendar ( Day )
60import Data.Time.Calendar ( Day )
61−import Data.Time.Clock ( DiffTime, NominalDiffTime, UTCTime )
61+import Data.Time.Clock ( UTCTime )
62−import Data.Time.LocalTime ( LocalTime, TimeOfDay )
62+import Data.Time.LocalTime
63+ ( CalendarDiffTime( CalendarDiffTime )
64+ , LocalTime
65+ , TimeOfDay
66+ )
63import Data.Time.Format ( formatTime, defaultTimeLocale )
67import Data.Time.Format ( formatTime, defaultTimeLocale )
64
68
65-- uuid
69-- uuid
@@ -221,22 +225,17 @@ instance DBType TimeOfDay where
221
225
222
226
223-- | Corresponds to @interval@
227-- | Corresponds to @interval@
224−instance DBType DiffTime where
228+instance DBType CalendarDiffTime where
225 typeInformation = TypeInformation
229 typeInformation = TypeInformation
226 { encode =
230 { encode =
227 Opaleye.ConstExpr . Opaleye.OtherLit .
231 Opaleye.ConstExpr . Opaleye.OtherLit .
228− formatTime defaultTimeLocale "'%0Es'"
232+ formatTime defaultTimeLocale "'%bmon %0Es'"
229− , decode = Hasql.interval
233+ , decode = CalendarDiffTime 0 . realToFrac <$> Hasql.interval
230 , typeName = "interval"
234 , typeName = "interval"
231 , out = id
235 , out = id
232 }
236 }
233
237
234
238
235−instance DBType NominalDiffTime where
236− typeInformation =
237− mapTypeInformation @DiffTime realToFrac realToFrac typeInformation
238−
239−
240-- | Corresponds to @text@
239-- | Corresponds to @text@
241instance DBType Text where
240instance DBType Text where
242 typeInformation = TypeInformation
241 typeInformation = TypeInformation
src/Rel8/Type/Eq.hs+3−4
@@ -39,8 +39,8 @@ import qualified Data.Text.Lazy as Lazy ( Text )
39
39
40-- time
40-- time
41import Data.Time.Calendar ( Day )
41import Data.Time.Calendar ( Day )
42−import Data.Time.Clock ( UTCTime, DiffTime, NominalDiffTime )
42+import Data.Time.Clock ( UTCTime )
43−import Data.Time.LocalTime ( TimeOfDay, LocalTime )
43+import Data.Time.LocalTime ( CalendarDiffTime, LocalTime, TimeOfDay )
44
44
45-- uuid
45-- uuid
46import Data.UUID ( UUID )
46import Data.UUID ( UUID )
@@ -95,8 +95,7 @@ instance DBEq UTCTime
95instance DBEq Day
95instance DBEq Day
96instance DBEq LocalTime
96instance DBEq LocalTime
97instance DBEq TimeOfDay
97instance DBEq TimeOfDay
98−instance DBEq DiffTime
98+instance DBEq CalendarDiffTime
99−instance DBEq NominalDiffTime
100instance DBEq Text
99instance DBEq Text
101instance DBEq Lazy.Text
100instance DBEq Lazy.Text
102instance DBEq (CI Text)
101instance DBEq (CI Text)
src/Rel8/Type/Monoid.hs+3−7
@@ -39,7 +39,7 @@ import Data.Text ( Text )
39import qualified Data.Text.Lazy as Lazy ( Text )
39import qualified Data.Text.Lazy as Lazy ( Text )
40
40
41-- time
41-- time
42−import Data.Time.Clock ( DiffTime, NominalDiffTime )
42+import Data.Time.LocalTime ( CalendarDiffTime( CalendarDiffTime ) )
43
43
44
44
45-- | The class of 'DBType's that form a semigroup. This class is purely a Rel8
45-- | The class of 'DBType's that form a semigroup. This class is purely a Rel8
@@ -54,12 +54,8 @@ instance Sql DBType a => DBMonoid [a] where
54 memptyExpr = sempty nullabilization typeInformation
54 memptyExpr = sempty nullabilization typeInformation
55
55
56
56
57−instance DBMonoid DiffTime where
57+instance DBMonoid CalendarDiffTime where
58− memptyExpr = litExpr 0
58+ memptyExpr = litExpr (CalendarDiffTime 0 0)
59−
60−
61−instance DBMonoid NominalDiffTime where
62− memptyExpr = litExpr 0
63
59
64
60
65instance DBMonoid Text where
61instance DBMonoid Text where
src/Rel8/Type/Ord.hs+5−8
@@ -37,8 +37,8 @@ import qualified Data.Text.Lazy as Lazy ( Text )
37
37
38-- time
38-- time
39import Data.Time.Calendar ( Day )
39import Data.Time.Calendar ( Day )
40−import Data.Time.Clock ( DiffTime, NominalDiffTime, UTCTime )
40+import Data.Time.Clock ( UTCTime )
41−import Data.Time.LocalTime ( TimeOfDay, LocalTime )
41+import Data.Time.LocalTime ( CalendarDiffTime, LocalTime, TimeOfDay )
42
42
43-- uuid
43-- uuid
44import Data.UUID ( UUID )
44import Data.UUID ( UUID )
@@ -60,8 +60,7 @@ instance DBOrd UTCTime
60instance DBOrd Day
60instance DBOrd Day
61instance DBOrd LocalTime
61instance DBOrd LocalTime
62instance DBOrd TimeOfDay
62instance DBOrd TimeOfDay
63−instance DBOrd DiffTime
63+instance DBOrd CalendarDiffTime
64−instance DBOrd NominalDiffTime
65instance DBOrd Text
64instance DBOrd Text
66instance DBOrd Lazy.Text
65instance DBOrd Lazy.Text
67instance DBOrd (CI Text)
66instance DBOrd (CI Text)
@@ -93,8 +92,7 @@ instance DBMax UTCTime
93instance DBMax Day
92instance DBMax Day
94instance DBMax LocalTime
93instance DBMax LocalTime
95instance DBMax TimeOfDay
94instance DBMax TimeOfDay
96−instance DBMax DiffTime
95+instance DBMax CalendarDiffTime
97−instance DBMax NominalDiffTime
98instance DBMax Text
96instance DBMax Text
99instance DBMax Lazy.Text
97instance DBMax Lazy.Text
100instance DBMax (CI Text)
98instance DBMax (CI Text)
@@ -124,8 +122,7 @@ instance DBMin UTCTime
124instance DBMin Day
122instance DBMin Day
125instance DBMin LocalTime
123instance DBMin LocalTime
126instance DBMin TimeOfDay
124instance DBMin TimeOfDay
127−instance DBMin DiffTime
125+instance DBMin CalendarDiffTime
128−instance DBMin NominalDiffTime
129instance DBMin Text
126instance DBMin Text
130instance DBMin Lazy.Text
127instance DBMin Lazy.Text
131instance DBMin (CI Text)
128instance DBMin (CI Text)
src/Rel8/Type/Semigroup.hs+2−6
@@ -39,7 +39,7 @@ import Data.Text ( Text )
39import qualified Data.Text.Lazy as Lazy ( Text )
39import qualified Data.Text.Lazy as Lazy ( Text )
40
40
41-- time
41-- time
42−import Data.Time.Clock ( DiffTime, NominalDiffTime )
42+import Data.Time.LocalTime ( CalendarDiffTime )
43
43
44
44
45-- | The class of 'DBType's that form a semigroup. This class is purely a Rel8
45-- | The class of 'DBType's that form a semigroup. This class is purely a Rel8
@@ -59,11 +59,7 @@ instance Sql DBType a => DBSemigroup (NonEmpty a) where
59 (<>.) = zipPrimExprsWith (Opaleye.BinExpr (Opaleye.:||))
59 (<>.) = zipPrimExprsWith (Opaleye.BinExpr (Opaleye.:||))
60
60
61
61
62−instance DBSemigroup DiffTime where
62+instance DBSemigroup CalendarDiffTime where
63− (<>.) = zipPrimExprsWith (Opaleye.BinExpr (Opaleye.:+))
64−
65−
66−instance DBSemigroup NominalDiffTime where
67 (<>.) = zipPrimExprsWith (Opaleye.BinExpr (Opaleye.:+))
63 (<>.) = zipPrimExprsWith (Opaleye.BinExpr (Opaleye.:+))
68
64
69
65
src/Rel8/Type/Sum.hs+2−3
@@ -24,7 +24,7 @@ import Rel8.Type ( DBType )
24import Data.Scientific ( Scientific )
24import Data.Scientific ( Scientific )
25
25
26-- time
26-- time
27−import Data.Time.Clock ( DiffTime, NominalDiffTime )
27+import Data.Time.LocalTime ( CalendarDiffTime )
28
28
29
29
30-- | The class of database types that support the @sum()@ aggregation function.
30-- | The class of database types that support the @sum()@ aggregation function.
@@ -36,8 +36,7 @@ instance DBSum Int64
36instance DBSum Float
36instance DBSum Float
37instance DBSum Double
37instance DBSum Double
38instance DBSum Scientific
38instance DBSum Scientific
39−instance DBSum DiffTime
39+instance DBSum CalendarDiffTime
40−instance DBSum NominalDiffTime
41
40
42
41
43instance {-# INCOHERENT #-} (HasNullability a, DBSum (Unnullify a)) =>
42instance {-# INCOHERENT #-} (HasNullability a, DBSum (Unnullify a)) =>