squirreling 0.12.14 → 0.12.15
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.
- package/README.md +2 -2
- package/package.json +1 -1
- package/src/expression/evaluate.js +18 -1
- package/src/types.d.ts +1 -1
- package/src/validation/functions.js +4 -1
package/README.md
CHANGED
|
@@ -154,13 +154,13 @@ Squirreling mostly follows the SQL standard. The following features are supporte
|
|
|
154
154
|
|
|
155
155
|
### Functions
|
|
156
156
|
|
|
157
|
-
- Aggregate: `COUNT`, `SUM`, `AVG`, `MIN`, `MAX`, `MEDIAN`, `PERCENTILE_CONT`, `APPROX_QUANTILE`, `STDDEV_POP`, `STDDEV_SAMP`, `ARRAY_AGG`, `JSON_ARRAYAGG`, `STRING_AGG`
|
|
157
|
+
- Aggregate: `COUNT`, `COUNTIF`, `SUM`, `AVG`, `MIN`, `MAX`, `MEDIAN`, `PERCENTILE_CONT`, `APPROX_QUANTILE`, `STDDEV_POP`, `STDDEV_SAMP`, `ARRAY_AGG`, `JSON_ARRAYAGG`, `STRING_AGG`
|
|
158
158
|
- String: `CONCAT`, `SUBSTRING`, `REPLACE`, `LENGTH`, `UPPER`, `LOWER`, `TRIM`, `LEFT`, `RIGHT`, `INSTR`, `POSITION`, `STRPOS`
|
|
159
159
|
- Math: `ABS`, `SIGN`, `CEIL`, `FLOOR`, `ROUND`, `MOD`, `RAND`, `RANDOM`, `LN`, `LOG10`, `EXP`, `POWER`, `SQRT`
|
|
160
160
|
- Trig: `SIN`, `COS`, `TAN`, `COT`, `ASIN`, `ACOS`, `ATAN`, `ATAN2`, `DEGREES`, `RADIANS`, `PI`
|
|
161
161
|
- Date: `CURRENT_DATE`, `CURRENT_TIME`, `CURRENT_TIMESTAMP`, `DATE_PART`, `DATE_TRUNC`, `EXTRACT`, `INTERVAL`
|
|
162
162
|
- Json: `JSON_VALUE`, `JSON_QUERY`, `JSON_EXTRACT`, `JSON_OBJECT`, `JSON_ARRAY_LENGTH`, `JSON_VALID`, `JSON_TYPE`
|
|
163
|
-
- Array: `ARRAY_LENGTH`, `ARRAY_POSITION`, `ARRAY_SORT`, `CARDINALITY`
|
|
163
|
+
- Array: `ARRAY_LENGTH`, `ARRAY_POSITION`, `ARRAY_CONTAINS`, `ARRAY_SORT`, `CARDINALITY`, `SIZE`
|
|
164
164
|
- Table functions: `UNNEST`, `EXPLODE`, `JSON_EACH`
|
|
165
165
|
- Regex: `REGEXP_SUBSTR`, `REGEXP_EXTRACT`, `REGEXP_REPLACE`, `REGEXP_MATCHES`
|
|
166
166
|
- Spatial: `ST_GeomFromText`, `ST_MakeEnvelope`, `ST_AsText`, `ST_Intersects`, `ST_Contains`, `ST_ContainsProperly`, `ST_Within`, `ST_Overlaps`, `ST_Touches`, `ST_Equals`, `ST_Crosses`, `ST_Covers`, `ST_CoveredBy`, `ST_DWithin`
|
package/package.json
CHANGED
|
@@ -208,6 +208,17 @@ export async function evaluateExpr({ node, row, rowIndex, rows, context }) {
|
|
|
208
208
|
return count
|
|
209
209
|
}
|
|
210
210
|
|
|
211
|
+
if (funcName === 'COUNTIF') {
|
|
212
|
+
const values = await Promise.all(filteredRows.map(row =>
|
|
213
|
+
evaluateExpr({ node: argNode, row, context })
|
|
214
|
+
))
|
|
215
|
+
let count = 0
|
|
216
|
+
for (const v of values) {
|
|
217
|
+
if (v) count++
|
|
218
|
+
}
|
|
219
|
+
return count
|
|
220
|
+
}
|
|
221
|
+
|
|
211
222
|
if (funcName === 'SUM' || funcName === 'AVG' || funcName === 'MIN' || funcName === 'MAX') {
|
|
212
223
|
const rawValues = await Promise.all(filteredRows.map(row =>
|
|
213
224
|
evaluateExpr({ node: argNode, row, context })
|
|
@@ -497,7 +508,7 @@ export async function evaluateExpr({ node, row, rowIndex, rows, context }) {
|
|
|
497
508
|
return arr.length
|
|
498
509
|
}
|
|
499
510
|
|
|
500
|
-
if (funcName === 'ARRAY_LENGTH' || funcName === 'CARDINALITY') {
|
|
511
|
+
if (funcName === 'ARRAY_LENGTH' || funcName === 'CARDINALITY' || funcName === 'SIZE') {
|
|
501
512
|
const arr = args[0]
|
|
502
513
|
if (!Array.isArray(arr)) return null
|
|
503
514
|
if (funcName === 'ARRAY_LENGTH' && args.length === 2) {
|
|
@@ -527,6 +538,12 @@ export async function evaluateExpr({ node, row, rowIndex, rows, context }) {
|
|
|
527
538
|
return index === -1 ? null : index + 1
|
|
528
539
|
}
|
|
529
540
|
|
|
541
|
+
if (funcName === 'ARRAY_CONTAINS') {
|
|
542
|
+
const [arr, target] = args
|
|
543
|
+
if (!Array.isArray(arr)) return null
|
|
544
|
+
return arr.includes(target)
|
|
545
|
+
}
|
|
546
|
+
|
|
530
547
|
if (funcName === 'ARRAY_SORT') {
|
|
531
548
|
const arr = args[0]
|
|
532
549
|
if (!Array.isArray(arr)) return null
|
package/src/types.d.ts
CHANGED
|
@@ -129,7 +129,7 @@ export interface UserDefinedFunction {
|
|
|
129
129
|
arguments: FunctionSignature
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
-
export type AggregateFunc = 'COUNT' | 'SUM' | 'AVG' | 'MIN' | 'MAX' | 'ARRAY_AGG' | 'JSON_ARRAYAGG' | 'STDDEV_SAMP' | 'STDDEV_POP' | 'MEDIAN' | 'PERCENTILE_CONT' | 'APPROX_QUANTILE' | 'STRING_AGG'
|
|
132
|
+
export type AggregateFunc = 'COUNT' | 'COUNTIF' | 'SUM' | 'AVG' | 'MIN' | 'MAX' | 'ARRAY_AGG' | 'JSON_ARRAYAGG' | 'STDDEV_SAMP' | 'STDDEV_POP' | 'MEDIAN' | 'PERCENTILE_CONT' | 'APPROX_QUANTILE' | 'STRING_AGG'
|
|
133
133
|
|
|
134
134
|
export type RegExpFunction = 'REGEXP_SUBSTR' | 'REGEXP_EXTRACT' | 'REGEXP_REPLACE' | 'REGEXP_MATCHES'
|
|
135
135
|
|
|
@@ -11,7 +11,7 @@ export const niladicFuncs = ['CURRENT_DATE', 'CURRENT_TIME', 'CURRENT_TIMESTAMP'
|
|
|
11
11
|
* @returns {name is AggregateFunc}
|
|
12
12
|
*/
|
|
13
13
|
export function isAggregateFunc(name) {
|
|
14
|
-
return ['COUNT', 'SUM', 'AVG', 'MIN', 'MAX', 'ARRAY_AGG', 'JSON_ARRAYAGG', 'STDDEV_SAMP', 'STDDEV_POP', 'MEDIAN', 'PERCENTILE_CONT', 'APPROX_QUANTILE', 'STRING_AGG'].includes(name)
|
|
14
|
+
return ['COUNT', 'COUNTIF', 'SUM', 'AVG', 'MIN', 'MAX', 'ARRAY_AGG', 'JSON_ARRAYAGG', 'STDDEV_SAMP', 'STDDEV_POP', 'MEDIAN', 'PERCENTILE_CONT', 'APPROX_QUANTILE', 'STRING_AGG'].includes(name)
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
/**
|
|
@@ -182,8 +182,10 @@ export const FUNCTION_SIGNATURES = {
|
|
|
182
182
|
// Array functions
|
|
183
183
|
ARRAY_LENGTH: { min: 1, max: 2, signature: 'array[, dimension]' },
|
|
184
184
|
ARRAY_POSITION: { min: 2, max: 2, signature: 'array, element' },
|
|
185
|
+
ARRAY_CONTAINS: { min: 2, max: 2, signature: 'array, element' },
|
|
185
186
|
ARRAY_SORT: { min: 1, max: 1, signature: 'array' },
|
|
186
187
|
CARDINALITY: { min: 1, max: 1, signature: 'array' },
|
|
188
|
+
SIZE: { min: 1, max: 1, signature: 'array' },
|
|
187
189
|
|
|
188
190
|
// Table functions (used in FROM clause)
|
|
189
191
|
UNNEST: { min: 1, max: 1, signature: 'array' },
|
|
@@ -198,6 +200,7 @@ export const FUNCTION_SIGNATURES = {
|
|
|
198
200
|
|
|
199
201
|
// Aggregate functions
|
|
200
202
|
COUNT: { min: 1, max: 1, signature: 'expression' },
|
|
203
|
+
COUNTIF: { min: 1, max: 1, signature: 'condition' },
|
|
201
204
|
SUM: { min: 1, max: 1, signature: 'expression' },
|
|
202
205
|
AVG: { min: 1, max: 1, signature: 'expression' },
|
|
203
206
|
MIN: { min: 1, max: 1, signature: 'expression' },
|