@@ -8,8 +8,7 @@ namespace Simple.Data.Ado
88{
99 public class QueryBuilder
1010 {
11- private readonly IFunctionNameConverter _functionNameConverter = new FunctionNameConverter ( ) ;
12- private SimpleReferenceFormatter _simpleReferenceFormatter ;
11+ private readonly SimpleReferenceFormatter _simpleReferenceFormatter ;
1312 private readonly AdoAdapter _adoAdapter ;
1413 private readonly int _bulkIndex ;
1514 private readonly DatabaseSchema _schema ;
@@ -20,7 +19,7 @@ public class QueryBuilder
2019 private SimpleExpression _whereCriteria ;
2120 private SimpleExpression _havingCriteria ;
2221 private SimpleReference [ ] _columns ;
23- private CommandBuilder _commandBuilder ;
22+ private readonly CommandBuilder _commandBuilder ;
2423 private List < SimpleQueryClauseBase > _unhandledClauses ;
2524
2625 public QueryBuilder ( AdoAdapter adoAdapter ) : this ( adoAdapter , - 1 )
@@ -54,31 +53,49 @@ public ICommandBuilder Build(SimpleQuery query, out IEnumerable<SimpleQueryClaus
5453 private void SetQueryContext ( SimpleQuery query )
5554 {
5655 _query = query ;
56+ _tableName = _schema . BuildObjectName ( query . TableName ) ;
57+ _table = _schema . FindTable ( _tableName ) ;
5758 var selectClause = _query . Clauses . OfType < SelectClause > ( ) . SingleOrDefault ( ) ;
5859 if ( selectClause != null )
5960 {
6061 _columns = selectClause . Columns . ToArray ( ) ;
6162 }
6263 else
6364 {
64- _columns = new SimpleReference [ 0 ] ;
65+ _columns = _table . Columns . Select ( c => ObjectReference . FromStrings ( _table . ActualName , c . ActualName ) ) . ToArray ( ) ;
66+ }
67+
68+ var withClauses = _query . Clauses . OfType < WithClause > ( ) . ToList ( ) ;
69+ if ( withClauses . Count > 0 )
70+ {
71+ foreach ( var withClause in withClauses )
72+ {
73+ if ( withClause . ObjectReference . GetOwner ( ) . GetName ( ) == _tableName . Name )
74+ {
75+ _columns =
76+ _columns . Concat (
77+ _schema . FindTable ( withClause . ObjectReference . GetName ( ) ) . Columns . Select (
78+ c => ObjectReference . FromStrings ( _table . ActualName , withClause . ObjectReference . GetName ( ) , c . ActualName ) ) ) . ToArray ( ) ;
79+ }
80+ }
81+ _columns =
82+ _columns . OfType < ObjectReference > ( ) . Select (
83+ c => c . As ( string . Format ( "__with__{0}__{1}" , c . GetOwner ( ) . GetName ( ) , c . GetName ( ) ) ) ) . ToArray ( ) ;
6584 }
6685
6786 _whereCriteria = _query . Clauses . OfType < WhereClause > ( ) . Aggregate ( SimpleExpression . Empty ,
6887 ( seed , where ) => seed && where . Criteria ) ;
6988 _havingCriteria = _query . Clauses . OfType < HavingClause > ( ) . Aggregate ( SimpleExpression . Empty ,
7089 ( seed , having ) => seed && having . Criteria ) ;
7190
72- _tableName = _schema . BuildObjectName ( query . TableName ) ;
73- _table = _schema . FindTable ( _tableName ) ;
7491 _commandBuilder . SetText ( GetSelectClause ( _tableName ) ) ;
7592 }
7693
7794 private void HandleJoins ( )
7895 {
7996 if ( _whereCriteria == SimpleExpression . Empty && _havingCriteria == SimpleExpression . Empty
8097 && ( ! _query . Clauses . OfType < JoinClause > ( ) . Any ( ) )
81- && ( _columns . Where ( r => ! ( r is CountSpecialReference ) ) . Count ( ) == 0 ) ) return ;
98+ && ( _columns . All ( r => ( r is CountSpecialReference ) ) ) ) return ;
8299
83100 var joiner = new Joiner ( JoinType . Inner , _schema ) ;
84101
0 commit comments