@@ -10,7 +10,18 @@ export enum SearchError {
10
10
NotDefinedQueryKey = 'not defined query key' ,
11
11
NotDefinedComparator = 'not defined comparator'
12
12
}
13
-
13
+ /**
14
+ * supported data formats
15
+ *
16
+ * @enum {number}
17
+ */
18
+ export enum SupportedDataFormat {
19
+ BigInt ,
20
+ Boolean ,
21
+ Double ,
22
+ DateTime ,
23
+ String
24
+ }
14
25
/** allowed operators to search */
15
26
export type FilterOperatorMethod =
16
27
| '$noop'
@@ -84,48 +95,46 @@ const greaterThan = (
84
95
a : ComparableType | ComparableType [ ] ,
85
96
b : ComparableType | ComparableType [ ]
86
97
) => {
87
- if ( Array . isArray ( a ) && Array . isArray ( b ) ) {
88
- return a . every ( ( val , index ) => val > ( b as ComparableType [ ] ) [ index ] ) ;
89
- }
90
- if ( ! Array . isArray ( a ) && Array . isArray ( b ) ) {
91
- return b . every ( ( val ) => a > val ) ;
92
- }
93
- if ( Array . isArray ( a ) && ! Array . isArray ( b ) ) {
94
- return a . every ( ( val ) => val > b ) ;
95
- }
96
- return a > b ;
98
+ const predicate = ( a : ComparableType , b : ComparableType ) => {
99
+ const dataFormat = detectDataFormat ( a . toString ( ) ) ;
100
+
101
+ switch ( dataFormat ) {
102
+ case SupportedDataFormat . BigInt :
103
+ case SupportedDataFormat . Boolean :
104
+ return BigInt ( a ) > BigInt ( b ) ;
105
+ case SupportedDataFormat . DateTime :
106
+ return Date . parse ( a . toString ( ) ) > Date . parse ( b . toString ( ) ) ; /// nanoseconds won't be compared.
107
+ case SupportedDataFormat . Double :
108
+ case SupportedDataFormat . String :
109
+ default :
110
+ return a > b ;
111
+ }
112
+ } ;
113
+
114
+ return operatorIndependentCheck ( a , b , predicate ) ;
97
115
} ;
98
116
99
117
const greaterThanOrEqual = (
100
118
a : ComparableType | ComparableType [ ] ,
101
119
b : ComparableType | ComparableType [ ]
102
120
) => {
103
- if ( Array . isArray ( a ) && Array . isArray ( b ) ) {
104
- return a . every ( ( val , index ) => val >= ( b as ComparableType [ ] ) [ index ] ) ;
105
- }
106
- if ( ! Array . isArray ( a ) && Array . isArray ( b ) ) {
107
- return b . every ( ( val ) => a >= val ) ;
108
- }
109
- if ( Array . isArray ( a ) && ! Array . isArray ( b ) ) {
110
- return a . every ( ( val ) => val >= b ) ;
111
- }
112
- return a >= b ;
113
- } ;
121
+ const predicate = ( a : ComparableType , b : ComparableType ) => {
122
+ const dataFormat = detectDataFormat ( a . toString ( ) ) ;
114
123
115
- const lessThanOrEqual = (
116
- a : ComparableType | ComparableType [ ] ,
117
- b : ComparableType | ComparableType [ ]
118
- ) => {
119
- if ( Array . isArray ( a ) && Array . isArray ( b ) ) {
120
- return a . every ( ( val , index ) => val <= ( b as ComparableType [ ] ) [ index ] ) ;
121
- }
122
- if ( ! Array . isArray ( a ) && Array . isArray ( b ) ) {
123
- return b . every ( ( val ) => a <= val ) ;
124
- }
125
- if ( Array . isArray ( a ) && ! Array . isArray ( b ) ) {
126
- return a . every ( ( val ) => val <= b ) ;
127
- }
128
- return a <= b ;
124
+ switch ( dataFormat ) {
125
+ case SupportedDataFormat . BigInt :
126
+ case SupportedDataFormat . Boolean :
127
+ return BigInt ( a ) >= BigInt ( b ) ;
128
+ case SupportedDataFormat . DateTime :
129
+ return Date . parse ( a . toString ( ) ) >= Date . parse ( b . toString ( ) ) ; /// nanoseconds won't be compared.
130
+ case SupportedDataFormat . Double :
131
+ case SupportedDataFormat . String :
132
+ default :
133
+ return a >= b ;
134
+ }
135
+ } ;
136
+
137
+ return operatorIndependentCheck ( a , b , predicate ) ;
129
138
} ;
130
139
131
140
// a - field value
@@ -190,7 +199,7 @@ export const comparatorOptions: { [v in FilterOperatorMethod]: FilterOperatorFun
190
199
$gte : ( a : ComparableType | ComparableType [ ] , b : ComparableType | ComparableType [ ] ) =>
191
200
greaterThanOrEqual ( a , b ) ,
192
201
$lte : ( a : ComparableType | ComparableType [ ] , b : ComparableType | ComparableType [ ] ) =>
193
- lessThanOrEqual ( a , b ) ,
202
+ ! greaterThan ( a , b ) ,
194
203
$between : ( a : ComparableType | ComparableType [ ] , b : ComparableType | ComparableType [ ] ) =>
195
204
betweenOperator ( a , b ) ,
196
205
$nonbetween : ( a : ComparableType | ComparableType [ ] , b : ComparableType | ComparableType [ ] ) =>
@@ -320,3 +329,40 @@ export const StandardJSONCredentialsQueryFilter = (query: ProofQuery): FilterQue
320
329
}
321
330
} , [ ] ) ;
322
331
} ;
332
+
333
+ const operatorIndependentCheck = (
334
+ a : ComparableType | ComparableType [ ] ,
335
+ b : ComparableType | ComparableType [ ] ,
336
+ predicate : ( a : ComparableType , b : ComparableType ) => boolean
337
+ ) => {
338
+ if ( Array . isArray ( a ) && Array . isArray ( b ) ) {
339
+ return a . every ( ( val , index ) => predicate ( val , ( b as ComparableType [ ] ) [ index ] ) ) ;
340
+ }
341
+ if ( ! Array . isArray ( a ) && Array . isArray ( b ) ) {
342
+ return b . every ( ( val ) => predicate ( a , val ) ) ;
343
+ }
344
+ if ( Array . isArray ( a ) && ! Array . isArray ( b ) ) {
345
+ return a . every ( ( val ) => predicate ( val , b ) ) ;
346
+ }
347
+ // in this case a and b are not arrays
348
+ return predicate ( a as ComparableType , b as ComparableType ) ;
349
+ } ;
350
+
351
+ const regExBigInt = / ^ [ + - ] ? \d + $ / ;
352
+ const regExDouble = / ^ ( - ? ) ( 0 | ( [ 1 - 9 ] [ 0 - 9 ] * ) ) ( \\ .[ 0 - 9 ] + ) ? $ / ;
353
+ const regExDateTimeRFC3339Nano =
354
+ /* eslint-disable-next-line */
355
+ / ^ ( [ 0 - 9 ] + ) - ( 0 [ 1 - 9 ] | 1 [ 0 1 2 ] ) - ( 0 [ 1 - 9 ] | [ 1 2 ] [ 0 - 9 ] | 3 [ 0 1 ] ) [ T t ] ( [ 0 1 ] [ 0 - 9 ] | 2 [ 0 - 3 ] ) : ( [ 0 - 5 ] [ 0 - 9 ] ) : ( [ 0 - 5 ] [ 0 - 9 ] | 6 0 ) ( \. [ 0 - 9 ] + ) ? ( ( [ Z z ] ) | ( [ \+ | \- ] ( [ 0 1 ] [ 0 - 9 ] | 2 [ 0 - 3 ] ) : [ 0 - 5 ] [ 0 - 9 ] ) ) $ / ;
356
+ const regExBoolean = / ^ ( t r u e ) | ( f a l s e ) $ / ;
357
+ const regExDateTimeYYYYMMDD = / ^ \d { 4 } - \d { 2 } - \d { 2 } $ / ;
358
+
359
+ const detectDataFormat = ( s : string ) : SupportedDataFormat =>
360
+ regExBigInt . test ( s )
361
+ ? SupportedDataFormat . BigInt
362
+ : regExDouble . test ( s )
363
+ ? SupportedDataFormat . Double
364
+ : regExDateTimeRFC3339Nano . test ( s ) || regExDateTimeYYYYMMDD . test ( s )
365
+ ? SupportedDataFormat . DateTime
366
+ : regExBoolean . test ( s )
367
+ ? SupportedDataFormat . Boolean
368
+ : SupportedDataFormat . String ;
0 commit comments