Внешние соединения с Эскелето

Я немного озадачен тем, как внешние соединения работают с 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), без необходимости деконструировать промежуточный тип.

Другие вопросы по тегам