hw-json-1.3.1.0: app/App/Commands/Demo.hs
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module App.Commands.Demo
( cmdDemo
) where
import Control.Lens
import Control.Monad
import Control.Monad.ST
import Data.Generics.Product.Any
import Data.Semigroup ((<>))
import Data.Word
import Foreign.ForeignPtr
import HaskellWorks.Data.Json.LightJson
import HaskellWorks.Data.Json.Query
import HaskellWorks.Data.Json.Standard.Cursor.Generic
import HaskellWorks.Data.Json.Standard.Cursor.Load.Cursor
import HaskellWorks.Data.MQuery
import HaskellWorks.Data.MQuery.Micro
import HaskellWorks.Data.RankSelect.CsPoppy
import HaskellWorks.Data.Vector.Storable
import Options.Applicative hiding (columns)
import qualified App.Commands.Types as Z
import qualified Data.ByteString.Internal as BSI
import qualified Data.ByteString.Lazy as LBS
import qualified Data.DList as DL
import qualified HaskellWorks.Data.BalancedParens.RangeMin as RM
import qualified HaskellWorks.Data.ByteString.Lazy as LBS
import qualified HaskellWorks.Data.Json.Simd.Index.Standard as S
import qualified Options.Applicative as OA
import qualified System.IO as IO
import qualified System.IO.MMap as IO
runDemo :: Z.DemoOptions -> IO ()
runDemo opts = do
let filePath = opts ^. the @"filePath"
case opts ^. the @"method" of
"original" -> do
!cursor <- loadCursor (opts ^. the @"filePath")
let !json = lightJsonAt cursor
let q = MQuery (DL.singleton json)
putPretty $ q >>= (entry >=> named "meta" >=> entry >=> named "view" >=> entry >=> named "columns" >=> item >=> entry >=> named "id") & count
"simd" -> do
(fptr :: ForeignPtr Word8, offset, size) <- IO.mmapFileForeignPtr filePath IO.ReadOnly Nothing
let !bs = BSI.fromForeignPtr (castForeignPtr fptr) offset size
case S.makeStandardJsonIbBps (LBS.resegmentPadded 512 (LBS.fromStrict bs)) of
Right ibBps -> do
let (!ib, !bp) = construct64UnzipN size ibBps
let !cursor = GenericCursor bs (makeCsPoppy ib) (RM.mkRangeMin bp) 1
let !json = lightJsonAt cursor
let q = MQuery (DL.singleton json)
putPretty $ q >>= (entry >=> named "meta" >=> entry >=> named "view" >=> entry >=> named "columns" >=> item >=> entry >=> named "id") & count
Left msg -> IO.hPutStrLn IO.stderr $ "Unable to create semi-index: " <> show msg
m -> IO.hPutStrLn IO.stderr $ "Unrecognised method: " <> show m
optsDemo :: Parser Z.DemoOptions
optsDemo = Z.DemoOptions
<$> strOption
( long "input"
<> short 'i'
<> help "Input DSV file"
<> metavar "STRING"
)
<*> strOption
( long "method"
<> short 'm'
<> help "Method (original|simd)"
<> metavar "STRING"
<> OA.value "original"
)
cmdDemo :: Mod CommandFields (IO ())
cmdDemo = command "demo" $ flip info idm $ runDemo <$> optsDemo