From f9db129f6928dc5a9e882efc9d6720898897d286 Mon Sep 17 00:00:00 2001 From: Alexander Polyankin <alexander.polyankin@metabase.com> Date: Thu, 13 Oct 2022 14:26:03 +0300 Subject: [PATCH] Remove metabase-lib dependency on metabase/lib/engine (#25904) --- .../metabase-lib/lib/queries/NativeQuery.ts | 27 +++---------------- frontend/src/metabase/lib/engine.js | 8 +++--- frontend/src/metabase/lib/engine.unit.spec.ts | 11 ++++++++ .../components/NativeQueryEditor.jsx | 3 ++- .../DataSourceSelectors.jsx | 3 ++- .../lib/queries/NativeQuery.unit.spec.js | 8 ------ 6 files changed, 23 insertions(+), 37 deletions(-) create mode 100644 frontend/src/metabase/lib/engine.unit.spec.ts diff --git a/frontend/src/metabase-lib/lib/queries/NativeQuery.ts b/frontend/src/metabase-lib/lib/queries/NativeQuery.ts index 2c8c84dc97b..5c21a1ee4aa 100644 --- a/frontend/src/metabase-lib/lib/queries/NativeQuery.ts +++ b/frontend/src/metabase-lib/lib/queries/NativeQuery.ts @@ -1,17 +1,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-nocheck import { t } from "ttag"; -import { chain, assoc, getIn, assocIn, updateIn } from "icepick"; +import { assoc, assocIn, chain, getIn, updateIn } from "icepick"; import _ from "underscore"; import slugg from "slugg"; import { countLines } from "metabase/lib/string"; import { humanize } from "metabase/lib/formatting"; import Utils from "metabase/lib/utils"; -import { - getEngineNativeAceMode, - getEngineNativeType, - getEngineNativeRequiresTable, -} from "metabase/lib/engine"; import { Card, DatasetQuery, @@ -19,8 +14,8 @@ import { } from "metabase-types/types/Card"; import { DependentMetadataItem, - TemplateTags, TemplateTag, + TemplateTags, } from "metabase-types/types/Query"; import { DatabaseEngine, DatabaseId } from "metabase-types/types/Database"; import Question from "metabase-lib/lib/Question"; @@ -31,7 +26,7 @@ import Variable from "metabase-lib/lib/variables/Variable"; import TemplateTagVariable from "metabase-lib/lib/variables/TemplateTagVariable"; import { createTemplateTag } from "metabase-lib/lib/queries/TemplateTag"; import ValidationError from "metabase-lib/lib/ValidationError"; -import Dimension, { TemplateTagDimension, FieldDimension } from "../Dimension"; +import Dimension, { FieldDimension, TemplateTagDimension } from "../Dimension"; import DimensionOptions from "../DimensionOptions"; import { getNativeQueryTable } from "./utils/native-query-table"; @@ -334,25 +329,11 @@ export default class NativeQuery extends AtomicQuery { return queryText ? countLines(queryText) : 0; } - /** - * The ACE Editor mode name, e.g. 'ace/mode/json' - */ - aceMode(): string { - return getEngineNativeAceMode(this.engine()); - } - - /** - * Name used to describe the text written in that mode, e.g. 'JSON'. Used to fill in the blank in 'This question is written in _______'. - */ - nativeQueryLanguage() { - return getEngineNativeType(this.engine()).toUpperCase(); - } - /** * Whether the DB selector should be a DB + Table selector. Mongo needs both DB + Table. */ requiresTable() { - return getEngineNativeRequiresTable(this.engine()); + return this.engine() === "mongo"; } templateTagsMap(): TemplateTags { diff --git a/frontend/src/metabase/lib/engine.js b/frontend/src/metabase/lib/engine.js index 03ada35edd4..2f8eeadccf9 100644 --- a/frontend/src/metabase/lib/engine.js +++ b/frontend/src/metabase/lib/engine.js @@ -17,6 +17,10 @@ export function getEngineNativeType(engine) { } } +export function getNativeQueryLanguage(engine) { + return getEngineNativeType(engine).toUpperCase(); +} + export function getEngineNativeAceMode(engine) { switch (engine) { case "mongo": @@ -74,10 +78,6 @@ export function getElevatedEngines() { ]; } -export function getEngineNativeRequiresTable(engine) { - return engine === "mongo"; -} - export function getEngineSupportsFirewall(engine) { return engine !== "googleanalytics"; } diff --git a/frontend/src/metabase/lib/engine.unit.spec.ts b/frontend/src/metabase/lib/engine.unit.spec.ts new file mode 100644 index 00000000000..5fc1e700bd3 --- /dev/null +++ b/frontend/src/metabase/lib/engine.unit.spec.ts @@ -0,0 +1,11 @@ +import { getEngineNativeAceMode } from "metabase/lib/engine"; + +describe("getEngineNativeAceMode", () => { + it("should be SQL mode for H2", () => { + expect(getEngineNativeAceMode("h2")).toBe("ace/mode/sql"); + }); + + it("should be JSON for MongoDB", () => { + expect(getEngineNativeAceMode("mongo")).toBe("ace/mode/json"); + }); +}); diff --git a/frontend/src/metabase/query_builder/components/NativeQueryEditor.jsx b/frontend/src/metabase/query_builder/components/NativeQueryEditor.jsx index db4fabcd751..2aec5e06d15 100644 --- a/frontend/src/metabase/query_builder/components/NativeQueryEditor.jsx +++ b/frontend/src/metabase/query_builder/components/NativeQueryEditor.jsx @@ -23,6 +23,7 @@ import { connect } from "react-redux"; import slugg from "slugg"; import { isEventOverElement } from "metabase/lib/dom"; +import { getEngineNativeAceMode } from "metabase/lib/engine"; import { SQLBehaviour } from "metabase/lib/ace/sql_behaviour"; import ExplicitSize from "metabase/components/ExplicitSize"; @@ -142,7 +143,7 @@ class NativeQueryEditor extends Component { editorElement.classList.add("read-only"); } - const aceMode = query.aceMode(); + const aceMode = getEngineNativeAceMode(query.engine()); const session = this._editor.getSession(); if (session.$modeId !== aceMode) { diff --git a/frontend/src/metabase/query_builder/components/NativeQueryEditor/DataSourceSelectors/DataSourceSelectors.jsx b/frontend/src/metabase/query_builder/components/NativeQueryEditor/DataSourceSelectors/DataSourceSelectors.jsx index 2f5d989deba..8ae2fb90923 100644 --- a/frontend/src/metabase/query_builder/components/NativeQueryEditor/DataSourceSelectors/DataSourceSelectors.jsx +++ b/frontend/src/metabase/query_builder/components/NativeQueryEditor/DataSourceSelectors/DataSourceSelectors.jsx @@ -6,6 +6,7 @@ import { DatabaseDataSelector, SchemaAndTableDataSelector, } from "metabase/query_builder/components/DataSelector"; +import { getNativeQueryLanguage } from "metabase/lib/engine"; const DataSourceSelectorsPropTypes = { isNativeEditorOpen: PropTypes.bool.isRequired, @@ -178,7 +179,7 @@ TableSelector.propTypes = TableSelectorPropTypes; const Placeholder = ({ query }) => ( <div className="ml2 p2 text-medium"> - {t`This question is written in ${query.nativeQueryLanguage()}.`} + {t`This question is written in ${getNativeQueryLanguage(query.engine())}.`} </div> ); diff --git a/frontend/test/metabase-lib/lib/queries/NativeQuery.unit.spec.js b/frontend/test/metabase-lib/lib/queries/NativeQuery.unit.spec.js index 743efa8ca5a..f9c386aec74 100644 --- a/frontend/test/metabase-lib/lib/queries/NativeQuery.unit.spec.js +++ b/frontend/test/metabase-lib/lib/queries/NativeQuery.unit.spec.js @@ -78,14 +78,6 @@ describe("NativeQuery", () => { expect(makeMongoQuery("").supportsNativeParameters()).toBe(false); }); }); - describe("aceMode()", () => { - it("Mongo gets JSON mode ", () => { - expect(makeMongoQuery("").aceMode()).toBe("ace/mode/json"); - }); - it("H2 gets generic SQL mode in the editor", () => { - expect(query.aceMode()).toBe("ace/mode/sql"); - }); - }); }); describe("Queries have some helpful status checks", () => { -- GitLab