2023-04-29 19:36:42 +00:00
|
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
|
|
module Algorithm.BaseQuery
|
|
|
|
( superType,
|
2023-04-30 16:48:50 +00:00
|
|
|
Card(..),
|
|
|
|
cmcLT,
|
|
|
|
cmcMT,
|
|
|
|
cmcEQ,
|
|
|
|
Tree(..)
|
2023-04-29 19:36:42 +00:00
|
|
|
) where
|
|
|
|
import qualified Data.Text as T
|
|
|
|
import Database.SQLite.Simple
|
|
|
|
import Config (getDbPath)
|
|
|
|
import Data.Text (Text, isInfixOf)
|
|
|
|
import Control.Monad.IO.Class (MonadIO(liftIO))
|
2023-04-30 16:48:50 +00:00
|
|
|
import Algorithm.Lex (Operator)
|
|
|
|
|
|
|
|
|
|
|
|
data Tree = Funct Operator Tree Tree | Holder [Card]
|
|
|
|
|
2023-04-29 19:36:42 +00:00
|
|
|
data Card = Card
|
|
|
|
Int
|
|
|
|
T.Text
|
|
|
|
T.Text
|
|
|
|
T.Text
|
|
|
|
(Maybe T.Text)
|
|
|
|
(Maybe T.Text)
|
|
|
|
T.Text
|
2023-04-30 16:48:50 +00:00
|
|
|
Int
|
2023-04-29 19:36:42 +00:00
|
|
|
deriving (Show)
|
|
|
|
|
2023-04-29 21:35:43 +00:00
|
|
|
instance Eq Card where
|
2023-04-30 16:48:50 +00:00
|
|
|
(==) (Card id_ _ _ _ _ _ _ _) (Card id2_ _ _ _ _ _ _ _) = id_ == id2_
|
2023-04-29 21:35:43 +00:00
|
|
|
|
2023-04-29 19:36:42 +00:00
|
|
|
instance FromRow Card where
|
2023-04-30 16:48:50 +00:00
|
|
|
fromRow = Card <$> field <*> field <*> field <*> field <*> field <*> field <*> field <*> field
|
2023-04-29 19:36:42 +00:00
|
|
|
|
|
|
|
instance ToRow Card where
|
2023-04-30 16:48:50 +00:00
|
|
|
toRow (Card id_ scryfall_id lang name oracle_text image_uri type_line cmc) = toRow (id_, scryfall_id, lang, name, oracle_text, image_uri, type_line, cmc)
|
2023-04-29 19:36:42 +00:00
|
|
|
|
|
|
|
|
2023-04-30 16:48:50 +00:00
|
|
|
runQuerySimple :: Query -> IO [Card]
|
|
|
|
runQuerySimple str = do
|
2023-04-29 19:36:42 +00:00
|
|
|
dbPath <- getDbPath
|
|
|
|
conn <- open dbPath
|
2023-04-30 16:48:50 +00:00
|
|
|
query_ conn str :: IO [Card];
|
|
|
|
|
|
|
|
runQueryNamed :: Query -> [NamedParam] -> IO [Card]
|
|
|
|
runQueryNamed qur parm = do
|
|
|
|
dbPath <- getDbPath
|
|
|
|
conn <- open dbPath
|
|
|
|
queryNamed conn qur parm :: IO [Card]
|
|
|
|
|
|
|
|
|
|
|
|
superType :: String -> IO Tree
|
|
|
|
superType qry = do
|
|
|
|
res <- runQuerySimple "select id, scryfall_id, lang, name, oracle_text, image_uri, type_line, cmc from card where type_line is not null"
|
|
|
|
return $ Holder (typeLineFilter res (T.pack qry))
|
2023-04-29 19:36:42 +00:00
|
|
|
|
|
|
|
typeLineFilter :: [Card] -> Text -> [Card]
|
2023-04-30 16:48:50 +00:00
|
|
|
typeLineFilter (card@(Card _ _ _ _ _ _ type_line _):cards) qry = if qry `isInfixOf` type_line then card:typeLineFilter cards qry else typeLineFilter cards qry
|
|
|
|
typeLineFilter [] _ = []
|
|
|
|
|
|
|
|
cmcLT :: Int -> IO Tree
|
|
|
|
cmcLT value = do
|
|
|
|
res <- runQueryNamed "select id, scryfall_id, lang, name, oracle_text, image_uri, type_line, cmc from card where cmc < :val" [":val" := value]
|
|
|
|
return $ Holder res
|
|
|
|
|
|
|
|
cmcMT :: Int -> IO Tree
|
|
|
|
cmcMT value = do
|
|
|
|
res <- runQueryNamed "select id, scryfall_id, lang, name, oracle_text, image_uri, type_line, cmc from card where cmc > :val" [":val" := value]
|
|
|
|
return $ Holder res
|
2023-04-29 19:36:42 +00:00
|
|
|
|
2023-04-30 16:48:50 +00:00
|
|
|
cmcEQ :: Int -> IO Tree
|
|
|
|
cmcEQ value = do
|
|
|
|
res <- runQueryNamed "select id, scryfall_id, lang, name, oracle_text, image_uri, type_line, cmc from card where cmc = :val" [":val" := value]
|
|
|
|
return $ Holder res
|