Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 23 additions & 2 deletions packages/core/src/helpers/comparison.builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ import {
isLikeComparisonOperator,
isRangeComparisonOperators,
LikeComparisonOperators,
RangeComparisonOperators
RangeComparisonOperators,
BitwiseComparisonOperators,
isBitwiseComparisonOperators
} from './filter.helpers'
import { ComparisonField, FilterFn } from './types'

Expand All @@ -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<DTO[F]>)
}
throw new Error(`unknown operator ${JSON.stringify(cmp)}`)

}

private static bitwiseComparison<DTO, F extends keyof DTO>(cmp: 'hasOneOfBits' | 'hasAllBits', field: F, val: DTO[F]): FilterFn<DTO> {
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<DTO, F extends keyof DTO>(
Expand Down
7 changes: 6 additions & 1 deletion packages/core/src/helpers/filter.helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 =>
Expand All @@ -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'

Expand All @@ -36,7 +40,8 @@ export const isComparison = <DTO, K extends keyof DTO>(
isInComparisonOperators(op) ||
isBetweenComparisonOperators(op) ||
isRangeComparisonOperators(op) ||
isBooleanComparisonOperators(op)
isBooleanComparisonOperators(op) ||
isBitwiseComparisonOperators(op)
)
}

Expand Down
20 changes: 20 additions & 0 deletions packages/core/src/interfaces/filter-field-comparison.interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,26 @@ export interface CommonFieldComparisonType<FieldType> extends BooleanFieldCompar
* ```
*/
notBetween?: CommonFieldComparisonBetweenType<FieldType>

/**
* Checks that a field has at least one of the bits set in the value.
*
* ```ts
* // field & value <> 0
* { field: { hasOneOfBits: value } }
* ```
*/
hasOneOfBits?: FieldType
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should probably create a new interface for int/bigint filterfieldComparions.
hasOneOfBits and hasAllBits would go there.


/**
* Checks that a field has all bits set in the value.
*
* ```ts
* // field & value = value
* { field: { hasAllBits: value } }
* ```
*/
hasAllBits?: FieldType
}

/**
Expand Down