You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@druid.apache.org by vo...@apache.org on 2022/09/13 01:50:41 UTC
[druid] branch master updated: Web console: better detection for arrays containing objects (#13077)
This is an automated email from the ASF dual-hosted git repository.
vogievetsky pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git
The following commit(s) were added to refs/heads/master by this push:
new 08d6aca528 Web console: better detection for arrays containing objects (#13077)
08d6aca528 is described below
commit 08d6aca52865ab7bcbf75e16c4ca153bd3ca06f3
Author: Vadim Ogievetsky <va...@ogievetsky.com>
AuthorDate: Mon Sep 12 18:50:29 2022 -0700
Web console: better detection for arrays containing objects (#13077)
* better detection for arrays containing objects
* include boolean also
---
.../table-cell/__snapshots__/table-cell.spec.tsx.snap | 8 ++++++++
web-console/src/components/table-cell/table-cell.spec.tsx | 7 +++++++
web-console/src/components/table-cell/table-cell.tsx | 3 ++-
.../src/druid-models/ingestion-spec/ingestion-spec.spec.ts | 9 +++++++++
web-console/src/druid-models/ingestion-spec/ingestion-spec.tsx | 5 +++--
web-console/src/utils/general.tsx | 10 ++++++++++
6 files changed, 39 insertions(+), 3 deletions(-)
diff --git a/web-console/src/components/table-cell/__snapshots__/table-cell.spec.tsx.snap b/web-console/src/components/table-cell/__snapshots__/table-cell.spec.tsx.snap
index c019c38fa2..5ed0f31589 100644
--- a/web-console/src/components/table-cell/__snapshots__/table-cell.spec.tsx.snap
+++ b/web-console/src/components/table-cell/__snapshots__/table-cell.spec.tsx.snap
@@ -49,6 +49,14 @@ exports[`TableCell matches snapshot array long 1`] = `
</div>
`;
+exports[`TableCell matches snapshot array mixed 1`] = `
+<div
+ class="table-cell plain"
+>
+ ["a",{"v":"b"},"c"]
+</div>
+`;
+
exports[`TableCell matches snapshot array short 1`] = `
<div
class="table-cell plain"
diff --git a/web-console/src/components/table-cell/table-cell.spec.tsx b/web-console/src/components/table-cell/table-cell.spec.tsx
index bd9681bd94..74648dccb0 100644
--- a/web-console/src/components/table-cell/table-cell.spec.tsx
+++ b/web-console/src/components/table-cell/table-cell.spec.tsx
@@ -64,6 +64,13 @@ describe('TableCell', () => {
expect(container.firstChild).toMatchSnapshot();
});
+ it('matches snapshot array mixed', () => {
+ const tableCell = <TableCell value={['a', { v: 'b' }, 'c']} />;
+
+ const { container } = render(tableCell);
+ expect(container.firstChild).toMatchSnapshot();
+ });
+
it('matches snapshot object', () => {
const tableCell = <TableCell value={{ hello: 'world' }} />;
diff --git a/web-console/src/components/table-cell/table-cell.tsx b/web-console/src/components/table-cell/table-cell.tsx
index 3895a805a7..78f080b306 100644
--- a/web-console/src/components/table-cell/table-cell.tsx
+++ b/web-console/src/components/table-cell/table-cell.tsx
@@ -21,6 +21,7 @@ import * as JSONBig from 'json-bigint-native';
import React, { useState } from 'react';
import { ShowValueDialog } from '../../dialogs/show-value-dialog/show-value-dialog';
+import { isSimpleArray } from '../../utils';
import { ActionIcon } from '../action-icon/action-icon';
import './table-cell.scss';
@@ -97,7 +98,7 @@ export const TableCell = React.memo(function TableCell(props: TableCellProps) {
{isNaN(dateValue) ? 'Unusable date' : value.toISOString()}
</div>
);
- } else if (Array.isArray(value)) {
+ } else if (isSimpleArray(value)) {
return renderTruncated(`[${value.join(', ')}]`);
} else if (typeof value === 'object') {
return renderTruncated(JSONBig.stringify(value));
diff --git a/web-console/src/druid-models/ingestion-spec/ingestion-spec.spec.ts b/web-console/src/druid-models/ingestion-spec/ingestion-spec.spec.ts
index a846d29a81..3f4be422c7 100644
--- a/web-console/src/druid-models/ingestion-spec/ingestion-spec.spec.ts
+++ b/web-console/src/druid-models/ingestion-spec/ingestion-spec.spec.ts
@@ -725,6 +725,15 @@ describe('spec utils', () => {
it('works for multi-value', () => {
expect(guessColumnTypeFromInput(['a', ['b'], 'c'], false)).toEqual('string');
expect(guessColumnTypeFromInput([1, [2], 3], false)).toEqual('string');
+ expect(guessColumnTypeFromInput([true, [true, 7, false], false, 'x'], false)).toEqual(
+ 'string',
+ );
+ });
+
+ it('works for complex arrays', () => {
+ expect(guessColumnTypeFromInput([{ type: 'Dogs' }, { type: 'JavaScript' }], false)).toEqual(
+ 'COMPLEX<json>',
+ );
});
it('works for strange json', () => {
diff --git a/web-console/src/druid-models/ingestion-spec/ingestion-spec.tsx b/web-console/src/druid-models/ingestion-spec/ingestion-spec.tsx
index d7bf509163..fe9b8074c1 100644
--- a/web-console/src/druid-models/ingestion-spec/ingestion-spec.tsx
+++ b/web-console/src/druid-models/ingestion-spec/ingestion-spec.tsx
@@ -32,6 +32,7 @@ import {
EMPTY_ARRAY,
EMPTY_OBJECT,
filterMap,
+ isSimpleArray,
oneOf,
parseCsvLine,
typeIs,
@@ -2330,7 +2331,7 @@ export function guessIsArrayFromHeaderAndRows(
headerAndRows: SampleHeaderAndRows,
column: string,
): boolean {
- return headerAndRows.rows.some(r => Array.isArray(r.input?.[column]));
+ return headerAndRows.rows.some(r => isSimpleArray(r.input?.[column]));
}
export function guessColumnTypeFromInput(
@@ -2343,7 +2344,7 @@ export function guessColumnTypeFromInput(
if (!definedValues.length) return 'string';
// If we see any arrays in the input this is a multi-value dimension that must be a string
- if (definedValues.some(v => Array.isArray(v))) return 'string';
+ if (definedValues.some(v => isSimpleArray(v))) return 'string';
// If we see any JSON objects in the input assume COMPLEX<json>
if (definedValues.some(v => v && typeof v === 'object')) return 'COMPLEX<json>';
diff --git a/web-console/src/utils/general.tsx b/web-console/src/utils/general.tsx
index 772e3c646f..5cf8ca0ce5 100644
--- a/web-console/src/utils/general.tsx
+++ b/web-console/src/utils/general.tsx
@@ -40,6 +40,16 @@ export function nonEmptyArray(a: any): a is unknown[] {
return Array.isArray(a) && Boolean(a.length);
}
+export function isSimpleArray(a: any): a is (string | number | boolean)[] {
+ return (
+ Array.isArray(a) &&
+ a.every(x => {
+ const t = typeof x;
+ return t === 'string' || t === 'number' || t === 'boolean';
+ })
+ );
+}
+
export function wait(ms: number): Promise<void> {
return new Promise(resolve => {
setTimeout(resolve, ms);
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@druid.apache.org
For additional commands, e-mail: commits-help@druid.apache.org