public override SqlObject Visit(SqlIdentifier sqlIdentifier) { return(SqlIdentifier.Create( this.GetObfuscatedString( sqlIdentifier.Value, "ident", ref this.identifierSequenceNumber))); }
public override SqlObject VisitArrayIteratorCollectionExpression([NotNull] sqlParser.ArrayIteratorCollectionExpressionContext context) { Contract.Requires(context != null); SqlCollection sqlCollection = (SqlCollection)this.Visit(context.collection()); SqlIdentifier identifier = SqlIdentifier.Create(context.IDENTIFIER().GetText()); return(SqlArrayIteratorCollectionExpression.Create(identifier, sqlCollection)); }
public override SqlObject VisitPropertyRefScalarExpressionBase([NotNull] sqlParser.PropertyRefScalarExpressionBaseContext context) { Contract.Requires(context != null); // IDENTIFIER return(SqlPropertyRefScalarExpression.Create( member: null, SqlIdentifier.Create(context.IDENTIFIER().GetText()))); }
public override SqlObject VisitIdentifierPathExpression([NotNull] sqlParser.IdentifierPathExpressionContext context) { Contract.Requires(context != null); SqlPathExpression pathExpression = (SqlPathExpression)this.Visit(context.path_expression()); SqlIdentifier identifier = SqlIdentifier.Create(context.IDENTIFIER().GetText()); return(SqlIdentifierPathExpression.Create(parentPath: pathExpression, value: identifier)); }
public override SqlObject VisitPropertyRefScalarExpressionRecursive([NotNull] sqlParser.PropertyRefScalarExpressionRecursiveContext context) { Contract.Requires(context != null); // primary_expression '.' IDENTIFIER SqlScalarExpression memberExpression = (SqlScalarExpression)this.Visit(context.primary_expression()); SqlIdentifier indentifier = SqlIdentifier.Create(context.IDENTIFIER().GetText()); return(SqlPropertyRefScalarExpression.Create(memberExpression, indentifier)); }
private SqlFromClause CreateSubqueryFromClause() { SqlQuery subquery = this.inputQuery.GetSqlQuery(); SqlSubqueryCollection collection = SqlSubqueryCollection.Create(subquery); ParameterExpression inputParam = this.inputQuery.Alias; SqlIdentifier identifier = SqlIdentifier.Create(inputParam.Name); SqlAliasedCollectionExpression colExp = SqlAliasedCollectionExpression.Create(collection, identifier); SqlFromClause fromClause = this.CreateFrom(colExp); return(fromClause); }
public void SqlArrayScalarExpressionTest() { CosmosObject tag = CosmosObject.Create(new Dictionary <string, CosmosElement> { ["name"] = CosmosString.Create("asdf") }); CosmosObject tags = CosmosObject.Create(new Dictionary <string, CosmosElement> { ["tags"] = CosmosArray.Create(new List <CosmosElement>() { tag }), ["_rid"] = CosmosString.Create("AYIMAMmFOw8YAAAAAAAAAA==") }); CosmosObject tagsWrapped = CosmosObject.Create(new Dictionary <string, CosmosElement> { ["c"] = tags, ["_rid"] = CosmosString.Create("AYIMAMmFOw8YAAAAAAAAAA==") }); // ARRAY(SELECT VALUE t.name FROM t in c.tags) SqlArrayScalarExpression arrayScalarExpression = SqlArrayScalarExpression.Create( SqlQuery.Create( SqlSelectClause.Create( SqlSelectValueSpec.Create( TestUtils.CreatePathExpression("t", "name"))), SqlFromClause.Create( SqlArrayIteratorCollectionExpression.Create( SqlIdentifier.Create("t"), SqlInputPathCollection.Create( SqlIdentifier.Create("c"), SqlStringPathExpression.Create( null, SqlStringLiteral.Create("tags"))))), whereClause: null, groupByClause: null, orderByClause: null, offsetLimitClause: null)); CosmosArray tagNames = CosmosArray.Create(new List <CosmosElement>() { CosmosString.Create("asdf") }); AssertEvaluation(tagNames, arrayScalarExpression, tagsWrapped); }
/// <summary> /// Create a FROM clause from a set of FROM parameter bindings. /// </summary> /// <returns>The created FROM clause.</returns> private SqlFromClause CreateFrom(SqlCollectionExpression inputCollectionExpression) { bool first = true; foreach (Binding paramDef in this.fromParameters.GetBindings()) { // If input collection expression is provided, the first binding, // which is the input paramter name, should be omitted. if (first) { first = false; if (inputCollectionExpression != null) { continue; } } ParameterExpression parameter = paramDef.Parameter; SqlCollection paramBinding = paramDef.ParameterDefinition; SqlIdentifier identifier = SqlIdentifier.Create(parameter.Name); SqlCollectionExpression collExpr; if (!paramDef.IsInCollection) { SqlCollection collection = paramBinding ?? SqlInputPathCollection.Create(identifier, null); SqlIdentifier alias = paramBinding == null ? null : identifier; collExpr = SqlAliasedCollectionExpression.Create(collection, alias); } else { collExpr = SqlArrayIteratorCollectionExpression.Create(identifier, paramBinding); } if (inputCollectionExpression != null) { inputCollectionExpression = SqlJoinCollectionExpression.Create(inputCollectionExpression, collExpr); } else { inputCollectionExpression = collExpr; } } SqlFromClause fromClause = SqlFromClause.Create(inputCollectionExpression); return(fromClause); }
public override SqlObject VisitInputPathCollection([NotNull] sqlParser.InputPathCollectionContext context) { Contract.Requires(context != null); SqlIdentifier identifier = SqlIdentifier.Create(context.IDENTIFIER().GetText()); SqlPathExpression pathExpression; if (context.path_expression() != null) { pathExpression = (SqlPathExpression)this.Visit(context.path_expression()); } else { pathExpression = null; } return(SqlInputPathCollection.Create(identifier, pathExpression)); }
public override SqlObject VisitAliasedCollectionExpression([NotNull] sqlParser.AliasedCollectionExpressionContext context) { Contract.Requires(context != null); SqlCollection sqlCollection = (SqlCollection)this.Visit(context.collection()); SqlIdentifier alias; if (context.IDENTIFIER() != null) { alias = SqlIdentifier.Create(context.IDENTIFIER().GetText()); } else { alias = default; } return(SqlAliasedCollectionExpression.Create(sqlCollection, alias)); }
public override SqlObject VisitSelect_item([NotNull] sqlParser.Select_itemContext context) { Contract.Requires(context != null); SqlScalarExpression sqlScalarExpression = (SqlScalarExpression)this.Visit(context.scalar_expression()); SqlIdentifier alias; if (context.IDENTIFIER() != null) { alias = SqlIdentifier.Create(context.IDENTIFIER().GetText()); } else { alias = default; } return(SqlSelectItem.Create(sqlScalarExpression, alias)); }
public override SqlObject VisitFunctionCallScalarExpression([NotNull] sqlParser.FunctionCallScalarExpressionContext context) { Contract.Requires(context != null); // (K_UDF '.')? IDENTIFIER '(' scalar_expression_list? ')' bool udf = context.K_UDF() != null; SqlIdentifier identifier = SqlIdentifier.Create(context.IDENTIFIER().GetText()); List <SqlScalarExpression> arguments = new List <SqlScalarExpression>(); if (context.scalar_expression_list() != null) { foreach (sqlParser.Scalar_expressionContext scalarExpressionContext in context.scalar_expression_list().scalar_expression()) { arguments.Add((SqlScalarExpression)this.Visit(scalarExpressionContext)); } } return(SqlFunctionCallScalarExpression.Create(identifier, udf, arguments.ToImmutableArray())); }
private static SqlScalarExpression GenerateMemberIndexerScalarExpressionFromPath(Path path) { if (path.Length < 1) { throw new ArgumentException($"{nameof(path)} is too short."); } if (!(path.First() is StringPathToken rootToken)) { throw new ArgumentException($"{nameof(path)} did not start with a string."); } SqlScalarExpression rootExpression = SqlPropertyRefScalarExpression.Create( member: null, identifier: SqlIdentifier.Create(rootToken.PropertyName)); foreach (PathToken token in path.Skip(1)) { SqlLiteralScalarExpression memberIndexer; switch (token) { case StringPathToken stringPathToken: memberIndexer = SqlLiteralScalarExpression.Create( SqlStringLiteral.Create( stringPathToken.PropertyName)); break; case IntegerPathToken integerPathToken: memberIndexer = SqlLiteralScalarExpression.Create( SqlNumberLiteral.Create( integerPathToken.Index)); break; default: throw new ArgumentException($"Unknown token type: {token.GetType()}; {token}"); } rootExpression = SqlMemberIndexerScalarExpression.Create(rootExpression, memberIndexer); } return(rootExpression); }
public void ArrayIteratorCollectionExpressionTest() { // FROM p in f.parents SqlArrayIteratorCollectionExpression fromPInFDotParents = SqlArrayIteratorCollectionExpression.Create( SqlIdentifier.Create("p"), SqlInputPathCollection.Create( SqlIdentifier.Create("f"), SqlStringPathExpression.Create( null, SqlStringLiteral.Create("parents")))); CosmosElement andersenParent1 = CosmosElement.Parse(@"{ ""p"" : { ""firstName"": ""Thomas"" }, ""_rid"": ""0fomAIxnukU1AQAAAAAAAA==""}"); CosmosElement andersenParent2 = CosmosElement.Parse(@"{ ""p"" : { ""firstName"": ""Mary Kay""}, ""_rid"": ""0fomAIxnukU1AQAAAAAAAA=="" }"); CosmosElement wakeFieldParent1 = CosmosElement.Parse(@"{ ""p"" : { ""familyName"": ""Wakefield"", ""givenName"": ""Robin"" }, ""_rid"": ""0fomAIxnukU1AQAAAAAAAB=="" }"); CosmosElement wakeFieldParent2 = CosmosElement.Parse(@"{ ""p"" : { ""familyName"": ""Miller"", ""givenName"": ""Ben"" }, ""_rid"": ""0fomAIxnukU1AQAAAAAAAB=="" }"); AssertEvaluation(new CosmosElement[] { andersenParent1, andersenParent2, wakeFieldParent1, wakeFieldParent2, }, fromPInFDotParents, DataSource); }
public void AliasedCollectionExpressionTest() { // FROM c SqlAliasedCollectionExpression fromC = SqlAliasedCollectionExpression.Create( SqlInputPathCollection.Create( SqlIdentifier.Create("c"), relativePath: null), alias: null); CosmosObject andersenWrapped = CosmosObject.Create(new Dictionary <string, CosmosElement> { ["c"] = AndersenFamily, ["_rid"] = AndersenFamily["_rid"] }); CosmosObject wakeFieldWrapped = CosmosObject.Create(new Dictionary <string, CosmosElement> { ["c"] = WakefieldFamily, ["_rid"] = WakefieldFamily["_rid"] }); AssertEvaluation(new CosmosElement[] { andersenWrapped, wakeFieldWrapped }, fromC, DataSource); // FROM c.id SqlAliasedCollectionExpression fromCDotId = SqlAliasedCollectionExpression.Create( SqlInputPathCollection.Create( SqlIdentifier.Create("c"), SqlIdentifierPathExpression.Create( null, SqlIdentifier.Create("id"))), alias: null); CosmosObject andersenId = CosmosObject.Create(new Dictionary <string, CosmosElement> { ["id"] = CosmosString.Create("AndersenFamily"), ["_rid"] = AndersenFamily["_rid"] }); CosmosObject wakefieldId = CosmosObject.Create(new Dictionary <string, CosmosElement> { ["id"] = CosmosString.Create("WakefieldFamily"), ["_rid"] = WakefieldFamily["_rid"] }); AssertEvaluation(new CosmosElement[] { andersenId, wakefieldId }, fromCDotId, DataSource); // FROM c.id AS familyId SqlAliasedCollectionExpression fromCDotIdAsFamilyId = SqlAliasedCollectionExpression.Create( SqlInputPathCollection.Create( SqlIdentifier.Create("c"), SqlIdentifierPathExpression.Create( null, SqlIdentifier.Create("id"))), SqlIdentifier.Create("familyId")); CosmosObject andersenIdAsFamilyId = CosmosObject.Create(new Dictionary <string, CosmosElement> { ["familyId"] = CosmosString.Create("AndersenFamily"), ["_rid"] = AndersenFamily["_rid"] }); CosmosObject wakefieldIdAsFamilyId = CosmosObject.Create(new Dictionary <string, CosmosElement> { ["familyId"] = CosmosString.Create("WakefieldFamily"), ["_rid"] = WakefieldFamily["_rid"] }); AssertEvaluation(new CosmosElement[] { andersenIdAsFamilyId, wakefieldIdAsFamilyId }, fromCDotIdAsFamilyId, DataSource); // FROM (SELECT VALUE child["grade"] FROM child IN c.children) grade SqlAliasedCollectionExpression fromSubqueryGrades = SqlAliasedCollectionExpression.Create( SqlSubqueryCollection.Create( SqlQuery.Create( SqlSelectClause.Create( SqlSelectValueSpec.Create( TestUtils.CreatePathExpression("child", "grade"))), SqlFromClause.Create( SqlArrayIteratorCollectionExpression.Create( SqlIdentifier.Create("child"), SqlInputPathCollection.Create( SqlIdentifier.Create("c"), SqlStringPathExpression.Create( null, SqlStringLiteral.Create("children"))))), whereClause: null, groupByClause: null, orderByClause: null, offsetLimitClause: null)), SqlIdentifier.Create("grade")); CosmosObject henrietteWrapped = CosmosObject.Create(new Dictionary <string, CosmosElement> { ["grade"] = CosmosNumber64.Create(5), ["_rid"] = AndersenFamily["_rid"] }); CosmosObject jesseWrapped = CosmosObject.Create(new Dictionary <string, CosmosElement> { ["grade"] = CosmosNumber64.Create(1), ["_rid"] = WakefieldFamily["_rid"] }); CosmosObject lisaWrapped = CosmosObject.Create(new Dictionary <string, CosmosElement> { ["grade"] = CosmosNumber64.Create(8), ["_rid"] = WakefieldFamily["_rid"] }); AssertEvaluation( new CosmosElement[] { henrietteWrapped, jesseWrapped, lisaWrapped }, fromSubqueryGrades, DataSource); }
/// <summary> /// Flatten subqueries into a single query by substituting their expressions in the current query. /// </summary> /// <returns>A flattened query.</returns> private QueryUnderConstruction Flatten() { // SELECT fo(y) FROM y IN (SELECT fi(x) FROM x WHERE gi(x)) WHERE go(y) // is translated by substituting fi(x) for y in the outer query // producing // SELECT fo(fi(x)) FROM x WHERE gi(x) AND (go(fi(x)) if (this.inputQuery == null) { // we are flat already if (this.selectClause == null) { // If selectClause doesn't exists, use SELECT v0 where v0 is the input parameter, instead of SELECT *. string parameterName = this.fromParameters.GetInputParameter().Name; SqlScalarExpression parameterExpression = SqlPropertyRefScalarExpression.Create(null, SqlIdentifier.Create(parameterName)); this.selectClause = SqlSelectClause.Create(SqlSelectValueSpec.Create(parameterExpression)); } else { this.selectClause = SqlSelectClause.Create(this.selectClause.SelectSpec, this.topSpec, this.selectClause.HasDistinct); } return(this); } QueryUnderConstruction flatInput = this.inputQuery.Flatten(); SqlSelectClause inputSelect = flatInput.selectClause; SqlWhereClause inputwhere = flatInput.whereClause; // Determine the paramName to be replaced in the current query // It should be the top input parameter name which is not binded in this collection. // That is because if it has been binded before, it has global scope and should not be replaced. string paramName = null; HashSet <string> inputQueryParams = new HashSet <string>(); foreach (Binding binding in this.inputQuery.fromParameters.GetBindings()) { inputQueryParams.Add(binding.Parameter.Name); } foreach (Binding binding in this.fromParameters.GetBindings()) { if (binding.ParameterDefinition == null || inputQueryParams.Contains(binding.Parameter.Name)) { paramName = binding.Parameter.Name; } } SqlIdentifier replacement = SqlIdentifier.Create(paramName); SqlSelectClause composedSelect = Substitute(inputSelect, inputSelect.TopSpec ?? this.topSpec, replacement, this.selectClause); SqlWhereClause composedWhere = Substitute(inputSelect.SelectSpec, replacement, this.whereClause); SqlOrderbyClause composedOrderBy = Substitute(inputSelect.SelectSpec, replacement, this.orderByClause); SqlWhereClause and = QueryUnderConstruction.CombineWithConjunction(inputwhere, composedWhere); FromParameterBindings fromParams = QueryUnderConstruction.CombineInputParameters(flatInput.fromParameters, this.fromParameters); SqlOffsetSpec offsetSpec; SqlLimitSpec limitSpec; if (flatInput.offsetSpec != null) { offsetSpec = flatInput.offsetSpec; limitSpec = flatInput.limitSpec; } else { offsetSpec = this.offsetSpec; limitSpec = this.limitSpec; } QueryUnderConstruction result = new QueryUnderConstruction(this.aliasCreatorFunc) { selectClause = composedSelect, whereClause = and, inputQuery = null, fromParameters = flatInput.fromParameters, orderByClause = composedOrderBy ?? this.inputQuery.orderByClause, offsetSpec = offsetSpec, limitSpec = limitSpec, alias = new Lazy <ParameterExpression>(() => this.Alias) }; return(result); }
/// <summary> /// Convert the entire query to a SQL Query. /// </summary> /// <returns>The corresponding SQL Query.</returns> public SqlQuery GetSqlQuery() { SqlFromClause fromClause; if (this.inputQuery != null) { #if SUPPORT_SUBQUERIES fromClause = this.CreateSubqueryFromClause(); #else throw new DocumentQueryException("SQL subqueries currently not supported"); #endif } else { fromClause = this.CreateFrom(inputCollectionExpression: null); } // Create a SqlSelectClause with the topSpec. // If the query is flatten then selectClause may have a topSpec. It should be taken in that case. // If the query doesn't have a selectClause, use SELECT v0 where v0 is the input param. SqlSelectClause selectClause = this.selectClause; if (selectClause == null) { string parameterName = this.fromParameters.GetInputParameter().Name; SqlScalarExpression parameterExpression = SqlPropertyRefScalarExpression.Create(null, SqlIdentifier.Create(parameterName)); selectClause = this.selectClause = SqlSelectClause.Create(SqlSelectValueSpec.Create(parameterExpression)); } selectClause = SqlSelectClause.Create(selectClause.SelectSpec, selectClause.TopSpec ?? this.topSpec, selectClause.HasDistinct); SqlOffsetLimitClause offsetLimitClause = (this.offsetSpec != null) ? SqlOffsetLimitClause.Create(this.offsetSpec, this.limitSpec ?? SqlLimitSpec.Create(int.MaxValue)) : offsetLimitClause = default(SqlOffsetLimitClause); SqlQuery result = SqlQuery.Create(selectClause, fromClause, this.whereClause, this.orderByClause, offsetLimitClause); return(result); }
public void SqlSelectListSpecTest() { CosmosObject john = CosmosObject.Create(new Dictionary <string, CosmosElement> { ["name"] = CosmosString.Create("John"), ["age"] = CosmosNumber64.Create(25) }); CosmosObject johnWrapped = CosmosObject.Create(new Dictionary <string, CosmosElement> { ["c"] = john }); // { c.name, c.age } SqlScalarExpression cDotName = TestUtils.CreatePathExpression("c", "name"); SqlScalarExpression cDotAge = TestUtils.CreatePathExpression("c", "age"); SqlSelectListSpec listSpec = SqlSelectListSpec.Create( SqlSelectItem.Create(cDotName), SqlSelectItem.Create(cDotAge)); AssertEvaluation(john, listSpec, johnWrapped); // { c.name AS nameAlias } CosmosObject johnAliased = CosmosObject.Create(new Dictionary <string, CosmosElement> { ["nameAlias"] = CosmosString.Create("John"), }); SqlSelectListSpec listSpecWithAlias = SqlSelectListSpec.Create(SqlSelectItem.Create(cDotName, SqlIdentifier.Create("nameAlias"))); AssertEvaluation(johnAliased, listSpecWithAlias, johnWrapped); // { 3 + 5 } CosmosObject johnNonPropertyName = CosmosObject.Create(new Dictionary <string, CosmosElement> { ["$1"] = CosmosNumber64.Create(8) }); SqlLiteralScalarExpression five = SqlLiteralScalarExpression.Create(SqlNumberLiteral.Create(5)); SqlLiteralScalarExpression three = SqlLiteralScalarExpression.Create(SqlNumberLiteral.Create(3)); SqlBinaryScalarExpression fivePlusThree = SqlBinaryScalarExpression.Create(SqlBinaryScalarOperatorKind.Add, five, three); SqlSelectListSpec listSpecNonMember = SqlSelectListSpec.Create(SqlSelectItem.Create(fivePlusThree)); AssertEvaluation(johnNonPropertyName, listSpecNonMember); // { 3 + 5 AS Five Plus Three } CosmosObject johnNonPropertyNameAliased = CosmosObject.Create(new Dictionary <string, CosmosElement> { ["Five Plus Three"] = CosmosNumber64.Create(8) }); SqlSelectListSpec listSpecNonMemberAliased = SqlSelectListSpec.Create(SqlSelectItem.Create(fivePlusThree, SqlIdentifier.Create("Five Plus Three"))); AssertEvaluation(johnNonPropertyNameAliased, listSpecNonMemberAliased); // { c.blah[0] } CosmosObject numberIndex = CosmosObject.Create(new Dictionary <string, CosmosElement> { ["blah"] = CosmosArray.Create( new List <CosmosElement>() { CosmosNumber64.Create(0), CosmosNumber64.Create(1), CosmosNumber64.Create(2) }) }); CosmosObject numberIndexWrapped = CosmosObject.Create(new Dictionary <string, CosmosElement> { ["c"] = numberIndex }); CosmosObject numberIndexEval = CosmosObject.Create(new Dictionary <string, CosmosElement> { ["$1"] = CosmosNumber64.Create(0) }); SqlScalarExpression cDotBlah0 = TestUtils.CreatePathExpression("c", "blah", 0); SqlSelectListSpec numberIndexSpec = SqlSelectListSpec.Create(SqlSelectItem.Create(cDotBlah0)); AssertEvaluation(numberIndexEval, numberIndexSpec, numberIndexWrapped); }
public void SqlExistsScalarExpressionTest() { CosmosObject tag = CosmosObject.Create(new Dictionary <string, CosmosElement> { ["name"] = CosmosString.Create("asdf") }); CosmosObject tags = CosmosObject.Create(new Dictionary <string, CosmosElement> { ["tags"] = CosmosArray.Create(new List <CosmosElement>() { tag }), ["_rid"] = CosmosString.Create("AYIMAMmFOw8YAAAAAAAAAA==") }); CosmosObject tagsWrapped = CosmosObject.Create(new Dictionary <string, CosmosElement> { ["c"] = tags, ["_rid"] = CosmosString.Create("AYIMAMmFOw8YAAAAAAAAAA==") }); // EXISTS(SELECT VALUE t.name FROM t in c.tags where t.name = "asdf") SqlExistsScalarExpression existsScalarExpressionMatched = SqlExistsScalarExpression.Create( SqlQuery.Create( SqlSelectClause.Create( SqlSelectValueSpec.Create( TestUtils.CreatePathExpression("t", "name"))), SqlFromClause.Create( SqlArrayIteratorCollectionExpression.Create( SqlIdentifier.Create("t"), SqlInputPathCollection.Create( SqlIdentifier.Create("c"), SqlStringPathExpression.Create( null, SqlStringLiteral.Create("tags"))))), SqlWhereClause.Create( SqlBinaryScalarExpression.Create( SqlBinaryScalarOperatorKind.Equal, TestUtils.CreatePathExpression("t", "name"), SqlLiteralScalarExpression.Create(SqlStringLiteral.Create("asdf")))), groupByClause: null, orderByClause: null, offsetLimitClause: null)); AssertEvaluation(CosmosBoolean.Create(true), existsScalarExpressionMatched, tagsWrapped); SqlExistsScalarExpression existsScalarExpressionNotMatched = SqlExistsScalarExpression.Create( SqlQuery.Create( SqlSelectClause.Create( SqlSelectValueSpec.Create( TestUtils.CreatePathExpression("t", "name"))), SqlFromClause.Create( SqlArrayIteratorCollectionExpression.Create( SqlIdentifier.Create("t"), SqlInputPathCollection.Create( SqlIdentifier.Create("c"), SqlStringPathExpression.Create( null, SqlStringLiteral.Create("tags"))))), SqlWhereClause.Create( SqlBinaryScalarExpression.Create( SqlBinaryScalarOperatorKind.NotEqual, TestUtils.CreatePathExpression("t", "name"), SqlLiteralScalarExpression.Create(SqlStringLiteral.Create("asdf")))), groupByClause: null, orderByClause: null, offsetLimitClause: null)); AssertEvaluation(CosmosBoolean.Create(false), existsScalarExpressionNotMatched, tagsWrapped); }
public void JoinCollectionExpressionTest() { // FROM f // JOIN c IN f.children // JOIN p in c.pets SqlAliasedCollectionExpression fromf = SqlAliasedCollectionExpression.Create( SqlInputPathCollection.Create( SqlIdentifier.Create("f"), relativePath: null), alias: null); SqlArrayIteratorCollectionExpression cInFDotChildren = SqlArrayIteratorCollectionExpression.Create( SqlIdentifier.Create("c"), SqlInputPathCollection.Create( SqlIdentifier.Create("f"), SqlStringPathExpression.Create( null, SqlStringLiteral.Create("children")))); SqlJoinCollectionExpression joinFC = SqlJoinCollectionExpression.Create( fromf, cInFDotChildren); CosmosElement andersenChild1 = CosmosElement.Parse(@" { ""f"": { ""id"": ""AndersenFamily"", ""lastName"": ""Andersen"", ""parents"": [ { ""firstName"": ""Thomas"" }, { ""firstName"": ""Mary Kay""} ], ""children"": [ { ""firstName"": ""Henriette Thaulow"", ""gender"": ""female"", ""grade"": 5, ""pets"": [{ ""givenName"": ""Fluffy"" }] } ], ""address"": { ""state"": ""WA"", ""county"": ""King"", ""city"": ""seattle"" }, ""creationDate"": 1431620472, ""isRegistered"": true, ""_rid"": ""0fomAIxnukU1AQAAAAAAAA=="" }, ""c"": { ""firstName"": ""Henriette Thaulow"", ""gender"": ""female"", ""grade"": 5, ""pets"": [{ ""givenName"": ""Fluffy"" }] }, ""_rid"": ""0fomAIxnukU1AQAAAAAAAA=="" }"); CosmosElement wakeFieldChild1 = CosmosElement.Parse(@" { ""f"": { ""id"": ""WakefieldFamily"", ""parents"": [ { ""familyName"": ""Wakefield"", ""givenName"": ""Robin"" }, { ""familyName"": ""Miller"", ""givenName"": ""Ben"" } ], ""children"": [ { ""familyName"": ""Merriam"", ""givenName"": ""Jesse"", ""gender"": ""female"", ""grade"": 1, ""pets"": [ { ""givenName"": ""Goofy"" }, { ""givenName"": ""Shadow"" } ] }, { ""familyName"": ""Miller"", ""givenName"": ""Lisa"", ""gender"": ""female"", ""grade"": 8 } ], ""address"": { ""state"": ""NY"", ""county"": ""Manhattan"", ""city"": ""NY"" }, ""creationDate"": 1431620462, ""isRegistered"": false, ""_rid"": ""0fomAIxnukU1AQAAAAAAAB=="" }, ""c"": { ""familyName"": ""Merriam"", ""givenName"": ""Jesse"", ""gender"": ""female"", ""grade"": 1, ""pets"": [ { ""givenName"": ""Goofy"" }, { ""givenName"": ""Shadow"" } ] }, ""_rid"": ""0fomAIxnukU1AQAAAAAAAB=="" }"); CosmosElement wakeFieldChild2 = CosmosElement.Parse(@" { ""f"": { ""id"": ""WakefieldFamily"", ""parents"": [ { ""familyName"": ""Wakefield"", ""givenName"": ""Robin"" }, { ""familyName"": ""Miller"", ""givenName"": ""Ben"" } ], ""children"": [ { ""familyName"": ""Merriam"", ""givenName"": ""Jesse"", ""gender"": ""female"", ""grade"": 1, ""pets"": [ { ""givenName"": ""Goofy"" }, { ""givenName"": ""Shadow"" } ] }, { ""familyName"": ""Miller"", ""givenName"": ""Lisa"", ""gender"": ""female"", ""grade"": 8 } ], ""address"": { ""state"": ""NY"", ""county"": ""Manhattan"", ""city"": ""NY"" }, ""creationDate"": 1431620462, ""isRegistered"": false, ""_rid"": ""0fomAIxnukU1AQAAAAAAAB=="" }, ""c"": { ""familyName"": ""Miller"", ""givenName"": ""Lisa"", ""gender"": ""female"", ""grade"": 8 }, ""_rid"": ""0fomAIxnukU1AQAAAAAAAB=="" }"); AssertEvaluation(new CosmosElement[] { andersenChild1, wakeFieldChild1, wakeFieldChild2 }, joinFC, DataSource); SqlArrayIteratorCollectionExpression pInCDotPets = SqlArrayIteratorCollectionExpression.Create( SqlIdentifier.Create("p"), SqlInputPathCollection.Create( SqlIdentifier.Create("c"), SqlStringPathExpression.Create( null, SqlStringLiteral.Create("pets")))); SqlJoinCollectionExpression joinFCP = SqlJoinCollectionExpression.Create( SqlJoinCollectionExpression.Create(fromf, cInFDotChildren), pInCDotPets); CosmosElement andersenChild1Pet1 = CosmosElement.Parse(@" { ""f"": { ""id"": ""AndersenFamily"", ""lastName"": ""Andersen"", ""parents"": [ { ""firstName"": ""Thomas"" }, { ""firstName"": ""Mary Kay""} ], ""children"": [ { ""firstName"": ""Henriette Thaulow"", ""gender"": ""female"", ""grade"": 5, ""pets"": [{ ""givenName"": ""Fluffy"" }] } ], ""address"": { ""state"": ""WA"", ""county"": ""King"", ""city"": ""seattle"" }, ""creationDate"": 1431620472, ""isRegistered"": true, ""_rid"": ""0fomAIxnukU1AQAAAAAAAA=="" }, ""c"": { ""firstName"": ""Henriette Thaulow"", ""gender"": ""female"", ""grade"": 5, ""pets"": [{ ""givenName"": ""Fluffy"" }] }, ""p"": { ""givenName"": ""Fluffy"" }, ""_rid"": ""0fomAIxnukU1AQAAAAAAAA=="" }"); CosmosElement wakeFieldChild1Pet1 = CosmosElement.Parse(@" { ""f"": { ""id"": ""WakefieldFamily"", ""parents"": [ { ""familyName"": ""Wakefield"", ""givenName"": ""Robin"" }, { ""familyName"": ""Miller"", ""givenName"": ""Ben"" } ], ""children"": [ { ""familyName"": ""Merriam"", ""givenName"": ""Jesse"", ""gender"": ""female"", ""grade"": 1, ""pets"": [ { ""givenName"": ""Goofy"" }, { ""givenName"": ""Shadow"" } ] }, { ""familyName"": ""Miller"", ""givenName"": ""Lisa"", ""gender"": ""female"", ""grade"": 8 } ], ""address"": { ""state"": ""NY"", ""county"": ""Manhattan"", ""city"": ""NY"" }, ""creationDate"": 1431620462, ""isRegistered"": false, ""_rid"": ""0fomAIxnukU1AQAAAAAAAB=="" }, ""c"": { ""familyName"": ""Merriam"", ""givenName"": ""Jesse"", ""gender"": ""female"", ""grade"": 1, ""pets"": [ { ""givenName"": ""Goofy"" }, { ""givenName"": ""Shadow"" } ] }, ""p"": { ""givenName"": ""Goofy"" }, ""_rid"": ""0fomAIxnukU1AQAAAAAAAB=="" }"); CosmosElement wakeFieldChild1Pet2 = CosmosElement.Parse(@" { ""f"": { ""id"": ""WakefieldFamily"", ""parents"": [ { ""familyName"": ""Wakefield"", ""givenName"": ""Robin"" }, { ""familyName"": ""Miller"", ""givenName"": ""Ben"" } ], ""children"": [ { ""familyName"": ""Merriam"", ""givenName"": ""Jesse"", ""gender"": ""female"", ""grade"": 1, ""pets"": [ { ""givenName"": ""Goofy"" }, { ""givenName"": ""Shadow"" } ] }, { ""familyName"": ""Miller"", ""givenName"": ""Lisa"", ""gender"": ""female"", ""grade"": 8 } ], ""address"": { ""state"": ""NY"", ""county"": ""Manhattan"", ""city"": ""NY"" }, ""creationDate"": 1431620462, ""isRegistered"": false, ""_rid"": ""0fomAIxnukU1AQAAAAAAAB=="" }, ""c"": { ""familyName"": ""Merriam"", ""givenName"": ""Jesse"", ""gender"": ""female"", ""grade"": 1, ""pets"": [ { ""givenName"": ""Goofy"" }, { ""givenName"": ""Shadow"" } ] }, ""p"": { ""givenName"": ""Shadow"" }, ""_rid"": ""0fomAIxnukU1AQAAAAAAAB=="" }"); AssertEvaluation(new CosmosElement[] { andersenChild1Pet1, wakeFieldChild1Pet1, wakeFieldChild1Pet2 }, joinFCP, DataSource); // SELECT c.id // FROM c // JOIN c.nonExistent SqlAliasedCollectionExpression c = SqlAliasedCollectionExpression.Create( SqlInputPathCollection.Create( SqlIdentifier.Create("c"), relativePath: null), alias: null); SqlAliasedCollectionExpression cDotNonExistent = SqlAliasedCollectionExpression.Create( SqlInputPathCollection.Create( SqlIdentifier.Create("c"), SqlStringPathExpression.Create( null, SqlStringLiteral.Create("nonExistent"))), alias: null); SqlJoinCollectionExpression joinCAndCDotNonExistent = SqlJoinCollectionExpression.Create( c, cDotNonExistent); AssertEvaluation(new CosmosElement[] { }, joinCAndCDotNonExistent, DataSource); }