packages feed

sparkle-0.7: src/Control/Distributed/Spark/SQL/Row.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}

module Control.Distributed.Spark.SQL.Row where

import Control.Distributed.Spark.PairRDD
import Control.Distributed.Spark.RDD
import Control.Distributed.Spark.SQL.StructType
import Data.Int
import Data.Text
import Language.Java

newtype Row = Row (J ('Class "org.apache.spark.sql.Row"))
  deriving (Coercible, Interpretation, Reify, Reflect)

toRows :: PairRDD a b -> IO (RDD Row)
toRows prdd = callStatic "Helper" "toRows" [coerce prdd]

schema :: Row -> IO StructType
schema (Row r) = call r "schema" []

get :: Int32 -> Row -> IO JObject
get i r = call r "get" [coerce i]

size :: Row -> IO Int32
size r = call r "size" []

isNullAt :: Int32 -> Row -> IO Bool
isNullAt i (Row r) = call r "isNullAt" [coerce i]

getBoolean :: Int32 -> Row -> IO Bool
getBoolean i r = call r "getBoolean" [coerce i]

getDouble :: Int32 -> Row -> IO Double
getDouble i r = call r "getDouble" [coerce i]

getLong :: Int32 -> Row -> IO Int64
getLong i r = call r "getLong" [coerce i]

getString :: Int32 -> Row -> IO Text
getString i r = call r "getString" [coerce i] >>= reify

getList :: forall a. Reify a => Int32 -> Row -> IO [a]
getList i r =
    call r "getList" [coerce i] >>= listToArray >>= reify
  where
    listToArray :: J ('Iface "java.util.List") -> IO (J ('Array (Interp a)))
    listToArray jlist = cast <$> call jlist "toArray" []

    cast :: J ('Array ('Class "java.lang.Object")) -> J ('Array (Interp a))
    cast = unsafeCast

createRow :: [JObject] -> IO Row
createRow vs = do
    jvs <- toArray vs
    callStatic "org.apache.spark.sql.RowFactory"
               "create"
               [coerce jvs]