Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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);
        }