Skip to content

Commit

Permalink
#8 PartyLazy,PartyNoOpinion
Browse files Browse the repository at this point in the history
  • Loading branch information
pethers committed Mar 7, 2018
1 parent 6228e26 commit 23fde97
Show file tree
Hide file tree
Showing 6 changed files with 145 additions and 61 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -117,8 +117,13 @@ public final String getRuleSummary() {
* @param ruleDescription
* the rule description
*/
public final void addViolation(final Status status,final String ruleName,final String ruleGroup,final String ruleDescription) {
ruleViolationMap.put(ruleName, new RuleViolation(getId(),getName(),resourceType,ruleName,ruleDescription,ruleGroup,status));
public final void addViolation(final Status status,final String ruleName,final String ruleGroup,final String ruleDescription) {
RuleViolation currentRuleViolation = ruleViolationMap.get(ruleName);
if (currentRuleViolation == null) {
ruleViolationMap.put(ruleName, new RuleViolation(getId(),getName(),resourceType,ruleName,ruleDescription,ruleGroup,status));
} else if (status.ordinal() > currentRuleViolation.getStatus().ordinal()) {
ruleViolationMap.put(ruleName, new RuleViolation(getId(),getName(),resourceType,ruleName,ruleDescription,ruleGroup,status));
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,23 +58,29 @@ public final class PartyComplianceCheckImpl extends AbstractComplianceCheckImpl
private List<ViewRiksdagenVoteDataBallotPartySummaryDaily> dailyBallotSummary = new ArrayList<>();

/** The daily summary. */
private ViewRiksdagenVoteDataBallotPartySummaryDaily dailySummary;
private final ViewRiksdagenVoteDataBallotPartySummaryDaily dailySummary;

/** The monthly summary. */
private ViewRiksdagenVoteDataBallotPartySummaryMonthly monthlySummary;
private final ViewRiksdagenVoteDataBallotPartySummaryMonthly monthlySummary;

/** The annual summary. */
private ViewRiksdagenVoteDataBallotPartySummaryAnnual annualSummary;
private final ViewRiksdagenVoteDataBallotPartySummaryAnnual annualSummary;

/**
* Instantiates a new party compliance check impl.
*
* @param party
* the party
* @param dailySummary
* @param monthlySummary
* @param annualSummary
*/
public PartyComplianceCheckImpl(final ViewRiksdagenPartySummary party) {
public PartyComplianceCheckImpl(final ViewRiksdagenPartySummary party,final ViewRiksdagenVoteDataBallotPartySummaryAnnual annualSummary,final ViewRiksdagenVoteDataBallotPartySummaryMonthly monthlySummary,final ViewRiksdagenVoteDataBallotPartySummaryDaily dailySummary) {
super(ResourceType.PARTY);
this.party = party;
this.annualSummary = annualSummary;
this.monthlySummary = monthlySummary;
this.dailySummary = dailySummary;
this.name = party.getParty();
}

Expand Down Expand Up @@ -163,16 +169,6 @@ public ViewRiksdagenVoteDataBallotPartySummaryDaily getDailySummary() {
return dailySummary;
}

/**
* Sets the daily summary.
*
* @param dailySummary
* the new daily summary
*/
public void setDailySummary(ViewRiksdagenVoteDataBallotPartySummaryDaily dailySummary) {
this.dailySummary = dailySummary;
}

/**
* Gets the monthly summary.
*
Expand All @@ -182,15 +178,6 @@ public ViewRiksdagenVoteDataBallotPartySummaryMonthly getMonthlySummary() {
return monthlySummary;
}

/**
* Sets the monthly summary.
*
* @param monthlySummary
* the new monthly summary
*/
public void setMonthlySummary(ViewRiksdagenVoteDataBallotPartySummaryMonthly monthlySummary) {
this.monthlySummary = monthlySummary;
}

/**
* Gets the annual summary.
Expand All @@ -201,14 +188,4 @@ public ViewRiksdagenVoteDataBallotPartySummaryAnnual getAnnualSummary() {
return annualSummary;
}

/**
* Sets the annual summary.
*
* @param annualSummary
* the new annual summary
*/
public void setAnnualSummary(ViewRiksdagenVoteDataBallotPartySummaryAnnual annualSummary) {
this.annualSummary = annualSummary;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@
import org.springframework.transaction.annotation.Transactional;

import com.google.common.collect.Iterables;
import com.hack23.cia.model.internal.application.data.committee.impl.ViewRiksdagenVoteDataBallotPartySummaryAnnual;
import com.hack23.cia.model.internal.application.data.committee.impl.ViewRiksdagenVoteDataBallotPartySummaryDaily;
import com.hack23.cia.model.internal.application.data.committee.impl.ViewRiksdagenVoteDataBallotPartySummaryMonthly;
import com.hack23.cia.model.internal.application.data.committee.impl.ViewRiksdagenVoteDataBallotPoliticianSummaryAnnual;
import com.hack23.cia.model.internal.application.data.committee.impl.ViewRiksdagenVoteDataBallotPoliticianSummaryDaily;
import com.hack23.cia.model.internal.application.data.committee.impl.ViewRiksdagenVoteDataBallotPoliticianSummaryMonthly;
Expand All @@ -60,20 +63,20 @@ public final class RulesEngineImpl implements RulesEngine {

@Autowired
private KieContainer rulesContainer;

@Override
@Cacheable("checkRulesCompliance")
public List<ComplianceCheck> checkRulesCompliance() {
KieSession ksession = rulesContainer.newKieSession();
Map<String,ComplianceCheck> complianceChecks = new HashMap<>();
Map<String, ComplianceCheck> complianceChecks = new HashMap<>();
ksession.addEventListener(new ComplianceCheckAgendaEventListener(complianceChecks));

insertPoliticians(ksession, dataViewer.getAll(ViewRiksdagenPolitician.class));
insertParties(ksession, dataViewer.getAll(ViewRiksdagenPartySummary.class));
//insertParties(ksession, dataViewer.getAll(ViewRiksdagenPartySummary.class));

ksession.fireAllRules();
ksession.dispose();
return new ArrayList(complianceChecks.values());
return new ArrayList<>(complianceChecks.values());
}

/**
Expand All @@ -95,21 +98,6 @@ private void insertPoliticians(KieSession ksession, final List<ViewRiksdagenPoli
Map<String, List<ViewRiksdagenVoteDataBallotPoliticianSummaryDaily>> politicanBallotSummaryDailyMap = dataViewer
.getAll(ViewRiksdagenVoteDataBallotPoliticianSummaryDaily.class).stream()
.collect(Collectors.groupingBy(p -> p.getEmbeddedId().getIntressentId()));
// Map<String, List<ViewRiksdagenVoteDataBallotPoliticianSummary>>
// politicanBallotSummaryMap =
// dataViewer.getAll(ViewRiksdagenVoteDataBallotPoliticianSummary.class).stream().collect(Collectors.groupingBy(p
// -> p.getEmbeddedId().getIntressentId()));
// Map<String, List<ViewRiksdagenCommitteeBallotDecisionPoliticianSummary>>
// politicanCommitteeDecisionSummaryMap =
// dataViewer.getAll(ViewRiksdagenCommitteeBallotDecisionPoliticianSummary.class).stream().collect(Collectors.groupingBy(p
// -> p.getEmbeddedId().getIntressentId()));
// Map<String, List<ViewRiksdagenPoliticianDocumentDailySummary>>
// politicanDocumentSummaryDailyMap =
// dataViewer.getAll(ViewRiksdagenPoliticianDocumentDailySummary.class).stream().collect(Collectors.groupingBy(p
// -> p.getEmbeddedId().getPersonId()));
// Map<String, List<ViewRiksdagenPoliticianDocument>> politicanDocumentMap =
// dataViewer.getAll(ViewRiksdagenPoliticianDocument.class).stream().collect(Collectors.groupingBy(p
// -> p.getPersonReferenceId()));

for (ViewRiksdagenPolitician politicianData : list) {
if (politicianData != null) {
Expand Down Expand Up @@ -151,10 +139,44 @@ private void insertPoliticians(KieSession ksession, final List<ViewRiksdagenPoli
* @param list
* the list
*/
private static void insertParties(KieSession ksession, final List<ViewRiksdagenPartySummary> list) {
private void insertParties(KieSession ksession, final List<ViewRiksdagenPartySummary> list) {
Map<String, List<ViewRiksdagenVoteDataBallotPartySummaryDaily>> politicanBallotSummaryAnnualMap = dataViewer
.getAll(ViewRiksdagenVoteDataBallotPartySummaryDaily.class).stream()
.collect(Collectors.groupingBy(p -> p.getEmbeddedId().getParty()));
Map<String, List<ViewRiksdagenVoteDataBallotPartySummaryMonthly>> politicanBallotSummaryMontlyMap = dataViewer
.getAll(ViewRiksdagenVoteDataBallotPartySummaryMonthly.class).stream()
.collect(Collectors.groupingBy(p -> p.getEmbeddedId().getParty()));
Map<String, List<ViewRiksdagenVoteDataBallotPartySummaryAnnual>> politicanBallotSummaryDailyMap = dataViewer
.getAll(ViewRiksdagenVoteDataBallotPartySummaryAnnual.class).stream()
.collect(Collectors.groupingBy(p -> p.getEmbeddedId().getParty()));

for (ViewRiksdagenPartySummary partyData : list) {
if (partyData != null) {
ksession.insert(new PartyComplianceCheckImpl(partyData));
if (partyData != null) {
List<ViewRiksdagenVoteDataBallotPartySummaryAnnual> dailyList = politicanBallotSummaryDailyMap
.get(partyData.getParty());
List<ViewRiksdagenVoteDataBallotPartySummaryMonthly> monthlyList = politicanBallotSummaryMontlyMap
.get(partyData.getParty());
List<ViewRiksdagenVoteDataBallotPartySummaryDaily> annualList = politicanBallotSummaryAnnualMap
.get(partyData.getParty());

if (partyData.isActiveParliament() && dailyList != null && monthlyList != null
&& annualList != null) {
Collections.sort(dailyList,
(e1, e2) -> e1.getEmbeddedId().getVoteDate().compareTo(e2.getEmbeddedId().getVoteDate()));
Collections.sort(monthlyList,
(e1, e2) -> e1.getEmbeddedId().getVoteDate().compareTo(e2.getEmbeddedId().getVoteDate()));
Collections.sort(annualList,
(e1, e2) -> e1.getEmbeddedId().getVoteDate().compareTo(e2.getEmbeddedId().getVoteDate()));

PartyComplianceCheckImpl politicianComplianceCheckImpl = new PartyComplianceCheckImpl(
partyData, Iterables.getFirst(dailyList, null), Iterables.getFirst(monthlyList, null),
Iterables.getFirst(annualList, null));
ksession.insert(politicianComplianceCheckImpl);
} else {
PartyComplianceCheckImpl politicianComplianceCheckImpl = new PartyComplianceCheckImpl(
partyData, null, null, null);
ksession.insert(politicianComplianceCheckImpl);
}
}
}
}
Expand All @@ -171,7 +193,7 @@ private static void insertParties(KieSession ksession, final List<ViewRiksdagenP
* @see ComplianceCheckAgendaEventEvent
*/
private static final class ComplianceCheckAgendaEventListener extends DefaultAgendaEventListener {

/** The compliance checks. */
private final Map<String, ComplianceCheck> complianceChecks;

Expand All @@ -187,8 +209,9 @@ public ComplianceCheckAgendaEventListener(Map<String, ComplianceCheck> complianc

@Override
public void afterMatchFired(AfterMatchFiredEvent event) {
super.afterMatchFired(event);
AbstractComplianceCheckImpl check = (AbstractComplianceCheckImpl) ((DefaultFactHandle) event.getMatch().getFactHandles().stream().findFirst().orElse(null)).getObject();
super.afterMatchFired(event);
AbstractComplianceCheckImpl check = (AbstractComplianceCheckImpl) ((DefaultFactHandle) event.getMatch()
.getFactHandles().stream().findFirst().orElse(null)).getObject();
complianceChecks.put(check.getId(), check);
}
}
Expand Down
38 changes: 38 additions & 0 deletions service.impl/src/main/resources/rules/party/PartyLazy.drl
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.hack23.cia.service.impl.rules

import org.kie.api.runtime.KieRuntime

import com.hack23.cia.model.internal.application.data.party.impl.ViewRiksdagenPartySummary
import com.hack23.cia.model.internal.application.data.committee.impl.ViewRiksdagenVoteDataBallotPartySummaryDaily
import com.hack23.cia.model.internal.application.data.committee.impl.ViewRiksdagenVoteDataBallotPartySummaryMonthly
import com.hack23.cia.model.internal.application.data.committee.impl.ViewRiksdagenVoteDataBallotPartySummaryAnnual
import com.hack23.cia.service.api.action.kpi.Status
import com.hack23.cia.service.impl.rules.PartyComplianceCheckImpl
import com.hack23.cia.service.api.action.kpi.ComplianceCheck

rule "We have a lazy party, absent 15 % last day of ballots in parliament"
dialect "java"
salience 10
when
$p : PartyComplianceCheckImpl(party.activeParliament == true && party.party != "-" && dailySummary != null && dailySummary.partyPercentageAbsent >= 15)
then
$p.addViolation( Status.MINOR, "PartyLazy","Behavior", kcontext.getRule().getName());
end

rule "We have a lazy party, absent more than 15 % of ballots last month"
dialect "java"
salience 50
when
$p : PartyComplianceCheckImpl( party.activeParliament == true && party.party != "-" && monthlySummary != null && monthlySummary.partyPercentageAbsent >= 15)
then
$p.addViolation( Status.MAJOR, "PartyLazy","Behavior", kcontext.getRule().getName());
end

rule "We have a lazy party, absent more than 15 % of ballots last year"
dialect "java"
salience 100
when
$p : PartyComplianceCheckImpl( party.activeParliament == true && party.party != "-" && annualSummary != null && annualSummary.partyPercentageAbsent >= 15)
then
$p.addViolation( Status.CRITICAL, "PartyLazy","Behavior", kcontext.getRule().getName());
end
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,17 @@ package com.hack23.cia.service.impl.rules
import org.kie.api.runtime.KieRuntime

import com.hack23.cia.model.internal.application.data.party.impl.ViewRiksdagenPartySummary
import com.hack23.cia.model.internal.application.data.committee.impl.ViewRiksdagenVoteDataBallotPartySummaryDaily
import com.hack23.cia.model.internal.application.data.committee.impl.ViewRiksdagenVoteDataBallotPartySummaryMonthly
import com.hack23.cia.model.internal.application.data.committee.impl.ViewRiksdagenVoteDataBallotPartySummaryAnnual
import com.hack23.cia.service.api.action.kpi.Status
import com.hack23.cia.service.impl.rules.PartyComplianceCheckImpl
import com.hack23.cia.service.api.action.kpi.ComplianceCheck

rule "We have an active Party with no government experience"
dialect "java"
when
$p : PartyComplianceCheckImpl( party.active == true && party.totalDaysServedGovernment == 0 )
$p : PartyComplianceCheckImpl( party.active == true && party.party != "-" && party.totalDaysServedGovernment == 0 )
then
$p.addViolation( Status.MINOR, "PartyNoGovernmentExperience","Experience", kcontext.getRule().getName());
end
38 changes: 38 additions & 0 deletions service.impl/src/main/resources/rules/party/PartyNoOpinion.drl
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.hack23.cia.service.impl.rules

import org.kie.api.runtime.KieRuntime

import com.hack23.cia.model.internal.application.data.party.impl.ViewRiksdagenPartySummary
import com.hack23.cia.model.internal.application.data.committee.impl.ViewRiksdagenVoteDataBallotPartySummaryDaily
import com.hack23.cia.model.internal.application.data.committee.impl.ViewRiksdagenVoteDataBallotPartySummaryMonthly
import com.hack23.cia.model.internal.application.data.committee.impl.ViewRiksdagenVoteDataBallotPartySummaryAnnual
import com.hack23.cia.service.api.action.kpi.Status
import com.hack23.cia.service.impl.rules.PartyComplianceCheckImpl
import com.hack23.cia.service.api.action.kpi.ComplianceCheck

rule "We have a party with no opinion, abstain 10 % last day of ballots in parliament"
dialect "java"
salience 10
when
$p : PartyComplianceCheckImpl(party.activeParliament == true && party.party != "-" && dailySummary != null && dailySummary.partyPercentageAbstain >= 10)
then
$p.addViolation( Status.MINOR, "PartyNoOpinion","Behavior", kcontext.getRule().getName());
end

rule "We have a party with no opinion, abstain more than 10 % of ballots last month"
dialect "java"
salience 50
when
$p : PartyComplianceCheckImpl( party.activeParliament == true && party.party != "-" && monthlySummary != null && monthlySummary.partyPercentageAbstain >= 10)
then
$p.addViolation( Status.MAJOR, "PartyNoOpinion","Behavior", kcontext.getRule().getName());
end

rule "We have a party with no opinion, abstain more than 10 % of ballots last year"
dialect "java"
salience 100
when
$p : PartyComplianceCheckImpl( party.activeParliament == true && party.party != "-" && annualSummary != null && annualSummary.partyPercentageAbstain >= 10)
then
$p.addViolation( Status.CRITICAL, "PartyNoOpinion","Behavior", kcontext.getRule().getName());
end

0 comments on commit 23fde97

Please sign in to comment.