@@ -30,6 +30,9 @@ describe(`DbQueryGraph Unit`, function () {
3030 // Parallel branches must return partial state to avoid LastValue conflicts
3131 stubMap [ DbQueryNodes . GetTables ] . callsFake ( async ( ) => ( { } ) ) ;
3232 stubMap [ DbQueryNodes . CheckCache ] . callsFake ( async ( ) => ( { } ) ) ;
33+ stubMap [ DbQueryNodes . GetColumns ] . callsFake ( async ( ) => ( { } ) ) ;
34+ stubMap [ DbQueryNodes . ClassifyChange ] . callsFake ( async ( ) => ( { } ) ) ;
35+ stubMap [ DbQueryNodes . FixQuery ] . callsFake ( async ( ) => ( { } ) ) ;
3336 // Checklist + Description run in parallel — must return partial state
3437 stubMap [ DbQueryNodes . GenerateChecklist ] . callsFake ( async ( ) => ( {
3538 validationChecklist : '1. Test check' ,
@@ -74,7 +77,7 @@ describe(`DbQueryGraph Unit`, function () {
7477 expect ( stubMap [ DbQueryNodes . Failed ] . called ) . to . be . false ( ) ;
7578 } ) ;
7679
77- it ( 'should retry generation if syntactic validation fails with query error' , async ( ) => {
80+ it ( 'should fix query via FixQuery if syntactic validation fails with query error' , async ( ) => {
7881 const compiledGraph = await graph . build ( ) ;
7982 let syntacticRetryCount = 0 ;
8083 stubMap [ DbQueryNodes . SyntacticValidator ] . callsFake ( async ( ) => {
@@ -102,7 +105,9 @@ describe(`DbQueryGraph Unit`, function () {
102105 expect ( stubMap [ DbQueryNodes . IsImprovement ] . calledOnce ) . to . be . true ( ) ;
103106 expect ( stubMap [ DbQueryNodes . CheckCache ] . calledOnce ) . to . be . true ( ) ;
104107 expect ( stubMap [ DbQueryNodes . GetTables ] . calledOnce ) . to . be . true ( ) ;
105- expect ( stubMap [ DbQueryNodes . SqlGeneration ] . calledTwice ) . to . be . true ( ) ;
108+ // SqlGeneration called once; FixQuery handles the retry
109+ expect ( stubMap [ DbQueryNodes . SqlGeneration ] . calledOnce ) . to . be . true ( ) ;
110+ expect ( stubMap [ DbQueryNodes . FixQuery ] . calledOnce ) . to . be . true ( ) ;
106111 expect ( stubMap [ DbQueryNodes . SyntacticValidator ] . calledTwice ) . to . be . true ( ) ;
107112 // Semantic runs in parallel with syntactic on both attempts
108113 expect ( stubMap [ DbQueryNodes . SemanticValidator ] . calledTwice ) . to . be . true ( ) ;
@@ -137,7 +142,9 @@ describe(`DbQueryGraph Unit`, function () {
137142
138143 expect ( stubMap [ DbQueryNodes . IsImprovement ] . calledOnce ) . to . be . true ( ) ;
139144 expect ( stubMap [ DbQueryNodes . CheckCache ] . calledOnce ) . to . be . true ( ) ;
145+ // GetTables called twice: initial + retry after table error
140146 expect ( stubMap [ DbQueryNodes . GetTables ] . calledTwice ) . to . be . true ( ) ;
147+ // SqlGeneration called twice: once per full pipeline pass
141148 expect ( stubMap [ DbQueryNodes . SqlGeneration ] . calledTwice ) . to . be . true ( ) ;
142149 expect ( stubMap [ DbQueryNodes . SyntacticValidator ] . calledTwice ) . to . be . true ( ) ;
143150 expect ( stubMap [ DbQueryNodes . SaveDataset ] . calledOnce ) . to . be . true ( ) ;
@@ -165,17 +172,20 @@ describe(`DbQueryGraph Unit`, function () {
165172 expect ( stubMap [ DbQueryNodes . IsImprovement ] . calledOnce ) . to . be . true ( ) ;
166173 expect ( stubMap [ DbQueryNodes . CheckCache ] . calledOnce ) . to . be . true ( ) ;
167174 expect ( stubMap [ DbQueryNodes . GetTables ] . calledOnce ) . to . be . true ( ) ;
168- expect ( stubMap [ DbQueryNodes . SqlGeneration ] . getCalls ( ) . length ) . to . be . eql (
169- MAX_ATTEMPTS ,
170- ) ;
175+ // SqlGeneration runs once; FixQuery handles subsequent retries
176+ expect ( stubMap [ DbQueryNodes . SqlGeneration ] . calledOnce ) . to . be . true ( ) ;
171177 expect (
172178 stubMap [ DbQueryNodes . SyntacticValidator ] . getCalls ( ) . length ,
173179 ) . to . be . eql ( MAX_ATTEMPTS ) ;
180+ // FixQuery called MAX_ATTEMPTS - 1 times (first attempt via SqlGeneration)
181+ expect ( stubMap [ DbQueryNodes . FixQuery ] . getCalls ( ) . length ) . to . be . eql (
182+ MAX_ATTEMPTS - 1 ,
183+ ) ;
174184 expect ( stubMap [ DbQueryNodes . Failed ] . calledOnce ) . to . be . true ( ) ;
175- expect ( stubMap [ DbQueryNodes . SaveDataset ] . calledOnce ) . to . be . false ( ) ;
185+ expect ( stubMap [ DbQueryNodes . SaveDataset ] . called ) . to . be . false ( ) ;
176186 } ) ;
177187
178- it ( 'should retry generation if semantic validation fails with query error' , async ( ) => {
188+ it ( 'should fix query via FixQuery if semantic validation fails with query error' , async ( ) => {
179189 const compiledGraph = await graph . build ( ) ;
180190 let semanticRetryCount = 0 ;
181191 stubMap [ DbQueryNodes . SemanticValidator ] . callsFake ( async ( ) => {
@@ -203,7 +213,9 @@ describe(`DbQueryGraph Unit`, function () {
203213 expect ( stubMap [ DbQueryNodes . IsImprovement ] . calledOnce ) . to . be . true ( ) ;
204214 expect ( stubMap [ DbQueryNodes . CheckCache ] . calledOnce ) . to . be . true ( ) ;
205215 expect ( stubMap [ DbQueryNodes . GetTables ] . calledOnce ) . to . be . true ( ) ;
206- expect ( stubMap [ DbQueryNodes . SqlGeneration ] . calledTwice ) . to . be . true ( ) ;
216+ // SqlGeneration called once; FixQuery handles the retry
217+ expect ( stubMap [ DbQueryNodes . SqlGeneration ] . calledOnce ) . to . be . true ( ) ;
218+ expect ( stubMap [ DbQueryNodes . FixQuery ] . calledOnce ) . to . be . true ( ) ;
207219 expect ( stubMap [ DbQueryNodes . SyntacticValidator ] . calledTwice ) . to . be . true ( ) ;
208220 expect ( stubMap [ DbQueryNodes . SemanticValidator ] . calledTwice ) . to . be . true ( ) ;
209221 expect ( stubMap [ DbQueryNodes . SaveDataset ] . calledOnce ) . to . be . true ( ) ;
@@ -235,10 +247,11 @@ describe(`DbQueryGraph Unit`, function () {
235247 expect ( stubMap [ DbQueryNodes . IsImprovement ] . calledOnce ) . to . be . true ( ) ;
236248 expect ( stubMap [ DbQueryNodes . CheckCache ] . calledOnce ) . to . be . true ( ) ;
237249 expect ( stubMap [ DbQueryNodes . GetTables ] . calledOnce ) . to . be . true ( ) ;
238- expect ( stubMap [ DbQueryNodes . SqlGeneration ] . getCalls ( ) . length ) . to . be . eql (
239- MAX_ATTEMPTS ,
240- ) ;
250+ // SqlGeneration runs once; FixQuery handles retries
251+ expect ( stubMap [ DbQueryNodes . SqlGeneration ] . calledOnce ) . to . be . true ( ) ;
252+ // With both validators failing, feedbacks grow by 2 per iteration
253+ // so it reaches MAX_ATTEMPTS faster
241254 expect ( stubMap [ DbQueryNodes . Failed ] . calledOnce ) . to . be . true ( ) ;
242- expect ( stubMap [ DbQueryNodes . SaveDataset ] . calledOnce ) . to . be . false ( ) ;
255+ expect ( stubMap [ DbQueryNodes . SaveDataset ] . called ) . to . be . false ( ) ;
243256 } ) ;
244257} ) ;
0 commit comments