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();
}
}
}
rf => rf.ReferenceB == myNameFact
and rf => rf.ReferenceB == otherNameFact
are the same. The reason the issue goes away as soon as you change or add expressions, is that the opportunity for node sharing goes away. I'm working on fixing it.