Внешние соединения с Эскелето
Я немного озадачен тем, как внешние соединения работают с esqueleto.
Я создал следующий запрос (упрощенно):
select $ from $ \(rep `LeftOuterJoin` event) -> do
on (rep ^. RepAtomId ==. event ^. EventAtomId )
where_ (rep ^. RepAtomId ==. val aid)
return $ (rep, event ^. EventSeconds)
Насколько я знаю, на стороне SQL этот запрос будет искать представителей, которые могут иметь ассоциированное событие. Если у них нет связанного события, поля события (например, EventSeconds) будут иметь значение "ноль". Что касается Haskell, то они должны быть переведены в Maybe Seconds (ну, целые, но вы поняли).
Так что же на самом деле происходит, когда я запускаю этот запрос и нечего примыкать к моему отношению к rep? Как я могу деконструировать кортеж, чтобы вставить в него дефолт?
В настоящее время у меня есть что-то вроде:
case listToMaybe lrep of
Just ( entityVal -> rep
, unValue -> seconds
) -> do stuff
(Обратите внимание, что у меня здесь включены ViewPatterns). Этот тип проверяет. Но не получится, если я использую (?) И (от Maybe 3600) . Значение в анализе паттернов.
1 ответ
Я смог это исправить, добавив "просто" в нужном месте:
select $ from $ \(rep `LeftOuterJoin` event) -> do
on (just (rep ^. RepAtomId) ==. event ?. EventAtomId )
where_ (rep ^. RepAtomId ==. val aid)
return $ (rep, event ?. EventSeconds)
case listToMaybe lrep of
Just ( entityVal -> rep
, (fromMaybe 3600) . unValue -> seconds
) -> do stuff
Идея в том, что (событие) действительно имеет тип типа Like (я не уверен, что это за тип, но я знаю, что он имеет встроенный тип Maybe). Поэтому, когда я сравнивал с представителем, я сравнивал (может быть) с a. 'just' обернул a в a (возможно a), без необходимости деконструировать промежуточный тип.