Skip to content
This repository has been archived by the owner on Jan 20, 2022. It is now read-only.

Commit

Permalink
Scorecards: Changes to keep in sync with drools-pmml changes and othe…
Browse files Browse the repository at this point in the history
…r code refactorings
  • Loading branch information
vinodkiran committed Oct 17, 2012
1 parent 9415e92 commit 4130a34
Show file tree
Hide file tree
Showing 21 changed files with 271 additions and 94 deletions.
2 changes: 1 addition & 1 deletion drools-scorecards/pom.xml
Expand Up @@ -130,7 +130,7 @@
</executions>
<configuration>
<outputDirectory>${basedir}/target/generated-sources/java</outputDirectory>
<packageName>org.dmg.pmml_4_1</packageName>
<packageName>org.dmg.pmml.pmml_4_1.descr</packageName>
<schemaDirectory>${basedir}/src/main/resources/org/dmg/pmml</schemaDirectory>
<bindingDirectory>${basedir}/src/main/resources/org/dmg/pmml</bindingDirectory>
<extension>true</extension>
Expand Down
Expand Up @@ -16,17 +16,7 @@

package org.drools.scorecards;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.StringWriter;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

import org.dmg.pmml_4_1.PMML;
import org.dmg.pmml.pmml_4_1.descr.PMML;
import org.drools.scorecards.drl.DeclaredTypesDRLEmitter;
import org.drools.scorecards.drl.ExternalModelDRLEmitter;
import org.drools.scorecards.parser.AbstractScorecardParser;
Expand All @@ -35,6 +25,12 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.io.*;
import java.util.List;

public class ScorecardCompiler {

private PMML pmmlDocument = null;
Expand Down
Expand Up @@ -15,7 +15,7 @@
*/
package org.drools.scorecards.drl;

import org.dmg.pmml_4_1.*;
import org.dmg.pmml.pmml_4_1.descr.*;
import org.drools.core.util.StringUtils;
import org.drools.scorecards.parser.xls.XLSKeywords;
import org.drools.scorecards.pmml.PMMLExtensionNames;
Expand Down Expand Up @@ -138,9 +138,9 @@ protected List<Rule> createRuleList(PMML pmmlDocument) {
Scorecard scorecard = (Scorecard) obj;
Characteristics characteristics = getCharacteristicsFromScorecard(scorecard);
createInitialRule(ruleList, scorecard);
for (org.dmg.pmml_4_1.Characteristic c : characteristics.getCharacteristics()) {
for (org.dmg.pmml.pmml_4_1.descr.Characteristic c : characteristics.getCharacteristics()) {
int attributePosition = 0;
for (org.dmg.pmml_4_1.Attribute scoreAttribute : c.getAttributes()) {
for (org.dmg.pmml.pmml_4_1.descr.Attribute scoreAttribute : c.getAttributes()) {
String name = formRuleName(pmmlDocument, scorecard.getModelName().replaceAll(" ",""), c, scoreAttribute);
Rule rule = new Rule(name, 99, 1);
String desc = ScorecardPMMLUtils.getExtensionValue(scoreAttribute.getExtensions(), "description");
Expand Down Expand Up @@ -195,9 +195,10 @@ protected void createInitialRule(List<Rule> ruleList, Scorecard scorecard) {
if (scorecard.getReasonCodeAlgorithm() != null) {
Consequence consequence = new Consequence();
if ("pointsAbove".equalsIgnoreCase(scorecard.getReasonCodeAlgorithm())) {
consequence.setSnippet("$sc.setReasonCodeAlgorithm(DroolsScorecard.REASON_CODE_ALGORITHM_POINTSABOVE);");
//TODO: ReasonCode Algorithm
consequence.setSnippet("//$sc.setReasonCodeAlgorithm(DroolsScorecard.REASON_CODE_ALGORITHM_POINTSABOVE);");
} else if ("pointsBelow".equalsIgnoreCase(scorecard.getReasonCodeAlgorithm())) {
consequence.setSnippet("$sc.setReasonCodeAlgorithm(DroolsScorecard.REASON_CODE_ALGORITHM_POINTSBELOW);");
consequence.setSnippet("//$sc.setReasonCodeAlgorithm(DroolsScorecard.REASON_CODE_ALGORITHM_POINTSBELOW);");
}
rule.addConsequence(consequence);
}
Expand Down Expand Up @@ -260,7 +261,7 @@ protected void createFieldRestriction(PMML pmmlDocument, Characteristic c, Attri
} else if (PMMLOperators.NOT_EQUAL.equalsIgnoreCase(operator)) {
stringBuilder.append(" <> ");
} else if (PMMLOperators.EQUAL.equalsIgnoreCase(operator)) {
stringBuilder.append(" = ");
stringBuilder.append(" == ");
} else if (PMMLOperators.GREATER_OR_EQUAL.equalsIgnoreCase(operator)) {
stringBuilder.append(" >= ");
} else if (PMMLOperators.LESS_OR_EQUAL.equalsIgnoreCase(operator)) {
Expand All @@ -287,7 +288,7 @@ protected void createFieldRestriction(PMML pmmlDocument, Characteristic c, Attri
} else if (PMMLOperators.NOT_EQUAL.equalsIgnoreCase(operator)) {
stringBuilder.append(" <> ");
} else if (PMMLOperators.EQUAL.equalsIgnoreCase(operator)) {
stringBuilder.append(" = ");
stringBuilder.append(" == ");
} else if (PMMLOperators.GREATER_OR_EQUAL.equalsIgnoreCase(operator)) {
stringBuilder.append(" >= ");
} else if (PMMLOperators.LESS_OR_EQUAL.equalsIgnoreCase(operator)) {
Expand Down
Expand Up @@ -16,7 +16,7 @@

package org.drools.scorecards.drl;

import org.dmg.pmml_4_1.*;
import org.dmg.pmml.pmml_4_1.descr.*;
import org.drools.scorecards.parser.xls.XLSKeywords;
import org.drools.scorecards.pmml.ScorecardPMMLUtils;
import org.drools.template.model.Condition;
Expand All @@ -30,7 +30,7 @@ public class DeclaredTypesDRLEmitter extends AbstractDRLEmitter{

protected void addDeclaredTypeContents(PMML pmmlDocument, StringBuilder stringBuilder, Scorecard scorecard) {
Characteristics characteristics = getCharacteristicsFromScorecard(scorecard);
for (org.dmg.pmml_4_1.Characteristic c : characteristics.getCharacteristics()) {
for (org.dmg.pmml.pmml_4_1.descr.Characteristic c : characteristics.getCharacteristics()) {
String field = ScorecardPMMLUtils.extractFieldNameFromCharacteristic(c);
String dataType = ScorecardPMMLUtils.getDataType(pmmlDocument, field);
//String dataType = ScorecardPMMLUtils.getExtensionValue(c.getExtensions(), PMMLExtensionNames.CHARACTERTISTIC_DATATYPE);
Expand Down
Expand Up @@ -16,7 +16,7 @@

package org.drools.scorecards.drl;

import org.dmg.pmml_4_1.*;
import org.dmg.pmml.pmml_4_1.descr.*;
import org.drools.scorecards.pmml.PMMLExtensionNames;
import org.drools.scorecards.pmml.ScorecardPMMLUtils;
import org.drools.template.model.Condition;
Expand Down Expand Up @@ -67,11 +67,68 @@ protected void addLHSConditions(Rule rule, PMML pmmlDocument, Scorecard scorecar

@Override
protected void addAdditionalReasonCodeConsequence(Rule rule, Scorecard scorecard) {
if (!scorecard.isUseReasonCodes()) {
return;
}
String externalClassName = null;
String reasonCodesField = null;
String fieldName = null;

for (Object obj :scorecard.getExtensionsAndCharacteristicsAndMiningSchemas()){
if ( obj instanceof Output) {
Output output = (Output)obj;
final List<OutputField> outputFields = output.getOutputFields();
final OutputField outputField = outputFields.get(0);
externalClassName = ScorecardPMMLUtils.getExtension(outputField.getExtensions(), PMMLExtensionNames.SCORECARD_RESULTANT_SCORE_CLASS).getValue();
fieldName = outputField.getName();
Extension e = ScorecardPMMLUtils.getExtension(outputField.getExtensions(), PMMLExtensionNames.SCORECARD_RESULTANT_REASONCODES_FIELD);
if (e != null) {
reasonCodesField = e.getValue();
}
break;
}
}
if ( reasonCodesField != null && externalClassName != null && fieldName != null) {
Consequence consequence = new Consequence();
StringBuilder stringBuilder = new StringBuilder("$");
stringBuilder.append(fieldName).append("Var").append(".set").append(Character.toUpperCase(reasonCodesField.charAt(0))).append(reasonCodesField.substring(1));
stringBuilder.append("($reasons);");
consequence.setSnippet(stringBuilder.toString());
rule.addConsequence(consequence);
}

}

@Override
protected void addAdditionalReasonCodeCondition(Rule rule, Scorecard scorecard) {
if (!scorecard.isUseReasonCodes()) {
return;
}
String externalClassName = null;
String reasonCodesField = null;
String fieldName = null;

for (Object obj :scorecard.getExtensionsAndCharacteristicsAndMiningSchemas()){
if ( obj instanceof Output) {
Output output = (Output)obj;
final List<OutputField> outputFields = output.getOutputFields();
final OutputField outputField = outputFields.get(0);
externalClassName = ScorecardPMMLUtils.getExtension(outputField.getExtensions(), PMMLExtensionNames.SCORECARD_RESULTANT_SCORE_CLASS).getValue();
fieldName = outputField.getName();
Extension e = ScorecardPMMLUtils.getExtension(outputField.getExtensions(), PMMLExtensionNames.SCORECARD_RESULTANT_REASONCODES_FIELD);
if (e != null) {
reasonCodesField = e.getValue();
}
break;
}
}
if ( reasonCodesField != null && externalClassName != null && fieldName != null) {
Condition condition = new Condition();
StringBuilder stringBuilder = new StringBuilder("$");
stringBuilder.append(fieldName).append("Var : ").append(externalClassName).append("()");
condition.setSnippet(stringBuilder.toString());
rule.addCondition(condition);
}

}

Expand Down
Expand Up @@ -16,12 +16,12 @@

package org.drools.scorecards.parser;

import org.dmg.pmml.pmml_4_1.descr.PMML;
import org.drools.scorecards.ScorecardError;

import java.io.InputStream;
import java.util.List;

import org.dmg.pmml_4_1.PMML;
import org.drools.scorecards.ScorecardError;

public abstract class AbstractScorecardParser {

public abstract List<ScorecardError> parseFile(InputStream inStream, String worksheetName) throws ScorecardParseException;
Expand Down
Expand Up @@ -16,18 +16,18 @@

package org.drools.scorecards.parser.xls;

import java.util.List;

import org.dmg.pmml_4_1.Attribute;
import org.dmg.pmml_4_1.Characteristic;
import org.dmg.pmml_4_1.Characteristics;
import org.dmg.pmml_4_1.Scorecard;
import org.dmg.pmml.pmml_4_1.descr.Attribute;
import org.dmg.pmml.pmml_4_1.descr.Characteristic;
import org.dmg.pmml.pmml_4_1.descr.Characteristics;
import org.dmg.pmml.pmml_4_1.descr.Scorecard;
import org.drools.core.util.StringUtils;
import org.drools.scorecards.ScorecardError;
import org.drools.scorecards.StringUtil;
import org.drools.scorecards.pmml.PMMLExtensionNames;
import org.drools.scorecards.pmml.ScorecardPMMLUtils;

import java.util.List;

class ExcelScorecardValidator {

private Scorecard scorecard;
Expand Down
Expand Up @@ -16,28 +16,19 @@

package org.drools.scorecards.parser.xls;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.poi.hssf.util.CellReference;
import org.dmg.pmml_4_1.Attribute;
import org.dmg.pmml_4_1.Characteristic;
import org.dmg.pmml_4_1.Characteristics;
import org.dmg.pmml_4_1.Extension;
import org.dmg.pmml_4_1.FIELDUSAGETYPE;
import org.dmg.pmml_4_1.INVALIDVALUETREATMENTMETHOD;
import org.dmg.pmml_4_1.MiningField;
import org.dmg.pmml_4_1.MiningSchema;
import org.dmg.pmml_4_1.Output;
import org.dmg.pmml_4_1.Scorecard;
import org.dmg.pmml.pmml_4_1.descr.*;
import org.drools.core.util.StringUtils;
import org.drools.scorecards.ScorecardError;
import org.drools.scorecards.parser.ScorecardParseException;
import org.drools.scorecards.pmml.PMMLExtensionNames;
import org.drools.scorecards.pmml.ScorecardPMMLUtils;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

class XLSEventDataCollector {

private List<DataExpectation> expectations = new ArrayList<DataExpectation>();
Expand Down Expand Up @@ -151,6 +142,12 @@ private void setAdditionalExpectation(int currentRowCtr, int currentColCtr, Stri
scorecard.getExtensionsAndCharacteristicsAndMiningSchemas().add(extension);
addExpectation(currentRowCtr, currentColCtr + 1, "value", extension, null);

} else if (XLSKeywords.SCORECARD_RESULTANT_REASONCODES_FIELD.equalsIgnoreCase(stringCellValue)) {
Extension extension = new Extension();
extension.setName(PMMLExtensionNames.SCORECARD_RESULTANT_REASONCODES_FIELD);
scorecard.getExtensionsAndCharacteristicsAndMiningSchemas().add(extension);
addExpectation(currentRowCtr, currentColCtr + 1, "value", extension, null);

} else if (XLSKeywords.SCORECARD_BASE_SCORE.equalsIgnoreCase(stringCellValue)) {
addExpectation(currentRowCtr, currentColCtr + 1, "initialScore", scorecard, null);

Expand Down
Expand Up @@ -21,6 +21,7 @@ public interface XLSKeywords {
public static final String SCORECARD_NAME = "Scorecard Name";
public static final String SCORECARD_RESULTANT_SCORE_CLASS = "Resultant Score Class";
public static final String SCORECARD_RESULTANT_SCORE_FIELD = "Resultant Score Field";
public static final String SCORECARD_RESULTANT_REASONCODES_FIELD = "Resultant Reasoncodes Field";
public static final String SCORECARD_CHARACTERISTIC_EXTERNAL_CLASS = "Full Class Name";

public static final String SCORECARD_BASE_SCORE = "Initial Score";
Expand Down
Expand Up @@ -15,25 +15,25 @@
*/
package org.drools.scorecards.parser.xls;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.util.CellRangeAddress;
import org.dmg.pmml_4_1.PMML;
import org.dmg.pmml_4_1.Scorecard;
import org.dmg.pmml.pmml_4_1.descr.PMML;
import org.dmg.pmml.pmml_4_1.descr.Scorecard;
import org.drools.scorecards.ScorecardError;
import org.drools.scorecards.parser.AbstractScorecardParser;
import org.drools.scorecards.parser.ScorecardParseException;
import org.drools.scorecards.pmml.PMMLGenerator;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class XLSScorecardParser extends AbstractScorecardParser {

protected XLSEventDataCollector excelDataCollector;
Expand Down
Expand Up @@ -22,11 +22,15 @@ public class PMMLExtensionNames {

public static final String SCORECARD_CELL_REF = "cellRef";
public static final String SCORECARD_RESULTANT_SCORE_FIELD = "final";
public static final String SCORECARD_RESULTANT_REASONCODES_FIELD = "reasonCodeField";
public static final String SCORECARD_RESULTANT_SCORE_CLASS = "externalClass";
public static final String SCORECARD_IMPORTS = "importsFromDelimitedString";

public static final String CHARACTERTISTIC_EXTERNAL_CLASS = "externalClass";
public static final String CHARACTERTISTIC_FACTTYPE = "factType";
public static final String CHARACTERTISTIC_FIELD = "field";
public static final String CHARACTERTISTIC_DATATYPE = "dataType";

public static final String DEFAULT_PREDICTED_FIELD = "scorecard__calculatedScore";

}

0 comments on commit 4130a34

Please sign in to comment.