From 766a6a5065ebdb4dc84f4f94125891a34a064ea4 Mon Sep 17 00:00:00 2001 From: Arthur Chen Date: Wed, 3 Sep 2025 05:41:02 +0000 Subject: [PATCH] AI gen code --- .../core/src/helpers/comparison.builder.ts | 25 +++++++++++++++++-- packages/core/src/helpers/filter.helpers.ts | 7 +++++- .../filter-field-comparison.interface.ts | 20 +++++++++++++++ 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/packages/core/src/helpers/comparison.builder.ts b/packages/core/src/helpers/comparison.builder.ts index df6c7a133..d1ba3351d 100644 --- a/packages/core/src/helpers/comparison.builder.ts +++ b/packages/core/src/helpers/comparison.builder.ts @@ -9,7 +9,9 @@ import { isLikeComparisonOperator, isRangeComparisonOperators, LikeComparisonOperators, - RangeComparisonOperators + RangeComparisonOperators, + BitwiseComparisonOperators, + isBitwiseComparisonOperators } from './filter.helpers' import { ComparisonField, FilterFn } from './types' @@ -36,11 +38,30 @@ export class ComparisonBuilder { if (isLikeComparisonOperator(cmp)) { return this.likeComparison(cmp, field, val as unknown as string) } - + if (isBitwiseComparisonOperators(cmp)) { + return this.bitwiseComparison(cmp as BitwiseComparisonOperators, field, val as DTO[F]) + } if (isBetweenComparisonOperators(cmp)) { return this.betweenComparison(cmp, field, val as CommonFieldComparisonBetweenType) } throw new Error(`unknown operator ${JSON.stringify(cmp)}`) + + } + + private static bitwiseComparison(cmp: 'hasOneOfBits' | 'hasAllBits', field: F, val: DTO[F]): FilterFn { + if (cmp === 'hasOneOfBits') { + return (dto?: DTO): boolean => { + if (!dto) return false + // @ts-ignore + return (dto[field] & val) !== 0 + } + } + // hasAllBits + return (dto?: DTO): boolean => { + if (!dto) return false + // @ts-ignore + return (dto[field] & val) === val + } } private static booleanComparison( diff --git a/packages/core/src/helpers/filter.helpers.ts b/packages/core/src/helpers/filter.helpers.ts index eb393c813..c65b99717 100644 --- a/packages/core/src/helpers/filter.helpers.ts +++ b/packages/core/src/helpers/filter.helpers.ts @@ -6,6 +6,7 @@ export type LikeComparisonOperators = 'like' | 'notLike' | 'iLike' | 'notILike' export type InComparisonOperators = 'in' | 'notIn' export type BetweenComparisonOperators = 'between' | 'notBetween' export type RangeComparisonOperators = 'gt' | 'gte' | 'lt' | 'lte' +export type BitwiseComparisonOperators = 'hasOneOfBits' | 'hasAllBits' export type BooleanComparisonOperators = 'eq' | 'neq' | 'is' | 'isNot' export const isLikeComparisonOperator = (op: unknown): op is LikeComparisonOperators => @@ -19,6 +20,9 @@ export const isBetweenComparisonOperators = (op: unknown): op is BetweenComparis export const isRangeComparisonOperators = (op: unknown): op is RangeComparisonOperators => op === 'gt' || op === 'gte' || op === 'lt' || op === 'lte' +export const isBitwiseComparisonOperators = (op: unknown): op is BitwiseComparisonOperators => + op === 'hasOneOfBits' || op === 'hasAllBits' + export const isBooleanComparisonOperators = (op: unknown): op is BooleanComparisonOperators => op === 'eq' || op === 'neq' || op === 'is' || op === 'isNot' @@ -36,7 +40,8 @@ export const isComparison = ( isInComparisonOperators(op) || isBetweenComparisonOperators(op) || isRangeComparisonOperators(op) || - isBooleanComparisonOperators(op) + isBooleanComparisonOperators(op) || + isBitwiseComparisonOperators(op) ) } diff --git a/packages/core/src/interfaces/filter-field-comparison.interface.ts b/packages/core/src/interfaces/filter-field-comparison.interface.ts index 56ac9f950..010a08e5a 100644 --- a/packages/core/src/interfaces/filter-field-comparison.interface.ts +++ b/packages/core/src/interfaces/filter-field-comparison.interface.ts @@ -137,6 +137,26 @@ export interface CommonFieldComparisonType extends BooleanFieldCompar * ``` */ notBetween?: CommonFieldComparisonBetweenType + + /** + * Checks that a field has at least one of the bits set in the value. + * + * ```ts + * // field & value <> 0 + * { field: { hasOneOfBits: value } } + * ``` + */ + hasOneOfBits?: FieldType + + /** + * Checks that a field has all bits set in the value. + * + * ```ts + * // field & value = value + * { field: { hasAllBits: value } } + * ``` + */ + hasAllBits?: FieldType } /**