Пример #1
0
        private static ConditionBase Map(Expression expression)
        {
            var    binary    = expression as BinaryExpression;
            string operation = null;

            if (binary != null)
            {
                if (_singleExpressionMap.ContainsKey(binary.NodeType))
                {
                    operation = _singleExpressionMap[binary.NodeType];
                    return(new ComparitionCondition(GetValue(binary.Left), GetValue(binary.Right), operation));
                }

                if (_binaryExpressionMap.ContainsKey(binary.NodeType))
                {
                    operation = _binaryExpressionMap[binary.NodeType];
                    var condition = new LogicalCondition {
                        Operation = operation
                    };

                    condition.Conditions = new[]
                    {
                        Map(binary.Left),
                        Map(binary.Right)
                    };

                    return(condition);
                }
            }

            return(null);
        }
Пример #2
0
        public void setUp()
        {
            admin        = new User(0, "admin", "123456", true, true);
            basket_admin = admin.Basket;
            user         = new User(1, null, null, false, false);
            basket_user  = user.Basket;

            store = new Store(-1, "store");

            p1   = new Product(0, "first", "", "", 5000);
            p2   = new Product(1, "second", "", "", 5000);
            p3   = new Product(2, "third", "", "", 5000);
            p4   = new Product(3, "fourth", "", "", 5000);
            pis1 = new ProductInStore(10000000, store, p1);
            pis2 = new ProductInStore(10000000, store, p2);
            pis3 = new ProductInStore(10000000, store, p3);
            pis4 = new ProductInStore(10000000, store, p4);
            store.Products.Add(p1.Id, pis1);
            store.Products.Add(p2.Id, pis2);
            store.Products.Add(p3.Id, pis3);
            store.Products.Add(p4.Id, pis4);
            sys = new TradingSystem(null, null);
            sys.StoreCounter   = 1;
            sys.ProductCounter = 4;
            sys.UserCounter    = 2;
            sys.Stores.Add(store.Id, store);
            sys.Users.Add(admin.Id, admin);
            sys.Users.Add(user.Id, user);

            Dictionary <int, KeyValuePair <ProductInStore, int> > discountProduct = new Dictionary <int, KeyValuePair <ProductInStore, int> >();

            discountProduct.Add(p1.Id, new KeyValuePair <ProductInStore, int>(pis1, 0));
            rd_min = new RevealedDiscount(sys.DiscountPolicyCounter++, 0.2, discountProduct, new DateTime(2222, 1, 1), DuplicatePolicy.WithMultiplication);
            rd_mid = new RevealedDiscount(sys.DiscountPolicyCounter++, 0.25, discountProduct, new DateTime(2222, 1, 1), DuplicatePolicy.WithMultiplication);
            rd_max = new RevealedDiscount(sys.DiscountPolicyCounter++, 0.3, discountProduct, new DateTime(2222, 1, 1), DuplicatePolicy.WithMultiplication);


            rd_mid_without = new RevealedDiscount(sys.DiscountPolicyCounter++, 0.35, discountProduct, new DateTime(2222, 1, 1), DuplicatePolicy.WithoutMultiplication);
            rd_max_without = new RevealedDiscount(sys.DiscountPolicyCounter++, 1, discountProduct, new DateTime(2222, 1, 1), DuplicatePolicy.WithoutMultiplication);

            Dictionary <int, KeyValuePair <ProductInStore, int> > relatedProduct = new Dictionary <int, KeyValuePair <ProductInStore, int> >();

            relatedProduct.Add(p1.Id, new KeyValuePair <ProductInStore, int>(pis1, 2));
            lc1 = new LeafCondition(relatedProduct, 0, 0, null, new DateTime(), DuplicatePolicy.WithMultiplication);

            relatedProduct = new Dictionary <int, KeyValuePair <ProductInStore, int> >();
            relatedProduct.Add(p1.Id, new KeyValuePair <ProductInStore, int>(pis2, 1));
            lc2 = new LeafCondition(relatedProduct, 0, 0, null, new DateTime(), DuplicatePolicy.WithMultiplication);

            Dictionary <int, ProductInStore> ProductPrecentage = new Dictionary <int, ProductInStore>();

            ProductPrecentage.Add(pis1.Product.Id, pis1);
            ProductPrecentage.Add(pis2.Product.Id, pis2);

            lc = new LogicalCondition(0, 0.5, ProductPrecentage, new DateTime(2222, 1, 1), DuplicatePolicy.WithMultiplication, LogicalConnections.and);
            lc.addChild(0, lc1);
            lc.addChild(1, lc2);
        }
Пример #3
0
 public Condition(string eventname, string action, Variables actionvars, List <ConditionEntry> conditions,
                  LogicalCondition inner = LogicalCondition.Or,
                  LogicalCondition outer = LogicalCondition.Or)
 {
     EventName      = eventname;
     Action         = action;
     ActionVars     = new Variables(actionvars);
     InnerCondition = inner;
     OuterCondition = outer;
     Fields         = conditions;
 }
Пример #4
0
        public bool FromJSON(JObject jo)
        {
            try
            {
                Clear();

                JArray jf = (JArray)jo["FilterSet"];

                foreach (JObject j in jf)
                {
                    string           evname  = (string)j["EventName"];
                    LogicalCondition ftinner = (LogicalCondition)Enum.Parse(typeof(LogicalCondition), JSONHelper.GetStringDef(j["ICond"], "Or"));
                    LogicalCondition ftouter = (LogicalCondition)Enum.Parse(typeof(LogicalCondition), JSONHelper.GetStringDef(j["OCond"], "Or"));
                    string           act     = JSONHelper.GetStringDef(j["Actions"], "");
                    string           actd    = JSONHelper.GetStringDef(j["ActionData"], "");

                    JArray filset = (JArray)j["Filters"];

                    List <ConditionEntry> fieldlist = new List <ConditionEntry>();

                    foreach (JObject j2 in filset)
                    {
                        string item      = (string)j2["Item"];
                        string content   = (string)j2["Content"];
                        string matchtype = (string)j2["Matchtype"];

                        fieldlist.Add(new ConditionEntry()
                        {
                            itemname    = item,
                            matchstring = content,
                            matchtype   = (MatchType)Enum.Parse(typeof(MatchType), matchtype)
                        });
                    }

                    conditionlist.Add(new Condition()
                    {
                        eventname      = evname,
                        innercondition = ftinner,
                        outercondition = ftouter,
                        fields         = fieldlist,
                        action         = act,
                        actiondata     = actd
                    });
                }

                return(true);
            }
            catch { }

            return(false);
        }
Пример #5
0
            public string actiondata;                                            // any data

            public bool Create(string e, string a, string d, string i, string o) // i,o can have spaces inserted into enum
            {
                try
                {
                    eventname      = e;
                    action         = a;
                    actiondata     = d;
                    innercondition = (LogicalCondition)Enum.Parse(typeof(LogicalCondition), i.Replace(" ", ""), true);       // must work, exception otherwise
                    outercondition = (LogicalCondition)Enum.Parse(typeof(LogicalCondition), o.Replace(" ", ""), true);       // must work, exception otherwise
                    return(true);
                }
                catch { }

                return(false);
            }
        public void sutup()
        {
            p1    = new Product(0, "p1", null, null, 20);
            store = new Store(7, "a");
            pis1  = new ProductInStore(20, store, p1);

            p2   = new Product(1, "p2", null, null, 20);
            pis2 = new ProductInStore(20, store, p2);


            Dictionary <int, KeyValuePair <ProductInStore, int> > productList = new Dictionary <int, KeyValuePair <ProductInStore, int> >();

            productList.Add(p1.Id, new KeyValuePair <ProductInStore, int>(pis1, 1));
            rd = new RevealedDiscount(1, 0.5, productList, new DateTime(2222, 1, 1), DuplicatePolicy.WithMultiplication);


            Dictionary <int, KeyValuePair <ProductInStore, int> > relatedProducts = new Dictionary <int, KeyValuePair <ProductInStore, int> >();

            relatedProducts.Add(p1.Id, new KeyValuePair <ProductInStore, int>(pis1, 1));
            relatedProducts.Add(p2.Id, new KeyValuePair <ProductInStore, int>(pis2, 2));
            Dictionary <int, ProductInStore> discountproducts = new Dictionary <int, ProductInStore>();

            discountproducts.Add(p1.Id, pis1);
            discountproducts.Add(p2.Id, pis2);
            lc = new LeafCondition(relatedProducts, 10, 0.5, discountproducts, new DateTime(2222, 1, 1), DuplicatePolicy.WithMultiplication);
            relatedProducts = new Dictionary <int, KeyValuePair <ProductInStore, int> >();
            relatedProducts.Add(p1.Id, new KeyValuePair <ProductInStore, int>(pis1, 1));
            lc1 = new LeafCondition(relatedProducts, 10, 0.5, discountproducts, new DateTime(2222, 1, 1), DuplicatePolicy.WithMultiplication);

            relatedProducts = new Dictionary <int, KeyValuePair <ProductInStore, int> >();
            relatedProducts.Add(p2.Id, new KeyValuePair <ProductInStore, int>(pis2, 2));
            lc2 = new LeafCondition(relatedProducts, 10, 0.5, discountproducts, new DateTime(2222, 1, 1), DuplicatePolicy.WithMultiplication);

            logcAnd = new LogicalCondition(10, 0.5, discountproducts, new DateTime(2222, 1, 1), DuplicatePolicy.WithMultiplication, LogicalConnections.and);
            logcAnd.addChild(0, lc1);
            logcAnd.addChild(1, lc2);

            logcOr = new LogicalCondition(10, 0.5, discountproducts, new DateTime(2222, 1, 1), DuplicatePolicy.WithMultiplication, LogicalConnections.or);
            logcOr.addChild(0, lc1);
            logcOr.addChild(1, lc2);

            logcXor = new LogicalCondition(10, 0.5, discountproducts, new DateTime(2222, 1, 1), DuplicatePolicy.WithMultiplication, LogicalConnections.xor);
            logcXor.addChild(0, lc1);
            logcXor.addChild(1, lc2);
        }
Пример #7
0
        public void setUp()
        {
            store = new Store(1111, "adidas");

            admin        = new User(0, "admin", "1234", true, true);
            basket_admin = admin.Basket;
            ownerUser    = new User(1234, "Seifan", "2457", false, false);
            ownerUser.register(ownerUser.UserName, ownerUser.Password);
            ownerUser.signIn(ownerUser.UserName, ownerUser.Password);
            ownerRole = new Owner(store, ownerUser);
            ownerUser.Roles.Add(store.Id, ownerRole);


            p1   = new Product(0, "first", "", "", 100);
            p2   = new Product(1, "second", "", "", 50);
            p3   = new Product(2, "third", "", "", 200);
            p4   = new Product(3, "fourth", "", "", 300);
            pis1 = new ProductInStore(20, store, p1);
            pis2 = new ProductInStore(20, store, p2);
            pis3 = new ProductInStore(20, store, p3);
            pis4 = new ProductInStore(20, store, p4);
            store.Products.Add(p1.Id, pis1);
            store.Products.Add(p2.Id, pis2);
            store.Products.Add(p3.Id, pis3);
            store.Products.Add(p4.Id, pis4);

            products = new List <string>();
            products.Add("first");
            products.Add("second");
            products.Add("third");
            products.Add("fourth");


            system = new TradingSystem(null, null);
            system.Stores.Add(store.Id, store);
            system.Users.Add(admin.Id, admin);
            system.Users.Add(ownerUser.Id, ownerUser);
            logic     = LogicalConnections.and;
            duplicate = DuplicatePolicy.WithMultiplication;
            date1     = new DateTime(2019, 10, 1);

            lc = new LogicalCondition(0, 0.5, null, new DateTime(2222, 1, 1), DuplicatePolicy.WithMultiplication, LogicalConnections.and);
        }
Пример #8
0
        static public string GetLogicalCondition(BaseUtils.StringParser sp, string delimchars, out LogicalCondition value)
        {
            value = LogicalCondition.Or;

            string condi = sp.NextQuotedWord(delimchars);       // next is the inner condition..

            if (condi == null)
            {
                return("Condition operator missing");
            }

            condi = condi.Replace(" ", "");

            if (Enum.TryParse <ConditionEntry.LogicalCondition>(condi.Replace(" ", ""), true, out value))
            {
                return("");
            }
            else
            {
                return("Condition operator " + condi + " is not recognised");
            }
        }
        private static ConditionResult VerifyCondition(List <object> objects, LogicalCondition logicalCondition)
        {
            ConditionResult combinedResult = new ConditionResult()
            {
                Condition = logicalCondition
            };

            if (logicalCondition.Conditions.Count == 0)
            {
                combinedResult.PassedObjects = objects;
                combinedResult.Pattern       = Enumerable.Repeat(true, objects.Count()).ToList();
                return(combinedResult);
            }

            if (logicalCondition.BooleanOperator == BooleanOperator.NOT)
            {
                BH.Engine.Reflection.Compute.RecordError($"Boolean operator `{BooleanOperator.NOT}` is not applicable when combining filters.");
                return(null);
            }

            //if (logicalCondition.Conditions.Count > 1)
            //    BH.Engine.Reflection.Compute.RecordNote($"A total of {logicalCondition.Conditions.Count} filters were specified. The filters will be applied in sequential order: the result of the first filtering will be filtered by the second filter, and so on.");

            List <bool> passes = new List <bool>();

            Enumerable.Repeat(true, objects.Count);

            List <ConditionResult> results = new List <ConditionResult>();

            // FailInfos matrix: contains all failInfo, for each condition, for each object.
            var failInfos = new List <List <string> >();
            // ParentList = one subList of infos per each failed condition
            // SubList = one FailInfo per each failed object.

            List <string> allFailuresPerObject = new List <string>();

            foreach (var f in logicalCondition.Conditions)
            {
                if (f == null)
                {
                    continue;
                }

                ConditionResult r = IVerifyCondition(objects, f);
                if (r != null)
                {
                    results.Add(r);
                }

                failInfos.Add(r.FailInfo);
            }

            Dictionary <object, string> failInfoPerObject = new Dictionary <object, string>();

            foreach (var r in results)
            {
                for (int i = 0; i < r.FailedObjects.Count; i++)
                {
                    object failedObject = r.FailedObjects[i];
                    if (!failInfoPerObject.ContainsKey(failedObject))
                    {
                        failInfoPerObject[failedObject] = r.FailInfo[i];
                    }
                    else
                    {
                        failInfoPerObject[failedObject] += "\n\t" + r.FailInfo[i];
                    }
                }
            }

            IEnumerable <IEnumerable <bool> > patterns = results.Select(r => r.Pattern);
            List <bool> bools = AggreateBooleanSequences(patterns, logicalCondition.BooleanOperator);


            if (bools.Count != objects.Count)
            {
                BH.Engine.Reflection.Compute.RecordError("Error in combining filters.");
                return(new ConditionResult());
            }

            for (int i = 0; i < objects.Count; i++)
            {
                if (bools[i])
                {
                    combinedResult.PassedObjects.Add(objects[i]);
                }
                else
                {
                    combinedResult.FailedObjects.Add(objects[i]);
                }
            }

            // Add Failinfo in order
            foreach (var failedObj in combinedResult.FailedObjects)
            {
                string str;
                if (failInfoPerObject.TryGetValue(failedObj, out str))
                {
                    combinedResult.FailInfo.Add(str);
                }
            }

            combinedResult.Pattern = bools;

            return(combinedResult);
        }