Creating Projects
This guide walks through creating a new DTRules project. We'll build a simple discount calculation system to demonstrate the process.
Java This guide uses Java for compilation. Excel compilation requires the Java implementation. See Choosing an Implementation to understand the full workflow.
Project Setup
1. Copy the Template
Start with the TestProject template:
cp -r sampleprojects/TestProject sampleprojects/MyProject
cd sampleprojects/MyProject 2. Update Configuration
Edit DTRules.xml with your project details:
<DTRules>
<compiler>EL</compiler>
<RuleSet name="MyProject" source="file">
<RuleSetFilePath>/xml</RuleSetFilePath>
<WorkingDirectory>/temp</WorkingDirectory>
<DTExcelFolder>/DecisionTables/</DTExcelFolder>
<EDDExcelFolder>/edd/</EDDExcelFolder>
<Entities name="MyProject_edd.xml" />
<Decisiontables name="MyProject_dt.xml" />
<Map name="MyProject_map.xml" />
</RuleSet>
</DTRules> 3. Update pom.xml
<groupId>com.mycompany</groupId>
<artifactId>myproject</artifactId>
<version>1.0-SNAPSHOT</version>
<name>MyProject</name> Define Your Data Model
Create the EDD
Create edd/MyProject_edd.xls with your entities:
| Entity | Attribute | Type | Subtype | Default | Comment |
|---|---|---|---|---|---|
| Order | Customer order | ||||
| customer | Customer | Who placed the order | |||
| items | array | LineItem | Order line items | ||
| subtotal | decimal | 0 | Pre-discount total | ||
| discount | decimal | 0 | Applied discount | ||
| total | decimal | 0 | Final total | ||
| Customer | Customer info | ||||
| name | string | ||||
| vip | boolean | false | VIP status | ||
| member_since | date | Membership date | |||
| LineItem | Order line | ||||
| product | string | ||||
| quantity | integer | 1 | |||
| unit_price | decimal | 0 | |||
| line_total | decimal | 0 | |||
| Context | Global config | ||||
| today | date | Current date | |||
| vip_discount | decimal | 0.15 | VIP discount rate | ||
| bulk_threshold | decimal | 100 | Bulk order threshold | ||
| bulk_discount | decimal | 0.10 | Bulk discount rate |
Write Decision Tables
Create the Decision Tables
Create DecisionTables/MyProject_dt.xls:
Table: Main
Name: Main
Type: ALL
Description: Main entry point for order processing
Actions:
- perform Calculate_Line_Totals
- perform Calculate_Subtotal
- perform Apply_Discounts
- perform Calculate_Total Table: Calculate_Line_Totals
Name: Calculate_Line_Totals
Type: ALL
Description: Calculate each line item total
Actions:
for each item in order.items do
set item.line_total = item.quantity * item.unit_price
done Table: Calculate_Subtotal
Name: Calculate_Subtotal
Type: ALL
Description: Sum line totals to get subtotal
Actions:
set order.subtotal = 0
for each item in order.items do
set order.subtotal = order.subtotal + item.line_total
done Table: Apply_Discounts
Name: Apply_Discounts
Type: FIRST
Description: Apply the best applicable discount
Conditions:
1. customer.vip = true
2. order.subtotal >= bulk_threshold
| Condition | R1 | R2 | R3 | R4 |
|--------------|----|----|----|----|
| VIP | Y | Y | N | N |
| Bulk Order | Y | N | Y | N |
|--------------|----|----|----|----|
| VIP Discount | X | X | - | - |
| Bulk Discount| - | - | X | - |
| No Discount | - | - | - | X |
Actions:
- set order.discount = order.subtotal * vip_discount
- set order.discount = order.subtotal * bulk_discount
- set order.discount = 0 Table: Calculate_Total
Name: Calculate_Total
Type: ALL
Description: Apply discount to get final total
Actions:
set order.total = order.subtotal - order.discount Compile the Rules Java
Create the Compiler
Create src/main/java/com/mycompany/CompileMyProject.java:
package com.mycompany;
import com.dtrules.compiler.Excel2XML;
public class CompileMyProject {
public static void main(String[] args) throws Exception {
String path = System.getProperty("user.dir");
Excel2XML.compile(path, "DTRules.xml", "MyProject");
System.out.println("Compilation complete!");
}
} Run the Compiler
mvn exec:java -Dexec.mainClass="com.mycompany.CompileMyProject" This generates XML files in the xml/ directory.
Test the Rules
Create Test Cases
Create test XML files in testfiles/:
<!-- testfiles/test1.xml -->
<data>
<order>
<customer>
<name>John Doe</name>
<vip>true</vip>
</customer>
<items>
<item>
<product>Widget</product>
<quantity>5</quantity>
<unit_price>10.00</unit_price>
</item>
</items>
</order>
</data> Run with Go CLI Go
Once you have compiled XML files, you can execute them with the Go CLI:
cd /path/to/DTRules/go
go build -o dtrules ./cmd/dtrules
./dtrules -rules ../sampleprojects/MyProject/xml -entry Main -trace Run with Java Java
Create a test runner class and execute with Maven.
Using the Visual UI
Once your project is compiled to XML, you can use the visual UI:
- Start the backend:
cd go && go run ./cmd/api - Start the UI:
cd ui && npm run dev - Click "Open Custom Project"
- Enter the path to your
xml/directory - Explore and edit your rules visually
Best Practices
- Start small - Begin with a minimal model and expand
- Test early - Write tests as you develop rules
- Use meaningful names - Entities and tables should be self-documenting
- Keep tables focused - One decision per table
- Document business logic - Use descriptions to explain the "why"
Next Steps
- Testing Rules - Write comprehensive tests
- Operator Reference - Full operator documentation
- CHIP Tutorial - See a complete example