packages feed

sqel-0.0.1.0: lib/Sqel/Data/SelectExpr.hs

module Sqel.Data.SelectExpr where

import qualified Exon

import Sqel.Data.Dd (QOp)
import Sqel.Data.FragType (FragType, renderWithFragKeyword)
import Sqel.Data.Selector (Selector)
import Sqel.Data.Sql (Sql, ToSql (toSql))

data SelectAtom =
  SelectAtom {
    type_ :: FragType,
    code :: Selector -> Int -> Sql
  }
  deriving stock (Generic)

data SelectFragment =
  SelectFragment {
     type_ :: FragType,
     content :: Sql
  }
  deriving stock (Show, Eq, Generic, Ord)

renderSelectFragment :: SelectFragment -> Sql
renderSelectFragment SelectFragment {..} =
  renderWithFragKeyword content type_

instance ToSql [SelectFragment] where
  toSql = Exon.intercalate " " . fmap renderSelectFragment . sort

data SelectExpr =
  SelectExprAtom FragType (Int -> Sql)
  |
  SelectExprList QOp [SelectExpr]
  |
  SelectExprSum [SelectExpr]
  |
  SelectExprNot SelectExpr
  |
  SelectExprIgnore