Esempio n. 1
0
        private static List <string> ConstructFollowEdgeSet(FSDescCallchainElement followEdge)
        {
            /***********************************************
            * Syntax:
            *
            *   FollowEdge(params string[] edgeTypes)
            ***********************************************/
            var ret = new List <string>();

            if (followEdge == null)
            {
                return(ret);
            }

            foreach (var arg in followEdge.Arguments)
            {
                var edge = Get <LiteralExpressionSyntax>(arg.Expression, "Expecting a string");
                ThrowIf(!edge.IsKind(SyntaxKind.StringLiteralExpression), "Expecting a string", arg);
                ret.Add(edge.Token.ValueText);
            }

            // * means wildcard.
            if (ret.Any(_ => _ == "*"))
            {
                ret.Clear();
            }
            return(ret);
        }
Esempio n. 2
0
        private static FanoutSearchDescriptor ConstructFanoutSearchDescriptor(List <FSDescCallchainElement> fs_callchain)
        {
            FanoutSearchDescriptor fs_desc = ConstructFanoutSearchOrigin(fs_callchain.First());

            for (int idx = 1; idx < fs_callchain.Count; ++idx)
            {
                FSDescCallchainElement visitNode     = fs_callchain[idx];
                FSDescCallchainElement followEdge    = null;
                FanoutSearch.Action    defaultAction = Action.Continue;

                if (visitNode.Method == s_LIKQ_FollowEdge)
                {
                    ThrowIf(++idx >= fs_callchain.Count, "The query expression cannot end with '" + s_LIKQ_FollowEdge + "'", visitNode.SyntaxNode);
                    followEdge = visitNode;
                    visitNode  = fs_callchain[idx];
                    if (visitNode.Method == s_LIKQ_FollowEdge)
                    {
                        // two consequtive FollowEdge, use default traverse action.
                        --idx;
                        visitNode = null;
                    }
                }

                if (idx + 1 >= fs_callchain.Count)
                {
                    // The last element should have default action Action.Return
                    defaultAction = Action.Return;
                }

                ThrowIf(visitNode.Method != s_LIKQ_VisitNode, "Expecting '" + s_LIKQ_VisitNode + "'", visitNode.SyntaxNode);
                fs_desc = ConstructFanoutSearchBody(fs_desc, visitNode, followEdge, defaultAction);
            }

            return(fs_desc);
        }
Esempio n. 3
0
        private static FanoutSearchDescriptor ConstructFanoutSearchOrigin(FSDescCallchainElement origin)
        {
            /***********************************************
            * Syntax:
            *
            * 1. StartFrom(long cellid, IEnumerable<string> select = null)
            * 2. StartFrom(IEnumerable<long> cellid, IEnumerable<string> select = null)
            * 3. StartFrom(string queryObject, IEnumerable<string> select = null)
            ***********************************************/

            ThrowIf(origin.Method != s_LIKQ_StartFrom, "Expecting " + s_LIKQ_StartFrom, origin.SyntaxNode);
            FanoutSearchDescriptor fs_desc = new FanoutSearchDescriptor("");

            fs_desc.m_origin_query = null;
            ThrowIf(origin.Arguments.Count < 1 || origin.Arguments.Count > 2, "Expecting 1 or 2 arguments", origin.SyntaxNode);

            ExpressionSyntax origin_cell_query = origin.Arguments[0].Expression;
            ExpressionSyntax selection         = origin.Arguments.Count < 2 ? null : origin.Arguments[1].Expression;

            switch (origin_cell_query.Kind())
            {
            case SyntaxKind.ObjectCreationExpression:
            case SyntaxKind.ImplicitArrayCreationExpression:
            case SyntaxKind.ArrayCreationExpression:
                fs_desc.m_origin = ConstructCollection <long>(origin_cell_query).ToList();
                break;

            case SyntaxKind.NumericLiteralExpression:
            case SyntaxKind.UnaryMinusExpression:
            case SyntaxKind.UnaryPlusExpression:
            {
                long cell_id      = 0;
                var  parse_result = long.TryParse(origin_cell_query.ToString(), out cell_id);
                ThrowIf(!parse_result, "Expecting a cell id", origin_cell_query);
                fs_desc.m_origin = new List <long> {
                    cell_id
                };
                break;
            }

            case SyntaxKind.StringLiteralExpression:
                fs_desc.m_origin_query = (origin_cell_query as LiteralExpressionSyntax).Token.ValueText;
                break;

            default:
                throw new LambdaDSLSyntaxErrorException("Invalid starting node argument", origin_cell_query);
            }

            if (selection != null)
            {
                fs_desc.m_selectFields.Add(ConstructCollection <string>(selection).ToList());
            }

            return(fs_desc);
        }
Esempio n. 4
0
        private static FanoutSearchDescriptor ConstructFanoutSearchBody(FanoutSearchDescriptor current, FSDescCallchainElement visitNode, FSDescCallchainElement followEdge, Action defaultTraverseAction)
        {
            List <string>      follow_edge_set = ConstructFollowEdgeSet(followEdge);
            EdgeTypeDescriptor ets             = current.FollowEdge(follow_edge_set.ToArray());

            if (visitNode == null)
            {
                return(ets.VisitNode(defaultTraverseAction));
            }
            else if (visitNode.Arguments.Count == 1)
            {
                return(ets.VisitNode(ConstructVisitNodeAction(visitNode.Arguments[0].Expression)));
            }
            else /*if (visitNode.Arguments.Count > 1)*/
            {
                return(ets.VisitNode(
                           ConstructVisitNodeAction(visitNode.Arguments[0].Expression),
                           ConstructCollection <string>(visitNode.Arguments[1].Expression) /*select*/));
            }
        }