Пример #1
0
        public override void Format(NodeExpression finalExpression, IQueryMapping mapping)
        {
            MethodCallNode methodCallNode = (MethodCallNode)binary.LeftNode;
            ConstantNode   methodCallArg  = (ConstantNode)binary.RightNode;

            if (!mapping.Mappings.TryGetValue(methodCallNode.MemberName, out var identifier))
            {
                identifier = methodCallNode.MemberName;
            }

            finalExpression.Append('(');
            finalExpression.Append(identifier);

            finalExpression.Append(' ');
            finalExpression.Append(OperationAsString(binary.Operation));
            finalExpression.Append(' ');

            var parameterName = methodCallNode.MemberName.Replace(".", "");
            var type          = methodCallArg.ParameterType;


            if (type != typeof(string) && (type.IsArray || typeof(IEnumerable).IsAssignableFrom(type)))
            {
                parameterName += "Collection";
            }

            finalExpression.Append(methodCallNode.Formatter($"@{parameterName}"));

            finalExpression.Parameters.Add(new NodeParameter(parameterName, methodCallArg.Value));
            finalExpression.Append(')');
        }
Пример #2
0
        private NodeExpression ParseLoopStatement()
        {
            EatToken(TokenType.KeywordLoop);
            NodeExpression body = ParseStatement();

            return(new LoopStatement(body));
        }
Пример #3
0
        public void CreateBranched()
        {
            var paragraphOne = Generate("p", "one");
            var paragraphTwo = Generate("p", "two");

            var div = Generate("div", "one\n\ntwo", new[]
            {
                paragraphOne,
                paragraphTwo
            });

            var body = Generate("body", "one\n\ntwo", new[] { div });

            var document = A.Fake <IDocument>();

            A.CallTo(() => document.Body).Returns(body);

            var result = NodeExpression.Generate(document, new TextIndexer());

            var divExpression = result.Children[0];

            var paragraphOneExpression = divExpression.Children[0];
            var paragraphTwoExpression = divExpression.Children[1];

            result.Children.Count.ShouldBe(1);
            divExpression.Children.Count.ShouldBe(2);

            result.Content.ShouldBe(divExpression.Content);
            result.NodeType.ShouldNotBe(divExpression.NodeType);

            paragraphOneExpression.NodeType.ShouldBe(paragraphTwoExpression.NodeType);
            paragraphOneExpression.Content.ShouldNotBe(paragraphTwoExpression.NodeType);
        }
Пример #4
0
        private void FormatValueExpression(MemberAccessNode me, ConstantNode ce, NodeExpression finalExpression)
        {
            if (ce.Value is null && !ce.ForceParameter)
            {
                return;
            }

            finalExpression.Append(' ');

            var memberName    = me.Parent != null ? $"{me.Parent.MemberName}.{me.MemberName}" : me.MemberName;
            var parameterName = memberName.Replace(".", "");
            var type          = ce.ParameterType;

            if (type != typeof(string) && (type.IsArray || typeof(IEnumerable).IsAssignableFrom(type)))
            {
                parameterName += "Collection";
            }

            if (me.Formatter != null)
            {
                finalExpression.Append(me.Formatter($"@{parameterName}"));
            }
            else
            {
                finalExpression.Append($"@{parameterName}");
            }

            finalExpression.Parameters.Add(new NodeParameter(parameterName, ce.Value));
        }
Пример #5
0
        private NodeExpression FinishAssignment(NodeExpression left)
        {
            EatToken(TokenType.Equal);
            var right = ParseExpression();

            return(new AssignmentExpression(left, right));
        }
Пример #6
0
        private void FormatMemberExpression(MemberAccessNode me, ConstantNode ce, NodeExpression finalExpression, IQueryMapping mapping)
        {
            var memberName = me.Parent != null ? $"{me.Parent.MemberName}.{me.MemberName}" : me.MemberName;

            if (me.MemberName.StartsWith('@'))
            {
                var parameterName = (me.Parent != null ? $"{me.Parent.MemberName}{me.MemberName}" : me.MemberName)
                                    .Replace(".", "")
                                    .Replace("@", "");

                var type = ce.ParameterType;

                if (type != typeof(string) && (type.IsArray || typeof(IEnumerable).IsAssignableFrom(type)))
                {
                    parameterName += "Collection";
                }
                finalExpression.Append('@');
                finalExpression.Append(parameterName);
            }
            else
            {
                if (!mapping.Mappings.TryGetValue(memberName, out var identifier))
                {
                    identifier = memberName;
                }

                finalExpression.Append(identifier);
            }
        }
        /// <summary>
        /// Adds a node with the specified name to the graph.
        /// </summary>
        /// <param name="name">The name of the node to create.</param>
        /// <returns>
        /// A node expression for configuring the node.
        /// </returns>
        public INodeExpression WithName(string name) {
            var node = new GraphNode(name);
            graph.AddNode(node);

            var expression = new NodeExpression(node);
            return expression;
        }
Пример #8
0
        private NodeExpression FinishIndex(NodeExpression target)
        {
            EatToken(TokenType.OpenBracket);
            NodeExpression index = ParseExpression();

            EatToken(TokenType.CloseBracket);
            return(new IndexExpression(target, index));
        }
Пример #9
0
        public void WithTag_Should_Set_Tag_On_Node()
        {
            var node = new GraphNode("gg");
            var expression = new NodeExpression(node);
            expression.WithTag(5);

            Assert.AreEqual(node.Tag, 5);
        }
Пример #10
0
        NodeExpression ParseMemberExpression(Boolean isNewExpression = false)
        {
            NodeExpression expression = ParsePrimaryExpression();

            while (PeekToken().Type == TokenType.Dot)
            {
                expression = ParseMember(expression, isNewExpression);
            }
            return(expression);
        }
Пример #11
0
        public void ContainsScaledImage_Should_Add_Image_And_Scaled_Attribute()
        {
            var node = new GraphNode("gg");
            var expression = new NodeExpression(node);
            expression.ContainsScaledImage("FluentDot.Tests.dll");

            Assert.AreEqual(node.Attributes.CurrentAttributes.Count, 2);

            AssertAttributeAdded(node.Attributes.CurrentAttributes[0], typeof(ImageAttribute), Path.GetFullPath("FluentDot.Tests.dll"));
            AssertAttributeAdded(node.Attributes.CurrentAttributes[1], typeof(ImageScaleAttribute), new BooleanValue(true));
        }
Пример #12
0
        private NodeExpression ParseMember(NodeExpression expr, Boolean isNewExpression = false)
        {
            EatToken(TokenType.Dot);
            Token name = ParseId();

            if (!isNewExpression && PeekToken().Type == TokenType.OpenParen)
            {
                return(new MemberExpression(expr, name.Value, MemberType.MethodCall));
            }

            return(new MemberExpression(expr, name.Value, MemberType.Member));
        }
        public override void Format(NodeExpression finalExpression, IQueryMapping mapping)
        {
            ConstantNode c1 = (ConstantNode)binary.LeftNode;
            ConstantNode c2 = (ConstantNode)binary.RightNode;

            finalExpression.Append('(');
            finalExpression.Append(c1.Value);
            finalExpression.Append(' ');
            finalExpression.Append(OperationAsString(binary.Operation));
            finalExpression.Append(' ');
            finalExpression.Append(c2.Value);
            finalExpression.Append(')');
        }
Пример #14
0
        private NodeExpression ParseBreakStatement()
        {
            NodeExpression expr = null;

            EatToken(TokenType.KeywordBreak);
            if (MaybeEatToken(TokenType.OpenParen))
            {
                expr = ParseExpression();
                EatToken(TokenType.CloseParen);
            }
            MaybeEatToken(TokenType.SemiColon);
            return(new BreakExpression(expr));
        }
        private void HandleNode(Token token, Stack <IContextExpression> stack, NodeExpression node)
        {
            if (!stack.Any())
            {
                throw new ExpressionParseException(string.Format(
                                                       "AND without expression to left, position {0}",
                                                       token.Position));
            }

            node.LeftChild = stack.Pop();

            stack.Push(node);
        }
        public override void Format(NodeExpression finalExpression, IQueryMapping mapping)
        {
            finalExpression.Append('(');

            GetForNode(binary.LeftNode).Format(finalExpression, mapping);

            finalExpression.Append(' ');
            finalExpression.Append(OperationAsString(binary.Operation));
            finalExpression.Append(' ');

            GetForNode(binary.RightNode).Format(finalExpression, mapping);

            finalExpression.Append(')');
        }
Пример #17
0
        private NodeExpression FinishCall(NodeExpression target)
        {
            EatToken(TokenType.OpenParen);

            var args = new List <NodeExpression>();

            if (PeekToken().Type != TokenType.CloseParen)
            {
                args.Add(ParseExpression());
                while (MaybeEatToken(TokenType.Comma))
                {
                    args.Add(ParseExpression());
                }
            }

            EatToken(TokenType.CloseParen);

            return(new FunctionCallExpression(target, args.ToArray()));
        }
Пример #18
0
        public override void Format(NodeExpression finalExpression, IQueryMapping mapping)
        {
            var me = (MemberAccessNode)binary.LeftNode;
            var ce = (ConstantNode)binary.RightNode;

            finalExpression.Append('(');

            FormatMemberExpression(me, ce, finalExpression, mapping);

            finalExpression.Append(' ');

            finalExpression.Append((ce.Value is null && !ce.ForceParameter)
                    ? (binary.Operation == Operation.Equal ? "IS NULL" : "IS NOT NULL")
                    :
                                   OperationAsString(binary.Operation));

            FormatValueExpression(me, ce, finalExpression);

            finalExpression.Append(')');
        }
Пример #19
0
        public void CreateLinear()
        {
            var paragraph = Generate("p", "big");
            var div       = Generate("div", "big", new[] { paragraph });
            var body      = Generate("body", "big testing", new[] { div });
            var document  = A.Fake <IDocument>();

            A.CallTo(() => document.Body).Returns(body);

            var result = NodeExpression.Generate(document, new TextIndexer());

            var divExpression       = result.Children[0];
            var paragraphExpression = divExpression.Children[0];

            paragraphExpression.Children.ShouldBeEmpty();
            paragraphExpression.Content.ShouldBe(divExpression.Content);
            paragraphExpression.NodeType.ShouldNotBe(divExpression.NodeType);
            divExpression.Children.Count.ShouldBe(1);

            result.Content.ShouldNotBe(divExpression.Content);
        }
Пример #20
0
        /// <summary>
        ///     if (a) then
        ///     # do something
        ///     elseif (b) then
        ///     # do something else
        ///     else
        ///     # or do this
        ///     end
        /// </summary>
        /// <returns></returns>
        private NodeExpression ParseIfStatement()
        {
            EatToken(TokenType.KeywordIf);

            var ifStatements = new List <IfStatementTest> {
                ParseIfStatementTest()
            };

            while (MaybeEatToken(TokenType.KeywordElseIf))
            {
                ifStatements.Add(ParseIfStatementTest());
            }

            NodeExpression elseStatement = null;

            if (MaybeEatToken(TokenType.KeywordElse))
            {
                elseStatement = ParseStatement();
            }

            return(new IfStatement(ifStatements, elseStatement));
        }
Пример #21
0
        private NodeExpression ParseNew()
        {
            NodeExpression constructor = ParseMemberExpression(true);

            EatToken(TokenType.OpenParen);

            var arguments = new List <NodeExpression>();

            for (; ;)
            {
                Token end = PeekToken();
                if (end.Type == TokenType.CloseParen)
                {
                    NextToken();
                    break;
                }

                arguments.Add(ParseExpression());
            }

            return(new NewExpression(constructor, arguments.ToArray()));
        }
Пример #22
0
        private NodeExpression FinishExpressionTerminal(NodeExpression expr)
        {
            for (; ;)
            {
                Token tok = PeekToken();
                switch (tok.Type)
                {
                case TokenType.Dot:
                    expr = ParseMember(expr);
                    break;

                case TokenType.OpenParen:
                    expr = FinishCall(expr);
                    break;

                case TokenType.OpenBracket:
                    expr = FinishIndex(expr);
                    break;

                default:
                    return(expr);
                }
            }
        }
Пример #23
0
 public ExprSub(NodeTask task, NodeExpression a0, NodeExpression a1)
     : base(task, a0, a1)
 {
 }
Пример #24
0
 protected BoolBinExpression(NodeTask task, NodeExpression a0, NodeExpression a1)
     : base(task, a0, a1)
 {
 }
        /// <summary>
        /// Populates the analyser type for column.
        /// </summary>
        /// <param name="report">The report.</param>
        /// <param name="entityType">The resource type returned if the analyser refers to a resource expression.</param>
        /// <param name="reportExpression">The report expression.</param>
        /// <param name="reportAnalyserColumn">The report analyser column.</param>
        private static void PopulateAnalyserTypeForColumn(Report report, EntityType entityType, ReportExpression reportExpression, ReportAnalyserColumn reportAnalyserColumn)
        {
            reportAnalyserColumn.AnalyserType = reportAnalyserColumn.Type.GetDisplayName();

            if (reportExpression.Is <StructureViewExpression>())
            {
                reportAnalyserColumn.AnalyserType    = StructureLevelsType.DisplayName;
                reportAnalyserColumn.DefaultOperator = Structured.ConditionType.AnyBelowStructureLevel;
                var expression    = reportExpression.As <StructureViewExpression>();
                var resReportNode = expression.StructureViewExpressionSourceNode.As <ResourceReportNode>();
                var eType         = resReportNode.ResourceReportNodeType;
                reportAnalyserColumn.TypeId = eType.Id;
                return;
            }

            if (!reportExpression.Is <NodeExpression>())
            {
                return;
            }

            NodeExpression nodeExpression = reportExpression.As <NodeExpression>();

            if (!nodeExpression.SourceNode.Is <ResourceReportNode>())
            {
                return;
            }

            bool isNameColumnForType = false;

            if (reportExpression.Is <FieldExpression>())
            {
                var fieldExpression = reportExpression.As <FieldExpression>();
                if (fieldExpression.FieldExpressionField.Alias != "core:name")
                {
                    return;
                }
                long sourceId = fieldExpression.SourceNode != null ? fieldExpression.SourceNode.Id : 0;
                long rootId   = report.RootNode != null ? report.RootNode.Id : 0;
                isNameColumnForType = (sourceId == rootId) && (sourceId != 0);
            }
            reportAnalyserColumn.IsNameColumnForType = isNameColumnForType;

            ResourceReportNode     resourceReportNode     = nodeExpression.SourceNode.As <ResourceReportNode>( );
            RelationshipReportNode relationshipReportNode = nodeExpression.SourceNode.As <RelationshipReportNode>( );

            if (entityType == null)
            {
                // Need to be able accept entityType as an argument, e.g. if it is from a script column
                // But also need to be able to read it from the node, e.g. if it is the root name column. Messed up.
                entityType = resourceReportNode.ResourceReportNodeType;
                if (entityType == null)
                {
                    return;
                }
            }

            ResourceExpression resourceExpression = reportExpression.As <ResourceExpression>();

            // Handle "Type" types
            //if the resource type is "Type", add current parent node type and descendant types' id as filtered entity ids (bug 24859)
            //Update: only the forward relationship is "isOfType", the "type" list will be restricted. (bug 27862)
            if (entityType.Alias == "core:type" &&
                relationshipReportNode?.FollowRelationship?.Alias == "core:isOfType"
                )
            {
                AggregateReportNode parentAggregatedNode     = resourceReportNode.ParentAggregatedNode;
                ReportNode          parentReportNode         = parentAggregatedNode != null ? parentAggregatedNode.GroupedNode : resourceReportNode.ParentReportNode;
                ResourceReportNode  parentResourceReportNode = parentReportNode != null?parentReportNode.As <ResourceReportNode>() : null;

                if (parentResourceReportNode != null && parentResourceReportNode.ResourceReportNodeType != null)
                {
                    reportAnalyserColumn.FilteredEntityIds = PerTenantEntityTypeCache.Instance.GetDescendantsAndSelf(
                        parentResourceReportNode.ResourceReportNodeType.Id).ToArray();
                }
            }

            // Handle "User" and "Person" types
            if (PerTenantEntityTypeCache.Instance.IsDerivedFrom(entityType.Id, "core:person") ||
                PerTenantEntityTypeCache.Instance.IsDerivedFrom(entityType.Id, "core:userAccount"))
            {
                // If this is a relationship or calc then make it as a user inline relationship otherwise a simple user string.
                reportAnalyserColumn.AnalyserType = nodeExpression.SourceNode.Is <FieldExpression>( ) ? "UserString" : "UserInlineRelationship";
                return;
            }

            // Treat the root 'Name' column like a lookup, so we get the 'Any Of', 'Any Except' options.
            if (isNameColumnForType)
            {
                reportAnalyserColumn.AnalyserType = "InlineRelationship";
                reportAnalyserColumn.TypeId       = entityType.Id;
            }
        }
Пример #26
0
        NodeExpression ParsePostfixExpression()
        {
            NodeExpression expr = ParsePrimaryExpression();

            return(FinishExpressionTerminal(expr));
        }
Пример #27
0
        private static void AssertAttributeAdded(Action<INodeExpression> action, Type attributeType, object attributeValue, Action<IGraphNode> customAsserts)
        {
            var node = new GraphNode("gg");
            var expression = new NodeExpression(node);
            action(expression);
            
            Assert.AreEqual(node.Attributes.CurrentAttributes.Count, 1);

            AssertAttributeAdded(node.Attributes.CurrentAttributes[0], attributeType, attributeValue);

            if (customAsserts != null)
            {
                customAsserts(node);
            }
        }
Пример #28
0
        /// <summary>
        /// Builds the expression.
        /// </summary>
        /// <param name="reportExpression">The report expression.</param>
        /// <param name="context">The context.</param>
        /// <returns>ScalarExpression.</returns>
        internal static ScalarExpression BuildExpression(ReportExpression reportExpression, FromEntityContext context)
        {
            if (reportExpression == null)
            {
                EventLog.Application.WriteWarning(context.DebugInfo + "reportExpression was null");
                return(null);
            }


            // Verify that there is a valid node - prior to converting expressions (invalid nodes may be only partially loaded)
            // Update the reference table for expressions of interest ignoring anything that is a column expression
            long           nodeId         = 0;
            NodeExpression nodeExpression = reportExpression.As <NodeExpression>( );

            if (nodeExpression != null)
            {
                nodeId = nodeExpression.SourceNode.Id;

                // Check that we have a valid node for it
                if (!context.ReportNodeToEntityMap.ContainsKey(nodeId))
                {
                    EventLog.Application.WriteWarning(context.DebugInfo + "expression node could not be found");
                    return(null);
                }
            }

            // Convert specific expression types
            ScalarExpression scalarExpression;

            if (context.InstanceExpressionMap.TryGetValue(reportExpression.Id, out scalarExpression))
            {
                return(scalarExpression);
            }
            if (reportExpression.Is <Model.IdExpression>())
            {
                scalarExpression = BuildIdExpression(reportExpression.As <Model.IdExpression>());
            }
            else if (reportExpression.Is <Model.ResourceExpression>())
            {
                scalarExpression = BuildResourceExpression(reportExpression.As <Model.ResourceExpression>(), context);
            }
            else if (reportExpression.Is <Model.FieldExpression>())
            {
                scalarExpression = BuildFieldExpression(reportExpression.As <Model.FieldExpression>(), context);
            }
            else if (reportExpression.Is <Model.ScriptExpression>())
            {
                scalarExpression = BuildScriptExpression(reportExpression.As <Model.ScriptExpression>());
            }
            else if (reportExpression.Is <Model.AggregateExpression>())
            {
                return(BuildAggregateExpression(reportExpression.As <Model.AggregateExpression>(), context));
            }
            else if (reportExpression.Is <Model.ColumnReferenceExpression>())
            {
                return(BuildColumnReferenceExpression(reportExpression.As <ColumnReferenceExpression>(), context));
            }
            else if (reportExpression.Is <Model.StructureViewExpression>())
            {
                return(BuildStructureViewExpression(reportExpression.As <Model.StructureViewExpression>(), context));
            }

            // Final book keeping
            if (scalarExpression != null)
            {
                if (nodeExpression != null)
                {
                    Guid key = Guid.NewGuid( );
                    context.ReportExpressionMap[key] = nodeId;
                    scalarExpression.ExpressionId    = key;
                    scalarExpression.EntityId        = nodeExpression.Id;
                }

                context.InstanceExpressionMap[reportExpression.Id] = scalarExpression;
            }
            ApplyExpressionClustering(scalarExpression, reportExpression, context);
            return(scalarExpression);
        }
Пример #29
0
 protected CmpExpression(NodeTask task, NodeExpression a0, NodeExpression a1)
     : base(task, a0, a1)
 {
 }