Exemplo n.º 1
0
        private void RewritingTest(string inputQuery, bool isValid, string expected)
        {
            var context = new TestQueryContext(QuerySettings.AdminSettings, 0, _indexingInfo, new TestQueryEngine(null, null));

            using (SenseNet.Tests.Tools.Swindle(typeof(SnQuery), "_permissionFilterFactory", new EverythingAllowedPermissionFilterFactory()))
            {
                var queryIn    = SnQuery.Parse(inputQuery, context);
                var snQueryAcc = new PrivateType(typeof(SnQuery));
                snQueryAcc.InvokeStatic("PrepareQuery", queryIn, context);

                var     hasError = false;
                var     visitor  = new SharingVisitor();
                SnQuery queryOut = null;
                try
                {
                    queryOut = SnQuery.Create(visitor.Visit(queryIn.QueryTree));
                }
                catch (InvalidContentSharingQueryException)
                {
                    hasError = true;
                }

                Assert.AreNotEqual(isValid, hasError);
                if (!hasError)
                {
                    Assert.AreEqual(expected, queryOut.ToString());
                }
            }
        }
Exemplo n.º 2
0
        public Query Test(string queryText, string expected = null)
        {
            expected = expected ?? queryText;

            var indexingInfo = new Dictionary <string, IPerFieldIndexingInfo>
            {
                //{"_Text", new TestPerfieldIndexingInfoString()},
                { "#Field1", new TestPerfieldIndexingInfoString() },
                { "Field1", new TestPerfieldIndexingInfoString() },
                { "Field2", new TestPerfieldIndexingInfoString() },
                { "Field3", new TestPerfieldIndexingInfoString() },
                { "F1", new TestPerfieldIndexingInfoString() },
                { "F2", new TestPerfieldIndexingInfoString() },
                { "F3", new TestPerfieldIndexingInfoString() },
                { "F4", new TestPerfieldIndexingInfoString() },
                { "f1", new TestPerfieldIndexingInfoString() },
                { "f2", new TestPerfieldIndexingInfoString() },
                { "f3", new TestPerfieldIndexingInfoString() },
                { "f4", new TestPerfieldIndexingInfoString() },
                { "f5", new TestPerfieldIndexingInfoString() },
                { "f6", new TestPerfieldIndexingInfoString() },
                { "mod_date", new TestPerfieldIndexingInfoInt() },
                { "title", new TestPerfieldIndexingInfoString() },
                { "Name", new TestPerfieldIndexingInfoString() },
                { "Id", new TestPerfieldIndexingInfoInt() },
                { "LongField1", new TestPerfieldIndexingInfoLong() },
                { "SingleField1", new TestPerfieldIndexingInfoSingle() },
                { "DoubleField1", new TestPerfieldIndexingInfoDouble() },
                { "DateTimeField1", new TestPerfieldIndexingInfoDateTime() },
            };

            //using (new ContentRepository.Tests.Tools.RepositorySupportSwindler(new TestSearchEngineSupport(indexingInfo)))
            using (SenseNet.Tests.Tools.Swindle(typeof(SearchManager), "_searchEngineSupport", new TestSearchEngineSupport(indexingInfo)))
            {
                var queryContext = new TestQueryContext(QuerySettings.Default, 0, indexingInfo);
                var parser       = new CqlParser();
                var snQuery      = parser.Parse(queryText, queryContext);

                var analyzers       = indexingInfo.ToDictionary(kvp => kvp.Key, kvp => Lucene29LocalIndexingEngine.GetAnalyzer(kvp.Value));
                var indexFieldTypes = indexingInfo.ToDictionary(kvp => kvp.Key, kvp => kvp.Value.IndexFieldHandler.IndexFieldType);

                // This is a non-functional object that's only purpose is
                // to hold the indexing info for the visitor to work.
                var sm = new LuceneSearchManager(new IndexDirectory());
                sm.SetIndexingInfo(analyzers, indexFieldTypes);

                var compiler = new Lucene29Compiler(sm.GetAnalyzer());
                var lucQuery = compiler.Compile(snQuery, queryContext);

                var lqVisitor = new LucQueryToStringVisitor(sm);
                lqVisitor.Visit(lucQuery.Query);
                var actual = lqVisitor.ToString();

                Assert.AreEqual(expected, actual);

                return(lucQuery.Query);
            }
        }
Exemplo n.º 3
0
        private void NormalizerVisitorTest(SnQueryPredicate inputPredicate, string expectedQuery)
        {
            var context = new TestQueryContext(QuerySettings.AdminSettings, 0, _indexingInfo, new TestQueryEngine(null, null));

            using (SenseNet.Tests.Tools.Swindle(typeof(SnQuery), "_permissionFilterFactory", new EverythingAllowedPermissionFilterFactory()))
            {
                var queryIn = SnQuery.Create(inputPredicate);
                NormalizerVisitorTest(queryIn, context, expectedQuery);
            }
        }
Exemplo n.º 4
0
        private SnQuery Test(string queryText, string expected = null)
        {
            var queryContext = new TestQueryContext(QuerySettings.Default, 0, _indexingInfo);
            var parser       = new CqlParser();

            var snQuery = parser.Parse(queryText, queryContext);

            var visitor = new SnQueryToStringVisitor();

            visitor.Visit(snQuery.QueryTree);
            var actualResult = visitor.Output;

            Assert.AreEqual(expected ?? queryText, actualResult);
            return(snQuery);
        }
Exemplo n.º 5
0
        private void NormalizerVisitorTest(SnQuery query, TestQueryContext context, string expectedQuery)
        {
            query.EnableAutofilters    = FilterStatus.Disabled;
            query.EnableLifespanFilter = FilterStatus.Disabled;

            var snQueryAcc = new PrivateType(typeof(SnQuery));

            snQueryAcc.InvokeStatic("PrepareQuery", query, context);

            var normalizer = new SharingNormalizerVisitor();
            var normalized = normalizer.Visit(query.QueryTree);

            var newQuery = SnQuery.Create(normalized);

            Assert.AreEqual(expectedQuery, newQuery.ToString());
        }
Exemplo n.º 6
0
        public void SnQuery_Parser_AggregateSettingsCountOnlyAllVersions_CSrv()
        {
            var indexingInfo = new Dictionary <string, IPerFieldIndexingInfo>
            {
                { "Id", new TestPerfieldIndexingInfoInt() }
            };

            var test =
                new Action <string, string, QuerySettings, bool, bool>(
                    (queryText, expectedQueryText, settings, expectedCountOnly, expectedAllVersions) =>
            {
                var queryContext = new TestQueryContext(settings, 0, indexingInfo);

                var parser  = new CqlParser();
                var snQuery = parser.Parse(queryText, queryContext);


                Assert.AreEqual(expectedQueryText ?? queryText, snQuery.ToString());
                Assert.AreEqual(expectedCountOnly, snQuery.CountOnly);
                Assert.AreEqual(expectedAllVersions, snQuery.AllVersions);
            });

            test("Id:>0", null, new QuerySettings(), false, false);
            test("Id:>0 .COUNTONLY", null, new QuerySettings(), true, false);
            test("Id:>0 .ALLVERSIONS", null, new QuerySettings(), false, true);
            test("Id:>0 .ALLVERSIONS .COUNTONLY", null, new QuerySettings(), true, true);
            test("Id:>0 .COUNTONLY .ALLVERSIONS", "Id:>0 .ALLVERSIONS .COUNTONLY", new QuerySettings(), true, true);

            test("Id:>0", "Id:>0", new QuerySettings {
                AllVersions = false
            }, false, false);
            test("Id:>0", "Id:>0 .ALLVERSIONS", new QuerySettings {
                AllVersions = true
            }, false, true);
            test("Id:>0 .ALLVERSIONS", "Id:>0 .ALLVERSIONS", new QuerySettings {
                AllVersions = false
            }, false, true);
            test("Id:>0 .ALLVERSIONS", "Id:>0 .ALLVERSIONS", new QuerySettings {
                AllVersions = true
            }, false, true);

            test("Id:>0 .COUNTONLY", "Id:>0 .ALLVERSIONS .COUNTONLY", new QuerySettings {
                AllVersions = true
            }, true, true);
        }
Exemplo n.º 7
0
        public void SnQuery_Result_Int()
        {
            var intResults = new Dictionary <string, QueryResult <int> > {
                { "asdf", new QueryResult <int>(new[] { 1, 2, 3 }, 4) }
            };
            var context = new TestQueryContext(QuerySettings.AdminSettings, 0, _indexingInfo, new TestQueryEngine(intResults, null));

            using (Tools.Swindle(typeof(SnQuery), "_permissionFilterFactory", new EverythingAllowedPermissionFilterFactory()))
            {
                var queryText = "asdf";

                var result = SnQuery.Query(queryText, context);

                var expected = string.Join(", ", intResults[queryText].Hits.Select(x => x.ToString()).ToArray());
                var actual   = string.Join(", ", result.Hits.Select(x => x.ToString()).ToArray());
                Assert.AreEqual(actual, expected);
                Assert.AreEqual(result.TotalCount, intResults[queryText].TotalCount);
            }
        }
Exemplo n.º 8
0
        private void TestError(string queryText)
        {
            var       queryContext    = new TestQueryContext(QuerySettings.Default, 0, _indexingInfo);
            var       parser          = new CqlParser();
            Exception thrownException = null;

            try
            {
                parser.Parse(queryText, queryContext);
            }
            catch (Exception e)
            {
                thrownException = e;
            }
            if (thrownException == null)
            {
                Assert.Fail("Any exception wasn't thrown");
            }
        }
Exemplo n.º 9
0
        private Tuple <SnQuery, string> CreateQueryAndPrepare(string queryText, FilterStatus autoFilters, FilterStatus lifespanFilter)
        {
            var parser  = new CqlParser();
            var context = new TestQueryContext(QuerySettings.AdminSettings, 1, _indexingInfo);
            var query   = new SnQuery
            {
                Querytext            = queryText,
                QueryTree            = parser.Parse(queryText, context).QueryTree,
                EnableAutofilters    = autoFilters,
                EnableLifespanFilter = lifespanFilter
            };

            SnQuery.PrepareQuery(query, context);

            var visitor = new SnQueryToStringVisitor();

            visitor.Visit(query.QueryTree);

            return(new Tuple <SnQuery, string>(query, visitor.Output));
        }
Exemplo n.º 10
0
        public void SnQuery_Result_String()
        {
            var stringResults = new Dictionary <string, QueryResult <string> >
            {
                { "asdf", new QueryResult <string>(new[] { "1", "2", "3" }, 4) }
            };

            var context = new TestQueryContext(QuerySettings.AdminSettings, 0, _indexingInfo, new TestQueryEngine(null, stringResults));

            using (Tools.Swindle(typeof(SnQuery), "_permissionFilterFactory", new EverythingAllowedPermissionFilterFactory()))
            {
                var queryText = "asdf";

                var result = SnQuery.QueryAndProject(queryText, context);

                var expected = string.Join(", ", stringResults[queryText].Hits);
                var actual   = string.Join(", ", result.Hits);
                Assert.AreEqual(actual, expected);
                Assert.AreEqual(result.TotalCount, stringResults[queryText].TotalCount);
            }
        }
Exemplo n.º 11
0
        public void SnQuery_Classify_UsedFieldNames()
        {
            var indexingInfo = new Dictionary <string, IPerFieldIndexingInfo>
            {
                { "Id", new TestPerfieldIndexingInfoInt() },
                { "Name", new TestPerfieldIndexingInfoString() },
                { "Field1", new TestPerfieldIndexingInfoString() },
                { "Field2", new TestPerfieldIndexingInfoString() }
            };
            var queryContext = new TestQueryContext(QuerySettings.AdminSettings, 0, indexingInfo);
            var parser       = new CqlParser();
            var queryText    = "+Id:<1000 +Name:Admin* +(Field1:value1 Field2:value2) +(Field1:asdf)";
            var expected     = "Field1, Field2, Id, Name";

            var snQuery = parser.Parse(queryText, queryContext);
            var info    = SnQueryClassifier.Classify(snQuery);

            var actual = string.Join(", ", info.QueryFieldNames.OrderBy(x => x).ToArray());

            Assert.AreEqual(expected, actual);
        }
Exemplo n.º 12
0
        public void Sharing_Query_Rewriting_FieldNames()
        {
            var    inputQuery    = "-a:a Sharing:s0 SharedWith:123 SharedBy:s2 SharingMode:s3 SharingLevel:s4";
            var    expectedQuery = "-a:a Sharing:s0 Sharing:I123 Sharing:s2 Sharing:s3 Sharing:s4";
            string actualQuery;

            var context = new TestQueryContext(QuerySettings.AdminSettings, 0, _indexingInfo, new TestQueryEngine(null, null));

            using (SenseNet.Tests.Tools.Swindle(typeof(SnQuery), "_permissionFilterFactory", new EverythingAllowedPermissionFilterFactory()))
            {
                var queryIn    = SnQuery.Parse(inputQuery, context);
                var snQueryAcc = new PrivateType(typeof(SnQuery));
                snQueryAcc.InvokeStatic("PrepareQuery", queryIn, context);

                var visitor = new SharingVisitor();
                var newTree = visitor.Visit(queryIn.QueryTree);

                var snQuery = SnQuery.Create(newTree);
                actualQuery = snQuery.ToString();
            }

            Assert.AreEqual(expectedQuery, actualQuery);
        }
Exemplo n.º 13
0
        public void SnQuery_Parser_UnknownField_RightError()
        {
            var       queryContext    = new TestQueryContext(QuerySettings.Default, 0, _indexingInfo);
            var       parser          = new CqlParser();
            Exception thrownException = null;

            try
            {
                parser.Parse("TypeIs:User TOP:2", queryContext);
            }
            catch (Exception e)
            {
                thrownException = e;
            }

            if (thrownException == null)
            {
                Assert.Fail("Any exception wasn't thrown");
            }
            if (!(thrownException is ParserException))
            {
                Assert.Fail($"Thrown exception is {thrownException.GetType().FullName}, Expected: {typeof(ParserException).FullName}");
            }
        }
Exemplo n.º 14
0
        public void SnQuery_Parser_AggregateSettingsTest()
        {
            var indexingInfo = new Dictionary <string, IPerFieldIndexingInfo>
            {
                { "Id", new TestPerfieldIndexingInfoInt() }
            };
            // tuple values:
            // Item1: QuerySettings
            // Item2: query text postfix
            // Item3: expected Top
            // Item4: expected Skip
            // Item5: expected EnableAutofilters
            // Item6: expected EnableLifespanFilter
            // Item7: expected QueryExecutionMode
            var settings = new List <Tuple <QuerySettings, string, int, int, FilterStatus, FilterStatus, QueryExecutionMode> >
            {
                Tuple.Create(new QuerySettings(), " .TOP:0", int.MaxValue, 0, FilterStatus.Default, FilterStatus.Default, QueryExecutionMode.Default),
                Tuple.Create(new QuerySettings(), " .TOP:5", 5, 0, FilterStatus.Default, FilterStatus.Default, QueryExecutionMode.Default),
                Tuple.Create(new QuerySettings {
                    Top = 10
                }, "", 10, 0, FilterStatus.Default, FilterStatus.Default, QueryExecutionMode.Default),
                Tuple.Create(new QuerySettings {
                    Top = 10
                }, " .TOP:0", 10, 0, FilterStatus.Default, FilterStatus.Default, QueryExecutionMode.Default),
                Tuple.Create(new QuerySettings {
                    Top = 0
                }, " .TOP:10", 10, 0, FilterStatus.Default, FilterStatus.Default, QueryExecutionMode.Default),
                Tuple.Create(new QuerySettings {
                    Top = 5
                }, " .TOP:10", 5, 0, FilterStatus.Default, FilterStatus.Default, QueryExecutionMode.Default),
                Tuple.Create(new QuerySettings {
                    Top = 10
                }, " .TOP:5", 5, 0, FilterStatus.Default, FilterStatus.Default, QueryExecutionMode.Default),
                Tuple.Create(new QuerySettings(), " .SKIP:0", int.MaxValue, 0, FilterStatus.Default, FilterStatus.Default, QueryExecutionMode.Default),
                Tuple.Create(new QuerySettings(), " .SKIP:1", int.MaxValue, 1, FilterStatus.Default, FilterStatus.Default, QueryExecutionMode.Default),
                Tuple.Create(new QuerySettings {
                    Skip = 0
                }, "", int.MaxValue, 0, FilterStatus.Default, FilterStatus.Default, QueryExecutionMode.Default),
                Tuple.Create(new QuerySettings {
                    Skip = 0
                }, " .SKIP:1", int.MaxValue, 1, FilterStatus.Default, FilterStatus.Default, QueryExecutionMode.Default),
                Tuple.Create(new QuerySettings {
                    Skip = 1
                }, " .SKIP:0", int.MaxValue, 1, FilterStatus.Default, FilterStatus.Default, QueryExecutionMode.Default),
                Tuple.Create(new QuerySettings {
                    Skip = 10
                }, " .SKIP:5", int.MaxValue, 10, FilterStatus.Default, FilterStatus.Default, QueryExecutionMode.Default),
                Tuple.Create(new QuerySettings {
                    Skip = 5
                }, " .SKIP:10", int.MaxValue, 5, FilterStatus.Default, FilterStatus.Default, QueryExecutionMode.Default),
                Tuple.Create(new QuerySettings(), " .AUTOFILTERS:ON", int.MaxValue, 0, FilterStatus.Enabled, FilterStatus.Default, QueryExecutionMode.Default),
                Tuple.Create(new QuerySettings {
                    EnableAutofilters = FilterStatus.Default
                }, "", int.MaxValue, 0, FilterStatus.Default, FilterStatus.Default, QueryExecutionMode.Default),
                Tuple.Create(new QuerySettings {
                    EnableAutofilters = FilterStatus.Enabled
                }, "", int.MaxValue, 0, FilterStatus.Enabled, FilterStatus.Default, QueryExecutionMode.Default),
                Tuple.Create(new QuerySettings {
                    EnableAutofilters = FilterStatus.Disabled
                }, " .AUTOFILTERS:ON", int.MaxValue, 0, FilterStatus.Disabled, FilterStatus.Default, QueryExecutionMode.Default),
                Tuple.Create(new QuerySettings(), " .LIFESPAN:ON", int.MaxValue, 0, FilterStatus.Default, FilterStatus.Enabled, QueryExecutionMode.Default),
                Tuple.Create(new QuerySettings {
                    EnableLifespanFilter = FilterStatus.Default
                }, "", int.MaxValue, 0, FilterStatus.Default, FilterStatus.Default, QueryExecutionMode.Default),
                Tuple.Create(new QuerySettings {
                    EnableLifespanFilter = FilterStatus.Enabled
                }, "", int.MaxValue, 0, FilterStatus.Default, FilterStatus.Enabled, QueryExecutionMode.Default),
                Tuple.Create(new QuerySettings {
                    EnableLifespanFilter = FilterStatus.Disabled
                }, " .LIFESPAN:ON", int.MaxValue, 0, FilterStatus.Default, FilterStatus.Disabled, QueryExecutionMode.Default),
                Tuple.Create(new QuerySettings(), " .QUICK", int.MaxValue, 0, FilterStatus.Default, FilterStatus.Default, QueryExecutionMode.Quick),
                Tuple.Create(new QuerySettings {
                    QueryExecutionMode = QueryExecutionMode.Default
                }, "", int.MaxValue, 0, FilterStatus.Default, FilterStatus.Default, QueryExecutionMode.Default),
                Tuple.Create(new QuerySettings {
                    QueryExecutionMode = QueryExecutionMode.Quick
                }, "", int.MaxValue, 0, FilterStatus.Default, FilterStatus.Default, QueryExecutionMode.Quick),
                Tuple.Create(new QuerySettings {
                    QueryExecutionMode = QueryExecutionMode.Strict
                }, " .QUICK", int.MaxValue, 0, FilterStatus.Default, FilterStatus.Default, QueryExecutionMode.Strict),
                Tuple.Create(new QuerySettings {
                    Sort = new List <SortInfo> {
                        new SortInfo("Id")
                    }
                }, "", int.MaxValue, 0, FilterStatus.Default, FilterStatus.Default, QueryExecutionMode.Default),
                Tuple.Create(new QuerySettings(), " .SORT:Id", int.MaxValue, 0, FilterStatus.Default, FilterStatus.Default, QueryExecutionMode.Default),
                Tuple.Create(new QuerySettings {
                    Sort = new List <SortInfo> {
                        new SortInfo("Id")
                    }
                }, " .SORT:Name", int.MaxValue, 0, FilterStatus.Default, FilterStatus.Default, QueryExecutionMode.Default),
                Tuple.Create(new QuerySettings(), " .SORT:Name .TOP:0 .SORT:DisplayName", int.MaxValue, 0, FilterStatus.Default, FilterStatus.Default, QueryExecutionMode.Default)
            };
            var expectedSortInfo = new List <IEnumerable <SortInfo> >();

            for (int i = 0; i < settings.Count - 4; i++)
            {
                expectedSortInfo.Add(null);
            }
            expectedSortInfo.Add(new List <SortInfo> {
                new SortInfo("Id")
            });
            expectedSortInfo.Add(new List <SortInfo> {
                new SortInfo("Id")
            });
            expectedSortInfo.Add(new List <SortInfo> {
                new SortInfo("Id")
            });
            expectedSortInfo.Add(new List <SortInfo> {
                new SortInfo("Name"), new SortInfo("DisplayName")
            });

            var parser    = new CqlParser();
            var queryText = "+Id:<1000";

            foreach (var setting in settings)
            {
                var queryContext       = new TestQueryContext(setting.Item1, 0, indexingInfo);
                var inputQueryText     = queryText + setting.Item2;
                var expectedResultText = queryText;

                var snQuery = parser.Parse(inputQueryText, queryContext);

                var visitor = new SnQueryToStringVisitor();
                visitor.Visit(snQuery.QueryTree);
                var actualResultText = visitor.Output;

                Assert.AreEqual(expectedResultText, actualResultText);
                Assert.AreEqual(setting.Item3, snQuery.Top);
                Assert.AreEqual(setting.Item4, snQuery.Skip);
                Assert.AreEqual(setting.Item5, snQuery.EnableAutofilters);
                Assert.AreEqual(setting.Item6, snQuery.EnableLifespanFilter);
                Assert.AreEqual(setting.Item7, snQuery.QueryExecutionMode);
                var sortIndex = settings.IndexOf(setting);
                Assert.IsTrue((!snQuery.Sort.Any() && expectedSortInfo[sortIndex] == null) || expectedSortInfo[sortIndex].Count() == snQuery.Sort.Length);
            }
        }