Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
 public ISnQueryable <T> SetExecutionMode(QueryExecutionMode executionMode)
 {
     this.ChildrenDefinition.QueryExecutionMode = executionMode;
     return(this);
 }
Esempio n. 3
0
            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);
            }
Esempio n. 4
0
            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);
            }
Esempio n. 5
0
        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());
        }
Esempio n. 6
0
        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);
            }
        }
Esempio n. 7
0
        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");
        }