Exemplo n.º 1
0
        public RuleOptionsContext(RuleOptionsRequestReason reason, IRuleExpression expression)
            : this(reason, expression?.Descriptor)
        {
            Guard.NotNull(expression, nameof(expression));

            Value = expression.RawValue;
        }
        public virtual RuleOptionsResult GetOptions(
            RuleOptionsRequestReason reason,
            IRuleExpression expression,
            int pageIndex,
            int pageSize,
            string searchTerm)
        {
            Guard.NotNull(expression, nameof(expression));

            return(GetOptions(reason, expression.Descriptor, expression.RawValue, pageIndex, pageSize, searchTerm));
        }
        private ICollection <IRuleExpression> GetRuleExpressions(IRuleset ruleset)
        {
            IRuleExpression expr1_1 = ModelResolvers.RuleExprResolver(TestExprFactory.GetExpression("comp", ExpressionFactoryNameTarget.OperatorSymbol), ruleset);
            IRuleExpression expr1_2 = ModelResolvers.RuleExprResolver(TestExprFactory.GetExpression("comp", ExpressionFactoryNameTarget.OperatorSymbol), ruleset);
            IRuleExpression expr2_1 = ModelResolvers.RuleExprResolver(TestExprFactory.GetExpression("comp", ExpressionFactoryNameTarget.OperatorSymbol), ruleset);
            IRuleExpression expr2_2 = ModelResolvers.RuleExprResolver(TestExprFactory.GetExpression("comp", ExpressionFactoryNameTarget.OperatorSymbol), ruleset);
            IRuleExpression expr3_1 = ModelResolvers.RuleExprResolver(TestExprFactory.GetExpression("comp", ExpressionFactoryNameTarget.OperatorSymbol), ruleset);
            IRuleExpression expr3_2 = ModelResolvers.RuleExprResolver(TestExprFactory.GetExpression("comp", ExpressionFactoryNameTarget.OperatorSymbol), ruleset);
            IRuleExpression expr4_1 = ModelResolvers.RuleExprResolver(TestExprFactory.GetExpression("comp", ExpressionFactoryNameTarget.OperatorSymbol), ruleset);
            IRuleExpression expr4_2 = ModelResolvers.RuleExprResolver(TestExprFactory.GetExpression("comp", ExpressionFactoryNameTarget.OperatorSymbol), ruleset);

            expr1_1.Structure = ModelResolvers.DsResolver("x", ComponentType.Measure, BasicDataType.Integer);
            expr1_2.Structure = ModelResolvers.DsResolver("x", ComponentType.Measure, BasicDataType.Integer);
            expr2_1.Structure = ModelResolvers.DsResolver("y", ComponentType.Measure, BasicDataType.Integer);
            expr2_2.Structure = ModelResolvers.DsResolver("y", ComponentType.Measure, BasicDataType.Number);
            expr3_1.Structure = ModelResolvers.DsResolver("z", ComponentType.Measure, BasicDataType.String);
            expr3_2.Structure = ModelResolvers.DsResolver("z", ComponentType.Measure, BasicDataType.None);
            expr4_2.Structure = ModelResolvers.DsResolver("var4", ComponentType.Measure, BasicDataType.None);
            expr4_1.Structure = ModelResolvers.DsResolver("var4", ComponentType.Measure, BasicDataType.None);

            expr1_1.ExpressionText = "x";
            expr1_2.ExpressionText = "x";
            expr2_1.ExpressionText = "y";
            expr2_2.ExpressionText = "y";
            expr3_1.ExpressionText = "z";
            expr3_2.ExpressionText = "z";
            expr4_2.ExpressionText = "var4";
            expr4_1.ExpressionText = "var4";

            expr1_1.ResultName += "1_1";
            expr1_2.ResultName += "1_2";
            expr2_1.ResultName += "2_1";
            expr2_2.ResultName += "2_2";
            expr3_1.ResultName += "3_1";
            expr3_2.ResultName += "3_2";
            expr4_2.ResultName += "4_1";
            expr4_1.ResultName += "4_2";

            List <IRuleExpression> ruleExprs = new List <IRuleExpression>();

            ruleExprs.Add(expr1_1);
            ruleExprs.Add(expr1_2);
            ruleExprs.Add(expr2_1);
            ruleExprs.Add(expr2_2);
            ruleExprs.Add(expr3_1);
            ruleExprs.Add(expr3_2);
            ruleExprs.Add(expr4_1);
            ruleExprs.Add(expr4_2);

            return(ruleExprs);
        }
 public ChannelConstantComparerRule(IChannel ch, IChannel rch, object cons, IRuleExpression expression, IEventDefinition def) : base(def)
 {
     if (ch == null)
     {
         throw new ArgumentNullException();
     }
     if (rch == null)
     {
         throw new ArgumentNullException();
     }
     _channel                  = ch;
     _channelForRegister       = rch;
     _constant                 = cons;
     _expression               = expression;
     _channel.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(_channel_PropertyChanged);
 }
Exemplo n.º 5
0
        private static RuleExpressionInternal GetExpression(CodeExpression expression)
        {
            Type type   = expression.GetType();
            int  length = typeWrappers.Length;

            for (int i = 0; i < length; i++)
            {
                TypeWrapperTuple tuple = typeWrappers[i];
                if (type == tuple.codeDomType)
                {
                    return(tuple.internalExpression);
                }
            }
            IRuleExpression ruleExpr = expression as IRuleExpression;

            if (ruleExpr != null)
            {
                return(new CustomExpressionWrapper(ruleExpr));
            }
            return(null);
        }
Exemplo n.º 6
0
        private void EvaluateRule(Rule rule, ref MSRuleSetEvaluationResult ruleSetEvaluationResult, ref RuleValidation rv)
        {
            rv.Errors.Clear();

            IRuleExpression ruleExpression = (IRuleExpression)((RuleExpressionCondition)rule.Condition).Expression;

            RuleExecution      re   = new RuleExecution(rv, _instanceOfObject);
            RuleExpressionInfo info = RuleExpressionWalker.Validate(rv, (CodeExpression)ruleExpression, true);

            if (rv.Errors.Count > 0)
            {
                //string validationErrorMessages = Helper.GetErrorMessageFromValidationErrorsCollection(errors);

                ruleSetEvaluationResult.AddValidationError(rule.Name, rule.Description, rv.Errors);
            }
            else
            {
                RuleExpressionResult result = RuleExpressionWalker.Evaluate(re, (CodeExpression)ruleExpression);
                ruleSetEvaluationResult.AddEvaluationResult(rule.Name, rule.Description, result);
            }
        }
Exemplo n.º 7
0
        private static RuleExpressionInternal GetExpression(CodeExpression expression)
        {
            Type exprType        = expression.GetType();
            int  numTypeWrappers = typeWrappers.Length;

            for (int i = 0; i < numTypeWrappers; ++i)
            {
                TypeWrapperTuple tuple = typeWrappers[i];
                if (exprType == tuple.codeDomType)
                {
                    return(tuple.internalExpression);
                }
            }

            // It's not a builtin one... try a user extension expression.
            IRuleExpression ruleExpr = expression as IRuleExpression;

            if (ruleExpr != null)
            {
                return(new CustomExpressionWrapper(ruleExpr));
            }

            return(null);
        }
Exemplo n.º 8
0
 internal CustomExpressionWrapper(IRuleExpression ruleExpr)
 {
     this.ruleExpr = ruleExpr;
 }
 internal CustomExpressionWrapper(IRuleExpression ruleExpr)
 {
     this.ruleExpr = ruleExpr;
 }
Exemplo n.º 10
0
        /// <summary>
        /// Infers a basic data type of a component by a ruleset.
        /// </summary>
        /// <param name="expr">The component expression.</param>
        /// <param name="componentType">The type of a component.</param>
        /// <returns>The basic data type type of a component.</returns>
        private BasicDataType?InferByRuleset(IExpression expr, ComponentType?componentType)
        {
            BasicDataType?  dataType = null;
            IRuleExpression ruleExpr = expr.GetFirstAncestorExpr() as IRuleExpression;

            if (ruleExpr != null && componentType.In(ComponentType.Measure, null))
            {
                componentType = ComponentType.Measure;

                IRuleset ruleset = ruleExpr.ContainingRuleset;
                if (ruleset.Variables.ContainsKey(expr.ExpressionText))
                {
                    string parentOpSymbol = expr.ParentExpression.OperatorSymbol;

                    if (parentOpSymbol.In("match_characters", "trim", "rtrim", "ltrim", "upper", "lower", "replace", "length"))
                    {
                        dataType = BasicDataType.String;
                    }
                    else if (parentOpSymbol == "period_indicator")
                    {
                        dataType = BasicDataType.TimePeriod;
                    }
                    else if (parentOpSymbol == "substr")
                    {
                        if (expr.ParentExpression.Operands["ds_1"].ExpressionText == expr.ExpressionText)
                        {
                            dataType = BasicDataType.String;
                        }
                        else
                        {
                            dataType = BasicDataType.Integer;
                        }
                    }
                    else if (parentOpSymbol == "instr")
                    {
                        if (expr.ParentExpression.OperandsCollection.FirstOrDefault(op => op.ParamSignature.In("ds_1", "ds_2") && op.ExpressionText == expr.ExpressionText) != null)
                        {
                            dataType = BasicDataType.String;
                        }
                        else
                        {
                            dataType = BasicDataType.Integer;
                        }
                    }
                    else if (parentOpSymbol.In("mod", "round", "trunc", "log"))
                    {
                        if (expr.ParentExpression.Operands["ds_1"].ExpressionText == expr.ExpressionText)
                        {
                            dataType = BasicDataType.Number;
                        }
                        else
                        {
                            dataType = BasicDataType.Integer;
                        }
                    }
                    else if (parentOpSymbol == "time_agg")
                    {
                        if (expr.ParentExpression.Operands["ds_1"].ExpressionText == expr.ExpressionText)
                        {
                            dataType = BasicDataType.Time;
                        }
                        else
                        {
                            dataType = BasicDataType.Duration;
                        }
                    }
                    else if (parentOpSymbol.In("between", "in", "not_in"))
                    {
                        IEnumerable <IExpression> operands = expr.ParentExpression.OperandsCollection.Where(op => op.ExpressionText != expr.ExpressionText);
                        if (parentOpSymbol != "between")
                        {
                            operands = expr.ParentExpression.Operands["ds_2"].OperandsCollection;
                        }

                        foreach (IExpression operand in operands)
                        {
                            if (dataType != BasicDataType.Number)
                            {
                                operand.Structure = operand.OperatorDefinition.GetOutputStructure(operand);
                                dataType          = operand.Structure.Components[0].ValueDomain.DataType;
                            }
                        }
                    }
                    else if (parentOpSymbol == "if")
                    {
                        if (expr.ParentExpression.Operands["if"].ExpressionText == expr.ExpressionText)
                        {
                            dataType = BasicDataType.Boolean;
                        }
                        else
                        {
                            if (expr.ParentExpression.Operands["then"].ExpressionText == expr.ExpressionText && expr.ParentExpression.Operands["else"].ExpressionText != expr.ExpressionText)
                            {
                                IExpression operand = expr.ParentExpression.Operands["else"];
                                operand.Structure = operand.OperatorDefinition.GetOutputStructure(operand);
                                dataType          = operand.Structure.Components[0].ValueDomain.DataType;
                            }
                            else if (expr.ParentExpression.Operands["else"].ExpressionText == expr.ExpressionText && expr.ParentExpression.Operands["then"].ExpressionText != expr.ExpressionText)
                            {
                                IExpression operand = expr.ParentExpression.Operands["else"];
                                operand.Structure = operand.OperatorDefinition.GetOutputStructure(operand);
                                dataType          = operand.Structure.Components[0].ValueDomain.DataType;
                            }
                        }
                    }
                    else
                    {
                        IExpression operand = expr.ParentExpression.OperandsCollection.FirstOrDefault(op => op.ExpressionText != expr.ExpressionText);
                        if (operand != null && operand.OperatorSymbol != null)
                        {
                            operand.Structure = operand.OperatorDefinition.GetOutputStructure(operand);
                            dataType          = operand.Structure.Components[0].ValueDomain.DataType;
                        }
                    }

                    if (dataType == null)
                    {
                        dataType = BasicDataType.None;
                    }
                    expr.Structure = this.dsResolver(expr.ExpressionText, (ComponentType)componentType, (BasicDataType)dataType);

                    return(dataType);
                }

                if (ruleset.ValueDomains.ContainsKey(expr.ExpressionText))
                {
                    expr.Structure = this.dsResolver();
                    expr.Structure.Measures.Add(new StructureComponent(ruleset.ValueDomains[expr.ExpressionText], expr.ExpressionText, (ComponentType)componentType));

                    return(ruleset.ValueDomains[expr.ExpressionText].DataType);
                }
            }

            return(dataType);
        }
        public virtual RuleOptionsResult GetOptions(
            RuleOptionsRequestReason reason,
            IRuleExpression expression,
            int pageIndex,
            int pageSize,
            string searchTerm)
        {
            Guard.NotNull(expression, nameof(expression));
            Guard.NotNull(expression.Descriptor, nameof(expression.Descriptor));

            var result = new RuleOptionsResult();

            if (!(expression.Descriptor.SelectList is RemoteRuleValueSelectList list))
            {
                return(result);
            }

            var language = _services.WorkContext.WorkingLanguage;
            var byId     = expression.Descriptor.RuleType == RuleType.Int || expression.Descriptor.RuleType == RuleType.IntArray;
            List <RuleValueSelectListOption> options = null;

            switch (list.DataSource)
            {
            case "Product":
                if (reason == RuleOptionsRequestReason.SelectedDisplayNames)
                {
                    options = _productService.Value.GetProductsByIds(expression.RawValue.ToIntArray())
                              .Select(x => new RuleValueSelectListOption {
                        Value = x.Id.ToString(), Text = x.GetLocalized(y => y.Name, language, true, false), Hint = x.Sku
                    })
                              .ToList();
                }
                else
                {
                    result.IsPaged = true;
                    options        = SearchProducts(result, searchTerm, pageIndex * pageSize, pageSize);
                }
                break;

            case "Country":
                options = _countryService.Value.GetAllCountries(true)
                          .Select(x => new RuleValueSelectListOption {
                    Value = byId ? x.Id.ToString() : x.TwoLetterIsoCode, Text = x.GetLocalized(y => y.Name, language, true, false)
                })
                          .ToList();
                break;

            case "Currency":
                options = _currencyService.Value.GetAllCurrencies(true)
                          .Select(x => new RuleValueSelectListOption {
                    Value = byId ? x.Id.ToString() : x.CurrencyCode, Text = x.GetLocalized(y => y.Name, language, true, false)
                })
                          .ToList();
                break;

            case "DeliveryTime":
                options = _deliveryTimeService.Value.GetAllDeliveryTimes()
                          .Select(x => new RuleValueSelectListOption {
                    Value = x.Id.ToString(), Text = x.GetLocalized(y => y.Name, language, true, false)
                })
                          .ToList();
                break;

            case "CustomerRole":
                options = _customerService.Value.GetAllCustomerRoles(true)
                          .Select(x => new RuleValueSelectListOption {
                    Value = x.Id.ToString(), Text = x.Name
                })
                          .ToList();
                break;

            case "Language":
                options = _languageService.Value.GetAllLanguages(true)
                          .Select(x => new RuleValueSelectListOption {
                    Value = x.Id.ToString(), Text = GetCultureDisplayName(x) ?? x.Name
                })
                          .ToList();
                break;

            case "Store":
                options = _services.StoreService.GetAllStores()
                          .Select(x => new RuleValueSelectListOption {
                    Value = x.Id.ToString(), Text = x.Name
                })
                          .ToList();
                break;

            case "CartRule":
            case "TargetGroup":
                if (reason == RuleOptionsRequestReason.SelectedDisplayNames)
                {
                    options = _ruleStorage.Value.GetRuleSetsByIds(expression.RawValue.ToIntArray(), false)
                              .Select(x => new RuleValueSelectListOption {
                        Value = x.Id.ToString(), Text = x.Name
                    })
                              .ToList();
                }
                else
                {
                    var ruleSets = _ruleStorage.Value.GetAllRuleSets(false, false, expression.Descriptor.Scope, pageIndex, pageSize, false, true);
                    result.IsPaged     = true;
                    result.HasMoreData = ruleSets.HasNextPage;

                    options = ruleSets
                              .Select(x => new RuleValueSelectListOption {
                        Value = x.Id.ToString(), Text = x.Name
                    })
                              .ToList();
                }
                break;

            case "Category":
                if (reason == RuleOptionsRequestReason.SelectedDisplayNames)
                {
                    options = _categoryService.Value.GetCategoriesByIds(expression.RawValue.ToIntArray())
                              .Select(x => new RuleValueSelectListOption {
                        Value = x.Id.ToString(), Text = x.GetCategoryPath(_categoryService.Value).NullEmpty() ?? x.Name
                    })
                              .ToList();
                }
                else
                {
                    var categories = _categoryService.Value.GetCategoryTree(0, true).Flatten(false);
                    options = categories
                              .Select(x => new RuleValueSelectListOption {
                        Value = x.Id.ToString(), Text = x.GetCategoryPath(_categoryService.Value).NullEmpty() ?? x.Name
                    })
                              .ToList();
                }
                break;

            case "Manufacturer":
                options = _manufacturerService.Value.GetAllManufacturers(true)
                          .Select(x => new RuleValueSelectListOption {
                    Value = x.Id.ToString(), Text = x.GetLocalized(y => y.Name, language, true, false)
                })
                          .ToList();
                break;

            case "PaymentMethod":
                options = _providerManager.Value.GetAllProviders <IPaymentMethod>()
                          .Select(x => x.Metadata)
                          .Select(x => new RuleValueSelectListOption {
                    Value = x.SystemName, Text = GetLocalized(x, "FriendlyName") ?? x.FriendlyName.NullEmpty() ?? x.SystemName, Hint = x.SystemName
                })
                          .OrderBy(x => x.Text)
                          .ToList();
                break;

            case "ShippingRateComputationMethod":
                options = _providerManager.Value.GetAllProviders <IShippingRateComputationMethod>()
                          .Select(x => x.Metadata)
                          .Select(x => new RuleValueSelectListOption {
                    Value = x.SystemName, Text = GetLocalized(x, "FriendlyName") ?? x.FriendlyName.NullEmpty() ?? x.SystemName, Hint = x.SystemName
                })
                          .OrderBy(x => x.Text)
                          .ToList();
                break;

            case "ShippingMethod":
                options = _shippingService.Value.GetAllShippingMethods()
                          .Select(x => new RuleValueSelectListOption {
                    Value = byId ? x.Id.ToString() : x.Name, Text = byId ? x.GetLocalized(y => y.Name, language, true, false) : x.Name
                })
                          .ToList();
                break;

            case "ProductTag":
                options = _productTagService.Value.GetAllProductTags(true)
                          .Select(x => new RuleValueSelectListOption {
                    Value = x.Id.ToString(), Text = x.GetLocalized(y => y.Name, language, true, false)
                })
                          .OrderBy(x => x.Text)
                          .ToList();
                break;

            case "VariantValue":
                if (reason == RuleOptionsRequestReason.SelectedDisplayNames)
                {
                    var ids           = expression.RawValue.ToIntArray();
                    var variantValues = _variantValueRepository.Value.TableUntracked
                                        .Where(x => ids.Contains(x.Id))
                                        .ToList();

                    options = variantValues
                              .Select(x => new RuleValueSelectListOption {
                        Value = x.Id.ToString(), Text = x.GetLocalized(y => y.Name, language, true, false)
                    })
                              .ToList();
                }
                else if (expression.Descriptor.Metadata.TryGetValue("ParentId", out var objParentId))
                {
                    options = new List <RuleValueSelectListOption>();
                    var pIndex            = -1;
                    var existingValues    = new HashSet <string>(StringComparer.InvariantCultureIgnoreCase);
                    var multiValueTypeIds = new int[] { (int)AttributeControlType.Checkboxes, (int)AttributeControlType.RadioList, (int)AttributeControlType.DropdownList, (int)AttributeControlType.Boxes };
                    var query             = _variantValueRepository.Value.TableUntracked
                                            .Where(x =>
                                                   x.ProductVariantAttribute.ProductAttributeId == (int)objParentId &&
                                                   x.ProductVariantAttribute.ProductAttribute.AllowFiltering &&
                                                   multiValueTypeIds.Contains(x.ProductVariantAttribute.AttributeControlTypeId) &&
                                                   x.ValueTypeId == (int)ProductVariantAttributeValueType.Simple
                                                   )
                                            .OrderBy(x => x.DisplayOrder);

                    while (true)
                    {
                        var variantValues = PagedList.Create(query, ++pIndex, 500);
                        foreach (var value in variantValues)
                        {
                            var name = value.GetLocalized(x => x.Name, language, true, false);
                            if (!existingValues.Contains(name))
                            {
                                existingValues.Add(name);
                                options.Add(new RuleValueSelectListOption {
                                    Value = value.Id.ToString(), Text = name
                                });
                            }
                        }
                        if (!variantValues.HasNextPage)
                        {
                            break;
                        }
                    }
                }
                break;

            case "AttributeOption":
                if (reason == RuleOptionsRequestReason.SelectedDisplayNames)
                {
                    var ids = expression.RawValue.ToIntArray();
                    var attributeOptions = _attrOptionRepository.Value.TableUntracked
                                           .Where(x => ids.Contains(x.Id))
                                           .ToList();

                    options = attributeOptions
                              .Select(x => new RuleValueSelectListOption {
                        Value = x.Id.ToString(), Text = x.GetLocalized(y => y.Name, language, true, false)
                    })
                              .ToList();
                }
                else if (expression.Descriptor.Metadata.TryGetValue("ParentId", out var objParentId))
                {
                    var query = _attrOptionRepository.Value.TableUntracked
                                .Where(x => x.SpecificationAttributeId == (int)objParentId)
                                .OrderBy(x => x.DisplayOrder);

                    var attributeOptions = PagedList.Create(query, pageIndex, pageSize);

                    result.IsPaged     = true;
                    result.HasMoreData = attributeOptions.HasNextPage;

                    options = attributeOptions
                              .Select(x => new RuleValueSelectListOption {
                        Value = x.Id.ToString(), Text = x.GetLocalized(y => y.Name, language, true, false)
                    })
                              .ToList();
                }
                break;

            default:
                throw new SmartException($"Unknown data source \"{list.DataSource.NaIfEmpty()}\".");
            }

            if (options != null)
            {
                if (reason == RuleOptionsRequestReason.SelectedDisplayNames)
                {
                    // Get display names of selected options.
                    if (expression.RawValue.HasValue())
                    {
                        var selectedValues = expression.RawValue.SplitSafe(",");
                        result.Options.AddRange(options.Where(x => selectedValues.Contains(x.Value)));
                    }
                }
                else
                {
                    // Get select list options.
                    if (!result.IsPaged && searchTerm.HasValue() && options.Any())
                    {
                        // Apply the search term if the options are not paged.
                        result.Options.AddRange(options.Where(x => (x.Text?.IndexOf(searchTerm, 0, StringComparison.CurrentCultureIgnoreCase) ?? -1) != -1));
                    }
                    else
                    {
                        result.Options.AddRange(options);
                    }
                }
            }

            return(result);
        }
        /// <summary>
        /// Renders PlantUML code object based on a given VTL 2.0 expression.
        /// </summary>
        /// <param name="expr">The VTL 2.0 expression.</param>
        /// <param name="name">The name of PlantUML object to render.</param>
        /// <param name="space">The left margin of PlantUML object in the rendered code.</param>
        /// <returns>The PlantUML code.</returns>
        private string RenderObject(IExpression expr, string name, string space)
        {
            StringBuilder   sb       = new StringBuilder();
            IRuleExpression ruleExpr = (this._conf.ExprType == ExpressionsType.Rulesets && expr.ParentExpression == null) ? (IRuleExpression)expr : null;

            string size       = $"<size:{(int)(this._fontSize * 0.9)}>";
            string objectName = expr.ExpressionText;

            if (objectName == null || objectName == string.Empty)
            {
                objectName = " ";
            }

            string color = null;

            if (expr.OperatorSymbol == "join")
            {
                color = "#Moccasin";
            }
            else if (expr.ParentExpression?.OperatorSymbol == "join")
            {
                color = "#PapayaWhip";
            }
            else if (expr.ResultName == null || objectName != " ")
            {
                color = "#PHYSICAL";
            }

            if (ruleExpr != null)
            {
                color = "#BlanchedAlmond";
            }
            if (objectName == " ")
            {
                color = "#LightPink";
            }

            sb.AppendLine();
            sb.AppendLine($"{space}object \"{this.ReplaceQuotationMarks(objectName)}\" as {name} {color}{"{"}");
            sb.AppendLine($"{space}  {size}ResultName = '{expr.ResultName}'");
            sb.AppendLine($"{space}  {size}OperatorSymbol = '{expr.OperatorSymbol}'");
            if (expr.OperatorDefinition?.Keyword != null)
            {
                sb.AppendLine($"{space}  {size}OperatorKeyword = '{expr.OperatorDefinition.Keyword}'");
            }
            sb.AppendLine($"{space}  {size}IsScalar = {expr.IsScalar}");
            if (this._conf.ShowNumberLine)
            {
                sb.AppendLine($"{space}  {size}LineNumber = {expr.LineNumber}");
            }
            sb.AppendLine($"{space}  {size}ParamSignature = '{expr.ParamSignature}'");

            if (ruleExpr != null)
            {
                if (ruleExpr.ErrorCode != null)
                {
                    sb.AppendLine($"{space}  {size}errorCode = '{ruleExpr.ErrorCode}'");
                }
                if (ruleExpr.ErrorLevel != null)
                {
                    sb.AppendLine($"{space}  {size}errorLevel = {ruleExpr.ErrorLevel}");
                }
            }

            sb.AppendLine($"{space}{"}"}");

            if (expr.Structure != null && this._conf.ShowDataStructure)
            {
                sb.AppendLine();
                sb.Append(RenderDataStructureObject(expr.Structure, $"{name}_ds", name, space));
            }

            return(sb.ToString());
        }
Exemplo n.º 13
0
        public virtual RuleOptionsResult GetOptions(
            RuleOptionsRequestReason reason,
            IRuleExpression expression,
            int pageIndex,
            int pageSize,
            string searchTerm)
        {
            Guard.NotNull(expression, nameof(expression));
            Guard.NotNull(expression.Descriptor, nameof(expression.Descriptor));

            var result = new RuleOptionsResult();
            var list   = expression.Descriptor.SelectList as RemoteRuleValueSelectList;

            if (list == null)
            {
                return(result);
            }

            var language = _services.WorkContext.WorkingLanguage;
            var byId     = expression.Descriptor.RuleType == RuleType.Int || expression.Descriptor.RuleType == RuleType.IntArray;
            List <RuleValueSelectListOption> options = null;

            switch (list.DataSource)
            {
            case "Product":
                if (reason == RuleOptionsRequestReason.SelectedDisplayNames)
                {
                    options = _productService.Value.GetProductsByIds(expression.RawValue.ToIntArray())
                              .Select(x => new RuleValueSelectListOption {
                        Value = x.Id.ToString(), Text = x.GetLocalized(y => y.Name, language, true, false), Hint = x.Sku
                    })
                              .ToList();
                }
                else
                {
                    result.IsPaged = true;
                    options        = SearchProducts(result, searchTerm, pageIndex * pageSize, pageSize);
                }
                break;

            case "Country":
                options = _countryService.Value.GetAllCountries(true)
                          .Select(x => new RuleValueSelectListOption {
                    Value = byId ? x.Id.ToString() : x.TwoLetterIsoCode, Text = x.GetLocalized(y => y.Name, language, true, false)
                })
                          .ToList();
                break;

            case "Currency":
                options = _currencyService.Value.GetAllCurrencies(true)
                          .Select(x => new RuleValueSelectListOption {
                    Value = byId ? x.Id.ToString() : x.CurrencyCode, Text = x.GetLocalized(y => y.Name, language, true, false)
                })
                          .ToList();
                break;

            case "CustomerRole":
                options = _customerService.Value.GetAllCustomerRoles(true)
                          .Select(x => new RuleValueSelectListOption {
                    Value = x.Id.ToString(), Text = x.Name
                })
                          .ToList();
                break;

            case "Language":
                options = _languageService.Value.GetAllLanguages(true)
                          .Select(x => new RuleValueSelectListOption {
                    Value = x.Id.ToString(), Text = GetCultureDisplayName(x) ?? x.Name
                })
                          .ToList();
                break;

            case "Store":
                options = _services.StoreService.GetAllStores()
                          .Select(x => new RuleValueSelectListOption {
                    Value = x.Id.ToString(), Text = x.Name
                })
                          .ToList();
                break;

            case "CartRule":
            case "TargetGroup":
                if (reason == RuleOptionsRequestReason.SelectedDisplayNames)
                {
                    options = _ruleStorage.Value.GetRuleSetsByIds(expression.RawValue.ToIntArray(), false)
                              .Select(x => new RuleValueSelectListOption {
                        Value = x.Id.ToString(), Text = x.Name
                    })
                              .ToList();
                }
                else
                {
                    var ruleSets = _ruleStorage.Value.GetAllRuleSets(false, false, expression.Descriptor.Scope, pageIndex, pageSize, false, true);
                    result.IsPaged     = true;
                    result.HasMoreData = ruleSets.HasNextPage;

                    options = ruleSets
                              .Select(x => new RuleValueSelectListOption {
                        Value = x.Id.ToString(), Text = x.Name
                    })
                              .ToList();
                }
                break;

            case "Category":
                if (reason == RuleOptionsRequestReason.SelectedDisplayNames)
                {
                    options = _categoryService.Value.GetCategoriesByIds(expression.RawValue.ToIntArray())
                              .Select(x => new RuleValueSelectListOption {
                        Value = x.Id.ToString(), Text = x.GetCategoryPath(_categoryService.Value).NullEmpty() ?? x.Name
                    })
                              .ToList();
                }
                else
                {
                    var categories = _categoryService.Value.GetCategoryTree(0, true).Flatten(false);
                    options = categories
                              .Select(x => new RuleValueSelectListOption {
                        Value = x.Id.ToString(), Text = x.GetCategoryPath(_categoryService.Value).NullEmpty() ?? x.Name
                    })
                              .ToList();
                }
                break;

            case "Manufacturer":
                options = _manufacturerService.Value.GetAllManufacturers(true)
                          .Select(x => new RuleValueSelectListOption {
                    Value = x.Id.ToString(), Text = x.GetLocalized(y => y.Name, language, true, false)
                })
                          .ToList();
                break;

            case "PaymentMethod":
                options = _providerManager.Value.GetAllProviders <IPaymentMethod>()
                          .Select(x => x.Metadata)
                          .Select(x => new RuleValueSelectListOption {
                    Value = x.SystemName, Text = GetLocalized(x, "FriendlyName") ?? x.FriendlyName.NullEmpty() ?? x.SystemName, Hint = x.SystemName
                })
                          .OrderBy(x => x.Text)
                          .ToList();
                break;

            case "ShippingRateComputationMethod":
                options = _providerManager.Value.GetAllProviders <IShippingRateComputationMethod>()
                          .Select(x => x.Metadata)
                          .Select(x => new RuleValueSelectListOption {
                    Value = x.SystemName, Text = GetLocalized(x, "FriendlyName") ?? x.FriendlyName.NullEmpty() ?? x.SystemName, Hint = x.SystemName
                })
                          .OrderBy(x => x.Text)
                          .ToList();
                break;

            case "ShippingMethod":
                options = _shippingService.GetAllShippingMethods()
                          .Select(x => new RuleValueSelectListOption {
                    Value = byId ? x.Id.ToString() : x.Name, Text = byId ? x.GetLocalized(y => y.Name, language, true, false) : x.Name
                })
                          .ToList();
                break;

            default:
                throw new SmartException($"Unknown data source \"{list.DataSource.NaIfEmpty()}\".");
            }

            if (reason == RuleOptionsRequestReason.SelectedDisplayNames)
            {
                // Get display names of selected options.
                if (expression.RawValue.HasValue())
                {
                    var selectedValues = expression.RawValue.SplitSafe(",");
                    result.Options.AddRange(options.Where(x => selectedValues.Contains(x.Value)));
                }
            }
            else
            {
                // Get select list options.
                if (!result.IsPaged && searchTerm.HasValue() && options.Any())
                {
                    // Apply the search term if the options are not paged.
                    result.Options.AddRange(options.Where(x => (x.Text?.IndexOf(searchTerm, 0, StringComparison.CurrentCultureIgnoreCase) ?? -1) != -1));
                }
                else
                {
                    result.Options.AddRange(options);
                }
            }

            return(result);
        }
Exemplo n.º 14
0
 public TariffProfile(IRuleExpression <Tariff, AuthContext> rule)
 {
     _rule = rule;
 }