module Database.Groundhog.Postgresql.HStore
(
HStore(..)
, (->.)
, lookupArr
, hstoreConcat
, deleteKey
, deleteKeys
, difference
, hstore_to_array
, hstore_to_matrix
, akeys
, avals
, slice
, hstore_to_json
, hstore_to_json_loose
, exist
, defined
, (?&)
, (?|)
, (@>)
, (<@)
) where
import Database.Groundhog.Core
import Database.Groundhog.Expression
import Database.Groundhog.Generic
import Database.Groundhog.Generic.Sql
import Database.Groundhog.Postgresql
import Database.Groundhog.Postgresql.Array (Array)
import Database.PostgreSQL.Simple.HStore
import Data.Aeson (Value)
import qualified Blaze.ByteString.Builder as B
import Control.Applicative
import qualified Data.Map as Map
import Data.String
import Data.Text (Text)
import qualified Data.Text.Encoding as T
newtype HStore = HStore (Map.Map Text Text)
deriving (Eq, Ord, Show)
instance PersistField HStore where
persistName _ = "HStore"
toPersistValues = primToPersistValue
fromPersistValues = primFromPersistValue
dbType _ _ = DbTypePrimitive (DbOther $ OtherTypeDef $ [Left "hstore"]) False Nothing Nothing
instance PrimitivePersistField HStore where
toPrimitivePersistValue (HStore a) = PersistCustom "E?::hstore" [toPrimitivePersistValue $ T.decodeUtf8 $ B.toByteString $ toBuilder (toHStore (HStoreMap a))]
fromPrimitivePersistValue x = case parseHStoreList $ fromPrimitivePersistValue x of
Left err -> error $ "HStore: " ++ err
Right (HStoreList val) -> HStore $ Map.fromList val
psqlOperatorExpr :: (db ~ Postgresql, Expression db r a, Expression db r b) => String -> a -> b -> Expr db r c
psqlOperatorExpr op x y = mkExpr $ operator 50 op x y
psqlOperatorCond :: (db ~ Postgresql, Expression db r a, Expression db r b) => String -> a -> b -> Cond db r
psqlOperatorCond op x y = CondRaw $ operator 50 op x y
(->.) :: (db ~ Postgresql, ExpressionOf db r hstore HStore, ExpressionOf db r key key', IsString key')
=> hstore -> key -> Expr db r (Maybe Text)
(->.) = psqlOperatorExpr "->"
lookupArr :: (db ~ Postgresql, ExpressionOf db r hstore HStore, ExpressionOf db r keys (Array Text))
=> hstore -> keys -> Expr db r (Array Text)
lookupArr = psqlOperatorExpr "->"
hstoreConcat :: (db ~ Postgresql, ExpressionOf db r hstore1 HStore, ExpressionOf db r hstore2 HStore)
=> hstore1 -> hstore2 -> Expr db r HStore
hstoreConcat = psqlOperatorExpr "||"
exist :: (db ~ Postgresql, ExpressionOf db r hstore HStore, ExpressionOf db r key key', IsString key')
=> hstore -> key -> Cond db r
exist h k = CondRaw $ function "exist" [toExpr h, toExpr k]
defined :: (db ~ Postgresql, ExpressionOf db r hstore HStore, ExpressionOf db r key key', IsString key')
=> hstore -> key -> Cond db r
defined h k = CondRaw $ function "defined" [toExpr h, toExpr k]
(?&) :: (db ~ Postgresql, ExpressionOf db r hstore HStore, ExpressionOf db r keys (Array Text))
=> hstore -> keys -> Cond db r
(?&) = psqlOperatorCond "?&"
(?|) :: (db ~ Postgresql, ExpressionOf db r hstore HStore, ExpressionOf db r keys (Array Text))
=> hstore -> keys -> Cond db r
(?|) = psqlOperatorCond "?|"
(@>) :: (db ~ Postgresql, ExpressionOf db r hstore1 HStore, ExpressionOf db r hstore2 HStore)
=> hstore1 -> hstore2 -> Cond db r
(@>) = psqlOperatorCond "@>"
(<@) :: (db ~ Postgresql, ExpressionOf db r hstore1 HStore, ExpressionOf db r hstore2 HStore)
=> hstore1 -> hstore2 -> Cond db r
(<@) = psqlOperatorCond "<@"
deleteKey :: (db ~ Postgresql, ExpressionOf db r hstore HStore, ExpressionOf db r key key', IsString key')
=> hstore -> key -> Expr db r HStore
deleteKey h k = mkExpr $ function "delete" [toExpr h, toExpr k]
deleteKeys :: (db ~ Postgresql, ExpressionOf db r hstore HStore, ExpressionOf db r keys (Array Text))
=> hstore -> keys -> Expr db r HStore
deleteKeys h k = mkExpr $ function "delete" [toExpr h, toExpr k]
difference :: (db ~ Postgresql, ExpressionOf db r hstore1 HStore, ExpressionOf db r hstore2 HStore)
=> hstore1 -> hstore2 -> Expr db r HStore
difference h1 h2 = mkExpr $ function "delete" [toExpr h1, toExpr h2]
hstore_to_array :: (db ~ Postgresql, ExpressionOf db r hstore HStore)
=> hstore -> Expr db r (Array Text)
hstore_to_array h = mkExpr $ function "hstore_to_array" [toExpr h]
hstore_to_matrix :: (db ~ Postgresql, ExpressionOf db r hstore HStore)
=> hstore -> Expr db r (Array (Array Text))
hstore_to_matrix h = mkExpr $ function "hstore_to_matrix" [toExpr h]
akeys :: (db ~ Postgresql, ExpressionOf db r hstore HStore)
=> hstore -> Expr db r (Array Text)
akeys h = mkExpr $ function "akeys" [toExpr h]
avals :: (db ~ Postgresql, ExpressionOf db r hstore HStore)
=> hstore -> Expr db r (Array Text)
avals h = mkExpr $ function "vals" [toExpr h]
hstore_to_json :: (db ~ Postgresql, ExpressionOf db r hstore HStore)
=> hstore -> Expr db r Value
hstore_to_json h = mkExpr $ function "hstore_to_json" [toExpr h]
hstore_to_json_loose :: (db ~ Postgresql, ExpressionOf db r hstore HStore)
=> hstore -> Expr db r Value
hstore_to_json_loose h = mkExpr $ function "hstore_to_json_loose" [toExpr h]
slice :: (db ~ Postgresql, ExpressionOf db r hstore HStore, ExpressionOf db r keys (Array Text))
=> hstore -> keys -> Expr db r HStore
slice h k = mkExpr $ function "slice" [toExpr h, toExpr k]