@@ -780,6 +780,179 @@ public void JoinedQueryBuilder_AddJoinClause_ReturnsBuilder3WithState()
780780
781781 #endregion
782782
783+ #region AsJoined (Prebuilt Path) Tests
784+
785+ [ Test ]
786+ public void QueryBuilder_AsJoined_ReturnsJoinedBuilderWithSameState ( )
787+ {
788+ var dialect = SqlDialect . PostgreSQL ;
789+ var builder = new QueryBuilder < TestUser > ( dialect , "users" , null ) ;
790+
791+ var result = builder . AsJoined < TestOrder > ( ) ;
792+
793+ Assert . That ( result , Is . InstanceOf < JoinedQueryBuilder < TestUser , TestOrder > > ( ) ) ;
794+ }
795+
796+ [ Test ]
797+ public void QueryBuilder_AsJoined_DoesNotMutateJoinClauses ( )
798+ {
799+ var dialect = SqlDialect . PostgreSQL ;
800+ var builder = new QueryBuilder < TestUser > ( dialect , "users" , null ) ;
801+
802+ var result = builder . AsJoined < TestOrder > ( ) ;
803+
804+ // AsJoined should NOT add JoinClauses or set FromTableAlias
805+ var resultState = result . State ;
806+ Assert . Multiple ( ( ) =>
807+ {
808+ Assert . That ( resultState . JoinClauses . Length , Is . EqualTo ( 0 ) ) ;
809+ Assert . That ( resultState . FromTableAlias , Is . Null ) ;
810+ } ) ;
811+ }
812+
813+ [ Test ]
814+ public void QueryBuilder_AsJoined_PropagatesPrebuiltParams ( )
815+ {
816+ var dialect = SqlDialect . PostgreSQL ;
817+ var builder = new QueryBuilder < TestUser > ( dialect , "users" , null ) ;
818+ builder . AllocatePrebuiltParams ( 3 ) ;
819+ builder . BindParam ( 42 ) ;
820+
821+ var result = builder . AsJoined < TestOrder > ( ) ;
822+
823+ Assert . Multiple ( ( ) =>
824+ {
825+ Assert . That ( result . PrebuiltParams , Is . Not . Null ) ;
826+ Assert . That ( result . PrebuiltParams ! . Length , Is . EqualTo ( 3 ) ) ;
827+ Assert . That ( result . PrebuiltParams ! [ 0 ] , Is . EqualTo ( 42 ) ) ;
828+ Assert . That ( result . PrebuiltParamIndex , Is . EqualTo ( 1 ) ) ;
829+ } ) ;
830+ }
831+
832+ [ Test ]
833+ public void JoinedQueryBuilder_AsJoined_ReturnsBuilder3WithSameState ( )
834+ {
835+ var dialect = SqlDialect . PostgreSQL ;
836+ var state = new Quarry . Internal . QueryState ( dialect , "users" , null ) ;
837+ var builder = new JoinedQueryBuilder < TestUser , TestOrder > ( state ) ;
838+
839+ var result = builder . AsJoined < TestItem > ( ) ;
840+
841+ Assert . That ( result , Is . InstanceOf < JoinedQueryBuilder3 < TestUser , TestOrder , TestItem > > ( ) ) ;
842+ }
843+
844+ [ Test ]
845+ public void JoinedQueryBuilder_AsJoined_DoesNotMutateJoinClauses ( )
846+ {
847+ var dialect = SqlDialect . PostgreSQL ;
848+ var state = new Quarry . Internal . QueryState ( dialect , "users" , null ) ;
849+ var builder = new JoinedQueryBuilder < TestUser , TestOrder > ( state ) ;
850+
851+ var result = builder . AsJoined < TestItem > ( ) ;
852+
853+ var resultState = result . State ;
854+ Assert . Multiple ( ( ) =>
855+ {
856+ Assert . That ( resultState . JoinClauses . Length , Is . EqualTo ( 0 ) ) ;
857+ Assert . That ( resultState . FromTableAlias , Is . Null ) ;
858+ } ) ;
859+ }
860+
861+ [ Test ]
862+ public void JoinedQueryBuilder_AsJoined_PropagatesPrebuiltParams ( )
863+ {
864+ var dialect = SqlDialect . PostgreSQL ;
865+ var state = new Quarry . Internal . QueryState ( dialect , "users" , null ) ;
866+ var builder = new JoinedQueryBuilder < TestUser , TestOrder > ( state ) ;
867+ builder . AllocatePrebuiltParams ( 2 ) ;
868+ builder . BindParam ( "hello" ) ;
869+
870+ var result = builder . AsJoined < TestItem > ( ) ;
871+
872+ Assert . Multiple ( ( ) =>
873+ {
874+ Assert . That ( result . PrebuiltParams , Is . Not . Null ) ;
875+ Assert . That ( result . PrebuiltParams ! . Length , Is . EqualTo ( 2 ) ) ;
876+ Assert . That ( result . PrebuiltParams ! [ 0 ] , Is . EqualTo ( "hello" ) ) ;
877+ Assert . That ( result . PrebuiltParamIndex , Is . EqualTo ( 1 ) ) ;
878+ } ) ;
879+ }
880+
881+ [ Test ]
882+ public void JoinedQueryBuilder3_AsJoined_ReturnsBuilder4WithSameState ( )
883+ {
884+ var dialect = SqlDialect . PostgreSQL ;
885+ var state = new Quarry . Internal . QueryState ( dialect , "users" , null ) ;
886+ var builder = new JoinedQueryBuilder3 < TestUser , TestOrder , TestItem > ( state ) ;
887+
888+ var result = builder . AsJoined < TestCategory > ( ) ;
889+
890+ Assert . That ( result , Is . InstanceOf < JoinedQueryBuilder4 < TestUser , TestOrder , TestItem , TestCategory > > ( ) ) ;
891+ }
892+
893+ [ Test ]
894+ public void JoinedQueryBuilder3_AsJoined_DoesNotMutateJoinClauses ( )
895+ {
896+ var dialect = SqlDialect . PostgreSQL ;
897+ var state = new Quarry . Internal . QueryState ( dialect , "users" , null ) ;
898+ var builder = new JoinedQueryBuilder3 < TestUser , TestOrder , TestItem > ( state ) ;
899+
900+ var result = builder . AsJoined < TestCategory > ( ) ;
901+
902+ var resultState = result . State ;
903+ Assert . Multiple ( ( ) =>
904+ {
905+ Assert . That ( resultState . JoinClauses . Length , Is . EqualTo ( 0 ) ) ;
906+ Assert . That ( resultState . FromTableAlias , Is . Null ) ;
907+ } ) ;
908+ }
909+
910+ [ Test ]
911+ public void JoinedQueryBuilder3_AsJoined_PropagatesPrebuiltParams ( )
912+ {
913+ var dialect = SqlDialect . PostgreSQL ;
914+ var state = new Quarry . Internal . QueryState ( dialect , "users" , null ) ;
915+ var builder = new JoinedQueryBuilder3 < TestUser , TestOrder , TestItem > ( state ) ;
916+ builder . AllocatePrebuiltParams ( 5 ) ;
917+ builder . BindParam ( 100 ) ;
918+ builder . BindParam ( 200 ) ;
919+
920+ var result = builder . AsJoined < TestCategory > ( ) ;
921+
922+ Assert . Multiple ( ( ) =>
923+ {
924+ Assert . That ( result . PrebuiltParams , Is . Not . Null ) ;
925+ Assert . That ( result . PrebuiltParams ! . Length , Is . EqualTo ( 5 ) ) ;
926+ Assert . That ( result . PrebuiltParams ! [ 0 ] , Is . EqualTo ( 100 ) ) ;
927+ Assert . That ( result . PrebuiltParams ! [ 1 ] , Is . EqualTo ( 200 ) ) ;
928+ Assert . That ( result . PrebuiltParamIndex , Is . EqualTo ( 2 ) ) ;
929+ } ) ;
930+ }
931+
932+ [ Test ]
933+ public void AsJoined_VsAddJoinClause_StateIsDifferent ( )
934+ {
935+ // AsJoined should NOT add JoinClauses, while AddJoinClause should
936+ var dialect = SqlDialect . PostgreSQL ;
937+ var builder = new QueryBuilder < TestUser > ( dialect , "users" , null ) ;
938+
939+ var asJoinedResult = builder . AsJoined < TestOrder > ( ) ;
940+ var addJoinResult = builder . AddJoinClause < TestOrder > ( CoreJoinKind . Inner , "orders" , "cond" ) ;
941+
942+ Assert . Multiple ( ( ) =>
943+ {
944+ // AsJoined: no join clauses, no alias
945+ Assert . That ( asJoinedResult . State . JoinClauses . Length , Is . EqualTo ( 0 ) ) ;
946+ Assert . That ( asJoinedResult . State . FromTableAlias , Is . Null ) ;
947+
948+ // AddJoinClause: has join clause and alias
949+ Assert . That ( addJoinResult . State . JoinClauses . Length , Is . EqualTo ( 1 ) ) ;
950+ Assert . That ( addJoinResult . State . FromTableAlias , Is . EqualTo ( "t0" ) ) ;
951+ } ) ;
952+ }
953+
954+ #endregion
955+
783956 #region Test Entity Classes
784957
785958 private class TestUser
0 commit comments