Пример #1
0
            internal void CallHandlers(string name, ITranslationResult result)
            {
                var tmpHandlers = new List <TranslationResultHandler>();
                var emptyCount  = 0;

                while (true)
                {
                    lock (_lock)
                    {
                        if (TryGetHandlers(name, out var handlers))
                        {
                            tmpHandlers.AddRange(handlers);
                            handlers.Clear();
                        }

                        if (emptyCount > 1 && tmpHandlers.Count == 0)
                        {
                            _tracker.Remove(name);
                            return;
                        }
                    }

                    if (tmpHandlers.Count == 0)
                    {
                        emptyCount++;
                        continue;
                    }
                    tmpHandlers.CallHandlers(result);
                    tmpHandlers.Clear();
                }
            }
        /// <summary>
        ///     Translates a LINQ expression into collection of query segments.
        /// </summary>
        /// <param name="expression">LINQ expression.</param>
        /// <param name="result">Translation result.</param>
        /// <returns>Collection of query segments.</returns>
        public void Translate(Expression expression, ITranslationResult result)
        {
            if (expression.NodeType != ExpressionType.Call)
            {
                return;
            }

            var methodCall = (MethodCallExpression)expression;

            // Visit method
            VisitMethodCall(methodCall, result);

            // ReSharper disable ForCanBeConvertedToForeach

            // Visit arguments
            for (int i = 0; i < methodCall.Arguments.Count; i++)
                {
                Expression argument = methodCall.Arguments[i];
                if (argument.NodeType == ExpressionType.Call)
                {
                    Translate(argument, result);
                }
            }

            // ReSharper restore ForCanBeConvertedToForeach
        }
Пример #3
0
        private void AddPostProcessing(MethodCallExpression method, ITranslationResult result)
        {
            Type type = method.Arguments[0].Type.GetGenericArguments()[0];
            ParameterExpression parameter = Expression.Parameter(typeof (IQueryable<>).MakeGenericType(type), null);
            MethodCallExpression call = Expression.Call(method.Method, parameter, method.Arguments[1]);

            result.AddPostProcesing(Expression.Lambda(call, parameter));
        }
Пример #4
0
        private void AddColumn(string parameterName, ITranslationResult result)
        {
            if (!_nameChanges.TryGetValue(parameterName, out string name))
            {
                name = parameterName;
            }

            result.AddColumn(name);
        }
Пример #5
0
        private void AddColumn(string parameterName, ITranslationResult result)
        {
            string name;
            if (!_nameChanges.TryGetValue(parameterName, out name))
            {
                name = parameterName;
            }

            result.AddColumn(name);
        }
Пример #6
0
        public void Translate(MethodCallExpression method, ITranslationResult result)
        {
            if (method.Method.Name != MethodName)
            {
                throw new ArgumentOutOfRangeException(nameof(method), $"Method '{nameof(method)}' is not supported");
            }

            var expressionTranslator = new ExpressionTranslator(_nameChanges);

            expressionTranslator.Translate(result, method);
        }
Пример #7
0
        public void Translate(MethodCallExpression method, ITranslationResult result)
        {
            if (method.Method.Name != MethodName)
            {
                var message = string.Format(Resources.TranslatorMemberNotSupported, method.NodeType);
                throw new ArgumentOutOfRangeException("method", message);
            }

            var expressionTranslator = new ExpressionTranslator(_nameChanges);
            expressionTranslator.Translate(result, method);
        }
Пример #8
0
        public void Translate(MethodCallExpression method, ITranslationResult result)
        {
            if (method.Method.Name != MethodName || method.Arguments.Count != 2)
            {
                var message = string.Format(Resources.TranslatorMemberNotSupported, method.NodeType);
                throw new ArgumentOutOfRangeException("method", message);
            }

            var constant = (ConstantExpression) method.Arguments[1];

            result.AddTop((int) constant.Value);
        }
Пример #9
0
        public void Translate(MethodCallExpression method, ITranslationResult result)
        {
            if (method.Method.Name != MethodName || method.Arguments.Count != 2)
            {
                var message = string.Format(Resources.TranslatorMemberNotSupported, method.NodeType);
                throw new ArgumentOutOfRangeException("method", message);
            }

            var constant = (ConstantExpression)method.Arguments[1];

            result.AddTop((int)constant.Value);
        }
        public void Translate(MethodCallExpression method, ITranslationResult result)
        {
            if (method.Method.Name != MethodName || method.Arguments.Count != 2)
            {
                var message = string.Format("Resources.TranslatorMethodNotSupported {0}", method.Method.Name);
                throw new ArgumentOutOfRangeException("method", message);
            }

            var lambda = (LambdaExpression)ExpressionTranslator.StripQuotes(method.Arguments[1]);

            // ReSharper disable ForCanBeConvertedToForeach

            if (lambda.Body.NodeType == ExpressionType.MemberInit)
            {
                var memberInit = (MemberInitExpression)lambda.Body;

                for (int i = 0; i < memberInit.Bindings.Count; i++)
                {
                    MemberBinding binding = memberInit.Bindings[i];
                    AddColumn(binding.Member.Name, result);
                }
            }
            else if (lambda.Body.NodeType == ExpressionType.New)
            {
                var newInstance = (NewExpression)lambda.Body;

                for (int i = 0; i < newInstance.Arguments.Count; i++)
                {
                    Expression argument = newInstance.Arguments[i];
                    var member = (MemberExpression)argument;
                    AddColumn(member.Member.Name, result);
                }
            }else if(lambda.Body.NodeType == ExpressionType.Parameter)
            {
                // from ent in source select ent.

            }else if(lambda.Body.NodeType == ExpressionType.MemberAccess)
            {
                //from ent in source select ent.Name
                var memberAccess = (MemberExpression)lambda.Body;
                AddColumn(memberAccess.Member.Name, result);
            }
            else
            {
                throw new NotSupportedException(string.Format("Resources.TranslatorMemberNotSupported {0}", lambda.Body.NodeType));
            }

            // ReSharper restore ForCanBeConvertedToForeach

            AddPostProcessing(method, result);
        }
Пример #11
0
        private void VisitMethodCall(MethodCallExpression methodCall, ITranslationResult result)
        {
            if (methodCall.Method.DeclaringType != typeof(System.Linq.Queryable))
            {
                throw new NotSupportedException(string.Format(Resources.TranslatorMethodNotSupported, methodCall.Method.Name));
            }

            // Get a method translator
            if (!_methodTranslators.TryGetValue(methodCall.Method.Name, out IMethodTranslator translator))
            {
                string message = string.Format(Resources.TranslatorMethodNotSupported, methodCall.Method.Name);
                throw new NotSupportedException(message);
            }

            translator.Translate(methodCall, result);
        }
Пример #12
0
        private void VisitMethodCall(MethodCallExpression methodCall, ITranslationResult result)
        {
            if (methodCall.Method.DeclaringType != typeof (System.Linq.Queryable))
            {
                throw new NotSupportedException(string.Format(Resources.TranslatorMethodNotSupported, methodCall.Method.Name));
            }

            // Get a method translator
            IMethodTranslator translator;

            if (!_methodTranslators.TryGetValue(methodCall.Method.Name, out translator))
            {
                string message = String.Format(Resources.TranslatorMethodNotSupported, methodCall.Method.Name);
                throw new NotSupportedException(message);
            }

            translator.Translate(methodCall, result);
        }
Пример #13
0
        public virtual ITranslationResult Translate(ITranslatable target, string language)
        {
            ITranslationResult result = null;

            foreach (KeyValuePair <string, Control> pair in target.TranslationTargets)
            {
                if (pair.Value is ITextControl)
                {
                    ITextControl textControl = pair.Value as ITextControl;
                    result = this.Translate(pair.Key, textControl.Text, language);
                    if (result.IsSuccessful())
                    {
                        textControl.Text = result.Translation;
                    }
                }
            }
            return(result);
        }
Пример #14
0
        public virtual void Translate(MethodCallExpression method, ITranslationResult result)
        {
            if (method.Method.Name != _methodName)
            {
                throw new ArgumentOutOfRangeException($"Method '{nameof(method)}' is not supported");
            }

            var expressionTranslator = new ExpressionTranslator(_nameChanges);

            MethodCallExpression targetMethod = method;

            if (method.Arguments.Count == 1 && method.Arguments[0].NodeType == ExpressionType.Call)
            {
                targetMethod = (MethodCallExpression)method.Arguments[0];
            }

            expressionTranslator.Translate(result, targetMethod);
            expressionTranslator.AddPostProcessing(method);
        }
        public virtual void Translate(MethodCallExpression method, ITranslationResult result)
        {
            if (method.Method.Name != _methodName)
            {
                string message = string.Format("Resources.TranslatorMethodNotSupported {0}", method.Method.Name);
                throw new ArgumentOutOfRangeException("method", message);
            }

            var expressionTranslator = new ExpressionTranslator(_configuration);

            MethodCallExpression targetMethod = method;

            if (method.Arguments.Count == 1 && method.Arguments[0].NodeType == ExpressionType.Call)
            {
                targetMethod = (MethodCallExpression)method.Arguments[0];
            }

            expressionTranslator.Translate(result, targetMethod);
            expressionTranslator.AddPostProcessing(method);
        }
        public void Translate(ITranslationResult result, MethodCallExpression method)
        {
            _result = result;

            if (method.Arguments.Count != 2)
            {
                return;
            }

            var lambda = (LambdaExpression) StripQuotes(method.Arguments[1]);

            if (lambda.Body.NodeType == ExpressionType.Constant)
            {
                return;
            }

            _filter = new StringBuilder();

            Visit(lambda.Body);

            _result.AddFilter(TrimString(_filter));
        }
        public void Translate(ITranslationResult result, MethodCallExpression method)
        {
            _result = result;

            if (method.Arguments.Count != 2)
            {
                return;
            }

            var lambda = (LambdaExpression)StripQuotes(method.Arguments[1]);

            if (lambda.Body.NodeType == ExpressionType.Constant)
            {
                return;
            }

            _filter = new StringBuilder();
            _keyFilters = new List<KeyFilter>();

            Visit(lambda.Body);

            var odataFilter = TrimString(_filter);

            if (_keyFilters.Any())
            {

                var filter = new StringBuilder();

                var keys = _keyFilters.GroupBy(k => k.Type)
                    .Select(k => new
                    {
                        k.Key,
                        PropertyName = string.Join(TableStorageContext.KeySeparator, k.OrderBy(v => v.Position).Select(v => v.PropertyName)),
                        StartsWithPattern = string.Join(TableStorageContext.KeySeparator, k.OrderBy(v => v.Position).Select(v => v.Value)),
                        HasStartsWith = k.Any(v=>v.StartsWith),// string.Join(TableStorageContext.KeySeparator, k.OrderBy(v => v.Position).Select(v => v.Value)),
                    }).ToArray();

                for (int i = 0; i < keys.Length; ++i)
                {

                    var key = keys[i];
                    if (!_nameChanges.Keys.Any(k => k.StartsWith(key.PropertyName)))
                        throw new Exception("Make sure that all the filters are used when having hasKeys(p=new { p.p1, p.p2}) ");

                    if (i > 0)
                        filter.Append(" and ");

                    if (!key.HasStartsWith)
                    {
                        filter.Append(key.Key);
                        filter.Append(" eq '");
                        filter.Append(key.StartsWithPattern);
                        filter.Append("'");

                    }else {

                        var length = key.StartsWithPattern.Length - 1;
                        var lastChar = key.StartsWithPattern[length];
                        var nextLastChar = (char)(lastChar + 1);
                        var startsWithEndPattern = key.StartsWithPattern.Substring(0, length) + nextLastChar;

                        filter.Append(key.Key);
                        filter.Append(" ge '");
                        filter.Append(key.StartsWithPattern);
                        filter.Append("' and ");
                        filter.Append(key.Key);
                        filter.Append(" lt '");
                        filter.Append(startsWithEndPattern);
                        filter.Append("'");

                    }

                }

                //var i = 0;
                //if (odataFilter.StartsWith(" and "))
                //    i = " and ".Length;
                //if (odataFilter.StartsWith("( and )"))
                //    i = "( and )".Length;

                //   "(( and ) and ) and"
                int idx = 0;
                do
                {
                    idx = odataFilter.IndexOf("( and )");
                    if (idx > -1)
                    {
                        odataFilter = odataFilter.Remove(idx, "( and )".Length);
                    }

                } while (idx > -1);
                if (odataFilter.Equals(" and "))
                    odataFilter = "";

                odataFilter = filter.ToString() + odataFilter;
            }

            _result.AddFilter(odataFilter);
        }
Пример #18
0
        internal static void CallHandlers(this IEnumerable <TranslationResultHandler> handlers, ITranslationResult result)
        {
            var count = 0;

            foreach (var handler in handlers)
            {
                count++;
                try
                {
                    handler(result);
                }
                catch (Exception err)
                {
                    Logger.LogError($"executing {handler.Method}: {err} {err.Message}");
                }
            }
        }
Пример #19
0
 protected static void FallbackTranslateAsync(string key, Action <ITranslationResult> onCompleted,
                                              ITranslationResult cannedResult)
 {
     _ = key;
     onCompleted(cannedResult);
 }
Пример #20
0
 internal void JobCompleteHandler(ITranslationResult _)
 {
     JobComplete();
 }
 public override void Translate(MethodCallExpression method, ITranslationResult result)
 {
     base.Translate(method, result);
     result.AddTop(1);
 }
Пример #22
0
 public void CallHandlers(NameScope scope, string name, ITranslationResult result)
 {
     _tracker[scope].CallHandlers(name, result);
 }
Пример #23
0
 protected void FallbackTranslateAsync(string _, Action <ITranslationResult> onCompleted, ITranslationResult cannedResult)
 {
     onCompleted(cannedResult);
 }