From 8d5fe94646233588b4461ed2ce3f0f36155c1fd3 Mon Sep 17 00:00:00 2001
From: Alison Goryachev
Date: Tue, 15 Sep 2020 15:48:00 -0400
Subject: [PATCH 1/5] add support for point field type
---
.../ignore_z_value_parameter.tsx | 14 ++--
.../fields/field_types/index.ts | 2 +
.../fields/field_types/point_type.tsx | 73 +++++++++++++++++++
.../constants/data_types_definition.tsx | 21 ++++++
.../constants/parameters_definition.tsx | 44 +++++++++++
.../mappings_editor/types/document_fields.ts | 2 +
6 files changed, 151 insertions(+), 5 deletions(-)
create mode 100644 x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/point_type.tsx
diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/ignore_z_value_parameter.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/ignore_z_value_parameter.tsx
index bd118ac08964fb..e3afd791c09c87 100644
--- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/ignore_z_value_parameter.tsx
+++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/ignore_z_value_parameter.tsx
@@ -10,15 +10,19 @@ import { i18n } from '@kbn/i18n';
import { EditFieldFormRow } from '../fields/edit_field';
-export const IgnoreZValueParameter = () => (
+export const IgnoreZValueParameter = ({ description }: { description?: string }) => (
);
diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/index.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/index.ts
index d84d9c6ea40cfd..5dca29a02042ee 100644
--- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/index.ts
+++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/index.ts
@@ -30,6 +30,7 @@ import { NestedType } from './nested_type';
import { JoinType } from './join_type';
import { RankFeatureType } from './rank_feature_type';
import { WildcardType } from './wildcard_type';
+import { PointType } from './point_type';
const typeToParametersFormMap: { [key in DataType]?: ComponentType } = {
alias: AliasType,
@@ -56,6 +57,7 @@ const typeToParametersFormMap: { [key in DataType]?: ComponentType } = {
join: JoinType,
rank_feature: RankFeatureType,
wildcard: WildcardType,
+ point: PointType,
};
export const getParametersFormForType = (
diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/point_type.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/point_type.tsx
new file mode 100644
index 00000000000000..ae7bfe0fcec6a5
--- /dev/null
+++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/point_type.tsx
@@ -0,0 +1,73 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+import React, { FunctionComponent } from 'react';
+
+import { i18n } from '@kbn/i18n';
+
+import { NormalizedField, Field as FieldType, ParameterName } from '../../../../types';
+import { UseField, TextAreaField } from '../../../../shared_imports';
+import { getFieldConfig } from '../../../../lib';
+import {
+ IgnoreMalformedParameter,
+ IgnoreZValueParameter,
+ NullValueParameter,
+} from '../../field_parameters';
+import { AdvancedParametersSection, BasicParametersSection } from '../edit_field';
+
+interface Props {
+ field: NormalizedField;
+}
+
+const getDefaultToggleValue = (param: ParameterName, field: FieldType) => {
+ return field[param] !== undefined && field[param] !== getFieldConfig(param).defaultValue;
+};
+
+export const PointType: FunctionComponent = ({ field }) => {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+};
diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/data_types_definition.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/data_types_definition.tsx
index a8844c7a9b2709..3a19381c60a83e 100644
--- a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/data_types_definition.tsx
+++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/data_types_definition.tsx
@@ -784,6 +784,26 @@ export const TYPE_DEFINITION: { [key in DataType]: DataTypeDefinition } = {
),
},
+ point: {
+ label: i18n.translate('xpack.idxMgmt.mappingsEditor.dataType.pointDescription', {
+ defaultMessage: 'Point',
+ }),
+ value: 'point',
+ documentation: {
+ main: '/point.html',
+ },
+ description: () => (
+
+ {'x,y'},
+ }}
+ />
+
+ ),
+ },
wildcard: {
label: i18n.translate('xpack.idxMgmt.mappingsEditor.dataType.wildcardDescription', {
defaultMessage: 'Wildcard',
@@ -843,6 +863,7 @@ export const MAIN_TYPES: MainType[] = [
'text',
'token_count',
'wildcard',
+ 'point',
'other',
];
diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx
index f2148f1f657a68..6922fc5fdd756d 100644
--- a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx
+++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx
@@ -382,6 +382,50 @@ export const PARAMETERS_DEFINITION: { [key in ParameterName]: ParameterDefinitio
},
schema: t.any,
},
+ null_value_point: {
+ fieldConfig: {
+ defaultValue: '',
+ label: nullValueLabel,
+ helpText: () => (
+
+ {i18n.translate(
+ 'xpack.idxMgmt.mappingsEditor.parameters.pointWellKnownTextDocumentationLink',
+ {
+ defaultMessage: 'Well-Known Text',
+ }
+ )}
+
+ ),
+ }}
+ />
+ ),
+ validations: [
+ {
+ validator: nullValueValidateEmptyField,
+ },
+ ],
+ deserializer: (value: any) => {
+ if (value === '') {
+ return value;
+ }
+ return JSON.stringify(value);
+ },
+ serializer: (value: string) => {
+ try {
+ return JSON.parse(value);
+ } catch (error) {
+ // swallow error and return non-parsed value;
+ return value;
+ }
+ },
+ },
+ schema: t.any,
+ },
copy_to: {
fieldConfig: {
defaultValue: '',
diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts
index fd0e4ed32bfe82..5653879df80a61 100644
--- a/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts
+++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts
@@ -59,6 +59,7 @@ export type MainType =
| 'geo_point'
| 'geo_shape'
| 'token_count'
+ | 'point'
| 'wildcard'
/**
* 'other' is a special type that only exists inside of MappingsEditor as a placeholder
@@ -107,6 +108,7 @@ export type ParameterName =
| 'null_value_boolean'
| 'null_value_geo_point'
| 'null_value_ip'
+ | 'null_value_point'
| 'copy_to'
| 'dynamic'
| 'dynamic_toggle'
From 8cf72c8469205eebde1674c7f60c4346037e0742 Mon Sep 17 00:00:00 2001
From: Alison Goryachev
Date: Thu, 17 Sep 2020 15:12:28 -0400
Subject: [PATCH 2/5] add support for meta parameter
---
.../document_fields/fields/field_types/point_type.tsx | 3 +++
1 file changed, 3 insertions(+)
diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/point_type.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/point_type.tsx
index ae7bfe0fcec6a5..9108c56e4496b7 100644
--- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/point_type.tsx
+++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/point_type.tsx
@@ -14,6 +14,7 @@ import {
IgnoreMalformedParameter,
IgnoreZValueParameter,
NullValueParameter,
+ MetaParameter,
} from '../../field_parameters';
import { AdvancedParametersSection, BasicParametersSection } from '../edit_field';
@@ -67,6 +68,8 @@ export const PointType: FunctionComponent = ({ field }) => {
config={getFieldConfig('null_value_point')}
/>
+
+
>
);
From b7ab8e830b55168a12bbfa8293a6ee4196841f93 Mon Sep 17 00:00:00 2001
From: Alison Goryachev
Date: Sat, 19 Sep 2020 21:14:26 -0400
Subject: [PATCH 3/5] address review feedback
---
.../field_parameters/ignore_z_value_parameter.tsx | 11 +++++------
.../constants/parameters_definition.tsx | 15 ++++++++++-----
2 files changed, 15 insertions(+), 11 deletions(-)
diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/ignore_z_value_parameter.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/ignore_z_value_parameter.tsx
index e3afd791c09c87..ce58a264db968c 100644
--- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/ignore_z_value_parameter.tsx
+++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/ignore_z_value_parameter.tsx
@@ -16,12 +16,11 @@ export const IgnoreZValueParameter = ({ description }: { description?: string })
defaultMessage: 'Ignore Z value',
})}
description={
- description
- ? description
- : i18n.translate('xpack.idxMgmt.mappingsEditor.ignoredZValueFieldDescription', {
- defaultMessage:
- 'Three dimension points will be accepted, but only latitude and longitude values will be indexed; the third dimension is ignored.',
- })
+ description ||
+ i18n.translate('xpack.idxMgmt.mappingsEditor.ignoredZValueFieldDescription', {
+ defaultMessage:
+ 'Three dimension points will be accepted, but only latitude and longitude values will be indexed; the third dimension is ignored.',
+ })
}
formFieldPath="ignore_z_value"
/>
diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx
index 534b3bb3f5b353..a88dac8fa45904 100644
--- a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx
+++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx
@@ -520,12 +520,17 @@ export const PARAMETERS_DEFINITION: { [key in ParameterName]: ParameterDefinitio
return JSON.stringify(value, null, 2);
},
serializer: (value: string) => {
- const parsed = JSON.parse(value);
- // If an empty object was passed, strip out this value entirely.
- if (!Object.keys(parsed).length) {
- return undefined;
+ try {
+ const parsed = JSON.parse(value);
+ // If an empty object was passed, strip out this value entirely.
+ if (!Object.keys(parsed).length) {
+ return undefined;
+ }
+ return parsed;
+ } catch (error) {
+ // swallow error and return non-parsed value;
+ return value;
}
- return parsed;
},
},
schema: t.any,
From 569eb8a20bca4b5d156de78f0aabd7a268c9fec8 Mon Sep 17 00:00:00 2001
From: Alison Goryachev
Date: Mon, 21 Sep 2020 09:10:31 -0400
Subject: [PATCH 4/5] fix bug with meta parameter
---
.../mappings_editor/constants/parameters_definition.tsx | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx
index a88dac8fa45904..4ffedc8ca114d9 100644
--- a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx
+++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx
@@ -520,6 +520,11 @@ export const PARAMETERS_DEFINITION: { [key in ParameterName]: ParameterDefinitio
return JSON.stringify(value, null, 2);
},
serializer: (value: string) => {
+ // Strip out empty strings
+ if (value.trim() === '') {
+ return undefined;
+ }
+
try {
const parsed = JSON.parse(value);
// If an empty object was passed, strip out this value entirely.
From 5dd47fc64c9dae86cb41a67a2d49b4ad0942bf7e Mon Sep 17 00:00:00 2001
From: Alison Goryachev
Date: Mon, 21 Sep 2020 16:36:58 -0400
Subject: [PATCH 5/5] add tests for point field type
---
.../datatypes/point_datatype.test.tsx | 158 ++++++++++++++++++
.../helpers/mappings_editor.helpers.tsx | 9 +-
.../field_parameters/meta_parameter.tsx | 2 +
3 files changed, 168 insertions(+), 1 deletion(-)
create mode 100644 x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/datatypes/point_datatype.test.tsx
diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/datatypes/point_datatype.test.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/datatypes/point_datatype.test.tsx
new file mode 100644
index 00000000000000..0ee70d63ba6676
--- /dev/null
+++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/datatypes/point_datatype.test.tsx
@@ -0,0 +1,158 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+import { act } from 'react-dom/test-utils';
+
+import { componentHelpers, MappingsEditorTestBed } from '../helpers';
+
+const { setup, getMappingsEditorDataFactory } = componentHelpers.mappingsEditor;
+
+// Parameters automatically added to the point datatype when saved (with the default values)
+export const defaultPointParameters = {
+ type: 'point',
+ ignore_malformed: false,
+ ignore_z_value: true,
+};
+
+describe('Mappings editor: point datatype', () => {
+ /**
+ * Variable to store the mappings data forwarded to the consumer component
+ */
+ let data: any;
+ let onChangeHandler: jest.Mock = jest.fn();
+ let getMappingsEditorData = getMappingsEditorDataFactory(onChangeHandler);
+ let testBed: MappingsEditorTestBed;
+
+ beforeAll(() => {
+ jest.useFakeTimers();
+ });
+
+ afterAll(() => {
+ jest.useRealTimers();
+ });
+
+ beforeEach(() => {
+ onChangeHandler = jest.fn();
+ getMappingsEditorData = getMappingsEditorDataFactory(onChangeHandler);
+ });
+
+ test('initial view and default parameters values', async () => {
+ const defaultMappings = {
+ properties: {
+ myField: {
+ type: 'point',
+ },
+ },
+ };
+
+ const updatedMappings = { ...defaultMappings };
+
+ await act(async () => {
+ testBed = setup({ value: defaultMappings, onChange: onChangeHandler });
+ });
+ testBed.component.update();
+
+ const {
+ component,
+ actions: { startEditField, updateFieldAndCloseFlyout },
+ } = testBed;
+
+ // Open the flyout to edit the field
+ await startEditField('myField');
+
+ // Save the field and close the flyout
+ await updateFieldAndCloseFlyout();
+
+ // It should have the default parameters values added
+ updatedMappings.properties.myField = defaultPointParameters;
+
+ ({ data } = await getMappingsEditorData(component));
+ expect(data).toEqual(updatedMappings);
+ });
+
+ describe('meta parameter', () => {
+ const defaultMappings = {
+ properties: {
+ myField: {
+ type: 'point',
+ },
+ },
+ };
+
+ const updatedMappings = { ...defaultMappings };
+
+ const metaParameter = {
+ meta: {
+ my_metadata: 'foobar',
+ },
+ };
+
+ beforeEach(async () => {
+ await act(async () => {
+ testBed = setup({ value: defaultMappings, onChange: onChangeHandler });
+ });
+ testBed.component.update();
+ });
+
+ test('valid meta object', async () => {
+ const {
+ component,
+ actions: {
+ startEditField,
+ updateFieldAndCloseFlyout,
+ showAdvancedSettings,
+ toggleFormRow,
+ updateJsonEditor,
+ },
+ } = testBed;
+
+ // Open the flyout to edit the field
+ await startEditField('myField');
+ await showAdvancedSettings();
+
+ // Enable the meta parameter and add value
+ toggleFormRow('metaParameter');
+ await act(async () => {
+ updateJsonEditor('metaParameterEditor', metaParameter.meta);
+ });
+ component.update();
+
+ // Save the field and close the flyout
+ await updateFieldAndCloseFlyout();
+
+ // It should have the default parameters values added, plus metadata
+ updatedMappings.properties.myField = {
+ ...defaultPointParameters,
+ ...metaParameter,
+ };
+
+ ({ data } = await getMappingsEditorData(component));
+ expect(data).toEqual(updatedMappings);
+ });
+
+ test('strip empty string', async () => {
+ const {
+ component,
+ actions: { startEditField, updateFieldAndCloseFlyout, showAdvancedSettings, toggleFormRow },
+ } = testBed;
+
+ // Open the flyout to edit the field
+ await startEditField('myField');
+ await showAdvancedSettings();
+
+ // Enable the meta parameter
+ toggleFormRow('metaParameter');
+
+ // Save the field and close the flyout without adding any values to meta parameter
+ await updateFieldAndCloseFlyout();
+
+ // It should have the default parameters values added
+ updatedMappings.properties.myField = defaultPointParameters;
+
+ ({ data } = await getMappingsEditorData(component));
+ expect(data).toEqual(updatedMappings);
+ });
+ });
+});
diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/helpers/mappings_editor.helpers.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/helpers/mappings_editor.helpers.tsx
index 2a4af89c46559f..e123dea6ff2ff6 100644
--- a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/helpers/mappings_editor.helpers.tsx
+++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/helpers/mappings_editor.helpers.tsx
@@ -239,6 +239,10 @@ const createActions = (testBed: TestBed) => {
const getCheckboxValue = (testSubject: TestSubjects): boolean =>
find(testSubject).props().checked;
+ const toggleFormRow = (formRowName: string) => {
+ form.toggleEuiSwitch(`${formRowName}.formRowToggle`);
+ };
+
return {
selectTab,
getFieldAt,
@@ -252,6 +256,7 @@ const createActions = (testBed: TestBed) => {
getComboBoxValue,
getToggleValue,
getCheckboxValue,
+ toggleFormRow,
};
};
@@ -365,4 +370,6 @@ export type TestSubjects =
| 'searchQuoteAnalyzer-custom'
| 'searchQuoteAnalyzer-toggleCustomButton'
| 'searchQuoteAnalyzer-custom.input'
- | 'useSameAnalyzerForSearchCheckBox.input';
+ | 'useSameAnalyzerForSearchCheckBox.input'
+ | 'metaParameterEditor'
+ | string;
diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/meta_parameter.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/meta_parameter.tsx
index c8af296318b61c..a950ba82d0eac4 100644
--- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/meta_parameter.tsx
+++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/meta_parameter.tsx
@@ -32,6 +32,7 @@ export const MetaParameter: FunctionComponent = ({ defaultToggleValue })
}),
href: documentationService.getMetaLink(),
}}
+ data-test-subj="metaParameter"
>
= ({ defaultToggleValue })
component={JsonEditorField}
componentProps={{
euiCodeEditorProps: {
+ ['data-test-subj']: 'metaParameterEditor',
height: '300px',
'aria-label': i18n.translate('xpack.idxMgmt.mappingsEditor.metaParameterAriaLabel', {
defaultMessage: 'metadata field data editor',