Beispiel #1
0
        public static QsiExpressionNode VisitTermMultiplication(TermMultiplicationContext context)
        {
            MultiplicationOperatorContext[] operators = context.multiplicationOperator();
            var left = VisitTermGroup(context.left);

            if (ListUtility.IsNullOrEmpty(operators))
            {
                return(left);
            }

            TermGroupContext[] rights = context.termGroup();

            for (int i = 0; i < operators.Length; i++)
            {
                var node = new QsiBinaryExpressionNode
                {
                    Operator = operators[i].GetText()
                };

                node.Left.SetValue(left);
                node.Right.SetValue(VisitTermGroup(rights[i + 1]));

                left = node;

                var leftSpan  = CqlTree.Span[node.Left.Value];
                var rightSpan = CqlTree.Span[node.Right.Value];

                CqlTree.Span[node] = new Range(leftSpan.Start, rightSpan.End);
            }

            return(left);
        }
Beispiel #2
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);
        }
Beispiel #3
0
        public static QsiExpressionNode VisitTupleExpr(TupleExprContext context)
        {
            QsiExpressionNode node;

            var leftNode = VisitTupleOfIdentifiers(context.l);

            if (context.tupleInMarker != null || context.literals != null || context.markers != null)
            {
                var invokeNode = new QsiInvokeExpressionNode();

                invokeNode.Member.SetValue(TreeHelper.CreateFunction(CqlKnownFunction.In));
                invokeNode.Parameters.Add(leftNode);

                if (context.tupleInMarker != null)
                {
                    invokeNode.Parameters.Add(VisitBindParameter(context.tupleInMarker));
                }

                if (context.literals != null)
                {
                    invokeNode.Parameters.Add(VisitTupleOfTupleLiterals(context.literals));
                }

                if (context.markers != null)
                {
                    invokeNode.Parameters.Add(VisitTupleOfMarkersForTuples(context.markers));
                }

                node = invokeNode;
            }
            else if (context.literal != null || context.tupleMarker != null)
            {
                var binaryNode = new QsiBinaryExpressionNode
                {
                    Operator = context.op.GetText()
                };

                binaryNode.Left.SetValue(leftNode);

                if (context.literal != null)
                {
                    binaryNode.Right.SetValue(VisitTupleLiteral(context.literal));
                }

                if (context.tupleMarker != null)
                {
                    binaryNode.Right.SetValue(VisitBindParameter(context.tupleMarker));
                }

                node = binaryNode;
            }
            else
            {
                node = new CqlTupleExpressionNode();
            }

            CqlTree.PutContextSpan(node, context);

            return(node);
        }
Beispiel #4
0
        public static QsiExpressionNode VisitColumnCondition(ColumnConditionContext context)
        {
            QsiExpressionNode node;

            var leftNode = VisitCident(context.l);

            if (context.element != null || context.field != null)
            {
                var memberAccessNode = new QsiMemberAccessExpressionNode();

                memberAccessNode.Target.SetValue(leftNode);

                if (context.element != null)
                {
                    var indexerNode = new CqlIndexerExpressionNode();
                    indexerNode.Indexer.SetValue(VisitTerm(context.element));
                    memberAccessNode.Member.SetValue(indexerNode);
                }
                else
                {
                    memberAccessNode.Member.SetValue(new QsiFieldExpressionNode
                    {
                        Identifier = new QsiQualifiedIdentifier(context.field.id)
                    });
                }

                leftNode = memberAccessNode;
            }

            if (context.op != null)
            {
                var binaryNode = new QsiBinaryExpressionNode
                {
                    Operator = context.op.GetText()
                };

                binaryNode.Left.SetValue(leftNode);
                binaryNode.Right.SetValue(VisitTerm(context.r1));

                node = binaryNode;
            }
            else
            {
                var invokeNode = new QsiInvokeExpressionNode();

                invokeNode.Member.SetValue(TreeHelper.CreateFunction(CqlKnownFunction.In));
                invokeNode.Parameters.Add(leftNode);
                invokeNode.Parameters.Add(VisitSingleColumnInValues(context.r2));

                node = invokeNode;
            }

            CqlTree.PutContextSpan(node, context);

            return(node);
        }
Beispiel #5
0
        public static QsiExpressionNode VisitNormalColumnOperation2(NormalColumnOperation2Context context)
        {
            var node = new QsiBinaryExpressionNode();

            node.Left.SetValue(VisitCident(context.l));
            node.Operator = context.sig.Text;
            node.Right.SetValue(VisitTerm(context.r));

            CqlTree.PutContextSpan(node, context);

            return(node);
        }
Beispiel #6
0
        public static QsiExpressionNode VisitLogicalExpr1(LogicalExpr1Context context)
        {
            var node = new QsiBinaryExpressionNode
            {
                Operator = context.op.GetText()
            };

            node.Left.SetValue(VisitCident(context.l));
            node.Right.SetValue(VisitTerm(context.r));

            CqlTree.PutContextSpan(node, context);

            return(node);
        }
Beispiel #7
0
        public static QsiExpressionNode VisitNormalColumnOperation1(NormalColumnOperation1Context context)
        {
            if (context.r == null)
            {
                return(VisitTerm(context.l));
            }

            var node = new QsiBinaryExpressionNode();

            node.Left.SetValue(VisitTerm(context.l));
            node.Operator = "+";

            node.Right.SetValue(VisitCident(context.r));

            CqlTree.PutContextSpan(node, context);

            return(node);
        }
Beispiel #8
0
        public static QsiExpressionNode VisitLogicalExpr2(LogicalExpr2Context context)
        {
            var node = new QsiBinaryExpressionNode
            {
                Operator = context.op.GetText()
            };

            var leftNode    = new QsiMemberAccessExpressionNode();
            var indexerNode = new CqlIndexerExpressionNode();

            indexerNode.Indexer.SetValue(VisitTerm(context.key));

            leftNode.Target.SetValue(VisitCident(context.l));
            leftNode.Member.SetValue(indexerNode);

            node.Left.SetValue(leftNode);
            node.Right.SetValue(VisitTerm(context.r));

            CqlTree.PutContextSpan(node, context);

            return(node);
        }