外部加入Esqueleto

时间:2014-05-31 07:20:34

标签: haskell esqueleto

我对外连接如何与esqueleto一起工作有点困惑。

我创建了以下查询(简化):

select $ from $ \(rep `LeftOuterJoin` event) -> do
          on (rep ^. RepAtomId  ==. event   ^. EventAtomId )
          where_ (rep ^. RepAtomId  ==. val aid)
          return $ (rep, event ^. EventSeconds)

据我所知,在SQL端,此查询将搜索可能具有关联事件的代表。如果它们没有关联的事件,则事件字段(如EventSeconds)将为“null”。在Haskell方面,这些应该被翻译成Maybe Seconds(嗯,整数,但你明白了)。

那么当我运行这个查询时实际发生的事情并没有什么可以与我的代表关系相邻?如何解构元组以固定默认值?

目前,我有以下几点:

case listToMaybe lrep of
  Just ( entityVal -> rep
       , unValue -> seconds
       ) -> do stuff

(注意我在这里打开了ViewPatterns)。这种类型检查。但如果我使用(?。)和(fromMaybe 360​​0)它就会失败。模式分析中的unValue。

1 个答案:

答案 0 :(得分:3)

我能够通过在正确的位置添加“正确”来解决这个问题:

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

这个想法是(event)确实有一个类似于Maybe的类型(我不确定它的类型是什么,但我知道它有一个嵌入的Maybe)。因此,当我与代表进行比较时,我将a(也许a)与a进行比较。 'just'将a包装成(也许是a),而不必解构中间类型。