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); }
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); }
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); }
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*/)); } }