Esempio n. 1
0
        public void ParseStatements_WithValidCQL_ShouldReturnAllNonCommentStatements()
        {
            var table1 = @"CREATE TABLE foo (
    pk uuid,
    ck blob,
    val text,
    PRIMARY KEY (pk, ck)
)";
            var table2 = @"CREATE TABLE bar (
    pk uuid,
    ck blob,
    val text,
    PRIMARY KEY (pk, ck)
)";
            var insert = "INSERT INTO foo (pk, ck, val) VALUES (fd1d5bea-ac6b-4af0-a475-c310afc491df, 0X00000000, 'ABC')";
            var cql    = @$ "
-- comment 1
{table1};
// comment 2
{table2};
/*
comment 3
*/
{insert};
";
            var result = CqlParser.ParseStatements(cql).ToList();

            Assert.Equal(3, result.Count);
            Assert.Equal(table1, result[0]);
            Assert.Equal(table2, result[1]);
            Assert.Equal(insert, result[2]);
        }
Esempio n. 2
0
        private static SnQueryPredicate GetLifespanFilterClause(IQueryContext context)
        {
            var now    = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            var parser = new CqlParser();
            var clause = parser.Parse($"EnableLifespan:no OR (+ValidFrom:<'{now}' +(ValidTill:>'{now}' ValidTill:'0001-01-01 00:00:00'))", context).QueryTree;

            return(clause);
        }
Esempio n. 3
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);
            }
        }
Esempio n. 4
0
        public void ParseStatements_WithInvalidCQL_ShouldThrow()
        {
            var invalid = "INSERT INTO foo (pk) VALUES 0x00000000;";
            var ex      = Assert.Throws <CqlException>(() => CqlParser.ParseStatements(invalid));

            Assert.Equal(1, ex.Line);
            Assert.Equal(28, ex.Column);
            Assert.Equal("0x00000000", ex.Token);
        }
Esempio n. 5
0
 private static SnQueryPredicate GetAutoFilterClause(IQueryContext context)
 {
     if (_autoFilterClause == null)
     {
         var parser = new CqlParser();
         _autoFilterClause = parser.Parse("IsSystemContent:no", context).QueryTree;
     }
     return(_autoFilterClause);
 }
Esempio n. 6
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);
        }
Esempio n. 7
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);
        }
Esempio 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");
            }
        }
Esempio 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));
        }
Esempio n. 10
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);
        }
Esempio n. 11
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}");
            }
        }
Esempio n. 12
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);
            }
        }
Esempio n. 13
0
        public override async ValueTask <IEnumerable <string> > ListStatementAsync(CancellationToken cancellationToken = default)
        {
            var cql = await File.ReadAllTextAsync(this.path, Encoding.UTF8, cancellationToken);

            return(CqlParser.ParseStatements(cql));
        }
Esempio n. 14
0
        /// <summary>
        /// Executes a CQL query and returns with a QueryResult&lt;string&gt; instance containing set of projected values and its count.
        /// </summary>
        public static QueryResult <string> QueryAndProject(string queryText, IQueryContext context)
        {
            var query = new CqlParser().Parse(queryText, context);

            return(query.ExecuteAndProject(context));
        }
Esempio n. 15
0
        /// <summary>
        /// Executes a CQL query and returns with a QueryResult&lt;int&gt; instance containing id set and count
        /// </summary>
        public static QueryResult <int> Query(string queryText, IQueryContext context)
        {
            var query = new CqlParser().Parse(queryText, context);

            return(query.Execute(context));
        }