UNPKG

quizzer

Version:

Quizzer is a webserver for collaborative writing lab support. Based on a _fail early, fail often? approach to written language, the tool is particularly suited to second-language learners. The workflow (essay - error - quiz - exam) treats mistakes as an o

240 lines (236 loc) 10.9 kB
(function () { var cogClass = function () {}; cogClass.prototype.exec = function (params, request, response) { var oops = this.utils.apiError; var sys = this.sys; var kohaiRuleID = params.kohairuleid; var senpaiRuleID = params.senpairuleid; //console.log("========> senpaiRuleID: "+senpaiRuleID); checkKohaiInRulesToChoices(); // Change kohai entries in rulesToChoices to senpai ID // OR delete if senpai entry already exists. var rcData = {senpai:{},kohai:{}}; function checkKohaiInRulesToChoices() { //console.log("(1)"); var sql = 'SELECT choiceID FROM rulesToChoices WHERE ruleID=?'; sys.db.all(sql,[kohaiRuleID],function(err,rows){ if (err) {return oops(response,err,'classes/mergetworules(1)')}; if (rows && rows.length) { for (var i=0,ilen=rows.length;i<ilen;i+=1) { var row = rows[i]; rcData.kohai[row.choiceID] = true; } } checkSenpaiInRulesToChoices(); }); }; function checkSenpaiInRulesToChoices() { //console.log("(2)"); var sql = 'SELECT ruleToChoiceID FROM rulesToChoices WHERE ruleID=?'; sys.db.all(sql,[senpaiRuleID],function(err,rows){ if (err) {return oops(response,err,'classes/mergetworules(2)')}; if (rows && rows.length) { for (var i=0,ilen=rows.length;i<ilen;i+=1) { var row = rows[i]; rcData.senpai[row.choiceID] = true; } } addSenpaiInRulesToChoices(); }); }; function addSenpaiInRulesToChoices() { //console.log("(3)"); var sqlparams = []; var sqlstr = []; for (var key in rcData.kohai) { if (!rcData.senpai[key]) { sqlparams.push(key); sqlstr.push('?'); } } var sql = 'INSERT INTO rulesToChoices (choiceID,ruleID) SELECT choiceID,? FROM rulesToChoices WHERE ruleID=? AND choiceID IN (' + sqlstr.join(',') + ')'; sqlparams = [senpaiRuleID,kohaiRuleID].concat(sqlparams); sys.db.run(sql,sqlparams,function(err){ if (err) {return oops(response,err,'classes/mergetworules(3)')}; deleteKohaiInRulesToChoices(); }); }; function deleteKohaiInRulesToChoices() { //console.log("(4)"); var sql = 'DELETE FROM rulesToChoices WHERE ruleID=?;'; sys.db.run(sql,[kohaiRuleID],function(err){ if (err) {return oops(response,err,'classes/mergetworules(4)')}; checkKohaiRuleTranslations(); }); }; // // Copy kohai entries in ruleTranslations to use senpai ID // OR list for deletion if a senpai entry for the target language // already exists. var rtData = {senpai:{},kohai:{}}; function checkKohaiRuleTranslations() { //console.log("(5)"); var sql = 'SELECT lang,ruleTranslationID FROM ruleTranslations WHERE ruleID=?;'; sys.db.all(sql,[kohaiRuleID],function(err,rows){ if (err) {return oops(response,err,'classes/mergetworules(5)')}; //console.log("CHECKING FOR KOHAI: "+kohaiRuleID); if (rows && rows.length) { for (var i=0,ilen=rows.length;i<ilen;i+=1) { var row = rows[i]; //console.log(" "+row.lang+" "+row.ruleTranslationID); rtData.kohai[row.lang] = row.ruleTranslationID; } } checkSenpaiRuleTranslations(); }); }; function checkSenpaiRuleTranslations() { //console.log("(6)"); var sql = 'SELECT lang,ruleTranslationID FROM ruleTranslations WHERE ruleID=?;'; sys.db.all(sql,[senpaiRuleID],function(err,rows){ if (err) {return oops(response,err,'classes/mergetworules(6)')}; //console.log("CHECKING FOR SENPAI: "+senpaiRuleID); if (rows && rows.length) { for (var i=0,ilen=rows.length;i<ilen;i+=1) { var row = rows[i]; //console.log(" "+row.lang+" "+row.ruleTranslationID); rtData.senpai[row.lang] = row.ruleTranslationID; } } moveKohaiRuleTranslations(); }); }; function moveKohaiRuleTranslations() { //console.log("(7)"); var sqlparams = []; var sqlstr = []; for (var key in rtData.kohai) { if (!rtData.senpai[key]) { sqlparams.push(key); sqlstr.push('?'); } } var sql = 'INSERT OR REPLACE INTO ruleTranslations (ruleTranslationID,ruleID,string,lang) ' + 'SELECT ruleTranslationID,?,string,lang ' + 'FROM ruleTranslations ' + 'WHERE ruleID=? AND lang IN (' + sqlstr.join(',') + ')'; sqlparams = [senpaiRuleID,kohaiRuleID].concat(sqlparams); //console.log("SQL: "+sql); //console.log("PARAMS: "+sqlparams); sys.db.run(sql,sqlparams,function(err){ if (err) {return oops(response,err,'classes/mergetworules(7)')}; moveKohaiRuleTranslationEdits(); }); }; // // Point all kohai entries in ruleTranlsationEdits to point // at new senpai entries. function moveKohaiRuleTranslationEdits() { //console.log("(8)"); var sqlparams_senpai = []; var sqlparams_kohai = []; var sqlstr = []; // kohai edits that apply to items that were NOT moved // in the last step are mapped across here for (var key in rtData.kohai) { if (rtData.senpai[key]) { sqlparams_senpai.push(rtData.senpai[key]); sqlstr.push('?'); } } for (var key in rtData.kohai) { if (rtData.senpai[key]) { sqlparams_kohai.push(rtData.kohai[key]); sqlstr.push('?'); } } // Don't actually need to have two WHERE clauses here, the join would take care of it. var sqlparams = sqlparams_senpai.concat(sqlparams_kohai); var sql = 'INSERT OR REPLACE INTO ruleTranslationEdits (ruleTranslationEditID,ruleTranslationID,studentID,editDate) ' + 'SELECT ruleTranslationEditID,ruleTranslationID,studentID,editDate ' + 'FROM (' + 'SELECT ruleID,lang,ruleTranslationID ' + 'FROM ruleTranslations AS rt ' + 'JOIN ruleTranslationEdits USING(ruleTranslationID) ' + 'WHERE rt.ruleTranslationID IN (' + sqlstr.join(',') + ') ' + ') AS senpai ' + 'JOIN (' + 'SELECT ruleID,lang,ruleTranslationEditID,studentID,editDate ' + 'FROM ruleTranslations AS rt ' + 'JOIN ruleTranslationEdits USING(ruleTranslationID) ' + 'WHERE rt.ruleTranslationID IN (' + sqlstr.join(',') + ') ' + ') AS kohai USING(ruleID,lang)' //console.log("SQL: "+sql); //console.log("PARAMS: "+sqlparams) sys.db.run(sql,sqlparams,function(err){ if (err) {return oops(response,err,'classes/mergetworules(8)')}; // There should now be no key violation when the ruleTranslations are deleted deleteKohaiRuleTranslations(); }); }; function deleteKohaiRuleTranslations() { //console.log("(9)"); var sqlparams = []; var sqlstr = []; for (var key in rtData.kohai) { if (rtData.senpai[key]) { sqlparams.push(key); sqlstr.push('?'); } } var sql = 'DELETE FROM ruleTranslations WHERE ruleID=? AND lang IN (' + sqlstr.join(',') + ')'; sqlparams = [kohaiRuleID].concat(sqlparams); sys.db.run(sql,sqlparams,function(err){ if (err) {return oops(response,err,'classes/mergetworules(9)')}; checkKohaiRule(); }); }; // Check ruleStringID of rule before wiping it out var kohaiRuleStringID = {}; function checkKohaiRule() { //console.log("(10)"); var sql = 'SELECT ruleStringID FROM rules WHERE ruleID=?'; sys.db.get(sql,[kohaiRuleID],function(err,row){ if (err||!row) {return oops(response,err,'classes/mergetworules(10)')}; kohaiRuleStringID.id = row.ruleStringID; deleteKohaiRule(); }); }; // // Delete kohai rule entry. function deleteKohaiRule() { //console.log("(11)"); var sql = 'DELETE FROM rules WHERE ruleID=?'; sys.db.run(sql,[kohaiRuleID],function(err){ if (err) {return oops(response,err,'classes/mergetworules(11)')}; checkKohaiRuleString(); }); }; // // Delete kohai ruleStrings entry IF it is no longer used. function checkKohaiRuleString() { //console.log("(12)"); var sql = 'SELECT COUNT(*) AS count FROM ruleStrings WHERE ruleStringID=?'; sys.db.get(sql,[kohaiRuleStringID.id],function(err,row){ if (err||!row) {return oops(response,err,'classes/mergetworules(12)')}; if (row.count == 0) { deleteKohaiRuleString() } else { response.writeHead(200, {'Content-Type': 'application/json'}); response.end(JSON.stringify(['success'])); } }); }; function deleteKohaiRuleString() { //console.log("(13)"); var sql = 'DELETE FROM ruleStrings WHERE ruleStringID=?'; sys.db.run(sql,[kohaiRuleStringID.id],function(err){ if (err) {return oops(response,err,'classes/mergetworules(12)')}; response.writeHead(200, {'Content-Type': 'application/json'}); response.end(JSON.stringify(['success'])); }); }; // } exports.cogClass = cogClass; })();