module PuppetDB.Query where
import Puppet.DSL.Types
import qualified Data.Text as T
import Data.Monoid
import Puppet.Utils
data Operator = OEqual | OOver | OUnder | OOverE | OUnderE | OAnd | OOr | ONot
deriving (Show, Ord, Eq)
data Query = Query Operator [Query] | Term T.Text | Terms [T.Text]
deriving (Show, Ord, Eq)
queryRealize :: T.Text -> T.Text -> Query
queryRealize rtype rtitle = Query OAnd
[ Query OEqual [ Term "type", Term (capitalizeResType rtype) ]
, Query OEqual [ Term "title", Term rtitle ]
, Query OEqual [ Term "exported", Term "true" ]
]
collectAll :: T.Text -> Query
collectAll rtype = Query OAnd [ Query OEqual [ Term "type", Term (capitalizeResType rtype) ]
, Query OEqual [ Term "exported", Term "true" ]
]
collectTag :: T.Text -> T.Text -> Query
collectTag rtype tagval = Query OAnd
[ Query OEqual [ Term "type", Term (capitalizeResType rtype) ]
, Query OEqual [ Term "tag" , Term tagval ]
, Query OEqual [ Term "exported", Term "true" ]
]
collectParam :: T.Text -> T.Text -> T.Text -> Query
collectParam rtype prmname prmval = Query OAnd
[ Query OEqual [ Term "type", Term (capitalizeResType rtype) ]
, Query OEqual [ Terms ["parameter", "prmname"], Term prmval ]
, Query OEqual [ Term "exported", Term "true" ]
]
showOperator :: Operator -> T.Text
showOperator OEqual = dq "="
showOperator OOver = dq ">"
showOperator OUnder = dq "<"
showOperator OOverE = dq ">="
showOperator OUnderE = dq "<="
showOperator OAnd = dq "and"
showOperator OOr = dq "or"
showOperator ONot = dq "not"
getOperator :: T.Text -> Maybe Operator
getOperator "=" = Just OEqual
getOperator ">" = Just OOver
getOperator "<" = Just OUnder
getOperator ">=" = Just OOverE
getOperator "<=" = Just OUnderE
getOperator "and" = Just OAnd
getOperator "or" = Just OOr
getOperator "not" = Just ONot
getOperator _ = Nothing
showQuery :: Query -> T.Text
showQuery (Query op subqueries) = "[" <> T.intercalate ", " (showOperator op : map showQuery subqueries) <> "]"
showQuery (Term t) = tshow t
showQuery (Terms ts) = tshow ts