Exemplo n.º 1
0
        public static QsiExpressionNode CreateChainedBinaryExpression <TContext>(
            string @operator,
            IEnumerable <TContext> contexts,
            Func <TContext, QsiExpressionNode> visitor,
            Action <TContext, QsiExpressionNode> callback = null)
        {
            QsiExpressionNode node = null;

            foreach (var context in contexts)
            {
                var elementNode = visitor(context);

                if (node == null)
                {
                    node = elementNode;
                }
                else
                {
                    var binaryNode = new QsiBinaryExpressionNode
                    {
                        Operator = @operator
                    };

                    binaryNode.Left.SetValue(node);
                    binaryNode.Right.SetValue(elementNode);

                    node = binaryNode;
                }

                callback?.Invoke(context, node);
            }

            return(node);
        }
Exemplo n.º 2
0
        public QsiExpressionNode VisitInPredicate(InPredicate inPredicate)
        {
            QsiExpressionNode node = TreeHelper.Create <QsiBinaryExpressionNode>(n =>
            {
                n.Operator = "IN";
                n.Left.SetValue(VisitScalarExpression(inPredicate.Expression));

                if (inPredicate.Subquery != null)
                {
                    n.Right.SetValue(VisitScalarSubquery(inPredicate.Subquery));
                }
                else
                {
                    n.Right.SetValue(TreeHelper.Create <QsiMultipleExpressionNode>(mn =>
                    {
                        mn.Elements.AddRange(inPredicate.Values.Select(VisitScalarExpression));
                    }));
                }
            });

            if (inPredicate.NotDefined)
            {
                node = TreeHelper.CreateUnary(SqlServerKnownOperator.Not, node);
            }

            SqlServerTree.PutFragmentSpan(node, inPredicate);

            return(node);
        }
Exemplo n.º 3
0
 public ImmutableHanaDerivedTableNode(
     IQsiTreeNode parent,
     IQsiTableDirectivesNode directives,
     IQsiColumnsDeclarationNode columns,
     IQsiTableNode source,
     IQsiAliasNode alias,
     IQsiWhereExpressionNode @where,
     IQsiGroupingExpressionNode grouping,
     IQsiMultipleOrderExpressionNode order,
     IQsiLimitExpressionNode limit,
     QsiExpressionNode top,
     HanaResultSetOperation?operation,
     QsiExpressionFragmentNode sampling,
     HanaTableBehaviorNode behavior,
     QsiExpressionFragmentNode timeTravel,
     QsiExpressionFragmentNode hint,
     IUserDataHolder userData)
 {
     Parent     = parent;
     Directives = directives;
     Columns    = columns;
     Source     = source;
     Alias      = alias;
     Where      = @where;
     Grouping   = grouping;
     Order      = order;
     Limit      = limit;
     Top        = top;
     Operation  = operation;
     Sampling   = sampling;
     Behavior   = behavior;
     TimeTravel = timeTravel;
     Hint       = hint;
     UserData   = userData;
 }
Exemplo n.º 4
0
        public static QsiUnaryExpressionNode CreateUnary(string @operator, QsiExpressionNode expression)
        {
            var node = new QsiUnaryExpressionNode
            {
                Operator = @operator
            };

            node.Expression.SetValue(expression);

            return(node);
        }
Exemplo n.º 5
0
        public QsiColumnNode VisitSelectScalarExpression(SelectScalarExpression selectScalarExpression)
        {
            QsiExpressionNode      expression = null;
            QsiColumnReferenceNode column     = null;

            if (selectScalarExpression.Expression is ColumnReferenceExpression columnReferenceExpression)
            {
                column = new QsiColumnReferenceNode
                {
                    Name = IdentifierVisitor.CreateQualifiedIdentifier(columnReferenceExpression.MultiPartIdentifier)
                };

                if (selectScalarExpression.ColumnName == null)
                {
                    SqlServerTree.PutFragmentSpan(column, selectScalarExpression);
                    return(column);
                }
            }
            else
            {
                expression = ExpressionVisitor.VisitScalarExpression(selectScalarExpression.Expression);
            }

            return(TreeHelper.Create <QsiDerivedColumnNode>(n =>
            {
                if (column != null)
                {
                    n.Column.SetValue(column);
                }
                else if (expression != null)
                {
                    n.Expression.SetValue(expression);
                }

                var columnName = selectScalarExpression.ColumnName;

                if (columnName != null)
                {
                    if (columnName.Identifier == null)
                    {
                        n.Alias.SetValue(new QsiAliasNode
                        {
                            Name = new QsiIdentifier(columnName.Value, false)
                        });
                    }
                    else
                    {
                        n.Alias.SetValue(CreateAliasNode(columnName.Identifier));
                    }
                }

                SqlServerTree.PutFragmentSpan(n, selectScalarExpression);
            }));
        }
Exemplo n.º 6
0
        public static QsiColumnNode VisitAliasedNode(AliasedNode node)
        {
            var               childNode      = node.Node.UnwrapAs <IParseNode>();
            bool              hasAlias       = !string.IsNullOrEmpty(node.Alias);
            QsiColumnNode     columnNode     = null;
            QsiExpressionNode expressionNode = null;

            switch (childNode.Unwrap())
            {
            case INamedParseNode namedNode:
                columnNode = VisitNamedParseNode(namedNode);
                break;

            case WildcardParseNode wildcardParseNode:
                columnNode = VisitWildcardParseNode(wildcardParseNode);
                break;

            default:
                expressionNode = ExpressionVisitor.Visit(childNode);
                break;
            }

            if (columnNode != null && !hasAlias)
            {
                return(columnNode);
            }

            return(TreeHelper.Create <QsiDerivedColumnNode>(n =>
            {
                if (hasAlias)
                {
                    n.Alias.SetValue(new QsiAliasNode
                    {
                        Name = IdentifierVisitor.Visit(node)
                    });
                }

                if (columnNode != null)
                {
                    n.Column.SetValue(columnNode);
                }

                if (expressionNode != null)
                {
                    n.Expression.SetValue(expressionNode);
                }

                PTree.RawNode[n] = node;
            }));
        }
Exemplo n.º 7
0
        private static QsiExpressionNode VisitIsNullParseNode(IsNullParseNode node)
        {
            QsiExpressionNode expressionNode = TreeHelper.Create <QsiInvokeExpressionNode>(n =>
            {
                n.Member.SetValue(TreeHelper.CreateFunction(PhoenixSqlKnownFunction.IsNull));
                n.Parameters.AddRange(node.Children.Select(Visit));
            });

            if (node.IsNegate)
            {
                expressionNode = TreeHelper.CreateUnary(PhoenixSqlKnownOperator.UnaryNot, expressionNode);
            }

            PTree.RawNode[expressionNode] = node;

            return(expressionNode);
        }
Exemplo n.º 8
0
        private static QsiExpressionNode VisitLikeParseNode(LikeParseNode node)
        {
            QsiExpressionNode expressionNode = TreeHelper.Create <QsiInvokeExpressionNode>(n =>
            {
                var function = node.LikeType == LikeType.CaseSensitive ?
                               PhoenixSqlKnownFunction.Like : PhoenixSqlKnownFunction.ILike;

                n.Member.SetValue(TreeHelper.CreateFunction(function));
                n.Parameters.AddRange(node.Children.Select(Visit));
            });

            if (node.IsNegate)
            {
                expressionNode = TreeHelper.CreateUnary(PhoenixSqlKnownOperator.UnaryNot, expressionNode);
            }

            PTree.RawNode[expressionNode] = node;

            return(expressionNode);
        }
Exemplo n.º 9
0
        public static QsiExpressionNode VisitSelectorModifier(QsiExpressionNode target, SelectorModifierContext context)
        {
            QsiExpressionNode       access1;
            SelectorModifierContext access2;

            switch (context)
            {
            case FieldAccessContext fieldAccess:
                access1 = VisitFieldSelectorModifier(fieldAccess.fieldSelectorModifier());
                access2 = fieldAccess.selectorModifier();
                break;

            case RangeAccessContext rangeAccess:
                access1 = VisitCollectionSubSelection(rangeAccess.collectionSubSelection());
                access2 = rangeAccess.selectorModifier();
                break;

            default:
                throw TreeHelper.NotSupportedTree(context);
            }

            var node = new QsiMemberAccessExpressionNode();

            node.Target.SetValue(target);
            node.Member.SetValue(access1);

            if (access2 == null)
            {
                return(node);
            }

            var memberAccessNode = VisitSelectorModifier(node, access2);

            CqlTree.PutContextSpan(memberAccessNode, context);

            return(memberAccessNode);
        }
Exemplo n.º 10
0
        public QsiExpressionNode VisitLikePredicate(LikePredicate likePredicate)
        {
            QsiExpressionNode node = TreeHelper.Create <QsiInvokeExpressionNode>(n =>
            {
                n.Member.SetValue(TreeHelper.CreateFunction(SqlServerKnownFunction.Like));

                n.Parameters.Add(VisitScalarExpression(likePredicate.FirstExpression));
                n.Parameters.Add(VisitScalarExpression(likePredicate.SecondExpression));

                if (likePredicate.EscapeExpression != null)
                {
                    n.Parameters.Add(VisitScalarExpression(likePredicate.EscapeExpression));
                }
            });

            if (likePredicate.NotDefined)
            {
                node = TreeHelper.CreateUnary(SqlServerKnownOperator.Not, node);
            }

            SqlServerTree.PutFragmentSpan(node, likePredicate);

            return(node);
        }
Exemplo n.º 11
0
 public SelectorPair(QsiExpressionNode expression)
 {
     Column     = null;
     Expression = expression;
 }
Exemplo n.º 12
0
 public SelectorPair(QsiColumnReferenceNode column)
 {
     Column     = column;
     Expression = null;
 }
Exemplo n.º 13
0
        public static QsiInvokeExpressionNode CreateInlineCast(CqlTypeExpressionNode type, QsiExpressionNode value)
        {
            var node = new QsiInvokeExpressionNode();

            node.Member.SetValue(TreeHelper.CreateFunction(CqlKnownFunction.InlineCast));
            node.Parameters.Add(value);
            node.Parameters.Add(type);

            return(node);
        }
Exemplo n.º 14
0
 public SelectorPair(QsiDeclaredColumnNode column)
 {
     Column     = column;
     Expression = null;
 }