adamc@1022: functor Make(M : Conference.INPUT) = struct adamc@1022: open M adamc@1022: adamc@1022: table bid : {User : userId, Paper : paperId, Interest : char} adamc@1022: PRIMARY KEY (User, Paper) adamc@1022: adamc@1022: table assignment : {User : userId, Paper : paperId} adamc@1022: PRIMARY KEY (User, Paper) adamc@1022: adamc@1025: fun intOut ch = adamc@1025: case ch of adamc@1025: #"_" => "Maybe" adamc@1025: | #"-" => "No" adamc@1025: | #"+" => "Yes" adamc@1025: | _ => error Bid: Invalid Interest code adamc@1025: adamc@1025: val linksForChair = adamc@1025: let adamc@1025: fun assignPapers () = adamc@1025: tup <- query (SELECT paper.Id, paper.{{M.paper}}, user.Id, user.Nam, bid.Interest adamc@1025: FROM paper JOIN bid ON bid.Paper = paper.Id adamc@1025: JOIN user ON bid.User = user.Id adamc@1025: ORDER BY paper.Id, bid.Interest, user.Nam) adamc@1025: (fn r (pid, int, acc, ints, papers) => adamc@1025: if pid = Some r.Paper.Id then adamc@1025: if int = r.Bid.Interest then adamc@1025: return (pid, int, (r.User.Id, r.User.Nam) :: acc, ints, papers) adamc@1025: else adamc@1025: return (pid, r.Bid.Interest, (r.User.Id, r.User.Nam) :: [], adamc@1025: (int, acc) :: ints, papers) adamc@1025: else adamc@1025: return (Some r.Paper.Id, r.Bid.Interest, adamc@1025: (r.User.Id, r.User.Nam) :: [], [], adamc@1025: case pid of adamc@1025: None => papers adamc@1025: | Some pid => (pid, (int, acc) :: ints) :: papers)) adamc@1025: (None, #" ", [], [], []); adamc@1025: let adamc@1025: val papersL = case tup.1 of adamc@1025: Some pid => (pid, (tup.2, tup.3) :: tup.4) :: tup.5 adamc@1025: | _ => [] adamc@1025: adamc@1025: fun makePapers () = List.mapM (fn (pid, ints) => adamc@1025: ints <- List.mapM (fn (int, users) => adamc@1025: cg <- CheckGroup.create adamc@1025: (List.mp adamc@1025: (fn (id, nam) => (id, txt nam, adamc@1025: False)) adamc@1025: users); adamc@1025: ex <- Expandable.create adamc@1025: (CheckGroup.render cg); adamc@1025: return (int, cg, ex)) ints; adamc@1025: return (pid, ints)) papersL adamc@1025: in adamc@1025: papers <- source []; adamc@1025: adamc@1025: return adamc@1025:

Assign papers

adamc@1025: adamc@1025: adamc@1025:
adamc@1025: Paper #{[pid]}: adamc@1025: adamc@1025: this <- CheckGroup.selected cg; adamc@1025: total <- total; adamc@1025: return (List.length this + total)) (return 0) ints; adamc@1025: return (txt n)}/>
adamc@1025: adamc@1025: {List.mapX (fn (int, _, ex) => adamc@1025: {[intOut int]}: {Expandable.render ex} adamc@1025: ) ints} adamc@1025:
) papers)}/> adamc@1025:
adamc@1025: end adamc@1025: in adamc@1025: adamc@1025:
  • Assign papers to people
  • adamc@1025:
    adamc@1025: end adamc@1025: adamc@1022: val linksForPc = adamc@1022: let adamc@1023: fun yourBids () = adamc@1023: me <- getPcLogin; adamc@1023: ps <- queryX (SELECT paper.Id, paper.{{M.paper}}, bid.Interest adamc@1023: FROM paper LEFT JOIN bid ON bid.Paper = paper.Id adamc@1023: AND bid.User = {[me.Id]}) adamc@1025: (fn r => adamc@1025: {useMore (summarizePaper (r.Paper -- #Id))} adamc@1025: adamc@1025: adamc@1025: adamc@1025: {useMore (Select.selectChar ((#"-", "No") :: (#"_", "Maybe") :: (#"+", "Yes") :: []) adamc@1025: r.Bid.Interest)} adamc@1025: adamc@1025: ); adamc@1023: return adamc@1023:

    Bid on papers

    adamc@1023: adamc@1023:
    adamc@1023: adamc@1023: adamc@1023: {ps} adamc@1023:
    Paper Your Bid
    adamc@1023: adamc@1023: adamc@1023:
    adamc@1023: adamc@1023: and changeBids r = adamc@1023: me <- getPcLogin; adamc@1023: List.app (fn {Paper = p, Bid = b} => adamc@1023: case b of adamc@1023: "" => return () adamc@1023: | _ => let adamc@1023: val p = readError p adamc@1023: in adamc@1023: (dml (DELETE FROM bid WHERE Paper = {[p]} AND User = {[me.Id]}); adamc@1023: dml (INSERT INTO bid (Paper, User, Interest) adamc@1023: VALUES ({[p]}, {[me.Id]}, {[String.sub b 0]}))) adamc@1023: end) r.Papers; adamc@1023: yourBids () adamc@1022: in adamc@1022: adamc@1023:
  • Bid on papers
  • adamc@1022:
    adamc@1022: end adamc@1022: adamc@1022: con yourPaperTables = [Assignment = _] adamc@1022: constraint [Paper] ~ yourPaperTables adamc@1022: fun joinYourPaper [tabs] [paper] [[Paper] ~ tabs] [[Paper] ~ _] [tabs ~ yourPaperTables] [[Id] ~ paper] adamc@1022: (fi : sql_from_items ([Paper = [Id = paperId] ++ paper] ++ tabs)) = adamc@1022: sql_inner_join fi (sql_from_table [#Assignment] assignment) (WHERE Paper.Id = Assignment.Paper) adamc@1022: end