Skip to content
This repository was archived by the owner on Oct 19, 2024. It is now read-only.

Commit e759293

Browse files
serrasFlavio Corpa
and
Flavio Corpa
authored
Add support for "date" and "time_ms" logical types in Avro (#114)
Co-authored-by: Flavio Corpa <[email protected]>
1 parent b71fd80 commit e759293

File tree

6 files changed

+49
-4
lines changed

6 files changed

+49
-4
lines changed

adapter/avro/mu-avro.cabal

+2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ source-repository head
2222

2323
library
2424
exposed-modules:
25+
Data.Time.Millis
2526
Mu.Adapter.Avro
2627
Mu.Quasi.Avro
2728
Mu.Quasi.Avro.Example
@@ -32,6 +33,7 @@ library
3233
, base >=4.12 && <5
3334
, bytestring
3435
, containers
36+
, deepseq
3537
, language-avro >=0.1.1
3638
, mu-rpc >=0.2.0
3739
, mu-schema >=0.2.0

adapter/avro/src/Data/Time/Millis.hs

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
{-# language GeneralizedNewtypeDeriving #-}
2+
module Data.Time.Millis where
3+
4+
5+
import Control.DeepSeq (NFData)
6+
import Data.Avro.Encode
7+
import Data.Avro.EncodeRaw
8+
import Data.Avro.FromAvro
9+
import Data.Avro.HasAvroSchema
10+
import Data.Avro.Schema as S
11+
import Data.Avro.ToAvro
12+
import Data.Avro.Types as T
13+
import Data.Tagged
14+
import Data.Time
15+
import Unsafe.Coerce
16+
17+
-- | Wrapper for time difference expressed in milliseconds
18+
newtype DiffTimeMs = DiffTimeMs { unDiffTimeMs :: DiffTime }
19+
deriving (Show, Eq, Ord, Enum, Num, Fractional, Real, RealFrac, NFData)
20+
21+
instance EncodeAvro DiffTimeMs where
22+
avro d
23+
-- Unfortunately, the AvroM constructor is not exposed :(
24+
= unsafeCoerce ( encodeRaw (fromIntegral $ diffTimeToMillis d :: Int)
25+
, S.Long (Just TimeMicros) )
26+
27+
instance HasAvroSchema DiffTimeMs where
28+
schema = Tagged $ S.Int (Just TimeMillis)
29+
30+
instance ToAvro DiffTimeMs where
31+
toAvro = T.Int . fromIntegral . diffTimeToMillis
32+
33+
instance FromAvro DiffTimeMs where
34+
fromAvro (T.Int v) = pure $ millisToDiffTime (toInteger v)
35+
fromAvro v = badValue v "TimeMicros"
36+
37+
diffTimeToMillis :: DiffTimeMs -> Integer
38+
diffTimeToMillis = (`div` 1000000000) . diffTimeToPicoseconds . unDiffTimeMs
39+
40+
millisToDiffTime :: Integer -> DiffTimeMs
41+
millisToDiffTime = DiffTimeMs . picosecondsToDiffTime . (* 1000000000)

adapter/avro/src/Mu/Quasi/Avro.hs

+2
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import Data.Int
3636
import qualified Data.Set as S
3737
import qualified Data.Text as T
3838
import Data.Time
39+
import Data.Time.Millis
3940
import Data.UUID
4041
import qualified Data.Vector as V
4142
import Language.Avro.Parser
@@ -123,6 +124,7 @@ schemaFromAvroType =
123124
A.Null -> [t|'TPrimitive 'TNull|]
124125
A.Boolean -> [t|'TPrimitive Bool|]
125126
A.Int (Just A.Date) -> [t|'TPrimitive Day|]
127+
A.Int (Just A.TimeMillis) -> [t|'TPrimitive DiffTimeMs|]
126128
A.Int _ -> [t|'TPrimitive Int32|]
127129
A.Long (Just (A.DecimalL (A.Decimal p s)))
128130
-> [t|'TPrimitive (D.Decimal $(litT $ numTyLit p) $(litT $ numTyLit s)) |]

default.nix

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{ nixpkgs ? (fetchTarball https://github.com/NixOS/nixpkgs/archive/484ea7bbac5bf7f958b0bb314a3c130b6c328800.tar.gz)
2-
, pkgs ? import nixpkgs (import (builtins.fetchTarball https://github.com/input-output-hk/haskell.nix/archive/21c5528.tar.gz))
2+
, pkgs ? import nixpkgs (import (builtins.fetchTarball https://github.com/input-output-hk/haskell.nix/archive/3db580a.tar.gz))
33
}:
44

55
let

stack-nightly.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
resolver: nightly-2020-02-25
1+
resolver: nightly-2020-02-28
22
allow-newer: true
33

44
packages:
@@ -30,7 +30,7 @@ extra-deps:
3030
- http2-client-grpc-0.8.0.0
3131
- avro-0.4.7.0
3232
- language-protobuf-1.0.1
33-
- language-avro-0.1.1.0
33+
- language-avro-0.1.2.0
3434
- hw-kafka-client-3.0.0
3535
- hw-kafka-conduit-2.6.0
3636
- HasBigDecimal-0.1.1

stack.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ extra-deps:
3030
- http2-client-grpc-0.8.0.0
3131
- avro-0.4.7.0
3232
- language-protobuf-1.0.1
33-
- language-avro-0.1.1.0
33+
- language-avro-0.1.2.0
3434
- hw-kafka-client-3.0.0
3535
- hw-kafka-conduit-2.6.0
3636
- HasBigDecimal-0.1.1

0 commit comments

Comments
 (0)