Tt filter step input per variable type (#13371)
- add fieldMetadataId to step output schema - use it to display FormFieldInput in Filter input - few fixes for a few fields Next step: - Handle composite fields - Design review
This commit is contained in:
+8
-27
@@ -68,30 +68,11 @@ describe('evaluateFilterConditions', () => {
|
||||
expect(result).toBe(false);
|
||||
});
|
||||
|
||||
it('should handle null checks', () => {
|
||||
const filter1 = createFilter(ViewFilterOperand.Is, null, 'null');
|
||||
const filter2 = createFilter(ViewFilterOperand.Is, undefined, 'NULL');
|
||||
const filter3 = createFilter(ViewFilterOperand.Is, 'value', 'null');
|
||||
it('should return true when values are equal but different types', () => {
|
||||
const filter = createFilter(ViewFilterOperand.Is, '123', 123);
|
||||
const result = evaluateFilterConditions({ filters: [filter] });
|
||||
|
||||
expect(evaluateFilterConditions({ filters: [filter1] })).toBe(true);
|
||||
expect(evaluateFilterConditions({ filters: [filter2] })).toBe(true);
|
||||
expect(evaluateFilterConditions({ filters: [filter3] })).toBe(false);
|
||||
});
|
||||
|
||||
it('should handle not null checks', () => {
|
||||
const filter1 = createFilter(ViewFilterOperand.Is, 'value', 'not null');
|
||||
const filter2 = createFilter(ViewFilterOperand.Is, 'value', 'NOT NULL');
|
||||
const filter3 = createFilter(ViewFilterOperand.Is, null, 'not null');
|
||||
const filter4 = createFilter(
|
||||
ViewFilterOperand.Is,
|
||||
undefined,
|
||||
'not null',
|
||||
);
|
||||
|
||||
expect(evaluateFilterConditions({ filters: [filter1] })).toBe(true);
|
||||
expect(evaluateFilterConditions({ filters: [filter2] })).toBe(true);
|
||||
expect(evaluateFilterConditions({ filters: [filter3] })).toBe(false);
|
||||
expect(evaluateFilterConditions({ filters: [filter4] })).toBe(false);
|
||||
expect(result).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -182,12 +163,12 @@ describe('evaluateFilterConditions', () => {
|
||||
const filter1 = createFilter(
|
||||
ViewFilterOperand.Contains,
|
||||
['apple', 'banana', 'cherry'],
|
||||
'apple',
|
||||
['apple'],
|
||||
);
|
||||
const filter2 = createFilter(
|
||||
ViewFilterOperand.Contains,
|
||||
['apple', 'banana', 'cherry'],
|
||||
'grape',
|
||||
['grape'],
|
||||
);
|
||||
|
||||
expect(evaluateFilterConditions({ filters: [filter1] })).toBe(true);
|
||||
@@ -198,12 +179,12 @@ describe('evaluateFilterConditions', () => {
|
||||
const filter1 = createFilter(
|
||||
ViewFilterOperand.DoesNotContain,
|
||||
['apple', 'banana', 'cherry'],
|
||||
'apple',
|
||||
['apple'],
|
||||
);
|
||||
const filter2 = createFilter(
|
||||
ViewFilterOperand.DoesNotContain,
|
||||
['apple', 'banana', 'cherry'],
|
||||
'grape',
|
||||
['grape'],
|
||||
);
|
||||
|
||||
expect(evaluateFilterConditions({ filters: [filter1] })).toBe(false);
|
||||
|
||||
+65
-13
@@ -16,17 +16,19 @@ function evaluateFilter(filter: ResolvedFilter): boolean {
|
||||
|
||||
switch (filter.operand) {
|
||||
case ViewFilterOperand.Is:
|
||||
if (String(rightValue).toLowerCase() === 'null') {
|
||||
return leftValue === null || leftValue === undefined;
|
||||
switch (typeof leftValue) {
|
||||
case 'string':
|
||||
return (
|
||||
String(leftValue).toLowerCase() === String(rightValue).toLowerCase()
|
||||
);
|
||||
case 'boolean':
|
||||
return Boolean(leftValue) === Boolean(rightValue);
|
||||
default:
|
||||
return leftValue === rightValue;
|
||||
}
|
||||
if (String(rightValue).toLowerCase() === 'not null') {
|
||||
return leftValue !== null && leftValue !== undefined;
|
||||
}
|
||||
|
||||
return leftValue == rightValue;
|
||||
|
||||
case ViewFilterOperand.IsNot:
|
||||
return leftValue != rightValue;
|
||||
return String(leftValue) !== String(rightValue);
|
||||
|
||||
case ViewFilterOperand.GreaterThanOrEqual:
|
||||
return Number(leftValue) >= Number(rightValue);
|
||||
@@ -36,14 +38,38 @@ function evaluateFilter(filter: ResolvedFilter): boolean {
|
||||
|
||||
case ViewFilterOperand.Contains:
|
||||
if (Array.isArray(leftValue)) {
|
||||
return leftValue.includes(rightValue);
|
||||
try {
|
||||
const parsedRightValue = Array.isArray(rightValue)
|
||||
? rightValue
|
||||
: JSON.parse(rightValue as string);
|
||||
|
||||
if (Array.isArray(parsedRightValue)) {
|
||||
return parsedRightValue.every((item) => leftValue.includes(item));
|
||||
} else {
|
||||
return leftValue.includes(parsedRightValue);
|
||||
}
|
||||
} catch (error) {
|
||||
return leftValue.includes(rightValue);
|
||||
}
|
||||
}
|
||||
|
||||
return String(leftValue).includes(String(rightValue));
|
||||
|
||||
case ViewFilterOperand.DoesNotContain:
|
||||
if (Array.isArray(leftValue)) {
|
||||
return !leftValue.includes(rightValue);
|
||||
try {
|
||||
const parsedRightValue = Array.isArray(rightValue)
|
||||
? rightValue
|
||||
: JSON.parse(rightValue as string);
|
||||
|
||||
if (Array.isArray(parsedRightValue)) {
|
||||
return !parsedRightValue.every((item) => leftValue.includes(item));
|
||||
} else {
|
||||
return !leftValue.includes(parsedRightValue);
|
||||
}
|
||||
} catch (error) {
|
||||
return !leftValue.includes(rightValue);
|
||||
}
|
||||
}
|
||||
|
||||
return !String(leftValue).includes(String(rightValue));
|
||||
@@ -67,17 +93,43 @@ function evaluateFilter(filter: ResolvedFilter): boolean {
|
||||
case ViewFilterOperand.IsNotNull:
|
||||
return leftValue !== null && leftValue !== undefined;
|
||||
|
||||
case ViewFilterOperand.IsRelative:
|
||||
case ViewFilterOperand.IsInPast:
|
||||
if (typeof leftValue === 'string') {
|
||||
return Date.now() - new Date(leftValue).getTime() > 0;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
case ViewFilterOperand.IsInFuture:
|
||||
if (typeof leftValue === 'string') {
|
||||
return Date.now() - new Date(leftValue).getTime() < 0;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
case ViewFilterOperand.IsToday:
|
||||
if (typeof leftValue === 'string') {
|
||||
return new Date(leftValue).toDateString() === new Date().toDateString();
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
case ViewFilterOperand.IsBefore:
|
||||
if (typeof leftValue === 'string' && typeof rightValue === 'string') {
|
||||
return new Date(leftValue).getTime() < new Date(rightValue).getTime();
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
case ViewFilterOperand.IsAfter:
|
||||
// Date/time operands - for now, return false as placeholder
|
||||
// These would need proper date logic implementation
|
||||
if (typeof leftValue === 'string' && typeof rightValue === 'string') {
|
||||
return new Date(leftValue).getTime() > new Date(rightValue).getTime();
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
case ViewFilterOperand.VectorSearch:
|
||||
case ViewFilterOperand.IsRelative:
|
||||
return false;
|
||||
|
||||
default:
|
||||
|
||||
Reference in New Issue
Block a user