diff --git a/Handler/Query.hs b/Handler/Query.hs index 7f94703..35087a0 100644 --- a/Handler/Query.hs +++ b/Handler/Query.hs @@ -651,11 +651,14 @@ resultTable (Entity submissionId submission) = do id (submissionChallenge submission) + let (commonParams', strippedTableEntries) = extractCommonParams tableEntries + let commonParams = map (\(Entity _ p) -> (parameterName p, OneThing $ parameterValue p)) commonParams' + let paramNames = nub $ map (parameterName . entityVal) $ concat - $ map tableEntryParams tableEntries + $ map tableEntryParams strippedTableEntries let maximumNumberOfColumns = 10 diff --git a/Handler/Tables.hs b/Handler/Tables.hs index 7316b9b..f58ccd7 100644 --- a/Handler/Tables.hs +++ b/Handler/Tables.hs @@ -37,6 +37,8 @@ import Data.Proxy as DPR import Control.Lens hiding ((.=), (^.)) import Data.HashMap.Strict.InsOrd (fromList) +import qualified Data.Set as S + data TestReference = TestReference Text Text deriving (Show, Eq, Ord) @@ -77,6 +79,21 @@ data LeaderboardEntry = LeaderboardEntry { leaderboardTeam :: Maybe (Entity Team) } +-- | Finds parameters shared by all entries (including values) and removes +-- them from the entries +extractCommonParams :: [TableEntry] -> ([Entity Parameter], [TableEntry]) +extractCommonParams [] = ([], []) +extractCommonParams entries@(firstEntry:_) = (commonParams, map removeParams entries) + where commonParams = filter (\p -> paramToNameVal p `S.member` commonNameVals) $ tableEntryParams firstEntry + commonNameVals = + DL.foldl intersection hS tS + (hS:tS) = map (S.fromList + . map paramToNameVal + . tableEntryParams) entries + paramToNameVal (Entity _ p) = (parameterName p, parameterValue p) + removeParams e + = e { tableEntryParams = filter (\p -> paramToNameVal p `S.notMember` commonNameVals) $ tableEntryParams e } + data TableEntry = TableEntry { tableEntrySubmission :: Entity Submission, tableEntryVariant :: Entity Variant, diff --git a/templates/result-table.hamlet b/templates/result-table.hamlet index a015f4c..98085e0 100644 --- a/templates/result-table.hamlet +++ b/templates/result-table.hamlet @@ -2,4 +2,7 @@ $if null tableEntries

No results available. The submission is probably broken. $else - ^{Table.buildBootstrap (variantTable paramNames tests) tableEntries} + ^{Table.buildBootstrap (variantTable paramNames tests) strippedTableEntries} + + $if not (null commonParams) + ^{Table.buildBootstrap paramsTable $ commonParams}