Term candidate inference handler added, not connected

This commit is contained in:
Steffen Jost 2019-03-20 09:49:06 +01:00
parent 23a1b883ac
commit 8c221ad5e8
3 changed files with 48 additions and 18 deletions

View File

@ -1,12 +1,12 @@
module Handler.Admin where module Handler.Admin where
import Import import Import
import Handler.Utils
import Jobs import Jobs
import Handler.Utils
import Data.Aeson.Encode.Pretty (encodePrettyToTextBuilder) import Data.Aeson.Encode.Pretty (encodePrettyToTextBuilder)
import Control.Monad.Trans.Except import Control.Monad.Trans.Except
import Control.Monad.Trans.Writer (mapWriterT)
import Utils.Lens import Utils.Lens
@ -17,17 +17,20 @@ import Utils.Lens
-- import qualified Data.Set as Set -- import qualified Data.Set as Set
import qualified Data.Map as Map import qualified Data.Map as Map
import Handler.Utils.Table.Cells
import Database.Persist.Sql (fromSqlKey) import Database.Persist.Sql (fromSqlKey)
import qualified Database.Esqueleto as E import qualified Database.Esqueleto as E
import Database.Esqueleto.Utils as E import Database.Esqueleto.Utils as E
import Handler.Utils.Table.Cells
import qualified Handler.Utils.TermCandidates as Candidates
-- import Colonnade hiding (fromMaybe) -- import Colonnade hiding (fromMaybe)
-- import Yesod.Colonnade -- import Yesod.Colonnade
-- import qualified Data.UUID.Cryptographic as UUID -- import qualified Data.UUID.Cryptographic as UUID
import Control.Monad.Trans.Writer (mapWriterT)
getAdminR :: Handler Html getAdminR :: Handler Html
@ -179,11 +182,11 @@ getAdminFeaturesR = postAdminFeaturesR
postAdminFeaturesR = do postAdminFeaturesR = do
( (degreeResult,degreeTable) ( (degreeResult,degreeTable)
, (studyTermsResult,studytermsTable) , (studyTermsResult,studytermsTable)
, conflicts , conflicted
, ((),candidateTable)) <- runDB $ (,,,) , ((),candidateTable)) <- runDB $ (,,,)
<$> mkDegreeTable <$> mkDegreeTable
<*> mkStudytermsTable <*> mkStudytermsTable
<*> conflictedStudyTerms <*> Candidates.conflicts
<*> mkCandidateTable <*> mkCandidateTable
let degreeResult' :: FormResult (Map (Key StudyDegree) (Maybe Text, Maybe Text)) let degreeResult' :: FormResult (Map (Key StudyDegree) (Maybe Text, Maybe Text))
@ -217,12 +220,12 @@ postAdminFeaturesR = do
^{studytermsTable} ^{studytermsTable}
<div .container> <div .container>
<section> <section>
$if null conflicts $if null conflicted
Kein Konflikte beobachtet. Kein Konflikte beobachtet.
$else $else
<h3>Studiengangseingträge mit beobachteten Konflikten: <h3>Studiengangseingträge mit beobachteten Konflikten:
<ul> <ul>
$forall (Entity _ (StudyTerms ky _ nm)) <- conflicts $forall (Entity _ (StudyTerms ky _ nm)) <- conflicted
<li> #{show ky} - #{foldMap id nm} <li> #{show ky} - #{foldMap id nm}
<div .container> <div .container>
^{candidateTable} ^{candidateTable}
@ -314,12 +317,3 @@ postAdminFeaturesR = do
psValidator = def & defaultSorting [SortAscBy "termcandidate-key", SortAscBy "termcandidate-name"] psValidator = def & defaultSorting [SortAscBy "termcandidate-key", SortAscBy "termcandidate-name"]
in dbTable psValidator DBTable{..} in dbTable psValidator DBTable{..}
conflictedStudyTerms :: DB [Entity StudyTerms]
conflictedStudyTerms = E.select $ E.from $ \studyTerms -> do
E.where_ $ E.not_ $ E.isNothing $ studyTerms E.^. StudyTermsName
E.where_ $ E.exists $ E.from $ \candidateOne -> do
E.where_ $ candidateOne E.^. StudyTermCandidateKey E.==. studyTerms E.^. StudyTermsKey
E.where_ $ E.notExists . E.from $ \candidateTwo -> do
E.where_ $ candidateTwo E.^. StudyTermCandidateIncidence E.==. candidateOne E.^. StudyTermCandidateIncidence
E.where_ $ studyTerms E.^. StudyTermsName E.==. E.just (candidateTwo E.^. StudyTermCandidateName)
return studyTerms

View File

@ -307,7 +307,7 @@ getCShowR tid ssh csh = do
-- , maybe a course secret -- , maybe a course secret
registerForm :: Maybe UserId -> Maybe CourseParticipant -> Maybe StudyFeaturesId -> Maybe Text -> Form (Maybe StudyFeaturesId, Bool) registerForm :: Maybe UserId -> Maybe CourseParticipant -> Maybe StudyFeaturesId -> Maybe Text -> Form (Maybe StudyFeaturesId, Bool)
-- unfinished WIP: must take study features if registred and show as mforced field -- unfinished WIP: must take study features if registred and show as mforced field
registerForm loggedin participant defSFid msecret = identForm FIDcourseRegister $ \extra -> do registerForm loggedin participant defSFid msecret = identifyForm FIDcourseRegister $ \extra -> do
-- secret fields -- secret fields
(msecretRes', msecretView) <- case msecret of (msecretRes', msecretView) <- case msecret of
(Just _) | not isRegistered -> bimap Just Just <$> mreq textField (fslpI MsgCourseSecret "Code") Nothing (Just _) | not isRegistered -> bimap Just Just <$> mreq textField (fslpI MsgCourseSecret "Code") Nothing

View File

@ -30,10 +30,46 @@ import qualified Database.Esqueleto as E
type STKey = Int -- Key StudyTerms -- for convenience, assmued identical to field StudyTermCandidateKey type STKey = Int -- Key StudyTerms -- for convenience, assmued identical to field StudyTermCandidateKey
data FailedCandidateInference = FailedCandidateInference [Entity StudyTerms]
deriving (Typeable)
instance Show FailedCandidateInference where
show (FailedCandidateInference _) = "Failed Candidate Inference" -- TODO
instance Exception FailedCandidateInference
-- Default Instance
-- | Just an heuristik to fill in defaults -- | Just an heuristik to fill in defaults
shortenStudyTerm :: Text -> Text shortenStudyTerm :: Text -> Text
shortenStudyTerm = concatMap (take 4) . splitCamel shortenStudyTerm = concatMap (take 4) . splitCamel
-- | Attempt to identify new StudyTerms based on observations
inferHandler :: Handler ([UUID],([Entity StudyTerms],[Entity StudyTermCandidate],[(STKey,Text)]))
inferHandler = do
(ambiguous, problems) <- runDB $ (,) <$> removeAmbiguous <*> conflicts
if (null problems)
then do
infRes <- inferAcc ([],[])
return (ambiguous, infRes)
else
return (ambiguous,(problems,[],[]))
where
inferAcc (accRedundants, accAccepted) =
handle (\(FailedCandidateInference fails) -> return (fails,accRedundants,accAccepted)) $ do
(infReds,infAccs) <- runDB inferStep
if null infAccs
then return ([], infReds ++ accRedundants, accAccepted)
else inferAcc (infReds ++ accRedundants, infAccs ++ accAccepted)
inferStep = do
redundants <- removeRedundant
accepted <- acceptSingletons
problems <- conflicts
when (not $ null problems) $ throw $ FailedCandidateInference problems
return (redundants, accepted)
-- | Attempt to identify new StudyTerms based on observations -- | Attempt to identify new StudyTerms based on observations
-- infer :: MonadHandler m => m ([Entity StudyTerms],[Entity StudyTerms]) -- infer :: MonadHandler m => m ([Entity StudyTerms],[Entity StudyTerms])
infer :: DB ([Entity StudyTerms],[(STKey, Text)]) infer :: DB ([Entity StudyTerms],[(STKey, Text)])