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]); }
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); }
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); } }
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); }
private static SnQueryPredicate GetAutoFilterClause(IQueryContext context) { if (_autoFilterClause == null) { var parser = new CqlParser(); _autoFilterClause = parser.Parse("IsSystemContent:no", context).QueryTree; } return(_autoFilterClause); }
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); }
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); }
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"); } }
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)); }
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); }
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}"); } }
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); } }
public override async ValueTask <IEnumerable <string> > ListStatementAsync(CancellationToken cancellationToken = default) { var cql = await File.ReadAllTextAsync(this.path, Encoding.UTF8, cancellationToken); return(CqlParser.ParseStatements(cql)); }
/// <summary> /// Executes a CQL query and returns with a QueryResult<string> 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)); }
/// <summary> /// Executes a CQL query and returns with a QueryResult<int> 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)); }