@@ -26,6 +26,7 @@ module Katip.Scribes.ElasticSearch
26 -- * Utilities
26 -- * Utilities
28 , module Katip.Scribes.ElasticSearch.Annotations
28 , module Katip.Scribes.ElasticSearch.Annotations
@@ -50,6 +51,7 @@ import Data.Text (Text)
50import qualified Data.Text as T
51import qualified Data.Text as T
51import qualified Data.Text.Encoding as T
52import qualified Data.Text.Encoding as T
52import Data.Time
53import Data.Time
54+import Data.Time.Calendar.WeekDate
53import Data.Typeable
55import Data.Typeable
54import Data.UUID
56import Data.UUID
55import Database.Bloodhound
57import Database.Bloodhound
@@ -147,6 +149,8 @@ defaultEsScribeCfg = EsScribeCfg {
147-- (e.g. @foo-2016-*@).
149-- (e.g. @foo-2016-*@).
148data IndexShardingPolicy = NoIndexSharding
150data IndexShardingPolicy = NoIndexSharding
149 | MonthlyIndexSharding
151 | MonthlyIndexSharding
152+ | WeeklyIndexSharding
153+ -- ^ A special case of daily which shards to sunday
150 | DailyIndexSharding
154 | DailyIndexSharding
151 | HourlyIndexSharding
155 | HourlyIndexSharding
152 | EveryMinuteIndexSharding
156 | EveryMinuteIndexSharding
@@ -156,6 +160,7 @@ data IndexShardingPolicy = NoIndexSharding
156instance Show IndexShardingPolicy where
160instance Show IndexShardingPolicy where
157 show NoIndexSharding = "NoIndexSharding"
161 show NoIndexSharding = "NoIndexSharding"
158 show MonthlyIndexSharding = "MonthlyIndexSharding"
162 show MonthlyIndexSharding = "MonthlyIndexSharding"
163+ show WeeklyIndexSharding = "WeeklyIndexSharding"
159 show DailyIndexSharding = "DailyIndexSharding"
164 show DailyIndexSharding = "DailyIndexSharding"
160 show HourlyIndexSharding = "HourlyIndexSharding"
165 show HourlyIndexSharding = "HourlyIndexSharding"
161 show EveryMinuteIndexSharding = "EveryMinuteIndexSharding"
166 show EveryMinuteIndexSharding = "EveryMinuteIndexSharding"
@@ -174,6 +179,9 @@ shardPolicySegs NoIndexSharding _ = []
174shardPolicySegs MonthlyIndexSharding Item {..} = [sis y, sis m]
179shardPolicySegs MonthlyIndexSharding Item {..} = [sis y, sis m]
176 (y, m, _) = toGregorian (utctDay _itemTime)
181 (y, m, _) = toGregorian (utctDay _itemTime)
182+shardPolicySegs WeeklyIndexSharding Item {..} = [sis y, sis m, sis d]
184+ (y, m, d) = toGregorian (roundToSunday (utctDay _itemTime))
177shardPolicySegs DailyIndexSharding Item {..} = [sis y, sis m, sis d]
185shardPolicySegs DailyIndexSharding Item {..} = [sis y, sis m, sis d]
179 (y, m, d) = toGregorian (utctDay _itemTime)
187 (y, m, d) = toGregorian (utctDay _itemTime)
@@ -188,6 +196,18 @@ shardPolicySegs EveryMinuteIndexSharding Item {..} = [sis y, sis m, sis d, sis h
188shardPolicySegs (CustomIndexSharding f) i = f i
196shardPolicySegs (CustomIndexSharding f) i = f i
199+-------------------------------------------------------------------------------
200+-- | If the given day is sunday, returns the input, otherwise returns
201+-- the previous sunday
202+roundToSunday :: Day -> Day
205+ | w > 1 = fromWeekDate y (w - 1) 7
206+ | otherwise = fromWeekDate (y - 1) 53 7
208+ (y, w, dow) = toWeekDate d
191-------------------------------------------------------------------------------
211-------------------------------------------------------------------------------
192chooseIxn :: IndexName -> IndexShardingPolicy -> Item a -> IndexName
212chooseIxn :: IndexName -> IndexShardingPolicy -> Item a -> IndexName
193chooseIxn (IndexName ixn) p i =
213chooseIxn (IndexName ixn) p i =