Creating Projects
This guide walks through creating a new DTRules project. We'll build a simple discount calculation system to demonstrate the process.
Go This guide uses Go CLI tools. See Choosing an Implementation for an overview of available tools.
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 Build the Rules
Run dtrules build from the project directory. It extracts the DSL from Excel to XML
and compiles it to postfix — Excel is the system of record, and the same DSL is written back to
Excel in the same step:
cd /path/to/DTRules/sampleprojects/MyProject
dtrules build
This generates the XML files in the xml/ directory. (The old
dtrules -compile command and build --from-xml flag have been removed —
use dtrules build.)
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 REST API
Start the REST API server and send test requests for production-style integration.
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