Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(FeedbackRule): isLowestWorkgroupIdInPeerGroup token #1420

Merged
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ describe('FeedbackRuleEvaluator', () => {
beforeEach(() => {
evaluator = new FeedbackRuleEvaluator(
new FeedbackRuleComponent(DEFAULT_FEEDBACK_RULES, 5, true),
null,
null
);
});
Expand Down Expand Up @@ -78,6 +79,7 @@ function matchRule_hasKIScore() {
beforeEach(() => {
evaluator = new FeedbackRuleEvaluator(
new FeedbackRuleComponent(HAS_KI_SCORE_FEEDBACK_RULES, 5, true),
null,
null
);
});
Expand Down Expand Up @@ -123,6 +125,7 @@ function matchRule_ideaCount() {
];
evaluator = new FeedbackRuleEvaluator(
new FeedbackRuleComponent(feedbackRules, 5, true),
null,
null
);
});
Expand All @@ -147,7 +150,7 @@ function matchNoRule_ReturnDefault() {
function matchNoRule_NoDefaultFeedbackAuthored_ReturnApplicationDefault() {
it(`should return application default rule when no rule is matched and no default is
authored`, () => {
evaluator = new FeedbackRuleEvaluator(new FeedbackRuleComponent([], 5, true), null);
evaluator = new FeedbackRuleEvaluator(new FeedbackRuleComponent([], 5, true), null, null);
expectFeedback(['idea10', 'idea11'], [KI_SCORE_1], 1, evaluator.defaultFeedback);
});
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { Component } from '../../../common/Component';
import { ConfigService } from '../../../services/configService';
import { ConstraintService } from '../../../services/constraintService';
import { FeedbackRuleComponent } from '../../feedbackRule/FeedbackRuleComponent';
import { PeerGroup } from '../../peerChat/PeerGroup';
import { CRaterResponse } from '../cRater/CRaterResponse';
import { FeedbackRule } from './FeedbackRule';
import { FeedbackRuleExpression } from './FeedbackRuleExpression';
Expand All @@ -12,12 +14,14 @@ export class FeedbackRuleEvaluator<T extends Response[]> {
defaultFeedback = $localize`Thanks for submitting your response.`;
protected factory;
protected referenceComponent: Component;
protected peerGroup: PeerGroup;

constructor(
protected component: FeedbackRuleComponent,
protected configService: ConfigService,
protected constraintService: ConstraintService
) {
this.factory = new TermEvaluatorFactory(constraintService);
this.factory = new TermEvaluatorFactory(configService, constraintService);
}

getFeedbackRule(responses: T): FeedbackRule {
Expand Down Expand Up @@ -142,6 +146,10 @@ export class FeedbackRuleEvaluator<T extends Response[]> {
);
}

setPeerGroup(peerGroup: PeerGroup): void {
this.peerGroup = peerGroup;
}

setReferenceComponent(referenceComponent: Component): void {
this.referenceComponent = referenceComponent;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ describe('FeedbackRuleEvaluatorMultipleStudents', () => {
beforeEach(() => {
evaluator = new FeedbackRuleEvaluatorMultipleStudents(
new FeedbackRuleComponent(DEFAULT_FEEDBACK_RULES, 5, true),
null,
null
);
});
Expand All @@ -40,6 +41,7 @@ function matchRules_HasKIScore() {
beforeEach(() => {
evaluator = new FeedbackRuleEvaluatorMultipleStudents(
new FeedbackRuleComponent(HAS_KI_SCORE_FEEDBACK_RULES, 5, true),
null,
null
);
});
Expand Down Expand Up @@ -73,6 +75,7 @@ function matchNoRule_NoDefaultFeedbackAuthored_ReturnApplicationDefault() {
authored`, () => {
evaluator = new FeedbackRuleEvaluatorMultipleStudents(
new FeedbackRuleComponent([], 5, true),
null,
null
);
expectRules([createCRaterResponse(['idea10', 'idea11'], [KI_SCORE_1], 1)], ['default']);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ export class FeedbackRuleEvaluatorMultipleStudents extends FeedbackRuleEvaluator

protected evaluateTerm(term: string, responses: Response[]): boolean {
const evaluator: TermEvaluator = this.factory.getTermEvaluator(term);
evaluator.setPeerGroup(this.peerGroup);
evaluator.setReferenceComponent(this.referenceComponent);
return responses.some((response: Response) => {
return evaluator.evaluate(response);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import { PeerGrouping } from '../../../../../../app/domain/peerGrouping';
import { PeerGroup } from '../../../peerChat/PeerGroup';
import { PeerGroupMember } from '../../../peerChat/PeerGroupMember';
import { CRaterResponse } from '../../cRater/CRaterResponse';
import { IsLowestWorkgroupIdInPeerGroupTermEvaluator } from './IsLowestWorkgroupIdInPeerGroupTermEvaluator';

class ConfigService {
getWorkgroupId() {
return 1;
}
}

describe('IsLowestWorkgroupIdInPeerGroupTermEvaluator', () => {
let evaluator, mockConfigService;
beforeEach(() => {
evaluator = new IsLowestWorkgroupIdInPeerGroupTermEvaluator('isLowestWorkgroupIdInPeerGroup');
mockConfigService = new ConfigService();
evaluator.setConfigService(mockConfigService);
evaluator.setPeerGroup(
new PeerGroup(1, [{ id: 1 }, { id: 2 }] as PeerGroupMember[], new PeerGrouping())
);
});
describe('evaluate()', () => {
[
{
description: 'your workgroup id is the lowest',
myWorkgroupId: 1,
expected: true
},
{
description: 'your workgroup id is not the lowest',
myWorkgroupId: 2,
expected: false
}
].forEach(({ description, myWorkgroupId, expected }) => {
describe(description, () => {
beforeEach(() => {
spyOn(mockConfigService, 'getWorkgroupId').and.returnValue(myWorkgroupId);
});
it(`returns ${expected}`, () => {
expect(evaluator.evaluate(new CRaterResponse())).toEqual(expected);
});
});
});
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { Response } from '../Response';
import { TermEvaluator } from './TermEvaluator';

export class IsLowestWorkgroupIdInPeerGroupTermEvaluator extends TermEvaluator {
evaluate(response: Response | Response[]): boolean {
return this.peerGroup.getWorkgroupIds().sort().at(0) === this.configService.getWorkgroupId();
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
import { Component } from '../../../../common/Component';
import { ConfigService } from '../../../../services/configService';
import { ConstraintService } from '../../../../services/constraintService';
import { PeerGroup } from '../../../peerChat/PeerGroup';
import { Response } from '../Response';

export abstract class TermEvaluator {
protected referenceComponent: Component;
protected configService: ConfigService;
protected constraintService: ConstraintService;
protected peerGroup: PeerGroup;
protected referenceComponent: Component;

constructor(protected term: string) {}
abstract evaluate(response: Response | Response[]): boolean;
Expand All @@ -13,6 +17,10 @@ export abstract class TermEvaluator {
return /accumulatedIdeaCount(MoreThan|Equals|LessThan)\([\d+]\)/.test(term);
}

static isLowestWorkgroupIdInPeerGroupTerm(term: string): boolean {
return term === 'isLowestWorkgroupIdInPeerGroup';
}

static isMyChoiceChosenTerm(term: string): boolean {
return /myChoiceChosen\("\w+"\)/.test(term);
}
Expand Down Expand Up @@ -40,10 +48,18 @@ export abstract class TermEvaluator {
);
}

setConfigService(service: ConfigService): void {
this.configService = service;
}

setConstraintService(service: ConstraintService): void {
this.constraintService = service;
}

setPeerGroup(peerGroup: PeerGroup): void {
this.peerGroup = peerGroup;
}

setReferenceComponent(referenceComponent: Component): void {
this.referenceComponent = referenceComponent;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { IsSubmitNumberEvaluator } from './IsSubmitNumberEvaluator';
import { TermEvaluatorFactory } from './TermEvaluatorFactory';

describe('TermEvaluatorFactory', () => {
const factory = new TermEvaluatorFactory(null);
const factory = new TermEvaluatorFactory(null, null);
describe('getTermEvaluator()', () => {
it('should return correct evaluator', () => {
[
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@ import { IdeaCountWithResponseIndexTermEvaluator } from './IdeaCountWithResponse
import { IdeaTermEvaluator } from './IdeaTermEvaluator';
import { IsSubmitNumberEvaluator } from './IsSubmitNumberEvaluator';
import { TermEvaluator } from './TermEvaluator';
import { ConfigService } from '../../../../services/configService';
import { IsLowestWorkgroupIdInPeerGroupTermEvaluator } from './IsLowestWorkgroupIdInPeerGroupTermEvaluator';

export class TermEvaluatorFactory {
constructor(private constraintService: ConstraintService) {}
constructor(private configService: ConfigService, private constraintService: ConstraintService) {}

getTermEvaluator(term: string): TermEvaluator {
let evaluator: TermEvaluator;
Expand All @@ -25,9 +27,12 @@ export class TermEvaluatorFactory {
evaluator = new AccumulatedIdeaCountTermEvaluator(term);
} else if (TermEvaluator.isMyChoiceChosenTerm(term)) {
evaluator = new MyChoiceChosenTermEvaluator(term);
} else if (TermEvaluator.isLowestWorkgroupIdInPeerGroupTerm(term)) {
evaluator = new IsLowestWorkgroupIdInPeerGroupTermEvaluator(term);
} else {
evaluator = new IdeaTermEvaluator(term);
}
evaluator.setConfigService(this.configService);
evaluator.setConstraintService(this.constraintService);
return evaluator;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ export class DialogGuidanceStudentComponent extends ComponentStudent {
this.getMaxSubmitCount(),
this.component.isMultipleFeedbackTextsForSameRuleAllowed()
),
this.configService,
this.constraintService
);
if (this.component.isComputerAvatarEnabled()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,7 @@ export class OpenResponseStudent extends ComponentStudent {
this.getMaxSubmitCount(),
this.isMultipleFeedbackTextsForSameRuleAllowed()
),
this.ConfigService,
this.constraintService
);
const rule: FeedbackRule = feedbackRuleEvaluator.getFeedbackRule([response]);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { Observable } from 'rxjs';
import { Observable, forkJoin } from 'rxjs';
import { PeerGroupService } from '../../../services/peerGroupService';
import { ProjectService } from '../../../services/projectService';
import { OpenResponseContent } from '../../openResponse/OpenResponseContent';
Expand All @@ -14,6 +14,7 @@ import { PeerGroup } from '../PeerGroup';
import { QuestionBankContent } from './QuestionBankContent';
import { copy } from '../../../common/object/object';
import { ConstraintService } from '../../../services/constraintService';
import { ConfigService } from '../../../services/configService';

@Component({
selector: 'peer-chat-question-bank',
Expand All @@ -27,6 +28,7 @@ export class PeerChatQuestionBankComponent implements OnInit {
questions: string[];

constructor(
private configService: ConfigService,
private constraintService: ConstraintService,
private peerGroupService: PeerGroupService,
private projectService: ProjectService
Expand All @@ -49,13 +51,20 @@ export class PeerChatQuestionBankComponent implements OnInit {
}

private evaluatePeerGroup(referenceComponent: WISEComponent): void {
this.getPeerGroupData(
const peerGroupRequest = this.peerGroupService.retrievePeerGroup(
this.content.questionBank.getPeerGroupingTag()
);
const peerGroupDataRequest = this.getPeerGroupData(
this.content.questionBank.getPeerGroupingTag(),
this.content.nodeId,
this.content.componentId
).subscribe((peerGroupStudentData: PeerGroupStudentData[]) => {
);
forkJoin([peerGroupRequest, peerGroupDataRequest]).subscribe((response) => {
const peerGroup = response[0];
const peerGroupStudentData = response[1];
const questionBankRules = this.chooseQuestionBankRulesToDisplay(
referenceComponent,
peerGroup,
peerGroupStudentData
);
this.displayedQuestionBankRules = questionBankRules;
Expand All @@ -66,6 +75,7 @@ export class PeerChatQuestionBankComponent implements OnInit {

private chooseQuestionBankRulesToDisplay(
referenceComponent: WISEComponent,
peerGroup: PeerGroup,
peerGroupStudentData: PeerGroupStudentData[]
): QuestionBankRule[] {
const responses = peerGroupStudentData.map((peerMemberData: PeerGroupStudentData) => {
Expand All @@ -81,9 +91,11 @@ export class PeerChatQuestionBankComponent implements OnInit {
(referenceComponent.content as OpenResponseContent).maxSubmitCount,
false
),
this.configService,
this.constraintService
);
feedbackRuleEvaluator.setReferenceComponent(referenceComponent);
feedbackRuleEvaluator.setPeerGroup(peerGroup);
return this.filterQuestions(
feedbackRuleEvaluator.getFeedbackRules(responses) as QuestionBankRule[],
this.content.questionBank.maxQuestionsToShow
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,12 @@ export abstract class DynamicPromptEvaluator {

evaluate(referenceComponent: Component): void {
if (this.component.dynamicPrompt.isPeerGroupingTagSpecified()) {
this.evaluatePeerGroup(referenceComponent);
this.component.peerGroupService
.retrievePeerGroup(this.component.dynamicPrompt.getPeerGroupingTag())
.subscribe((peerGroup) => {
this.component.peerGroup = peerGroup;
this.evaluatePeerGroup(referenceComponent);
});
} else {
this.evaluatePersonal(referenceComponent);
}
Expand All @@ -31,9 +36,14 @@ export abstract class DynamicPromptEvaluator {
const evaluator = this.component.dynamicPrompt.isPeerGroupingTagSpecified()
? new FeedbackRuleEvaluatorMultipleStudents(
feedbackRuleComponent,
this.component.configService,
this.component.constraintService
)
: new FeedbackRuleEvaluator(feedbackRuleComponent, this.component.constraintService);
: new FeedbackRuleEvaluator(
feedbackRuleComponent,
this.component.configService,
this.component.constraintService
);
evaluator.setReferenceComponent(referenceComponent);
return evaluator;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ export class DynamicPromptMultipleChoiceEvaluator extends DynamicPromptEvaluator
});
});
const feedbackRuleEvaluator = this.getFeedbackRuleEvaluator(referenceComponent);
feedbackRuleEvaluator.setPeerGroup(this.component.peerGroup);
this.setPromptAndEmitRule(feedbackRuleEvaluator.getFeedbackRule(responses));
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ export class DynamicPromptOpenResponseEvaluator extends DynamicPromptEvaluator {
});
});
const feedbackRuleEvaluator = this.getFeedbackRuleEvaluator(referenceComponent);
feedbackRuleEvaluator.setPeerGroup(this.component.peerGroup);
this.setPromptAndEmitRule(feedbackRuleEvaluator.getFeedbackRule(cRaterResponses));
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { DynamicPrompt } from './DynamicPrompt';
import { ConstraintService } from '../../services/constraintService';
import { DynamicPromptOpenResponseEvaluator } from './DynamicPromptOpenResponseEvaluator';
import { DynamicPromptMultipleChoiceEvaluator } from './DynamicPromptMultipleChoiceEvaluator';
import { PeerGroup } from '../../components/peerChat/PeerGroup';

@Component({
selector: 'dynamic-prompt',
Expand All @@ -24,8 +25,9 @@ export class DynamicPromptComponent implements OnInit {
@Input() dynamicPrompt: DynamicPrompt;
@Output() dynamicPromptChanged: EventEmitter<FeedbackRule> = new EventEmitter<FeedbackRule>();
@Input() nodeId: string;
prompt: string;
peerGroup: PeerGroup;
peerGroupService: PeerGroupService;
prompt: string;

constructor(
annotationService: AnnotationService,
Expand Down
2 changes: 1 addition & 1 deletion src/messages.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -15815,7 +15815,7 @@ Are you ready to receive feedback on this answer?</source>
<source>Thanks for submitting your response.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/assets/wise5/components/common/feedbackRule/FeedbackRuleEvaluator.ts</context>
<context context-type="linenumber">12</context>
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
<trans-unit id="ac4a8ebf1347b29327308613dd307970ec899941" datatype="html">
Expand Down
Loading