public override int Visit(SqlJoinCollectionExpression sqlJoinCollectionExpression) { int hashCode = SqlJoinCollectionExpressionHashCode; hashCode = CombineHashes(hashCode, sqlJoinCollectionExpression.LeftExpression.Accept(this)); hashCode = CombineHashes(hashCode, sqlJoinCollectionExpression.RightExpression.Accept(this)); return(hashCode); }
public override void Visit(SqlJoinCollectionExpression sqlJoinCollectionExpression) { sqlJoinCollectionExpression.Left.Accept(this); this.WriteNewline(); this.WriteTab(); this.writer.Write(" JOIN "); sqlJoinCollectionExpression.Right.Accept(this); }
public override SqlObject VisitJoinCollectionExpression([NotNull] sqlParser.JoinCollectionExpressionContext context) { Contract.Requires(context != null); SqlCollectionExpression left = (SqlCollectionExpression)this.Visit(context.collection_expression(0)); SqlCollectionExpression right = (SqlCollectionExpression)this.Visit(context.collection_expression(1)); return(SqlJoinCollectionExpression.Create(left, right)); }
/// <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 bool Visit(SqlJoinCollectionExpression first, SqlObject secondAsObject) { if (!(secondAsObject is SqlJoinCollectionExpression second)) { return(false); } if (!Equals(first.Left, second.Left)) { return(false); } if (!Equals(first.Right, second.Right)) { return(false); } return(true); }
public abstract void Visit(SqlJoinCollectionExpression sqlObject);
public override SqlObject Visit(SqlJoinCollectionExpression sqlJoinCollectionExpression) { return(SqlJoinCollectionExpression.Create( sqlJoinCollectionExpression.Left.Accept(this) as SqlCollectionExpression, sqlJoinCollectionExpression.Right.Accept(this) as SqlCollectionExpression)); }
public abstract TResult Visit(SqlJoinCollectionExpression collectionExpression, TArg input);
public abstract void Visit(SqlJoinCollectionExpression collectionExpression);
public abstract TResult Visit(SqlJoinCollectionExpression sqlObject);
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); }
public abstract TResult Visit(SqlJoinCollectionExpression collectionExpression);
public abstract TOutput Visit(SqlJoinCollectionExpression sqlObject, TArg input);
/// <summary> /// Visits a SqlJoinCollectionExpression and transforms the documents accordingly. /// </summary> /// <param name="collectionExpression">The collection expression to visit.</param> /// <param name="documents">The documents to transform.</param> /// <returns>The transformed documents according to the collection expression.</returns> public override IEnumerable <CosmosElement> Visit(SqlJoinCollectionExpression collectionExpression, IEnumerable <CosmosElement> documents) { //If the query was: //SELECT blah //FROM f //JOIN c IN f.children //and the document was //{ // "children" : [{"name" : "John"}, {"name" : "Sally"}] //} //then the results would be: //{ // "f" : { "children" : [{"name" : "John"}, {"name" : "Sally"}] } // "c" : {"name" : "John"} //} //and //{ // "f" : { "children" : [{"name" : "John"}, {"name" : "Sally"}] } // "c" : {"name" : "Sally"} //} //Notice that the result set is larger than the input //This is because we emitted one document for each child in the original document //wrapped it with the provided alias //and merged the results from the source expression. IEnumerable <CosmosElement> collection1 = collectionExpression.Left.Accept(this, documents); // Perform the select many and merge the documents foreach (CosmosObject document1 in collection1) { IEnumerable <CosmosElement> collection2 = collectionExpression.Right.Accept(this, new CosmosElement[] { document1 }); foreach (CosmosObject document2 in collection2) { Dictionary <string, CosmosElement> mergedDocument = new Dictionary <string, CosmosElement>(); foreach (KeyValuePair <string, CosmosElement> property in document1) { if (property.Key != "_rid") { mergedDocument[property.Key] = property.Value; } } foreach (KeyValuePair <string, CosmosElement> property in document2) { if (property.Key != "_rid") { mergedDocument[property.Key] = property.Value; } } // Add the _rid at the end so we can break ties in the sort later. mergedDocument["_rid"] = document1["_rid"]; yield return(CosmosObject.Create(mergedDocument)); } } }