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 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "squirreling",
3
- "version": "0.12.14",
3
+ "version": "0.12.15",
4
4
  "description": "Squirreling Async SQL Engine",
5
5
  "author": "Hyperparam",
6
6
  "homepage": "https://hyperparam.app",
@@ -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' },