public void Parse_should_exclude_empty_string_literals()
        {
            Expression expr;

            ExpressionUtility.TryParse("${name}", out expr);
            Assert.Equal(ExpressionType.Name, expr.ExpressionType);
        }
        /// Execute the creation of the parameter "facet.field"
        /// </summary>
        /// <param name="container">Container to parameters to request to SOLR</param>
        public void Execute(List <string> container)
        {
            if (!container.Contains("facet=true"))
            {
                container.Add("facet=true");
            }

            var aliasName  = this._expressionBuilder.GetPropertyNameFromExpression(this.Expression);
            var fieldName  = this._expressionBuilder.GetFieldNameFromExpression(this.Expression);
            var facetField = this.Excludes.GetSolrFacetWithExcludes(aliasName, fieldName);

            container.Add($"facet.field={facetField}");

            if (this.SortType.HasValue)
            {
                string typeName;
                string dummy;

                Checker.IsTrue <UnsupportedSortTypeException>(this.SortType.Value == FacetSortType.CountDesc || this.SortType.Value == FacetSortType.IndexDesc);

                ExpressionUtility.GetSolrFacetSort(this.SortType.Value, out typeName, out dummy);

                container.Add($"f.{fieldName}.facet.sort={typeName}");
            }

            container.Add($"f.{fieldName}.facet.mincount=1");

            if (this.Limit.HasValue)
            {
                container.Add($"f.{fieldName}.facet.limit={this.Limit.Value}");
            }
        }
        public void Parse_should_handle_nominal_expression_syntax()
        {
            Expression expr;

            ExpressionUtility.TryParse("${4 + a}", out expr);
            Assert.Equal("4 + a", expr.ToString());
        }
            /// <summary>
            /// Builds the Linq Expression for the provided propertyPath and type properties
            /// </summary>
            /// <param name="type">Type that exposes the property</param>
            /// <param name="propertyPath">Public property. Can be nested.</param>
            /// <returns>Resulting property expression</returns>
            /// <exception cref="ArgumentException">When property is not found on the specified type.</exception>
            public static Expression BuildPropertyExpression(Type type, string propertyPath)
            {
                if (type == null)
                {
                    throw new ArgumentNullException("type");
                }
                if (propertyPath == null)
                {
                    throw new ArgumentNullException("propertyPath");
                }

                Expression propertyExpression =
                    ExpressionUtility.GenerateProperty(type, propertyPath, Expression.Parameter(type, string.Empty));

                if (propertyExpression == null)
                {
                    throw new ArgumentException(string.Format(
                                                    CultureInfo.CurrentCulture,
                                                    Resources.PropertyNotFound,
                                                    propertyPath,
                                                    type.Name));
                }

                return(propertyExpression);
            }
        /// <summary>
        /// Execute the creation of the parameter "sort"
        /// </summary>
        /// <param name="container">Container to parameters to request to SOLR</param>
        public void Execute(List <string> container)
        {
            if (!container.Contains("facet=true"))
            {
                container.Add("facet=true");
            }

            var query = this.Query.Execute();

            container.Add($"facet.query={this.Excludes.GetSolrFacetWithExcludes(this.AliasName, query)}");

            if (this.SortType.HasValue)
            {
                string typeName;
                string dummy;

                Checker.IsTrue <UnsupportedSortTypeException>(this.SortType.Value == FacetSortType.CountDesc || this.SortType.Value == FacetSortType.IndexDesc);

                ExpressionUtility.GetSolrFacetSort(this.SortType.Value, out typeName, out dummy);

                container.Add($"f.{this.AliasName}.facet.sort={typeName}");
            }

            container.Add($"f.{this.AliasName}.facet.mincount=1");
        }
예제 #6
0
 // -, !, not unary operators
 protected Expression ParseUnary()
 {
     if (Token.Identity == TokenId.Minus || Token.Identity == TokenId.Exclamation ||
         Token.IdentifierIs("not"))
     {
         Token op = Token;
         NextToken();
         //if (op.Identity == TokenId.Minus && (Token.Identity == TokenId.IntegerLiteral ||
         //                               Token.Identity == TokenId.RealLiteral))
         //{
         //    Token.Text = "-" + Token.Text;
         //    Token.Position = op.Position;
         //    return ParsePrimary();
         //}
         Expression expr = ParseUnary();
         if (op.Identity == TokenId.Minus)
         {
             ExpressionUtility.CheckAndPromoteOperand(typeof(INegationSignatures), op.Text, ref expr, op.Position);
             expr = Expression.Negate(expr);
         }
         else
         {
             ExpressionUtility.CheckAndPromoteOperand(typeof(INotSignatures), op.Text, ref expr, op.Position);
             expr = Expression.Not(expr);
         }
         return(expr);
     }
     return(base.ParseExpression());
 }
        public void Parse_should_detect_escaped_expression()
        {
            Expression expr;

            ExpressionUtility.TryParse("$${4 + a}", out expr);
            Assert.Equal("[ '$', '{4 + a}' ]", expr.ToString());
        }
예제 #8
0
 private static object DoMathsOperation(object input, object operand, Func <Expression, Expression, BinaryExpression> operation)
 {
     return(input == null || operand == null
                         ? null
                         : ExpressionUtility.CreateExpression(operation, input.GetType(), operand.GetType(), input.GetType(), true)
            .DynamicInvoke(input, operand));
 }
예제 #9
0
        Expression ParseBetween(Expression expr)
        {
            NextToken();
            //var u = new UnaryExpressionParser(this.exprParser);
            //var parser = new UnaryExpressionParser(this.tokenCursor);

            var left = ParseUnary();

            ExpressionUtility.CheckAndPromoteOperands(typeof(IEqualitySignatures), ">=", ref expr, ref left, Token.Position);
            left = ExpressionUtility.GenerateGreaterThanEqual(expr, left);

            if (Token.Keyword != Keyword.And)
            {
                throw Error.TokenExpected(Token, Keyword.And);
            }

            NextToken();
            var right = ParseUnary();

            ExpressionUtility.CheckAndPromoteOperands(typeof(IEqualitySignatures), "<=", ref expr, ref right, Token.Position);
            right = ExpressionUtility.GenerateLessThanEqual(expr, right);

            expr = Expression.And(left, right);
            return(expr);
        }
        /// <summary>
        /// Execute creation of the parameter "facet field" using spatial formule
        /// </summary>
        /// <param name="container">Container to parameters to request to SOLR</param>
        public void Execute(List <string> container)
        {
            Checker.IsNullOrWhiteSpace(this.AliasName);
            Checker.IsNull(this.Expression);

            if (!container.Contains("facet=true"))
            {
                container.Add("facet=true");
            }

            var fieldName = this._expressionBuilder.GetFieldNameFromExpression(this.Expression);
            var formule   = ExpressionUtility.GetSolrSpatialFormule(this.FunctionType, fieldName, this.CenterPoint, this.Distance);
            var facetName = this.Excludes.GetSolrFacetWithExcludes(this.AliasName, formule);

            container.Add($"facet.query={facetName}");

            if (this.SortType.HasValue)
            {
                string typeName;
                string dummy;

                Checker.IsTrue <UnsupportedSortTypeException>(this.SortType.Value == FacetSortType.CountDesc || this.SortType.Value == FacetSortType.IndexDesc);

                ExpressionUtility.GetSolrFacetSort(this.SortType.Value, out typeName, out dummy);

                container.Add($"f.{this.AliasName}.facet.sort={typeName}");
            }

            container.Add($"f.{this.AliasName}.facet.mincount=1");
        }
예제 #11
0
        Expression ParseMultiplicative()
        {
            Expression left = ParseUnary();

            while (Token.Identity == TokenId.Asterisk || Token.Identity == TokenId.Slash ||
                   Token.Identity == TokenId.Percent || TokenIdentifierIs("mod"))
            {
                var op = Token;
                NextToken();
                Expression right = ParseUnary();
                ExpressionUtility.CheckAndPromoteOperands(typeof(IArithmeticSignatures), op.Text, ref left, ref right, op.Position);
                if (op.Is(TokenId.Asterisk))
                {
                    left = Expression.Multiply(left, right);
                }
                else if (op.Is(TokenId.Slash))
                {
                    left = Expression.Divide(left, right);
                }
                else if (op.Is(TokenId.Percent) || op.Is(TokenId.Identifier))
                {
                    left = Expression.Modulo(left, right);
                }
            }
            return(left);
        }
예제 #12
0
        /// <summary>
        /// Execute creation of the parameter "facet field" using spatial formule
        /// </summary>
        /// <param name="jObject">JSON object with parameters to request to SOLR</param>
        public void Execute(JObject jObject)
        {
            var facetObject = (JObject)jObject["facet"] ?? new JObject();

            var fieldName = this._expressionBuilder.GetFieldNameFromExpression(this.Expression);

            var formule = ExpressionUtility.GetSolrSpatialFormule(
                this.FunctionType,
                fieldName,
                this.CenterPoint,
                this.Distance);

            var array = new List <JProperty>
            {
                new JProperty("q", this.Excludes.GetSolrFacetWithExcludes(formule))
            };

            array.Add(new JProperty("mincount", 1));

            if (this.SortType.HasValue)
            {
                string typeName;
                string sortName;

                ExpressionUtility.GetSolrFacetSort(this.SortType.Value, out typeName, out sortName);

                array.Add(new JProperty("sort", new JObject(new JProperty(typeName, sortName))));
            }

            var jProperty = new JProperty(this.AliasName, new JObject(new JProperty("query", new JObject(array.ToArray()))));

            facetObject.Add(jProperty);

            jObject["facet"] = facetObject;
        }
예제 #13
0
        private Expression ParseMethodAccess(Expression instance, string methodName, Type type)
        {
            if (type == null)
            {
                type = instance.Type;
            }

            Debug.Assert(instance.Type == type);

            Expression[] args = ParseArgumentList();
            MethodBase   mb;

            var errorPos     = Token.Position;
            var methodsCount = ExpressionUtility.FindMethod(type, methodName, instance == null, args, out mb);

            switch (methodsCount)
            {
            case 0:
                throw Error.ParseError(errorPos, Res.NoApplicableMethod, methodName, TypeUtility.GetTypeName(type));

            case 1:
                MethodInfo method = (MethodInfo)mb;

                if (method.ReturnType == typeof(void))
                {
                    throw Error.ParseError(errorPos, Res.MethodIsVoid, methodName, TypeUtility.GetTypeName(method.DeclaringType));
                }

                return(Expression.Call(instance, (MethodInfo)method, args));

            default:
                throw Error.ParseError(errorPos, Res.AmbiguousMethodInvocation, methodName, TypeUtility.GetTypeName(type));
            }
        }
예제 #14
0
        private Expression ParseStaticMemberAccess(Type type, string methodName,
                                                   Expression[] args, Token errorToken)
        {
            MethodBase mb;

            var methodsCount = ExpressionUtility.FindMethod(type, methodName, true, args, out mb);

            switch (methodsCount)
            {
            case 0:
                throw Error.ParseError(errorToken, () => Res.NoApplicableMethod, methodName, TypeUtility.GetTypeName(type));

            case 1:
                MethodInfo method = (MethodInfo)mb;
                if (method.ReturnType == typeof(void))
                {
                    throw Error.ParseError(errorToken, Res.MethodIsVoid, methodName, TypeUtility.GetTypeName(method.DeclaringType));
                }

                return(Expression.Call(null, method, args));

            default:
                throw Error.ParseError(errorToken, Res.AmbiguousMethodInvocation, methodName, TypeUtility.GetTypeName(type));
            }
        }
예제 #15
0
        public void TestScoreChanged()
        {
            const string descr    = "TestScoreChanged";
            const int    penalty  = 10;
            const int    newScore = UserActionsManager.StartingScore - penalty;

            var dateService     = _container.Resolve <IDateTimeService>();
            var registratorMock = new Mock <IUserActionsRegistratorClient>(MockBehavior.Loose);

            registratorMock.Setup(reg => reg.RegisterUserActionsAsync(
                                      It.IsAny <long>(),
                                      It.IsAny <Guid>(),
                                      It.IsAny <ActionDescription[]>(),
                                      It.IsAny <bool>()))
            .Callback(() => registratorMock.Raise(mock => mock.RegisterUserActionsCompleted += null,
                                                  new RegisterUserActionsCompletedEventArgs(new object[] { newScore }, null, false, false)));

            var flag = false;

            using (var wrapper = DisposableWcfClientWrapper.Create(registratorMock.Object))
            {
                var manager = CreateUAManager(wrapper, dateService);
                manager.PropertyChanged               += (sender, args) =>
                                                  flag = args.PropertyName == ExpressionUtility.NameForMember((UserActionsManager m) => m.Score);
                manager.RegisterMistake(descr, penalty);

                Assert.That(manager.Score == newScore);
            }
        }
예제 #16
0
        // +, -, & operators
        private Expression ParseAdditive()
        {
            Expression left = ParseMultiplicative();

            while (Token.Identity == TokenId.Plus || Token.Identity == TokenId.Minus ||
                   Token.Identity == TokenId.Amphersand)
            {
                var op = Token;
                NextToken();
                Expression right = ParseMultiplicative();
                switch (op.Identity)
                {
                case TokenId.Plus:
                    if (left.Type == typeof(string) || right.Type == typeof(string))
                    {
                        goto case TokenId.Amphersand;
                    }

                    ExpressionUtility.CheckAndPromoteOperands(typeof(IAddSignatures), op.Text, ref left, ref right, op.Position);
                    left = GenerateAdd(left, right);
                    break;

                case TokenId.Minus:
                    ExpressionUtility.CheckAndPromoteOperands(typeof(IAddSignatures), op.Text, ref left, ref right, op.Position);
                    left = GenerateSubtract(left, right);
                    break;

                case TokenId.Amphersand:
                    left = GenerateStringConcat(left, right);
                    break;
                }
            }
            return(left);
        }
        /// <summary>
        /// Execute the creation of the parameter "sort"
        /// </summary>
        /// <param name="jObject">JSON object with parameters to request to SOLR</param>
        public void Execute(JObject jObject)
        {
            var facetObject = (JObject)jObject["facet"] ?? new JObject();

            var array = new List <JProperty>
            {
                new JProperty("q", this.Excludes.GetSolrFacetWithExcludes(this.Query.Execute()))
            };

            array.Add(new JProperty("mincount", 1));

            if (this.SortType.HasValue)
            {
                string typeName;
                string sortName;

                ExpressionUtility.GetSolrFacetSort(this.SortType.Value, out typeName, out sortName);

                array.Add(new JProperty("sort", new JObject(new JProperty(typeName, sortName))));
            }

            var jProperty = new JProperty(this.AliasName, new JObject(new JProperty("query", new JObject(array.ToArray()))));

            facetObject.Add(jProperty);

            jObject["facet"] = facetObject;
        }
예제 #18
0
        private static IEnumerable <object> BuildActions(ICollection <ActionDescription> actionDescriptions)
        {
            var actionNames = actionDescriptions
                              .Select(x => (x.ActionName, Key: (x.Controller, x.ActionMethodName, x.CustomActionImplementationOrder)))
                              .ToDictionary(x => $"{x.Key.Controller}.{x.Key.ActionMethodName}.{x.Key.CustomActionImplementationOrder}", x => x.ActionName);

            foreach (var entityActionGroup in actionDescriptions.GroupBy(x => x.ResponseType))
            {
                var actionKeys = entityActionGroup.AsEnumerable().Select(x => $"{x.Controller}.{x.ActionMethodName}.{x.CustomActionImplementationOrder}");
                var newActions = new Dictionary <string, string>();

                foreach (var actionKey in actionKeys)
                {
                    if (actionNames.TryGetValue(actionKey, out var newAction))
                    {
                        var split = actionKey.Split('.');
                        //var newKey = string.Join("", split[1], split[2]);
                        var newKey = split[1];
                        newActions.Add(newKey, newAction);
                    }
                }

                yield return(ExpressionUtility.CreateConstructor(typeof(EndpointAction <>).MakeGenericType(entityActionGroup.Key), typeof(IDictionary <string, string>))(newActions));
            }
        }
예제 #19
0
        // *, /, %, mod operators
        Expression ParseMultiplicative()
        {
            Expression left = ParseUnary();

            while (Token.Identity == TokenId.Asterisk || Token.Identity == TokenId.Slash ||
                   Token.Identity == TokenId.Percent || Token.IdentifierIs("mod"))
            {
                Token op = Token;
                NextToken();
                Expression right = ParseUnary();
                ExpressionUtility.CheckAndPromoteOperands(typeof(IArithmeticSignatures), op.Text, ref left, ref right, op.Position);
                switch (op.Identity)
                {
                case TokenId.Asterisk:
                    left = Expression.Multiply(left, right);
                    break;

                case TokenId.Slash:
                    left = Expression.Divide(left, right);
                    break;

                case TokenId.Percent:
                case TokenId.Identifier:
                    left = Expression.Modulo(left, right);
                    break;
                }
            }
            return(left);
        }
예제 #20
0
        private Expression <Func <TEntity, bool> > QueryHandle(IEnumerable <IParameter> parameters)
        {
            Expression <Func <TEntity, bool> > predicate = p => true;

            //if (nestedQueryTarget is not null)
            //{
            //    //var dirtyEntityName = nestedQueryTarget.Type.Name.Split("Response")[0] + "s";
            //    var foreign = _foreignEntityDefinitions.FirstOrDefault(x => x.ResponseType == nestedQueryTarget.Type);
            //    var baseProperty = Expression.Parameter(typeof(TEntity));
            //    var field = Expression.PropertyOrField(baseProperty, $"{foreign.EntityType.Name}s");
            //    var hm = Expression.Parameter(foreign.EntityType);
            //    var idField = Expression.PropertyOrField(hm, "Id");

            //    var call = Expression.Call(typeof(IEnumerable<Guid>), "Select", null, field, idField); // new[] { field.Type, typeof(Guid) }
            //    var cons = Expression.Constant(nestedQueryTarget.Id);

            //    var contains = typeof(Guid).GetMethod(nameof(Method.Contains), new[] { typeof(Guid) });
            //    var cont = Expression.Call(call, contains, cons);

            //    var ah = Expression.Lambda<Func<TEntity, bool>>(cont, baseProperty);
            //    return ah;

            //  //  var callSelect = Expression.Call(null, )
            //    //var access = Expression.ArrayAccess(field);

            //}

            foreach (var parameter in parameters)
            {
                predicate = ExpressionUtility.AndAlso(predicate, Filter(parameter));
            }

            return(predicate);
        }
        public static PpeService BuildService()
        {
            PpeService ppeService = new PpeService();

            //Customer.CustomerType
            ppeService.AddExpression <Customer>(nameof(CustomerBl.CustomerType), pe =>
            {
                var storeProperty  = Expression.Property(pe, nameof(Customer.Store));
                var personProperty = Expression.Property(pe, nameof(Customer.Person));

                var isStoreNotNull  = ExpressionUtility.IsNotNull(storeProperty);
                var isPersonNotNull = ExpressionUtility.IsNotNull(personProperty);

                return(Expression.Condition(isPersonNotNull,
                                            Expression.Constant(CustomerType.PERSON.GetDisplayValue()),
                                            Expression.Condition(isStoreNotNull,
                                                                 Expression.Constant(CustomerType.STORE.GetDisplayValue()),
                                                                 Expression.Constant(CustomerType.UNKNOWN.GetDisplayValue()))));
            });

            //Customer.DisplayName
            ppeService.AddExpression <Customer>(nameof(CustomerBl.DisplayName), pe =>
            {
                var storeProperty  = Expression.Property(pe, nameof(Customer.Store));
                var personProperty = Expression.Property(pe, nameof(Customer.Person));

                var storeName  = Expression.Property(storeProperty, nameof(Store.Name));
                var personName = ppeService.GetExpression <Person>(personProperty, nameof(PersonBl.DisplayName));

                var isStoreNotNull  = ExpressionUtility.IsNotNull(storeProperty);
                var isPersonNotNull = ExpressionUtility.IsNotNull(personProperty);

                return(Expression.Condition(isPersonNotNull,
                                            personName,
                                            Expression.Condition(isStoreNotNull,
                                                                 storeName,
                                                                 Expression.Constant(CustomerType.UNKNOWN.GetDisplayValue()))));
            });

            //Person.DisplayName
            ppeService.AddExpression <Person>(nameof(PersonBl.DisplayName), pe =>
            {
                var lastNameProperty    = Expression.Property(pe, nameof(Person.LastName));
                var firstNameProperty   = Expression.Property(pe, nameof(Person.FirstName));
                var separatorExpression = Expression.Constant(", ");

                var concatMethod = typeof(string).GetMethod(nameof(String.Concat), new[] { typeof(string), typeof(string) });

                return(Expression.Add( //using Expression.Add instead of Expression.Call because the translator has difficulties translating String.Concat
                           lastNameProperty,
                           Expression.Add(
                               separatorExpression,
                               firstNameProperty,
                               concatMethod),
                           concatMethod));
            });

            return(ppeService);
        }
예제 #22
0
        /// <summary>
        /// Execute the creation of the parameter "sort"
        /// </summary>
        /// <param name="jObject">JSON object with parameters to request to SOLR</param>
        public void Execute(JObject jObject)
        {
            var jArray = (JArray)jObject["filter"] ?? new JArray();

            jArray.Add(ExpressionUtility.GetSolrFilterWithTag(this.Value.Execute(), this.TagName));

            jObject["filter"] = jArray;
        }
예제 #23
0
 private void HandlePropertyChanged(PropertyChangedEventArgs args)
 {
     if (args.PropertyName == ExpressionUtility.NameForMember((IUiBlockerAsyncProcessor p) => p.IsBusy))
     {
         // Нас могли дёрнуть из другого потока, поэтому доступ к UI - через Dispatcher.
         Dispatcher.BeginInvoke(RecalculateIsLoadingData);
     }
 }
예제 #24
0
        private void OnSerializing(StreamingContext context)
        {
            var cleanedExpression = ExpressionUtility.Ensure(_predicate);
            var serializer        = new ExpressionSerializer();
            var xmlElement        = serializer.Serialize(cleanedExpression);

            _serializedPredicate = xmlElement.ToString();
        }
예제 #25
0
        public void CanGetSimplePropertyName()
        {
            // Act.
            string name = ExpressionUtility.GetPropertyName <TestClass, string>(u => u.MyProp);

            // Assert.
            Assert.That(name, Is.EqualTo("MyProp"));
        }
예제 #26
0
        public void ThrowsIfNotBinaryExpression()
        {
            // Act.
            string name;
            object value;

            ExpressionUtility.GetPropertyNameAndValue <TestClass>(u => true, out name, out value);
        }
예제 #27
0
 void OnDestroy()
 {
     luaenv.DoString(@"
             local util = require 'xlua.util'
     util.print_func_ref_by_csharp()");
     // if (luaenv != null) luaenv.Dispose ();
     ExpressionUtility.Dispose();
 }
예제 #28
0
        /// <summary>
        /// Execute the creation of the parameter "sort"
        /// </summary>
        /// <param name="container">Container to parameters to request to SOLR</param>
        public void Execute(List <string> container)
        {
            var fieldName = this._expressionBuilder.GetFieldNameFromExpression(this.Expression);

            var formule = ExpressionUtility.GetSolrSpatialFormule(this.FunctionType, fieldName, this.CenterPoint, this.Distance);

            container.Add($"fq={formule}");
        }
예제 #29
0
        /// <summary>
        /// Useful for working with values that are not the direct evaluation result of a parameter.
        /// This allows ExpressionNode authors to leverage the coercion and comparision functions
        /// for any values.
        ///
        /// Also note, the value will be canonicalized (for example numeric types converted to double) and any
        /// matching interfaces applied.
        /// </summary>
        public static EvaluationResult CreateIntermediateResult(
            EvaluationContext context,
            Object obj)
        {
            var val = ExpressionUtility.ConvertToCanonicalValue(obj, out ValueKind kind, out Object raw);

            return(new EvaluationResult(context, 0, val, kind, raw, omitTracing: true));
        }
예제 #30
0
 private Expression GenerateAdd(Expression left, Expression right)
 {
     if (left.Type == typeof(string) && right.Type == typeof(string))
     {
         return(ExpressionUtility.GenerateStaticMethodCall("Concat", left, right));
     }
     return(Expression.Add(left, right));
 }