!7 concept AppliedRule { S ruleID; S modifiedRule; S outText; S judgement; S comment; S varMap; S matchedRuleStruct; S intention, context; } cmodule AppliedRules > DynCRUD { start { dbIndexing(AppliedRule, 'ruleID); for (AppliedRule r : cloneList(conceptsWhere AppliedRule(ruleID := null))) fixEntry(r); for (AppliedRule r : cloneList(conceptsWhere AppliedRule(varMap := null))) fixEntry(r); dm_registerAs('gazelleFeedbackCRUD); } enhanceFrame { internalFrameIcon(f, gazelle_frameIcon()); } void fixEntry(AppliedRule r) { if (r.ruleID == null) { S ruleID = "?"; pcall { ruleID = gazelle_ruleIDFromMatchedRuleStruct(r.matchedRuleStruct); } cset(r, +ruleID); } if (r.varMap == null) { S varMap = ""; pcall { varMap = sfu(gazelle_varMapFromMatchedRuleStruct(r.matchedRuleStruct); } cset(r, +varMap); } } // API L feedbackForRule(S ruleID) { ret conceptsWhere AppliedRule(+ruleID); } Map stats() { ret multiSetToMap(collectMultiSet ruleID(concepts())); } Map statsByJudgement() { new MultiSet ms; for (AppliedRule r : concepts()) ms.add(r.ruleID + "/" + r.judgement); ret multiSetToMap(ms); } AppliedRule uniqConcept(O... params) { AppliedRule r = super.uniqConcept(params); fixEntry(r); ret r; } }