/* * Copyright 2010 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package org.drools.workbench.models.guided.dtable.backend; import java.util.ArrayList; import java.util.List; import org.drools.workbench.models.commons.backend.rule.RuleModelDRLPersistenceImpl; import org.drools.workbench.models.datamodel.imports.Import; import org.drools.workbench.models.datamodel.oracle.DataType; import org.drools.workbench.models.datamodel.rule.ActionExecuteWorkItem; import org.drools.workbench.models.datamodel.rule.ActionFieldValue; import org.drools.workbench.models.datamodel.rule.ActionInsertFact; import org.drools.workbench.models.datamodel.rule.ActionRetractFact; import org.drools.workbench.models.datamodel.rule.ActionSetField; import org.drools.workbench.models.datamodel.rule.ActionWorkItemFieldValue; import org.drools.workbench.models.datamodel.rule.BaseSingleFieldConstraint; import org.drools.workbench.models.datamodel.rule.FactPattern; import org.drools.workbench.models.datamodel.rule.FreeFormLine; import org.drools.workbench.models.datamodel.rule.IAction; import org.drools.workbench.models.datamodel.rule.IPattern; import org.drools.workbench.models.datamodel.rule.RuleAttribute; import org.drools.workbench.models.datamodel.rule.RuleMetadata; import org.drools.workbench.models.datamodel.rule.RuleModel; import org.drools.workbench.models.datamodel.rule.SingleFieldConstraint; import org.drools.workbench.models.datamodel.workitems.PortableBooleanParameterDefinition; import org.drools.workbench.models.datamodel.workitems.PortableFloatParameterDefinition; import org.drools.workbench.models.datamodel.workitems.PortableIntegerParameterDefinition; import org.drools.workbench.models.datamodel.workitems.PortableStringParameterDefinition; import org.drools.workbench.models.datamodel.workitems.PortableWorkDefinition; import org.drools.workbench.models.guided.dtable.backend.util.DataUtilities; import org.drools.workbench.models.guided.dtable.backend.util.GuidedDTTemplateDataProvider; import org.drools.workbench.models.guided.dtable.backend.util.TemplateDataProvider; import org.drools.workbench.models.guided.dtable.shared.model.ActionCol52; import org.drools.workbench.models.guided.dtable.shared.model.ActionInsertFactCol52; import org.drools.workbench.models.guided.dtable.shared.model.ActionRetractFactCol52; import org.drools.workbench.models.guided.dtable.shared.model.ActionSetFieldCol52; import org.drools.workbench.models.guided.dtable.shared.model.ActionWorkItemCol52; import org.drools.workbench.models.guided.dtable.shared.model.ActionWorkItemInsertFactCol52; import org.drools.workbench.models.guided.dtable.shared.model.ActionWorkItemSetFieldCol52; import org.drools.workbench.models.guided.dtable.shared.model.AttributeCol52; import org.drools.workbench.models.guided.dtable.shared.model.BRLActionColumn; import org.drools.workbench.models.guided.dtable.shared.model.BRLActionVariableColumn; import org.drools.workbench.models.guided.dtable.shared.model.BRLConditionColumn; import org.drools.workbench.models.guided.dtable.shared.model.BRLConditionVariableColumn; import org.drools.workbench.models.guided.dtable.shared.model.BaseColumn; import org.drools.workbench.models.guided.dtable.shared.model.CompositeColumn; import org.drools.workbench.models.guided.dtable.shared.model.ConditionCol52; import org.drools.workbench.models.guided.dtable.shared.model.DTCellValue52; import org.drools.workbench.models.guided.dtable.shared.model.DescriptionCol52; import org.drools.workbench.models.guided.dtable.shared.model.GuidedDecisionTable52; import org.drools.workbench.models.guided.dtable.shared.model.LimitedEntryActionInsertFactCol52; import org.drools.workbench.models.guided.dtable.shared.model.LimitedEntryActionSetFieldCol52; import org.drools.workbench.models.guided.dtable.shared.model.LimitedEntryConditionCol52; import org.drools.workbench.models.guided.dtable.shared.model.MetadataCol52; import org.drools.workbench.models.guided.dtable.shared.model.Pattern52; import org.drools.workbench.models.guided.dtable.shared.model.RowNumberCol52; import org.junit.Test; import static org.junit.Assert.*; public class GuidedDTDRLPersistenceTest { @Test public void testInWithSimpleSingleLiteralValue() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableName("in_operator"); Pattern52 p1 = new Pattern52(); p1.setFactType("Person"); ConditionCol52 con = new ConditionCol52(); con.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); con.setFieldType(DataType.TYPE_STRING); con.setFactField("field1"); con.setHeader("Person field1"); con.setOperator("in"); p1.getChildColumns().add(con); dt.getConditions().add(p1); dt.setData(DataUtilities.makeDataLists(new String[][]{ new String[]{"1", "desc1", "ak1,mk1"}, new String[]{"2", "desc2", "(ak2,mk2)"}, new String[]{"3", "desc3", "( ak3, mk3 )"}, new String[]{"4", "desc4", "( \"ak4\", \"mk4\" )"}, new String[]{"5", "desc5", "( \"ak5 \", \" mk5\" )"}, })); GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dt); String expected = "//from row number: 1\n" + "//desc1\n" + "rule \"Row 1 in_operator\"\n" + "dialect \"mvel\"\n" + "when\n" + " Person( field1 in ( \"ak1\", \"mk1\" ) )\n" + "then\n" + "end\n" + "//from row number: 2\n" + "//desc2\n" + "rule \"Row 2 in_operator\"\n" + "dialect \"mvel\"\n" + "when\n" + " Person( field1 in ( \"ak2\", \"mk2\" ) )\n" + "then\n" + "end\n" + "//from row number: 3\n" + "//desc3\n" + "rule \"Row 3 in_operator\"\n" + "dialect \"mvel\"\n" + "when\n" + " Person( field1 in ( \"ak3\", \"mk3\" ) )\n" + "then\n" + "end\n" + "//from row number: 4\n" + "//desc4\n" + "rule \"Row 4 in_operator\"\n" + "dialect \"mvel\"\n" + "when\n" + " Person( field1 in ( \"ak4\", \"mk4\" ) )\n" + "then\n" + "end\n" + "//from row number: 5\n" + "//desc5\n" + "rule \"Row 5 in_operator\"\n" + "dialect \"mvel\"\n" + "when\n" + " Person( field1 in ( \"ak5 \", \" mk5\" ) )\n" + "then\n" + "end"; assertEqualsIgnoreWhitespace(expected, drl); } @Test public void test2Rules() throws Exception { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableName("michael"); AttributeCol52 attr = new AttributeCol52(); attr.setAttribute("salience"); attr.setDefaultValue(new DTCellValue52("66")); dt.getAttributeCols().add(attr); Pattern52 p1 = new Pattern52(); p1.setBoundName("f1"); p1.setFactType("Driver"); ConditionCol52 con = new ConditionCol52(); con.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); con.setFactField("age"); con.setHeader("Driver f1 age"); con.setOperator("=="); p1.getChildColumns().add(con); ConditionCol52 con2 = new ConditionCol52(); con2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); con2.setFactField("name"); con2.setHeader("Driver f1 name"); con2.setOperator("=="); p1.getChildColumns().add(con2); ConditionCol52 con3 = new ConditionCol52(); con3.setConstraintValueType(BaseSingleFieldConstraint.TYPE_RET_VALUE); con3.setFactField("rating"); con3.setHeader("Driver rating"); con3.setOperator("=="); p1.getChildColumns().add(con3); dt.getConditions().add(p1); Pattern52 p2 = new Pattern52(); p2.setBoundName("f2"); p2.setFactType("Driver"); ConditionCol52 con4 = new ConditionCol52(); con4.setConstraintValueType(BaseSingleFieldConstraint.TYPE_PREDICATE); con4.setHeader("Driver 2 pimp"); con4.setFactField("(not needed)"); p2.getChildColumns().add(con4); dt.getConditions().add(p2); ActionInsertFactCol52 ins = new ActionInsertFactCol52(); ins.setBoundName("ins"); ins.setFactType("Cheese"); ins.setFactField("price"); ins.setType(DataType.TYPE_NUMERIC_INTEGER); dt.getActionCols().add(ins); ActionRetractFactCol52 ret = new ActionRetractFactCol52(); dt.getActionCols().add(ret); ActionSetFieldCol52 set = new ActionSetFieldCol52(); set.setBoundName("f1"); set.setFactField("goo1"); set.setType(DataType.TYPE_STRING); dt.getActionCols().add(set); ActionSetFieldCol52 set2 = new ActionSetFieldCol52(); set2.setBoundName("f1"); set2.setFactField("goo2"); set2.setDefaultValue(new DTCellValue52("whee")); set2.setType(DataType.TYPE_STRING); dt.getActionCols().add(set2); dt.setData(DataUtilities.makeDataLists(new String[][]{ new String[]{"1", "desc", "42", "33", "michael", "age * 0.2", "age > 7", "6.60", "true", "gooVal1", "f2"}, new String[]{"2", "desc", "66", "39", "bob", "age * 0.3", "age > 7", "6.60", "", "gooVal1", "whee"} })); GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dt); assertTrue(drl.indexOf("from row number") > -1); assertTrue(drl.indexOf("rating == ( age * 0.2 )") > 0); assertTrue(drl.indexOf("f2 : Driver( eval( age > 7 ))") > 0); assertTrue(drl.indexOf("rating == ( age * 0.3 )") > drl.indexOf("rating == ( age * 0.2 )")); assertTrue(drl.indexOf("f1.setGoo2( \"whee\" )") > 0); assertTrue(drl.indexOf("salience 66") > 0); } @Test public void testAttribs() { GuidedDTDRLPersistence p = new GuidedDTDRLPersistence(); Object[] row = new Object[]{"1", "desc", "a", null}; List<BaseColumn> allColumns = new ArrayList<BaseColumn>(); allColumns.add(new RowNumberCol52()); allColumns.add(new DescriptionCol52()); List<AttributeCol52> attributeCols = new ArrayList<AttributeCol52>(); RuleModel rm = new RuleModel(); RuleAttribute[] orig = rm.attributes; p.doAttribs(allColumns, attributeCols, DataUtilities.makeDataRowList(row), rm); assertSame(orig, rm.attributes); AttributeCol52 col1 = new AttributeCol52(); col1.setAttribute("salience"); AttributeCol52 col2 = new AttributeCol52(); col2.setAttribute("agenda-group"); attributeCols.add(col1); attributeCols.add(col2); allColumns.addAll(attributeCols); p.doAttribs(allColumns, attributeCols, DataUtilities.makeDataRowList(row), rm); assertEquals(1, rm.attributes.length); assertEquals("salience", rm.attributes[0].getAttributeName()); assertEquals("a", rm.attributes[0].getValue()); row = new Object[]{"1", "desc", 1l, "b"}; p.doAttribs(allColumns, attributeCols, DataUtilities.makeDataRowList(row), rm); assertEquals(2, rm.attributes.length); assertEquals("salience", rm.attributes[0].getAttributeName()); assertEquals("1", rm.attributes[0].getValue()); assertEquals("agenda-group", rm.attributes[1].getAttributeName()); assertEquals("b", rm.attributes[1].getValue()); } @Test public void testCellCSV() { GuidedDTDRLPersistence p = new GuidedDTDRLPersistence(); assertEquals("(\"Michael\", \"Mark\", \"Peter\")", p.makeInList("Michael, Mark, Peter")); assertEquals("(\"Michael\")", p.makeInList("Michael")); assertEquals("(\"Michael\")", p.makeInList("\"Michael\"")); assertEquals("(\"Michael\", \"Ma rk\", \"Peter\")", p.makeInList("Michael, \"Ma rk\", Peter")); assertEquals("(WEE WAAH)", p.makeInList("(WEE WAAH)")); } @Test public void testConditionAndActionCellValue() { GuidedDTDRLPersistence p = new GuidedDTDRLPersistence(); assertFalse(p.validCell(null, DataType.DataTypes.NUMERIC)); assertFalse(p.validCell("", DataType.DataTypes.NUMERIC)); assertFalse(p.validCell(" ", DataType.DataTypes.NUMERIC)); assertFalse(p.validCell(null, DataType.DataTypes.STRING)); assertFalse(p.validCell("", DataType.DataTypes.STRING)); assertFalse(p.validCell(" ", DataType.DataTypes.STRING)); } @Test public void testAttributeCellValue() { GuidedDTDRLPersistence p = new GuidedDTDRLPersistence(); assertFalse(p.validateAttributeCell(null)); assertFalse(p.validateAttributeCell("")); assertFalse(p.validateAttributeCell(" ")); } @Test public void testMetadataCellValue() { GuidedDTDRLPersistence p = new GuidedDTDRLPersistence(); assertFalse(p.validateMetadataCell(null)); assertFalse(p.validateMetadataCell((""))); assertFalse(p.validateMetadataCell((" "))); } @Test public void testInOperator() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableName("michael"); AttributeCol52 attr = new AttributeCol52(); attr.setAttribute("salience"); attr.setDefaultValue(new DTCellValue52("66")); dt.getAttributeCols().add(attr); Pattern52 p1 = new Pattern52(); p1.setBoundName("f1"); p1.setFactType("Driver"); ConditionCol52 con = new ConditionCol52(); con.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); con.setFactField("age"); con.setHeader("Driver f1 age"); con.setOperator("=="); p1.getChildColumns().add(con); ConditionCol52 con2 = new ConditionCol52(); con2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); con2.setFactField("name"); con2.setHeader("Driver f1 name"); con2.setOperator("in"); p1.getChildColumns().add(con2); ConditionCol52 con3 = new ConditionCol52(); con3.setConstraintValueType(BaseSingleFieldConstraint.TYPE_RET_VALUE); con3.setFactField("rating"); con3.setHeader("Driver rating"); con3.setOperator("=="); p1.getChildColumns().add(con3); ConditionCol52 con4 = new ConditionCol52(); con4.setConstraintValueType(BaseSingleFieldConstraint.TYPE_PREDICATE); con4.setHeader("Driver 2 pimp"); con4.setFactField("(not needed)"); p1.getChildColumns().add(con4); dt.getConditions().add(p1); ActionInsertFactCol52 ins = new ActionInsertFactCol52(); ins.setBoundName("ins"); ins.setFactType("Cheese"); ins.setFactField("price"); ins.setType(DataType.TYPE_NUMERIC_INTEGER); dt.getActionCols().add(ins); ActionRetractFactCol52 ret = new ActionRetractFactCol52(); dt.getActionCols().add(ret); ActionSetFieldCol52 set = new ActionSetFieldCol52(); set.setBoundName("f1"); set.setFactField("goo1"); set.setType(DataType.TYPE_STRING); dt.getActionCols().add(set); ActionSetFieldCol52 set2 = new ActionSetFieldCol52(); set2.setBoundName("f1"); set2.setFactField("goo2"); set2.setDefaultValue(new DTCellValue52("whee")); set2.setType(DataType.TYPE_STRING); dt.getActionCols().add(set2); dt.setData(DataUtilities.makeDataLists(new String[][]{ new String[]{"1", "desc", "42", "33", "michael, manik", "age * 0.2", "age > 7", "6.60", "true", "gooVal1", "f2"}, new String[]{"2", "desc", "", "39", "bob, frank", "age * 0.3", "age > 7", "6.60", "", "gooVal1", null} })); GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dt); assertTrue(drl.indexOf("name in ( \"michael\",") > 0); } @Test public void testInterpolate() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableName("michael"); AttributeCol52 attr = new AttributeCol52(); attr.setAttribute("salience"); attr.setDefaultValue(new DTCellValue52("66")); dt.getAttributeCols().add(attr); Pattern52 p1 = new Pattern52(); p1.setBoundName("f1"); p1.setFactType("Driver"); ConditionCol52 con = new ConditionCol52(); con.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); con.setFactField("age"); con.setHeader("Driver f1 age"); con.setOperator("=="); p1.getChildColumns().add(con); ConditionCol52 con2 = new ConditionCol52(); con2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); con2.setFactField("name"); con2.setHeader("Driver f1 name"); con2.setOperator("=="); p1.getChildColumns().add(con2); ConditionCol52 con3 = new ConditionCol52(); con3.setConstraintValueType(BaseSingleFieldConstraint.TYPE_RET_VALUE); con3.setFactField("rating"); con3.setHeader("Driver rating"); con3.setOperator("=="); p1.getChildColumns().add(con3); dt.getConditions().add(p1); Pattern52 p2 = new Pattern52(); p2.setBoundName("f2"); p2.setFactType("Driver"); ConditionCol52 con4 = new ConditionCol52(); con4.setConstraintValueType(BaseSingleFieldConstraint.TYPE_PREDICATE); con4.setHeader("Driver 2 pimp"); con4.setFactField("this.hasSomething($param)"); p2.getChildColumns().add(con4); dt.getConditions().add(p2); ActionInsertFactCol52 ins = new ActionInsertFactCol52(); ins.setBoundName("ins"); ins.setFactType("Cheese"); ins.setFactField("price"); ins.setType(DataType.TYPE_NUMERIC_INTEGER); dt.getActionCols().add(ins); ActionRetractFactCol52 ret = new ActionRetractFactCol52(); dt.getActionCols().add(ret); ActionSetFieldCol52 set = new ActionSetFieldCol52(); set.setBoundName("f1"); set.setFactField("goo1"); set.setType(DataType.TYPE_STRING); dt.getActionCols().add(set); ActionSetFieldCol52 set2 = new ActionSetFieldCol52(); set2.setBoundName("f1"); set2.setFactField("goo2"); set2.setDefaultValue(new DTCellValue52("whee")); set2.setType(DataType.TYPE_STRING); dt.getActionCols().add(set2); dt.setData(DataUtilities.makeDataLists(new String[][]{ new String[]{"1", "desc", "42", "33", "michael", "age * 0.2", "BAM", "6.60", "true", "gooVal1", "f2"}, new String[]{"2", "desc", "66", "39", "bob", "age * 0.3", "BAM", "6.60", "", "gooVal1", "whee"} })); GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dt); assertTrue(drl.indexOf("from row number") > -1); assertTrue(drl.indexOf("rating == ( age * 0.2 )") > 0); assertTrue(drl.indexOf("f2 : Driver( eval( this.hasSomething(BAM) ))") > 0); assertTrue(drl.indexOf("rating == ( age * 0.3 )") > drl.indexOf("rating == ( age * 0.2 )")); assertTrue(drl.indexOf("f1.setGoo2( \"whee\" )") > 0); assertTrue(drl.indexOf("salience 66") > 0); } @Test public void testLHS() { GuidedDTDRLPersistence p = new GuidedDTDRLPersistence(); String[] row = new String[]{"1", "desc", "a", "mike", "33 + 1", "age > 6", "stilton"}; String[][] data = new String[1][]; data[0] = row; List<BaseColumn> allColumns = new ArrayList<BaseColumn>(); List<CompositeColumn<? extends BaseColumn>> allPatterns = new ArrayList<CompositeColumn<? extends BaseColumn>>(); allColumns.add(new RowNumberCol52()); allColumns.add(new DescriptionCol52()); allColumns.add(new MetadataCol52()); Pattern52 p1 = new Pattern52(); p1.setBoundName("p1"); p1.setFactType("Person"); allPatterns.add(p1); ConditionCol52 col = new ConditionCol52(); col.setFactField("name"); col.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); col.setOperator("=="); p1.getChildColumns().add(col); allColumns.add(col); ConditionCol52 col2 = new ConditionCol52(); col2.setFactField("age"); col2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_RET_VALUE); col2.setOperator("<"); p1.getChildColumns().add(col2); allColumns.add(col2); ConditionCol52 col3 = new ConditionCol52(); col3.setConstraintValueType(BaseSingleFieldConstraint.TYPE_PREDICATE); p1.getChildColumns().add(col3); allColumns.add(col3); Pattern52 p2 = new Pattern52(); p2.setBoundName("c"); p2.setFactType("Cheese"); allPatterns.add(p2); ConditionCol52 col4 = new ConditionCol52(); col4.setFactField("type"); col4.setOperator("=="); col4.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); p2.getChildColumns().add(col4); allColumns.add(col4); RuleModel rm = new RuleModel(); List<DTCellValue52> rowData = DataUtilities.makeDataRowList(row); TemplateDataProvider rowDataProvider = new GuidedDTTemplateDataProvider(allColumns, rowData); p.doConditions(allColumns, allPatterns, rowDataProvider, rowData, DataUtilities.makeDataLists(data), rm); assertEquals(2, rm.lhs.length); assertEquals("Person", ((FactPattern) rm.lhs[0]).getFactType()); assertEquals("p1", ((FactPattern) rm.lhs[0]).getBoundName()); assertEquals("Cheese", ((FactPattern) rm.lhs[1]).getFactType()); assertEquals("c", ((FactPattern) rm.lhs[1]).getBoundName()); // examine the first pattern FactPattern person = (FactPattern) rm.lhs[0]; assertEquals(3, person.getConstraintList().getConstraints().length); SingleFieldConstraint cons = (SingleFieldConstraint) person.getConstraint(0); assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL, cons.getConstraintValueType()); assertEquals("name", cons.getFieldName()); assertEquals("==", cons.getOperator()); assertEquals("mike", cons.getValue()); cons = (SingleFieldConstraint) person.getConstraint(1); assertEquals(BaseSingleFieldConstraint.TYPE_RET_VALUE, cons.getConstraintValueType()); assertEquals("age", cons.getFieldName()); assertEquals("<", cons.getOperator()); assertEquals("33 + 1", cons.getValue()); cons = (SingleFieldConstraint) person.getConstraint(2); assertEquals(BaseSingleFieldConstraint.TYPE_PREDICATE, cons.getConstraintValueType()); assertEquals("age > 6", cons.getValue()); // examine the second pattern FactPattern cheese = (FactPattern) rm.lhs[1]; assertEquals(1, cheese.getConstraintList().getConstraints().length); cons = (SingleFieldConstraint) cheese.getConstraint(0); assertEquals("type", cons.getFieldName()); assertEquals("==", cons.getOperator()); assertEquals("stilton", cons.getValue()); assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL, cons.getConstraintValueType()); } @Test public void testLHSBindings() { GuidedDTDRLPersistence p = new GuidedDTDRLPersistence(); String[] row = new String[]{"1", "desc", "mike", "33 + 1", "age > 6"}; String[][] data = new String[1][]; data[0] = row; List<BaseColumn> allColumns = new ArrayList<BaseColumn>(); List<CompositeColumn<? extends BaseColumn>> allPatterns = new ArrayList<CompositeColumn<? extends BaseColumn>>(); allColumns.add(new RowNumberCol52()); allColumns.add(new DescriptionCol52()); Pattern52 p1 = new Pattern52(); p1.setBoundName("p1"); p1.setFactType("Person"); allPatterns.add(p1); ConditionCol52 col = new ConditionCol52(); col.setFactField("name"); col.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); col.setOperator("=="); col.setBinding("$name"); p1.getChildColumns().add(col); allColumns.add(col); ConditionCol52 col2 = new ConditionCol52(); col2.setFactField("age"); col2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_RET_VALUE); col2.setOperator("<"); col2.setBinding("$name"); p1.getChildColumns().add(col2); allColumns.add(col2); ConditionCol52 col3 = new ConditionCol52(); col3.setConstraintValueType(BaseSingleFieldConstraint.TYPE_PREDICATE); col3.setBinding("$name"); p1.getChildColumns().add(col3); allColumns.add(col3); List<DTCellValue52> rowData = DataUtilities.makeDataRowList(row); TemplateDataProvider rowDataProvider = new GuidedDTTemplateDataProvider(allColumns, rowData); RuleModel rm = new RuleModel(); p.doConditions(allColumns, allPatterns, rowDataProvider, rowData, DataUtilities.makeDataLists(data), rm); assertEquals(1, rm.lhs.length); assertEquals("Person", ((FactPattern) rm.lhs[0]).getFactType()); assertEquals("p1", ((FactPattern) rm.lhs[0]).getBoundName()); // examine the first pattern FactPattern person = (FactPattern) rm.lhs[0]; assertEquals(3, person.getConstraintList().getConstraints().length); SingleFieldConstraint cons = (SingleFieldConstraint) person.getConstraint(0); assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL, cons.getConstraintValueType()); assertEquals("name", cons.getFieldName()); assertEquals("==", cons.getOperator()); assertEquals("mike", cons.getValue()); assertEquals("$name", cons.getFieldBinding()); cons = (SingleFieldConstraint) person.getConstraint(1); assertEquals(BaseSingleFieldConstraint.TYPE_RET_VALUE, cons.getConstraintValueType()); assertEquals("age", cons.getFieldName()); assertEquals("<", cons.getOperator()); assertEquals("33 + 1", cons.getValue()); assertNull(cons.getFieldBinding()); cons = (SingleFieldConstraint) person.getConstraint(2); assertEquals(BaseSingleFieldConstraint.TYPE_PREDICATE, cons.getConstraintValueType()); assertEquals("age > 6", cons.getValue()); assertNull(cons.getFieldBinding()); } @Test public void testLHSNotPattern() { GuidedDTDRLPersistence p = new GuidedDTDRLPersistence(); String[] row = new String[]{"1", "desc", "a", "mike", "33 + 1", "age > 6", "stilton"}; String[][] data = new String[1][]; data[0] = row; List<BaseColumn> allColumns = new ArrayList<BaseColumn>(); List<CompositeColumn<? extends BaseColumn>> allPatterns = new ArrayList<CompositeColumn<? extends BaseColumn>>(); allColumns.add(new RowNumberCol52()); allColumns.add(new DescriptionCol52()); allColumns.add(new MetadataCol52()); Pattern52 p1 = new Pattern52(); p1.setNegated(true); p1.setBoundName("p1"); p1.setFactType("Person"); allPatterns.add(p1); ConditionCol52 col = new ConditionCol52(); col.setFactField("name"); col.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); col.setOperator("=="); p1.getChildColumns().add(col); allColumns.add(col); ConditionCol52 col2 = new ConditionCol52(); col2.setFactField("age"); col2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_RET_VALUE); col2.setOperator("<"); p1.getChildColumns().add(col2); allColumns.add(col2); ConditionCol52 col3 = new ConditionCol52(); col3.setConstraintValueType(BaseSingleFieldConstraint.TYPE_PREDICATE); p1.getChildColumns().add(col3); allColumns.add(col3); Pattern52 p2 = new Pattern52(); p2.setBoundName("c"); p2.setFactType("Cheese"); allPatterns.add(p2); ConditionCol52 col4 = new ConditionCol52(); col4.setFactField("type"); col4.setOperator("=="); col4.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); p2.getChildColumns().add(col4); allColumns.add(col4); List<DTCellValue52> rowData = DataUtilities.makeDataRowList(row); TemplateDataProvider rowDataProvider = new GuidedDTTemplateDataProvider(allColumns, rowData); RuleModel rm = new RuleModel(); p.doConditions(allColumns, allPatterns, rowDataProvider, rowData, DataUtilities.makeDataLists(data), rm); String drl = RuleModelDRLPersistenceImpl.getInstance().marshal(rm); assertEquals(2, rm.lhs.length); assertEquals("Person", ((FactPattern) rm.lhs[0]).getFactType()); assertEquals("p1", ((FactPattern) rm.lhs[0]).getBoundName()); assertEquals("Cheese", ((FactPattern) rm.lhs[1]).getFactType()); assertEquals("c", ((FactPattern) rm.lhs[1]).getBoundName()); // examine the first pattern FactPattern person = (FactPattern) rm.lhs[0]; assertEquals(3, person.getConstraintList().getConstraints().length); SingleFieldConstraint cons = (SingleFieldConstraint) person.getConstraint(0); assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL, cons.getConstraintValueType()); assertEquals("name", cons.getFieldName()); assertEquals("==", cons.getOperator()); assertEquals("mike", cons.getValue()); cons = (SingleFieldConstraint) person.getConstraint(1); assertEquals(BaseSingleFieldConstraint.TYPE_RET_VALUE, cons.getConstraintValueType()); assertEquals("age", cons.getFieldName()); assertEquals("<", cons.getOperator()); assertEquals("33 + 1", cons.getValue()); cons = (SingleFieldConstraint) person.getConstraint(2); assertEquals(BaseSingleFieldConstraint.TYPE_PREDICATE, cons.getConstraintValueType()); assertEquals("age > 6", cons.getValue()); assertEquals(person.isNegated(), true); assertTrue(drl.indexOf("not Person(") > 0); // examine the second pattern FactPattern cheese = (FactPattern) rm.lhs[1]; assertEquals(1, cheese.getConstraintList().getConstraints().length); cons = (SingleFieldConstraint) cheese.getConstraint(0); assertEquals("type", cons.getFieldName()); assertEquals("==", cons.getOperator()); assertEquals("stilton", cons.getValue()); assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL, cons.getConstraintValueType()); assertEquals(cheese.isNegated(), false); assertTrue(drl.indexOf("c : Cheese(") > 0); } @Test public void multipleLHSNotPatternInclusion() { GuidedDTDRLPersistence p = new GuidedDTDRLPersistence(); Object[] row = new Object[]{"1", "desc", "mike", true, true}; Object[][] data = new Object[1][]; data[0] = row; List<BaseColumn> allColumns = new ArrayList<>(); List<CompositeColumn<? extends BaseColumn>> allPatterns = new ArrayList<>(); allColumns.add(new RowNumberCol52()); allColumns.add(new DescriptionCol52()); Pattern52 p1 = new Pattern52(); p1.setBoundName("p1"); p1.setFactType("Person"); allPatterns.add(p1); ConditionCol52 p1col = new ConditionCol52(); p1col.setFactField("name"); p1col.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); p1col.setOperator("=="); p1.getChildColumns().add(p1col); allColumns.add(p1col); Pattern52 p2 = new Pattern52(); p2.setBoundName(""); p2.setNegated(true); p2.setFactType("Cheese"); allPatterns.add(p2); ConditionCol52 p2col = new ConditionCol52(); p2col.setFactField("this"); p2col.setOperator(""); p2col.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); p2.getChildColumns().add(p2col); allColumns.add(p2col); Pattern52 p3 = new Pattern52(); p3.setBoundName(""); p3.setNegated(true); p3.setFactType("Smurf"); allPatterns.add(p3); ConditionCol52 p3col = new ConditionCol52(); p3col.setFactField("this"); p3col.setOperator("!= null"); p3col.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); p3.getChildColumns().add(p3col); allColumns.add(p3col); List<DTCellValue52> rowData = DataUtilities.makeDataRowList(row); TemplateDataProvider rowDataProvider = new GuidedDTTemplateDataProvider(allColumns, rowData); RuleModel rm = new RuleModel(); rm.name = "r0"; p.doConditions(allColumns, allPatterns, rowDataProvider, rowData, DataUtilities.makeDataLists(data), rm); final String actualRuleModelDrl = RuleModelDRLPersistenceImpl.getInstance().marshal(rm); final String expectedRuleModelDrl = "rule \"r0\"\n" + " dialect \"mvel\"\n" + " when\n" + " p1 : Person( name == \"mike\" )\n" + " not Cheese()\n" + " not Smurf( this != null )\n" + " then\n" + "end\n"; assertEqualsIgnoreWhitespace(expectedRuleModelDrl, actualRuleModelDrl); final GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableName("dt"); dt.getConditions().add(p1); dt.getConditions().add(p2); dt.getConditions().add(p3); dt.getData().addAll(DataUtilities.makeDataLists(data)); final String actualDecisionTableDrl = GuidedDTDRLPersistence.getInstance().marshal(dt); final String expectedDecisionTableDrl = "//from row number: 1\n" + "//desc\n" + "rule \"Row1dt\"\n" + " dialect \"mvel\"\n" + " when\n" + " p1 : Person( name == \"mike\" )\n" + " not Cheese()\n" + " not Smurf( this != null )\n" + " then\n" + "end\n"; assertEqualsIgnoreWhitespace(expectedDecisionTableDrl, actualDecisionTableDrl); } @Test public void multipleConstraintLHSNotPatternInclusion() { GuidedDTDRLPersistence p = new GuidedDTDRLPersistence(); Object[] row = new Object[]{"1", "desc", "limburger", "strong"}; Object[][] data = new Object[1][]; data[0] = row; List<BaseColumn> allColumns = new ArrayList<>(); List<CompositeColumn<? extends BaseColumn>> allPatterns = new ArrayList<>(); allColumns.add(new RowNumberCol52()); allColumns.add(new DescriptionCol52()); Pattern52 p1 = new Pattern52(); p1.setBoundName(""); p1.setNegated(true); p1.setFactType("Cheese"); allPatterns.add(p1); ConditionCol52 p1col1 = new ConditionCol52(); p1col1.setFactField("name"); p1col1.setOperator("=="); p1col1.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); p1.getChildColumns().add(p1col1); allColumns.add(p1col1); ConditionCol52 p1col2 = new ConditionCol52(); p1col2.setFactField("smell"); p1col2.setOperator("=="); p1col2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); p1.getChildColumns().add(p1col2); allColumns.add(p1col2); List<DTCellValue52> rowData = DataUtilities.makeDataRowList(row); TemplateDataProvider rowDataProvider = new GuidedDTTemplateDataProvider(allColumns, rowData); RuleModel rm = new RuleModel(); rm.name = "r0"; p.doConditions(allColumns, allPatterns, rowDataProvider, rowData, DataUtilities.makeDataLists(data), rm); final String actualRuleModelDrl = RuleModelDRLPersistenceImpl.getInstance().marshal(rm); final String expectedRuleModelDrl = "rule \"r0\"\n" + " dialect \"mvel\"\n" + " when\n" + " not Cheese( name == \"limburger\", smell == \"strong\" )\n" + " then\n" + "end\n"; assertEqualsIgnoreWhitespace(expectedRuleModelDrl, actualRuleModelDrl); } @Test public void testLHSOtherwisePatternBoolean() { GuidedDTDRLPersistence p = new GuidedDTDRLPersistence(); String[][] row = new String[2][]; String[][] data = new String[2][]; row[0] = new String[]{"1", "desc1", "true", "false"}; List<DTCellValue52> rowDTModel0 = DataUtilities.makeDataRowList(row[0]); data[0] = row[0]; row[1] = new String[]{"3", "desc3", null, null}; List<DTCellValue52> rowDTModel1 = DataUtilities.makeDataRowList(row[1]); rowDTModel1.get(2).setOtherwise(true); rowDTModel1.get(3).setOtherwise(true); data[1] = row[1]; final List<List<DTCellValue52>> allDTData = new ArrayList<List<DTCellValue52>>() {{ add(rowDTModel0); add(rowDTModel1); }}; List<BaseColumn> allColumns = new ArrayList<BaseColumn>(); List<CompositeColumn<? extends BaseColumn>> allPatterns = new ArrayList<CompositeColumn<? extends BaseColumn>>(); allColumns.add(new RowNumberCol52()); allColumns.add(new DescriptionCol52()); Pattern52 p1 = new Pattern52(); p1.setBoundName("p1"); p1.setFactType("Person"); allPatterns.add(p1); ConditionCol52 col = new ConditionCol52(); col.setFactField("alive"); col.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); col.setFieldType(DataType.TYPE_BOOLEAN); col.setOperator("=="); p1.getChildColumns().add(col); allColumns.add(col); Pattern52 p2 = new Pattern52(); p2.setBoundName("p2"); p2.setFactType("Person"); allPatterns.add(p2); ConditionCol52 col2 = new ConditionCol52(); col2.setFactField("alive"); col2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); col2.setFieldType(DataType.TYPE_BOOLEAN); col2.setOperator("!="); p2.getChildColumns().add(col2); allColumns.add(col2); RuleModel rm = new RuleModel(); TemplateDataProvider rowDataProvider0 = new GuidedDTTemplateDataProvider(allColumns, rowDTModel0); p.doConditions(allColumns, allPatterns, rowDataProvider0, rowDTModel0, allDTData, rm); String drl0 = RuleModelDRLPersistenceImpl.getInstance().marshal(rm); assertEquals(2, rm.lhs.length); assertEquals("Person", ((FactPattern) rm.lhs[0]).getFactType()); assertEquals("p1", ((FactPattern) rm.lhs[0]).getBoundName()); assertEquals("Person", ((FactPattern) rm.lhs[1]).getFactType()); assertEquals("p2", ((FactPattern) rm.lhs[1]).getBoundName()); assertTrue(drl0.indexOf("p1 : Person( alive == true )") > 0); assertTrue(drl0.indexOf("p2 : Person( alive != false )") > 0); TemplateDataProvider rowDataProvider1 = new GuidedDTTemplateDataProvider(allColumns, rowDTModel1); p.doConditions(allColumns, allPatterns, rowDataProvider1, rowDTModel1, allDTData, rm); String drl1 = RuleModelDRLPersistenceImpl.getInstance().marshal(rm); assertEquals(2, rm.lhs.length); assertEquals("Person", ((FactPattern) rm.lhs[0]).getFactType()); assertEquals("p1", ((FactPattern) rm.lhs[0]).getBoundName()); assertEquals("Person", ((FactPattern) rm.lhs[1]).getFactType()); assertEquals("p2", ((FactPattern) rm.lhs[1]).getBoundName()); assertTrue(drl1.indexOf("p1 : Person( alive not in ( true )") > 0); assertTrue(drl1.indexOf("p2 : Person( alive in ( false )") > 0); } @Test public void testLHSOtherwisePatternDate() { GuidedDTDRLPersistence p = new GuidedDTDRLPersistence(); String[][] row = new String[3][]; String[][] data = new String[3][]; row[0] = new String[]{"1", "desc1", "01-Jan-1980", "20-Jun-1985"}; List<DTCellValue52> rowDTModel0 = DataUtilities.makeDataRowList(row[0]); data[0] = row[0]; row[1] = new String[]{"2", "desc2", "01-Feb-1981", "21-Jun-1986"}; List<DTCellValue52> rowDTModel1 = DataUtilities.makeDataRowList(row[1]); data[1] = row[1]; row[2] = new String[]{"3", "desc3", null, null}; List<DTCellValue52> rowDTModel2 = DataUtilities.makeDataRowList(row[2]); rowDTModel2.get(2).setOtherwise(true); rowDTModel2.get(3).setOtherwise(true); data[2] = row[2]; final List<List<DTCellValue52>> allDTData = new ArrayList<List<DTCellValue52>>() {{ add(rowDTModel0); add(rowDTModel1); add(rowDTModel2); }}; List<BaseColumn> allColumns = new ArrayList<BaseColumn>(); List<CompositeColumn<? extends BaseColumn>> allPatterns = new ArrayList<CompositeColumn<? extends BaseColumn>>(); allColumns.add(new RowNumberCol52()); allColumns.add(new DescriptionCol52()); Pattern52 p1 = new Pattern52(); p1.setBoundName("p1"); p1.setFactType("Person"); allPatterns.add(p1); ConditionCol52 col = new ConditionCol52(); col.setFactField("dateOfBirth"); col.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); col.setFieldType(DataType.TYPE_DATE); col.setOperator("=="); p1.getChildColumns().add(col); allColumns.add(col); Pattern52 p2 = new Pattern52(); p2.setBoundName("p2"); p2.setFactType("Person"); allPatterns.add(p2); ConditionCol52 col2 = new ConditionCol52(); col2.setFactField("dateOfBirth"); col2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); col2.setFieldType(DataType.TYPE_DATE); col2.setOperator("!="); p2.getChildColumns().add(col2); allColumns.add(col2); RuleModel rm = new RuleModel(); TemplateDataProvider rowDataProvider0 = new GuidedDTTemplateDataProvider(allColumns, rowDTModel0); p.doConditions(allColumns, allPatterns, rowDataProvider0, rowDTModel0, allDTData, rm); String drl0 = RuleModelDRLPersistenceImpl.getInstance().marshal(rm); assertEquals(2, rm.lhs.length); assertEquals("Person", ((FactPattern) rm.lhs[0]).getFactType()); assertEquals("p1", ((FactPattern) rm.lhs[0]).getBoundName()); assertEquals("Person", ((FactPattern) rm.lhs[1]).getFactType()); assertEquals("p2", ((FactPattern) rm.lhs[1]).getBoundName()); assertTrue(drl0.indexOf("p1 : Person( dateOfBirth == \"01-Jan-1980\" )") > 0); assertTrue(drl0.indexOf("p2 : Person( dateOfBirth != \"20-Jun-1985\" )") > 0); TemplateDataProvider rowDataProvider1 = new GuidedDTTemplateDataProvider(allColumns, rowDTModel1); p.doConditions(allColumns, allPatterns, rowDataProvider1, rowDTModel1, allDTData, rm); String drl1 = RuleModelDRLPersistenceImpl.getInstance().marshal(rm); assertEquals(2, rm.lhs.length); assertEquals("Person", ((FactPattern) rm.lhs[0]).getFactType()); assertEquals("p1", ((FactPattern) rm.lhs[0]).getBoundName()); assertEquals("Person", ((FactPattern) rm.lhs[1]).getFactType()); assertEquals("p2", ((FactPattern) rm.lhs[1]).getBoundName()); assertTrue(drl1.indexOf("p1 : Person( dateOfBirth == \"01-Feb-1981\" )") > 0); assertTrue(drl1.indexOf("p2 : Person( dateOfBirth != \"21-Jun-1986\" )") > 0); TemplateDataProvider rowDataProvider2 = new GuidedDTTemplateDataProvider(allColumns, rowDTModel2); p.doConditions(allColumns, allPatterns, rowDataProvider2, rowDTModel2, allDTData, rm); String drl2 = RuleModelDRLPersistenceImpl.getInstance().marshal(rm); assertEquals(2, rm.lhs.length); assertEquals("Person", ((FactPattern) rm.lhs[0]).getFactType()); assertEquals("p1", ((FactPattern) rm.lhs[0]).getBoundName()); assertEquals("Person", ((FactPattern) rm.lhs[1]).getFactType()); assertEquals("p2", ((FactPattern) rm.lhs[1]).getBoundName()); assertTrue(drl2.indexOf("p1 : Person( dateOfBirth not in ( \"01-Jan-1980\", \"01-Feb-1981\" )") > 0); assertTrue(drl2.indexOf("p2 : Person( dateOfBirth in ( \"20-Jun-1985\", \"21-Jun-1986\" )") > 0); } @Test public void testLHSOtherwisePatternNumeric() { GuidedDTDRLPersistence p = new GuidedDTDRLPersistence(); String[][] row = new String[3][]; String[][] data = new String[3][]; row[0] = new String[]{"1", "desc1", "1", "1"}; List<DTCellValue52> rowDTModel0 = DataUtilities.makeDataRowList(row[0]); data[0] = row[0]; row[1] = new String[]{"2", "desc2", "2", "2"}; List<DTCellValue52> rowDTModel1 = DataUtilities.makeDataRowList(row[1]); data[1] = row[1]; row[2] = new String[]{"3", "desc3", null, null}; List<DTCellValue52> rowDTModel2 = DataUtilities.makeDataRowList(row[2]); rowDTModel2.get(2).setOtherwise(true); rowDTModel2.get(3).setOtherwise(true); data[2] = row[2]; final List<List<DTCellValue52>> allDTData = new ArrayList<List<DTCellValue52>>() {{ add(rowDTModel0); add(rowDTModel1); add(rowDTModel2); }}; List<BaseColumn> allColumns = new ArrayList<BaseColumn>(); List<CompositeColumn<? extends BaseColumn>> allPatterns = new ArrayList<CompositeColumn<? extends BaseColumn>>(); allColumns.add(new RowNumberCol52()); allColumns.add(new DescriptionCol52()); Pattern52 p1 = new Pattern52(); p1.setBoundName("p1"); p1.setFactType("Person"); allPatterns.add(p1); ConditionCol52 col = new ConditionCol52(); col.setFactField("age"); col.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); col.setFieldType(DataType.TYPE_NUMERIC_INTEGER); col.setOperator("=="); p1.getChildColumns().add(col); allColumns.add(col); Pattern52 p2 = new Pattern52(); p2.setBoundName("p2"); p2.setFactType("Person"); allPatterns.add(p2); ConditionCol52 col2 = new ConditionCol52(); col2.setFactField("age"); col2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); col2.setFieldType(DataType.TYPE_NUMERIC_INTEGER); col2.setOperator("!="); p2.getChildColumns().add(col2); allColumns.add(col2); RuleModel rm = new RuleModel(); TemplateDataProvider rowDataProvider0 = new GuidedDTTemplateDataProvider(allColumns, rowDTModel0); p.doConditions(allColumns, allPatterns, rowDataProvider0, rowDTModel0, allDTData, rm); String drl0 = RuleModelDRLPersistenceImpl.getInstance().marshal(rm); assertEquals(2, rm.lhs.length); assertEquals("Person", ((FactPattern) rm.lhs[0]).getFactType()); assertEquals("p1", ((FactPattern) rm.lhs[0]).getBoundName()); assertEquals("Person", ((FactPattern) rm.lhs[1]).getFactType()); assertEquals("p2", ((FactPattern) rm.lhs[1]).getBoundName()); assertTrue(drl0.indexOf("p1 : Person( age == 1 )") > 0); assertTrue(drl0.indexOf("p2 : Person( age != 1 )") > 0); TemplateDataProvider rowDataProvider1 = new GuidedDTTemplateDataProvider(allColumns, rowDTModel1); p.doConditions(allColumns, allPatterns, rowDataProvider1, rowDTModel1, allDTData, rm); String drl1 = RuleModelDRLPersistenceImpl.getInstance().marshal(rm); assertEquals(2, rm.lhs.length); assertEquals("Person", ((FactPattern) rm.lhs[0]).getFactType()); assertEquals("p1", ((FactPattern) rm.lhs[0]).getBoundName()); assertEquals("Person", ((FactPattern) rm.lhs[1]).getFactType()); assertEquals("p2", ((FactPattern) rm.lhs[1]).getBoundName()); assertTrue(drl1.indexOf("p1 : Person( age == 2 )") > 0); assertTrue(drl1.indexOf("p2 : Person( age != 2 )") > 0); TemplateDataProvider rowDataProvider2 = new GuidedDTTemplateDataProvider(allColumns, rowDTModel2); p.doConditions(allColumns, allPatterns, rowDataProvider2, rowDTModel2, allDTData, rm); String drl2 = RuleModelDRLPersistenceImpl.getInstance().marshal(rm); assertEquals(2, rm.lhs.length); assertEquals("Person", ((FactPattern) rm.lhs[0]).getFactType()); assertEquals("p1", ((FactPattern) rm.lhs[0]).getBoundName()); assertEquals("Person", ((FactPattern) rm.lhs[1]).getFactType()); assertEquals("p2", ((FactPattern) rm.lhs[1]).getBoundName()); assertTrue(drl2.indexOf("p1 : Person( age not in ( 1, 2 )") > 0); assertTrue(drl2.indexOf("p2 : Person( age in ( 1, 2 )") > 0); } @Test public void testLHSOtherwisePatternString() { GuidedDTDRLPersistence p = new GuidedDTDRLPersistence(); String[][] row = new String[3][]; String[][] data = new String[3][]; row[0] = new String[]{"1", "desc1", "Michael1", "Michael1"}; List<DTCellValue52> rowDTModel0 = DataUtilities.makeDataRowList(row[0]); data[0] = row[0]; row[1] = new String[]{"2", "desc2", "Michael2", "Michael2"}; List<DTCellValue52> rowDTModel1 = DataUtilities.makeDataRowList(row[1]); data[1] = row[1]; row[2] = new String[]{"3", "desc3", "", ""}; List<DTCellValue52> rowDTModel2 = DataUtilities.makeDataRowList(row[2]); rowDTModel2.get(2).setOtherwise(true); rowDTModel2.get(3).setOtherwise(true); data[2] = row[2]; final List<List<DTCellValue52>> allDTData = new ArrayList<List<DTCellValue52>>() {{ add(rowDTModel0); add(rowDTModel1); add(rowDTModel2); }}; List<BaseColumn> allColumns = new ArrayList<BaseColumn>(); List<CompositeColumn<? extends BaseColumn>> allPatterns = new ArrayList<CompositeColumn<? extends BaseColumn>>(); allColumns.add(new RowNumberCol52()); allColumns.add(new DescriptionCol52()); Pattern52 p1 = new Pattern52(); p1.setBoundName("p1"); p1.setFactType("Person"); allPatterns.add(p1); ConditionCol52 col = new ConditionCol52(); col.setFactField("name"); col.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); col.setFieldType(DataType.TYPE_STRING); col.setOperator("=="); p1.getChildColumns().add(col); allColumns.add(col); Pattern52 p2 = new Pattern52(); p2.setBoundName("p2"); p2.setFactType("Person"); allPatterns.add(p2); ConditionCol52 col2 = new ConditionCol52(); col2.setFactField("name"); col2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); col2.setFieldType(DataType.TYPE_STRING); col2.setOperator("!="); p2.getChildColumns().add(col2); allColumns.add(col2); RuleModel rm = new RuleModel(); TemplateDataProvider rowDataProvider0 = new GuidedDTTemplateDataProvider(allColumns, rowDTModel0); p.doConditions(allColumns, allPatterns, rowDataProvider0, rowDTModel0, allDTData, rm); String drl0 = RuleModelDRLPersistenceImpl.getInstance().marshal(rm); assertEquals(2, rm.lhs.length); assertEquals("Person", ((FactPattern) rm.lhs[0]).getFactType()); assertEquals("p1", ((FactPattern) rm.lhs[0]).getBoundName()); assertEquals("Person", ((FactPattern) rm.lhs[1]).getFactType()); assertEquals("p2", ((FactPattern) rm.lhs[1]).getBoundName()); assertTrue(drl0.indexOf("p1 : Person( name == \"Michael1\" )") > 0); assertTrue(drl0.indexOf("p2 : Person( name != \"Michael1\" )") > 0); TemplateDataProvider rowDataProvider1 = new GuidedDTTemplateDataProvider(allColumns, rowDTModel1); p.doConditions(allColumns, allPatterns, rowDataProvider1, rowDTModel1, allDTData, rm); String drl1 = RuleModelDRLPersistenceImpl.getInstance().marshal(rm); assertEquals(2, rm.lhs.length); assertEquals("Person", ((FactPattern) rm.lhs[0]).getFactType()); assertEquals("p1", ((FactPattern) rm.lhs[0]).getBoundName()); assertEquals("Person", ((FactPattern) rm.lhs[1]).getFactType()); assertEquals("p2", ((FactPattern) rm.lhs[1]).getBoundName()); assertTrue(drl1.indexOf("p1 : Person( name == \"Michael2\" )") > 0); assertTrue(drl1.indexOf("p2 : Person( name != \"Michael2\" )") > 0); TemplateDataProvider rowDataProvider2 = new GuidedDTTemplateDataProvider(allColumns, rowDTModel2); p.doConditions(allColumns, allPatterns, rowDataProvider2, rowDTModel2, allDTData, rm); String drl2 = RuleModelDRLPersistenceImpl.getInstance().marshal(rm); assertEquals(2, rm.lhs.length); assertEquals("Person", ((FactPattern) rm.lhs[0]).getFactType()); assertEquals("p1", ((FactPattern) rm.lhs[0]).getBoundName()); assertEquals("Person", ((FactPattern) rm.lhs[1]).getFactType()); assertEquals("p2", ((FactPattern) rm.lhs[1]).getBoundName()); assertTrue(drl2.indexOf("p1 : Person( name not in ( \"Michael1\", \"Michael2\" )") > 0); assertTrue(drl2.indexOf("p2 : Person( name in ( \"Michael1\", \"Michael2\" )") > 0); } @Test public void testMetaData() { GuidedDTDRLPersistence p = new GuidedDTDRLPersistence(); String[] row = new String[]{"1", "desc", "bar", ""}; List<BaseColumn> allColumns = new ArrayList<BaseColumn>(); allColumns.add(new RowNumberCol52()); allColumns.add(new DescriptionCol52()); List<MetadataCol52> metadataCols = new ArrayList<MetadataCol52>(); RuleModel rm = new RuleModel(); RuleMetadata[] orig = rm.metadataList; // RuleAttribute[] orig = rm.attributes; p.doMetadata(allColumns, metadataCols, DataUtilities.makeDataRowList(row), rm); assertSame(orig, rm.metadataList); MetadataCol52 col1 = new MetadataCol52(); col1.setMetadata("foo"); MetadataCol52 col2 = new MetadataCol52(); col2.setMetadata("foo2"); metadataCols.add(col1); metadataCols.add(col2); allColumns.addAll(metadataCols); p.doMetadata(allColumns, metadataCols, DataUtilities.makeDataRowList(row), rm); assertEquals(1, rm.metadataList.length); assertEquals("foo", rm.metadataList[0].getAttributeName()); assertEquals("bar", rm.metadataList[0].getValue()); row = new String[]{"1", "desc", "bar1", "bar2"}; p.doMetadata(allColumns, metadataCols, DataUtilities.makeDataRowList(row), rm); assertEquals(2, rm.metadataList.length); assertEquals("foo", rm.metadataList[0].getAttributeName()); assertEquals("bar1", rm.metadataList[0].getValue()); assertEquals("foo2", rm.metadataList[1].getAttributeName()); assertEquals("bar2", rm.metadataList[1].getValue()); } @Test public void testName() { GuidedDTDRLPersistence p = new GuidedDTDRLPersistence(); assertEquals("Row 42 XXX", p.getName("XXX", 42)); assertEquals("Row 42 YYY", p.getName("YYY", 42)); } @Test public void testNoConstraints() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableFormat(GuidedDecisionTable52.TableFormat.EXTENDED_ENTRY); dt.setTableName("no-constraints"); Pattern52 p1 = new Pattern52(); p1.setBoundName("x"); p1.setFactType("Context"); ConditionCol52 c = new ConditionCol52(); c.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); c.setFieldType(DataType.TYPE_STRING); c.setFactField("name"); c.setOperator("=="); p1.getChildColumns().add(c); dt.getConditions().add(p1); ActionSetFieldCol52 asf = new ActionSetFieldCol52(); asf.setBoundName("x"); asf.setFactField("age"); asf.setType(DataType.TYPE_NUMERIC_INTEGER); dt.getActionCols().add(asf); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{"1", "desc", "Fred", 75l} })); String drl1 = GuidedDTDRLPersistence.getInstance().marshal(dt); String expected1 = "//from row number: 1\n" + "//desc\n" + "rule \"Row 1 no-constraints\"\n" + " dialect \"mvel\"\n" + " when\n" + " x : Context( name == \"Fred\" )\n" + " then\n" + " x.setAge( 75 );\n" + "end"; assertEqualsIgnoreWhitespace(expected1, drl1); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{"1", "desc", null, 75l} })); String drl2 = GuidedDTDRLPersistence.getInstance().marshal(dt); String expected2 = "//from row number: 1\n" + "//desc\n" + "rule \"Row 1 no-constraints\"\n" + " dialect \"mvel\"\n" + " when\n" + " then\n" + " x.setAge( 75 );\n" + "end"; assertEqualsIgnoreWhitespace(expected2, drl2); } @Test public void testNoOperator() { GuidedDTDRLPersistence p = new GuidedDTDRLPersistence(); String[] row = new String[]{"1", "desc", "a", "> 42"}; String[][] data = new String[1][]; data[0] = row; List<BaseColumn> allColumns = new ArrayList<BaseColumn>(); List<CompositeColumn<? extends BaseColumn>> allPatterns = new ArrayList<CompositeColumn<? extends BaseColumn>>(); allColumns.add(new RowNumberCol52()); allColumns.add(new DescriptionCol52()); allColumns.add(new MetadataCol52()); Pattern52 p1 = new Pattern52(); p1.setBoundName("p1"); p1.setFactType("Person"); allPatterns.add(p1); ConditionCol52 col1 = new ConditionCol52(); col1.setFactField("age"); col1.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); col1.setOperator(""); p1.getChildColumns().add(col1); allColumns.add(col1); RuleModel rm = new RuleModel(); List<DTCellValue52> rowData = DataUtilities.makeDataRowList(row); TemplateDataProvider rowDataProvider = new GuidedDTTemplateDataProvider(allColumns, rowData); p.doConditions(allColumns, allPatterns, rowDataProvider, rowData, DataUtilities.makeDataLists(data), rm); String drl = RuleModelDRLPersistenceImpl.getInstance().marshal(rm); assertTrue(drl.indexOf("age > \"42\"") > 0); } @Test public void testRHS() { GuidedDTDRLPersistence p = new GuidedDTDRLPersistence(); String[] row = new String[]{"1", "desc", "a", "a condition", "actionsetfield1", "actionupdatefield2", "retract", "actioninsertfact1", "actioninsertfact2"}; List<BaseColumn> allColumns = new ArrayList<BaseColumn>(); allColumns.add(new RowNumberCol52()); allColumns.add(new DescriptionCol52()); allColumns.add(new MetadataCol52()); allColumns.add(new ConditionCol52()); List<ActionCol52> cols = new ArrayList<ActionCol52>(); ActionSetFieldCol52 asf1 = new ActionSetFieldCol52(); asf1.setBoundName("a"); asf1.setFactField("field1"); asf1.setType(DataType.TYPE_STRING); cols.add(asf1); ActionSetFieldCol52 asf2 = new ActionSetFieldCol52(); asf2.setBoundName("a"); asf2.setFactField("field2"); asf2.setUpdate(true); asf2.setType(DataType.TYPE_NUMERIC_INTEGER); cols.add(asf2); ActionRetractFactCol52 ret = new ActionRetractFactCol52(); cols.add(ret); ActionInsertFactCol52 ins1 = new ActionInsertFactCol52(); ins1.setBoundName("ins"); ins1.setFactType("Cheese"); ins1.setFactField("price"); ins1.setType(DataType.TYPE_NUMERIC_INTEGER); cols.add(ins1); ActionInsertFactCol52 ins2 = new ActionInsertFactCol52(); ins2.setBoundName("ins"); ins2.setFactType("Cheese"); ins2.setFactField("type"); ins2.setType(DataType.TYPE_NUMERIC_INTEGER); cols.add(ins2); RuleModel rm = new RuleModel(); allColumns.addAll(cols); List<DTCellValue52> rowData = DataUtilities.makeDataRowList(row); TemplateDataProvider rowDataProvider = new GuidedDTTemplateDataProvider(allColumns, rowData); p.doActions(allColumns, cols, rowDataProvider, rowData, rm); assertEquals(4, rm.rhs.length); // examine the set field action that is produced ActionSetField a1 = (ActionSetField) rm.rhs[0]; assertEquals("a", a1.getVariable()); assertEquals(1, a1.getFieldValues().length); assertEquals("field1", a1.getFieldValues()[0].getField()); assertEquals("actionsetfield1", a1.getFieldValues()[0].getValue()); assertEquals(DataType.TYPE_STRING, a1.getFieldValues()[0].getType()); ActionSetField a2 = (ActionSetField) rm.rhs[1]; assertEquals("a", a2.getVariable()); assertEquals(1, a2.getFieldValues().length); assertEquals("field2", a2.getFieldValues()[0].getField()); assertEquals("actionupdatefield2", a2.getFieldValues()[0].getValue()); assertEquals(DataType.TYPE_NUMERIC_INTEGER, a2.getFieldValues()[0].getType()); // examine the retract ActionRetractFact a3 = (ActionRetractFact) rm.rhs[2]; assertEquals("retract", a3.getVariableName()); // examine the insert ActionInsertFact a4 = (ActionInsertFact) rm.rhs[3]; assertEquals("Cheese", a4.getFactType()); assertEquals(2, a4.getFieldValues().length); assertEquals("price", a4.getFieldValues()[0].getField()); assertEquals("actioninsertfact1", a4.getFieldValues()[0].getValue()); assertEquals(DataType.TYPE_NUMERIC_INTEGER, a4.getFieldValues()[0].getType()); assertEquals("type", a4.getFieldValues()[1].getField()); assertEquals("actioninsertfact2", a4.getFieldValues()[1].getValue()); assertEquals(DataType.TYPE_NUMERIC_INTEGER, a4.getFieldValues()[1].getType()); } @Test public void testUpdateModifySingleField() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); Pattern52 p1 = new Pattern52(); p1.setBoundName("x"); p1.setFactType("Context"); ConditionCol52 c = new ConditionCol52(); c.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); p1.getChildColumns().add(c); dt.getConditions().add(p1); ActionSetFieldCol52 asf = new ActionSetFieldCol52(); asf.setBoundName("x"); asf.setFactField("age"); asf.setType(DataType.TYPE_NUMERIC_INTEGER); asf.setUpdate(true); dt.getActionCols().add(asf); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{"1", "desc", "y", "old"} })); String drl = GuidedDTDRLPersistence.getInstance().marshal(dt); assertTrue(drl.indexOf("Context( )") > -1); assertTrue(drl.indexOf("modify( x ) {") > drl.indexOf("Context( )")); assertTrue(drl.indexOf("setAge(") > drl.indexOf("modify( x ) {")); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{"1", "desc", null, "old"} })); drl = GuidedDTDRLPersistence.getInstance().marshal(dt); assertEquals(-1, drl.indexOf("Context( )")); assertTrue(drl.indexOf("modify( x ) {") > -1); assertTrue(drl.indexOf("setAge(") > drl.indexOf("modify( x ) {")); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{"1", "desc", null, null} })); drl = GuidedDTDRLPersistence.getInstance().marshal(dt); assertEquals(-1, drl.indexOf("Context( )")); assertEquals(-1, drl.indexOf("modify( x ) {")); assertEquals(-1, drl.indexOf("setAge(")); } @Test public void testUpdateModifyMultipleFields() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); Pattern52 p1 = new Pattern52(); p1.setBoundName("x"); p1.setFactType("Context"); ConditionCol52 c = new ConditionCol52(); c.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); p1.getChildColumns().add(c); dt.getConditions().add(p1); ActionSetFieldCol52 asf1 = new ActionSetFieldCol52(); asf1.setBoundName("x"); asf1.setFactField("age"); asf1.setType(DataType.TYPE_NUMERIC_INTEGER); asf1.setUpdate(true); dt.getActionCols().add(asf1); ActionSetFieldCol52 asf2 = new ActionSetFieldCol52(); asf2.setBoundName("x"); asf2.setFactField("name"); asf2.setType(DataType.TYPE_STRING); asf2.setUpdate(true); dt.getActionCols().add(asf2); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{"1", "desc", "x", 55l, "Fred"} })); String drl = GuidedDTDRLPersistence.getInstance().marshal(dt); final String expected1 = "//from row number: 1\n" + "//desc\n" + "rule \"Row 1 null\"\n" + "dialect \"mvel\"\n" + "when\n" + " x : Context( )\n" + "then\n" + " modify( x ) {\n" + " setAge( 55 ), \n" + " setName( \"Fred\" )\n" + "}\n" + "end\n"; assertEqualsIgnoreWhitespace(expected1, drl); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{"1", "desc", "x", null, "Fred"} })); drl = GuidedDTDRLPersistence.getInstance().marshal(dt); final String expected2 = "//from row number: 1\n" + "//desc\n" + "rule \"Row 1 null\"\n" + "dialect \"mvel\"\n" + "when\n" + " x : Context( )\n" + "then\n" + " modify( x ) {\n" + " setName( \"Fred\" )\n" + "}\n" + "end\n"; assertEqualsIgnoreWhitespace(expected2, drl); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{"1", "desc", "x", 55l, null} })); drl = GuidedDTDRLPersistence.getInstance().marshal(dt); final String expected3 = "//from row number: 1\n" + "//desc\n" + "rule \"Row 1 null\"\n" + "dialect \"mvel\"\n" + "when\n" + " x : Context( )\n" + "then\n" + " modify( x ) {\n" + " setAge( 55 ) \n" + "}\n" + "end\n"; assertEqualsIgnoreWhitespace(expected3, drl); } @Test public void testUpdateModifyMultipleFieldsUpdateOneModifyTheOther() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); Pattern52 p1 = new Pattern52(); p1.setBoundName("x"); p1.setFactType("Context"); ConditionCol52 c = new ConditionCol52(); c.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); p1.getChildColumns().add(c); dt.getConditions().add(p1); ActionSetFieldCol52 asf1 = new ActionSetFieldCol52(); asf1.setBoundName("x"); asf1.setFactField("age"); asf1.setType(DataType.TYPE_NUMERIC_INTEGER); asf1.setUpdate(true); dt.getActionCols().add(asf1); ActionSetFieldCol52 asf2 = new ActionSetFieldCol52(); asf2.setBoundName("x"); asf2.setFactField("name"); asf2.setType(DataType.TYPE_STRING); asf2.setUpdate(false); dt.getActionCols().add(asf2); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{"1", "desc", "x", 55l, "Fred"} })); String drl = GuidedDTDRLPersistence.getInstance().marshal(dt); final String expected1 = "//from row number: 1\n" + "//desc\n" + "rule \"Row 1 null\"\n" + "dialect \"mvel\"\n" + "when\n" + " x : Context( )\n" + "then\n" + " modify( x ) {\n" + " setAge( 55 ) \n" + "}\n" + "x.setName( \"Fred\" );\n" + "end\n"; assertEqualsIgnoreWhitespace(expected1, drl); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{"1", "desc", "x", null, "Fred"} })); drl = GuidedDTDRLPersistence.getInstance().marshal(dt); final String expected2 = "//from row number: 1\n" + "//desc\n" + "rule \"Row 1 null\"\n" + "dialect \"mvel\"\n" + "when\n" + " x : Context( )\n" + "then\n" + "x.setName( \"Fred\" );\n" + "end\n"; assertEqualsIgnoreWhitespace(expected2, drl); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{"1", "desc", "x", 55l, ""} })); drl = GuidedDTDRLPersistence.getInstance().marshal(dt); final String expected3 = "//from row number: 1\n" + "//desc\n" + "rule \"Row 1 null\"\n" + "dialect \"mvel\"\n" + "when\n" + " x : Context( )\n" + "then\n" + " modify( x ) {\n" + " setAge( 55 ) \n" + "}\n" + "end\n"; assertEqualsIgnoreWhitespace(expected3, drl); } @Test public void testDefaultValue() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); Pattern52 p1 = new Pattern52(); p1.setBoundName("$c"); p1.setFactType("CheeseLover"); ConditionCol52 c = new ConditionCol52(); c.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); c.setFactField("favouriteCheese"); c.setDefaultValue(new DTCellValue52("cheddar")); c.setOperator("=="); p1.getChildColumns().add(c); dt.getConditions().add(p1); //With provided getValue() String[][] data = new String[][]{ new String[]{"1", "desc", "edam"}, }; dt.setData(DataUtilities.makeDataLists(data)); String drl = GuidedDTDRLPersistence.getInstance().marshal(dt); assertFalse(drl.indexOf("$c : CheeseLover( favouriteCheese == \"edam\" )") == -1); //Without provided getValue() #1 data = new String[][]{ new String[]{"1", "desc", null}, }; dt.setData(DataUtilities.makeDataLists(data)); drl = GuidedDTDRLPersistence.getInstance().marshal(dt); assertTrue(drl.indexOf("$c : CheeseLover( favouriteCheese == \"cheddar\" )") == -1); //Without provided getValue() #2 data = new String[][]{ new String[]{"1", "desc", ""}, }; dt.setData(DataUtilities.makeDataLists(data)); drl = GuidedDTDRLPersistence.getInstance().marshal(dt); assertTrue(drl.indexOf("$c : CheeseLover( favouriteCheese == \"cheddar\" )") == -1); } @Test public void testLimitedEntryAttributes() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableFormat(GuidedDecisionTable52.TableFormat.LIMITED_ENTRY); dt.setTableName("limited-entry"); AttributeCol52 attr = new AttributeCol52(); attr.setAttribute("salience"); dt.getAttributeCols().add(attr); dt.setData(DataUtilities.makeDataLists(new String[][]{ new String[]{"1", "desc", "100"}, new String[]{"2", "desc", "200"} })); GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dt); assertTrue(drl.indexOf("salience 100") > -1); assertTrue(drl.indexOf("salience 200") > -1); } @Test public void testLimitedEntryMetadata() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableFormat(GuidedDecisionTable52.TableFormat.LIMITED_ENTRY); dt.setTableName("limited-entry"); MetadataCol52 md = new MetadataCol52(); md.setMetadata("metadata"); dt.getMetadataCols().add(md); dt.setData(DataUtilities.makeDataLists(new String[][]{ new String[]{"1", "desc", "md1"}, new String[]{"2", "desc", "md2"} })); GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dt); assertTrue(drl.indexOf("@metadata(md1)") > -1); assertTrue(drl.indexOf("@metadata(md2)") > -1); } @Test public void testLimitedEntryConditionsNoConstraints() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableFormat(GuidedDecisionTable52.TableFormat.LIMITED_ENTRY); dt.setTableName("limited-entry"); Pattern52 p1 = new Pattern52(); p1.setBoundName("p1"); p1.setFactType("Smurf"); dt.getConditions().add(p1); // This is a hack consistent with how the Expanded Form decision table // works. I wouldn't be too surprised if this changes at some time, but // GuidedDTDRLPersistence.marshal does not support empty patterns at // present. LimitedEntryConditionCol52 cc1 = new LimitedEntryConditionCol52(); cc1.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc1.setValue(new DTCellValue52("y")); p1.getChildColumns().add(cc1); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{1l, "desc", true}, new Object[]{2l, "desc", false} })); GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dt); int index = -1; index = drl.indexOf("Smurf( )"); assertTrue(index > -1); index = drl.indexOf("Smurf( )", index + 1); assertFalse(index > -1); } @Test public void testLimitedEntryConditionsConstraints1() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableFormat(GuidedDecisionTable52.TableFormat.LIMITED_ENTRY); dt.setTableName("limited-entry"); Pattern52 p1 = new Pattern52(); p1.setBoundName("p1"); p1.setFactType("Smurf"); dt.getConditions().add(p1); LimitedEntryConditionCol52 cc1 = new LimitedEntryConditionCol52(); cc1.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc1.setFieldType(DataType.TYPE_STRING); cc1.setFactField("name"); cc1.setOperator("=="); cc1.setValue(new DTCellValue52("Pupa")); p1.getChildColumns().add(cc1); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{1l, "desc", true}, new Object[]{2l, "desc", false} })); GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dt); int index = -1; index = drl.indexOf("Smurf( name == \"Pupa\" )"); assertTrue(index > -1); index = drl.indexOf("Smurf( name == \"Pupa\" )", index + 1); assertFalse(index > -1); } @Test public void testLimitedEntryConditionsConstraints2() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableFormat(GuidedDecisionTable52.TableFormat.LIMITED_ENTRY); dt.setTableName("limited-entry"); Pattern52 p1 = new Pattern52(); p1.setBoundName("p1"); p1.setFactType("Smurf"); dt.getConditions().add(p1); LimitedEntryConditionCol52 cc1 = new LimitedEntryConditionCol52(); cc1.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc1.setFieldType(DataType.TYPE_STRING); cc1.setFactField("name"); cc1.setOperator("=="); cc1.setValue(new DTCellValue52("Pupa")); p1.getChildColumns().add(cc1); LimitedEntryConditionCol52 cc2 = new LimitedEntryConditionCol52(); cc2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc2.setFieldType(DataType.TYPE_STRING); cc2.setFactField("name"); cc2.setOperator("=="); cc2.setValue(new DTCellValue52("Smurfette")); p1.getChildColumns().add(cc2); LimitedEntryConditionCol52 cc3 = new LimitedEntryConditionCol52(); cc3.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc3.setFieldType(DataType.TYPE_STRING); cc3.setFactField("colour"); cc3.setOperator("=="); cc3.setValue(new DTCellValue52("Blue")); p1.getChildColumns().add(cc3); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{1l, "desc", true, false, true}, new Object[]{2l, "desc", false, true, true}, new Object[]{3l, "desc", false, false, true} })); GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dt); int index = -1; index = drl.indexOf("Smurf( name == \"Pupa\" , colour == \"Blue\" )"); assertTrue(index > -1); index = drl.indexOf("Smurf( name == \"Smurfette\" , colour == \"Blue\" )", index + 1); assertTrue(index > -1); index = drl.indexOf("Smurf( colour == \"Blue\" )", index + 1); assertTrue(index > -1); } @Test public void testLimitedEntryActionSet() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableFormat(GuidedDecisionTable52.TableFormat.LIMITED_ENTRY); dt.setTableName("limited-entry"); Pattern52 p1 = new Pattern52(); p1.setBoundName("p1"); p1.setFactType("Smurf"); dt.getConditions().add(p1); LimitedEntryConditionCol52 cc1 = new LimitedEntryConditionCol52(); cc1.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc1.setFieldType(DataType.TYPE_BOOLEAN); cc1.setFactField("isSmurf"); cc1.setOperator("=="); cc1.setValue(new DTCellValue52("true")); p1.getChildColumns().add(cc1); LimitedEntryActionSetFieldCol52 asf1 = new LimitedEntryActionSetFieldCol52(); asf1.setBoundName("p1"); asf1.setFactField("colour"); asf1.setValue(new DTCellValue52("Blue")); dt.getActionCols().add(asf1); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{1l, "desc", true, true}, new Object[]{2l, "desc", true, false} })); GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dt); int index = -1; index = drl.indexOf("Smurf( isSmurf == true )"); assertTrue(index > -1); index = drl.indexOf("p1.setColour( \"Blue\" )", index + 1); assertTrue(index > -1); index = drl.indexOf("Smurf( isSmurf == true )", index + 1); assertTrue(index > -1); index = drl.indexOf("p1.setColour( \"Blue\" )", index + 1); assertFalse(index > -1); } @Test public void testLimitedEntryActionInsert() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableFormat(GuidedDecisionTable52.TableFormat.LIMITED_ENTRY); dt.setTableName("limited-entry"); Pattern52 p1 = new Pattern52(); p1.setBoundName("p1"); p1.setFactType("Smurf"); dt.getConditions().add(p1); LimitedEntryActionInsertFactCol52 asf1 = new LimitedEntryActionInsertFactCol52(); asf1.setFactType("Smurf"); asf1.setBoundName("s1"); asf1.setFactField("colour"); asf1.setValue(new DTCellValue52("Blue")); dt.getActionCols().add(asf1); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{1l, "desc", true}, new Object[]{2l, "desc", false} })); GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dt); int index = -1; index = drl.indexOf("Smurf s1 = new Smurf();"); assertTrue(index > -1); index = drl.indexOf("s1.setColour( \"Blue\" );", index + 1); assertTrue(index > -1); index = drl.indexOf("insert( s1 );", index + 1); assertTrue(index > -1); int indexRule2 = index; indexRule2 = drl.indexOf("Smurf s1 = new Smurf();", index + 1); assertFalse(indexRule2 > -1); indexRule2 = drl.indexOf("s1.setColour( \"Blue\" );", index + 1); assertFalse(indexRule2 > -1); indexRule2 = drl.indexOf("insert(s1 );", index + 1); assertFalse(indexRule2 > -1); } @Test public void testLHSIsNullOperator() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableFormat(GuidedDecisionTable52.TableFormat.EXTENDED_ENTRY); dt.setTableName("extended-entry"); Pattern52 p1 = new Pattern52(); p1.setBoundName("p1"); p1.setFactType("Smurf"); dt.getConditions().add(p1); ConditionCol52 cc1 = new ConditionCol52(); cc1.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc1.setFieldType(DataType.TYPE_STRING); cc1.setFactField("name"); cc1.setOperator("== null"); p1.getChildColumns().add(cc1); ConditionCol52 cc2 = new ConditionCol52(); cc2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc2.setFieldType(DataType.TYPE_NUMERIC_INTEGER); cc2.setFactField("age"); cc2.setOperator("== null"); p1.getChildColumns().add(cc2); ConditionCol52 cc3 = new ConditionCol52(); cc3.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc3.setFieldType(DataType.TYPE_DATE); cc3.setFactField("dateOfBirth"); cc3.setOperator("== null"); p1.getChildColumns().add(cc3); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{1l, "desc", true, true, true}, new Object[]{2l, "desc", false, false, false} })); GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dt); int index = -1; index = drl.indexOf("Smurf( name == null , age == null , dateOfBirth == null )"); assertTrue(index > -1); index = drl.indexOf("Smurf( )", index + 1); assertFalse(index > -1); } @Test public void testLHSIsNullOperatorWithNullValues() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableFormat(GuidedDecisionTable52.TableFormat.EXTENDED_ENTRY); dt.setTableName("extended-entry"); Pattern52 p1 = new Pattern52(); p1.setBoundName("p1"); p1.setFactType("Smurf"); dt.getConditions().add(p1); ConditionCol52 cc1 = new ConditionCol52(); cc1.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc1.setFieldType(DataType.TYPE_STRING); cc1.setFactField("name"); cc1.setOperator("== null"); p1.getChildColumns().add(cc1); ConditionCol52 cc2 = new ConditionCol52(); cc2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc2.setFieldType(DataType.TYPE_NUMERIC_INTEGER); cc2.setFactField("age"); cc2.setOperator("== null"); p1.getChildColumns().add(cc2); ConditionCol52 cc3 = new ConditionCol52(); cc3.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc3.setFieldType(DataType.TYPE_DATE); cc3.setFactField("dateOfBirth"); cc3.setOperator("== null"); p1.getChildColumns().add(cc3); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{1l, "desc", true, true, true}, new Object[]{2l, "desc", null, null, null} })); GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dt); int index = -1; index = drl.indexOf("Smurf( name == null , age == null , dateOfBirth == null )"); assertTrue(index > -1); index = drl.indexOf("Smurf( )", index + 1); assertFalse(index > -1); } @Test public void testLHSIsNotNullOperator() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableFormat(GuidedDecisionTable52.TableFormat.EXTENDED_ENTRY); dt.setTableName("extended-entry"); Pattern52 p1 = new Pattern52(); p1.setBoundName("p1"); p1.setFactType("Smurf"); dt.getConditions().add(p1); ConditionCol52 cc1 = new ConditionCol52(); cc1.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc1.setFieldType(DataType.TYPE_STRING); cc1.setFactField("name"); cc1.setOperator("!= null"); p1.getChildColumns().add(cc1); ConditionCol52 cc2 = new ConditionCol52(); cc2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc2.setFieldType(DataType.TYPE_NUMERIC_INTEGER); cc2.setFactField("age"); cc2.setOperator("!= null"); p1.getChildColumns().add(cc2); ConditionCol52 cc3 = new ConditionCol52(); cc3.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc3.setFieldType(DataType.TYPE_DATE); cc3.setFactField("dateOfBirth"); cc3.setOperator("!= null"); p1.getChildColumns().add(cc3); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{1l, "desc", true, true, true}, new Object[]{2l, "desc", false, false, false} })); GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dt); int index = -1; index = drl.indexOf("Smurf( name != null , age != null , dateOfBirth != null )"); assertTrue(index > -1); index = drl.indexOf("Smurf( )", index + 1); assertFalse(index > -1); } @Test public void testLHSIsNotNullOperatorWithNullValues() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableFormat(GuidedDecisionTable52.TableFormat.EXTENDED_ENTRY); dt.setTableName("extended-entry"); Pattern52 p1 = new Pattern52(); p1.setBoundName("p1"); p1.setFactType("Smurf"); dt.getConditions().add(p1); ConditionCol52 cc1 = new ConditionCol52(); cc1.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc1.setFieldType(DataType.TYPE_STRING); cc1.setFactField("name"); cc1.setOperator("!= null"); p1.getChildColumns().add(cc1); ConditionCol52 cc2 = new ConditionCol52(); cc2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc2.setFieldType(DataType.TYPE_NUMERIC_INTEGER); cc2.setFactField("age"); cc2.setOperator("!= null"); p1.getChildColumns().add(cc2); ConditionCol52 cc3 = new ConditionCol52(); cc3.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc3.setFieldType(DataType.TYPE_DATE); cc3.setFactField("dateOfBirth"); cc3.setOperator("!= null"); p1.getChildColumns().add(cc3); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{1l, "desc", true, true, true}, new Object[]{2l, "desc", null, null, null} })); GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dt); int index = -1; index = drl.indexOf("Smurf( name != null , age != null , dateOfBirth != null )"); assertTrue(index > -1); index = drl.indexOf("Smurf( )", index + 1); assertFalse(index > -1); } @Test public void testLimitedEntryLHSIsNullOperator() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableFormat(GuidedDecisionTable52.TableFormat.LIMITED_ENTRY); dt.setTableName("limited-entry"); Pattern52 p1 = new Pattern52(); p1.setBoundName("p1"); p1.setFactType("Smurf"); dt.getConditions().add(p1); LimitedEntryConditionCol52 cc1 = new LimitedEntryConditionCol52(); cc1.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc1.setFieldType(DataType.TYPE_STRING); cc1.setFactField("name"); cc1.setOperator("== null"); p1.getChildColumns().add(cc1); LimitedEntryConditionCol52 cc2 = new LimitedEntryConditionCol52(); cc2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc2.setFieldType(DataType.TYPE_NUMERIC_INTEGER); cc2.setFactField("age"); cc2.setOperator("== null"); p1.getChildColumns().add(cc2); LimitedEntryConditionCol52 cc3 = new LimitedEntryConditionCol52(); cc3.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc3.setFieldType(DataType.TYPE_DATE); cc3.setFactField("dateOfBirth"); cc3.setOperator("== null"); p1.getChildColumns().add(cc3); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{1l, "desc", true, true, true}, new Object[]{2l, "desc", false, false, false} })); GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dt); int index = -1; index = drl.indexOf("Smurf( name == null , age == null , dateOfBirth == null )"); assertTrue(index > -1); index = drl.indexOf("Smurf( )", index + 1); assertFalse(index > -1); } @Test public void testLimitedEntryLHSIsNullOperatorWithNullValues() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableFormat(GuidedDecisionTable52.TableFormat.LIMITED_ENTRY); dt.setTableName("limited-entry"); Pattern52 p1 = new Pattern52(); p1.setBoundName("p1"); p1.setFactType("Smurf"); dt.getConditions().add(p1); LimitedEntryConditionCol52 cc1 = new LimitedEntryConditionCol52(); cc1.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc1.setFieldType(DataType.TYPE_STRING); cc1.setFactField("name"); cc1.setOperator("== null"); p1.getChildColumns().add(cc1); LimitedEntryConditionCol52 cc2 = new LimitedEntryConditionCol52(); cc2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc2.setFieldType(DataType.TYPE_NUMERIC_INTEGER); cc2.setFactField("age"); cc2.setOperator("== null"); p1.getChildColumns().add(cc2); LimitedEntryConditionCol52 cc3 = new LimitedEntryConditionCol52(); cc3.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc3.setFieldType(DataType.TYPE_DATE); cc3.setFactField("dateOfBirth"); cc3.setOperator("== null"); p1.getChildColumns().add(cc3); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{1l, "desc", true, true, true}, new Object[]{2l, "desc", null, null, null} })); GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dt); int index = -1; index = drl.indexOf("Smurf( name == null , age == null , dateOfBirth == null )"); assertTrue(index > -1); index = drl.indexOf("Smurf( )", index + 1); assertFalse(index > -1); } @Test public void testLimitedEntryLHSIsNotNullOperator() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableFormat(GuidedDecisionTable52.TableFormat.LIMITED_ENTRY); dt.setTableName("limited-entry"); Pattern52 p1 = new Pattern52(); p1.setBoundName("p1"); p1.setFactType("Smurf"); dt.getConditions().add(p1); LimitedEntryConditionCol52 cc1 = new LimitedEntryConditionCol52(); cc1.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc1.setFieldType(DataType.TYPE_STRING); cc1.setFactField("name"); cc1.setOperator("!= null"); p1.getChildColumns().add(cc1); LimitedEntryConditionCol52 cc2 = new LimitedEntryConditionCol52(); cc2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc2.setFieldType(DataType.TYPE_NUMERIC_INTEGER); cc2.setFactField("age"); cc2.setOperator("!= null"); p1.getChildColumns().add(cc2); LimitedEntryConditionCol52 cc3 = new LimitedEntryConditionCol52(); cc3.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc3.setFieldType(DataType.TYPE_DATE); cc3.setFactField("dateOfBirth"); cc3.setOperator("!= null"); p1.getChildColumns().add(cc3); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{1l, "desc", true, true, true}, new Object[]{2l, "desc", false, false, false} })); GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dt); int index = -1; index = drl.indexOf("Smurf( name != null , age != null , dateOfBirth != null )"); assertTrue(index > -1); index = drl.indexOf("Smurf( )", index + 1); assertFalse(index > -1); } @Test public void testLimitedEntryLHSIsNotNullOperatorWithNullValues() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableFormat(GuidedDecisionTable52.TableFormat.LIMITED_ENTRY); dt.setTableName("limited-entry"); Pattern52 p1 = new Pattern52(); p1.setBoundName("p1"); p1.setFactType("Smurf"); dt.getConditions().add(p1); LimitedEntryConditionCol52 cc1 = new LimitedEntryConditionCol52(); cc1.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc1.setFieldType(DataType.TYPE_STRING); cc1.setFactField("name"); cc1.setOperator("!= null"); p1.getChildColumns().add(cc1); LimitedEntryConditionCol52 cc2 = new LimitedEntryConditionCol52(); cc2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc2.setFieldType(DataType.TYPE_NUMERIC_INTEGER); cc2.setFactField("age"); cc2.setOperator("!= null"); p1.getChildColumns().add(cc2); LimitedEntryConditionCol52 cc3 = new LimitedEntryConditionCol52(); cc3.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc3.setFieldType(DataType.TYPE_DATE); cc3.setFactField("dateOfBirth"); cc3.setOperator("!= null"); p1.getChildColumns().add(cc3); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{1l, "desc", true, true, true}, new Object[]{2l, "desc", null, null, null} })); GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dt); int index = -1; index = drl.indexOf("Smurf( name != null , age != null , dateOfBirth != null )"); assertTrue(index > -1); index = drl.indexOf("Smurf( )", index + 1); assertFalse(index > -1); } @Test public void testLHSInOperator() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableFormat(GuidedDecisionTable52.TableFormat.EXTENDED_ENTRY); dt.setTableName("extended-entry"); Pattern52 p1 = new Pattern52(); p1.setBoundName("p1"); p1.setFactType("Smurf"); dt.getConditions().add(p1); ConditionCol52 cc1 = new ConditionCol52(); cc1.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc1.setFieldType(DataType.TYPE_STRING); cc1.setFactField("name"); cc1.setOperator("in"); p1.getChildColumns().add(cc1); ConditionCol52 cc2 = new ConditionCol52(); cc2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc2.setFieldType(DataType.TYPE_NUMERIC_INTEGER); cc2.setFactField("age"); cc2.setOperator("in"); p1.getChildColumns().add(cc2); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{1l, "desc", "Pupa, Brains", "55, 66"}, new Object[]{2l, "desc", "", ""} })); GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dt); int index = -1; index = drl.indexOf("Smurf( name in ( \"Pupa\", \"Brains\" ) , age in ( 55, 66 ) )"); assertTrue(index > -1); index = drl.indexOf("Smurf( )", index + 1); assertFalse(index > -1); } @Test public void testLHSNotInOperator() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableFormat(GuidedDecisionTable52.TableFormat.EXTENDED_ENTRY); dt.setTableName("extended-entry"); Pattern52 p1 = new Pattern52(); p1.setBoundName("p1"); p1.setFactType("Smurf"); dt.getConditions().add(p1); ConditionCol52 cc1 = new ConditionCol52(); cc1.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc1.setFieldType(DataType.TYPE_STRING); cc1.setFactField("name"); cc1.setOperator("not in"); p1.getChildColumns().add(cc1); ConditionCol52 cc2 = new ConditionCol52(); cc2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc2.setFieldType(DataType.TYPE_NUMERIC_INTEGER); cc2.setFactField("age"); cc2.setOperator("not in"); p1.getChildColumns().add(cc2); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{1l, "desc", "Pupa, Brains", "55, 66"}, new Object[]{2l, "desc", "", ""} })); GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dt); int index = -1; index = drl.indexOf("Smurf( name not in ( \"Pupa\", \"Brains\" ) , age not in ( 55, 66 ) )"); assertTrue(index > -1); index = drl.indexOf("Smurf( )", index + 1); assertFalse(index > -1); } @Test public void testLimitedEntryLHSInOperator() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableFormat(GuidedDecisionTable52.TableFormat.LIMITED_ENTRY); dt.setTableName("limited-entry"); Pattern52 p1 = new Pattern52(); p1.setBoundName("p1"); p1.setFactType("Smurf"); dt.getConditions().add(p1); LimitedEntryConditionCol52 cc1 = new LimitedEntryConditionCol52(); cc1.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc1.setFieldType(DataType.TYPE_STRING); cc1.setFactField("name"); cc1.setOperator("in"); cc1.setValue(new DTCellValue52("Pupa, Brains")); p1.getChildColumns().add(cc1); LimitedEntryConditionCol52 cc2 = new LimitedEntryConditionCol52(); cc2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc2.setFieldType(DataType.TYPE_NUMERIC_INTEGER); cc2.setFactField("age"); cc2.setOperator("in"); cc2.setValue(new DTCellValue52("55, 66")); p1.getChildColumns().add(cc2); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{1l, "desc", true, true}, new Object[]{2l, "desc", false, false} })); GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dt); int index = -1; index = drl.indexOf("Smurf( name in ( \"Pupa\", \"Brains\" ) , age in ( 55, 66 ) )"); assertTrue(index > -1); index = drl.indexOf("Smurf( )", index + 1); assertFalse(index > -1); } @Test public void testLimitedEntryLHSNotInOperator() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableFormat(GuidedDecisionTable52.TableFormat.LIMITED_ENTRY); dt.setTableName("limited-entry"); Pattern52 p1 = new Pattern52(); p1.setBoundName("p1"); p1.setFactType("Smurf"); dt.getConditions().add(p1); LimitedEntryConditionCol52 cc1 = new LimitedEntryConditionCol52(); cc1.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc1.setFieldType(DataType.TYPE_STRING); cc1.setFactField("name"); cc1.setOperator("not in"); cc1.setValue(new DTCellValue52("Pupa, Brains")); p1.getChildColumns().add(cc1); LimitedEntryConditionCol52 cc2 = new LimitedEntryConditionCol52(); cc2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc2.setFieldType(DataType.TYPE_NUMERIC_INTEGER); cc2.setFactField("age"); cc2.setOperator("not in"); cc2.setValue(new DTCellValue52("55, 66")); p1.getChildColumns().add(cc2); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{1l, "desc", true, true}, new Object[]{2l, "desc", false, false} })); GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dt); int index = -1; index = drl.indexOf("Smurf( name not in ( \"Pupa\", \"Brains\" ) , age not in ( 55, 66 ) )"); assertTrue(index > -1); index = drl.indexOf("Smurf( )", index + 1); assertFalse(index > -1); } @Test public void testRHSExecuteWorkItem() { GuidedDTDRLPersistence p = new GuidedDTDRLPersistence(); String[] row = new String[]{"1", "desc", "true"}; List<BaseColumn> allColumns = new ArrayList<BaseColumn>(); allColumns.add(new RowNumberCol52()); allColumns.add(new DescriptionCol52()); List<ActionCol52> cols = new ArrayList<ActionCol52>(); ActionWorkItemCol52 awi = new ActionWorkItemCol52(); PortableWorkDefinition pwd = new PortableWorkDefinition(); pwd.setName("work-item"); awi.setWorkItemDefinition(pwd); PortableBooleanParameterDefinition p1 = new PortableBooleanParameterDefinition(); p1.setName("BooleanParameter"); p1.setValue(Boolean.TRUE); pwd.addParameter(p1); PortableFloatParameterDefinition p2 = new PortableFloatParameterDefinition(); p2.setName("FloatParameter"); p2.setValue(123.456f); pwd.addParameter(p2); PortableIntegerParameterDefinition p3 = new PortableIntegerParameterDefinition(); p3.setName("IntegerParameter"); p3.setValue(123); pwd.addParameter(p3); PortableStringParameterDefinition p4 = new PortableStringParameterDefinition(); p4.setName("StringParameter"); p4.setValue("hello"); pwd.addParameter(p4); cols.add(awi); RuleModel rm = new RuleModel(); allColumns.addAll(cols); List<DTCellValue52> rowData = DataUtilities.makeDataRowList(row); TemplateDataProvider rowDataProvider = new GuidedDTTemplateDataProvider(allColumns, rowData); p.doActions(allColumns, cols, rowDataProvider, rowData, rm); assertEquals(1, rm.rhs.length); //Examine RuleModel action ActionExecuteWorkItem aw = (ActionExecuteWorkItem) rm.rhs[0]; assertNotNull(aw); PortableWorkDefinition mpwd = aw.getWorkDefinition(); assertNotNull(mpwd); assertEquals(4, mpwd.getParameters().size()); PortableBooleanParameterDefinition mp1 = (PortableBooleanParameterDefinition) mpwd.getParameter("BooleanParameter"); assertNotNull(mp1); assertEquals(Boolean.TRUE, mp1.getValue()); PortableFloatParameterDefinition mp2 = (PortableFloatParameterDefinition) mpwd.getParameter("FloatParameter"); assertNotNull(mp2); assertEquals(new Float(123.456f), mp2.getValue()); PortableIntegerParameterDefinition mp3 = (PortableIntegerParameterDefinition) mpwd.getParameter("IntegerParameter"); assertNotNull(mp3); assertEquals(new Integer(123), mp3.getValue()); PortableStringParameterDefinition mp4 = (PortableStringParameterDefinition) mpwd.getParameter("StringParameter"); assertNotNull(mp4); assertEquals("hello", mp4.getValue()); } @Test public void testRHSExecuteWorkItemWithBindings() { GuidedDTDRLPersistence p = new GuidedDTDRLPersistence(); String[] row = new String[]{"1", "desc", "true"}; List<BaseColumn> allColumns = new ArrayList<BaseColumn>(); allColumns.add(new RowNumberCol52()); allColumns.add(new DescriptionCol52()); List<ActionCol52> cols = new ArrayList<ActionCol52>(); ActionWorkItemCol52 awi = new ActionWorkItemCol52(); PortableWorkDefinition pwd = new PortableWorkDefinition(); pwd.setName("work-item"); awi.setWorkItemDefinition(pwd); PortableBooleanParameterDefinition p1 = new PortableBooleanParameterDefinition(); p1.setName("BooleanParameter"); p1.setValue(Boolean.TRUE); p1.setBinding("$b"); pwd.addParameter(p1); PortableFloatParameterDefinition p2 = new PortableFloatParameterDefinition(); p2.setName("FloatParameter"); p2.setValue(123.456f); p2.setBinding("$f"); pwd.addParameter(p2); PortableIntegerParameterDefinition p3 = new PortableIntegerParameterDefinition(); p3.setName("IntegerParameter"); p3.setValue(123); p3.setBinding("$i"); pwd.addParameter(p3); PortableStringParameterDefinition p4 = new PortableStringParameterDefinition(); p4.setName("StringParameter"); p4.setValue("hello"); p4.setBinding("$s"); pwd.addParameter(p4); cols.add(awi); RuleModel rm = new RuleModel(); allColumns.addAll(cols); List<DTCellValue52> rowData = DataUtilities.makeDataRowList(row); TemplateDataProvider rowDataProvider = new GuidedDTTemplateDataProvider(allColumns, rowData); p.doActions(allColumns, cols, rowDataProvider, rowData, rm); assertEquals(1, rm.rhs.length); //Examine RuleModel action ActionExecuteWorkItem aw = (ActionExecuteWorkItem) rm.rhs[0]; assertNotNull(aw); PortableWorkDefinition mpwd = aw.getWorkDefinition(); assertNotNull(mpwd); assertEquals(4, mpwd.getParameters().size()); PortableBooleanParameterDefinition mp1 = (PortableBooleanParameterDefinition) mpwd.getParameter("BooleanParameter"); assertNotNull(mp1); assertEquals(Boolean.TRUE, mp1.getValue()); assertEquals("$b", mp1.getBinding()); PortableFloatParameterDefinition mp2 = (PortableFloatParameterDefinition) mpwd.getParameter("FloatParameter"); assertNotNull(mp2); assertEquals(new Float(123.456f), mp2.getValue()); assertEquals("$f", mp2.getBinding()); PortableIntegerParameterDefinition mp3 = (PortableIntegerParameterDefinition) mpwd.getParameter("IntegerParameter"); assertNotNull(mp3); assertEquals(new Integer(123), mp3.getValue()); assertEquals("$i", mp3.getBinding()); PortableStringParameterDefinition mp4 = (PortableStringParameterDefinition) mpwd.getParameter("StringParameter"); assertNotNull(mp4); assertEquals("hello", mp4.getValue()); assertEquals("$s", mp4.getBinding()); } @Test //Test all Actions setting fields are correctly converted to RuleModel public void testRHSActionWorkItemSetFields1() { GuidedDTDRLPersistence p = new GuidedDTDRLPersistence(); String[] row = new String[]{"1", "desc", "true", "true", "true", "true", "true"}; List<BaseColumn> allColumns = new ArrayList<BaseColumn>(); allColumns.add(new RowNumberCol52()); allColumns.add(new DescriptionCol52()); List<ActionCol52> cols = new ArrayList<ActionCol52>(); ActionWorkItemCol52 awi = new ActionWorkItemCol52(); PortableWorkDefinition pwd = new PortableWorkDefinition(); pwd.setName("WorkItem"); awi.setWorkItemDefinition(pwd); PortableBooleanParameterDefinition p1 = new PortableBooleanParameterDefinition(); p1.setName("BooleanResult"); pwd.addResult(p1); PortableFloatParameterDefinition p2 = new PortableFloatParameterDefinition(); p2.setName("FloatResult"); pwd.addResult(p2); PortableIntegerParameterDefinition p3 = new PortableIntegerParameterDefinition(); p3.setName("IntegerResult"); pwd.addResult(p3); PortableStringParameterDefinition p4 = new PortableStringParameterDefinition(); p4.setName("StringResult"); pwd.addResult(p4); cols.add(awi); ActionWorkItemSetFieldCol52 asf1 = new ActionWorkItemSetFieldCol52(); asf1.setBoundName("$r"); asf1.setFactField("ResultBooleanField"); asf1.setType(DataType.TYPE_BOOLEAN); asf1.setWorkItemName("WorkItem"); asf1.setWorkItemResultParameterName("BooleanResult"); asf1.setParameterClassName(Boolean.class.getName()); cols.add(asf1); ActionWorkItemSetFieldCol52 asf2 = new ActionWorkItemSetFieldCol52(); asf2.setBoundName("$r"); asf2.setFactField("ResultFloatField"); asf2.setType(DataType.TYPE_NUMERIC_FLOAT); asf2.setWorkItemName("WorkItem"); asf2.setWorkItemResultParameterName("FloatResult"); asf2.setParameterClassName(Float.class.getName()); cols.add(asf2); ActionWorkItemSetFieldCol52 asf3 = new ActionWorkItemSetFieldCol52(); asf3.setBoundName("$r"); asf3.setFactField("ResultIntegerField"); asf3.setType(DataType.TYPE_NUMERIC_INTEGER); asf3.setWorkItemName("WorkItem"); asf3.setWorkItemResultParameterName("IntegerResult"); asf3.setParameterClassName(Integer.class.getName()); cols.add(asf3); ActionWorkItemSetFieldCol52 asf4 = new ActionWorkItemSetFieldCol52(); asf4.setBoundName("$r"); asf4.setFactField("ResultStringField"); asf4.setType(DataType.TYPE_STRING); asf4.setWorkItemName("WorkItem"); asf4.setWorkItemResultParameterName("StringResult"); asf4.setParameterClassName(String.class.getName()); cols.add(asf4); RuleModel rm = new RuleModel(); allColumns.addAll(cols); List<DTCellValue52> rowData = DataUtilities.makeDataRowList(row); TemplateDataProvider rowDataProvider = new GuidedDTTemplateDataProvider(allColumns, rowData); p.doActions(allColumns, cols, rowDataProvider, rowData, rm); assertEquals(2, rm.rhs.length); //Examine RuleModel actions ActionExecuteWorkItem aw = (ActionExecuteWorkItem) rm.rhs[0]; assertNotNull(aw); ActionSetField asf = (ActionSetField) rm.rhs[1]; assertNotNull(asf); //Check ActionExecuteWorkItem PortableWorkDefinition mpwd = aw.getWorkDefinition(); assertNotNull(mpwd); assertEquals(4, mpwd.getResults().size()); PortableBooleanParameterDefinition mp1 = (PortableBooleanParameterDefinition) mpwd.getResult("BooleanResult"); assertNotNull(mp1); PortableFloatParameterDefinition mp2 = (PortableFloatParameterDefinition) mpwd.getResult("FloatResult"); assertNotNull(mp2); PortableIntegerParameterDefinition mp3 = (PortableIntegerParameterDefinition) mpwd.getResult("IntegerResult"); assertNotNull(mp3); PortableStringParameterDefinition mp4 = (PortableStringParameterDefinition) mpwd.getResult("StringResult"); assertNotNull(mp4); //Check ActionSetField assertEquals(asf.getVariable(), "$r"); assertEquals(4, asf.getFieldValues().length); ActionFieldValue fv1 = asf.getFieldValues()[0]; assertNotNull(fv1); assertTrue(fv1 instanceof ActionWorkItemFieldValue); ActionWorkItemFieldValue wifv1 = (ActionWorkItemFieldValue) fv1; assertEquals("ResultBooleanField", wifv1.getField()); assertEquals(DataType.TYPE_BOOLEAN, wifv1.getType()); assertEquals("WorkItem", wifv1.getWorkItemName()); assertEquals("BooleanResult", wifv1.getWorkItemParameterName()); assertEquals(Boolean.class.getName(), wifv1.getWorkItemParameterClassName()); ActionFieldValue fv2 = asf.getFieldValues()[1]; assertNotNull(fv2); assertTrue(fv2 instanceof ActionWorkItemFieldValue); ActionWorkItemFieldValue wifv2 = (ActionWorkItemFieldValue) fv2; assertEquals("ResultFloatField", wifv2.getField()); assertEquals(DataType.TYPE_NUMERIC_FLOAT, wifv2.getType()); assertEquals("WorkItem", wifv2.getWorkItemName()); assertEquals("FloatResult", wifv2.getWorkItemParameterName()); assertEquals(Float.class.getName(), wifv2.getWorkItemParameterClassName()); ActionFieldValue fv3 = asf.getFieldValues()[2]; assertNotNull(fv3); assertTrue(fv3 instanceof ActionWorkItemFieldValue); ActionWorkItemFieldValue wifv3 = (ActionWorkItemFieldValue) fv3; assertEquals("ResultIntegerField", wifv3.getField()); assertEquals(DataType.TYPE_NUMERIC_INTEGER, wifv3.getType()); assertEquals("WorkItem", wifv3.getWorkItemName()); assertEquals("IntegerResult", wifv3.getWorkItemParameterName()); assertEquals(Integer.class.getName(), wifv3.getWorkItemParameterClassName()); ActionFieldValue fv4 = asf.getFieldValues()[3]; assertNotNull(fv4); assertTrue(fv4 instanceof ActionWorkItemFieldValue); ActionWorkItemFieldValue wifv4 = (ActionWorkItemFieldValue) fv4; assertEquals("ResultStringField", wifv4.getField()); assertEquals(DataType.TYPE_STRING, wifv4.getType()); assertEquals("WorkItem", wifv4.getWorkItemName()); assertEquals("StringResult", wifv4.getWorkItemParameterName()); assertEquals(String.class.getName(), wifv4.getWorkItemParameterClassName()); } @Test //Test only Actions set to "true" are correctly converted to RuleModel public void testRHSActionWorkItemSetFields2() { GuidedDTDRLPersistence p = new GuidedDTDRLPersistence(); String[] row = new String[]{"1", "desc", "true", "true", "false"}; List<BaseColumn> allColumns = new ArrayList<BaseColumn>(); allColumns.add(new RowNumberCol52()); allColumns.add(new DescriptionCol52()); List<ActionCol52> cols = new ArrayList<ActionCol52>(); ActionWorkItemCol52 awi = new ActionWorkItemCol52(); PortableWorkDefinition pwd = new PortableWorkDefinition(); pwd.setName("WorkItem"); awi.setWorkItemDefinition(pwd); PortableBooleanParameterDefinition p1 = new PortableBooleanParameterDefinition(); p1.setName("BooleanResult"); pwd.addResult(p1); PortableFloatParameterDefinition p2 = new PortableFloatParameterDefinition(); p2.setName("FloatResult"); pwd.addResult(p2); cols.add(awi); ActionWorkItemSetFieldCol52 asf1 = new ActionWorkItemSetFieldCol52(); asf1.setBoundName("$r"); asf1.setFactField("ResultBooleanField"); asf1.setType(DataType.TYPE_BOOLEAN); asf1.setWorkItemName("WorkItem"); asf1.setWorkItemResultParameterName("BooleanResult"); asf1.setParameterClassName(Boolean.class.getName()); cols.add(asf1); ActionWorkItemSetFieldCol52 asf2 = new ActionWorkItemSetFieldCol52(); asf2.setBoundName("$r"); asf2.setFactField("ResultFloatField"); asf2.setType(DataType.TYPE_NUMERIC_FLOAT); asf2.setWorkItemName("WorkItem"); asf2.setWorkItemResultParameterName("FloatResult"); asf2.setParameterClassName(Float.class.getName()); cols.add(asf2); RuleModel rm = new RuleModel(); allColumns.addAll(cols); List<DTCellValue52> rowData = DataUtilities.makeDataRowList(row); TemplateDataProvider rowDataProvider = new GuidedDTTemplateDataProvider(allColumns, rowData); p.doActions(allColumns, cols, rowDataProvider, rowData, rm); assertEquals(2, rm.rhs.length); //Examine RuleModel actions ActionExecuteWorkItem aw = (ActionExecuteWorkItem) rm.rhs[0]; assertNotNull(aw); ActionSetField asf = (ActionSetField) rm.rhs[1]; assertNotNull(asf); //Check ActionExecuteWorkItem PortableWorkDefinition mpwd = aw.getWorkDefinition(); assertNotNull(mpwd); assertEquals(2, mpwd.getResults().size()); PortableBooleanParameterDefinition mp1 = (PortableBooleanParameterDefinition) mpwd.getResult("BooleanResult"); assertNotNull(mp1); PortableFloatParameterDefinition mp2 = (PortableFloatParameterDefinition) mpwd.getResult("FloatResult"); assertNotNull(mp2); //Check ActionSetField assertEquals(asf.getVariable(), "$r"); assertEquals(1, asf.getFieldValues().length); ActionFieldValue fv1 = asf.getFieldValues()[0]; assertNotNull(fv1); assertTrue(fv1 instanceof ActionWorkItemFieldValue); ActionWorkItemFieldValue wifv1 = (ActionWorkItemFieldValue) fv1; assertEquals("ResultBooleanField", wifv1.getField()); assertEquals(DataType.TYPE_BOOLEAN, wifv1.getType()); assertEquals("WorkItem", wifv1.getWorkItemName()); assertEquals("BooleanResult", wifv1.getWorkItemParameterName()); assertEquals(Boolean.class.getName(), wifv1.getWorkItemParameterClassName()); } @Test //Test all Actions inserting Facts are correctly converted to RuleModel public void testRHSActionWorkItemInsertFacts1() { GuidedDTDRLPersistence p = new GuidedDTDRLPersistence(); String[] row = new String[]{"1", "desc", "true", "true", "true", "true", "true"}; List<BaseColumn> allColumns = new ArrayList<BaseColumn>(); allColumns.add(new RowNumberCol52()); allColumns.add(new DescriptionCol52()); List<ActionCol52> cols = new ArrayList<ActionCol52>(); ActionWorkItemCol52 awi = new ActionWorkItemCol52(); PortableWorkDefinition pwd = new PortableWorkDefinition(); pwd.setName("WorkItem"); awi.setWorkItemDefinition(pwd); PortableBooleanParameterDefinition p1 = new PortableBooleanParameterDefinition(); p1.setName("BooleanResult"); pwd.addResult(p1); PortableFloatParameterDefinition p2 = new PortableFloatParameterDefinition(); p2.setName("FloatResult"); pwd.addResult(p2); PortableIntegerParameterDefinition p3 = new PortableIntegerParameterDefinition(); p3.setName("IntegerResult"); pwd.addResult(p3); PortableStringParameterDefinition p4 = new PortableStringParameterDefinition(); p4.setName("StringResult"); pwd.addResult(p4); cols.add(awi); ActionWorkItemInsertFactCol52 asf1 = new ActionWorkItemInsertFactCol52(); asf1.setBoundName("$r"); asf1.setFactField("ResultBooleanField"); asf1.setType(DataType.TYPE_BOOLEAN); asf1.setWorkItemName("WorkItem"); asf1.setWorkItemResultParameterName("BooleanResult"); asf1.setParameterClassName(Boolean.class.getName()); cols.add(asf1); ActionWorkItemInsertFactCol52 asf2 = new ActionWorkItemInsertFactCol52(); asf2.setBoundName("$r"); asf2.setFactField("ResultFloatField"); asf2.setType(DataType.TYPE_NUMERIC_FLOAT); asf2.setWorkItemName("WorkItem"); asf2.setWorkItemResultParameterName("FloatResult"); asf2.setParameterClassName(Float.class.getName()); cols.add(asf2); ActionWorkItemInsertFactCol52 asf3 = new ActionWorkItemInsertFactCol52(); asf3.setBoundName("$r"); asf3.setFactField("ResultIntegerField"); asf3.setType(DataType.TYPE_NUMERIC_INTEGER); asf3.setWorkItemName("WorkItem"); asf3.setWorkItemResultParameterName("IntegerResult"); asf3.setParameterClassName(Integer.class.getName()); cols.add(asf3); ActionWorkItemInsertFactCol52 asf4 = new ActionWorkItemInsertFactCol52(); asf4.setBoundName("$r"); asf4.setFactField("ResultStringField"); asf4.setType(DataType.TYPE_STRING); asf4.setWorkItemName("WorkItem"); asf4.setWorkItemResultParameterName("StringResult"); asf4.setParameterClassName(String.class.getName()); cols.add(asf4); RuleModel rm = new RuleModel(); allColumns.addAll(cols); List<DTCellValue52> rowData = DataUtilities.makeDataRowList(row); TemplateDataProvider rowDataProvider = new GuidedDTTemplateDataProvider(allColumns, rowData); p.doActions(allColumns, cols, rowDataProvider, rowData, rm); assertEquals(2, rm.rhs.length); //Examine RuleModel actions ActionExecuteWorkItem aw = (ActionExecuteWorkItem) rm.rhs[0]; assertNotNull(aw); ActionInsertFact aif = (ActionInsertFact) rm.rhs[1]; assertNotNull(aif); //Check ActionExecuteWorkItem PortableWorkDefinition mpwd = aw.getWorkDefinition(); assertNotNull(mpwd); assertEquals(4, mpwd.getResults().size()); PortableBooleanParameterDefinition mp1 = (PortableBooleanParameterDefinition) mpwd.getResult("BooleanResult"); assertNotNull(mp1); PortableFloatParameterDefinition mp2 = (PortableFloatParameterDefinition) mpwd.getResult("FloatResult"); assertNotNull(mp2); PortableIntegerParameterDefinition mp3 = (PortableIntegerParameterDefinition) mpwd.getResult("IntegerResult"); assertNotNull(mp3); PortableStringParameterDefinition mp4 = (PortableStringParameterDefinition) mpwd.getResult("StringResult"); assertNotNull(mp4); //Check ActionInsertFact assertEquals(aif.getBoundName(), "$r"); assertEquals(4, aif.getFieldValues().length); ActionFieldValue fv1 = aif.getFieldValues()[0]; assertNotNull(fv1); assertTrue(fv1 instanceof ActionWorkItemFieldValue); ActionWorkItemFieldValue wifv1 = (ActionWorkItemFieldValue) fv1; assertEquals("ResultBooleanField", wifv1.getField()); assertEquals(DataType.TYPE_BOOLEAN, wifv1.getType()); assertEquals("WorkItem", wifv1.getWorkItemName()); assertEquals("BooleanResult", wifv1.getWorkItemParameterName()); assertEquals(Boolean.class.getName(), wifv1.getWorkItemParameterClassName()); ActionFieldValue fv2 = aif.getFieldValues()[1]; assertNotNull(fv2); assertTrue(fv2 instanceof ActionWorkItemFieldValue); ActionWorkItemFieldValue wifv2 = (ActionWorkItemFieldValue) fv2; assertEquals("ResultFloatField", wifv2.getField()); assertEquals(DataType.TYPE_NUMERIC_FLOAT, wifv2.getType()); assertEquals("WorkItem", wifv2.getWorkItemName()); assertEquals("FloatResult", wifv2.getWorkItemParameterName()); assertEquals(Float.class.getName(), wifv2.getWorkItemParameterClassName()); ActionFieldValue fv3 = aif.getFieldValues()[2]; assertNotNull(fv3); assertTrue(fv3 instanceof ActionWorkItemFieldValue); ActionWorkItemFieldValue wifv3 = (ActionWorkItemFieldValue) fv3; assertEquals("ResultIntegerField", wifv3.getField()); assertEquals(DataType.TYPE_NUMERIC_INTEGER, wifv3.getType()); assertEquals("WorkItem", wifv3.getWorkItemName()); assertEquals("IntegerResult", wifv3.getWorkItemParameterName()); assertEquals(Integer.class.getName(), wifv3.getWorkItemParameterClassName()); ActionFieldValue fv4 = aif.getFieldValues()[3]; assertNotNull(fv4); assertTrue(fv4 instanceof ActionWorkItemFieldValue); ActionWorkItemFieldValue wifv4 = (ActionWorkItemFieldValue) fv4; assertEquals("ResultStringField", wifv4.getField()); assertEquals(DataType.TYPE_STRING, wifv4.getType()); assertEquals("WorkItem", wifv4.getWorkItemName()); assertEquals("StringResult", wifv4.getWorkItemParameterName()); assertEquals(String.class.getName(), wifv4.getWorkItemParameterClassName()); } @Test //Test only Actions set to "true" are correctly converted to RuleModel public void testRHSActionWorkItemInsertFacts2() { GuidedDTDRLPersistence p = new GuidedDTDRLPersistence(); String[] row = new String[]{"1", "desc", "true", "true", "false"}; List<BaseColumn> allColumns = new ArrayList<BaseColumn>(); allColumns.add(new RowNumberCol52()); allColumns.add(new DescriptionCol52()); List<ActionCol52> cols = new ArrayList<ActionCol52>(); ActionWorkItemCol52 awi = new ActionWorkItemCol52(); PortableWorkDefinition pwd = new PortableWorkDefinition(); pwd.setName("WorkItem"); awi.setWorkItemDefinition(pwd); PortableBooleanParameterDefinition p1 = new PortableBooleanParameterDefinition(); p1.setName("BooleanResult"); pwd.addResult(p1); PortableFloatParameterDefinition p2 = new PortableFloatParameterDefinition(); p2.setName("FloatResult"); pwd.addResult(p2); cols.add(awi); ActionWorkItemInsertFactCol52 asf1 = new ActionWorkItemInsertFactCol52(); asf1.setBoundName("$r"); asf1.setFactField("ResultBooleanField"); asf1.setType(DataType.TYPE_BOOLEAN); asf1.setWorkItemName("WorkItem"); asf1.setWorkItemResultParameterName("BooleanResult"); asf1.setParameterClassName(Boolean.class.getName()); cols.add(asf1); ActionWorkItemInsertFactCol52 asf2 = new ActionWorkItemInsertFactCol52(); asf2.setBoundName("$r"); asf2.setFactField("ResultFloatField"); asf2.setType(DataType.TYPE_NUMERIC_FLOAT); asf2.setWorkItemName("WorkItem"); asf2.setWorkItemResultParameterName("FloatResult"); asf2.setParameterClassName(Float.class.getName()); cols.add(asf2); RuleModel rm = new RuleModel(); allColumns.addAll(cols); List<DTCellValue52> rowData = DataUtilities.makeDataRowList(row); TemplateDataProvider rowDataProvider = new GuidedDTTemplateDataProvider(allColumns, rowData); p.doActions(allColumns, cols, rowDataProvider, rowData, rm); assertEquals(2, rm.rhs.length); //Examine RuleModel actions ActionExecuteWorkItem aw = (ActionExecuteWorkItem) rm.rhs[0]; assertNotNull(aw); ActionInsertFact aif = (ActionInsertFact) rm.rhs[1]; assertNotNull(aif); //Check ActionExecuteWorkItem PortableWorkDefinition mpwd = aw.getWorkDefinition(); assertNotNull(mpwd); assertEquals(2, mpwd.getResults().size()); PortableBooleanParameterDefinition mp1 = (PortableBooleanParameterDefinition) mpwd.getResult("BooleanResult"); assertNotNull(mp1); PortableFloatParameterDefinition mp2 = (PortableFloatParameterDefinition) mpwd.getResult("FloatResult"); assertNotNull(mp2); //Check ActionInsertFact assertEquals(aif.getBoundName(), "$r"); assertEquals(1, aif.getFieldValues().length); ActionFieldValue fv1 = aif.getFieldValues()[0]; assertNotNull(fv1); assertTrue(fv1 instanceof ActionWorkItemFieldValue); ActionWorkItemFieldValue wifv1 = (ActionWorkItemFieldValue) fv1; assertEquals("ResultBooleanField", wifv1.getField()); assertEquals(DataType.TYPE_BOOLEAN, wifv1.getType()); assertEquals("WorkItem", wifv1.getWorkItemName()); assertEquals("BooleanResult", wifv1.getWorkItemParameterName()); assertEquals(Boolean.class.getName(), wifv1.getWorkItemParameterClassName()); } @Test //This test checks a Decision Table involving BRL columns is correctly converted into a RuleModel public void testLHSWithBRLColumn_ParseToRuleModel() { GuidedDecisionTable52 dtable = new GuidedDecisionTable52(); GuidedDTDRLPersistence p = new GuidedDTDRLPersistence(); // All 3 rows should render, as the code is now lower down for skipping columns with empty cells String[][] data = new String[][]{ new String[]{"1", "desc", "Gargamel", "Pupa", "50"}, new String[]{"2", "desc", "Gargamel", "", "50"}, new String[]{"3", "desc", "Gargamel", "Pupa", ""} }; //Simple (mandatory) columns dtable.setRowNumberCol(new RowNumberCol52()); dtable.setDescriptionCol(new DescriptionCol52()); //Simple Condition Pattern52 p1 = new Pattern52(); p1.setFactType("Baddie"); ConditionCol52 con = new ConditionCol52(); con.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); con.setFactField("name"); con.setOperator("=="); p1.getChildColumns().add(con); dtable.getConditions().add(p1); //BRL Column BRLConditionColumn brl1 = new BRLConditionColumn(); //BRL Column definition List<IPattern> brl1Definition = new ArrayList<IPattern>(); FactPattern brl1DefinitionFactPattern1 = new FactPattern("Smurf"); SingleFieldConstraint brl1DefinitionFactPattern1Constraint1 = new SingleFieldConstraint(); brl1DefinitionFactPattern1Constraint1.setFieldType(DataType.TYPE_STRING); brl1DefinitionFactPattern1Constraint1.setConstraintValueType(SingleFieldConstraint.TYPE_TEMPLATE); brl1DefinitionFactPattern1Constraint1.setFieldName("name"); brl1DefinitionFactPattern1Constraint1.setOperator("=="); brl1DefinitionFactPattern1Constraint1.setValue("$name"); brl1DefinitionFactPattern1.addConstraint(brl1DefinitionFactPattern1Constraint1); SingleFieldConstraint brl1DefinitionFactPattern1Constraint2 = new SingleFieldConstraint(); brl1DefinitionFactPattern1Constraint2.setFieldType(DataType.TYPE_NUMERIC_INTEGER); brl1DefinitionFactPattern1Constraint2.setConstraintValueType(SingleFieldConstraint.TYPE_TEMPLATE); brl1DefinitionFactPattern1Constraint2.setFieldName("age"); brl1DefinitionFactPattern1Constraint2.setOperator("=="); brl1DefinitionFactPattern1Constraint2.setValue("$age"); brl1DefinitionFactPattern1.addConstraint(brl1DefinitionFactPattern1Constraint2); brl1Definition.add(brl1DefinitionFactPattern1); brl1.setDefinition(brl1Definition); //Setup BRL column bindings BRLConditionVariableColumn brl1Variable1 = new BRLConditionVariableColumn("$name", DataType.TYPE_STRING, "Person", "name"); brl1.getChildColumns().add(brl1Variable1); BRLConditionVariableColumn brl1Variable2 = new BRLConditionVariableColumn("$age", DataType.TYPE_NUMERIC_INTEGER, "Person", "age"); brl1.getChildColumns().add(brl1Variable2); dtable.getConditions().add(brl1); //Now to test conversion RuleModel rm = new RuleModel(); List<BaseColumn> allColumns = dtable.getExpandedColumns(); List<CompositeColumn<? extends BaseColumn>> allPatterns = dtable.getConditions(); List<List<DTCellValue52>> dtData = DataUtilities.makeDataLists(data); //Row 0 List<DTCellValue52> dtRowData0 = DataUtilities.makeDataRowList(data[0]); TemplateDataProvider rowDataProvider0 = new GuidedDTTemplateDataProvider(allColumns, dtRowData0); p.doConditions(allColumns, allPatterns, rowDataProvider0, dtRowData0, dtData, rm); assertEquals(2, rm.lhs.length); assertEquals("Baddie", ((FactPattern) rm.lhs[0]).getFactType()); assertEquals("Smurf", ((FactPattern) rm.lhs[1]).getFactType()); // examine the first pattern FactPattern result0Fp1 = (FactPattern) rm.lhs[0]; assertEquals(1, result0Fp1.getConstraintList().getConstraints().length); SingleFieldConstraint result0Fp1Con1 = (SingleFieldConstraint) result0Fp1.getConstraint(0); assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL, result0Fp1Con1.getConstraintValueType()); assertEquals("name", result0Fp1Con1.getFieldName()); assertEquals("==", result0Fp1Con1.getOperator()); assertEquals("Gargamel", result0Fp1Con1.getValue()); // examine the second pattern FactPattern result0Fp2 = (FactPattern) rm.lhs[1]; assertEquals(2, result0Fp2.getConstraintList().getConstraints().length); SingleFieldConstraint result0Fp2Con1 = (SingleFieldConstraint) result0Fp2.getConstraint(0); assertEquals(BaseSingleFieldConstraint.TYPE_TEMPLATE, result0Fp2Con1.getConstraintValueType()); assertEquals("name", result0Fp2Con1.getFieldName()); assertEquals("==", result0Fp2Con1.getOperator()); assertEquals("$name", result0Fp2Con1.getValue()); SingleFieldConstraint result0Fp2Con2 = (SingleFieldConstraint) result0Fp2.getConstraint(1); assertEquals(BaseSingleFieldConstraint.TYPE_TEMPLATE, result0Fp2Con2.getConstraintValueType()); assertEquals("age", result0Fp2Con2.getFieldName()); assertEquals("==", result0Fp2Con2.getOperator()); assertEquals("$age", result0Fp2Con2.getValue()); //Row 1 List<DTCellValue52> dtRowData1 = DataUtilities.makeDataRowList(data[1]); TemplateDataProvider rowDataProvider1 = new GuidedDTTemplateDataProvider(allColumns, dtRowData1); p.doConditions(allColumns, allPatterns, rowDataProvider1, dtRowData1, dtData, rm); assertEquals(2, rm.lhs.length); assertEquals("Baddie", ((FactPattern) rm.lhs[0]).getFactType()); // examine the first pattern FactPattern result1Fp1 = (FactPattern) rm.lhs[0]; assertEquals(1, result1Fp1.getConstraintList().getConstraints().length); SingleFieldConstraint result1Fp1Con1 = (SingleFieldConstraint) result1Fp1.getConstraint(0); assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL, result1Fp1Con1.getConstraintValueType()); assertEquals("name", result1Fp1Con1.getFieldName()); assertEquals("==", result1Fp1Con1.getOperator()); assertEquals("Gargamel", result1Fp1Con1.getValue()); // examine the second pattern FactPattern result1Fp2 = (FactPattern) rm.lhs[1]; assertEquals(2, result1Fp2.getConstraintList().getConstraints().length); SingleFieldConstraint result1Fp2Con1 = (SingleFieldConstraint) result1Fp2.getConstraint(0); assertEquals(BaseSingleFieldConstraint.TYPE_TEMPLATE, result1Fp2Con1.getConstraintValueType()); assertEquals("name", result1Fp2Con1.getFieldName()); assertEquals("==", result1Fp2Con1.getOperator()); assertEquals("$name", result1Fp2Con1.getValue()); SingleFieldConstraint result1Fp2Con2 = (SingleFieldConstraint) result1Fp2.getConstraint(1); assertEquals(BaseSingleFieldConstraint.TYPE_TEMPLATE, result1Fp2Con2.getConstraintValueType()); assertEquals("age", result1Fp2Con2.getFieldName()); assertEquals("==", result1Fp2Con2.getOperator()); assertEquals("$age", result1Fp2Con2.getValue()); //Row 2 List<DTCellValue52> dtRowData2 = DataUtilities.makeDataRowList(data[2]); TemplateDataProvider rowDataProvider2 = new GuidedDTTemplateDataProvider(allColumns, dtRowData2); p.doConditions(allColumns, allPatterns, rowDataProvider2, dtRowData2, dtData, rm); assertEquals(2, rm.lhs.length); assertEquals("Baddie", ((FactPattern) rm.lhs[0]).getFactType()); // examine the first pattern FactPattern result2Fp1 = (FactPattern) rm.lhs[0]; assertEquals(1, result2Fp1.getConstraintList().getConstraints().length); SingleFieldConstraint result2Fp1Con1 = (SingleFieldConstraint) result2Fp1.getConstraint(0); assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL, result2Fp1Con1.getConstraintValueType()); assertEquals("name", result2Fp1Con1.getFieldName()); assertEquals("==", result2Fp1Con1.getOperator()); assertEquals("Gargamel", result2Fp1Con1.getValue()); // examine the second pattern FactPattern result2Fp2 = (FactPattern) rm.lhs[1]; assertEquals(2, result2Fp2.getConstraintList().getConstraints().length); SingleFieldConstraint result2Fp2Con1 = (SingleFieldConstraint) result2Fp2.getConstraint(0); assertEquals(BaseSingleFieldConstraint.TYPE_TEMPLATE, result2Fp2Con1.getConstraintValueType()); assertEquals("name", result2Fp2Con1.getFieldName()); assertEquals("==", result2Fp2Con1.getOperator()); assertEquals("$name", result2Fp2Con1.getValue()); SingleFieldConstraint result2Fp2Con2 = (SingleFieldConstraint) result2Fp2.getConstraint(1); assertEquals(BaseSingleFieldConstraint.TYPE_TEMPLATE, result2Fp2Con2.getConstraintValueType()); assertEquals("age", result2Fp2Con2.getFieldName()); assertEquals("==", result2Fp2Con2.getOperator()); assertEquals("$age", result2Fp2Con2.getValue()); } @Test //This test checks a Decision Table involving BRL columns is correctly converted into DRL public void testLHSWithBRLColumn_ParseToDRL() { GuidedDecisionTable52 dtable = new GuidedDecisionTable52(); // All 3 rows should render, as the code is now lower down for skipping columns with empty cells String[][] data = new String[][]{ new String[]{"1", "desc", "Gargamel", "Pupa", "50"}, new String[]{"2", "desc", "Gargamel", "", "50"}, new String[]{"3", "desc", "Gargamel", "Pupa", ""} }; //Simple (mandatory) columns dtable.setRowNumberCol(new RowNumberCol52()); dtable.setDescriptionCol(new DescriptionCol52()); //Simple Condition Pattern52 p1 = new Pattern52(); p1.setFactType("Baddie"); ConditionCol52 con = new ConditionCol52(); con.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); con.setFactField("name"); con.setOperator("=="); p1.getChildColumns().add(con); dtable.getConditions().add(p1); //BRL Column BRLConditionColumn brl1 = new BRLConditionColumn(); //BRL Column definition List<IPattern> brl1Definition = new ArrayList<IPattern>(); FactPattern brl1DefinitionFactPattern1 = new FactPattern("Smurf"); SingleFieldConstraint brl1DefinitionFactPattern1Constraint1 = new SingleFieldConstraint(); brl1DefinitionFactPattern1Constraint1.setFieldType(DataType.TYPE_STRING); brl1DefinitionFactPattern1Constraint1.setConstraintValueType(SingleFieldConstraint.TYPE_TEMPLATE); brl1DefinitionFactPattern1Constraint1.setFieldName("name"); brl1DefinitionFactPattern1Constraint1.setOperator("=="); brl1DefinitionFactPattern1Constraint1.setValue("$name"); brl1DefinitionFactPattern1.addConstraint(brl1DefinitionFactPattern1Constraint1); SingleFieldConstraint brl1DefinitionFactPattern1Constraint2 = new SingleFieldConstraint(); brl1DefinitionFactPattern1Constraint2.setFieldType(DataType.TYPE_NUMERIC_INTEGER); brl1DefinitionFactPattern1Constraint2.setConstraintValueType(SingleFieldConstraint.TYPE_TEMPLATE); brl1DefinitionFactPattern1Constraint2.setFieldName("age"); brl1DefinitionFactPattern1Constraint2.setOperator("=="); brl1DefinitionFactPattern1Constraint2.setValue("$age"); brl1DefinitionFactPattern1.addConstraint(brl1DefinitionFactPattern1Constraint2); brl1Definition.add(brl1DefinitionFactPattern1); brl1.setDefinition(brl1Definition); //Setup BRL column bindings BRLConditionVariableColumn brl1Variable1 = new BRLConditionVariableColumn("$name", DataType.TYPE_STRING, "Person", "name"); brl1.getChildColumns().add(brl1Variable1); BRLConditionVariableColumn brl1Variable2 = new BRLConditionVariableColumn("$age", DataType.TYPE_NUMERIC_INTEGER, "Person", "age"); brl1.getChildColumns().add(brl1Variable2); dtable.getConditions().add(brl1); dtable.setData(DataUtilities.makeDataLists(data)); //Now to test conversion int ruleStartIndex; int pattern1StartIndex; int pattern2StartIndex; GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dtable); System.out.println(drl); //Row 0 ruleStartIndex = drl.indexOf("//from row number: 1"); assertFalse(ruleStartIndex == -1); pattern1StartIndex = drl.indexOf("Baddie( name == \"Gargamel\" )", ruleStartIndex); assertFalse(pattern1StartIndex == -1); pattern2StartIndex = drl.indexOf("Smurf( name == \"Pupa\" , age == 50 )", ruleStartIndex); assertFalse(pattern2StartIndex == -1); //Row 1 ruleStartIndex = drl.indexOf("//from row number: 2"); assertFalse(ruleStartIndex == -1); pattern1StartIndex = drl.indexOf("Baddie( name == \"Gargamel\" )", ruleStartIndex); assertFalse(pattern1StartIndex == -1); pattern2StartIndex = drl.indexOf("Smurf( age == 50 )", ruleStartIndex); assertFalse(pattern2StartIndex == -1); //Row 2 ruleStartIndex = drl.indexOf("//from row number: 3"); assertFalse(ruleStartIndex == -1); pattern1StartIndex = drl.indexOf("Baddie( name == \"Gargamel\" )", ruleStartIndex); assertFalse(pattern1StartIndex == -1); pattern2StartIndex = drl.indexOf("Smurf( name == \"Pupa\" )", ruleStartIndex); assertFalse(pattern2StartIndex == -1); } @Test //This test checks a Decision Table involving BRL columns is correctly converted into DRL public void testLHSWithBRLColumn_ParseToDRL_MultiplePatterns() { GuidedDecisionTable52 dtable = new GuidedDecisionTable52(); // All 3 rows should render, as the code is now lower down for skipping columns with empty cells String[][] data = new String[][]{ new String[]{"1", "desc", "Pupa", "50"}, new String[]{"2", "desc", "", "50"}, new String[]{"3", "desc", "Pupa", ""} }; //Simple (mandatory) columns dtable.setRowNumberCol(new RowNumberCol52()); dtable.setDescriptionCol(new DescriptionCol52()); //BRL Column BRLConditionColumn brl1 = new BRLConditionColumn(); //BRL Column definition List<IPattern> brl1Definition = new ArrayList<IPattern>(); FactPattern brl1DefinitionFactPattern1 = new FactPattern("Baddie"); SingleFieldConstraint brl1DefinitionFactPattern1Constraint1 = new SingleFieldConstraint(); brl1DefinitionFactPattern1Constraint1.setFieldType(DataType.TYPE_STRING); brl1DefinitionFactPattern1Constraint1.setConstraintValueType(SingleFieldConstraint.TYPE_LITERAL); brl1DefinitionFactPattern1Constraint1.setFieldName("name"); brl1DefinitionFactPattern1Constraint1.setOperator("=="); brl1DefinitionFactPattern1Constraint1.setValue("Gargamel"); brl1DefinitionFactPattern1.addConstraint(brl1DefinitionFactPattern1Constraint1); brl1Definition.add(brl1DefinitionFactPattern1); FactPattern brl1DefinitionFactPattern2 = new FactPattern("Smurf"); SingleFieldConstraint brl1DefinitionFactPattern2Constraint1 = new SingleFieldConstraint(); brl1DefinitionFactPattern2Constraint1.setFieldType(DataType.TYPE_STRING); brl1DefinitionFactPattern2Constraint1.setConstraintValueType(SingleFieldConstraint.TYPE_TEMPLATE); brl1DefinitionFactPattern2Constraint1.setFieldName("name"); brl1DefinitionFactPattern2Constraint1.setOperator("=="); brl1DefinitionFactPattern2Constraint1.setValue("$name"); brl1DefinitionFactPattern2.addConstraint(brl1DefinitionFactPattern2Constraint1); SingleFieldConstraint brl1DefinitionFactPattern2Constraint2 = new SingleFieldConstraint(); brl1DefinitionFactPattern2Constraint2.setFieldType(DataType.TYPE_NUMERIC_INTEGER); brl1DefinitionFactPattern2Constraint2.setConstraintValueType(SingleFieldConstraint.TYPE_TEMPLATE); brl1DefinitionFactPattern2Constraint2.setFieldName("age"); brl1DefinitionFactPattern2Constraint2.setOperator("=="); brl1DefinitionFactPattern2Constraint2.setValue("$age"); brl1DefinitionFactPattern2.addConstraint(brl1DefinitionFactPattern2Constraint2); brl1Definition.add(brl1DefinitionFactPattern2); brl1.setDefinition(brl1Definition); //Setup BRL column bindings BRLConditionVariableColumn brl1Variable1 = new BRLConditionVariableColumn("$name", DataType.TYPE_STRING, "Person", "name"); brl1.getChildColumns().add(brl1Variable1); BRLConditionVariableColumn brl1Variable2 = new BRLConditionVariableColumn("$age", DataType.TYPE_NUMERIC_INTEGER, "Person", "age"); brl1.getChildColumns().add(brl1Variable2); dtable.getConditions().add(brl1); dtable.setData(DataUtilities.makeDataLists(data)); //Now to test conversion int ruleStartIndex; int pattern1StartIndex; int pattern2StartIndex; GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dtable); System.out.println(drl); //Row 0 ruleStartIndex = drl.indexOf("//from row number: 1"); assertFalse(ruleStartIndex == -1); pattern1StartIndex = drl.indexOf("Baddie( name == \"Gargamel\" )", ruleStartIndex); assertFalse(pattern1StartIndex == -1); pattern2StartIndex = drl.indexOf("Smurf( name == \"Pupa\" , age == 50 )", ruleStartIndex); assertFalse(pattern2StartIndex == -1); //Row 1 ruleStartIndex = drl.indexOf("//from row number: 2"); assertFalse(ruleStartIndex == -1); pattern1StartIndex = drl.indexOf("Baddie( name == \"Gargamel\" )", ruleStartIndex); assertFalse(pattern1StartIndex == -1); pattern2StartIndex = drl.indexOf("Smurf( age == 50 )", ruleStartIndex); assertFalse(pattern2StartIndex == -1); //Row 2 ruleStartIndex = drl.indexOf("//from row number: 3"); assertFalse(ruleStartIndex == -1); pattern1StartIndex = drl.indexOf("Baddie( name == \"Gargamel\" )", ruleStartIndex); assertFalse(pattern1StartIndex == -1); pattern2StartIndex = drl.indexOf("Smurf( name == \"Pupa\" )", ruleStartIndex); assertFalse(pattern2StartIndex == -1); } @Test //This test checks a Decision Table involving BRL columns is correctly converted into DRL public void testLHSWithBRLColumn_ParseToDRL_NoVariables() { GuidedDecisionTable52 dtable = new GuidedDecisionTable52(); //Row 0 should become an IPattern in the resulting RuleModel as it contains getValue()s for all Template fields in the BRL Column //Row 1 should *NOT* become an IPattern in the resulting RuleModel as it does *NOT* contain getValue()s for all Template fields in the BRL Column Object[][] data = new Object[][]{ new Object[]{"1", "desc", Boolean.TRUE}, new Object[]{"2", "desc", Boolean.FALSE} }; //Simple (mandatory) columns dtable.setRowNumberCol(new RowNumberCol52()); dtable.setDescriptionCol(new DescriptionCol52()); //BRL Column BRLConditionColumn brl1 = new BRLConditionColumn(); //BRL Column definition List<IPattern> brl1Definition = new ArrayList<IPattern>(); FactPattern brl1DefinitionFactPattern1 = new FactPattern("Baddie"); SingleFieldConstraint brl1DefinitionFactPattern1Constraint1 = new SingleFieldConstraint(); brl1DefinitionFactPattern1Constraint1.setFieldType(DataType.TYPE_STRING); brl1DefinitionFactPattern1Constraint1.setConstraintValueType(SingleFieldConstraint.TYPE_LITERAL); brl1DefinitionFactPattern1Constraint1.setFieldName("name"); brl1DefinitionFactPattern1Constraint1.setOperator("=="); brl1DefinitionFactPattern1Constraint1.setValue("Gargamel"); brl1DefinitionFactPattern1.addConstraint(brl1DefinitionFactPattern1Constraint1); brl1Definition.add(brl1DefinitionFactPattern1); brl1.setDefinition(brl1Definition); //Setup BRL column bindings BRLConditionVariableColumn brl1Variable1 = new BRLConditionVariableColumn("", DataType.TYPE_BOOLEAN); brl1.getChildColumns().add(brl1Variable1); dtable.getConditions().add(brl1); dtable.setData(DataUtilities.makeDataLists(data)); //Now to test conversion int ruleStartIndex; int pattern1StartIndex; GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dtable); //Row 0 ruleStartIndex = drl.indexOf("//from row number: 1"); assertFalse(ruleStartIndex == -1); pattern1StartIndex = drl.indexOf("Baddie( name == \"Gargamel\" )", ruleStartIndex); assertFalse(pattern1StartIndex == -1); //Row 1 ruleStartIndex = drl.indexOf("//from row number: 2"); assertFalse(ruleStartIndex == -1); pattern1StartIndex = drl.indexOf("Baddie( name == \"Gargamel\" )", ruleStartIndex); assertTrue(pattern1StartIndex == -1); } @Test //This test checks a Decision Table involving BRL columns is correctly converted into DRL public void testLHSWithBRLColumn_ParseToDRL_FreeFormLine() { GuidedDecisionTable52 dtable = new GuidedDecisionTable52(); //Row 0 should become an IPattern in the resulting RuleModel as it contains values for all Template fields in the BRL Column //Row 1 should *NOT* become an IPattern in the resulting RuleModel as it does *NOT* contain values for all Template fields in the BRL Column //Row 2 should *NOT* become an IPattern in the resulting RuleModel as it does *NOT* contain values for all Template fields in the BRL Column //Row 3 should *NOT* become an IPattern in the resulting RuleModel as it does *NOT* contain values for all Template fields in the BRL Column String[][] data = new String[][]{ new String[]{"1", "desc", "Pupa", "50"}, new String[]{"2", "desc", "", "50"}, new String[]{"3", "desc", "Pupa", ""}, new String[]{"4", "desc", "", ""} }; //Simple (mandatory) columns dtable.setRowNumberCol(new RowNumberCol52()); dtable.setDescriptionCol(new DescriptionCol52()); //BRL Column BRLConditionColumn brl1 = new BRLConditionColumn(); //BRL Column definition List<IPattern> brl1Definition = new ArrayList<IPattern>(); FreeFormLine brl1DefinitionFreeFormLine = new FreeFormLine(); brl1DefinitionFreeFormLine.setText("Smurf( name == \"@{name}\", age == @{age} )"); brl1Definition.add(brl1DefinitionFreeFormLine); brl1.setDefinition(brl1Definition); //Setup BRL column bindings BRLConditionVariableColumn brl1Variable1 = new BRLConditionVariableColumn("name", DataType.TYPE_STRING); BRLConditionVariableColumn brl1Variable2 = new BRLConditionVariableColumn("age", DataType.TYPE_NUMERIC_INTEGER); brl1.getChildColumns().add(brl1Variable1); brl1.getChildColumns().add(brl1Variable2); dtable.getConditions().add(brl1); dtable.setData(DataUtilities.makeDataLists(data)); //Now to test conversion int ruleStartIndex; int pattern1StartIndex; GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dtable); //Row 0 ruleStartIndex = drl.indexOf("//from row number: 1"); assertFalse(ruleStartIndex == -1); pattern1StartIndex = drl.indexOf("Smurf( name == \"Pupa\", age == 50 )", ruleStartIndex); assertFalse(pattern1StartIndex == -1); //Row 1 ruleStartIndex = drl.indexOf("//from row number: 2"); assertFalse(ruleStartIndex == -1); pattern1StartIndex = drl.indexOf("Smurf(", ruleStartIndex); assertTrue(pattern1StartIndex == -1); //Row 2 ruleStartIndex = drl.indexOf("//from row number: 3"); assertFalse(ruleStartIndex == -1); pattern1StartIndex = drl.indexOf("Smurf(", ruleStartIndex); assertTrue(pattern1StartIndex == -1); //Row 3 ruleStartIndex = drl.indexOf("//from row number: 4"); assertFalse(ruleStartIndex == -1); pattern1StartIndex = drl.indexOf("Smurf(", ruleStartIndex); assertTrue(pattern1StartIndex == -1); } @Test //This test checks a Decision Table involving BRL columns is correctly converted into a RuleModel public void testRHSWithBRLColumn_ParseToRuleModel() { GuidedDecisionTable52 dtable = new GuidedDecisionTable52(); GuidedDTDRLPersistence p = new GuidedDTDRLPersistence(); // All three rows are entered, some columns with optional data String[][] data = new String[][]{ new String[]{"1", "desc", "Gargamel", "Pupa", "50"}, new String[]{"2", "desc", "Gargamel", "", "50"}, new String[]{"3", "desc", "Gargamel", "Pupa", ""} }; //Simple (mandatory) columns dtable.setRowNumberCol(new RowNumberCol52()); dtable.setDescriptionCol(new DescriptionCol52()); //Simple Action ActionInsertFactCol52 a1 = new ActionInsertFactCol52(); a1.setBoundName("$b"); a1.setFactType("Baddie"); a1.setFactField("name"); a1.setType(DataType.TYPE_STRING); dtable.getActionCols().add(a1); //BRL Column BRLActionColumn brl1 = new BRLActionColumn(); //BRL Column definition List<IAction> brl1Definition = new ArrayList<IAction>(); ActionInsertFact brl1DefinitionAction1 = new ActionInsertFact("Smurf"); ActionFieldValue brl1DefinitionAction1FieldValue1 = new ActionFieldValue("name", "$name", DataType.TYPE_STRING); brl1DefinitionAction1FieldValue1.setNature(BaseSingleFieldConstraint.TYPE_TEMPLATE); brl1DefinitionAction1.addFieldValue(brl1DefinitionAction1FieldValue1); ActionFieldValue brl1DefinitionAction1FieldValue2 = new ActionFieldValue("age", "$age", DataType.TYPE_NUMERIC_INTEGER); brl1DefinitionAction1FieldValue2.setNature(BaseSingleFieldConstraint.TYPE_TEMPLATE); brl1DefinitionAction1.addFieldValue(brl1DefinitionAction1FieldValue2); brl1Definition.add(brl1DefinitionAction1); brl1.setDefinition(brl1Definition); //Setup BRL column bindings BRLActionVariableColumn brl1Variable1 = new BRLActionVariableColumn("$name", DataType.TYPE_STRING, "Person", "name"); brl1.getChildColumns().add(brl1Variable1); BRLActionVariableColumn brl1Variable2 = new BRLActionVariableColumn("$age", DataType.TYPE_NUMERIC_INTEGER, "Person", "age"); brl1.getChildColumns().add(brl1Variable2); dtable.getActionCols().add(brl1); //Now to test conversion RuleModel rm = new RuleModel(); List<BaseColumn> allColumns = dtable.getExpandedColumns(); List<ActionCol52> allActions = dtable.getActionCols(); //Row 0 List<DTCellValue52> dtRowData0 = DataUtilities.makeDataRowList(data[0]); TemplateDataProvider rowDataProvider0 = new GuidedDTTemplateDataProvider(allColumns, dtRowData0); p.doActions(allColumns, allActions, rowDataProvider0, dtRowData0, rm); assertEquals(2, rm.rhs.length); assertEquals("Baddie", ((ActionInsertFact) rm.rhs[0]).getFactType()); assertEquals("Smurf", ((ActionInsertFact) rm.rhs[1]).getFactType()); // examine the first action ActionInsertFact result0Action1 = (ActionInsertFact) rm.rhs[0]; assertEquals(1, result0Action1.getFieldValues().length); ActionFieldValue result0Action1FieldValue1 = (ActionFieldValue) result0Action1.getFieldValues()[0]; assertEquals(DataType.TYPE_STRING, result0Action1FieldValue1.getType()); assertEquals("name", result0Action1FieldValue1.getField()); assertEquals("Gargamel", result0Action1FieldValue1.getValue()); // examine the second action ActionInsertFact result0Action2 = (ActionInsertFact) rm.rhs[1]; assertEquals(2, result0Action2.getFieldValues().length); ActionFieldValue result0Action2FieldValue1 = (ActionFieldValue) result0Action2.getFieldValues()[0]; assertEquals(DataType.TYPE_STRING, result0Action2FieldValue1.getType()); assertEquals("name", result0Action2FieldValue1.getField()); assertEquals("$name", result0Action2FieldValue1.getValue()); ActionFieldValue result0Action2FieldValue2 = (ActionFieldValue) result0Action2.getFieldValues()[1]; assertEquals(DataType.TYPE_NUMERIC_INTEGER, result0Action2FieldValue2.getType()); assertEquals("age", result0Action2FieldValue2.getField()); assertEquals("$age", result0Action2FieldValue2.getValue()); //Row 1 List<DTCellValue52> dtRowData1 = DataUtilities.makeDataRowList(data[1]); TemplateDataProvider rowDataProvider1 = new GuidedDTTemplateDataProvider(allColumns, dtRowData1); p.doActions(allColumns, allActions, rowDataProvider1, dtRowData1, rm); assertEquals(2, rm.rhs.length); assertEquals("Baddie", ((ActionInsertFact) rm.rhs[0]).getFactType()); assertEquals("Smurf", ((ActionInsertFact) rm.rhs[1]).getFactType()); // examine the first action ActionInsertFact result1Action1 = (ActionInsertFact) rm.rhs[0]; assertEquals(1, result1Action1.getFieldValues().length); ActionFieldValue result1Action1FieldValue1 = (ActionFieldValue) result1Action1.getFieldValues()[0]; assertEquals(DataType.TYPE_STRING, result1Action1FieldValue1.getType()); assertEquals("name", result1Action1FieldValue1.getField()); assertEquals("Gargamel", result1Action1FieldValue1.getValue()); // examine the second action ActionInsertFact result1Action2 = (ActionInsertFact) rm.rhs[1]; assertEquals(2, result1Action2.getFieldValues().length); ActionFieldValue result1Action2FieldValue1 = (ActionFieldValue) result1Action2.getFieldValues()[0]; assertEquals(DataType.TYPE_STRING, result1Action2FieldValue1.getType()); assertEquals("name", result1Action2FieldValue1.getField()); assertEquals("$name", result1Action2FieldValue1.getValue()); ActionFieldValue result1Action2FieldValue2 = (ActionFieldValue) result1Action2.getFieldValues()[1]; assertEquals(DataType.TYPE_NUMERIC_INTEGER, result1Action2FieldValue2.getType()); assertEquals("age", result1Action2FieldValue2.getField()); assertEquals("$age", result1Action2FieldValue2.getValue()); //Row 2 List<DTCellValue52> dtRowData2 = DataUtilities.makeDataRowList(data[2]); TemplateDataProvider rowDataProvider2 = new GuidedDTTemplateDataProvider(allColumns, dtRowData2); p.doActions(allColumns, allActions, rowDataProvider2, dtRowData2, rm); assertEquals(2, rm.rhs.length); assertEquals("Baddie", ((ActionInsertFact) rm.rhs[0]).getFactType()); assertEquals("Smurf", ((ActionInsertFact) rm.rhs[1]).getFactType()); // examine the first action ActionInsertFact result2Action1 = (ActionInsertFact) rm.rhs[0]; assertEquals(1, result2Action1.getFieldValues().length); ActionFieldValue result2Action1FieldValue1 = (ActionFieldValue) result2Action1.getFieldValues()[0]; assertEquals(DataType.TYPE_STRING, result2Action1FieldValue1.getType()); assertEquals("name", result2Action1FieldValue1.getField()); assertEquals("Gargamel", result2Action1FieldValue1.getValue()); // examine the second action ActionInsertFact result2Action2 = (ActionInsertFact) rm.rhs[1]; assertEquals(2, result2Action2.getFieldValues().length); ActionFieldValue result2Action2FieldValue1 = (ActionFieldValue) result2Action2.getFieldValues()[0]; assertEquals(DataType.TYPE_STRING, result2Action2FieldValue1.getType()); assertEquals("name", result2Action2FieldValue1.getField()); assertEquals("$name", result2Action2FieldValue1.getValue()); ActionFieldValue result3Action2FieldValue2 = (ActionFieldValue) result2Action2.getFieldValues()[1]; assertEquals(DataType.TYPE_NUMERIC_INTEGER, result3Action2FieldValue2.getType()); assertEquals("age", result3Action2FieldValue2.getField()); assertEquals("$age", result3Action2FieldValue2.getValue()); } @Test //This test checks a Decision Table involving BRL columns is correctly converted into DRL public void testRHSWithBRLColumn_ParseToDRL() { GuidedDecisionTable52 dtable = new GuidedDecisionTable52(); // All three rows are entered, some columns with optional data String[][] data = new String[][]{ new String[]{"1", "desc", "Gargamel", "Pupa", "50"}, new String[]{"2", "desc", "Gargamel", "", "50"}, new String[]{"3", "desc", "Gargamel", "Pupa", ""} }; //Simple (mandatory) columns dtable.setRowNumberCol(new RowNumberCol52()); dtable.setDescriptionCol(new DescriptionCol52()); //Simple Action ActionInsertFactCol52 a1 = new ActionInsertFactCol52(); a1.setBoundName("$b"); a1.setFactType("Baddie"); a1.setFactField("name"); a1.setType(DataType.TYPE_STRING); dtable.getActionCols().add(a1); //BRL Column BRLActionColumn brl1 = new BRLActionColumn(); //BRL Column definition List<IAction> brl1Definition = new ArrayList<IAction>(); ActionInsertFact brl1DefinitionAction1 = new ActionInsertFact("Smurf"); ActionFieldValue brl1DefinitionAction1FieldValue1 = new ActionFieldValue("name", "$name", DataType.TYPE_STRING); brl1DefinitionAction1FieldValue1.setNature(BaseSingleFieldConstraint.TYPE_TEMPLATE); brl1DefinitionAction1.addFieldValue(brl1DefinitionAction1FieldValue1); ActionFieldValue brl1DefinitionAction1FieldValue2 = new ActionFieldValue("age", "$age", DataType.TYPE_NUMERIC_INTEGER); brl1DefinitionAction1FieldValue2.setNature(BaseSingleFieldConstraint.TYPE_TEMPLATE); brl1DefinitionAction1.addFieldValue(brl1DefinitionAction1FieldValue2); brl1Definition.add(brl1DefinitionAction1); brl1.setDefinition(brl1Definition); //Setup BRL column bindings BRLActionVariableColumn brl1Variable1 = new BRLActionVariableColumn("$name", DataType.TYPE_STRING, "Person", "name"); brl1.getChildColumns().add(brl1Variable1); BRLActionVariableColumn brl1Variable2 = new BRLActionVariableColumn("$age", DataType.TYPE_NUMERIC_INTEGER, "Person", "age"); brl1.getChildColumns().add(brl1Variable2); dtable.getActionCols().add(brl1); dtable.setData(DataUtilities.makeDataLists(data)); //Now to test conversion int ruleStartIndex; int action1StartIndex; int action2StartIndex; GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dtable); //Row 0 ruleStartIndex = drl.indexOf("//from row number: 1"); assertFalse(ruleStartIndex == -1); action1StartIndex = drl.indexOf("Baddie $b = new Baddie();", ruleStartIndex); assertFalse(action1StartIndex == -1); action1StartIndex = drl.indexOf("$b.setName( \"Gargamel\" );", action1StartIndex); assertFalse(action1StartIndex == -1); action1StartIndex = drl.indexOf("insert( $b );", action1StartIndex); assertFalse(action1StartIndex == -1); action2StartIndex = drl.indexOf("Smurf fact0 = new Smurf();", ruleStartIndex); assertFalse(action2StartIndex == -1); action2StartIndex = drl.indexOf("fact0.setName( \"Pupa\" );", action2StartIndex); assertFalse(action2StartIndex == -1); action2StartIndex = drl.indexOf("fact0.setAge( 50 );", action2StartIndex); assertFalse(action2StartIndex == -1); action2StartIndex = drl.indexOf("insert( fact0 );", action2StartIndex); assertFalse(action2StartIndex == -1); //Row 1 ruleStartIndex = drl.indexOf("//from row number: 2"); int ruleEndIndex = drl.indexOf("//from row number: 3"); assertFalse(ruleStartIndex == -1); action1StartIndex = drl.indexOf("Baddie $b = new Baddie();", ruleStartIndex); assertFalse(action1StartIndex == -1); action1StartIndex = drl.indexOf("$b.setName( \"Gargamel\" );", action1StartIndex); assertFalse(action1StartIndex == -1); action1StartIndex = drl.indexOf("insert( $b );", action1StartIndex); assertFalse(action1StartIndex == -1); action2StartIndex = drl.indexOf("Smurf fact0 = new Smurf();", ruleStartIndex); assertFalse(action2StartIndex == -1); action2StartIndex = drl.indexOf("fact0.setName(", ruleStartIndex); assertFalse(action2StartIndex < ruleEndIndex); action2StartIndex = drl.indexOf("fact0.setAge( 50 );", ruleStartIndex); assertFalse(action2StartIndex == -1); action2StartIndex = drl.indexOf("insert( fact0 );", ruleStartIndex); assertFalse(action2StartIndex == -1); //Row 2 ruleStartIndex = drl.indexOf("//from row number: 3"); assertFalse(ruleStartIndex == -1); action1StartIndex = drl.indexOf("Baddie $b = new Baddie();", ruleStartIndex); assertFalse(action1StartIndex == -1); action1StartIndex = drl.indexOf("$b.setName( \"Gargamel\" );", action1StartIndex); assertFalse(action1StartIndex == -1); action1StartIndex = drl.indexOf("insert( $b );", action1StartIndex); assertFalse(action1StartIndex == -1); action2StartIndex = drl.indexOf("Smurf fact0 = new Smurf();", ruleStartIndex); assertFalse(action2StartIndex == -1); action2StartIndex = drl.indexOf("fact0.setName( \"Pupa\" );", ruleStartIndex); assertFalse(action2StartIndex == -1); action2StartIndex = drl.indexOf("fact0.setAge( 50 );", ruleStartIndex); assertTrue(action2StartIndex == -1); action2StartIndex = drl.indexOf("insert( fact0 );", ruleStartIndex); assertFalse(action2StartIndex == -1); } @Test //This test checks a Decision Table involving BRL columns is correctly converted into DRL public void testRHSWithBRLColumn_ParseToDRL_MultipleActions() { GuidedDecisionTable52 dtable = new GuidedDecisionTable52(); // All three rows are entered, some columns with optional data String[][] data = new String[][]{ new String[]{"1", "desc", "Pupa", "50"}, new String[]{"2", "desc", "", "50"}, new String[]{"3", "desc", "Pupa", ""} }; //Simple (mandatory) columns dtable.setRowNumberCol(new RowNumberCol52()); dtable.setDescriptionCol(new DescriptionCol52()); //BRL Column BRLActionColumn brl1 = new BRLActionColumn(); //BRL Column definition List<IAction> brl1Definition = new ArrayList<IAction>(); ActionInsertFact brl1DefinitionAction1 = new ActionInsertFact("Baddie"); ActionFieldValue brl1DefinitionAction1FieldValue1 = new ActionFieldValue("name", "Gargamel", DataType.TYPE_STRING); brl1DefinitionAction1FieldValue1.setNature(BaseSingleFieldConstraint.TYPE_LITERAL); brl1DefinitionAction1.addFieldValue(brl1DefinitionAction1FieldValue1); brl1Definition.add(brl1DefinitionAction1); ActionInsertFact brl1DefinitionAction2 = new ActionInsertFact("Smurf"); ActionFieldValue brl1DefinitionAction2FieldValue1 = new ActionFieldValue("name", "$name", DataType.TYPE_STRING); brl1DefinitionAction2FieldValue1.setNature(BaseSingleFieldConstraint.TYPE_TEMPLATE); brl1DefinitionAction2.addFieldValue(brl1DefinitionAction2FieldValue1); ActionFieldValue brl1DefinitionAction2FieldValue2 = new ActionFieldValue("age", "$age", DataType.TYPE_NUMERIC_INTEGER); brl1DefinitionAction2FieldValue2.setNature(BaseSingleFieldConstraint.TYPE_TEMPLATE); brl1DefinitionAction2.addFieldValue(brl1DefinitionAction2FieldValue2); brl1Definition.add(brl1DefinitionAction2); brl1.setDefinition(brl1Definition); //Setup BRL column bindings BRLActionVariableColumn brl1Variable1 = new BRLActionVariableColumn("$name", DataType.TYPE_STRING, "Person", "name"); brl1.getChildColumns().add(brl1Variable1); BRLActionVariableColumn brl1Variable2 = new BRLActionVariableColumn("$age", DataType.TYPE_NUMERIC_INTEGER, "Person", "age"); brl1.getChildColumns().add(brl1Variable2); dtable.getActionCols().add(brl1); dtable.setData(DataUtilities.makeDataLists(data)); //Now to test conversion int ruleStartIndex; int action1StartIndex; int action2StartIndex; GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dtable); //Row 0 ruleStartIndex = drl.indexOf("//from row number: 1"); assertFalse(ruleStartIndex == -1); action1StartIndex = drl.indexOf("Baddie fact0 = new Baddie();", ruleStartIndex); assertFalse(action1StartIndex == -1); action1StartIndex = drl.indexOf("fact0.setName( \"Gargamel\" );", action1StartIndex); assertFalse(action1StartIndex == -1); action1StartIndex = drl.indexOf("insert( fact0 );", action1StartIndex); assertFalse(action1StartIndex == -1); action2StartIndex = drl.indexOf("Smurf fact1 = new Smurf();", ruleStartIndex); assertFalse(action2StartIndex == -1); action2StartIndex = drl.indexOf("fact1.setName( \"Pupa\" );", action2StartIndex); assertFalse(action2StartIndex == -1); action2StartIndex = drl.indexOf("fact1.setAge( 50 );", action2StartIndex); assertFalse(action2StartIndex == -1); action2StartIndex = drl.indexOf("insert( fact1 );", action2StartIndex); assertFalse(action2StartIndex == -1); //Row 1 ruleStartIndex = drl.indexOf("//from row number: 2"); int ruleEndIndex = drl.indexOf("//from row number: 3"); assertFalse(ruleStartIndex == -1); action1StartIndex = drl.indexOf("Baddie fact0 = new Baddie();", ruleStartIndex); assertFalse(action1StartIndex == -1); action1StartIndex = drl.indexOf("fact0.setName( \"Gargamel\" );", action1StartIndex); assertFalse(action1StartIndex == -1); action1StartIndex = drl.indexOf("insert( fact0 );", action1StartIndex); assertFalse(action1StartIndex == -1); action2StartIndex = drl.indexOf("Smurf fact1 = new Smurf();", ruleStartIndex); assertFalse(action2StartIndex == -1); action2StartIndex = drl.indexOf("fact1.setName( \"Pupa\" );", ruleStartIndex); assertFalse(action2StartIndex < ruleEndIndex); action2StartIndex = drl.indexOf("fact1.setAge( 50 );", ruleStartIndex); assertFalse(action2StartIndex == -1); action2StartIndex = drl.indexOf("insert( fact1 );", ruleStartIndex); assertFalse(action2StartIndex == -1); //Row 2 ruleStartIndex = drl.indexOf("//from row number: 3"); assertFalse(ruleStartIndex == -1); action1StartIndex = drl.indexOf("Baddie fact0 = new Baddie();", ruleStartIndex); assertFalse(action1StartIndex == -1); action1StartIndex = drl.indexOf("fact0.setName( \"Gargamel\" );", action1StartIndex); assertFalse(action1StartIndex == -1); action1StartIndex = drl.indexOf("insert( fact0 );", action1StartIndex); assertFalse(action1StartIndex == -1); action2StartIndex = drl.indexOf("Smurf fact1 = new Smurf();", ruleStartIndex); assertFalse(action2StartIndex == -1); action2StartIndex = drl.indexOf("fact1.setName( \"Pupa\" );", ruleStartIndex); assertFalse(action2StartIndex == -1); action2StartIndex = drl.indexOf("fact1.setAge( 50 );", ruleStartIndex); assertTrue(action2StartIndex == -1); action2StartIndex = drl.indexOf("insert( fact1 );", ruleStartIndex); assertFalse(action2StartIndex == -1); } @Test //This test checks a Decision Table involving BRL columns is correctly converted into DRL public void testRHSWithBRLColumn_ParseToDRL_NoVariables() { GuidedDecisionTable52 dtable = new GuidedDecisionTable52(); Object[][] data = new Object[][]{ new Object[]{"1", "desc", Boolean.TRUE}, new Object[]{"2", "desc", Boolean.FALSE} }; //Simple (mandatory) columns dtable.setRowNumberCol(new RowNumberCol52()); dtable.setDescriptionCol(new DescriptionCol52()); //BRL Column BRLActionColumn brl1 = new BRLActionColumn(); //BRL Column definition List<IAction> brl1Definition = new ArrayList<IAction>(); ActionInsertFact brl1DefinitionAction1 = new ActionInsertFact("Baddie"); ActionFieldValue brl1DefinitionAction1FieldValue1 = new ActionFieldValue("name", "Gargamel", DataType.TYPE_STRING); brl1DefinitionAction1FieldValue1.setNature(BaseSingleFieldConstraint.TYPE_LITERAL); brl1DefinitionAction1.addFieldValue(brl1DefinitionAction1FieldValue1); brl1Definition.add(brl1DefinitionAction1); brl1.setDefinition(brl1Definition); //Setup BRL column bindings BRLActionVariableColumn brl1Variable1 = new BRLActionVariableColumn("", DataType.TYPE_BOOLEAN); brl1.getChildColumns().add(brl1Variable1); dtable.getActionCols().add(brl1); dtable.setData(DataUtilities.makeDataLists(data)); //Now to test conversion int ruleStartIndex; int action1StartIndex; GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dtable); //Row 0 ruleStartIndex = drl.indexOf("//from row number: 1"); assertFalse(ruleStartIndex == -1); action1StartIndex = drl.indexOf("Baddie fact0 = new Baddie();", ruleStartIndex); assertFalse(action1StartIndex == -1); action1StartIndex = drl.indexOf("fact0.setName( \"Gargamel\" );", action1StartIndex); assertFalse(action1StartIndex == -1); action1StartIndex = drl.indexOf("insert( fact0 );", action1StartIndex); assertFalse(action1StartIndex == -1); //Row 1 ruleStartIndex = drl.indexOf("//from row number: 2"); assertFalse(ruleStartIndex == -1); action1StartIndex = drl.indexOf("Baddie fact0 = new Baddie();", ruleStartIndex); assertTrue(action1StartIndex == -1); action1StartIndex = drl.indexOf("fact0.setName( \"Gargamel\" );", ruleStartIndex); assertTrue(action1StartIndex == -1); action1StartIndex = drl.indexOf("insert( fact0 );", ruleStartIndex); assertTrue(action1StartIndex == -1); } @Test //This test checks a Decision Table involving BRL columns is correctly converted into DRL public void testRHSWithBRLColumn_ParseToDRL_FreeFormLine() { GuidedDecisionTable52 dtable = new GuidedDecisionTable52(); //Row 0 should become an IAction in the resulting RuleModel as it contains values for all Template fields in the BRL Column //Row 1 should *NOT* become an IAction in the resulting RuleModel as it does *NOT* contain values for all Template fields in the BRL Column //Row 2 should *NOT* become an IAction in the resulting RuleModel as it does *NOT* contain values for all Template fields in the BRL Column //Row 3 should *NOT* become an IAction in the resulting RuleModel as it does *NOT* contain values for all Template fields in the BRL Column String[][] data = new String[][]{ new String[]{"1", "desc", "Pupa", "50"}, new String[]{"2", "desc", "", "50"}, new String[]{"3", "desc", "Pupa", ""}, new String[]{"4", "desc", "", ""} }; //Simple (mandatory) columns dtable.setRowNumberCol(new RowNumberCol52()); dtable.setDescriptionCol(new DescriptionCol52()); //BRL Action BRLActionColumn brl1 = new BRLActionColumn(); //BRL Action definition List<IAction> brl1Definition = new ArrayList<IAction>(); FreeFormLine brl1DefinitionFreeFormLine = new FreeFormLine(); brl1DefinitionFreeFormLine.setText("System.out.println( \"name == @{name}, age == @{age}\" );"); brl1Definition.add(brl1DefinitionFreeFormLine); brl1.setDefinition(brl1Definition); //Setup BRL column bindings BRLActionVariableColumn brl1Variable1 = new BRLActionVariableColumn("name", DataType.TYPE_STRING); BRLActionVariableColumn brl1Variable2 = new BRLActionVariableColumn("age", DataType.TYPE_NUMERIC_INTEGER); brl1.getChildColumns().add(brl1Variable1); brl1.getChildColumns().add(brl1Variable2); dtable.getActionCols().add(brl1); dtable.setData(DataUtilities.makeDataLists(data)); //Now to test conversion int ruleStartIndex; int pattern1StartIndex; GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dtable); //Row 0 ruleStartIndex = drl.indexOf("//from row number: 1"); assertFalse(ruleStartIndex == -1); pattern1StartIndex = drl.indexOf("System.out.println( \"name == Pupa, age == 50\" );", ruleStartIndex); assertFalse(pattern1StartIndex == -1); //Row 1 ruleStartIndex = drl.indexOf("//from row number: 2"); assertFalse(ruleStartIndex == -1); pattern1StartIndex = drl.indexOf("System.out.println(", ruleStartIndex); assertTrue(pattern1StartIndex == -1); //Row 2 ruleStartIndex = drl.indexOf("//from row number: 3"); assertFalse(ruleStartIndex == -1); pattern1StartIndex = drl.indexOf("System.out.println(", ruleStartIndex); assertTrue(pattern1StartIndex == -1); //Row 3 ruleStartIndex = drl.indexOf("//from row number: 4"); assertFalse(ruleStartIndex == -1); pattern1StartIndex = drl.indexOf("System.out.println(", ruleStartIndex); assertTrue(pattern1StartIndex == -1); } @Test public void testPackageNameAndImports() throws Exception { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setPackageName("org.drools.guvnor.models.guided.dtable.backend"); dt.getImports().addImport(new Import("java.lang.String")); dt.setTableName("michael"); Pattern52 p1 = new Pattern52(); p1.setBoundName("f1"); p1.setFactType("Driver"); ConditionCol52 con = new ConditionCol52(); con.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); con.setFactField("age"); con.setHeader("Driver f1 age"); con.setOperator("=="); p1.getChildColumns().add(con); dt.getConditions().add(p1); dt.setData(DataUtilities.makeDataLists(new String[][]{ new String[]{"1", "desc", "42"} })); GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dt); assertTrue(drl.indexOf("package org.drools.guvnor.models.guided.dtable.backend;") == 0); assertTrue(drl.indexOf("import java.lang.String;") > 0); } @Test public void testLHSNonEmptyStringValues() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableFormat(GuidedDecisionTable52.TableFormat.EXTENDED_ENTRY); dt.setTableName("extended-entry"); Pattern52 p1 = new Pattern52(); p1.setBoundName("p1"); p1.setFactType("Smurf"); dt.getConditions().add(p1); ConditionCol52 cc1 = new ConditionCol52(); cc1.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc1.setFieldType(DataType.TYPE_STRING); cc1.setFactField("name"); cc1.setOperator("=="); p1.getChildColumns().add(cc1); ConditionCol52 cc2 = new ConditionCol52(); cc2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc2.setFieldType(DataType.TYPE_NUMERIC_INTEGER); cc2.setFactField("age"); cc2.setOperator("=="); p1.getChildColumns().add(cc2); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{1l, "desc-row1", null, null}, new Object[]{2l, "desc-row2", " ", 35l}, new Object[]{3l, "desc-row3", "", null}, new Object[]{4l, "desc-row4", "", 35l}, })); GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dt); final String expected = "//from row number: 1\n" + "//desc-row1\n" + "rule \"Row 1 extended-entry\"\n" + " dialect \"mvel\"\n" + " when\n" + " then\n" + "end\n" + "//from row number: 2\n" + "//desc-row2\n" + "rule \"Row 2 extended-entry\"\n" + " dialect \"mvel\"\n" + " when\n" + " p1 : Smurf( age == 35 )\n" + " then\n" + "end\n" + "//from row number: 3\n" + "//desc-row3\n" + "rule \"Row 3 extended-entry\"\n" + " dialect \"mvel\"\n" + " when\n" + " then\n" + "end\n" + "//from row number: 4\n" + "//desc-row4\n" + "rule \"Row 4 extended-entry\"\n" + " dialect \"mvel\"\n" + " when\n" + " p1 : Smurf( age == 35 )\n" + " then\n" + "end"; assertEqualsIgnoreWhitespace(expected, drl); } @Test public void testLHSDelimitedNonEmptyStringValues() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableFormat(GuidedDecisionTable52.TableFormat.EXTENDED_ENTRY); dt.setTableName("extended-entry"); Pattern52 p1 = new Pattern52(); p1.setBoundName("p1"); p1.setFactType("Smurf"); dt.getConditions().add(p1); ConditionCol52 cc1 = new ConditionCol52(); cc1.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc1.setFieldType(DataType.TYPE_STRING); cc1.setFactField("name"); cc1.setOperator("=="); p1.getChildColumns().add(cc1); ConditionCol52 cc2 = new ConditionCol52(); cc2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cc2.setFieldType(DataType.TYPE_NUMERIC_INTEGER); cc2.setFactField("age"); cc2.setOperator("=="); p1.getChildColumns().add(cc2); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{1l, "desc-row1", null, null}, new Object[]{2l, "desc-row2", "\" \"", 35l}, new Object[]{3l, "desc-row3", "\"\"", null}, new Object[]{4l, "desc-row4", "\"\"", 35l}, })); GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dt); final String expected = "//from row number: 1\n" + "//desc-row1\n" + "rule \"Row 1 extended-entry\"\n" + " dialect \"mvel\"\n" + " when\n" + " then\n" + "end\n" + "//from row number: 2\n" + "//desc-row2\n" + "rule \"Row 2 extended-entry\"\n" + " dialect \"mvel\"\n" + " when\n" + " p1 : Smurf( name == \" \", age == 35 )\n" + " then\n" + "end\n" + "//from row number: 3\n" + "//desc-row3\n" + "rule \"Row 3 extended-entry\"\n" + " dialect \"mvel\"\n" + " when\n" + " p1 : Smurf( name == \"\" )\n" + " then\n" + "end\n" + "//from row number: 4\n" + "//desc-row4\n" + "rule \"Row 4 extended-entry\"\n" + " dialect \"mvel\"\n" + " when\n" + " p1 : Smurf( name == \"\", age == 35 )\n" + " then\n" + "end"; assertEqualsIgnoreWhitespace(expected, drl); } @Test public void testRHSNonEmptyStringValues() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableFormat(GuidedDecisionTable52.TableFormat.EXTENDED_ENTRY); dt.setTableName("extended-entry"); ActionInsertFactCol52 ins1 = new ActionInsertFactCol52(); ins1.setBoundName("$f"); ins1.setFactType("Smurf"); ins1.setFactField("name"); ins1.setType(DataType.TYPE_STRING); dt.getActionCols().add(ins1); ActionInsertFactCol52 ins2 = new ActionInsertFactCol52(); ins2.setBoundName("$f"); ins2.setFactType("Smurf"); ins2.setFactField("age"); ins2.setType(DataType.TYPE_NUMERIC_INTEGER); dt.getActionCols().add(ins2); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{1l, "desc-row1", null, null}, new Object[]{2l, "desc-row2", " ", 35l}, new Object[]{3l, "desc-row3", "", null}, new Object[]{4l, "desc-row4", "", 35l}, })); GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dt); final String expected = "//from row number: 1\n" + "//desc-row1\n" + "rule \"Row 1 extended-entry\"\n" + " dialect \"mvel\"\n" + " when\n" + " then\n" + "end\n" + "//from row number: 2\n" + "//desc-row2\n" + "rule \"Row 2 extended-entry\"\n" + " dialect \"mvel\"\n" + " when\n" + " then\n" + " Smurf $f = new Smurf();\n" + " $f.setAge( 35 );\n" + " insert( $f );\n" + "end\n" + "//from row number: 3\n" + "//desc-row3\n" + "rule \"Row 3 extended-entry\"\n" + " dialect \"mvel\"\n" + " when\n" + " then\n" + "end\n" + "//from row number: 4\n" + "//desc-row4\n" + "rule \"Row 4 extended-entry\"\n" + " dialect \"mvel\"\n" + " when\n" + " then\n" + " Smurf $f = new Smurf();\n" + " $f.setAge( 35 );\n" + " insert( $f );\n" + "end"; assertEqualsIgnoreWhitespace(expected, drl); } @Test public void testRHSDelimitedNonEmptyStringValues() { GuidedDecisionTable52 dt = new GuidedDecisionTable52(); dt.setTableFormat(GuidedDecisionTable52.TableFormat.EXTENDED_ENTRY); dt.setTableName("extended-entry"); ActionInsertFactCol52 ins1 = new ActionInsertFactCol52(); ins1.setBoundName("$f"); ins1.setFactType("Smurf"); ins1.setFactField("name"); ins1.setType(DataType.TYPE_STRING); dt.getActionCols().add(ins1); ActionInsertFactCol52 ins2 = new ActionInsertFactCol52(); ins2.setBoundName("$f"); ins2.setFactType("Smurf"); ins2.setFactField("age"); ins2.setType(DataType.TYPE_NUMERIC_INTEGER); dt.getActionCols().add(ins2); dt.setData(DataUtilities.makeDataLists(new Object[][]{ new Object[]{1l, "desc-row1", null, null}, new Object[]{2l, "desc-row2", "\" \"", 35l}, new Object[]{3l, "desc-row3", "\"\"", null}, new Object[]{4l, "desc-row4", "\"\"", 35l}, })); GuidedDTDRLPersistence p = GuidedDTDRLPersistence.getInstance(); String drl = p.marshal(dt); final String expected = "//from row number: 1\n" + "//desc-row1\n" + "rule \"Row 1 extended-entry\"\n" + " dialect \"mvel\"\n" + " when\n" + " then\n" + "end\n" + "//from row number: 2\n" + "//desc-row2\n" + "rule \"Row 2 extended-entry\"\n" + " dialect \"mvel\"\n" + " when\n" + " then\n" + " Smurf $f = new Smurf();\n" + " $f.setName( \" \" );\n" + " $f.setAge( 35 );\n" + " insert( $f );\n" + "end\n" + "//from row number: 3\n" + "//desc-row3\n" + "rule \"Row 3 extended-entry\"\n" + " dialect \"mvel\"\n" + " when\n" + " then\n" + " Smurf $f = new Smurf();\n" + " $f.setName( \"\" );\n" + " insert( $f );\n" + "end\n" + "//from row number: 4\n" + "//desc-row4\n" + "rule \"Row 4 extended-entry\"\n" + " dialect \"mvel\"\n" + " when\n" + " then\n" + " Smurf $f = new Smurf();\n" + " $f.setName( \"\" );\n" + " $f.setAge( 35 );\n" + " insert( $f );\n" + "end"; assertEqualsIgnoreWhitespace(expected, drl); } private void assertEqualsIgnoreWhitespace(final String expected, final String actual) { final String cleanExpected = expected.replaceAll("\\s+", ""); final String cleanActual = actual.replaceAll("\\s+", ""); assertEquals(cleanExpected, cleanActual); } }