Ejemplo n.º 1
0
        protected override Expression VisitNewExpression(NewExpression expression)
        {
            if (expression.Type.Name == "Grouping`2")
            {
                var groupByClause = LinqUtility.PriorGroupBy(ModelVisitor)[0];
                ModelVisitor.QueryText.AppendFormat(" {0} ", LinqUtility.ResolvePropertyName(groupByClause.TranslateIntoName()));
                return(expression);
            }

            if (!TreatNewWithoutBracket)
            {
                ModelVisitor.QueryText.Append(" { ");
            }
            var e = (NewExpression)NamedExpression.CreateNewExpressionWithNamedArguments(ModelVisitor.Db, expression);

            for (int i = 0; i < e.Arguments.Count; i++)
            {
                VisitExpression(e.Arguments[i]);
                if (i != e.Arguments.Count - 1)
                {
                    ModelVisitor.QueryText.Append(" , ");
                }
            }
            if (!TreatNewWithoutBracket)
            {
                ModelVisitor.QueryText.Append(" } ");
            }

            return(e);
        }
Ejemplo n.º 2
0
        public void VisitLetClause(LetClause letClause, QueryModel queryModel, Type lhsType)
        {
            QueryText.AppendFormat(" let {0} = ", LinqUtility.ResolvePropertyName(letClause.ItemName));
            GetAqlExpression(letClause.LetExpression, queryModel);

            var subQuery = letClause.SubqueryExpression as SubQueryExpression;

            if (subQuery != null)
            {
                GetAqlExpression(subQuery, queryModel, handleLet: true);
                this.DontReturn = true;
            }
        }
Ejemplo n.º 3
0
        public static Expression WrapIntoNamedExpression(IArangoDatabase db, MemberInfo memberInfo, Expression argumentExpression)
        {
            var memberName = LinqUtility.ResolveMemberNameRaw(db, memberInfo);

            var expressionAsNamedExpression = argumentExpression as NamedExpression;

            if (expressionAsNamedExpression != null && expressionAsNamedExpression.Name == memberName)
            {
                return(expressionAsNamedExpression);
            }

            var namedExpression = CreateFromMemberName(memberName, argumentExpression);

            return(namedExpression);
        }
Ejemplo n.º 4
0
        protected override Expression VisitConstantExpression(ConstantExpression expression)
        {
            var parentModelVisitor = LinqUtility.FindParentModelVisitor(this.ModelVisitor);

            parentModelVisitor.ParameterNameCounter++;
            string parameterName = "P" + parentModelVisitor.ParameterNameCounter;

            parentModelVisitor.QueryData.BindVars.Add(new QueryParameter()
            {
                Name = parameterName, Value = expression.Value
            });

            ModelVisitor.QueryText.AppendFormat(" @{0} ", parameterName);

            return(expression);
        }
Ejemplo n.º 5
0
        public void VisitUpsertAndReturnClause(UpsertAndReturnClause upsertAndReturnClause, QueryModel queryModel)
        {
            QueryText.Append(" upsert ");
            GetAqlExpression(upsertAndReturnClause.SearchSelector, queryModel);

            QueryText.Append(" insert ");
            GetAqlExpression(upsertAndReturnClause.InsertSelector, queryModel);

            QueryText.Append(" update ");
            GetAqlExpression(upsertAndReturnClause.UpdateSelector, queryModel);

            CrudState.ModelVisitorHaveCrudOperation = true;
            CrudState.Collection       = LinqUtility.ResolveCollectionName(Db, upsertAndReturnClause.CollectionType);
            CrudState.ReturnResult     = upsertAndReturnClause.ReturnResult;
            CrudState.ReturnResultKind = "NEW";
        }
Ejemplo n.º 6
0
        public void VisitRemoveAndReturnClause(RemoveAndReturnClause removeAndReturnClause, QueryModel queryModel)
        {
            if (removeAndReturnClause.KeySelector != null)
            {
                QueryText.Append(" remove ");

                GetAqlExpression(removeAndReturnClause.KeySelector, queryModel);
            }
            else
            {
                QueryText.AppendFormat(" remove {0} ", LinqUtility.ResolvePropertyName(removeAndReturnClause.ItemName));
            }

            CrudState.ModelVisitorHaveCrudOperation = true;
            CrudState.Collection       = LinqUtility.ResolveCollectionName(Db, removeAndReturnClause.CollectionType);
            CrudState.ReturnResult     = removeAndReturnClause.ReturnResult;
            CrudState.ReturnResultKind = "OLD";
        }
Ejemplo n.º 7
0
        public void VisitInsertAndReturnClause(InsertAndReturnClause insertAndReturnClause, QueryModel queryModel)
        {
            if (insertAndReturnClause.WithSelector != null)
            {
                QueryText.Append(" insert ");

                GetAqlExpression(insertAndReturnClause.WithSelector, queryModel);
            }
            else
            {
                QueryText.AppendFormat(" insert {0} ", LinqUtility.ResolvePropertyName(insertAndReturnClause.ItemName));
            }

            CrudState.ModelVisitorHaveCrudOperation = true;
            CrudState.Collection       = LinqUtility.ResolveCollectionName(Db, insertAndReturnClause.CollectionType);
            CrudState.ReturnResult     = insertAndReturnClause.ReturnResult;
            CrudState.ReturnResultKind = "NEW";
        }
Ejemplo n.º 8
0
        protected override Expression VisitMemberExpression(MemberExpression expression)
        {
            var member = expression.Expression as MemberExpression;

            if ((member != null && member.Expression.Type.Name == "IGrouping`2"))
            {
                ModelVisitor.QueryText.AppendFormat(" {0} ", LinqUtility.ResolvePropertyName(expression.Member.Name));
            }
            else if (expression.Expression.Type.Name == "IGrouping`2")
            {
                var groupByClause = LinqUtility.PriorGroupBy(ModelVisitor)[0];

                var newExpression = groupByClause.Selector as NewExpression;
                if (newExpression != null)
                {
                    ModelVisitor.QueryText.Append(" { ");
                    for (int i = 0; i < newExpression.Members.Count; i++)
                    {
                        string memberName = newExpression.Members[i].Name;
                        ModelVisitor.QueryText.AppendFormat(" {0} : {1} ",
                                                            LinqUtility.ResolvePropertyName(memberName),
                                                            LinqUtility.ResolvePropertyName(memberName));

                        if (i != newExpression.Members.Count - 1)
                        {
                            ModelVisitor.QueryText.Append(" , ");
                        }
                    }
                    ModelVisitor.QueryText.Append(" } ");
                }

                if (groupByClause.Selector.NodeType != ExpressionType.New)
                {
                    ModelVisitor.QueryText.AppendFormat(" {0} ", LinqUtility.ResolvePropertyName(groupByClause.CollectVariableName));
                }
            }
            else
            {
                VisitExpression(expression.Expression);
                ModelVisitor.QueryText.AppendFormat(".{0} ", LinqUtility.ResolveMemberName(ModelVisitor.Db, expression.Member));
            }

            return(expression);
        }
Ejemplo n.º 9
0
        public override void VisitMainFromClause(MainFromClause fromClause, QueryModel queryModel)
        {
            if (fromClause.FromExpression as SubQueryExpression != null)
            {
                throw new Exception("MainFromClause.FromExpression cant be SubQueryExpression because group by is handle in itself clause");
            }

            string fromName = LinqUtility.ResolveCollectionName(this.Db, fromClause.ItemType);

            if (fromClause.FromExpression.Type.Name == "IGrouping`2")
            {
                var groupByClause = LinqUtility.PriorGroupBy(ParnetModelVisitor);

                var parentMVisitor = LinqUtility.FindParentModelVisitor(this);
                //parentMVisitor.GroupByNameCounter++;

                fromName = groupByClause[0].TranslateIntoName();

                fromName = LinqUtility.ResolvePropertyName(fromName);
            }

            if (fromClause.FromExpression.NodeType == ExpressionType.Constant ||
                fromClause.FromExpression.Type.Name == "IGrouping`2")
            {
                if (fromClause.FromExpression.Type.Name == "AqlQueryable`1" || fromClause.FromExpression.Type.Name == "IGrouping`2")
                {
                    QueryText.AppendFormat(" for {0} in {1} ", LinqUtility.ResolvePropertyName(fromClause.ItemName), fromName);
                }
                else
                {
                    QueryText.AppendFormat(" for {0} in ", LinqUtility.ResolvePropertyName(fromClause.ItemName));
                    GetAqlExpression(fromClause.FromExpression, queryModel);
                }
            }
            else
            {
                QueryText.AppendFormat(" for {0} in ", LinqUtility.ResolvePropertyName(fromClause.ItemName));
                GetAqlExpression(fromClause.FromExpression, queryModel);
            }

            base.VisitMainFromClause(fromClause, queryModel);
        }
Ejemplo n.º 10
0
        public override void VisitAdditionalFromClause(AdditionalFromClause fromClause, QueryModel queryModel, int index)
        {
            var subQuery = fromClause.FromExpression as SubQueryExpression;

            if (subQuery != null)
            {
                this.DontReturn = true;
                GetAqlExpression(subQuery, queryModel, handleJoin: true);
            }
            else if (fromClause.FromExpression.Type.Name == "AqlQueryable`1")
            {
                string fromName = LinqUtility.ResolveCollectionName(this.Db, fromClause.ItemType);
                QueryText.AppendFormat(" for {0} in {1} ", LinqUtility.ResolvePropertyName(fromClause.ItemName), fromName);
            }
            else
            {
                QueryText.AppendFormat(" for {0} in ", LinqUtility.ResolvePropertyName(fromClause.ItemName));
                GetAqlExpression(fromClause.FromExpression, queryModel);
            }
        }
Ejemplo n.º 11
0
        protected override Expression VisitQuerySourceReferenceExpression(QuerySourceReferenceExpression expression)
        {
            ModelVisitor.QueryText.AppendFormat(" {0}", LinqUtility.ResolvePropertyName(expression.ReferencedQuerySource.ItemName));

            var mainFromClause = expression.ReferencedQuerySource as MainFromClause;

            if (mainFromClause != null && mainFromClause.FromExpression.Type.Name == "IGrouping`2")
            {
                var groupByClauses = LinqUtility.PriorGroupBy(ModelVisitor);

                for (int i = 0; i < groupByClauses.Count; i++)
                {
                    ModelVisitor.QueryText.AppendFormat("{0}{1}{2}"
                                                        , i == 0 ? "." : ""
                                                        , LinqUtility.ResolvePropertyName(groupByClauses[i].FromParameterName)
                                                        , i != groupByClauses.Count - 1 ? "." : "");
                }
            }

            return(expression);
        }
Ejemplo n.º 12
0
        public void VisitUpdateAndReturnClause(UpdateAndReturnClause updateAndReturnClause, QueryModel queryModel)
        {
            if (updateAndReturnClause.KeySelector != null)
            {
                QueryText.AppendFormat(" {0} ", updateAndReturnClause.Command);

                GetAqlExpression(updateAndReturnClause.KeySelector, queryModel);

                QueryText.AppendFormat(" with ");
            }
            else
            {
                QueryText.AppendFormat(" {0} {1} with ", updateAndReturnClause.Command, LinqUtility.ResolvePropertyName(updateAndReturnClause.ItemName));
            }

            GetAqlExpression(updateAndReturnClause.WithSelector, queryModel);

            CrudState.ModelVisitorHaveCrudOperation = true;
            CrudState.Collection       = LinqUtility.ResolveCollectionName(Db, updateAndReturnClause.CollectionType);
            CrudState.ReturnResult     = updateAndReturnClause.ReturnResult;
            CrudState.ReturnResultKind = updateAndReturnClause.ReturnNewResult ? "NEW" : "OLD";
        }
Ejemplo n.º 13
0
        public void VisitGroupByClause(GroupByClause groupByClause, QueryModel queryModel, int index)
        {
            var parentMVisitor = LinqUtility.FindParentModelVisitor(this);

            parentMVisitor.GroupByNameCounter++;
            groupByClause.IntoName          = "C" + parentMVisitor.GroupByNameCounter;
            groupByClause.FuncIntoName      = Db.Setting.Linq.TranslateGroupByIntoName;
            groupByClause.FromParameterName = queryModel.MainFromClause.ItemName;

            QueryText.Append(" collect ");

            if (groupByClause.Selector.NodeType != ExpressionType.New)
            {
                groupByClause.CollectVariableName = "CV" + parentMVisitor.GroupByNameCounter;
                QueryText.AppendFormat(" {0} = ", LinqUtility.ResolvePropertyName(groupByClause.CollectVariableName));
            }

            GetAqlExpression(groupByClause.Selector, queryModel, true);

            QueryText.AppendFormat(" into {0} ", LinqUtility.ResolvePropertyName(groupByClause.TranslateIntoName()));

            groupByClause.Visited = true;
        }
Ejemplo n.º 14
0
        protected override Expression VisitMethodCallExpression(MethodCallExpression expression)
        {
            if (expression.Method.Name == "As")
            {
                VisitExpression(expression.Arguments[0]);
                return(expression);
            }

            string methodName;
            var    userFunction = ModelVisitor.Db.SharedSetting.AqlFunctions.FindFunctionAttribute(expression.Method);
            bool   methodExists = userFunction != null;

            if (methodExists)
            {
                methodName = userFunction.Name;
            }
            else
            {
                methodExists = aqlMethods.TryGetValue(expression.Method.Name, out methodName);
            }

            if (!methodExists)
            {
                throw new InvalidOperationException($"Method {expression.Method.Name} is not supported in AqlLinqProvider");
            }

            string argumentSeprator = null;
            bool   noParenthesis    = methodsWithNoParenthesis.TryGetValue(methodName, out argumentSeprator);

            if (!noParenthesis)
            {
                ModelVisitor.QueryText.AppendFormat(" {0}( ", methodName);
                argumentSeprator = " , ";
            }

            Type[] genericArguments = null;
            if (methodsWithFirstGenericArgument.Contains(methodName))
            {
                genericArguments = expression.Method.GetGenericArguments();
                var collection = LinqUtility.ResolveCollectionName(ModelVisitor.Db, genericArguments[0]);
                ModelVisitor.QueryText.AppendFormat(" {0}{1}", collection, argumentSeprator);
            }

            if (methodsWithSecondGenericArgument.Contains(methodName))
            {
                var collection = LinqUtility.ResolveCollectionName(ModelVisitor.Db, genericArguments[1]);
                ModelVisitor.QueryText.AppendFormat(" {0}{1}", collection, argumentSeprator);
            }

            for (int i = 0; i < expression.Arguments.Count; i++)
            {
                VisitExpression(expression.Arguments[i]);

                if (i != expression.Arguments.Count - 1)
                {
                    ModelVisitor.QueryText.Append(argumentSeprator);
                }
            }

            if (!noParenthesis)
            {
                ModelVisitor.QueryText.Append(" ) ");
            }

            return(expression);
        }
Ejemplo n.º 15
0
        protected override Expression VisitParameterExpression(ParameterExpression expression)
        {
            ModelVisitor.QueryText.AppendFormat(" {0} ", LinqUtility.ResolvePropertyName(expression.Name));

            return(expression);
        }