/// <summary> /// Generate the query SQL. Do not actually run it. /// </summary> /// <param name="query">The structured query object to convert.</param> /// <param name="settings">Build-time settings for the conversion.</param> /// <returns>An object structure containing SQL, and other discovered information.</returns> public QueryBuild BuildSql(StructuredQuery query, QuerySqlBuilderSettings settings) { if (query == null) { throw new ArgumentNullException("query"); } // Initialise settings if (settings == null) { settings = new QuerySqlBuilderSettings( ); } // Optimise tree StructuredQuery optimisedQuery = StructuredQueryHelper.PruneQueryTree(query); // Generate SQL QueryBuilder queryBuilder = new QueryBuilder(optimisedQuery, settings); QueryBuild result = queryBuilder.GetSqlInternal( ); // Logging using (MessageContext msg = new MessageContext("Reports")) { msg.Append(() => new string( '-', 50 )); msg.Append(() => "Final structured query:\n" + StructuredQueryHelper.ToXml(optimisedQuery)); msg.Append(() => new string( '-', 50 )); msg.Append(() => "SQL:\n" + result.Sql); msg.Append(() => new string( '-', 50 )); } // Note: identify cache dependencies after getting SQL, so that any calculations are resolved into the structured query. IdentifyCacheDependencies(optimisedQuery, settings); return(result); }
public void NotPruned_ColumnReferesToRoot( ) { StructuredQuery sq = new StructuredQuery( ); var root = sq.RootEntity = new ResourceEntity( ); AddColumn(sq, new IdExpression { NodeId = root.NodeId }); var pruned = StructuredQueryHelper.PruneQueryTree(sq); Assert.That(pruned, Is.SameAs(sq)); AssertNodes(pruned, root); }
public void Pruned_UnusedFirstRelationship( ) { StructuredQuery sq = new StructuredQuery( ); var root = sq.RootEntity = new ResourceEntity( ); var related1 = new RelatedResource( ); root.RelatedEntities.Add(related1); AddColumn(sq, new IdExpression { NodeId = root.NodeId }); var pruned = StructuredQueryHelper.PruneQueryTree(sq); Assert.That(pruned, Is.Not.SameAs(sq)); AssertNodes(pruned, root); }
public void NotPruned_UnusedRootAggregate( ) { StructuredQuery sq = new StructuredQuery( ); var agg = new AggregateEntity( ); sq.RootEntity = agg; var related2 = new RelatedResource( ); agg.GroupedEntity = related2; var related3 = new RelatedResource( ); related2.RelatedEntities.Add(related3); var pruned = StructuredQueryHelper.PruneQueryTree(sq); Assert.That(pruned, Is.SameAs(sq)); AssertNodes(pruned, agg, related2, related3); }
public void NotPruned_ColumnReferesToRelatedRelated( ) { StructuredQuery sq = new StructuredQuery( ); var root = sq.RootEntity = new ResourceEntity( ); var related1 = new RelatedResource( ); root.RelatedEntities.Add(related1); var related2 = new RelatedResource( ); related1.RelatedEntities.Add(related2); AddColumn(sq, new IdExpression { NodeId = related2.NodeId }); var pruned = StructuredQueryHelper.PruneQueryTree(sq); Assert.That(pruned, Is.SameAs(sq)); AssertNodes(pruned, root, related1, related2); }
public void NotPruned_ChildrenOfUsedAggregate( ) { StructuredQuery sq = new StructuredQuery( ); var root = sq.RootEntity = new ResourceEntity( ); var agg = new AggregateEntity( ); root.RelatedEntities.Add(agg); var related2 = new RelatedResource( ); agg.GroupedEntity = related2; var related3 = new RelatedResource( ); related2.RelatedEntities.Add(related3); AddColumn(sq, new IdExpression { NodeId = agg.NodeId }); var pruned = StructuredQueryHelper.PruneQueryTree(sq); Assert.That(pruned, Is.SameAs(sq)); AssertNodes(pruned, root, agg, related2, related3); }