packages feed

continuum-0.1.0.0: src/Continuum/Common/Types.hs

{-# LANGUAGE DeriveGeneric #-}

module Continuum.Common.Types where

import           Data.ByteString                ( ByteString )
import           GHC.Generics                   ( Generic )
import qualified Data.Serialize                 as S
import qualified Data.Map                       as Map

data DbType =
  DbtInt
  | DbtString
  deriving(Show, Generic)

instance S.Serialize DbType

data DbError =
  IndexesDecodeError        String
  | FieldDecodeError        String ByteString
  | ValuesDecodeError       String
  | ValueDecodeError        String
  | KeyDecodeError          String
  | DecodeFieldByIndexError String [Int]
  | FieldNotFoundError
  | NoSuchDatabaseError
  | NoAggregatorAvailable
  | SchemaDecodingError     String
  | OtherError
  deriving (Show, Eq, Ord, Generic)

instance S.Serialize DbError

type DbErrorMonad  = Either  DbError

data DbValue =
  EmptyValue
  | DbInt                   Integer
  | DbFloat                 Float
  | DbDouble                Double
  | DbString                ByteString
  | DbTimestamp             Integer
  | DbSequenceId            Integer
  -- DbList [DbValue]
  -- DbMap [(DbValue, DbValue)]
  deriving (Show, Eq, Ord, Generic)

instance S.Serialize DbValue

data DbRecord =
  DbRecord Integer (Map.Map ByteString DbValue)
  deriving(Generic, Show, Eq)

instance S.Serialize DbRecord

-- |
-- | DB RESULT
-- |

data DbResult =
  EmptyRes
  | ErrorRes               DbError
  | RecordRes              DbRecord
  | FieldRes               (Integer, DbValue)
  | FieldsRes              (Integer, [DbValue])
  | CountStep              Integer
  | CountRes               Integer
  | GroupRes               (Map.Map DbValue DbResult)
  deriving(Generic, Show, Eq)

instance S.Serialize DbResult

-- |
-- | RANGE
-- |

data KeyRange =
  OpenEnd                  ByteString
  | TsOpenEnd              Integer
  | SingleKey              ByteString
  | TsSingleKey            Integer
  | KeyRange               ByteString ByteString
  | TsKeyRange             Integer Integer
  | EntireKeyspace
  deriving(Show)
-- |
-- | AGGREGATES
-- |

data Decoding =
  Field                    ByteString
  | Fields                 [ByteString]
  | Record
  deriving(Generic, Show)

instance S.Serialize Decoding

-- |
-- |
-- |

data DbSchema = DbSchema
    { fieldMappings  :: Map.Map ByteString Int
    , fields         :: [ByteString]
    , indexMappings  :: Map.Map Int ByteString
    , schemaMappings :: Map.Map ByteString DbType
    , schemaTypes    :: [DbType]
    } deriving (Generic, Show)

instance S.Serialize DbSchema

-- |
-- | QUERIES
-- |

data Query =
  Count
  | Distinct
  | Min
  | Max
  | Group                 Query
  | Insert                ByteString ByteString
  | CreateDb              ByteString DbSchema
  | RunQuery              ByteString Decoding Query
  deriving (Generic, Show)

instance S.Serialize Query

-- |
-- | External Protocol Specification
-- |

-- TODO: Split client and server requests

data Node = Node String String
          deriving(Generic, Show, Eq, Ord)

instance S.Serialize Node

data Request =
  ImUp                    Node
  | Introduction          Node
  | NodeList              [Node]
  | Heartbeat             Node
  | Query                 Query
  deriving(Generic, Show)

instance S.Serialize Request