hw-json-1.3.2.2: 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 Data.Generics.Product.Any
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
{- HLINT ignore "Reduce duplication" -}
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