59
59
import java .sql .ResultSet ;
60
60
import java .sql .SQLException ;
61
61
import java .sql .Struct ;
62
- import java .util .BitSet ;
63
62
import java .util .EnumSet ;
64
63
import java .util .HashMap ;
65
64
import java .util .Map ;
78
77
* <li>understand parameters necessary for execution: limit, offset, continuation, and explain flag. These parameters are
79
78
* necessary for Relational to prepare the plan for execution.</li>
80
79
* <li>process in-predicate and generate array literal of the in-list contains simple constants.</li>
81
- * <li>identify query caching flags that might influence its interaction with plan cache (see {@link Result .QueryCachingFlags}).</li>
80
+ * <li>identify query caching flags that might influence its interaction with plan cache (see {@link NormalizationResult .QueryCachingFlags}).</li>
82
81
* </ul>
83
82
* <p>
84
83
* The visitor is designed to be very fast;
@@ -135,7 +134,7 @@ public final class AstNormalizer extends RelationalParserBaseVisitor<Object> {
135
134
private final PreparedParams preparedStatementParameters ;
136
135
137
136
@ Nonnull
138
- private final Set <Result .QueryCachingFlags > queryCachingFlags ;
137
+ private final Set <NormalizationResult .QueryCachingFlags > queryCachingFlags ;
139
138
140
139
@ Nonnull
141
140
private final Options .Builder queryOptions ;
@@ -165,7 +164,7 @@ private AstNormalizer(@Nonnull final PreparedParams preparedStatementParameters,
165
164
this .preparedStatementParameters = preparedStatementParameters ;
166
165
allowTokenAddition = true ;
167
166
allowLiteralAddition = true ;
168
- queryCachingFlags = EnumSet .noneOf (Result .QueryCachingFlags .class );
167
+ queryCachingFlags = EnumSet .noneOf (NormalizationResult .QueryCachingFlags .class );
169
168
queryOptions = Options .builder ();
170
169
this .caseSensitive = caseSensitive ;
171
170
}
@@ -224,7 +223,7 @@ public String getCanonicalSqlString() {
224
223
}
225
224
226
225
@ Nonnull
227
- public Set <Result .QueryCachingFlags > getQueryCachingFlags () {
226
+ public Set <NormalizationResult .QueryCachingFlags > getQueryCachingFlags () {
228
227
return queryCachingFlags ;
229
228
}
230
229
@@ -267,7 +266,7 @@ public Void visitLimitClauseAtom(RelationalParser.LimitClauseAtomContext ctx) {
267
266
@ Override
268
267
public Object visitQuery (@ Nonnull RelationalParser .QueryContext ctx ) {
269
268
if (queryCachingFlags .isEmpty ()) {
270
- queryCachingFlags .add (Result .QueryCachingFlags .IS_DQL_STATEMENT );
269
+ queryCachingFlags .add (NormalizationResult .QueryCachingFlags .IS_DQL_STATEMENT );
271
270
}
272
271
if (ctx .ctes () != null ) {
273
272
visit (ctx .ctes ());
@@ -296,7 +295,7 @@ public RelationalExpression visitQueryOptions(@Nonnull RelationalParser.QueryOpt
296
295
public Object visitQueryOption (@ Nonnull RelationalParser .QueryOptionContext ctx ) {
297
296
try {
298
297
if (ctx .NOCACHE () != null ) {
299
- queryCachingFlags .add (Result .QueryCachingFlags .WITH_NO_CACHE_OPTION );
298
+ queryCachingFlags .add (NormalizationResult .QueryCachingFlags .WITH_NO_CACHE_OPTION );
300
299
}
301
300
if (ctx .LOG () != null ) {
302
301
queryOptions .withOption (Options .Name .LOG_QUERY , true );
@@ -315,37 +314,37 @@ public Object visitQueryOption(@Nonnull RelationalParser.QueryOptionContext ctx)
315
314
316
315
@ Override
317
316
public Object visitDdlStatement (@ Nonnull RelationalParser .DdlStatementContext ctx ) {
318
- queryCachingFlags .add (Result .QueryCachingFlags .IS_DDL_STATEMENT );
317
+ queryCachingFlags .add (NormalizationResult .QueryCachingFlags .IS_DDL_STATEMENT );
319
318
return visitChildren (ctx );
320
319
}
321
320
322
321
@ Override
323
322
public Object visitInsertStatement (final RelationalParser .InsertStatementContext ctx ) {
324
- queryCachingFlags .add (Result .QueryCachingFlags .IS_INSERT_STATEMENT );
323
+ queryCachingFlags .add (NormalizationResult .QueryCachingFlags .IS_INSERT_STATEMENT );
325
324
return super .visitInsertStatement (ctx );
326
325
}
327
326
328
327
@ Override
329
328
public Object visitUpdateStatement (final RelationalParser .UpdateStatementContext ctx ) {
330
- queryCachingFlags .add (Result .QueryCachingFlags .IS_UPDATE_STATEMENT );
329
+ queryCachingFlags .add (NormalizationResult .QueryCachingFlags .IS_UPDATE_STATEMENT );
331
330
return super .visitUpdateStatement (ctx );
332
331
}
333
332
334
333
@ Override
335
334
public Object visitDeleteStatement (final RelationalParser .DeleteStatementContext ctx ) {
336
- queryCachingFlags .add (Result .QueryCachingFlags .IS_DELETE_STATEMENT );
335
+ queryCachingFlags .add (NormalizationResult .QueryCachingFlags .IS_DELETE_STATEMENT );
337
336
return super .visitDeleteStatement (ctx );
338
337
}
339
338
340
339
@ Override
341
340
public Object visitAdministrationStatement (@ Nonnull RelationalParser .AdministrationStatementContext ctx ) {
342
- queryCachingFlags .add (Result .QueryCachingFlags .IS_ADMIN_STATEMENT );
341
+ queryCachingFlags .add (NormalizationResult .QueryCachingFlags .IS_ADMIN_STATEMENT );
343
342
return visitChildren (ctx );
344
343
}
345
344
346
345
@ Override
347
346
public Object visitUtilityStatement (@ Nonnull RelationalParser .UtilityStatementContext ctx ) {
348
- queryCachingFlags .add (Result .QueryCachingFlags .IS_UTILITY_STATEMENT );
347
+ queryCachingFlags .add (NormalizationResult .QueryCachingFlags .IS_UTILITY_STATEMENT );
349
348
return visitChildren (ctx );
350
349
}
351
350
@@ -486,8 +485,8 @@ public Object visitInPredicate(@Nonnull RelationalParser.InPredicateContext ctx)
486
485
487
486
@ Override
488
487
public Object visitExecuteContinuationStatement (@ Nonnull RelationalParser .ExecuteContinuationStatementContext ctx ) {
489
- queryCachingFlags .add (Result .QueryCachingFlags .IS_EXECUTE_CONTINUATION_STATEMENT );
490
- queryCachingFlags .add (Result .QueryCachingFlags .WITH_NO_CACHE_OPTION );
488
+ queryCachingFlags .add (NormalizationResult .QueryCachingFlags .IS_EXECUTE_CONTINUATION_STATEMENT );
489
+ queryCachingFlags .add (NormalizationResult .QueryCachingFlags .WITH_NO_CACHE_OPTION );
491
490
if (ctx .queryOptions () != null ) {
492
491
ctx .queryOptions ().accept (this );
493
492
}
@@ -575,10 +574,10 @@ private void processLiteral(@Nonnull final Object literal, final int tokenIndex,
575
574
* @return The query parse tree along with contextual information required for planning and executing it.
576
575
*/
577
576
@ Nonnull
578
- public static Result normalizeQuery (@ Nonnull final PlanContext context ,
579
- @ Nonnull final String query ,
580
- boolean isCaseSensitive ,
581
- @ Nonnull final PlanHashable .PlanHashMode currentPlanHashMode ) throws RelationalException {
577
+ public static NormalizationResult normalizeQuery (@ Nonnull final PlanContext context ,
578
+ @ Nonnull final String query ,
579
+ boolean isCaseSensitive ,
580
+ @ Nonnull final PlanHashable .PlanHashMode currentPlanHashMode ) throws RelationalException {
582
581
// lexing, parsing, and normalization are profiled through the metric collector.
583
582
final var metricCollector = context .getMetricsCollector ();
584
583
final var rootContext = metricCollector .clock (RelationalMetric .RelationalEvent .LEX_PARSE ,
@@ -588,7 +587,7 @@ public static Result normalizeQuery(@Nonnull final PlanContext context,
588
587
context .getSchemaTemplate (), rootContext ,
589
588
PreparedParams .copyOf (context .getPreparedStatementParameters ()),
590
589
context .getUserVersion (),
591
- context .getSchemaTemplate (). getIndexEntriesAsBitset ( context . getPlannerConfiguration (). getReadableIndexes () ),
590
+ context .getPlannerConfiguration (),
592
591
isCaseSensitive ,
593
592
currentPlanHashMode ,
594
593
query
@@ -597,14 +596,14 @@ public static Result normalizeQuery(@Nonnull final PlanContext context,
597
596
598
597
@ Nonnull
599
598
@ VisibleForTesting
600
- public static Result normalizeAst (@ Nonnull final SchemaTemplate schemaTemplate ,
601
- @ Nonnull final RelationalParser .RootContext context ,
602
- @ Nonnull final PreparedParams preparedStatementParameters ,
603
- int userVersion ,
604
- @ Nonnull final BitSet readableIndexes ,
605
- boolean caseSensitive ,
606
- @ Nonnull final PlanHashable .PlanHashMode currentPlanHashMode ,
607
- @ Nonnull final String query ) {
599
+ public static NormalizationResult normalizeAst (@ Nonnull final SchemaTemplate schemaTemplate ,
600
+ @ Nonnull final RelationalParser .RootContext context ,
601
+ @ Nonnull final PreparedParams preparedStatementParameters ,
602
+ int userVersion ,
603
+ @ Nonnull final PlannerConfiguration plannerConfiguration ,
604
+ boolean caseSensitive ,
605
+ @ Nonnull final PlanHashable .PlanHashMode currentPlanHashMode ,
606
+ @ Nonnull final String query ) {
608
607
final var astNormalizer = new AstNormalizer (preparedStatementParameters , caseSensitive , currentPlanHashMode );
609
608
astNormalizer .visit (context );
610
609
final var recordLayerSchemaTemplate = Assert .castUnchecked (schemaTemplate , RecordLayerSchemaTemplate .class );
@@ -632,19 +631,19 @@ public static Result normalizeAst(@Nonnull final SchemaTemplate schemaTemplate,
632
631
final var compiledFunction = recordLayerRoutine .getCompilableSqlFunctionSupplier ().get ();
633
632
astNormalizer .queryHasherContextBuilder .getLiteralsBuilder ().importLiterals (compiledFunction .getAuxiliaryLiterals ());
634
633
}
635
- return new Result (
634
+ return new NormalizationResult (
636
635
recordLayerSchemaTemplate .getName (),
637
- QueryCacheKey .of (astNormalizer .getCanonicalSqlString (), astNormalizer . getHash () ,
638
- recordLayerSchemaTemplate .getVersion (), readableIndexes , userVersion ,
639
- recordLayerSchemaTemplate .getTransactionBoundMetadataAsString () ),
636
+ QueryCacheKey .of (astNormalizer .getCanonicalSqlString (), plannerConfiguration ,
637
+ recordLayerSchemaTemplate .getTransactionBoundMetadataAsString (), astNormalizer . getHash () ,
638
+ recordLayerSchemaTemplate .getVersion (), userVersion ),
640
639
astNormalizer .getQueryExecutionParameters (),
641
640
context ,
642
641
astNormalizer .getQueryCachingFlags (),
643
642
astNormalizer .getQueryOptions (),
644
643
query );
645
644
}
646
645
647
- public static final class Result {
646
+ public static final class NormalizationResult {
648
647
649
648
/**
650
649
* A set of flags that determine how the query should interact with the plan cache.
@@ -687,13 +686,13 @@ public enum QueryCachingFlags {
687
686
@ Nonnull
688
687
private final String query ;
689
688
690
- public Result (@ Nonnull final String schemaTemplateName ,
691
- @ Nonnull final QueryCacheKey queryCacheKey ,
692
- @ Nonnull final QueryExecutionContext queryExecutionContext ,
693
- @ Nonnull final ParseTree parseTree ,
694
- @ Nonnull final Set <QueryCachingFlags > queryCachingFlags ,
695
- @ Nonnull final Options queryOptions ,
696
- @ Nonnull final String query ) {
689
+ public NormalizationResult (@ Nonnull final String schemaTemplateName ,
690
+ @ Nonnull final QueryCacheKey queryCacheKey ,
691
+ @ Nonnull final QueryExecutionContext queryExecutionContext ,
692
+ @ Nonnull final ParseTree parseTree ,
693
+ @ Nonnull final Set <QueryCachingFlags > queryCachingFlags ,
694
+ @ Nonnull final Options queryOptions ,
695
+ @ Nonnull final String query ) {
697
696
this .schemaTemplateName = schemaTemplateName ;
698
697
this .queryCacheKey = queryCacheKey ;
699
698
this .queryExecutionContext = queryExecutionContext ;
@@ -703,6 +702,7 @@ public Result(@Nonnull final String schemaTemplateName,
703
702
this .query = query ;
704
703
}
705
704
705
+ @ Nonnull
706
706
public String getSchemaTemplateName () {
707
707
return schemaTemplateName ;
708
708
}
0 commit comments