Show result tables

This commit is contained in:
Filip Gralinski 2018-11-12 14:12:51 +01:00
parent 6b87181454
commit 0e8846b06c
10 changed files with 86 additions and 27 deletions

View File

@ -9,6 +9,7 @@ import Yesod.Form.Bootstrap3 (BootstrapFormLayout (..), renderBootstrap3, bfs)
import Handler.TagUtils import Handler.TagUtils
import Handler.MakePublic import Handler.MakePublic
import Handler.Query
import Gonito.ExtractMetadata (parseTags) import Gonito.ExtractMetadata (parseTags)

View File

@ -30,7 +30,7 @@ getChallengeParamGraphDataR challengeName testId paramName = do
(Entity challengeId _) <- runDB $ getBy404 $ UniqueName challengeName (Entity challengeId _) <- runDB $ getBy404 $ UniqueName challengeName
test <- runDB $ get404 testId test <- runDB $ get404 testId
(entries, _) <- getChallengeSubmissionInfos (const True) challengeId (entries, _) <- runDB $ getChallengeSubmissionInfos (const True) challengeId
let values = map (findParamValue paramName) entries let values = map (findParamValue paramName) entries
@ -154,7 +154,7 @@ getIndicatorGraphDataR indicatorId = do
test <- runDB $ get404 testId test <- runDB $ get404 testId
let mPrecision = testPrecision test let mPrecision = testPrecision test
(entries, _) <- getChallengeSubmissionInfos (const True) (testChallenge test) (entries, _) <- runDB $ getChallengeSubmissionInfos (const True) (testChallenge test)
theNow <- liftIO $ getCurrentTime -- needed to draw the "now" vertical line theNow <- liftIO $ getCurrentTime -- needed to draw the "now" vertical line

View File

@ -33,7 +33,7 @@ getPresentation4RealR = do
(Just (Entity sampleUserId _)) <- runDB $ getBy $ UniqueUser sampleUserIdent (Just (Entity sampleUserId _)) <- runDB $ getBy $ UniqueUser sampleUserIdent
let condition = (\(Entity _ submission) -> (submissionSubmitter submission == sampleUserId)) let condition = (\(Entity _ submission) -> (submissionSubmitter submission == sampleUserId))
(evaluationMaps', tests) <- getChallengeSubmissionInfos condition challengeId (evaluationMaps', tests) <- runDB $ getChallengeSubmissionInfos condition challengeId
let evaluationMaps = take 10 evaluationMaps' let evaluationMaps = take 10 evaluationMaps'
sampleLeaderboard <- getSampleLeaderboard sampleChallengeName sampleLeaderboard <- getSampleLeaderboard sampleChallengeName

View File

@ -5,12 +5,22 @@ import Import
import Handler.SubmissionView import Handler.SubmissionView
import Handler.Shared import Handler.Shared
import Handler.TagUtils import Handler.TagUtils
import PersistSHA1
import Handler.Tables
import qualified Yesod.Table as Table
import Yesod.Table (Table)
import Database.Persist.Sql import Database.Persist.Sql
import qualified Database.Esqueleto as E import qualified Database.Esqueleto as E
import Database.Esqueleto ((^.)) import Database.Esqueleto ((^.))
import qualified Data.Text as T
import Data.List (nub)
import Yesod.Form.Bootstrap3 (BootstrapFormLayout (..), renderBootstrap3) import Yesod.Form.Bootstrap3 (BootstrapFormLayout (..), renderBootstrap3)
rawCommitQuery :: (MonadIO m, RawSql a) => Text -> ReaderT SqlBackend m [a] rawCommitQuery :: (MonadIO m, RawSql a) => Text -> ReaderT SqlBackend m [a]
@ -83,5 +93,32 @@ processQuery query = do
setTitle "query results" setTitle "query results"
$(widgetFile "query-results") $(widgetFile "query-results")
resultTable :: Entity Submission -> WidgetFor App ()
resultTable (Entity submissionId submission) = do
(tableEntries, tests) <- handlerToWidget $ runDB $ getChallengeSubmissionInfos (\s -> entityKey s == submissionId)
(submissionChallenge submission)
let paramNames =
nub
$ map (parameterName . entityVal)
$ concat
$ map tableEntryParams tableEntries
let resultId = show $ fromSqlKey submissionId
let jsSelector = String $ T.pack ("#t" ++ resultId ++ " > table")
let delta = Number $ fromIntegral ((length paramNames) + 1)
let higherTheBetterArray = getIsHigherTheBetterArray $ map entityVal tests
$(widgetFile "result-table")
queryResult submission = do
$(widgetFile "query-result")
where commitSha1AsText = fromSHA1ToText $ submissionCommit $ fsiSubmission submission
submitter = formatSubmitter $ fsiUser submission
publicSubmissionBranch = getPublicSubmissionBranch $ fsiSubmissionId submission
publicSubmissionRepo = getReadOnlySubmissionUrl (fsiScheme submission) (fsiChallengeRepo submission) $ challengeName $ fsiChallenge submission
browsableUrl = browsableGitRepoBranch (fsiScheme submission) (fsiChallengeRepo submission) (challengeName $ fsiChallenge submission) publicSubmissionBranch
stamp = T.pack $ show $ submissionStamp $ fsiSubmission submission
queryForm :: Form Text queryForm :: Form Text
queryForm = renderBootstrap3 BootstrapBasicForm $ areq textField (fieldSettingsLabel MsgGitCommitSha1) Nothing queryForm = renderBootstrap3 BootstrapBasicForm $ areq textField (fieldSettingsLabel MsgGitCommitSha1) Nothing

View File

@ -494,7 +494,7 @@ getChallengeAllSubmissionsR name = getChallengeSubmissions (\_ -> True) name
getChallengeSubmissions :: ((Entity Submission) -> Bool) -> Text -> Handler Html getChallengeSubmissions :: ((Entity Submission) -> Bool) -> Text -> Handler Html
getChallengeSubmissions condition name = do getChallengeSubmissions condition name = do
Entity challengeId challenge <- runDB $ getBy404 $ UniqueName name Entity challengeId challenge <- runDB $ getBy404 $ UniqueName name
(evaluationMaps, tests') <- getChallengeSubmissionInfos condition challengeId (evaluationMaps, tests') <- runDB $ getChallengeSubmissionInfos condition challengeId
let tests = sortBy testComparator tests' let tests = sortBy testComparator tests'
mauth <- maybeAuth mauth <- maybeAuth
let muserId = (\(Entity uid _) -> uid) <$> mauth let muserId = (\(Entity uid _) -> uid) <$> mauth

View File

@ -7,6 +7,9 @@ import Handler.TagUtils
import Data.Text as T(pack) import Data.Text as T(pack)
import qualified Yesod.Table as Table
import Yesod.Table (Table)
data FullSubmissionInfo = FullSubmissionInfo { data FullSubmissionInfo = FullSubmissionInfo {
fsiSubmissionId :: SubmissionId, fsiSubmissionId :: SubmissionId,
fsiSubmission :: Submission, fsiSubmission :: Submission,
@ -39,16 +42,6 @@ getFullInfo (Entity submissionId submission) = do
fsiScheme = scheme, fsiScheme = scheme,
fsiTags = tags } fsiTags = tags }
queryResult submission = do
$(widgetFile "query-result")
where commitSha1AsText = fromSHA1ToText $ submissionCommit $ fsiSubmission submission
submitter = formatSubmitter $ fsiUser submission
publicSubmissionBranch = getPublicSubmissionBranch $ fsiSubmissionId submission
publicSubmissionRepo = getReadOnlySubmissionUrl (fsiScheme submission) (fsiChallengeRepo submission) $ challengeName $ fsiChallenge submission
browsableUrl = browsableGitRepoBranch (fsiScheme submission) (fsiChallengeRepo submission) (challengeName $ fsiChallenge submission) publicSubmissionBranch
stamp = T.pack $ show $ submissionStamp $ fsiSubmission submission
getTags submissionId = do getTags submissionId = do
sts <- selectList [SubmissionTagSubmission ==. submissionId] [] sts <- selectList [SubmissionTagSubmission ==. submissionId] []
let tagIds = Import.map (submissionTagTag . entityVal) sts let tagIds = Import.map (submissionTagTag . entityVal) sts

View File

@ -64,6 +64,21 @@ submissionsTable mauthId challengeName repoScheme challengeRepo tests = mempty
entityKey $ tableEntrySubmitter tableEntry, entityKey $ tableEntrySubmitter tableEntry,
mauthId)) mauthId))
paramTable :: [Text] -> [Entity Test] -> Table App TableEntry
paramTable paramNames tests = mempty
++ Table.int "#" tableEntryRank
++ mconcat (map paramExtractor paramNames)
++ mconcat (map (\(Entity k t) -> resultCell t (extractScore k)) tests)
paramExtractor :: Text -> Table App TableEntry
paramExtractor paramName = Table.text paramName (\entry ->
fromMaybe ""
$ listToMaybe
$ map parameterValue
$ filter (\p -> parameterName p == paramName)
$ map entityVal
$ tableEntryParams entry)
descriptionCell :: Maybe UserId -> Table App TableEntry descriptionCell :: Maybe UserId -> Table App TableEntry
descriptionCell mauthId = Table.widget "description" ( descriptionCell mauthId = Table.widget "description" (
\(TableEntry (Entity _ s) (Entity _ v) (Entity u _) _ tagEnts paramEnts _) -> fragmentWithSubmissionTags \(TableEntry (Entity _ s) (Entity _ v) (Entity u _) _ tagEnts paramEnts _) -> fragmentWithSubmissionTags
@ -166,7 +181,7 @@ getLeaderboardEntriesByCriterion :: (Ord a) => Key Challenge
-> (TableEntry -> [a]) -> (TableEntry -> [a])
-> Handler ([LeaderboardEntry], ([TableEntry], [Entity Test])) -> Handler ([LeaderboardEntry], ([TableEntry], [Entity Test]))
getLeaderboardEntriesByCriterion challengeId condition selector = do getLeaderboardEntriesByCriterion challengeId condition selector = do
(evaluationMaps, tests) <- getChallengeSubmissionInfos condition challengeId (evaluationMaps, tests) <- runDB $ getChallengeSubmissionInfos condition challengeId
let mainTests = getMainTests tests let mainTests = getMainTests tests
let mainTestEnt = getMainTest tests let mainTestEnt = getMainTest tests
let (Entity mainTestId mainTest) = mainTestEnt let (Entity mainTestId mainTest) = mainTestEnt
@ -233,20 +248,17 @@ compareResult _ (Just _) Nothing = GT
compareResult _ Nothing (Just _) = LT compareResult _ Nothing (Just _) = LT
compareResult _ Nothing Nothing = EQ compareResult _ Nothing Nothing = EQ
getChallengeSubmissionInfos :: ((Entity Submission) -> Bool)
-> Key Challenge
-> Handler ([TableEntry], [Entity Test])
getChallengeSubmissionInfos condition challengeId = do getChallengeSubmissionInfos condition challengeId = do
tests <- runDB $ selectList [TestChallenge ==. challengeId, TestActive ==. True] [] tests <- selectList [TestChallenge ==. challengeId, TestActive ==. True] []
let mainTest = getMainTest tests let mainTest = getMainTest tests
allSubmissionsVariants <- runDB $ E.select $ E.from $ \(submission, variant) -> do allSubmissionsVariants <- E.select $ E.from $ \(submission, variant) -> do
E.where_ (submission ^. SubmissionChallenge E.==. E.val challengeId E.where_ (submission ^. SubmissionChallenge E.==. E.val challengeId
E.&&. submission ^. SubmissionIsHidden E.!=. E.val (Just True) E.&&. submission ^. SubmissionIsHidden E.!=. E.val (Just True)
E.&&. variant ^. VariantSubmission E.==. submission ^. SubmissionId) E.&&. variant ^. VariantSubmission E.==. submission ^. SubmissionId)
return (submission, variant) return (submission, variant)
scores <- runDB $ mapM (getScore (entityKey mainTest)) $ map (entityKey . snd) allSubmissionsVariants scores <- mapM (getScore (entityKey mainTest)) $ map (entityKey . snd) allSubmissionsVariants
let allSubmissionsVariantsWithRanks = let allSubmissionsVariantsWithRanks =
sortBy (\(r1, (s1, _)) (r2, (s2, _)) -> (submissionStamp (entityVal s2) `compare` submissionStamp (entityVal s1)) sortBy (\(r1, (s1, _)) (r2, (s2, _)) -> (submissionStamp (entityVal s2) `compare` submissionStamp (entityVal s1))
@ -272,15 +284,15 @@ getScore testId variantId = do
(e:_) -> evaluationScore $ entityVal e (e:_) -> evaluationScore $ entityVal e
[] -> Nothing [] -> Nothing
getEvaluationMap :: (Int, (Entity Submission, Entity Variant)) -> Handler TableEntry
getEvaluationMap (rank, (s@(Entity submissionId submission), v@(Entity variantId _))) = do getEvaluationMap (rank, (s@(Entity submissionId submission), v@(Entity variantId _))) = do
outs <- runDB $ selectList [OutVariant ==. variantId] [] outs <- selectList [OutVariant ==. variantId] []
user <- runDB $ get404 $ submissionSubmitter submission user <- get404 $ submissionSubmitter submission
maybeEvaluations <- runDB $ mapM (\(Entity _ o) -> getBy $ UniqueEvaluationTestChecksum (outTest o) (outChecksum o)) outs maybeEvaluations <- mapM (\(Entity _ o) -> getBy $ UniqueEvaluationTestChecksum (outTest o) (outChecksum o)) outs
let evaluations = catMaybes maybeEvaluations let evaluations = catMaybes maybeEvaluations
let m = Map.fromList $ map (\(Entity _ e) -> (evaluationTest e, e)) evaluations let m = Map.fromList $ map (\(Entity _ e) -> (evaluationTest e, e)) evaluations
tagEnts <- runDB $ getTags submissionId tagEnts <- getTags submissionId
parameters <- runDB $ selectList [ParameterVariant ==. variantId] [Asc ParameterName] parameters <- selectList [ParameterVariant ==. variantId] [Asc ParameterName]
return $ TableEntry s v (Entity (submissionSubmitter submission) user) m tagEnts parameters rank return $ TableEntry s v (Entity (submissionSubmitter submission) user) m tagEnts parameters rank

View File

@ -17,4 +17,7 @@
<dd><a href="#{browsableUrl}">#{browsableUrl}</a> <dd><a href="#{browsableUrl}">#{browsableUrl}</a>
<dt>clone by <dt>clone by
<dd><code>git clone --single-branch #{publicSubmissionRepo} -b #{publicSubmissionBranch}</code> <dd><code>git clone --single-branch #{publicSubmissionRepo} -b #{publicSubmissionBranch}</code>
^{resultTable (Entity (fsiSubmissionId submission) (fsiSubmission submission))}
<hr> <hr>

View File

@ -0,0 +1,5 @@
<div id="t#{resultId}">
$if null tableEntries
<p>No results available. The submission is probably broken.
$else
^{Table.buildBootstrap (paramTable paramNames tests) tableEntries}

View File

@ -0,0 +1,8 @@
$(document).ready(function() {
$(#{jsSelector}).DataTable({
'pageLength': 50,
'order': [[0, 'asc'], [#{delta} + ($.fn.dataTable.getColumnDefs(#{delta}, #{higherTheBetterArray})).length-1, 'desc']],
'columnDefs': $.fn.dataTable.getColumnDefs(#{delta}, #{higherTheBetterArray})
});
} );