Files
grafana/packages/grafana-data/src/transformations/matchers/valueMatchers/regexMatchers.test.ts
Totalus 754aca25c5 Transformation: added support for excluding/including rows based on their values. (#26884)
* Adding FilterByValue transformer skeleton

* Connecting options with Editor

* Improving UI and making deep copy of options on change.

* Improving Transformation Editor UI

* Implementing Regex filtering

* Adding valueFilters.ts and creating filter registry

* Connecting the test function

* Correcting TypeScript errors

* Using FilterInstance instead of simple Filter test function

* Adding field.type as filter options

* Improving UI. Adding custom placeholder depending on filter.

* Implementing a few more filter types

* Implementing more filters

* Return original data if no filter were processed

* Improving UI

* Correcting TS errors

* Making sure inequality transform are invalid until the filterExpression is not empty

* Cleanup in the UI file

* Improving UI (highlight invalid fields)

* Only show filterType that are supported for the selected field

* Adding tests + correction of a filter

* Adding transformer test

* Adding doc

* Cleanup

* Typing props for FilterSelectorRow component

Co-authored-by: Marcus Andersson <systemvetaren@gmail.com>

* Moving rendering in the JSX

Co-authored-by: Marcus Andersson <systemvetaren@gmail.com>

* Memoizing filterTypeOptions computation

Co-authored-by: Marcus Andersson <systemvetaren@gmail.com>

* Improve code compactness

Co-authored-by: Marcus Andersson <systemvetaren@gmail.com>

* Cleanup + solving TS errors

* Updating some labels

* Wrapping stuff around useMemo and useCallback

* Using cloneDeep from lodash

* Don't highlight field name input if null

* Removing time type fields in selectable options

* We want loose equality in this scenario.

* Adding `onChange` to useCallback dependencies

Co-authored-by: Marcus Andersson <systemvetaren@gmail.com>

* Include or exclude matching any or all conditions

* Correcting field name matching

* Cleanup

* Don't highlight the filterExpression input when its empty

* Adding Range filter

* Updating doc

* Correcting TS error

* Only showing the Match All/Match Any option if more than one condition

* Two inputs for the Range filter instead of one

* Improving invalid highlight for Range filter type

* Cleanup

* Improving labels in UI

* Using ButtonSelect to improve UI

* editor UI updates.

* Updating tests

* Adding component for Regex

* Improve TS typing

* Adding components for the other filter types.

* Cleanup

* Correct error

* Updating valueFilter.test.ts

* Updating filterByValue.test.ts

* Reverting and removing Range filter

* Update docs/sources/panels/transformations.md

* starting to implement poc.

* added a small poc.

* wip

* added tests.

* added structure for dynamic value matcher editors.

* added more support.

* added some more value matchers.

* removed unused value filters.

* added some more matchers.

* adding more matchers.

* added a range matcher.

* fixing some tests.

* fixing tests.

* remove unused dep.

* making the matching a bit more performant.

* UX improvements and alignment fixes

* fixed delete button.

* fixed some spacing in the UI.

* added docs for matchers.

* adding docs and exposing value matcher types.

* will store dateTime as string.

* updated docs according to feedback.

* moved filter by value in transformation list.

* Improved description.

* added regex value filter.

* added support for regex.

* fixing failing tests.

Co-authored-by: Marcus Andersson <systemvetaren@gmail.com>
Co-authored-by: Marcus Andersson <marcus.andersson@grafana.com>
Co-authored-by: Torkel Ödegaard <torkel@grafana.com>
2020-12-01 10:22:37 +01:00

86 lines
2.0 KiB
TypeScript

import { toDataFrame } from '../../../dataframe';
import { DataFrame } from '../../../types/dataFrame';
import { getValueMatcher } from '../../matchers';
import { ValueMatcherID } from '../ids';
describe('regex value matcher', () => {
const data: DataFrame[] = [
toDataFrame({
fields: [
{
name: 'temp',
values: ['.', 'asdf', 100, '25.5'],
},
],
}),
];
describe('option with value .*', () => {
const matcher = getValueMatcher({
id: ValueMatcherID.regex,
options: {
value: '.*',
},
});
it('should match all values', () => {
const frame = data[0];
const field = frame.fields[0];
for (let i = 0; i < field.values.length; i++) {
expect(matcher(i, field, frame, data)).toBeTruthy();
}
});
});
describe('option with value \\w+', () => {
const matcher = getValueMatcher({
id: ValueMatcherID.regex,
options: {
value: '\\w+',
},
});
it('should match wordy values', () => {
const frame = data[0];
const field = frame.fields[0];
const valueIndex = 1;
expect(matcher(valueIndex, field, frame, data)).toBeTruthy();
});
it('should not match non-wordy values', () => {
const frame = data[0];
const field = frame.fields[0];
const valueIndex = 0;
expect(matcher(valueIndex, field, frame, data)).toBeFalsy();
});
});
describe('option with value \\d+', () => {
const matcher = getValueMatcher({
id: ValueMatcherID.regex,
options: {
value: '\\d+',
},
});
it('should match numeric values', () => {
const frame = data[0];
const field = frame.fields[0];
const valueIndex = 2;
expect(matcher(valueIndex, field, frame, data)).toBeTruthy();
});
it('should not match non-numeric values', () => {
const frame = data[0];
const field = frame.fields[0];
const valueIndex = 1;
expect(matcher(valueIndex, field, frame, data)).toBeFalsy();
});
});
});