瀏覽代碼

[editor] Combine local and api risk analysis

Johan Ahlen 4 年之前
父節點
當前提交
d39e01803c

+ 30 - 17
desktop/core/src/desktop/js/catalog/optimizer/SqlAnalyzer.ts

@@ -26,6 +26,7 @@ import {
   Optimizer,
   OptimizerRisk,
   PopularityOptions,
+  RiskHint,
   RiskOptions,
   SimilarityOptions
 } from 'catalog/optimizer/optimizer';
@@ -46,38 +47,50 @@ export default class SqlAnalyzer implements Optimizer {
   }
 
   analyzeRisk(options: RiskOptions): CancellablePromise<OptimizerRisk> {
-    const snippet = JSON.parse(options.snippetJson);
-
-    return new CancellablePromise<OptimizerRisk>(async (resolve, reject) => {
+    return new CancellablePromise<OptimizerRisk>(async (resolve, reject, onCancel) => {
       if (!this.connector.dialect) {
         reject();
         return;
       }
-      const autocompleter = await sqlParserRepository.getAutocompleteParser(this.connector.dialect);
 
+      const apiPromise = this.apiStrategy.analyzeRisk({ ...options, silenceErrors: true });
+
+      onCancel(() => {
+        apiPromise.cancel();
+      });
+
+      const autocompleter = await sqlParserRepository.getAutocompleteParser(this.connector.dialect);
+      const snippet = JSON.parse(options.snippetJson);
       const sqlParseResult = autocompleter.parseSql(snippet.statement + ' ', '');
 
       const hasLimit = sqlParseResult.locations.some(
         location => location.type === 'limitClause' && !location.missing
       );
 
+      const hints: RiskHint[] = !hasLimit
+        ? [
+            {
+              riskTables: [],
+              riskAnalysis: I18n('Query has no limit'),
+              riskId: 22, // To change
+              risk: 'low',
+              riskRecommendation: I18n('Append a limit clause to reduce the size of the result set')
+            }
+          ]
+        : [];
+
+      try {
+        const apiResponse = await apiPromise;
+        if (apiResponse.query_complexity && apiResponse.query_complexity.hints) {
+          hints.push(...apiResponse.query_complexity.hints);
+        }
+      } catch (err) {}
+
       resolve({
         status: 0,
         message: '',
         query_complexity: {
-          hints: !hasLimit
-            ? [
-                {
-                  riskTables: [],
-                  riskAnalysis: I18n('Query has no limit'),
-                  riskId: 22, // To change
-                  risk: 'low',
-                  riskRecommendation: I18n(
-                    'Append a limit clause to reduce the size of the result set'
-                  )
-                }
-              ]
-            : [],
+          hints,
           noStats: true,
           noDDL: false
         }

+ 9 - 7
desktop/core/src/desktop/js/catalog/optimizer/optimizer.ts

@@ -37,17 +37,19 @@ export interface RiskOptions {
   silenceErrors?: boolean;
 }
 
+export interface RiskHint {
+  riskTables: unknown[];
+  riskAnalysis: string;
+  riskId: number;
+  risk: string;
+  riskRecommendation: string;
+}
+
 export interface OptimizerRisk {
   status: number;
   message: string;
   query_complexity: {
-    hints: {
-      riskTables: unknown[];
-      riskAnalysis: string;
-      riskId: number;
-      risk: string;
-      riskRecommendation: string;
-    }[];
+    hints: RiskHint[];
     noStats: boolean;
     noDDL: boolean;
   };