@query-doctor/core 0.4.1-rc.2 → 0.4.1-rc.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +142 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -2
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +5 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +142 -9
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.cts
CHANGED
|
@@ -553,6 +553,7 @@ declare class IndexOptimizer {
|
|
|
553
553
|
private toDefinition;
|
|
554
554
|
private toGinDefinition;
|
|
555
555
|
private toGistDefinition;
|
|
556
|
+
private toExpressionDefinition;
|
|
556
557
|
private groupGinCandidatesByColumn;
|
|
557
558
|
private ginIndexAlreadyExists;
|
|
558
559
|
private groupGistCandidatesByColumn;
|
|
@@ -597,6 +598,7 @@ type RootIndexCandidate = {
|
|
|
597
598
|
};
|
|
598
599
|
jsonbOperator?: JsonbOperator;
|
|
599
600
|
gistOperator?: GistOperator;
|
|
601
|
+
jsonbExtraction?: string;
|
|
600
602
|
};
|
|
601
603
|
type PermutedIndexCandidate = {
|
|
602
604
|
schema: string;
|
|
@@ -610,7 +612,7 @@ declare const PROCEED: unique symbol;
|
|
|
610
612
|
declare const SKIP: unique symbol;
|
|
611
613
|
//#endregion
|
|
612
614
|
//#region src/sql/nudges.d.ts
|
|
613
|
-
type NudgeKind = "LARGE_IMPROVEMENT_FOUND" | "SMALL_IMPROVEMENT_FOUND" | "AVOID_SELECT_STAR" | "AVOID_FUNCTIONS_ON_COLUMNS_IN_WHERE" | "MISSING_WHERE_CLAUSE" | "MISSING_LIMIT_CLAUSE" | "USE_IS_NULL_NOT_EQUALS" | "AVOID_DISTINCT_WITHOUT_REASON" | "MISSING_JOIN_CONDITION" | "AVOID_LEADING_WILDCARD_LIKE" | "CONSIDER_IN_INSTEAD_OF_MANY_ORS" | "REPLACE_LARGE_IN_TUPLE_WITH_ANY_ARRAY" | "PREFER_NOT_EXISTS_OVER_NOT_IN" | "PREFER_UNION_ALL_OVER_UNION" | "AVOID_ORDER_BY_RANDOM" | "AVOID_OFFSET_FOR_PAGINATION" | "PREFER_COUNT_STAR_OVER_COUNT_COLUMN" | "USE_EXISTS_NOT_COUNT_FOR_EXISTENCE_CHECK" | "PREFER_WHERE_OVER_HAVING_FOR_NON_AGGREGATES" | "PREFER_FILTER_OVER_CASE_IN_AGGREGATE" | "CONSIDER_GIST_INDEX" | "NULLS_FIRST_IN_DESC_ORDER" | "CONSIDER_EXPRESSION_INDEX_FOR_JSONB_EXTRACTION" | "AVOID_EXPRESSIONS_ON_COLUMNS_IN_WHERE" | "AVOID_SCALAR_SUBQUERY_IN_SELECT" | "NOOP_ORDER_BY" | "UPGRADE_DISTINCT_PG17" | "INDEX_ONLY_SCAN_HEAP_FETCHES" | "FLATTEN_NOT_EXISTS_OR" | "AVOID_SORTING_ON_GENERATED_VALUES";
|
|
615
|
+
type NudgeKind = "LARGE_IMPROVEMENT_FOUND" | "SMALL_IMPROVEMENT_FOUND" | "AVOID_SELECT_STAR" | "AVOID_FUNCTIONS_ON_COLUMNS_IN_WHERE" | "MISSING_WHERE_CLAUSE" | "MISSING_LIMIT_CLAUSE" | "USE_IS_NULL_NOT_EQUALS" | "AVOID_DISTINCT_WITHOUT_REASON" | "MISSING_JOIN_CONDITION" | "AVOID_LEADING_WILDCARD_LIKE" | "CONSIDER_IN_INSTEAD_OF_MANY_ORS" | "REPLACE_LARGE_IN_TUPLE_WITH_ANY_ARRAY" | "PREFER_NOT_EXISTS_OVER_NOT_IN" | "PREFER_UNION_ALL_OVER_UNION" | "AVOID_ORDER_BY_RANDOM" | "AVOID_OFFSET_FOR_PAGINATION" | "PREFER_COUNT_STAR_OVER_COUNT_COLUMN" | "USE_EXISTS_NOT_COUNT_FOR_EXISTENCE_CHECK" | "PREFER_WHERE_OVER_HAVING_FOR_NON_AGGREGATES" | "PREFER_FILTER_OVER_CASE_IN_AGGREGATE" | "CONSIDER_GIST_INDEX" | "NULLS_FIRST_IN_DESC_ORDER" | "CONSIDER_EXPRESSION_INDEX_FOR_JSONB_EXTRACTION" | "AVOID_EXPRESSIONS_ON_COLUMNS_IN_WHERE" | "AVOID_SCALAR_SUBQUERY_IN_SELECT" | "NOOP_ORDER_BY" | "UPGRADE_DISTINCT_PG17" | "INDEX_ONLY_SCAN_HEAP_FETCHES" | "FLATTEN_NOT_EXISTS_OR" | "AVOID_SORTING_ON_GENERATED_VALUES" | "CONSIDER_JSONB_CONTAINMENT_OPERATOR";
|
|
614
616
|
type Nudge = {
|
|
615
617
|
kind: NudgeKind;
|
|
616
618
|
severity: "CRITICAL" | "WARNING" | "INFO";
|
|
@@ -698,8 +700,9 @@ type DiscoveredColumnReference = {
|
|
|
698
700
|
};
|
|
699
701
|
jsonbOperator?: JsonbOperator;
|
|
700
702
|
gistOperator?: GistOperator;
|
|
703
|
+
jsonbExtraction?: string;
|
|
701
704
|
};
|
|
702
|
-
type JsonbOperator = "@>" | "?" | "?|" | "?&";
|
|
705
|
+
type JsonbOperator = "@>" | "?" | "?|" | "?&" | "@@" | "@?";
|
|
703
706
|
type GistOperator = "&&" | "-|-";
|
|
704
707
|
/** A function defined by @pgsql/parser */
|
|
705
708
|
type Parser = (query: string) => Promise<unknown>;
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/sql/pg-identifier.ts","../src/sql/builder.ts","../src/sql/database.ts","../src/optimizer/statistics.ts","../src/optimizer/genalgo.ts","../src/sql/nudges.ts","../src/sql/walker.ts","../src/sql/analyzer.ts","../src/sql/indexes.ts","../src/optimizer/pss-rewriter.ts"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/sql/pg-identifier.ts","../src/sql/builder.ts","../src/sql/database.ts","../src/optimizer/statistics.ts","../src/optimizer/genalgo.ts","../src/sql/nudges.ts","../src/sql/walker.ts","../src/sql/analyzer.ts","../src/sql/indexes.ts","../src/optimizer/pss-rewriter.ts"],"mappings":"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"}
|
package/dist/index.d.mts
CHANGED
|
@@ -553,6 +553,7 @@ declare class IndexOptimizer {
|
|
|
553
553
|
private toDefinition;
|
|
554
554
|
private toGinDefinition;
|
|
555
555
|
private toGistDefinition;
|
|
556
|
+
private toExpressionDefinition;
|
|
556
557
|
private groupGinCandidatesByColumn;
|
|
557
558
|
private ginIndexAlreadyExists;
|
|
558
559
|
private groupGistCandidatesByColumn;
|
|
@@ -597,6 +598,7 @@ type RootIndexCandidate = {
|
|
|
597
598
|
};
|
|
598
599
|
jsonbOperator?: JsonbOperator;
|
|
599
600
|
gistOperator?: GistOperator;
|
|
601
|
+
jsonbExtraction?: string;
|
|
600
602
|
};
|
|
601
603
|
type PermutedIndexCandidate = {
|
|
602
604
|
schema: string;
|
|
@@ -610,7 +612,7 @@ declare const PROCEED: unique symbol;
|
|
|
610
612
|
declare const SKIP: unique symbol;
|
|
611
613
|
//#endregion
|
|
612
614
|
//#region src/sql/nudges.d.ts
|
|
613
|
-
type NudgeKind = "LARGE_IMPROVEMENT_FOUND" | "SMALL_IMPROVEMENT_FOUND" | "AVOID_SELECT_STAR" | "AVOID_FUNCTIONS_ON_COLUMNS_IN_WHERE" | "MISSING_WHERE_CLAUSE" | "MISSING_LIMIT_CLAUSE" | "USE_IS_NULL_NOT_EQUALS" | "AVOID_DISTINCT_WITHOUT_REASON" | "MISSING_JOIN_CONDITION" | "AVOID_LEADING_WILDCARD_LIKE" | "CONSIDER_IN_INSTEAD_OF_MANY_ORS" | "REPLACE_LARGE_IN_TUPLE_WITH_ANY_ARRAY" | "PREFER_NOT_EXISTS_OVER_NOT_IN" | "PREFER_UNION_ALL_OVER_UNION" | "AVOID_ORDER_BY_RANDOM" | "AVOID_OFFSET_FOR_PAGINATION" | "PREFER_COUNT_STAR_OVER_COUNT_COLUMN" | "USE_EXISTS_NOT_COUNT_FOR_EXISTENCE_CHECK" | "PREFER_WHERE_OVER_HAVING_FOR_NON_AGGREGATES" | "PREFER_FILTER_OVER_CASE_IN_AGGREGATE" | "CONSIDER_GIST_INDEX" | "NULLS_FIRST_IN_DESC_ORDER" | "CONSIDER_EXPRESSION_INDEX_FOR_JSONB_EXTRACTION" | "AVOID_EXPRESSIONS_ON_COLUMNS_IN_WHERE" | "AVOID_SCALAR_SUBQUERY_IN_SELECT" | "NOOP_ORDER_BY" | "UPGRADE_DISTINCT_PG17" | "INDEX_ONLY_SCAN_HEAP_FETCHES" | "FLATTEN_NOT_EXISTS_OR" | "AVOID_SORTING_ON_GENERATED_VALUES";
|
|
615
|
+
type NudgeKind = "LARGE_IMPROVEMENT_FOUND" | "SMALL_IMPROVEMENT_FOUND" | "AVOID_SELECT_STAR" | "AVOID_FUNCTIONS_ON_COLUMNS_IN_WHERE" | "MISSING_WHERE_CLAUSE" | "MISSING_LIMIT_CLAUSE" | "USE_IS_NULL_NOT_EQUALS" | "AVOID_DISTINCT_WITHOUT_REASON" | "MISSING_JOIN_CONDITION" | "AVOID_LEADING_WILDCARD_LIKE" | "CONSIDER_IN_INSTEAD_OF_MANY_ORS" | "REPLACE_LARGE_IN_TUPLE_WITH_ANY_ARRAY" | "PREFER_NOT_EXISTS_OVER_NOT_IN" | "PREFER_UNION_ALL_OVER_UNION" | "AVOID_ORDER_BY_RANDOM" | "AVOID_OFFSET_FOR_PAGINATION" | "PREFER_COUNT_STAR_OVER_COUNT_COLUMN" | "USE_EXISTS_NOT_COUNT_FOR_EXISTENCE_CHECK" | "PREFER_WHERE_OVER_HAVING_FOR_NON_AGGREGATES" | "PREFER_FILTER_OVER_CASE_IN_AGGREGATE" | "CONSIDER_GIST_INDEX" | "NULLS_FIRST_IN_DESC_ORDER" | "CONSIDER_EXPRESSION_INDEX_FOR_JSONB_EXTRACTION" | "AVOID_EXPRESSIONS_ON_COLUMNS_IN_WHERE" | "AVOID_SCALAR_SUBQUERY_IN_SELECT" | "NOOP_ORDER_BY" | "UPGRADE_DISTINCT_PG17" | "INDEX_ONLY_SCAN_HEAP_FETCHES" | "FLATTEN_NOT_EXISTS_OR" | "AVOID_SORTING_ON_GENERATED_VALUES" | "CONSIDER_JSONB_CONTAINMENT_OPERATOR";
|
|
614
616
|
type Nudge = {
|
|
615
617
|
kind: NudgeKind;
|
|
616
618
|
severity: "CRITICAL" | "WARNING" | "INFO";
|
|
@@ -698,8 +700,9 @@ type DiscoveredColumnReference = {
|
|
|
698
700
|
};
|
|
699
701
|
jsonbOperator?: JsonbOperator;
|
|
700
702
|
gistOperator?: GistOperator;
|
|
703
|
+
jsonbExtraction?: string;
|
|
701
704
|
};
|
|
702
|
-
type JsonbOperator = "@>" | "?" | "?|" | "?&";
|
|
705
|
+
type JsonbOperator = "@>" | "?" | "?|" | "?&" | "@@" | "@?";
|
|
703
706
|
type GistOperator = "&&" | "-|-";
|
|
704
707
|
/** A function defined by @pgsql/parser */
|
|
705
708
|
type Parser = (query: string) => Promise<unknown>;
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/sql/pg-identifier.ts","../src/sql/builder.ts","../src/sql/database.ts","../src/optimizer/statistics.ts","../src/optimizer/genalgo.ts","../src/sql/nudges.ts","../src/sql/walker.ts","../src/sql/analyzer.ts","../src/sql/indexes.ts","../src/optimizer/pss-rewriter.ts"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/sql/pg-identifier.ts","../src/sql/builder.ts","../src/sql/database.ts","../src/optimizer/statistics.ts","../src/optimizer/genalgo.ts","../src/sql/nudges.ts","../src/sql/walker.ts","../src/sql/analyzer.ts","../src/sql/indexes.ts","../src/optimizer/pss-rewriter.ts"],"mappings":";;;;;;;;;;;cAKa,YAAA;EAAA,iBAEQ,KAAA;EAAA,iBACA,MAAA;EAAA,QAFZ,WAAA,CAAA;EA+BoC;;;;EAAA,OAtBpC,UAAA,CAAW,UAAA,WAAqB,YAAA;EAPpB;;;;;;EAAA,OA6BZ,SAAA,CAAA,GAAa,WAAA,YAAuB,YAAA,MAAkB,YAAA;EAe7D,QAAA,CAAA;EAOA,MAAA,CAAA;EAAA,wBAMwB,gBAAA;AAAA;;;KC/Dd,2BAAA;AAAA,cAKC,oBAAA;EAAA,QASS,KAAA;EAAA,iBARH,QAAA;EAAA,QACT,eAAA;EAAA,QACA,YAAA;EAAA,QACA,SAAA;EAAA,QACA,UAAA;EAAA,QAEA,iBAAA;cAEY,KAAA;EAAA,IAEhB,QAAA,CAAA;EAAA,OAIG,WAAA,CAAY,UAAA,UAAoB,IAAA,GAAO,YAAA,GAAY,oBAAA;EAS1D,MAAA,CAAO,OAAA,EAAS,2BAAA,EAA6B,KAAA;EAU7C,SAAA,CAAU,KAAA;EAKV,UAAA,CAAA;EAKA,OAAA,CAAQ,KAAA;EAKR,YAAA,CAAa,UAAA,EAAY,MAAA,CAAO,SAAA;EAKhC,YAAA,CAAa,KAAA;EAKb,KAAA,CAAA;ED7BoB;ECuCpB,UAAA,CAAA;;;;UAUQ,mBAAA;EAAA,QASA,eAAA;EAAA,QAaA,eAAA;AAAA;AAAA,KAeE,SAAA;;;cCxHC,eAAA,EAAe,CAAA,CAAA,IAAA,CAAA,WAAA,CAAA,CAAA,CAAA,SAAA;AAAA,KAChB,eAAA,GAAkB,CAAA,CAAE,KAAA,QAAa,eAAA;AAAA,UAE5B,mBAAA;EFDJ;;;EEKX,IAAA,IAAQ,KAAA,UAAe,MAAA,eAAqB,OAAA,CAAQ,CAAA;AAAA;;;;;UAOrC,QAAA,SAAiB,mBAAA;EAChC,WAAA,IAAe,QAAA,GAAW,EAAA,EAAI,mBAAA,KAAwB,OAAA,CAAQ,CAAA,IAAK,OAAA,CAAQ,CAAA;EAC3E,MAAA,KACE,KAAA,UACA,MAAA,cACA,OAAA;IAAY,IAAA;EAAA,IACX,cAAA,CAAe,CAAA;EAElB,SAAA,IAAa,OAAA,CAAQ,eAAA;AAAA;AAAA,KAGX,uBAAA;EACV,GAAA;AAAA;AAAA,KAGU,eAAA,IAAmB,KAAA,EAAO,uBAAA,KAA4B,QAAA;AAAA,cAGpD,OAAA;AAAA,KACF,eAAA;EAAA,CAA8B,OAAA;AAAA;AAAA,KAE9B,aAAA;AAAA,KASA,0BAAA;EACV,WAAA,EAAa,aAAA;EAGb,SAAA,EAAW,eAAA;EACX,KAAA,GAAQ,oBAAA;EACR,YAAA;EACA,YAAA;AAAA;AAAA,KAGU,oBAAA,IACP,0BAAA;EACC,WAAA;EACA,YAAA;EACA,eAAA;EACA,KAAA;EACA,wBAAA;AAAA,MAED,0BAAA;EACC,WAAA;EACA,eAAA;EACA,MAAA;EACA,aAAA;EACA,cAAA;EACA,wBAAA;AAAA,MAED,0BAAA;EACC,WAAA;EACA,eAAA;EACA,MAAA;EACA,aAAA;EACA,cAAA;EACA,wBAAA;AAAA,MAED,0BAAA;EACC,WAAA;EACA,YAAA;EACA,MAAA;EACA,aAAA;EACA,cAAA;EACA,wBAAA;AAAA,MAED,0BAAA;EACC,WAAA;EACA,YAAA;EACA,eAAA;EACA,MAAA;EACA,aAAA;EACA,cAAA;EACA,wBAAA;EACA,cAAA;AAAA,KAEF,0BAAA;AAAA,KAEQ,qBAAA;EACV,YAAA;IACE,IAAA,EAAM,oBAAA;EAAA;AAAA;;;;;iBAQY,SAAA,CACpB,EAAA,EAAI,mBAAA,EACJ,KAAA,EAAO,YAAA,GACN,OAAA;;;KCvGS,IAAA;AAAA,cAEC,gBAAA,EAAgB,CAAA,CAAA,QAAA,WAAA,CAAA,CAAA,SAAA;;;;;;cAUhB,uBAAA,EAAuB,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAoCvB,oBAAA,EAAoB,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAKpB,kBAAA,EAAkB,CAAA,CAAA,SAAA;;;;;;;cAWlB,eAAA,EAAe,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAcf,aAAA,EAAa,CAAA,CAAA,QAAA,WAAA,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAEd,aAAA,GAAgB,CAAA,CAAE,KAAA,QAAa,aAAA;AAAA,cAE9B,cAAA,EAAc,CAAA,CAAA,qBAAA,EAAA,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAaf,cAAA,GAAiB,CAAA,CAAE,KAAA,QAAa,cAAA;AAAA,cAI/B,UAAA;EAAA,iBAUQ,EAAA;EAAA,SACD,eAAA,EAAiB,eAAA;EAAA,SACjB,WAAA,EAAa,aAAA;EAAA,SAXtB,IAAA,EAAM,cAAA;EAAA,iBACE,gBAAA;EAAA,gBAED,gBAAA,EAAkB,cAAA;cAMf,EAAA,EAAI,QAAA,EACL,eAAA,EAAiB,eAAA,EACjB,WAAA,EAAa,aAAA,IAC7B,SAAA,EAAW,cAAA;EAAA,OAYN,uBAAA,CAAA;IACL,SAAA;IACA;EAAA;IAEA,SAAA;IACA,QAAA;EAAA,IACE,cAAA;ED7CA;;;EAAA,OCwDG,mBAAA,CAAoB,KAAA,EAAO,aAAA,KAAkB,cAAA;EAAA,OAQvC,YAAA,CACX,EAAA,EAAI,QAAA,EACJ,SAAA,EAAW,cAAA,GACV,OAAA,CAAQ,UAAA;EAMX,YAAA,CAAa,EAAA,EAAI,mBAAA,GAAmB,OAAA;;;;;MA2D9B,SAAA;MACA,KAAA;MACA,MAAA;MACA,MAAA;IAAA;EAAA;EAvDN,oBAAA,CAAA;EDhEI;;;;EAAA,QC+EI,YAAA;ED/EJ;;;;;;;EAAA,eCqGW,aAAA;EAAA,QASD,cAAA;EAAA,OAodD,SAAA,CACX,EAAA,EAAI,mBAAA,EACJ,eAAA,EAAiB,eAAA,EACjB,IAAA,yBACC,OAAA,CAAQ,aAAA;EA3qBD;;;;EA+wBJ,kBAAA,CAAA,GAAsB,OAAA,CAAQ,YAAA;AAAA;AAAA,KA2D1B,cAAA;EACV,UAAA;EACA,QAAA;EACA,UAAA;EACA,KAAA,EAAO,WAAA;AAAA;AAAA,KAGJ,WAAA;EACH,UAAA;EACA,WAAA;EACA,QAAA;EACA,WAAA;EACA,QAAA;EACA,QAAA;EACA,QAAA;EACA,QAAA;EACA,QAAA;EACA,MAAA;EACA,MAAA;EACA,MAAA;EACA,MAAA;EACA,MAAA;EACA,QAAA;EACA,QAAA;EACA,QAAA;EACA,QAAA;EACA,QAAA;EACA,WAAA;EACA,WAAA;EACA,WAAA;EACA,WAAA;EACA,WAAA;AAAA;AAAA,KAGU,aAAA;EACV,SAAA;EACA,UAAA;EACA,SAAA;EACA,QAAA;EACA,aAAA;EACA,YAAA;EACA,OAAA,EAAS,cAAA;AAAA;AAAA,KAGN,SAAA;AAAA,KACO,UAAA;EACV,aAAA;EACA,SAAA;AAAA;AAAA,KAGU,eAAA;EACV,MAAA,EAAQ,aAAA;EACR,UAAA;EACA,cAAA,EAAgB,MAAA,CAAO,SAAA;AAAA;AAAA,KAGb,UAAA;AAAA,KAEA,YAAA;EACV,aAAA,EAAe,KAAA;IAAQ,IAAA;IAAc,KAAA,EAAO,UAAA;IAAY,OAAA;EAAA;EACxD,UAAA;EACA,SAAA;EACA,UAAA;EAEA,UAAA;EAEA,WAAA;EACA,UAAA;AAAA;;;KCv4BU,eAAA;AAAA,KAEA,mBAAA,GAAsB,sBAAA;EAChC,UAAA,EAAY,eAAA;AAAA;AAAA,cAUD,cAAA;EAAA,iBAIQ,EAAA;EAAA,iBACA,UAAA;EAAA,QACT,eAAA;EAAA,iBACS,MAAA;EAAA,OANZ,MAAA;cAGY,EAAA,EAAI,QAAA,EACJ,UAAA,EAAY,UAAA,EACrB,eAAA,EAAiB,YAAA,IACR,MAAA;IACf,KAAA;IACA,KAAA;EAAA;EAIE,GAAA,CACJ,OAAA,EAAS,oBAAA,EACT,OAAA,EAAS,kBAAA,IACT,WAAA,IAAe,EAAA,EAAI,mBAAA,KAAwB,OAAA,SAC1C,OAAA,CAAQ,cAAA;EAkEL,iBAAA,CAAkB,OAAA,EAAS,oBAAA,GAAoB,OAAA;UAudlC,oBAAA;EAAA;EJ7gBnB;;;;;;;ACzDF;;;;;AAKA;EG6HE,gBAAA,CAAiB,CAAA,GAAI,OAAA,EAAS,YAAA,OAAmB,YAAA;;;;;;UAWzC,SAAA;EAAA,QAOA,kBAAA;EH9FuB;;;EAAA,QG0IvB,eAAA;EAAA,QAsJA,YAAA;EAAA,QA6CA,eAAA;EAAA,QAqBA,gBAAA;EAAA,QAkBA,sBAAA;EAAA,QAkBA,0BAAA;EAAA,QA8BA,qBAAA;EAAA,QAYA,2BAAA;EAAA,QAmBA,sBAAA;EHreW;;;EAAA,QGofL,mBAAA;EAAA,QAaN,WAAA;EAAA,QAaA,UAAA;EAAA,QAeA,aAAA;EAiBF,kBAAA,CACJ,OAAA,EAAS,oBAAA,EACT,CAAA,IAAK,EAAA,EAAI,mBAAA,KAAwB,OAAA,QACjC,OAAA;IAAY,MAAA;IAAoB,WAAA;EAAA,IAC/B,OAAA;IAAU,IAAA,EAAM,oBAAA;EAAA;EAAA,QAmCX,iCAAA;EAAA,QAoBA,eAAA;EAAA,QAyBA,gCAAA;AAAA;AAAA,KA4BE,cAAA;EAEN,IAAA;EACA,eAAA,EAAiB,oBAAA;EACjB,QAAA;EACA,SAAA;EACA,UAAA,EAAY,GAAA;EACZ,eAAA,EAAiB,GAAA;EACjB,YAAA,EAAc,GAAA,SAAY,mBAAA;EAC1B,WAAA,EAAa,oBAAA;AAAA;EAGb,IAAA;EACA,WAAA,EAAa,oBAAA;AAAA;AAAA,KAOP,kBAAA;EACV,MAAA;EACA,KAAA;EACA,MAAA;EACA,IAAA,GAAO,WAAA;EACP,KAAA;IAAU,QAAA,GAAW,YAAA;EAAA;EACrB,aAAA,GAAgB,aAAA;EAChB,YAAA,GAAe,YAAA;EACf,eAAA;AAAA;AAAA,KAGU,sBAAA;EACV,MAAA;EACA,KAAA;EACA,OAAA,EAAS,kBAAA;EAET,KAAA;EACA,WAAA;EACA,OAAA;AAAA;AAAA,cAGW,OAAA;AAAA,cACA,IAAA;;;KC3tBR,SAAA;AAAA,KAiCO,KAAA;EACV,IAAA,EAAM,SAAA;EACN,QAAA;EACA,OAAA;EACA,QAAA;AAAA;AAAA,KAGG,WAAA,MAAiB,CAAA,SAAU,CAAA,SAAU,CAAA;;;;;iBAmM1B,WAAA,CACd,IAAA,EAAM,IAAA,EACN,KAAA,GAAQ,WAAA,CAAY,IAAA,gBACnB,KAAA;;;;;;iBAmhCa,iBAAA,CAAkB,UAAA;;;;;;iBASlB,kBAAA,CACd,MAAA,EAAQ,KAAA,IACR,YAAA,WACC,KAAA;;;KC5zBS,mBAAA;EACV,MAAA,WL7ciB;EK+cjB,IAAA;EACA,KAAA;EACA,MAAA;EACA,KAAA;AAAA;;;UCxce,cAAA;EACf,KAAA,CAAM,KAAA,UAAe,MAAA,cAAoB,OAAA;AAAA;AAAA,cAG9B,iBAAA;AAAA,UAEI,eAAA;EACf,GAAA;EACA,KAAA;AAAA;AAAA,KAGU,WAAA;EACV,GAAA,EAAK,SAAA;EACL,KAAA,EAAO,WAAA;AAAA;AAAA,KAGG,yBAAA;EPnB6B,2DOqBvC,SAAA;EPCoB;;;;EOIpB,cAAA;EPwBwB;;;;;;AC/D1B;;;;;AAKA;;;EMiDE,KAAA,EAAO,mBAAA;ENlCmD;;;EMsC1D,OAAA,WNJ+B;EMM/B,QAAA;IACE,KAAA;IACA,GAAA;EAAA;ENtDM;;;;EM4DR,IAAA,GAAO,WAAA;EACP,KAAA;IAAU,QAAA,GAAW,YAAA;EAAA;EACrB,aAAA,GAAgB,aAAA;EAChB,YAAA,GAAe,YAAA;EACf,eAAA;AAAA;AAAA,KAGU,aAAA;AAAA,KAEA,YAAA;;KAGA,MAAA,IAAU,KAAA,aAAkB,OAAA;AAAA,KAE5B,cAAA;EACV,MAAA;EACA,KAAA;AAAA;AAAA,KAGU,cAAA;EACV,cAAA,EAAgB,yBAAA;EAChB,oBAAA;EACA,gBAAA,EAAkB,cAAA;EAClB,eAAA,EAAiB,mBAAA;EACjB,IAAA,EAAM,eAAA;EACN,gBAAA;EACA,yBAAA;EACA,MAAA,EAAQ,KAAA;AAAA;AAAA,KAGE,sBAAA;EACV,IAAA,EAAM,eAAA;EACN,gBAAA;AAAA;;;ANqBF;;;;cMZa,QAAA;EAAA,iBACkB,MAAA;cAAA,MAAA,EAAQ,MAAA;EAC/B,OAAA,CACJ,KAAA,UACA,cAAA,YACC,OAAA,CAAQ,cAAA;EAmGX,aAAA,CACE,MAAA,EAAQ,aAAA,IACR,UAAA,EAAY,yBAAA,IACZ,gBAAA,EAAkB,cAAA,KACjB,kBAAA;EAAA,QAgIK,gBAAA;EAAA,QAmBA,SAAA;EAAA,QAMA,gBAAA;ELjXkB;;;;;;EAAA,QKuYlB,mBAAA;EAAA,QAkBA,SAAA;EAAA,QAOA,mBAAA;AAAA;;;iBCjaM,gBAAA,CAAiB,KAAA,EAAO,YAAA;;;;ARGxC;iBQSgB,wBAAA,CAAyB,KAAA,EAAO,YAAA;;;;;;;;cCTnC,WAAA;EACX,OAAA,CAAQ,KAAA;EAAA,QAIA,2BAAA;EAAA,QAaA,mBAAA;AAAA"}
|
package/dist/index.mjs
CHANGED
|
@@ -27,7 +27,7 @@ const SPATIAL_FUNCTIONS = new Set([
|
|
|
27
27
|
"st_overlaps",
|
|
28
28
|
"st_touches"
|
|
29
29
|
]);
|
|
30
|
-
const JSONB_EXTRACTION_OPS = new Set([
|
|
30
|
+
const JSONB_EXTRACTION_OPS$1 = new Set([
|
|
31
31
|
"->>",
|
|
32
32
|
"->",
|
|
33
33
|
"#>>",
|
|
@@ -45,7 +45,7 @@ function getAExprOpName(node) {
|
|
|
45
45
|
function findExtractionExpr(node) {
|
|
46
46
|
if (is$1(node, "A_Expr")) {
|
|
47
47
|
const op = getAExprOpName(node);
|
|
48
|
-
if (op && JSONB_EXTRACTION_OPS.has(op)) {
|
|
48
|
+
if (op && JSONB_EXTRACTION_OPS$1.has(op)) {
|
|
49
49
|
if (node.A_Expr.lexpr && hasColumnRefInNode(node.A_Expr.lexpr)) return node;
|
|
50
50
|
return null;
|
|
51
51
|
}
|
|
@@ -115,7 +115,7 @@ const findJsonbExtractionInWhere = (whereClause) => {
|
|
|
115
115
|
function walk(node) {
|
|
116
116
|
if (is$1(node, "A_Expr")) {
|
|
117
117
|
const op = getAExprOpName(node);
|
|
118
|
-
if (op && JSONB_EXTRACTION_OPS.has(op)) return;
|
|
118
|
+
if (op && JSONB_EXTRACTION_OPS$1.has(op)) return;
|
|
119
119
|
if (node.A_Expr.lexpr) emit(node.A_Expr.lexpr);
|
|
120
120
|
if (node.A_Expr.rexpr) emit(node.A_Expr.rexpr);
|
|
121
121
|
return;
|
|
@@ -371,6 +371,17 @@ function parseNudges(node, stack) {
|
|
|
371
371
|
location: node.FuncCall.location
|
|
372
372
|
});
|
|
373
373
|
}
|
|
374
|
+
if (is$1(node, "FuncCall")) {
|
|
375
|
+
if (stack.some((item) => item === "whereClause") && node.FuncCall.args) {
|
|
376
|
+
const name = getFuncName(node);
|
|
377
|
+
if (name && JSONB_SET_RETURNING_FUNCTIONS.has(name) && containsColumnRef(node.FuncCall.args)) nudges.push({
|
|
378
|
+
kind: "CONSIDER_JSONB_CONTAINMENT_OPERATOR",
|
|
379
|
+
severity: "INFO",
|
|
380
|
+
message: "JSONB set-returning functions (e.g. jsonb_array_elements) cannot be used as an index access path. If the query checks for containment or key existence, GIN-compatible operators (@>, ?, ?|, ?&, @?, @@) may allow index usage.",
|
|
381
|
+
location: node.FuncCall.location
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
}
|
|
374
385
|
if (is$1(node, "A_Expr") && node.A_Expr.kind === "AEXPR_OP" && node.A_Expr.name && node.A_Expr.name.length > 0) {
|
|
375
386
|
const opNode = node.A_Expr.name[0];
|
|
376
387
|
const op = is$1(opNode, "String") ? opNode.String.sval : null;
|
|
@@ -538,6 +549,23 @@ function containsAggregate(node) {
|
|
|
538
549
|
for (const child of Object.values(node)) if (containsAggregate(child)) return true;
|
|
539
550
|
return false;
|
|
540
551
|
}
|
|
552
|
+
const JSONB_SET_RETURNING_FUNCTIONS = new Set([
|
|
553
|
+
"jsonb_array_elements",
|
|
554
|
+
"json_array_elements",
|
|
555
|
+
"jsonb_array_elements_text",
|
|
556
|
+
"json_array_elements_text",
|
|
557
|
+
"jsonb_each",
|
|
558
|
+
"json_each",
|
|
559
|
+
"jsonb_each_text",
|
|
560
|
+
"json_each_text"
|
|
561
|
+
]);
|
|
562
|
+
function getFuncName(node) {
|
|
563
|
+
const names = node.FuncCall.funcname;
|
|
564
|
+
if (!names || names.length === 0) return null;
|
|
565
|
+
const last = names[names.length - 1];
|
|
566
|
+
if (isANode$1(last) && is$1(last, "String") && last.String.sval) return last.String.sval;
|
|
567
|
+
return null;
|
|
568
|
+
}
|
|
541
569
|
function getLastColumnRefField(columnRef) {
|
|
542
570
|
const fields = columnRef.ColumnRef.fields;
|
|
543
571
|
if (!fields || fields.length === 0) return null;
|
|
@@ -723,6 +751,20 @@ function _defineProperty(e, r, t) {
|
|
|
723
751
|
|
|
724
752
|
//#endregion
|
|
725
753
|
//#region src/sql/walker.ts
|
|
754
|
+
const JSONB_EXTRACTION_OPS = new Set(["->", "->>"]);
|
|
755
|
+
const COMPARISON_OPS = new Set([
|
|
756
|
+
"=",
|
|
757
|
+
"<>",
|
|
758
|
+
"!=",
|
|
759
|
+
"<",
|
|
760
|
+
"<=",
|
|
761
|
+
">",
|
|
762
|
+
">=",
|
|
763
|
+
"~~",
|
|
764
|
+
"~~*",
|
|
765
|
+
"!~~",
|
|
766
|
+
"!~~*"
|
|
767
|
+
]);
|
|
726
768
|
/**
|
|
727
769
|
* Walks the AST of a sql query and extracts query metadata.
|
|
728
770
|
* This pattern is used to segregate the mutable state that's more common for the
|
|
@@ -803,7 +845,7 @@ var Walker = class Walker {
|
|
|
803
845
|
}
|
|
804
846
|
if (is(node, "A_Expr") && node.A_Expr.kind === "AEXPR_OP") {
|
|
805
847
|
const opName = node.A_Expr.name?.[0] && is(node.A_Expr.name[0], "String") && node.A_Expr.name[0].String.sval;
|
|
806
|
-
if (opName && (opName === "@>" || opName === "?" || opName === "?|" || opName === "?&")) {
|
|
848
|
+
if (opName && (opName === "@>" || opName === "?" || opName === "?|" || opName === "?&" || opName === "@@" || opName === "@?")) {
|
|
807
849
|
const jsonbOperator = opName;
|
|
808
850
|
if (node.A_Expr.lexpr && is(node.A_Expr.lexpr, "ColumnRef")) this.add(node.A_Expr.lexpr, { jsonbOperator });
|
|
809
851
|
if (node.A_Expr.rexpr && is(node.A_Expr.rexpr, "ColumnRef")) this.add(node.A_Expr.rexpr, { jsonbOperator });
|
|
@@ -813,6 +855,11 @@ var Walker = class Walker {
|
|
|
813
855
|
if (node.A_Expr.lexpr && is(node.A_Expr.lexpr, "ColumnRef")) this.add(node.A_Expr.lexpr, { gistOperator });
|
|
814
856
|
if (node.A_Expr.rexpr && is(node.A_Expr.rexpr, "ColumnRef")) this.add(node.A_Expr.rexpr, { gistOperator });
|
|
815
857
|
}
|
|
858
|
+
if (opName && COMPARISON_OPS.has(opName)) for (const operand of [node.A_Expr.lexpr, node.A_Expr.rexpr]) {
|
|
859
|
+
if (!operand) continue;
|
|
860
|
+
const extraction = extractJsonbPath(operand);
|
|
861
|
+
if (extraction) this.add(extraction.columnRef, { jsonbExtraction: extraction.expression });
|
|
862
|
+
}
|
|
816
863
|
}
|
|
817
864
|
if (is(node, "ColumnRef")) {
|
|
818
865
|
for (let i = 0; i < stack.length; i++) {
|
|
@@ -897,6 +944,7 @@ var Walker = class Walker {
|
|
|
897
944
|
if (options?.where) ref.where = options.where;
|
|
898
945
|
if (options?.jsonbOperator) ref.jsonbOperator = options.jsonbOperator;
|
|
899
946
|
if (options?.gistOperator) ref.gistOperator = options.gistOperator;
|
|
947
|
+
if (options?.jsonbExtraction) ref.jsonbExtraction = options.jsonbExtraction;
|
|
900
948
|
this.highlights.push(ref);
|
|
901
949
|
}
|
|
902
950
|
/**
|
|
@@ -964,6 +1012,57 @@ function isANode(node) {
|
|
|
964
1012
|
const keys = Object.keys(node);
|
|
965
1013
|
return keys.length === 1 && /^[A-Z]/.test(keys[0]);
|
|
966
1014
|
}
|
|
1015
|
+
/**
|
|
1016
|
+
* Given an operand of a comparison (e.g. the left side of `=`), check whether
|
|
1017
|
+
* it is a JSONB path extraction expression such as `data->>'email'` or
|
|
1018
|
+
* `(data->>'age')::int`. If so, return the root ColumnRef (for the walker to
|
|
1019
|
+
* register) and the full expression string (for use in the expression index).
|
|
1020
|
+
*
|
|
1021
|
+
* Handles:
|
|
1022
|
+
* - `data->>'email'` — simple extraction
|
|
1023
|
+
* - `(data->>'age')::int` — extraction with cast
|
|
1024
|
+
* - `data->'addr'->>'city'` — chained extraction
|
|
1025
|
+
* - `t.data->>'email'` — table-qualified (strips qualifier from expression)
|
|
1026
|
+
*/
|
|
1027
|
+
function extractJsonbPath(node) {
|
|
1028
|
+
let exprNode = node;
|
|
1029
|
+
if (is(exprNode, "TypeCast") && exprNode.TypeCast.arg) exprNode = exprNode.TypeCast.arg;
|
|
1030
|
+
if (!is(exprNode, "A_Expr") || exprNode.A_Expr.kind !== "AEXPR_OP") return;
|
|
1031
|
+
const innerOp = exprNode.A_Expr.name?.[0] && is(exprNode.A_Expr.name[0], "String") && exprNode.A_Expr.name[0].String.sval;
|
|
1032
|
+
if (!innerOp || !JSONB_EXTRACTION_OPS.has(innerOp)) return;
|
|
1033
|
+
const rootCol = findRootColumnRef(exprNode);
|
|
1034
|
+
if (!rootCol) return;
|
|
1035
|
+
const cloned = JSON.parse(JSON.stringify(node));
|
|
1036
|
+
stripTableQualifiers(cloned);
|
|
1037
|
+
return {
|
|
1038
|
+
columnRef: rootCol,
|
|
1039
|
+
expression: deparseSync(cloned)
|
|
1040
|
+
};
|
|
1041
|
+
}
|
|
1042
|
+
/**
|
|
1043
|
+
* Walk the left side of a chain of `->` / `->>` operators to find the
|
|
1044
|
+
* root ColumnRef (the JSONB column itself).
|
|
1045
|
+
*/
|
|
1046
|
+
function findRootColumnRef(node) {
|
|
1047
|
+
if (is(node, "ColumnRef")) return node;
|
|
1048
|
+
if (is(node, "A_Expr") && node.A_Expr.lexpr) return findRootColumnRef(node.A_Expr.lexpr);
|
|
1049
|
+
if (is(node, "TypeCast") && node.TypeCast.arg) return findRootColumnRef(node.TypeCast.arg);
|
|
1050
|
+
}
|
|
1051
|
+
/**
|
|
1052
|
+
* Remove table/schema qualifiers from ColumnRef nodes inside the
|
|
1053
|
+
* expression so the deparsed expression contains only the column name.
|
|
1054
|
+
* e.g. `t.data->>'email'` → `data->>'email'`
|
|
1055
|
+
*/
|
|
1056
|
+
function stripTableQualifiers(node) {
|
|
1057
|
+
if (typeof node !== "object" || node === null) return;
|
|
1058
|
+
if ("ColumnRef" in node && node.ColumnRef?.fields) {
|
|
1059
|
+
const fields = node.ColumnRef.fields;
|
|
1060
|
+
if (fields.length > 1) node.ColumnRef.fields = [fields[fields.length - 1]];
|
|
1061
|
+
return;
|
|
1062
|
+
}
|
|
1063
|
+
for (const value of Object.values(node)) if (Array.isArray(value)) for (const item of value) stripTableQualifiers(item);
|
|
1064
|
+
else if (typeof value === "object" && value !== null) stripTableQualifiers(value);
|
|
1065
|
+
}
|
|
967
1066
|
|
|
968
1067
|
//#endregion
|
|
969
1068
|
//#region src/sql/analyzer.ts
|
|
@@ -1005,10 +1104,11 @@ var Analyzer = class {
|
|
|
1005
1104
|
const queryBeforeMatch = currQuery.slice(0, highlight.position.start);
|
|
1006
1105
|
const queryAfterToken = currQuery.slice(highlight.position.end);
|
|
1007
1106
|
currQuery = `${queryBeforeMatch}${color(queryRepr)}${this.colorizeKeywords(queryAfterToken, color)}`;
|
|
1008
|
-
|
|
1107
|
+
const reprKey = highlight.jsonbExtraction ? `${queryRepr}::${highlight.jsonbExtraction}` : queryRepr;
|
|
1108
|
+
if (indexRepresentations.has(reprKey)) skip = true;
|
|
1009
1109
|
if (!skip) {
|
|
1010
1110
|
indexesToCheck.push(highlight);
|
|
1011
|
-
indexRepresentations.add(
|
|
1111
|
+
indexRepresentations.add(reprKey);
|
|
1012
1112
|
}
|
|
1013
1113
|
}
|
|
1014
1114
|
const referencedTables = [];
|
|
@@ -1041,7 +1141,8 @@ var Analyzer = class {
|
|
|
1041
1141
|
const allIndexes = [];
|
|
1042
1142
|
const seenIndexes = /* @__PURE__ */ new Set();
|
|
1043
1143
|
function addIndex(index) {
|
|
1044
|
-
const
|
|
1144
|
+
const extractionSuffix = index.jsonbExtraction ? `:"${index.jsonbExtraction}"` : "";
|
|
1145
|
+
const key = `"${index.schema}":"${index.table}":"${index.column}"${extractionSuffix}`;
|
|
1045
1146
|
if (seenIndexes.has(key)) return;
|
|
1046
1147
|
seenIndexes.add(key);
|
|
1047
1148
|
allIndexes.push(index);
|
|
@@ -1066,6 +1167,7 @@ var Analyzer = class {
|
|
|
1066
1167
|
if (colReference.where) index.where = colReference.where;
|
|
1067
1168
|
if (colReference.jsonbOperator) index.jsonbOperator = colReference.jsonbOperator;
|
|
1068
1169
|
if (colReference.gistOperator) index.gistOperator = colReference.gistOperator;
|
|
1170
|
+
if (colReference.jsonbExtraction) index.jsonbExtraction = colReference.jsonbExtraction;
|
|
1069
1171
|
addIndex(index);
|
|
1070
1172
|
}
|
|
1071
1173
|
} else if (tableReference) {
|
|
@@ -1083,6 +1185,7 @@ var Analyzer = class {
|
|
|
1083
1185
|
if (colReference.where) index.where = colReference.where;
|
|
1084
1186
|
if (colReference.jsonbOperator) index.jsonbOperator = colReference.jsonbOperator;
|
|
1085
1187
|
if (colReference.gistOperator) index.gistOperator = colReference.gistOperator;
|
|
1188
|
+
if (colReference.jsonbExtraction) index.jsonbExtraction = colReference.jsonbExtraction;
|
|
1086
1189
|
addIndex(index);
|
|
1087
1190
|
}
|
|
1088
1191
|
} else if (fullReference) {
|
|
@@ -1096,6 +1199,7 @@ var Analyzer = class {
|
|
|
1096
1199
|
if (colReference.where) index.where = colReference.where;
|
|
1097
1200
|
if (colReference.jsonbOperator) index.jsonbOperator = colReference.jsonbOperator;
|
|
1098
1201
|
if (colReference.gistOperator) index.gistOperator = colReference.gistOperator;
|
|
1202
|
+
if (colReference.jsonbExtraction) index.jsonbExtraction = colReference.jsonbExtraction;
|
|
1099
1203
|
addIndex(index);
|
|
1100
1204
|
} else {
|
|
1101
1205
|
console.error("Column reference has too many parts. The query is malformed", colReference);
|
|
@@ -1641,7 +1745,8 @@ var IndexOptimizer = class IndexOptimizer {
|
|
|
1641
1745
|
* Derive the list of indexes [tableA(X, Y, Z), tableB(H, I, J)]
|
|
1642
1746
|
**/
|
|
1643
1747
|
indexesToCreate(rootCandidates) {
|
|
1644
|
-
const
|
|
1748
|
+
const expressionCandidates = rootCandidates.filter((c) => c.jsonbExtraction);
|
|
1749
|
+
const btreeCandidates = rootCandidates.filter((c) => !c.jsonbOperator && !c.gistOperator && !c.jsonbExtraction);
|
|
1645
1750
|
const ginCandidates = rootCandidates.filter((c) => c.jsonbOperator);
|
|
1646
1751
|
const gistCandidates = rootCandidates.filter((c) => c.gistOperator);
|
|
1647
1752
|
const nextStage = [];
|
|
@@ -1673,7 +1778,7 @@ var IndexOptimizer = class IndexOptimizer {
|
|
|
1673
1778
|
const { schema: rawSchema, table: rawTable, column, operators } = group;
|
|
1674
1779
|
const schema = PgIdentifier.fromString(rawSchema);
|
|
1675
1780
|
const table = PgIdentifier.fromString(rawTable);
|
|
1676
|
-
const opclass = operators.some((op) => op
|
|
1781
|
+
const opclass = operators.some((op) => op !== "@>") ? void 0 : "jsonb_path_ops";
|
|
1677
1782
|
if (this.ginIndexAlreadyExists(table.toString(), column)) continue;
|
|
1678
1783
|
const indexName = this.indexName();
|
|
1679
1784
|
const candidate = {
|
|
@@ -1723,6 +1828,28 @@ var IndexOptimizer = class IndexOptimizer {
|
|
|
1723
1828
|
indexMethod: "gist"
|
|
1724
1829
|
});
|
|
1725
1830
|
}
|
|
1831
|
+
const seenExpressions = /* @__PURE__ */ new Set();
|
|
1832
|
+
for (const candidate of expressionCandidates) {
|
|
1833
|
+
const expression = candidate.jsonbExtraction;
|
|
1834
|
+
const key = `${candidate.schema}.${candidate.table}.${expression}`;
|
|
1835
|
+
if (seenExpressions.has(key)) continue;
|
|
1836
|
+
seenExpressions.add(key);
|
|
1837
|
+
const schema = PgIdentifier.fromString(candidate.schema);
|
|
1838
|
+
const table = PgIdentifier.fromString(candidate.table);
|
|
1839
|
+
const indexName = this.indexName();
|
|
1840
|
+
const definition = this.toExpressionDefinition({
|
|
1841
|
+
table,
|
|
1842
|
+
schema,
|
|
1843
|
+
expression
|
|
1844
|
+
});
|
|
1845
|
+
nextStage.push({
|
|
1846
|
+
name: indexName,
|
|
1847
|
+
schema: schema.toString(),
|
|
1848
|
+
table: table.toString(),
|
|
1849
|
+
columns: [candidate],
|
|
1850
|
+
definition
|
|
1851
|
+
});
|
|
1852
|
+
}
|
|
1726
1853
|
return nextStage;
|
|
1727
1854
|
}
|
|
1728
1855
|
toDefinition({ schema, table, columns }) {
|
|
@@ -1759,6 +1886,12 @@ var IndexOptimizer = class IndexOptimizer {
|
|
|
1759
1886
|
else fullyQualifiedTable = PgIdentifier.fromParts(schema, table);
|
|
1760
1887
|
return `${fullyQualifiedTable} using gist (${column})`;
|
|
1761
1888
|
}
|
|
1889
|
+
toExpressionDefinition({ schema, table, expression }) {
|
|
1890
|
+
let fullyQualifiedTable;
|
|
1891
|
+
if (schema.toString() === "public") fullyQualifiedTable = table;
|
|
1892
|
+
else fullyQualifiedTable = PgIdentifier.fromParts(schema, table);
|
|
1893
|
+
return `${fullyQualifiedTable}((${expression}))`;
|
|
1894
|
+
}
|
|
1762
1895
|
groupGinCandidatesByColumn(candidates) {
|
|
1763
1896
|
const groups = /* @__PURE__ */ new Map();
|
|
1764
1897
|
for (const c of candidates) {
|