public static IEnumerable <DCELHalfEdge2D> LeavingEdges(DCELMesh2D mesh, DCELVertex2D vertex, QueryExecutionMode executionMode) { var query = mesh.HalfEdgeList.AsEnumerable(); switch (executionMode) { case QueryExecutionMode.Default: query = query.Where(x => x.Origin == vertex); break; case QueryExecutionMode.AsParallel: query = query.AsParallel().Where(x => x.Origin == vertex); break; case QueryExecutionMode.ForEachLoop: foreach (var leavingEdge in mesh.HalfEdgeList) { if (leavingEdge.Origin == vertex) { yield return(leavingEdge); } } yield break; case QueryExecutionMode.ForLoop: for (int i = 0; i < mesh.HalfEdgeCount; i++) { if (mesh.HalfEdgeList[i].Origin == vertex) { yield return(mesh.HalfEdgeList[i]); } } yield break; case QueryExecutionMode.ForWithAssignment: int n = mesh.HalfEdgeCount; for (int i = 0; i < n; i++) { if (mesh.HalfEdgeList[i].Origin == vertex) { yield return(mesh.HalfEdgeList[i]); } } yield break; } foreach (var leavingEdge in query) { yield return(leavingEdge); } }
public ISnQueryable <T> SetExecutionMode(QueryExecutionMode executionMode) { this.ChildrenDefinition.QueryExecutionMode = executionMode; return(this); }
private static InnerQueryResult ExecuteInnerScript(string src, int top, int skip, IEnumerable <SortInfo> sort, FilterStatus enableAutofilters, FilterStatus enableLifespanFilter, QueryExecutionMode executionMode, QuerySettings settings, bool enableProjection, out int count) { LucQuery query; try { query = LucQuery.Parse(src); } catch (ParserException ex) { throw new InvalidContentQueryException(src, innerException: ex); } var projection = query.Projection; if (projection != null) { if (!enableProjection) { throw new ApplicationException(String.Format("Projection in top level query is not allowed ({0}:{1})", Parser.SnLucLexer.Keywords.Select, projection)); } query.ForceLuceneExecution = true; } if (skip != 0) { query.Skip = skip; } if (top != 0) { query.PageSize = top; } else if (query.PageSize == 0) { query.PageSize = GetDefaultMaxResults(); } if (sort != null && sort.Count() > 0) { query.SetSort(sort); } if (enableAutofilters != FilterStatus.Default) { query.EnableAutofilters = enableAutofilters; } if (enableLifespanFilter != FilterStatus.Default) { query.EnableLifespanFilter = enableLifespanFilter; } if (executionMode != QueryExecutionMode.Default) { query.QueryExecutionMode = executionMode; } // Re-set settings values. This is important for NodeList that // uses the paging info written into the query text. if (settings != null) { settings.Top = query.PageSize; settings.Skip = query.Skip; } InnerQueryResult result; var qresult = query.Execute().ToList(); if (projection == null || !enableProjection) { var idResult = qresult.Select(o => o.NodeId).ToArray(); result = new InnerQueryResult { IsIntArray = true, IntArray = idResult, StringArray = idResult.Select(i => i.ToString()).ToArray() }; } else { var stringResult = qresult.Select(o => o[projection, false]).Where(r => !String.IsNullOrEmpty(r)); var escaped = new List <string>(); foreach (var s in stringResult) { escaped.Add(EscapeForQuery(s)); } result = new InnerQueryResult { IsIntArray = false, StringArray = escaped.ToArray() }; } count = query.TotalCount; return(result); }
public static IEnumerable <int> ExecuteRecursive(string queryText, int top, int skip, IEnumerable <SortInfo> sort, FilterStatus enableAutofilters, FilterStatus enableLifespanFilter, QueryExecutionMode executionMode, QuerySettings settings, out int count, out List <string> log) { log = new List <string>(); IEnumerable <int> result = new int[0]; var src = queryText; log.Add(src); var control = GetControlString(src); while (true) { int start; var sss = GetInnerScript(src, control, out start); var end = sss == String.Empty; if (!end) { src = src.Remove(start, sss.Length); control = control.Remove(start, sss.Length); int innerCount; var innerResult = ExecuteInnerScript(sss.Substring(2, sss.Length - 4), 0, 0, sort, enableAutofilters, enableLifespanFilter, executionMode, null, true, out innerCount).StringArray; switch (innerResult.Length) { case 0: sss = EmptyInnerQueryText; break; case 1: sss = innerResult[0]; break; default: sss = String.Join(" ", innerResult); sss = "(" + sss + ")"; break; } src = src.Insert(start, sss); control = control.Insert(start, sss); log.Add(src); } else { result = ExecuteInnerScript(src, top, skip, sort, enableAutofilters, enableLifespanFilter, executionMode, settings, false, out count).IntArray; log.Add(String.Join(" ", result.Select(i => i.ToString()).ToArray())); break; } } return(result); }
private IEnumerable <int> GetIdResultsWithNodeQuery(ExecutionHint hint, int top, int skip, IEnumerable <SortInfo> sort, FilterStatus enableAutofilters, FilterStatus enableLifespanFilter, QueryExecutionMode executionMode) { //TODO: QUICK: Process executionMode in GetIdResultsWithNodeQuery var queryText = LucQuery.IsAutofilterEnabled(enableAutofilters) ? AddAutofilterToNodeQuery(Text) : Text; if (LucQuery.IsLifespanFilterEnabled(enableLifespanFilter)) { queryText = AddLifespanFilterToNodeQuery(queryText, GetLifespanFilterForNodeQuery()); } NodeQuery query; try { query = NodeQuery.Parse(queryText); } catch (XmlException ex) { throw new InvalidContentQueryException(queryText, innerException: ex); } catch (InvalidOperationException ex) { throw new InvalidContentQueryException(queryText, innerException: ex); } if (skip != 0) { query.Skip = skip; } if (top != 0) { query.Top = top; } else if (query.Top == 0) { query.Top = GetDefaultMaxResults(); } query.PageSize = query.Top; if (sort != null && sort.Count() > 0) { throw new NotSupportedException("Sorting override is not allowed on NodeQuery"); } var result = query.Execute(hint); TotalCount = result.Count; return(result.Identifiers.ToList()); }
private IEnumerable <int> GetIdResultsWithLucQuery(int top, int skip, IEnumerable <SortInfo> sort, FilterStatus enableAutofilters, FilterStatus enableLifespanFilter, QueryExecutionMode executionMode) { var queryText = Text; if (!queryText.Contains("}}")) { LucQuery query; try { query = LucQuery.Parse(queryText); } catch (ParserException ex) { throw new InvalidContentQueryException(queryText, innerException: ex); } if (skip != 0) { query.Skip = skip; } query.Top = System.Math.Min(top == 0 ? int.MaxValue : top, query.Top == 0 ? int.MaxValue : query.Top); if (query.Top == 0) { query.Top = GetDefaultMaxResults(); } query.PageSize = query.Top; if (sort != null && sort.Count() > 0) { query.SetSort(sort); } if (enableAutofilters != FilterStatus.Default) { query.EnableAutofilters = enableAutofilters; } if (enableLifespanFilter != FilterStatus.Default) { query.EnableLifespanFilter = enableLifespanFilter; } if (executionMode != QueryExecutionMode.Default) { query.QueryExecutionMode = executionMode; } // Re-set settings values. This is important for NodeList that // uses the paging info written into the query text. this.Settings.Top = query.PageSize; this.Settings.Skip = query.Skip; var lucObjects = query.Execute().ToList(); TotalCount = query.TotalCount; return((from luco in lucObjects select luco.NodeId).ToList()); } else { List <string> log; int count; var result = RecursiveExecutor.ExecuteRecursive(queryText, top, skip, sort, enableAutofilters, enableLifespanFilter, executionMode, this.Settings, out count, out log); TotalCount = count; return(result); } }
private IEnumerable <int> GetIdResults(ExecutionHint hint, int top, int skip, IEnumerable <SortInfo> sort, FilterStatus enableAutofilters, FilterStatus enableLifespanFilter, QueryExecutionMode executionMode) { if (SenseNet.ContentRepository.User.Current.Id == -1 && !this.IsSafe) { var ex = new InvalidOperationException("Cannot execute this query, please convert it to a safe query."); ex.Data.Add("EventId", EventId.Querying); ex.Data.Add("Query", this._text); throw ex; } if (IsNodeQuery) { using (var op = SnTrace.Query.StartOperation("NodeQuery: {0} | Top:{1} Skip:{2} Sort:{3} Mode:{4}", _text, _settings.Top, _settings.Skip, _settings.Sort, _settings.QueryExecutionMode)) { var result = GetIdResultsWithNodeQuery(hint, top, skip, sort, enableAutofilters, enableLifespanFilter, executionMode); op.Successful = true; return(result); } } if (IsContentQuery) { using (var op = SnTrace.Query.StartOperation("ContentQuery: {0} | Top:{1} Skip:{2} Sort:{3} Mode:{4}", this._text, _settings.Top, _settings.Skip, _settings.Sort, _settings.QueryExecutionMode)) { var result = GetIdResultsWithLucQuery(top, skip, sort, enableAutofilters, enableLifespanFilter, executionMode); op.Successful = true; return(result); } } throw new InvalidOperationException("Cannot execute query with null or empty Text"); }