Skip to content

Commit

Permalink
fixup! Add MintBurn indexer
Browse files Browse the repository at this point in the history
Add interval query.
  • Loading branch information
eyeinsky committed Feb 8, 2023
1 parent b199ab4 commit 8e91afc
Showing 1 changed file with 32 additions and 14 deletions.
46 changes: 32 additions & 14 deletions marconi/src/Marconi/Index/MintBurn.hs
Expand Up @@ -38,6 +38,7 @@ import Data.List.NonEmpty qualified as NE
import Data.Map qualified as Map
import Data.Maybe (mapMaybe)
import Data.Word (Word64)
import Database.SQLite.Simple (NamedParam ((:=)))
import Database.SQLite.Simple qualified as SQL
import Database.SQLite.Simple.ToField qualified as SQL

Expand Down Expand Up @@ -185,24 +186,39 @@ fromRows rows = do
rowToMintAsset :: Row -> MintAsset
rowToMintAsset row = MintAsset (row^.L._4) (row^.L._5) (row^.L._6) (row^.L._7) (row^.L._8)

sqliteSelectByTxIdPolicyId :: SQL.Connection -> C.TxId -> C.PolicyId -> IO [TxMintEvent]
sqliteSelectByTxIdPolicyId sqlCon txId policyId = fromRows <$> SQL.query sqlCon query (txId, policyId)
sqliteSelectByTxIdPolicyId :: SQL.Connection -> (SQL.Query, [NamedParam]) -> C.TxId -> C.PolicyId -> IO [TxMintEvent]
sqliteSelectByTxIdPolicyId sqlCon (where_, params) txId policyId =
fromRows <$> SQL.queryNamed sqlCon query ([":txId" := txId, ":policyId" := policyId] <> params)
where query =
" SELECT slotNo, blockHeaderHash, txId, policyId \
\ , assetName, quantity, redeemerIx, redeemerData \
\ FROM minting_policy_events \
\ WHERE txId = ? AND policyId = ? \
\ ORDER BY slotNo, txId "


sqliteSelectAll :: SQL.Connection -> IO [TxMintEvent]
sqliteSelectAll sqlCon = fromRows <$> SQL.query_ sqlCon query
" SELECT slotNo, blockHeaderHash, txId, policyId \
\ , assetName, quantity, redeemerIx, redeemerData \
\ FROM minting_policy_events \
\ WHERE txId = :txId AND policyId = :policyId " <> where_ <> " \
\ ORDER BY slotNo, txId "

sqliteSelectAll :: SQL.Connection -> (SQL.Query, [NamedParam]) -> IO [TxMintEvent]
sqliteSelectAll sqlCon (where_, params) = fromRows <$> SQL.queryNamed sqlCon query params
where query =
" SELECT slotNo, blockHeaderHash, txId, policyId \
\ , assetName, quantity, redeemerIx, redeemerData \
\ FROM minting_policy_events \
\ WHERE " <> where_ <> " \
\ ORDER BY slotNo, txId "

intervalToWhereClause :: RI.QueryInterval C.ChainPoint -> (SQL.Query, [NamedParam])
intervalToWhereClause qi = case qi of
RI.QEverything -> ("", [])
RI.QInterval from to
| Just from' <- slotMaybe from, Just to' <- slotMaybe to -> ("slotNo BETWEEN :fromSlot AND :toSlot" , [":fromSlot" := from', ":toSlot" := to'])
| Just from' <- slotMaybe from -> ("slotNo >= :fromSlot" , [":fromSlot" := from'])
| Just to' <- slotMaybe to -> ("slotNo <= :toSlot" , [":toSlot" := to'])
| otherwise -> ("", [])
where
slotMaybe :: C.ChainPoint -> Maybe C.SlotNo
slotMaybe = \case
C.ChainPoint slotNo _ -> Just slotNo
C.ChainPointAtGenesis -> Nothing

groupBySlotNo :: [TxMintEvent] -> [TxMintEvent]
groupBySlotNo events = events
& sort
Expand Down Expand Up @@ -234,16 +250,18 @@ data instance RI.StorableResult MintBurnHandle
= MintBurnResult [Row]

instance RI.Queryable MintBurnHandle where
queryStorage _qi memoryEvents (MintBurnHandle sqlCon _k) query = case query of
Everything -> toResult <$> sqliteSelectAll sqlCon
ByTxIdAndPolicyId txId policyId -> toResult <$> sqliteSelectByTxIdPolicyId sqlCon txId policyId
queryStorage queryInterval memoryEvents (MintBurnHandle sqlCon _k) query = case query of
Everything -> toResult <$> sqliteSelectAll sqlCon interval
ByTxIdAndPolicyId txId policyId -> toResult <$> sqliteSelectByTxIdPolicyId sqlCon interval txId policyId
where
toResult storedEvents = MintBurnResult $ do
TxMintEvent slotNo blockHeaderHash txAssets <- storedEvents <> map coerce (toList memoryEvents)
(txId, mintAssets) <- NE.toList txAssets
MintAsset policyId assetName quantity redeemerIx redeemerData <- NE.toList mintAssets
pure (slotNo, blockHeaderHash, txId, policyId, assetName, quantity, redeemerIx, redeemerData)

interval = intervalToWhereClause queryInterval

instance RI.HasPoint (RI.StorableEvent MintBurnHandle) C.ChainPoint where
getPoint (MintBurnEvent e) = C.ChainPoint (txMintEventSlotNo e) (txMintEventBlockHeaderHash e)

Expand Down

0 comments on commit 8e91afc

Please sign in to comment.