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); }
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); }
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; }
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); }
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); }
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); }
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); }