data-finder-ts 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/{chunk-4JVW4TAB.js → chunk-BGEX377Q.js} +58 -8
  2. package/dist/chunk-BGEX377Q.js.map +1 -0
  3. package/dist/chunk-BKPWV3OF.js +962 -0
  4. package/dist/chunk-BKPWV3OF.js.map +1 -0
  5. package/dist/{chunk-PMPLCEWQ.js → chunk-GPHWC533.js} +2 -2
  6. package/dist/{chunk-FJYA2ASS.js → chunk-KAK75RVS.js} +74 -12
  7. package/dist/chunk-KAK75RVS.js.map +1 -0
  8. package/dist/{chunk-4LNZV6EN.js → chunk-MGEL5RWM.js} +206 -78
  9. package/dist/chunk-MGEL5RWM.js.map +1 -0
  10. package/dist/chunk-PF6EJZHB.js +1015 -0
  11. package/dist/chunk-PF6EJZHB.js.map +1 -0
  12. package/dist/datafinder/attribute.cjs +537 -11
  13. package/dist/datafinder/attribute.cjs.map +1 -1
  14. package/dist/datafinder/attribute.d.cts +29 -7
  15. package/dist/datafinder/attribute.d.ts +29 -7
  16. package/dist/datafinder/attribute.js +2 -2
  17. package/dist/datafinder/runner.cjs +1267 -215
  18. package/dist/datafinder/runner.cjs.map +1 -1
  19. package/dist/datafinder/runner.d.cts +28 -5
  20. package/dist/datafinder/runner.d.ts +28 -5
  21. package/dist/datafinder/runner.js +6 -6
  22. package/dist/datafinder/sql-generator.cjs +1203 -206
  23. package/dist/datafinder/sql-generator.cjs.map +1 -1
  24. package/dist/datafinder/sql-generator.d.cts +19 -5
  25. package/dist/datafinder/sql-generator.d.ts +19 -5
  26. package/dist/datafinder/sql-generator.js +9 -5
  27. package/dist/datafinder/typed-attributes.cjs +693 -88
  28. package/dist/datafinder/typed-attributes.cjs.map +1 -1
  29. package/dist/datafinder/typed-attributes.d.cts +3 -242
  30. package/dist/datafinder/typed-attributes.d.ts +3 -242
  31. package/dist/datafinder/typed-attributes.js +3 -3
  32. package/dist/dialect-CogGPm_y.d.cts +38 -0
  33. package/dist/dialect-aaG1bDi5.d.ts +38 -0
  34. package/dist/index.cjs +1677 -408
  35. package/dist/index.cjs.map +1 -1
  36. package/dist/index.d.cts +109 -5
  37. package/dist/index.d.ts +109 -5
  38. package/dist/index.js +321 -11
  39. package/dist/index.js.map +1 -1
  40. package/dist/model/milestoning.cjs +529 -0
  41. package/dist/model/milestoning.cjs.map +1 -1
  42. package/dist/model/milestoning.js +2 -2
  43. package/dist/model/relational.cjs +547 -16
  44. package/dist/model/relational.cjs.map +1 -1
  45. package/dist/model/relational.d.cts +421 -57
  46. package/dist/model/relational.d.ts +421 -57
  47. package/dist/model/relational.js +53 -3
  48. package/dist/typed-attributes-CUTf_6Ru.d.ts +328 -0
  49. package/dist/typed-attributes-CdWXq_78.d.cts +328 -0
  50. package/package.json +3 -2
  51. package/dist/chunk-4JVW4TAB.js.map +0 -1
  52. package/dist/chunk-4LNZV6EN.js.map +0 -1
  53. package/dist/chunk-FJYA2ASS.js.map +0 -1
  54. package/dist/chunk-MH4XMYVB.js +0 -696
  55. package/dist/chunk-MH4XMYVB.js.map +0 -1
  56. package/dist/chunk-UYMOE6YU.js +0 -509
  57. package/dist/chunk-UYMOE6YU.js.map +0 -1
  58. /package/dist/{chunk-PMPLCEWQ.js.map → chunk-GPHWC533.js.map} +0 -0
@@ -1,70 +1,104 @@
1
1
  import {
2
2
  Attribute
3
- } from "./chunk-4JVW4TAB.js";
3
+ } from "./chunk-BGEX377Q.js";
4
4
  import {
5
5
  AggregateOperation,
6
+ Arithmetic,
6
7
  BooleanConstantOperation,
7
8
  ComparisonOperation,
9
+ DATE_ONLY_PATTERN,
8
10
  DateArithmeticOperation,
9
11
  DateConstantOperation,
10
12
  DateDiffOperation,
11
13
  DateExtractOperation,
14
+ DateOnly,
12
15
  DateTimeConstantOperation,
16
+ DateTruncOperation,
13
17
  DecimalConstantOperation,
14
18
  FloatConstantOperation,
15
19
  IntegerConstantOperation,
16
20
  ScalarFunctionOperation,
17
- StringConstantOperation
18
- } from "./chunk-UYMOE6YU.js";
21
+ StringConstantOperation,
22
+ applyMixins,
23
+ concat,
24
+ escapeLike,
25
+ sample
26
+ } from "./chunk-PF6EJZHB.js";
19
27
 
20
- // src/datafinder/typed-attributes.ts
21
- var StringAttribute = class extends Attribute {
22
- constructor(displayName, columnName, columnDbType, owner, parent, embedded) {
23
- super(displayName, columnName, columnDbType, owner, parent, embedded);
28
+ // src/datafinder/scalar-functions.ts
29
+ var StringFunctionOperation = class extends ScalarFunctionOperation {
30
+ functionInput() {
31
+ return this;
32
+ }
33
+ functionLabel() {
34
+ return labelOf(this);
35
+ }
36
+ };
37
+ var NumericFunctionOperation = class extends ScalarFunctionOperation {
38
+ functionInput() {
39
+ return this;
40
+ }
41
+ functionLabel() {
42
+ return labelOf(this);
43
+ }
44
+ };
45
+ function labelOf(operation) {
46
+ return operation.displayName ?? operation.func.charAt(0) + operation.func.slice(1).toLowerCase();
47
+ }
48
+ function stringFunction(element, func, label, secondArg, extraArgs = []) {
49
+ return new StringFunctionOperation(element, func, label, secondArg, extraArgs);
50
+ }
51
+ function numberFunction(element, func, label, secondArg) {
52
+ return new NumericFunctionOperation(element, func, label, secondArg);
53
+ }
54
+ var StringFunctions = class {
55
+ /** Join text on the end: `f.first().concat(' ', f.last())`. A NULL part makes the whole NULL. */
56
+ concat(...more) {
57
+ return concat(this, ...more);
24
58
  }
25
59
  /** Convert every character to uppercase. */
26
60
  toUpperCase() {
27
- return new ScalarFunctionOperation(this.cwj(), "UPPER" /* UPPER */, "Upper " + this.displayName());
61
+ return stringFunction(this.functionInput(), "UPPER" /* UPPER */, "Upper " + this.functionLabel());
28
62
  }
29
63
  /** Convert every character to lowercase. */
30
64
  toLowerCase() {
31
- return new ScalarFunctionOperation(this.cwj(), "LOWER" /* LOWER */, "Lower " + this.displayName());
65
+ return stringFunction(this.functionInput(), "LOWER" /* LOWER */, "Lower " + this.functionLabel());
32
66
  }
33
67
  /** Remove leading and trailing whitespace. */
34
68
  trim() {
35
- return new ScalarFunctionOperation(this.cwj(), "TRIM" /* TRIM */, "Trim " + this.displayName());
69
+ return stringFunction(this.functionInput(), "TRIM" /* TRIM */, "Trim " + this.functionLabel());
36
70
  }
37
71
  /** Remove leading whitespace. */
38
72
  trimStart() {
39
- return new ScalarFunctionOperation(this.cwj(), "LTRIM" /* LTRIM */, "Trim Start " + this.displayName());
73
+ return stringFunction(this.functionInput(), "LTRIM" /* LTRIM */, "Trim Start " + this.functionLabel());
40
74
  }
41
75
  /** Remove trailing whitespace. */
42
76
  trimEnd() {
43
- return new ScalarFunctionOperation(this.cwj(), "RTRIM" /* RTRIM */, "Trim End " + this.displayName());
77
+ return stringFunction(this.functionInput(), "RTRIM" /* RTRIM */, "Trim End " + this.functionLabel());
44
78
  }
45
79
  /** Return the number of characters in the string. */
46
80
  length() {
47
- return new ScalarFunctionOperation(this.cwj(), "LENGTH" /* LENGTH */, "Length " + this.displayName());
81
+ return numberFunction(this.functionInput(), "LENGTH" /* LENGTH */, "Length " + this.functionLabel());
48
82
  }
49
83
  /** Return the string with characters in reverse order. */
50
84
  reverse() {
51
- return new ScalarFunctionOperation(this.cwj(), "REVERSE" /* REVERSE */, "Reverse " + this.displayName());
85
+ return stringFunction(this.functionInput(), "REVERSE" /* REVERSE */, "Reverse " + this.functionLabel());
52
86
  }
53
87
  /** Return the first `n` characters. */
54
88
  left(n) {
55
- return new ScalarFunctionOperation(this.cwj(), "LEFT" /* LEFT */, "Left " + this.displayName(), n);
89
+ return stringFunction(this.functionInput(), "LEFT" /* LEFT */, "Left " + this.functionLabel(), n);
56
90
  }
57
91
  /** Return the last `n` characters. */
58
92
  right(n) {
59
- return new ScalarFunctionOperation(this.cwj(), "RIGHT" /* RIGHT */, "Right " + this.displayName(), n);
93
+ return stringFunction(this.functionInput(), "RIGHT" /* RIGHT */, "Right " + this.functionLabel(), n);
60
94
  }
61
95
  /** Return the string repeated `n` times. */
62
96
  repeat(n) {
63
- return new ScalarFunctionOperation(this.cwj(), "REPEAT" /* REPEAT */, "Repeat " + this.displayName(), n);
97
+ return stringFunction(this.functionInput(), "REPEAT" /* REPEAT */, "Repeat " + this.functionLabel(), n);
64
98
  }
65
99
  /** Replace all occurrences of `fromStr` with `toStr`. */
66
100
  replace(fromStr, toStr) {
67
- return new ScalarFunctionOperation(this.cwj(), "REPLACE" /* REPLACE */, "Replace " + this.displayName(), void 0, [fromStr, toStr]);
101
+ return stringFunction(this.functionInput(), "REPLACE" /* REPLACE */, "Replace " + this.functionLabel(), void 0, [fromStr, toStr]);
68
102
  }
69
103
  /**
70
104
  * Extract a portion of the string.
@@ -72,7 +106,66 @@ var StringAttribute = class extends Attribute {
72
106
  */
73
107
  substring(start, length) {
74
108
  const args = length !== void 0 ? [start + 1, length] : [start + 1];
75
- return new ScalarFunctionOperation(this.cwj(), "SUBSTRING" /* SUBSTRING */, "Substring " + this.displayName(), void 0, args);
109
+ return stringFunction(this.functionInput(), "SUBSTRING" /* SUBSTRING */, "Substring " + this.functionLabel(), void 0, args);
110
+ }
111
+ };
112
+ var NumericFunctions = class {
113
+ /** Absolute value (distance from zero, always non-negative). */
114
+ abs() {
115
+ return numberFunction(this.functionInput(), "ABS" /* ABS */, "Abs " + this.functionLabel());
116
+ }
117
+ /** Round up to the nearest integer. */
118
+ ceil() {
119
+ return numberFunction(this.functionInput(), "CEILING" /* CEILING */, "Ceil " + this.functionLabel());
120
+ }
121
+ /** Round down to the nearest integer. */
122
+ floor() {
123
+ return numberFunction(this.functionInput(), "FLOOR" /* FLOOR */, "Floor " + this.functionLabel());
124
+ }
125
+ /** Square root. */
126
+ sqrt() {
127
+ return numberFunction(this.functionInput(), "SQRT" /* SQRT */, "Sqrt " + this.functionLabel());
128
+ }
129
+ /** Remainder after dividing by `n`. */
130
+ mod(n) {
131
+ return numberFunction(this.functionInput(), "MOD" /* MOD */, "Mod " + this.functionLabel(), n);
132
+ }
133
+ /** Raise to the power of `n`. */
134
+ power(n) {
135
+ return numberFunction(this.functionInput(), "POWER" /* POWER */, "Power " + this.functionLabel(), n);
136
+ }
137
+ /** Round to `d` decimal places, or to the nearest integer when `d` is omitted. */
138
+ round(d) {
139
+ return numberFunction(this.functionInput(), "ROUND" /* ROUND */, "Round " + this.functionLabel(), d);
140
+ }
141
+ };
142
+ applyMixins(StringFunctionOperation, [StringFunctions]);
143
+ applyMixins(NumericFunctionOperation, [NumericFunctions]);
144
+
145
+ // src/datafinder/typed-attributes.ts
146
+ var MinMax = class {
147
+ /** Smallest value in the group. */
148
+ min() {
149
+ return new AggregateOperation(this.cwj(), "MIN" /* MIN */, "Min " + this.displayName());
150
+ }
151
+ /** Largest value in the group. */
152
+ max() {
153
+ return new AggregateOperation(this.cwj(), "MAX" /* MAX */, "Max " + this.displayName());
154
+ }
155
+ };
156
+ var StringAttribute = class extends Attribute {
157
+ constructor(displayName, columnName, columnDbType, owner, parent, embedded, nullable = true, optional = false) {
158
+ super(displayName, columnName, columnDbType, owner, parent, embedded, nullable, optional);
159
+ }
160
+ toConstant(value) {
161
+ return new StringConstantOperation(String(value));
162
+ }
163
+ /**
164
+ * Join the values of a group into one text with `separator` between them. `orderBy` is the order they are
165
+ * joined in (`[f.name().ascending()]`); without it the order is not defined. Missing values are skipped.
166
+ */
167
+ join(separator = "", orderBy = []) {
168
+ return new AggregateOperation(this.cwj(), "STRING_AGG" /* STRING_AGG */, "Join " + this.displayName(), void 0, separator, orderBy);
76
169
  }
77
170
  /** Filter to rows where this attribute equals `value`. */
78
171
  eq(value) {
@@ -84,73 +177,52 @@ var StringAttribute = class extends Attribute {
84
177
  }
85
178
  /** Filter to rows where this attribute contains `value` as a substring. */
86
179
  contains(value) {
87
- return new ComparisonOperation(this.cwj(), "LIKE" /* LIKE */, new StringConstantOperation(`%${value}%`));
180
+ return new ComparisonOperation(this.cwj(), "LIKE" /* LIKE */, new StringConstantOperation(`%${escapeLike(value)}%`));
88
181
  }
89
182
  /** Filter to rows where this attribute begins with `prefix`. */
90
183
  startsWith(prefix) {
91
- return new ComparisonOperation(this.cwj(), "LIKE" /* LIKE */, new StringConstantOperation(`${prefix}%`));
184
+ return new ComparisonOperation(this.cwj(), "LIKE" /* LIKE */, new StringConstantOperation(`${escapeLike(prefix)}%`));
92
185
  }
93
186
  /** Filter to rows where this attribute ends with `suffix`. */
94
187
  endsWith(suffix) {
95
- return new ComparisonOperation(this.cwj(), "LIKE" /* LIKE */, new StringConstantOperation(`%${suffix}`));
188
+ return new ComparisonOperation(this.cwj(), "LIKE" /* LIKE */, new StringConstantOperation(`%${escapeLike(suffix)}`));
96
189
  }
97
190
  /** Filter to rows where this attribute does not contain `value` as a substring. */
98
191
  notContains(value) {
99
- return new ComparisonOperation(this.cwj(), "NOT_LIKE" /* NOT_LIKE */, new StringConstantOperation(`%${value}%`));
192
+ return new ComparisonOperation(this.cwj(), "NOT_LIKE" /* NOT_LIKE */, new StringConstantOperation(`%${escapeLike(value)}%`));
100
193
  }
101
194
  };
195
+ applyMixins(StringAttribute, [MinMax, StringFunctions]);
102
196
  var NumericAttribute = class extends Attribute {
103
- constructor(displayName, columnName, columnDbType, owner, parent, embedded) {
104
- super(displayName, columnName, columnDbType, owner, parent, embedded);
197
+ constructor(displayName, columnName, columnDbType, owner, parent, embedded, nullable = true, optional = false) {
198
+ super(displayName, columnName, columnDbType, owner, parent, embedded, nullable, optional);
105
199
  }
106
200
  /** Sum of all values in the group. */
107
201
  sum() {
108
202
  return new AggregateOperation(this.cwj(), "SUM" /* SUM */, "Sum " + this.displayName());
109
203
  }
110
- /** Smallest value in the group. */
111
- min() {
112
- return new AggregateOperation(this.cwj(), "MIN" /* MIN */, "Min " + this.displayName());
113
- }
114
- /** Largest value in the group. */
115
- max() {
116
- return new AggregateOperation(this.cwj(), "MAX" /* MAX */, "Max " + this.displayName());
117
- }
118
204
  /** Arithmetic mean of all values in the group. */
119
205
  average() {
120
206
  return new AggregateOperation(this.cwj(), "AVERAGE" /* AVERAGE */, "Average " + this.displayName());
121
207
  }
122
- /** Absolute value (distance from zero, always non-negative). */
123
- abs() {
124
- return new ScalarFunctionOperation(this.cwj(), "ABS" /* ABS */, "Abs " + this.displayName());
125
- }
126
- /** Round up to the nearest integer. */
127
- ceil() {
128
- return new ScalarFunctionOperation(this.cwj(), "CEILING" /* CEILING */, "Ceil " + this.displayName());
129
- }
130
- /** Round down to the nearest integer. */
131
- floor() {
132
- return new ScalarFunctionOperation(this.cwj(), "FLOOR" /* FLOOR */, "Floor " + this.displayName());
133
- }
134
- /** Square root. */
135
- sqrt() {
136
- return new ScalarFunctionOperation(this.cwj(), "SQRT" /* SQRT */, "Sqrt " + this.displayName());
137
- }
138
- /** Remainder after dividing by `n`. */
139
- mod(n) {
140
- return new ScalarFunctionOperation(this.cwj(), "MOD" /* MOD */, "Mod " + this.displayName(), n);
141
- }
142
- /** Raise to the power of `n`. */
143
- power(n) {
144
- return new ScalarFunctionOperation(this.cwj(), "POWER" /* POWER */, "Power " + this.displayName(), n);
208
+ /** Standard deviation of the values in the group: the sample one by default, `ddof = 0` for the population one, as `Series.std`. */
209
+ std(ddof = 1) {
210
+ const operator = sample(ddof) ? "STDDEV_SAMP" /* STDDEV_SAMP */ : "STDDEV_POP" /* STDDEV_POP */;
211
+ return new AggregateOperation(this.cwj(), operator, "Std " + this.displayName());
145
212
  }
146
- /** Round to `d` decimal places, or to the nearest integer when `d` is omitted. */
147
- round(d) {
148
- return new ScalarFunctionOperation(this.cwj(), "ROUND" /* ROUND */, "Round " + this.displayName(), d);
213
+ /** Variance of the values in the group: the sample one by default, `ddof = 0` for the population one, as `Series.var`. */
214
+ var(ddof = 1) {
215
+ const operator = sample(ddof) ? "VAR_SAMP" /* VAR_SAMP */ : "VAR_POP" /* VAR_POP */;
216
+ return new AggregateOperation(this.cwj(), operator, "Var " + this.displayName());
149
217
  }
150
218
  };
219
+ applyMixins(NumericAttribute, [MinMax, NumericFunctions, Arithmetic]);
151
220
  var DoubleAttribute = class extends NumericAttribute {
152
- constructor(displayName, columnName, columnDbType, owner, parent, embedded) {
153
- super(displayName, columnName, columnDbType, owner, parent, embedded);
221
+ constructor(displayName, columnName, columnDbType, owner, parent, embedded, nullable = true, optional = false) {
222
+ super(displayName, columnName, columnDbType, owner, parent, embedded, nullable, optional);
223
+ }
224
+ toConstant(value) {
225
+ return new FloatConstantOperation(Number(value));
154
226
  }
155
227
  /** Filter to rows where this attribute equals `value`. */
156
228
  eq(value) {
@@ -179,8 +251,11 @@ var DoubleAttribute = class extends NumericAttribute {
179
251
  };
180
252
  var FloatAttribute = DoubleAttribute;
181
253
  var DecimalAttribute = class extends NumericAttribute {
182
- constructor(displayName, columnName, columnDbType, owner, parent, embedded) {
183
- super(displayName, columnName, columnDbType, owner, parent, embedded);
254
+ constructor(displayName, columnName, columnDbType, owner, parent, embedded, nullable = true, optional = false) {
255
+ super(displayName, columnName, columnDbType, owner, parent, embedded, nullable, optional);
256
+ }
257
+ toConstant(value) {
258
+ return new DecimalConstantOperation(Number(value));
184
259
  }
185
260
  /** Filter to rows where this attribute equals `value`. */
186
261
  eq(value) {
@@ -208,8 +283,11 @@ var DecimalAttribute = class extends NumericAttribute {
208
283
  }
209
284
  };
210
285
  var IntegerAttribute = class extends NumericAttribute {
211
- constructor(displayName, columnName, columnDbType, owner, parent, embedded) {
212
- super(displayName, columnName, columnDbType, owner, parent, embedded);
286
+ constructor(displayName, columnName, columnDbType, owner, parent, embedded, nullable = true, optional = false) {
287
+ super(displayName, columnName, columnDbType, owner, parent, embedded, nullable, optional);
288
+ }
289
+ toConstant(value) {
290
+ return new IntegerConstantOperation(Number(value));
213
291
  }
214
292
  /** Filter to rows where this attribute equals `value`. */
215
293
  eq(value) {
@@ -237,8 +315,11 @@ var IntegerAttribute = class extends NumericAttribute {
237
315
  }
238
316
  };
239
317
  var BooleanAttribute = class extends Attribute {
240
- constructor(displayName, columnName, columnDbType, owner, parent, embedded) {
241
- super(displayName, columnName, columnDbType, owner, parent, embedded);
318
+ constructor(displayName, columnName, columnDbType, owner, parent, embedded, nullable = true, optional = false) {
319
+ super(displayName, columnName, columnDbType, owner, parent, embedded, nullable, optional);
320
+ }
321
+ toConstant(value) {
322
+ return new BooleanConstantOperation(Boolean(value));
242
323
  }
243
324
  /** Filter to rows where this attribute equals `value`. */
244
325
  eq(value) {
@@ -259,9 +340,17 @@ function parseDate(value) {
259
340
  if (isNaN(d.getTime())) throw new Error(`Cannot parse date: ${value}`);
260
341
  return d;
261
342
  }
343
+ function temporalConstant(value) {
344
+ if (typeof value === "string" && DATE_ONLY_PATTERN.test(value)) return new DateConstantOperation(new DateOnly(value));
345
+ const date = parseDate(value);
346
+ return date instanceof DateOnly ? new DateConstantOperation(date) : new DateTimeConstantOperation(date);
347
+ }
262
348
  var DateAttribute = class extends Attribute {
263
- constructor(displayName, columnName, columnDbType, owner, parent, embedded) {
264
- super(displayName, columnName, columnDbType, owner, parent, embedded);
349
+ constructor(displayName, columnName, columnDbType, owner, parent, embedded, nullable = true, optional = false) {
350
+ super(displayName, columnName, columnDbType, owner, parent, embedded, nullable, optional);
351
+ }
352
+ toConstant(value) {
353
+ return new DateConstantOperation(parseDate(value));
265
354
  }
266
355
  /** Filter to rows where this date equals `value`. */
267
356
  eq(value) {
@@ -311,6 +400,22 @@ var DateAttribute = class extends Attribute {
311
400
  dayOfWeek() {
312
401
  return new DateExtractOperation(this.cwj(), "DOW" /* DOW */, "Day Of Week " + this.displayName());
313
402
  }
403
+ /** The date of the first day of the week the date falls in (a Monday). */
404
+ firstDayOfWeek() {
405
+ return new DateTruncOperation(this.cwj(), "WEEK" /* WEEK */, "First Day Of Week " + this.displayName());
406
+ }
407
+ /** The date of the first day of the month the date falls in. */
408
+ firstDayOfMonth() {
409
+ return new DateTruncOperation(this.cwj(), "MONTH" /* MONTH */, "First Day Of Month " + this.displayName());
410
+ }
411
+ /** The date of the first day of the quarter the date falls in. */
412
+ firstDayOfQuarter() {
413
+ return new DateTruncOperation(this.cwj(), "QUARTER" /* QUARTER */, "First Day Of Quarter " + this.displayName());
414
+ }
415
+ /** The date of the first day of the year the date falls in. */
416
+ firstDayOfYear() {
417
+ return new DateTruncOperation(this.cwj(), "YEAR" /* YEAR */, "First Day Of Year " + this.displayName());
418
+ }
314
419
  /** Add `n` days to this date. */
315
420
  addDays(n) {
316
421
  return new DateArithmeticOperation(this.cwj(), n, "DAY" /* DAY */, true, "Add Days " + this.displayName());
@@ -349,32 +454,35 @@ var DateAttribute = class extends Attribute {
349
454
  }
350
455
  };
351
456
  var DateTimeAttribute = class extends Attribute {
352
- constructor(displayName, columnName, columnDbType, owner, parent, embedded) {
353
- super(displayName, columnName, columnDbType, owner, parent, embedded);
457
+ constructor(displayName, columnName, columnDbType, owner, parent, embedded, nullable = true, optional = false) {
458
+ super(displayName, columnName, columnDbType, owner, parent, embedded, nullable, optional);
459
+ }
460
+ toConstant(value) {
461
+ return temporalConstant(value);
354
462
  }
355
463
  /** Filter to rows where this timestamp equals `value`. */
356
464
  eq(value) {
357
- return new ComparisonOperation(this.cwj(), "EQUAL" /* EQUAL */, new DateTimeConstantOperation(parseDate(value)));
465
+ return new ComparisonOperation(this.cwj(), "EQUAL" /* EQUAL */, temporalConstant(value));
358
466
  }
359
467
  /** Filter to rows where this timestamp does not equal `value`. */
360
468
  ne(value) {
361
- return new ComparisonOperation(this.cwj(), "NOT_EQUAL" /* NOT_EQUAL */, new DateTimeConstantOperation(parseDate(value)));
469
+ return new ComparisonOperation(this.cwj(), "NOT_EQUAL" /* NOT_EQUAL */, temporalConstant(value));
362
470
  }
363
471
  /** Filter to rows where this timestamp is after `value`. */
364
472
  gt(value) {
365
- return new ComparisonOperation(this.cwj(), "GREATER_THAN" /* GREATER_THAN */, new DateTimeConstantOperation(parseDate(value)));
473
+ return new ComparisonOperation(this.cwj(), "GREATER_THAN" /* GREATER_THAN */, temporalConstant(value));
366
474
  }
367
475
  /** Filter to rows where this timestamp is before `value`. */
368
476
  lt(value) {
369
- return new ComparisonOperation(this.cwj(), "LESS_THAN" /* LESS_THAN */, new DateTimeConstantOperation(parseDate(value)));
477
+ return new ComparisonOperation(this.cwj(), "LESS_THAN" /* LESS_THAN */, temporalConstant(value));
370
478
  }
371
479
  /** Filter to rows where this timestamp is on or after `value`. */
372
480
  gte(value) {
373
- return new ComparisonOperation(this.cwj(), "GREATER_THAN_OR_EQUAL_TO" /* GREATER_THAN_OR_EQUAL_TO */, new DateTimeConstantOperation(parseDate(value)));
481
+ return new ComparisonOperation(this.cwj(), "GREATER_THAN_OR_EQUAL_TO" /* GREATER_THAN_OR_EQUAL_TO */, temporalConstant(value));
374
482
  }
375
483
  /** Filter to rows where this timestamp is on or before `value`. */
376
484
  lte(value) {
377
- return new ComparisonOperation(this.cwj(), "LESS_THAN_OR_EQUAL_TO" /* LESS_THAN_OR_EQUAL_TO */, new DateTimeConstantOperation(parseDate(value)));
485
+ return new ComparisonOperation(this.cwj(), "LESS_THAN_OR_EQUAL_TO" /* LESS_THAN_OR_EQUAL_TO */, temporalConstant(value));
378
486
  }
379
487
  /** Extract the four-digit calendar year. */
380
488
  year() {
@@ -412,6 +520,22 @@ var DateTimeAttribute = class extends Attribute {
412
520
  dayOfWeek() {
413
521
  return new DateExtractOperation(this.cwj(), "DOW" /* DOW */, "Day Of Week " + this.displayName());
414
522
  }
523
+ /** The date of the first day of the week the date falls in (a Monday). */
524
+ firstDayOfWeek() {
525
+ return new DateTruncOperation(this.cwj(), "WEEK" /* WEEK */, "First Day Of Week " + this.displayName());
526
+ }
527
+ /** The date of the first day of the month the date falls in. */
528
+ firstDayOfMonth() {
529
+ return new DateTruncOperation(this.cwj(), "MONTH" /* MONTH */, "First Day Of Month " + this.displayName());
530
+ }
531
+ /** The date of the first day of the quarter the date falls in. */
532
+ firstDayOfQuarter() {
533
+ return new DateTruncOperation(this.cwj(), "QUARTER" /* QUARTER */, "First Day Of Quarter " + this.displayName());
534
+ }
535
+ /** The date of the first day of the year the date falls in. */
536
+ firstDayOfYear() {
537
+ return new DateTruncOperation(this.cwj(), "YEAR" /* YEAR */, "First Day Of Year " + this.displayName());
538
+ }
415
539
  /** Add `n` days to this timestamp. */
416
540
  addDays(n) {
417
541
  return new DateArithmeticOperation(this.cwj(), n, "DAY" /* DAY */, true, "Add Days " + this.displayName());
@@ -485,8 +609,12 @@ var DateTimeAttribute = class extends Attribute {
485
609
  return new DateDiffOperation(this.cwj(), other, "SECOND" /* SECOND */, "Diff Seconds " + this.displayName());
486
610
  }
487
611
  };
612
+ applyMixins(DateAttribute, [MinMax]);
613
+ applyMixins(DateTimeAttribute, [MinMax]);
488
614
 
489
615
  export {
616
+ StringFunctionOperation,
617
+ NumericFunctionOperation,
490
618
  StringAttribute,
491
619
  NumericAttribute,
492
620
  DoubleAttribute,
@@ -497,4 +625,4 @@ export {
497
625
  DateAttribute,
498
626
  DateTimeAttribute
499
627
  };
500
- //# sourceMappingURL=chunk-4LNZV6EN.js.map
628
+ //# sourceMappingURL=chunk-MGEL5RWM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/datafinder/scalar-functions.ts","../src/datafinder/typed-attributes.ts"],"sourcesContent":["/**\n * Scalar functions as methods, shared by attributes and by the results of other functions, so they chain:\n * `f.name().toUpperCase().length()`.\n *\n * TypeScript has no multiple inheritance, so each group of functions is a class whose methods are mixed into\n * every host with `applyMixins` (the handbook's pattern), the type side being an `interface Host extends Group {}`\n * beside the host. A host provides `functionInput()` and `functionLabel()`: an attribute reads its column and is\n * labelled by its display name; a function result is itself the input and is labelled by its own name.\n */\nimport {\n ConcatOperation,\n ConcatPart,\n RelationalOperationElement,\n concat,\n ScalarFunction,\n ScalarFunctionOperation,\n applyMixins,\n} from '../model/relational';\n\n/** A function result that gives text, which has the string functions too: `f.name().toUpperCase().length()`. */\nexport class StringFunctionOperation extends ScalarFunctionOperation {\n functionInput(): RelationalOperationElement { return this; }\n functionLabel(): string { return labelOf(this); }\n}\n\n/** A function result that gives a number, which has the numeric functions too. */\nexport class NumericFunctionOperation extends ScalarFunctionOperation {\n functionInput(): RelationalOperationElement { return this; }\n functionLabel(): string { return labelOf(this); }\n}\n\nfunction labelOf(operation: ScalarFunctionOperation): string {\n return operation.displayName ?? operation.func.charAt(0) + operation.func.slice(1).toLowerCase();\n}\n\nfunction stringFunction(\n element: RelationalOperationElement, func: ScalarFunction, label: string,\n secondArg?: number, extraArgs: (string | number)[] = [],\n): StringFunctionOperation {\n return new StringFunctionOperation(element, func, label, secondArg, extraArgs);\n}\n\nfunction numberFunction(\n element: RelationalOperationElement, func: ScalarFunction, label: string, secondArg?: number,\n): NumericFunctionOperation {\n return new NumericFunctionOperation(element, func, label, secondArg);\n}\n\n/** Functions of text. */\nexport abstract class StringFunctions {\n /** @internal The expression the function applies to. */\n abstract functionInput(): RelationalOperationElement;\n /** @internal What a function of this is labelled after. */\n abstract functionLabel(): string;\n\n /** Join text on the end: `f.first().concat(' ', f.last())`. A NULL part makes the whole NULL. */\n concat(...more: ConcatPart[]): ConcatOperation {\n return concat(this as unknown as ConcatPart, ...more);\n }\n\n /** Convert every character to uppercase. */\n toUpperCase(): StringFunctionOperation {\n return stringFunction(this.functionInput(), ScalarFunction.UPPER, 'Upper ' + this.functionLabel());\n }\n /** Convert every character to lowercase. */\n toLowerCase(): StringFunctionOperation {\n return stringFunction(this.functionInput(), ScalarFunction.LOWER, 'Lower ' + this.functionLabel());\n }\n /** Remove leading and trailing whitespace. */\n trim(): StringFunctionOperation {\n return stringFunction(this.functionInput(), ScalarFunction.TRIM, 'Trim ' + this.functionLabel());\n }\n /** Remove leading whitespace. */\n trimStart(): StringFunctionOperation {\n return stringFunction(this.functionInput(), ScalarFunction.LTRIM, 'Trim Start ' + this.functionLabel());\n }\n /** Remove trailing whitespace. */\n trimEnd(): StringFunctionOperation {\n return stringFunction(this.functionInput(), ScalarFunction.RTRIM, 'Trim End ' + this.functionLabel());\n }\n /** Return the number of characters in the string. */\n length(): NumericFunctionOperation {\n return numberFunction(this.functionInput(), ScalarFunction.LENGTH, 'Length ' + this.functionLabel());\n }\n /** Return the string with characters in reverse order. */\n reverse(): StringFunctionOperation {\n return stringFunction(this.functionInput(), ScalarFunction.REVERSE, 'Reverse ' + this.functionLabel());\n }\n /** Return the first `n` characters. */\n left(n: number): StringFunctionOperation {\n return stringFunction(this.functionInput(), ScalarFunction.LEFT, 'Left ' + this.functionLabel(), n);\n }\n /** Return the last `n` characters. */\n right(n: number): StringFunctionOperation {\n return stringFunction(this.functionInput(), ScalarFunction.RIGHT, 'Right ' + this.functionLabel(), n);\n }\n /** Return the string repeated `n` times. */\n repeat(n: number): StringFunctionOperation {\n return stringFunction(this.functionInput(), ScalarFunction.REPEAT, 'Repeat ' + this.functionLabel(), n);\n }\n /** Replace all occurrences of `fromStr` with `toStr`. */\n replace(fromStr: string, toStr: string): StringFunctionOperation {\n return stringFunction(this.functionInput(), ScalarFunction.REPLACE, 'Replace ' + this.functionLabel(), undefined, [fromStr, toStr]);\n }\n /**\n * Extract a portion of the string.\n * `start` is zero-based (following Python convention); `length` is optional.\n */\n substring(start: number, length?: number): StringFunctionOperation {\n // Python convention: 0-based start; SQL SUBSTRING is 1-based, so add 1\n const args = length !== undefined ? [start + 1, length] : [start + 1];\n return stringFunction(this.functionInput(), ScalarFunction.SUBSTRING, 'Substring ' + this.functionLabel(), undefined, args);\n }\n}\n\n/** Functions of a number. */\nexport abstract class NumericFunctions {\n /** @internal The expression the function applies to. */\n abstract functionInput(): RelationalOperationElement;\n /** @internal What a function of this is labelled after. */\n abstract functionLabel(): string;\n\n /** Absolute value (distance from zero, always non-negative). */\n abs(): NumericFunctionOperation {\n return numberFunction(this.functionInput(), ScalarFunction.ABS, 'Abs ' + this.functionLabel());\n }\n /** Round up to the nearest integer. */\n ceil(): NumericFunctionOperation {\n return numberFunction(this.functionInput(), ScalarFunction.CEILING, 'Ceil ' + this.functionLabel());\n }\n /** Round down to the nearest integer. */\n floor(): NumericFunctionOperation {\n return numberFunction(this.functionInput(), ScalarFunction.FLOOR, 'Floor ' + this.functionLabel());\n }\n /** Square root. */\n sqrt(): NumericFunctionOperation {\n return numberFunction(this.functionInput(), ScalarFunction.SQRT, 'Sqrt ' + this.functionLabel());\n }\n /** Remainder after dividing by `n`. */\n mod(n: number): NumericFunctionOperation {\n return numberFunction(this.functionInput(), ScalarFunction.MOD, 'Mod ' + this.functionLabel(), n);\n }\n /** Raise to the power of `n`. */\n power(n: number): NumericFunctionOperation {\n return numberFunction(this.functionInput(), ScalarFunction.POWER, 'Power ' + this.functionLabel(), n);\n }\n /** Round to `d` decimal places, or to the nearest integer when `d` is omitted. */\n round(d?: number): NumericFunctionOperation {\n return numberFunction(this.functionInput(), ScalarFunction.ROUND, 'Round ' + this.functionLabel(), d);\n }\n}\n\nexport interface StringFunctionOperation extends StringFunctions {}\napplyMixins(StringFunctionOperation, [StringFunctions]);\n\nexport interface NumericFunctionOperation extends NumericFunctions {}\napplyMixins(NumericFunctionOperation, [NumericFunctions]);\n","import { Attribute, AttributeValue } from './attribute';\nimport { NumericFunctions, StringFunctions } from './scalar-functions';\nimport {\n ComparisonOperation,\n ComparisonOperator,\n StringConstantOperation,\n FloatConstantOperation,\n IntegerConstantOperation,\n DateConstantOperation,\n DateTimeConstantOperation,\n ConstantOperation,\n DateOnly,\n escapeLike,\n applyMixins,\n Arithmetic,\n DATE_ONLY_PATTERN,\n BooleanConstantOperation,\n DecimalConstantOperation,\n AggregateOperation,\n AggregateOperator,\n SortOperation,\n ScalarFunction,\n ScalarFunctionOperation,\n DatePart,\n DateExtractOperation,\n DateTruncOperation,\n DateArithmeticOperation,\n DateDiffOperation,\n JoinTreeNodeOperation,\n ColumnWithJoin,\n sample,\n} from '../model/relational';\n\n/** The smallest and largest value of a group, for a column that can be ordered but not summed. */\nabstract class MinMax {\n abstract cwj(): ColumnWithJoin;\n abstract displayName(): string;\n\n /** Smallest value in the group. */\n min(): AggregateOperation {\n return new AggregateOperation(this.cwj(), AggregateOperator.MIN, 'Min ' + this.displayName());\n }\n /** Largest value in the group. */\n max(): AggregateOperation {\n return new AggregateOperation(this.cwj(), AggregateOperator.MAX, 'Max ' + this.displayName());\n }\n}\n\nexport class StringAttribute extends Attribute {\n constructor(\n displayName: string,\n columnName: string,\n columnDbType: string,\n owner: string,\n parent?: JoinTreeNodeOperation,\n embedded?: Attribute,\n nullable: boolean = true,\n optional: boolean = false,\n ) { super(displayName, columnName, columnDbType, owner, parent, embedded, nullable, optional); }\n\n protected toConstant(value: AttributeValue): ConstantOperation {\n return new StringConstantOperation(String(value));\n }\n\n /**\n * Join the values of a group into one text with `separator` between them. `orderBy` is the order they are\n * joined in (`[f.name().ascending()]`); without it the order is not defined. Missing values are skipped.\n */\n join(separator: string = '', orderBy: SortOperation[] = []): AggregateOperation {\n return new AggregateOperation(this.cwj(), AggregateOperator.STRING_AGG, 'Join ' + this.displayName(), undefined, separator, orderBy);\n }\n\n /** Filter to rows where this attribute equals `value`. */\n eq(value: string): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.EQUAL, new StringConstantOperation(value));\n }\n /** Filter to rows where this attribute does not equal `value`. */\n ne(value: string): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.NOT_EQUAL, new StringConstantOperation(value));\n }\n /** Filter to rows where this attribute contains `value` as a substring. */\n contains(value: string): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.LIKE, new StringConstantOperation(`%${escapeLike(value)}%`));\n }\n /** Filter to rows where this attribute begins with `prefix`. */\n startsWith(prefix: string): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.LIKE, new StringConstantOperation(`${escapeLike(prefix)}%`));\n }\n /** Filter to rows where this attribute ends with `suffix`. */\n endsWith(suffix: string): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.LIKE, new StringConstantOperation(`%${escapeLike(suffix)}`));\n }\n /** Filter to rows where this attribute does not contain `value` as a substring. */\n notContains(value: string): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.NOT_LIKE, new StringConstantOperation(`%${escapeLike(value)}%`));\n }\n}\n\nexport interface StringAttribute extends MinMax, StringFunctions {}\napplyMixins(StringAttribute, [MinMax, StringFunctions]);\n\nexport abstract class NumericAttribute extends Attribute {\n constructor(\n displayName: string,\n columnName: string,\n columnDbType: string,\n owner: string,\n parent?: JoinTreeNodeOperation,\n embedded?: Attribute,\n nullable: boolean = true,\n optional: boolean = false,\n ) { super(displayName, columnName, columnDbType, owner, parent, embedded, nullable, optional); }\n\n /** Sum of all values in the group. */\n sum(): AggregateOperation {\n return new AggregateOperation(this.cwj(), AggregateOperator.SUM, 'Sum ' + this.displayName());\n }\n /** Arithmetic mean of all values in the group. */\n average(): AggregateOperation {\n return new AggregateOperation(this.cwj(), AggregateOperator.AVERAGE, 'Average ' + this.displayName());\n }\n /** Standard deviation of the values in the group: the sample one by default, `ddof = 0` for the population one, as `Series.std`. */\n std(ddof = 1): AggregateOperation {\n const operator = sample(ddof) ? AggregateOperator.STDDEV_SAMP : AggregateOperator.STDDEV_POP;\n return new AggregateOperation(this.cwj(), operator, 'Std ' + this.displayName());\n }\n /** Variance of the values in the group: the sample one by default, `ddof = 0` for the population one, as `Series.var`. */\n var(ddof = 1): AggregateOperation {\n const operator = sample(ddof) ? AggregateOperator.VAR_SAMP : AggregateOperator.VAR_POP;\n return new AggregateOperation(this.cwj(), operator, 'Var ' + this.displayName());\n }\n}\n\nexport interface NumericAttribute extends MinMax, NumericFunctions, Arithmetic {}\napplyMixins(NumericAttribute, [MinMax, NumericFunctions, Arithmetic]);\n\nexport class DoubleAttribute extends NumericAttribute {\n constructor(\n displayName: string,\n columnName: string,\n columnDbType: string,\n owner: string,\n parent?: JoinTreeNodeOperation,\n embedded?: Attribute,\n nullable: boolean = true,\n optional: boolean = false,\n ) { super(displayName, columnName, columnDbType, owner, parent, embedded, nullable, optional); }\n\n protected toConstant(value: AttributeValue): ConstantOperation {\n return new FloatConstantOperation(Number(value));\n }\n\n /** Filter to rows where this attribute equals `value`. */\n eq(value: number): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.EQUAL, new FloatConstantOperation(value));\n }\n /** Filter to rows where this attribute does not equal `value`. */\n ne(value: number): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.NOT_EQUAL, new FloatConstantOperation(value));\n }\n /** Filter to rows where this attribute is greater than `value`. */\n gt(value: number): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.GREATER_THAN, new FloatConstantOperation(value));\n }\n /** Filter to rows where this attribute is less than `value`. */\n lt(value: number): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.LESS_THAN, new FloatConstantOperation(value));\n }\n /** Filter to rows where this attribute is greater than or equal to `value`. */\n gte(value: number): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.GREATER_THAN_OR_EQUAL_TO, new FloatConstantOperation(value));\n }\n /** Filter to rows where this attribute is less than or equal to `value`. */\n lte(value: number): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.LESS_THAN_OR_EQUAL_TO, new FloatConstantOperation(value));\n }\n}\n\nexport const FloatAttribute = DoubleAttribute;\nexport type FloatAttribute = DoubleAttribute;\n\nexport class DecimalAttribute extends NumericAttribute {\n constructor(\n displayName: string,\n columnName: string,\n columnDbType: string,\n owner: string,\n parent?: JoinTreeNodeOperation,\n embedded?: Attribute,\n nullable: boolean = true,\n optional: boolean = false,\n ) { super(displayName, columnName, columnDbType, owner, parent, embedded, nullable, optional); }\n\n protected toConstant(value: AttributeValue): ConstantOperation {\n return new DecimalConstantOperation(Number(value));\n }\n\n /** Filter to rows where this attribute equals `value`. */\n eq(value: number): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.EQUAL, new DecimalConstantOperation(value));\n }\n /** Filter to rows where this attribute does not equal `value`. */\n ne(value: number): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.NOT_EQUAL, new DecimalConstantOperation(value));\n }\n /** Filter to rows where this attribute is greater than `value`. */\n gt(value: number): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.GREATER_THAN, new DecimalConstantOperation(value));\n }\n /** Filter to rows where this attribute is less than `value`. */\n lt(value: number): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.LESS_THAN, new DecimalConstantOperation(value));\n }\n /** Filter to rows where this attribute is greater than or equal to `value`. */\n gte(value: number): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.GREATER_THAN_OR_EQUAL_TO, new DecimalConstantOperation(value));\n }\n /** Filter to rows where this attribute is less than or equal to `value`. */\n lte(value: number): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.LESS_THAN_OR_EQUAL_TO, new DecimalConstantOperation(value));\n }\n}\n\nexport class IntegerAttribute extends NumericAttribute {\n constructor(\n displayName: string,\n columnName: string,\n columnDbType: string,\n owner: string,\n parent?: JoinTreeNodeOperation,\n embedded?: Attribute,\n nullable: boolean = true,\n optional: boolean = false,\n ) { super(displayName, columnName, columnDbType, owner, parent, embedded, nullable, optional); }\n\n protected toConstant(value: AttributeValue): ConstantOperation {\n return new IntegerConstantOperation(Number(value));\n }\n\n /** Filter to rows where this attribute equals `value`. */\n eq(value: number): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.EQUAL, new IntegerConstantOperation(value));\n }\n /** Filter to rows where this attribute does not equal `value`. */\n ne(value: number): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.NOT_EQUAL, new IntegerConstantOperation(value));\n }\n /** Filter to rows where this attribute is greater than `value`. */\n gt(value: number): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.GREATER_THAN, new IntegerConstantOperation(value));\n }\n /** Filter to rows where this attribute is less than `value`. */\n lt(value: number): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.LESS_THAN, new IntegerConstantOperation(value));\n }\n /** Filter to rows where this attribute is greater than or equal to `value`. */\n gte(value: number): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.GREATER_THAN_OR_EQUAL_TO, new IntegerConstantOperation(value));\n }\n /** Filter to rows where this attribute is less than or equal to `value`. */\n lte(value: number): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.LESS_THAN_OR_EQUAL_TO, new IntegerConstantOperation(value));\n }\n}\n\nexport class BooleanAttribute extends Attribute {\n constructor(\n displayName: string,\n columnName: string,\n columnDbType: string,\n owner: string,\n parent?: JoinTreeNodeOperation,\n embedded?: Attribute,\n nullable: boolean = true,\n optional: boolean = false,\n ) { super(displayName, columnName, columnDbType, owner, parent, embedded, nullable, optional); }\n\n protected toConstant(value: AttributeValue): ConstantOperation {\n return new BooleanConstantOperation(Boolean(value));\n }\n\n /** Filter to rows where this attribute equals `value`. */\n eq(value: boolean): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.EQUAL, new BooleanConstantOperation(value));\n }\n /** Filter to rows where this attribute is true. */\n isTrue(): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.EQUAL, new BooleanConstantOperation(true));\n }\n /** Filter to rows where this attribute is false. */\n isFalse(): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.EQUAL, new BooleanConstantOperation(false));\n }\n}\n\nfunction parseDate(value: Date | string): Date {\n if (value instanceof Date) return value;\n const d = new Date(value);\n if (isNaN(d.getTime())) throw new Error(`Cannot parse date: ${value}`);\n return d;\n}\n\n/**\n * A timestamp comparison value: a `DateOnly` (or a `YYYY-MM-DD` string) is a date literal,\n * any other `Date` or string a timestamp literal.\n */\nfunction temporalConstant(value: Date | string): DateConstantOperation | DateTimeConstantOperation {\n if (typeof value === 'string' && DATE_ONLY_PATTERN.test(value)) return new DateConstantOperation(new DateOnly(value));\n const date = parseDate(value);\n return date instanceof DateOnly ? new DateConstantOperation(date) : new DateTimeConstantOperation(date);\n}\n\nexport class DateAttribute extends Attribute {\n constructor(\n displayName: string,\n columnName: string,\n columnDbType: string,\n owner: string,\n parent?: JoinTreeNodeOperation,\n embedded?: Attribute,\n nullable: boolean = true,\n optional: boolean = false,\n ) { super(displayName, columnName, columnDbType, owner, parent, embedded, nullable, optional); }\n\n protected toConstant(value: AttributeValue): ConstantOperation {\n return new DateConstantOperation(parseDate(value as Date | string));\n }\n\n /** Filter to rows where this date equals `value`. */\n eq(value: Date | string): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.EQUAL, new DateConstantOperation(parseDate(value)));\n }\n /** Filter to rows where this date does not equal `value`. */\n ne(value: Date | string): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.NOT_EQUAL, new DateConstantOperation(parseDate(value)));\n }\n /** Filter to rows where this date is after `value`. */\n gt(value: Date | string): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.GREATER_THAN, new DateConstantOperation(parseDate(value)));\n }\n /** Filter to rows where this date is before `value`. */\n lt(value: Date | string): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.LESS_THAN, new DateConstantOperation(parseDate(value)));\n }\n /** Filter to rows where this date is on or after `value`. */\n gte(value: Date | string): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.GREATER_THAN_OR_EQUAL_TO, new DateConstantOperation(parseDate(value)));\n }\n /** Filter to rows where this date is on or before `value`. */\n lte(value: Date | string): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.LESS_THAN_OR_EQUAL_TO, new DateConstantOperation(parseDate(value)));\n }\n\n /** Extract the four-digit calendar year. */\n year(): DateExtractOperation { return new DateExtractOperation(this.cwj(), DatePart.YEAR, 'Year ' + this.displayName()); }\n /** Extract the month number (1–12). */\n month(): DateExtractOperation { return new DateExtractOperation(this.cwj(), DatePart.MONTH, 'Month ' + this.displayName()); }\n /** Extract the day of the month (1–31). */\n day(): DateExtractOperation { return new DateExtractOperation(this.cwj(), DatePart.DAY, 'Day ' + this.displayName()); }\n /** Extract the quarter (1–4). */\n quarter(): DateExtractOperation { return new DateExtractOperation(this.cwj(), DatePart.QUARTER, 'Quarter ' + this.displayName()); }\n /** Extract the ISO week number (1–53). */\n week(): DateExtractOperation { return new DateExtractOperation(this.cwj(), DatePart.WEEK, 'Week ' + this.displayName()); }\n /** Extract the day of the week (0 = Sunday through 6 = Saturday). */\n dayOfWeek(): DateExtractOperation { return new DateExtractOperation(this.cwj(), DatePart.DOW, 'Day Of Week ' + this.displayName()); }\n /** The date of the first day of the week the date falls in (a Monday). */\n firstDayOfWeek(): DateTruncOperation { return new DateTruncOperation(this.cwj(), DatePart.WEEK, 'First Day Of Week ' + this.displayName()); }\n /** The date of the first day of the month the date falls in. */\n firstDayOfMonth(): DateTruncOperation { return new DateTruncOperation(this.cwj(), DatePart.MONTH, 'First Day Of Month ' + this.displayName()); }\n /** The date of the first day of the quarter the date falls in. */\n firstDayOfQuarter(): DateTruncOperation { return new DateTruncOperation(this.cwj(), DatePart.QUARTER, 'First Day Of Quarter ' + this.displayName()); }\n /** The date of the first day of the year the date falls in. */\n firstDayOfYear(): DateTruncOperation { return new DateTruncOperation(this.cwj(), DatePart.YEAR, 'First Day Of Year ' + this.displayName()); }\n\n /** Add `n` days to this date. */\n addDays(n: number): DateArithmeticOperation { return new DateArithmeticOperation(this.cwj(), n, DatePart.DAY, true, 'Add Days ' + this.displayName()); }\n /** Add `n` months to this date. */\n addMonths(n: number): DateArithmeticOperation { return new DateArithmeticOperation(this.cwj(), n, DatePart.MONTH, true, 'Add Months ' + this.displayName()); }\n /** Add `n` years to this date. */\n addYears(n: number): DateArithmeticOperation { return new DateArithmeticOperation(this.cwj(), n, DatePart.YEAR, true, 'Add Years ' + this.displayName()); }\n /** Subtract `n` days from this date. */\n subtractDays(n: number): DateArithmeticOperation { return new DateArithmeticOperation(this.cwj(), n, DatePart.DAY, false, 'Subtract Days ' + this.displayName()); }\n /** Subtract `n` months from this date. */\n subtractMonths(n: number): DateArithmeticOperation { return new DateArithmeticOperation(this.cwj(), n, DatePart.MONTH, false, 'Subtract Months ' + this.displayName()); }\n /** Subtract `n` years from this date. */\n subtractYears(n: number): DateArithmeticOperation { return new DateArithmeticOperation(this.cwj(), n, DatePart.YEAR, false, 'Subtract Years ' + this.displayName()); }\n\n /** Number of whole days between this date and `other`. */\n diffDays(other: Date): DateDiffOperation { return new DateDiffOperation(this.cwj(), other, DatePart.DAY, 'Diff Days ' + this.displayName()); }\n /** Number of whole months between this date and `other`. */\n diffMonths(other: Date): DateDiffOperation { return new DateDiffOperation(this.cwj(), other, DatePart.MONTH, 'Diff Months ' + this.displayName()); }\n /** Number of whole years between this date and `other`. */\n diffYears(other: Date): DateDiffOperation { return new DateDiffOperation(this.cwj(), other, DatePart.YEAR, 'Diff Years ' + this.displayName()); }\n}\n\nexport class DateTimeAttribute extends Attribute {\n constructor(\n displayName: string,\n columnName: string,\n columnDbType: string,\n owner: string,\n parent?: JoinTreeNodeOperation,\n embedded?: Attribute,\n nullable: boolean = true,\n optional: boolean = false,\n ) { super(displayName, columnName, columnDbType, owner, parent, embedded, nullable, optional); }\n\n protected toConstant(value: AttributeValue): ConstantOperation {\n return temporalConstant(value as Date | string);\n }\n\n /** Filter to rows where this timestamp equals `value`. */\n eq(value: Date | string): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.EQUAL, temporalConstant(value));\n }\n /** Filter to rows where this timestamp does not equal `value`. */\n ne(value: Date | string): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.NOT_EQUAL, temporalConstant(value));\n }\n /** Filter to rows where this timestamp is after `value`. */\n gt(value: Date | string): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.GREATER_THAN, temporalConstant(value));\n }\n /** Filter to rows where this timestamp is before `value`. */\n lt(value: Date | string): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.LESS_THAN, temporalConstant(value));\n }\n /** Filter to rows where this timestamp is on or after `value`. */\n gte(value: Date | string): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.GREATER_THAN_OR_EQUAL_TO, temporalConstant(value));\n }\n /** Filter to rows where this timestamp is on or before `value`. */\n lte(value: Date | string): ComparisonOperation {\n return new ComparisonOperation(this.cwj(), ComparisonOperator.LESS_THAN_OR_EQUAL_TO, temporalConstant(value));\n }\n\n /** Extract the four-digit calendar year. */\n year(): DateExtractOperation { return new DateExtractOperation(this.cwj(), DatePart.YEAR, 'Year ' + this.displayName()); }\n /** Extract the month number (1–12). */\n month(): DateExtractOperation { return new DateExtractOperation(this.cwj(), DatePart.MONTH, 'Month ' + this.displayName()); }\n /** Extract the day of the month (1–31). */\n day(): DateExtractOperation { return new DateExtractOperation(this.cwj(), DatePart.DAY, 'Day ' + this.displayName()); }\n /** Extract the hour (0–23). */\n hour(): DateExtractOperation { return new DateExtractOperation(this.cwj(), DatePart.HOUR, 'Hour ' + this.displayName()); }\n /** Extract the minute (0–59). */\n minute(): DateExtractOperation { return new DateExtractOperation(this.cwj(), DatePart.MINUTE, 'Minute ' + this.displayName()); }\n /** Extract the second (0–59). */\n second(): DateExtractOperation { return new DateExtractOperation(this.cwj(), DatePart.SECOND, 'Second ' + this.displayName()); }\n /** Extract the quarter (1–4). */\n quarter(): DateExtractOperation { return new DateExtractOperation(this.cwj(), DatePart.QUARTER, 'Quarter ' + this.displayName()); }\n /** Extract the ISO week number (1–53). */\n week(): DateExtractOperation { return new DateExtractOperation(this.cwj(), DatePart.WEEK, 'Week ' + this.displayName()); }\n /** Extract the day of the week (0 = Sunday through 6 = Saturday). */\n dayOfWeek(): DateExtractOperation { return new DateExtractOperation(this.cwj(), DatePart.DOW, 'Day Of Week ' + this.displayName()); }\n /** The date of the first day of the week the date falls in (a Monday). */\n firstDayOfWeek(): DateTruncOperation { return new DateTruncOperation(this.cwj(), DatePart.WEEK, 'First Day Of Week ' + this.displayName()); }\n /** The date of the first day of the month the date falls in. */\n firstDayOfMonth(): DateTruncOperation { return new DateTruncOperation(this.cwj(), DatePart.MONTH, 'First Day Of Month ' + this.displayName()); }\n /** The date of the first day of the quarter the date falls in. */\n firstDayOfQuarter(): DateTruncOperation { return new DateTruncOperation(this.cwj(), DatePart.QUARTER, 'First Day Of Quarter ' + this.displayName()); }\n /** The date of the first day of the year the date falls in. */\n firstDayOfYear(): DateTruncOperation { return new DateTruncOperation(this.cwj(), DatePart.YEAR, 'First Day Of Year ' + this.displayName()); }\n\n /** Add `n` days to this timestamp. */\n addDays(n: number): DateArithmeticOperation { return new DateArithmeticOperation(this.cwj(), n, DatePart.DAY, true, 'Add Days ' + this.displayName()); }\n /** Add `n` months to this timestamp. */\n addMonths(n: number): DateArithmeticOperation { return new DateArithmeticOperation(this.cwj(), n, DatePart.MONTH, true, 'Add Months ' + this.displayName()); }\n /** Add `n` years to this timestamp. */\n addYears(n: number): DateArithmeticOperation { return new DateArithmeticOperation(this.cwj(), n, DatePart.YEAR, true, 'Add Years ' + this.displayName()); }\n /** Add `n` hours to this timestamp. */\n addHours(n: number): DateArithmeticOperation { return new DateArithmeticOperation(this.cwj(), n, DatePart.HOUR, true, 'Add Hours ' + this.displayName()); }\n /** Add `n` minutes to this timestamp. */\n addMinutes(n: number): DateArithmeticOperation { return new DateArithmeticOperation(this.cwj(), n, DatePart.MINUTE, true, 'Add Minutes ' + this.displayName()); }\n /** Add `n` seconds to this timestamp. */\n addSeconds(n: number): DateArithmeticOperation { return new DateArithmeticOperation(this.cwj(), n, DatePart.SECOND, true, 'Add Seconds ' + this.displayName()); }\n /** Subtract `n` days from this timestamp. */\n subtractDays(n: number): DateArithmeticOperation { return new DateArithmeticOperation(this.cwj(), n, DatePart.DAY, false, 'Subtract Days ' + this.displayName()); }\n /** Subtract `n` months from this timestamp. */\n subtractMonths(n: number): DateArithmeticOperation { return new DateArithmeticOperation(this.cwj(), n, DatePart.MONTH, false, 'Subtract Months ' + this.displayName()); }\n /** Subtract `n` years from this timestamp. */\n subtractYears(n: number): DateArithmeticOperation { return new DateArithmeticOperation(this.cwj(), n, DatePart.YEAR, false, 'Subtract Years ' + this.displayName()); }\n /** Subtract `n` hours from this timestamp. */\n subtractHours(n: number): DateArithmeticOperation { return new DateArithmeticOperation(this.cwj(), n, DatePart.HOUR, false, 'Subtract Hours ' + this.displayName()); }\n /** Subtract `n` minutes from this timestamp. */\n subtractMinutes(n: number): DateArithmeticOperation { return new DateArithmeticOperation(this.cwj(), n, DatePart.MINUTE, false, 'Subtract Minutes ' + this.displayName()); }\n /** Subtract `n` seconds from this timestamp. */\n subtractSeconds(n: number): DateArithmeticOperation { return new DateArithmeticOperation(this.cwj(), n, DatePart.SECOND, false, 'Subtract Seconds ' + this.displayName()); }\n\n /** Number of whole days between this timestamp and `other`. */\n diffDays(other: Date): DateDiffOperation { return new DateDiffOperation(this.cwj(), other, DatePart.DAY, 'Diff Days ' + this.displayName()); }\n /** Number of whole months between this timestamp and `other`. */\n diffMonths(other: Date): DateDiffOperation { return new DateDiffOperation(this.cwj(), other, DatePart.MONTH, 'Diff Months ' + this.displayName()); }\n /** Number of whole years between this timestamp and `other`. */\n diffYears(other: Date): DateDiffOperation { return new DateDiffOperation(this.cwj(), other, DatePart.YEAR, 'Diff Years ' + this.displayName()); }\n /** Number of whole hours between this timestamp and `other`. */\n diffHours(other: Date): DateDiffOperation { return new DateDiffOperation(this.cwj(), other, DatePart.HOUR, 'Diff Hours ' + this.displayName()); }\n /** Number of whole minutes between this timestamp and `other`. */\n diffMinutes(other: Date): DateDiffOperation { return new DateDiffOperation(this.cwj(), other, DatePart.MINUTE, 'Diff Minutes ' + this.displayName()); }\n /** Number of whole seconds between this timestamp and `other`. */\n diffSeconds(other: Date): DateDiffOperation { return new DateDiffOperation(this.cwj(), other, DatePart.SECOND, 'Diff Seconds ' + this.displayName()); }\n}\n\nexport interface DateAttribute extends MinMax {}\napplyMixins(DateAttribute, [MinMax]);\n\nexport interface DateTimeAttribute extends MinMax {}\napplyMixins(DateTimeAttribute, [MinMax]);\n"],"mappings":"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","names":[]}