From a877ee3aa6acb425607893e53b9fbf91f203d2ba Mon Sep 17 00:00:00 2001 From: Vadim Ogievetsky Date: Wed, 31 Jan 2024 20:19:29 -0800 Subject: [PATCH] Web console: use arrayIngestMode: array (#15588) * Adapt to new array mode * Feedback fixes * fixing type detection and highlighting * goodies * add docs * feedback fixes * finish array work * update snapshots * typo fix * color fixes * small fix * make MVDs default for now * better sqlStringifyArrays default * fix spec converter * fix tests --- licenses.yaml | 2 +- web-console/assets/delta.png | Bin 6527 -> 26090 bytes web-console/package-lock.json | 14 +- web-console/package.json | 2 +- web-console/script/create-sql-docs.js | 12 +- .../src/blueprint-overrides/_index.scss | 1 + .../_special-switch-modes.scss | 39 +++ .../array-mode-swtich.spec.tsx.snap | 47 +++ .../array-mode-switch/array-mode-switch.tsx | 62 ++++ .../array-mode-swtich.spec.tsx | 31 ++ web-console/src/components/index.ts | 1 + .../warning-checklist.spec.tsx.snap | 6 +- .../warning-checklist/warning-checklist.tsx | 2 +- .../dimension-spec/dimension-spec.ts | 128 ++++++- .../external-config/external-config.ts | 10 +- .../ingest-query-pattern.spec.ts | 139 +++++++- .../ingest-query-pattern.ts | 23 +- .../ingestion-spec/ingestion-spec.spec.ts | 311 +++++++++++++++--- .../ingestion-spec/ingestion-spec.tsx | 171 ++++++++-- .../druid-models/metric-spec/metric-spec.tsx | 4 +- .../query-context/query-context.tsx | 1 + web-console/src/druid-models/stages/stages.ts | 2 +- .../timestamp-spec/timestamp-spec.tsx | 2 +- .../workbench-query/workbench-query.spec.ts | 5 + .../workbench-query/workbench-query.ts | 13 +- .../spec-conversion.spec.ts.snap | 23 ++ .../src/helpers/spec-conversion.spec.ts | 79 +++++ web-console/src/helpers/spec-conversion.ts | 148 +++++---- web-console/src/utils/index.tsx | 1 + web-console/src/utils/null-mode-detection.ts | 154 +++++++++ web-console/src/utils/object-change.ts | 8 +- web-console/src/utils/sample-query.tsx | 30 +- .../__snapshots__/home-view.spec.tsx.snap | 36 +- web-console/src/views/home-view/home-view.tsx | 2 +- .../status-card/status-card.spec.tsx | 4 +- .../home-view/status-card/status-card.tsx | 48 ++- .../views/load-data-view/load-data-view.tsx | 116 +++++-- .../schema-table/schema-table.scss | 28 +- .../schema-table/schema-table.tsx | 14 +- .../column-editor/column-editor.tsx | 270 ++++++++++----- .../preview-table/preview-table.scss | 16 + .../preview-table/preview-table.tsx | 19 +- .../schema-step/schema-step.tsx | 26 +- .../sql-data-loader-view.tsx | 19 +- .../connect-external-data-dialog.tsx | 8 +- .../input-format-step/input-format-step.tsx | 15 +- .../views/workbench-view/workbench-view.tsx | 9 +- 47 files changed, 1731 insertions(+), 370 deletions(-) create mode 100644 web-console/src/blueprint-overrides/_special-switch-modes.scss create mode 100644 web-console/src/components/array-mode-switch/__snapshots__/array-mode-swtich.spec.tsx.snap create mode 100644 web-console/src/components/array-mode-switch/array-mode-switch.tsx create mode 100644 web-console/src/components/array-mode-switch/array-mode-swtich.spec.tsx create mode 100644 web-console/src/utils/null-mode-detection.ts diff --git a/licenses.yaml b/licenses.yaml index e48dcf1fb8fc..940e7cf2a49e 100644 --- a/licenses.yaml +++ b/licenses.yaml @@ -5056,7 +5056,7 @@ license_category: binary module: web-console license_name: Apache License version 2.0 copyright: Imply Data -version: 0.21.4 +version: 0.21.9 --- diff --git a/web-console/assets/delta.png b/web-console/assets/delta.png index db535506c7b9b89863ae59a33ef0404ca6dad11e..1dc3c072dad0e454139610c7ca185b4400ab5515 100644 GIT binary patch literal 26090 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%0D$jjj+#zBysR%!q(}A6 zk5nU^jX9`CgJ%AbdwI_>#Rt$uScCPq<~ArcyabtAVg&L|G}HEwdv-VST!i=!w3r;v(U57&rTj3?1{f5$r1 zL9I5H2TJ*2&G@F_u$YB=D1~_TdA=WRT1zgF%m5~Qej|%3>ovIVlfU14?N4yL#SUo7 z*dF%ScH_yY*=Kb6!igQzb7(M&xEum|v?A9Z^7DZ6dG{^TOg^nlvRBdP#7jq{){%tk z26M>XQjEZOPfkR9-6m`{!0TuWEpHYFLIA4t&YrQ={FL|TquN5`DOM=#~hfK3OR;aDF~gD@hQI1Xx!Gv+4MLXMzS-c!x-WLzo42 z7>0`$R{u1n*=@^v+maFfg|9{?mfTPPUmX|~7YcXokjzBoP21rQ@{vG1DO68$EACie zZ-mLi9Q%3y)22JYQ$gQOTNj?uF@X^YZ?bSL+|+N-<*ME@iU`K3ZeL+wk5UkJ?Vm%Pv;!HmE6c zlGhT50$}eJ*oV=0e_{Go*WT@^Z2n_bh9_g9!^vG_EN~U1*G7~g_#q~sr@hzqbBUQ zK=qJ2?O}|HjS}JjWr~wape`Z%n(Ytx;8=hT{LH{CjYqB;ZQoQ0vYq_|pKnmY3UvD~ z`{ulw1z(KJ)HZvpe4x!DAkI)TgG1ONj+hDqzb+bI>l;(BJJsP2>Y?B9SLZsm1y3RH zcjLYQ!=Q4#5ZU)(tf`Vb_4w`Px!x8CtswHz_2G(xr=4GF;0`o4K!xoC^4AI`e>{lp zHLVM<6H(lA^8D{v*_I$1r1~Uuc2sFt$Dc%O=Nr`A`ztDhS~07(ZNU0dZT@)baX+a6 z4fycx9zg1obZ3m-e#jZz`|{FqI3b~S1|5W7*MHC2hzYx-T1B!VoKu7Xp6z9|6C}YH>P!)JPz13M-nnF%H$BhMJ*$NA0SDv%r01KL$Bb!DBD2f zfxq(zcCCj|n4e2+aP2>|Ee zHt!7@D>5jZ2^2dgL0wx+ICwAd1CdZ@(k#kQG#sf9;KN)-9=Xz28Iu+f{A< z121~x#t%lGl8pyauk2pc)DVeqvU_s@KDIKL&L2fE)5~iu9zE4}6#xJXLwuo9f1H-M zbrGL%Rvg>dj{Z-|ZZB*b9=`l?vdrEr`ETbzfUklwkd4=ZwYv^i8{id5f;mbI`}$NJ zndWV>ST5rzYU{-<(wJ`{%(33Xm(*dh1zD;tSIngi z%7-MS&ETcM9gm@1OLN<34kRtf=Yh0XH*0W%5WZ;de@dwT$v|HWjZFC$6aRA_KM3Lj n~O%%!kut|jHtMX62)vuRjGNkqq#l`b1YYbuv? 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 diff --git a/web-console/package-lock.json b/web-console/package-lock.json index b43bed228017..0424bc138dea 100644 --- a/web-console/package-lock.json +++ b/web-console/package-lock.json @@ -14,7 +14,7 @@ "@blueprintjs/datetime2": "^0.9.35", "@blueprintjs/icons": "^4.16.0", "@blueprintjs/popover2": "^1.14.9", - "@druid-toolkit/query": "^0.21.4", + "@druid-toolkit/query": "^0.21.9", "@druid-toolkit/visuals-core": "^0.3.3", "@druid-toolkit/visuals-react": "^0.3.3", "ace-builds": "~1.4.14", @@ -1074,9 +1074,9 @@ } }, "node_modules/@druid-toolkit/query": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@druid-toolkit/query/-/query-0.21.4.tgz", - "integrity": "sha512-rZYRrtahy68ZMp3XDWa2Z3Pa28yiQMgDVHbB7ZAqynNFbKOgqS1j08LS122CRmNrvpAUyzwCnMj3Og4BvWeq1Q==", + "version": "0.21.9", + "resolved": "https://registry.npmjs.org/@druid-toolkit/query/-/query-0.21.9.tgz", + "integrity": "sha512-g8bs9cOqyrxPzf1qdvO4FAG0rv7aBR2le+OLbF/n/KC3YXq49CUifPUYIHVfVx/jwoXKrJd1w1jVLES8OusnTg==", "dependencies": { "tslib": "^2.5.2" } @@ -20702,9 +20702,9 @@ "dev": true }, "@druid-toolkit/query": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@druid-toolkit/query/-/query-0.21.4.tgz", - "integrity": "sha512-rZYRrtahy68ZMp3XDWa2Z3Pa28yiQMgDVHbB7ZAqynNFbKOgqS1j08LS122CRmNrvpAUyzwCnMj3Og4BvWeq1Q==", + "version": "0.21.9", + "resolved": "https://registry.npmjs.org/@druid-toolkit/query/-/query-0.21.9.tgz", + "integrity": "sha512-g8bs9cOqyrxPzf1qdvO4FAG0rv7aBR2le+OLbF/n/KC3YXq49CUifPUYIHVfVx/jwoXKrJd1w1jVLES8OusnTg==", "requires": { "tslib": "^2.5.2" } diff --git a/web-console/package.json b/web-console/package.json index 230b4d8dc9f0..f885fff75017 100644 --- a/web-console/package.json +++ b/web-console/package.json @@ -68,7 +68,7 @@ "@blueprintjs/datetime2": "^0.9.35", "@blueprintjs/icons": "^4.16.0", "@blueprintjs/popover2": "^1.14.9", - "@druid-toolkit/query": "^0.21.4", + "@druid-toolkit/query": "^0.21.9", "@druid-toolkit/visuals-core": "^0.3.3", "@druid-toolkit/visuals-react": "^0.3.3", "ace-builds": "~1.4.14", diff --git a/web-console/script/create-sql-docs.js b/web-console/script/create-sql-docs.js index 794afb06e556..82328fd74b57 100755 --- a/web-console/script/create-sql-docs.js +++ b/web-console/script/create-sql-docs.js @@ -29,7 +29,15 @@ const MINIMUM_EXPECTED_NUMBER_OF_DATA_TYPES = 14; const initialFunctionDocs = { TABLE: [['external', convertMarkdownToHtml('Defines a logical table from an external.')]], EXTERN: [ - ['inputSource, inputFormat, rowSignature?', convertMarkdownToHtml('Reads external data')], + ['inputSource, inputFormat, rowSignature?', convertMarkdownToHtml('Reads external data.')], + ], + TYPE: [ + [ + 'nativeType', + convertMarkdownToHtml( + 'A purely type system modification function what wraps a Druid native type to make it into a SQL type.', + ), + ], ], }; @@ -70,7 +78,7 @@ const readDoc = async () => { await fs.readFile('../docs/querying/sql-array-functions.md', 'utf-8'), await fs.readFile('../docs/querying/sql-multivalue-string-functions.md', 'utf-8'), await fs.readFile('../docs/querying/sql-json-functions.md', 'utf-8'), - await fs.readFile('../docs/querying/sql-operators.md', 'utf-8') + await fs.readFile('../docs/querying/sql-operators.md', 'utf-8'), ].join('\n'); const lines = data.split('\n'); diff --git a/web-console/src/blueprint-overrides/_index.scss b/web-console/src/blueprint-overrides/_index.scss index faffe22bbb94..c345d815b80d 100644 --- a/web-console/src/blueprint-overrides/_index.scss +++ b/web-console/src/blueprint-overrides/_index.scss @@ -24,3 +24,4 @@ @import 'components/forms/common'; @import 'components/navbar/navbar'; @import 'components/card/card'; +@import 'special-switch-modes'; diff --git a/web-console/src/blueprint-overrides/_special-switch-modes.scss b/web-console/src/blueprint-overrides/_special-switch-modes.scss new file mode 100644 index 000000000000..267ac4a27260 --- /dev/null +++ b/web-console/src/blueprint-overrides/_special-switch-modes.scss @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +.bp4-dark .bp4-switch.bp4-control { + &.legacy-switch { + input:checked ~ .bp4-control-indicator { + background: $orange5; + } + + &:hover input:checked ~ .bp4-control-indicator { + background: $orange2; + } + } + + &.danger-switch { + input:checked ~ .bp4-control-indicator { + background: $red5; + } + + &:hover input:checked ~ .bp4-control-indicator { + background: $red2; + } + } +} diff --git a/web-console/src/components/array-mode-switch/__snapshots__/array-mode-swtich.spec.tsx.snap b/web-console/src/components/array-mode-switch/__snapshots__/array-mode-swtich.spec.tsx.snap new file mode 100644 index 000000000000..88d7564823a6 --- /dev/null +++ b/web-console/src/components/array-mode-switch/__snapshots__/array-mode-swtich.spec.tsx.snap @@ -0,0 +1,47 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ArrayModeSwitch matches snapshot 1`] = ` +
+
+ + + + +
+
+`; diff --git a/web-console/src/components/array-mode-switch/array-mode-switch.tsx b/web-console/src/components/array-mode-switch/array-mode-switch.tsx new file mode 100644 index 000000000000..4d9de1274b91 --- /dev/null +++ b/web-console/src/components/array-mode-switch/array-mode-switch.tsx @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Switch } from '@blueprintjs/core'; +import React from 'react'; + +import type { ArrayMode } from '../../druid-models'; +import { getLink } from '../../links'; +import { ExternalLink } from '../external-link/external-link'; +import { FormGroupWithInfo } from '../form-group-with-info/form-group-with-info'; +import { PopoverText } from '../popover-text/popover-text'; + +export interface ArrayModeSwitchProps { + arrayMode: ArrayMode; + changeArrayMode(newArrayMode: ArrayMode): void; +} + +export const ArrayModeSwitch = React.memo(function ArrayModeSwitch(props: ArrayModeSwitchProps) { + const { arrayMode, changeArrayMode } = props; + + return ( + +

+ Store arrays as multi-value string columns instead of arrays. Note that all detected + array elements will be coerced to strings if you choose this option, and data will + behave more like a string than an array at query time. See{' '} + array docs and{' '} + + mvd docs + {' '} + for more details about the differences between arrays and multi-value strings. +

+ + } + > + changeArrayMode(arrayMode === 'arrays' ? 'multi-values' : 'arrays')} + /> +
+ ); +}); diff --git a/web-console/src/components/array-mode-switch/array-mode-swtich.spec.tsx b/web-console/src/components/array-mode-switch/array-mode-swtich.spec.tsx new file mode 100644 index 000000000000..4e738c38842b --- /dev/null +++ b/web-console/src/components/array-mode-switch/array-mode-swtich.spec.tsx @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { render } from '@testing-library/react'; +import React from 'react'; + +import { ArrayModeSwitch } from './array-mode-switch'; + +describe('ArrayModeSwitch', () => { + it('matches snapshot', () => { + const arrayInput = {}} />; + + const { container } = render(arrayInput); + expect(container.firstChild).toMatchSnapshot(); + }); +}); diff --git a/web-console/src/components/index.ts b/web-console/src/components/index.ts index a84dc063f8d3..8e43f9ec94f1 100644 --- a/web-console/src/components/index.ts +++ b/web-console/src/components/index.ts @@ -19,6 +19,7 @@ export * from './action-cell/action-cell'; export * from './action-icon/action-icon'; export * from './array-input/array-input'; +export * from './array-mode-switch/array-mode-switch'; export * from './auto-form/auto-form'; export * from './braced-text/braced-text'; export * from './center-message/center-message'; diff --git a/web-console/src/components/warning-checklist/__snapshots__/warning-checklist.spec.tsx.snap b/web-console/src/components/warning-checklist/__snapshots__/warning-checklist.spec.tsx.snap index 4112eb45841c..f3228aac108d 100644 --- a/web-console/src/components/warning-checklist/__snapshots__/warning-checklist.spec.tsx.snap +++ b/web-console/src/components/warning-checklist/__snapshots__/warning-checklist.spec.tsx.snap @@ -5,7 +5,7 @@ exports[`WarningChecklist matches snapshot 1`] = ` class="warning-checklist" >