Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Repo info
Activity
    Pravinskamane
    @Pravinskamane
    Hi, Is there a way to configure the Rules in database, and pull them to load the rules. Also how can we do some logging from the rule methods .
    4 replies
    Pravinskamane
    @Pravinskamane
    Hi, Thanks. Is there a way in which we can return any value from the Rule definition to the place of session.Fire()?
    1 reply
    Pravinskamane
    @Pravinskamane
    Is there a way to set ordering sequence on Rules. For example to execute rules in a particular sequence?
    2 replies
    Têng Ûi
    @tingwei628
    Hi @snikolayev , I wonder how to do rule dependency injection with Unity container.
    3 replies
    Pavel Moskalevich
    @happanda
    Hi there. Is there a way to write rules that react specifically to Fact creation vs Fact update? Lets say, Fact is a class with one bool variable. I'd like one Rule that will .Do something when such Fact is created, .Undo something when Fact is retracted. And a different rule to fire when this bool value changes only for already existing Facts. Is it possible?
    2 replies
    Pavel Moskalevich
    @happanda

    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?

    2 replies
    Maarten Louage
    @mlouage
    Hello, I'm a new to this powerful library! I have a question which I did not find the answer in the documentation: is it possible to inject a dependency into a rule? I have rules on my domain model like if Country is not in the list of allowed countries to travel to, set a warning. That list of allowed countries is managed through a service which calls an HTTP endpoint. How can I inject this service into the rule?
    6 replies
    Argiris Gerogiannis
    @ageroh
    Hi all,
    Have anybody used NRules.Language before ?
    Adrian
    @adriangonzalez
    @ageroh I haven't used it, but I am going to be trying it out this weekend :)
    Charanpreet Singh
    @charanpreetsinghda
    Hi there - is there a way to skip following rules within a ruleset as soon as a rule in that ruleset failed?
    6 replies
    morisamon
    @morisamon
    Hey everyone, is there a way to add dependency and option to resolve by rule builder and not by class definition?
    Best regards,
    Thank you :)
    1 reply
    davideps
    @davideps
    I'm looking for a rules engine and have two questions: (1) How well does nrules scale in terms of number of rules and facts? (2) would implementing backward changing be difficult? (I assume yes since it has not been done yet, but maybe there is little demand?)
    3 replies
    davideps
    @davideps
    ("chaining" not "changing")
    wangadeketan
    @wangadeketan
    @snikolayev How to log a rule if the rule condition failed ?
    10 replies
    karthik sundar
    @karthikn92-sundar
    Hello everyone, I want to use groupby to get the count and with the count I've to add some other logics. Is this possible ?
    1 reply
    wangadeketan
    @wangadeketan
    @snikolayev what is the next release date of Nrules ?
    Sergiy Nikolayev
    @snikolayev
    @wangadeketan definitely releasing new version this year. Hopefully much sooner than the EOY
    wangadeketan
    @wangadeketan
    Great
    christiansent
    @christiansent
    Hi,
    Hi, I have NRules working in an application, where the rules are in C#. The design has changed requiring the rules be moved to a database. I added Rules.Language, and it is working. Is there a way to set the priority number from the text rule? Also, when I included Console.WriteLine as in the example, I got a runtime error. I added "using System" to the rule - did not help. Works fine without this.
    2 replies
    christiansent
    @christiansent
    Possible to expand the GitHub example to show how to handle Not?
    1 reply
    christiansent
    @christiansent
    Figured out the NOT: not Attribute_DOUBLE(sr => sr.NameIs("SHOPRATE"));
    wangadeketan
    @wangadeketan
    @snikolayev Hi,
    How to call a multiple rules at one time from diff location with diff data ?
    11 replies
    christiansent
    @christiansent
    Hi Sergiy. Been using NRules for a couple years. In one application recently moved from C# to loading from database. Worked well until now, have a problem that I am having trouble root causing. Here is exception trace. Exception has occurred: CLR/System.ArgumentException
    An exception of type 'System.ArgumentException' occurred in System.Private.CoreLib.dll but was not handled in user code: 'Array may not be empty.'
    at System.DefaultBinder.SelectMethod(BindingFlags bindingAttr, MethodBase[] match, Type[] types, ParameterModifier[] modifiers)
    at NRules.RuleSharp.ParserContext.FindExtensionMethod(Type type, String methodName, Type[] argumentTypes)
    at NRules.RuleSharp.PrimaryExpressionBuilder.Method(String methodName, Type type, Expression instance, List1 argumentsList) at NRules.RuleSharp.PrimaryExpressionBuilder.Method(List1 argumentsList)
    at NRules.RuleSharp.ExpressionParser.VisitPrimary_expression(Primary_expressionContext context)
    at NRules.RuleSharp.Parser.RuleSharpParser.Primary_expressionContext.AcceptTResult
    at Antlr4.Runtime.Tree.AbstractParseTreeVisitor1.Visit(IParseTree tree) at NRules.RuleSharp.ExpressionParser.VisitUnary_expression(Unary_expressionContext context) at NRules.RuleSharp.Parser.RuleSharpParser.Unary_expressionContext.Accept[TResult](IParseTreeVisitor1 visitor)
    at Antlr4.Runtime.Tree.AbstractParseTreeVisitor1.Visit(IParseTree tree) at NRules.RuleSharp.ExpressionParser.VisitMultiplicative_expression(Multiplicative_expressionContext context) at NRules.RuleSharp.Parser.RuleSharpParser.Multiplicative_expressionContext.Accept[TResult](IParseTreeVisitor1 visitor)
    at Antlr4.Runtime.Tree.AbstractParseTreeVisitor1.Visit(IParseTree tree) at NRules.RuleSharp.ExpressionParser.VisitAdditive_expression(Additive_expressionContext context) at NRules.RuleSharp.Parser.RuleSharpParser.Additive_expressionContext.Accept[TResult](IParseTreeVisitor1 visitor)
    at Antlr4.Runtime.Tree.AbstractParseTreeVisitor1.VisitChildren(IRuleNode node) at NRules.RuleSharp.Parser.RuleSharpParserBaseVisitor1.VisitShift_expression(Shift_expressionContext context)
    at NRules.RuleSharp.Parser.RuleSharpParser.Shift_expressionContext.AcceptTResult
    at Antlr4.Runtime.Tree.AbstractParseTreeVisitor1.Visit(IParseTree tree) at NRules.RuleSharp.ExpressionParser.VisitRelational_expression(Relational_expressionContext context) at NRules.RuleSharp.Parser.RuleSharpParser.Relational_expressionContext.Accept[TResult](IParseTreeVisitor1 visitor)
    at Antlr4.Runtime.Tree.AbstractParseTreeVisitor1.Visit(IParseTree tree) at NRules.RuleSharp.ExpressionParser.VisitEquality_expression(Equality_expressionContext context) at NRules.RuleSharp.Parser.RuleSharpParser.Equality_expressionContext.Accept[TResult](IParseTreeVisitor1 visitor)
    at Antlr4.Runtime.Tree.AbstractParseTreeVisitor1.Visit(IParseTree tree) at NRules.RuleSharp.ExpressionParser.VisitAnd_expression(And_expressionContext context) at NRules.RuleSharp.Parser.RuleSharpParser.And_expressionContext.Accept[TResult](IParseTreeVisitor1 visitor)
    at Antlr4.Runtime.Tree.AbstractParseTreeVisitor1.Visit(IParseTree tree) at NRules.RuleSharp.ExpressionParser.VisitExclusive_or_expression(Exclusive_or_expressionContext context) at NRules.RuleSharp.Parser.RuleSharpParser.Exclusive_or_expressionContext.Accept[TResult](IParseTreeVisitor1 visitor)
    at Antlr4.Runtime.Tree.AbstractParseTreeVisitor1.Visit(IParseTree tree) at NRules.RuleSharp.ExpressionParser.VisitInclusive_or_expression(Inclusive_or_expressionContext context) at NRules.RuleSharp.Parser.RuleSharpParser.Inclusive_or_expressionContext.Accept[TResult](IParseTreeVisitor1 visitor)
    at Antlr4.Runtime.Tree.AbstractParseTreeVisitor1.Visit(IParseTree tree) at NRules.RuleSharp.ExpressionParser.VisitConditional_and_expression(Conditional_and_expressionContext context) at NRules.RuleSharp.Parser.RuleSharpParser.Conditional_and_expressionContext.Accept[TResult](IParseTreeVisitor1 visitor)
    2 replies
    Error happens when repository.LoadText is called
    christiansent
    @christiansent
    I figured it out, was error in function call on Fact
    1 reply
    christiansent
    @christiansent
    I had a function on the Fact object (Attribute_BASE with derived classes) with two parameters. The second was optional. I think that not supplying the optional second caused a problem. The problem disappeared when I split the function into two: 1) one parameter, 2) two parameters (second required, not optional). Hope this helps
    John Coleman
    @JohnSColeman
    Hi, what is the rul equivalent of this drl:
    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
    4 replies
    Sergiy Nikolayev
    @snikolayev
    PSA - moving forward, please ask questions related to NRules.RuleSharp, rul files, NRules.Language here: https://gitter.im/NRules/NRules.Language
    And keep asking questions about NRules fluent C# DSL and NRules runtime here in this forum
    1 reply
    karthik sundar
    @karthikn92-sundar
    Is there a way to dynamically change the right hand side values.
    For eg. When()
    .Query(() => currentCartItem, p => p
    .Match<ShoppingCartItem>(
    c => (c.Status != null && (c.Status.ToUpper() == "OPEN" || c.Status.ToUpper() == "P" || c.Status.ToUpper() == "NULL")) && c.NumberOfUniqueParts > '25'
    )
    .Collect()
    .Where(c => c.Any()));
                Then()
                    .Do(ctx => SendEmailNotification(currentCartItem));
    1 reply
    i want to change the NumberOfUniqueParts value from 25 to 50
    is this possible ?
    Entropy0
    @Entropy0

    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();
            }
        }
    }
    3 replies
    Sergiy Nikolayev
    @snikolayev
    @Entropy0 read my general response in the thread. Here is an example of a memory profile with a simple dictionary where the memory footprint is higher even after running GC
    Dictionary-Footprint.png
    NRules uses rete algorithm, so there are some bookkeeping structures to store partial matches within the Rete graph, so the memory utilization is larger than just a dictionary. But the profiler picture is generally the same - the objects are collected, but memory not fully reclaimed by the runtime
    Sergiy Nikolayev
    @snikolayev
    Here is the same memory profiler view with your sample:
    Rete-Footprint.png
    And diffing the snapshots shows that all objects related to the 1mil facts you inserted/retracted have not survived:
    Rete-Snapshot-Compare.png
    Entropy0
    @Entropy0
    @snikolayev Okay, so it's simply an issue with GC but the memory would still be available if needed? I think I can live with that.
    Thanks for the detailed and fast response :-)
    Sergiy Nikolayev
    @snikolayev
    @Entropy0 I wouldn’t characterize it as an “issue” with GC, but just as how it works. It collects the objects, it just doesn’t immediately return the memory to the OS. If there was memory pressure in the system I’m sure it would shrink the working set. And yes, if you allocate more objects that memory is available for them.
    wangadeketan
    @wangadeketan

    @snikolayev

    @wangadeketan definitely releasing new version this year. Hopefully much sooner than the EOY

    Any update ?

    4 replies
    Sergiy Nikolayev
    @snikolayev
    NRules 0.9.1 is out! See release notes for details: https://github.com/NRules/NRules/releases/v0.9.1
    larrybehaviorlanguage
    @larrybehaviorlanguage
    @snikolayev Congratulations on the release! Just a heads up that we happened to come across this issue purely by accident. I managed to repro it in a unit test in the NRules project, which I included in the ticket: NRules/NRules#246.
    When we first found it, our Or clauses were spread across multiple Or blocks deeply nested within Ands and Ors, but it turns out that I was able to repro the issue without any nesting at all.
    Sergiy Nikolayev
    @snikolayev
    Hi @larrybehaviorlanguage - thanks for a repro scenario - I can see the behavior you are describing in the repro test you created. I'm looking into this. I'll let you know what I find.
    larrybehaviorlanguage
    @larrybehaviorlanguage
    @snikolayev Great, thank you. The last point regarding “ Adding a call to a boolean-returning method at the end of the second clause's final test” threw me because I was adding methods like this in for debug logging and they suppressed the problem!