@@ -5,15 +5,14 @@ package quesma
55import (
66 "bytes"
77 "context"
8- "encoding/json"
98 "fmt"
109 "io"
1110 "net/http"
1211 "quesma/ab_testing"
1312 "quesma/clickhouse"
1413 "quesma/logger"
1514 "quesma/model"
16- "quesma/queryparser "
15+ "quesma/quesma/config "
1716 "quesma/quesma/recovery"
1817 "quesma/quesma/types"
1918 "quesma/tracing"
@@ -124,13 +123,8 @@ func (q *QueryRunner) maybeCreateAlternativeExecutionPlan(ctx context.Context, i
124123
125124 resolvedTableName := indexes [0 ]
126125
127- props , disabled := q .cfg .IndexConfig [resolvedTableName ].GetOptimizerConfiguration (queryparser .PancakeOptimizerName )
128- if ! disabled && props ["mode" ] == "alternative" {
129- return q .maybeCreatePancakeExecutionPlan (ctx , resolvedTableName , plan , queryTranslator , body , table , isAsync )
130- }
131-
132126 // TODO is should be enabled in a different way. it's not an optimizer
133- cfg , disabled := q .cfg .IndexConfig [resolvedTableName ].GetOptimizerConfiguration ("elastic_ab_testing" )
127+ cfg , disabled := q .cfg .IndexConfig [resolvedTableName ].GetOptimizerConfiguration (config . ElasticABOptimizerName )
134128 if ! disabled {
135129 return q .askElasticAsAnAlternative (ctx , resolvedTableName , plan , queryTranslator , body , table , isAsync , cfg )
136130 }
@@ -220,96 +214,3 @@ func (q *QueryRunner) askElasticAsAnAlternative(ctx context.Context, resolvedTab
220214 return responseBody , nil
221215 }
222216}
223-
224- func (q * QueryRunner ) maybeCreatePancakeExecutionPlan (ctx context.Context , resolvedTableName string , plan * model.ExecutionPlan , queryTranslator IQueryTranslator , body types.JSON , table * clickhouse.Table , isAsync bool ) (* model.ExecutionPlan , executionPlanExecutor ) {
225-
226- hasAggQuery := false
227- queriesWithoutAggr := make ([]* model.Query , 0 )
228- for _ , query := range plan .Queries {
229- switch query .Type .AggregationType () {
230- case model .MetricsAggregation , model .BucketAggregation , model .PipelineMetricsAggregation , model .PipelineBucketAggregation :
231- hasAggQuery = true
232- default :
233- queriesWithoutAggr = append (queriesWithoutAggr , query )
234- }
235- }
236-
237- if ! hasAggQuery {
238- return nil , nil
239- }
240-
241- if chQueryTranslator , ok := queryTranslator .(* queryparser.ClickhouseQueryTranslator ); ok {
242-
243- // TODO FIXME check if the original plan has count query
244- addCount := false
245-
246- if pancakeQueries , err := chQueryTranslator .PancakeParseAggregationJson (body , addCount ); err == nil {
247- logger .InfoWithCtx (ctx ).Msgf ("Running alternative pancake queries" )
248- queries := append (queriesWithoutAggr , pancakeQueries ... )
249- alternativePlan := & model.ExecutionPlan {
250- IndexPattern : plan .IndexPattern ,
251- QueryRowsTransformers : make ([]model.QueryRowsTransformer , len (queries )),
252- Queries : queries ,
253- StartTime : plan .StartTime ,
254- Name : "pancake" ,
255- }
256-
257- return alternativePlan , func (ctx context.Context ) ([]byte , error ) {
258-
259- return q .executeAlternativePlan (ctx , plan , queryTranslator , table , body , false )
260- }
261-
262- } else {
263- // TODO: change to info
264- logger .ErrorWithCtx (ctx ).Msgf ("Error parsing pancake queries: %v" , err )
265- }
266- } else {
267- logger .ErrorWithCtx (ctx ).Msgf ("Alternative plan is not supported for non-clickhouse query translators" )
268- }
269- return nil , nil
270- }
271-
272- func (q * QueryRunner ) executeAlternativePlan (ctx context.Context , plan * model.ExecutionPlan , queryTranslator IQueryTranslator , table * clickhouse.Table , body types.JSON , isAsync bool ) (responseBody []byte , err error ) {
273-
274- doneCh := make (chan AsyncSearchWithError , 1 )
275-
276- err = q .transformQueries (ctx , plan )
277- if err != nil {
278- return responseBody , err
279- }
280-
281- if resp , err := q .checkProperties (ctx , plan , table , queryTranslator ); err != nil {
282- return resp , err
283- }
284-
285- q .runExecutePlanAsync (ctx , plan , queryTranslator , table , doneCh , nil )
286-
287- response := <- doneCh
288-
289- if response .err == nil {
290- if isAsync {
291- asyncResponse := queryparser .SearchToAsyncSearchResponse (response .response , "__quesma_alternative_plan" , false , 200 )
292- responseBody , err = asyncResponse .Marshal ()
293- if err != nil {
294- return nil , err
295- }
296- } else {
297- responseBody , err = response .response .Marshal ()
298- if err != nil {
299- return nil , err
300- }
301- }
302- } else {
303- // TODO better error handling
304- m := make (map [string ]interface {})
305- m ["error" ] = fmt .Sprintf ("%v" , response .err .Error ())
306- responseBody , _ = json .MarshalIndent (m , "" , " " )
307- }
308-
309- bodyAsBytes , _ := body .Bytes ()
310- contextValues := tracing .ExtractValues (ctx )
311- pushAlternativeInfo (q .quesmaManagementConsole , contextValues .RequestId , "" , contextValues .OpaqueId , contextValues .RequestPath , bodyAsBytes , response .translatedQueryBody , responseBody , plan .StartTime )
312-
313- return responseBody , response .err
314-
315- }
0 commit comments