@@ -5,8 +5,6 @@ package optimize
55import (
66 "github.com/QuesmaOrg/quesma/platform/logger"
77 "github.com/QuesmaOrg/quesma/platform/model"
8- "github.com/jinzhu/copier"
9- "log"
108 "sort"
119 "strconv"
1210 "strings"
@@ -227,46 +225,54 @@ func (s splitTimeRangeExt) transformQuery(query *model.Query, properties map[str
227225
228226func (s splitTimeRangeExt ) Transform (plan * model.ExecutionPlan , properties map [string ]string ) (* model.ExecutionPlan , error ) {
229227
230- var newQueries []* model.Query
231-
232- for _ , query := range plan .Queries {
228+ queriesSubqueriesMapping := make (map [int ][]* model.Query )
229+ for i , query := range plan .Queries {
233230 subqueries , err := s .transformQuery (query , properties )
234231 if err != nil {
235232 return nil , err
236233 }
237- newQueries = append ( newQueries , subqueries ... )
234+ queriesSubqueriesMapping [ i ] = subqueries
238235 }
239236
240- if len (newQueries ) > 0 {
241- plan .Queries [0 ].SelectCommand = newQueries [0 ].SelectCommand
237+ var newQueries []* model.Query
242238
243- for i := 1 ; i < len ( newQueries ); i ++ {
244- var queryCopy model. Query
245- err := copier . Copy ( & queryCopy , & plan .Queries [0 ])
246- if err != nil {
247- log . Println ( "copier.Copy failed:" , err )
248- }
249- plan . Queries = append (plan . Queries , & queryCopy )
250- plan .Queries [i ]. SelectCommand = newQueries [i ]. SelectCommand
239+ for i := range plan . Queries {
240+ subqueries := queriesSubqueriesMapping [ i ]
241+ plan .Queries [i ]. SelectCommand = subqueries [ 0 ]. SelectCommand
242+ for j := 1 ; j < len ( subqueries ); j ++ {
243+ newQuery := plan . Queries [ 0 ]. Clone ( )
244+ newQuery . SelectCommand = subqueries [ j ]. SelectCommand
245+ newQueries = append (newQueries , newQuery )
246+ plan .Siblings [i ] = append ( plan . Siblings [i ], j )
251247 }
252- plan .ShouldBeMerged = true
253248 }
254- for _ , subquery := range newQueries {
255- sql := subquery .SelectCommand .String ()
256- logger .Info ().Msgf ("@@@@@@Transformed query: %s" , sql )
249+
250+ for i , subqueryPerQuery := range queriesSubqueriesMapping {
251+ querySQL := plan .Queries [i ].SelectCommand
252+ logger .Info ().Msgf ("@@@@@@Original query: %s" , querySQL .String ())
253+ for j := 0 ; j < len (subqueryPerQuery ); j ++ {
254+ logger .Info ().Msgf ("@@@@@@Transformed query: %s" , subqueryPerQuery [j ].SelectCommand .String ())
255+ }
257256 }
258257
259- plan .Interrupt = func (rows []model.QueryResultRow ) bool {
260- return len (rows ) >= 500
258+ plan .Interrupt = func (queryId int , rows []model.QueryResultRow ) bool {
259+ if _ , ok := plan .Siblings [queryId ]; ok {
260+ return len (rows ) >= 500
261+ }
262+ return false
261263 }
262264 plan .Merge = func (plan * model.ExecutionPlan , results [][]model.QueryResultRow ) (* model.ExecutionPlan , [][]model.QueryResultRow ) {
263265 var mergedResults [][]model.QueryResultRow
264266 mergedResults = make ([][]model.QueryResultRow , 0 )
265- mergedResults = append ( mergedResults , results [ 0 ])
267+
266268 if len (plan .Queries ) > len (mergedResults ) {
269+ // merge the results of the siblings queries
270+ mergedResults = append (mergedResults , results [0 ])
271+ // remove siblings queries from the plan
267272 plan .Queries = plan .Queries [:len (plan .Queries )- 1 ]
273+ return plan , mergedResults
268274 }
269- return plan , mergedResults
275+ return plan , results
270276 }
271277 return plan , nil
272278
0 commit comments