Thanks for the previous answer. Now I'm trying to figure out how to deal with ActionTrigger
. Consider the following CODE
When I run it, I get the expected output:
Activated Baz
Reactivated Zab
Deactivated Zab
But if I remove Action
with ActionTrigger.Reactivated
, only the first line is printed. The engine doesn't react to retraction. Why is that happening?
1 argumentsList)
at NRules.RuleSharp.PrimaryExpressionBuilder.Method(List
1 argumentsList)1.Visit(IParseTree tree)
at NRules.RuleSharp.ExpressionParser.VisitUnary_expression(Unary_expressionContext context)
at NRules.RuleSharp.Parser.RuleSharpParser.Unary_expressionContext.Accept[TResult](IParseTreeVisitor
1 visitor)1.Visit(IParseTree tree)
at NRules.RuleSharp.ExpressionParser.VisitMultiplicative_expression(Multiplicative_expressionContext context)
at NRules.RuleSharp.Parser.RuleSharpParser.Multiplicative_expressionContext.Accept[TResult](IParseTreeVisitor
1 visitor)1.Visit(IParseTree tree)
at NRules.RuleSharp.ExpressionParser.VisitAdditive_expression(Additive_expressionContext context)
at NRules.RuleSharp.Parser.RuleSharpParser.Additive_expressionContext.Accept[TResult](IParseTreeVisitor
1 visitor)1.VisitChildren(IRuleNode node)
at NRules.RuleSharp.Parser.RuleSharpParserBaseVisitor
1.VisitShift_expression(Shift_expressionContext context)1.Visit(IParseTree tree)
at NRules.RuleSharp.ExpressionParser.VisitRelational_expression(Relational_expressionContext context)
at NRules.RuleSharp.Parser.RuleSharpParser.Relational_expressionContext.Accept[TResult](IParseTreeVisitor
1 visitor)1.Visit(IParseTree tree)
at NRules.RuleSharp.ExpressionParser.VisitEquality_expression(Equality_expressionContext context)
at NRules.RuleSharp.Parser.RuleSharpParser.Equality_expressionContext.Accept[TResult](IParseTreeVisitor
1 visitor)1.Visit(IParseTree tree)
at NRules.RuleSharp.ExpressionParser.VisitAnd_expression(And_expressionContext context)
at NRules.RuleSharp.Parser.RuleSharpParser.And_expressionContext.Accept[TResult](IParseTreeVisitor
1 visitor)1.Visit(IParseTree tree)
at NRules.RuleSharp.ExpressionParser.VisitExclusive_or_expression(Exclusive_or_expressionContext context)
at NRules.RuleSharp.Parser.RuleSharpParser.Exclusive_or_expressionContext.Accept[TResult](IParseTreeVisitor
1 visitor)1.Visit(IParseTree tree)
at NRules.RuleSharp.ExpressionParser.VisitInclusive_or_expression(Inclusive_or_expressionContext context)
at NRules.RuleSharp.Parser.RuleSharpParser.Inclusive_or_expressionContext.Accept[TResult](IParseTreeVisitor
1 visitor)1.Visit(IParseTree tree)
at NRules.RuleSharp.ExpressionParser.VisitConditional_and_expression(Conditional_and_expressionContext context)
at NRules.RuleSharp.Parser.RuleSharpParser.Conditional_and_expressionContext.Accept[TResult](IParseTreeVisitor
1 visitor)
import model.LineItem;
import model.Brand;
import model.Market;
import model.Seller;
global java.util.List coupons;
rule "Rule 1"
when
exists LineItem(category == "PC", market in (Market.MARKETPLACE1), brand in (Brand.ACER))
then
coupons.add("#PC0001");
end
Then()
.Do(ctx => SendEmailNotification(currentCartItem));
Is there a way to properly remove a fact from the sessions memory once inserted?
Simply calling Remove
/ TryRemove
doesn't actually free any memory...
Minimized example of what I am currently trying to do:
using System;
using NRules;
using NRules.Fluent;
using NRules.Fluent.Dsl;
namespace Playground
{
class Fact
{
public int data { get; set; }
}
public class TestRule : Rule
{
public override void Define()
{
Fact fact = null;
When()
.Match<Fact>(() => fact);
Then()
.Do(ctx => Console.WriteLine("fact " + fact.data));
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("press any key to start...");
Console.ReadKey();
var repository = new RuleRepository();
repository.Load(x => x.From(typeof(Program).Assembly));
var factory = repository.Compile();
var session = factory.CreateSession();
Console.WriteLine("inserting facts...\n");
for (int i = 0; i < 1000000; ++i)
{
session.Insert(new Fact { data = i });
}
// memory usage has now grown to ~800 MB
Console.WriteLine("press any key to retract facts...");
Console.ReadKey();
foreach (var fact in session.Query<Fact>())
{
if (!session.TryRetract(fact))
{
Console.WriteLine("retracting " + fact.data + " failed"); // no output -> no errors
}
}
foreach (var fact in session.Query<Fact>())
{
Console.WriteLine("still in memory: " + fact.data + ")"); // no output -> no facts in session
}
// memory usage hasn't dropped down again
Console.WriteLine("\nPress any key to continue...");
Console.ReadKey();
}
}
}