Пример #1
0
        public static LucQuery Create(NodeQuery nodeQuery)
        {
            NodeQueryParameter[] parameters;
            var result = new LucQuery();
            result.TraceInfo.BeginCrossCompilingTime();

            SortField[] sortFields;
            string oldQueryText;
            try
            {
                var compiler = new SnLucCompiler();
                var compiledQueryText = compiler.Compile(nodeQuery, out parameters);

                sortFields = (from order in nodeQuery.Orders
                              select new SortField(
                                  GetFieldNameByPropertyName(order.PropertyName),
                                  GetSortType(order.PropertyName), //SortField.STRING,
                                  order.Direction == OrderDirection.Desc)).ToArray();

                oldQueryText = compiler.CompiledQuery.ToString();
                oldQueryText = oldQueryText.Replace("[*", "[ ").Replace("*]", " ]").Replace("{*", "{ ").Replace("*}", " }");
                result.TraceInfo.InputText = oldQueryText;
            }
            finally
            {
                result.TraceInfo.FinishCrossCompilingTime();
            }
            result.TraceInfo.BeginParsingTime();
            Query newQuery;
            try
            {
                newQuery = new SnLucParser().Parse(oldQueryText);
            }
            finally
            {
                result.TraceInfo.FinishParsingTime();
            }
            result.Query = newQuery; // compiler.CompiledQuery,
            result.User = nodeQuery.User;
            result.SortFields = sortFields;
            result.StartIndex = nodeQuery.Skip;
            result.PageSize = nodeQuery.PageSize;
            result.Top = nodeQuery.Top;
            result.EnableAutofilters = false;
            result.EnableLifespanFilter = false;

            return result;
        }
Пример #2
0
        public static LucQuery Parse(string luceneQueryText)
        {
            var result = new LucQuery();
            result.TraceInfo.InputText = luceneQueryText;

            result.TraceInfo.BeginParsingTime();
            var parser = new SnLucParser();
            Query query;
            try
            {
                var replacedText = LucQueryTemplateReplacer.ReplaceTemplates(luceneQueryText);
                query = parser.Parse(replacedText);
            }
            finally
            {
                result.TraceInfo.FinishParsingTime();
            }
            //Run EmptyTermVisitor if the parser created empty query term.
            if (parser.ParseEmptyQuery)
            {
                var visitor = new EmptyTermVisitor();
                result.Query = visitor.Visit(query);
            }
            else
            {
                result.Query = query;
            }

            var sortFields = new List<SortField>();
            foreach (var control in parser.Controls)
            {
                switch (control.Name)
                {
                    case SnLucLexer.Keywords.Select:
                        result.Projection = control.Value;
                        break;
                    case SnLucLexer.Keywords.Top:
                        result.Top = Convert.ToInt32(control.Value);
                        break;
                    case SnLucLexer.Keywords.Skip:
                        result.Skip = Convert.ToInt32(control.Value);
                        break;
                    case SnLucLexer.Keywords.Sort:
                        sortFields.Add(CreateSortField(control.Value, false));
                        break;
                    case SnLucLexer.Keywords.ReverseSort:
                        sortFields.Add(CreateSortField(control.Value, true));
                        break;
                    case SnLucLexer.Keywords.Autofilters:
                        result.EnableAutofilters = control.Value == SnLucLexer.Keywords.On;
                        break;
                    case SnLucLexer.Keywords.Lifespan:
                        result.EnableLifespanFilter = control.Value == SnLucLexer.Keywords.On;
                        break;
                    case SnLucLexer.Keywords.CountOnly:
                        result.CountOnly = true;
                        break;
                }
            }
            result.SortFields = sortFields.ToArray();

            return result;
        }