@reasoningco/infer 0.1.0 → 0.1.2

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/dist/schemas.d.ts CHANGED
@@ -6,11 +6,11 @@ export declare const FilterSchema: z.ZodObject<{
6
6
  }, "strip", z.ZodTypeAny, {
7
7
  value: string | number | boolean | (string | number)[];
8
8
  field: string;
9
- op: "=" | "!=" | ">" | "<" | ">=" | "<=" | "in" | "not_in" | "like" | "ilike" | "is_null" | "is_not_null";
9
+ op: "=" | ">" | "!=" | "<" | ">=" | "<=" | "in" | "not_in" | "like" | "ilike" | "is_null" | "is_not_null";
10
10
  }, {
11
11
  value: string | number | boolean | (string | number)[];
12
12
  field: string;
13
- op: "=" | "!=" | ">" | "<" | ">=" | "<=" | "in" | "not_in" | "like" | "ilike" | "is_null" | "is_not_null";
13
+ op: "=" | ">" | "!=" | "<" | ">=" | "<=" | "in" | "not_in" | "like" | "ilike" | "is_null" | "is_not_null";
14
14
  }>;
15
15
  export declare const EntityFilterSchema: z.ZodObject<{
16
16
  resolver: z.ZodString;
@@ -25,6 +25,45 @@ export declare const EntityFilterSchema: z.ZodObject<{
25
25
  resolver: string;
26
26
  outputColumn: string;
27
27
  }>;
28
+ export declare const ExistsFilterSchema: z.ZodObject<{
29
+ mode: z.ZodEnum<["exists", "not_exists"]>;
30
+ dataset: z.ZodString;
31
+ joinColumn: z.ZodString;
32
+ foreignColumn: z.ZodString;
33
+ filters: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodObject<{
34
+ field: z.ZodString;
35
+ op: z.ZodEnum<["=", "!=", ">", "<", ">=", "<=", "in", "not_in", "like", "ilike", "is_null", "is_not_null"]>;
36
+ value: z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodNumber]>, "many">]>;
37
+ }, "strip", z.ZodTypeAny, {
38
+ value: string | number | boolean | (string | number)[];
39
+ field: string;
40
+ op: "=" | ">" | "!=" | "<" | ">=" | "<=" | "in" | "not_in" | "like" | "ilike" | "is_null" | "is_not_null";
41
+ }, {
42
+ value: string | number | boolean | (string | number)[];
43
+ field: string;
44
+ op: "=" | ">" | "!=" | "<" | ">=" | "<=" | "in" | "not_in" | "like" | "ilike" | "is_null" | "is_not_null";
45
+ }>, "many">>>;
46
+ }, "strip", z.ZodTypeAny, {
47
+ mode: "not_exists" | "exists";
48
+ dataset: string;
49
+ joinColumn: string;
50
+ foreignColumn: string;
51
+ filters: {
52
+ value: string | number | boolean | (string | number)[];
53
+ field: string;
54
+ op: "=" | ">" | "!=" | "<" | ">=" | "<=" | "in" | "not_in" | "like" | "ilike" | "is_null" | "is_not_null";
55
+ }[];
56
+ }, {
57
+ mode: "not_exists" | "exists";
58
+ dataset: string;
59
+ joinColumn: string;
60
+ foreignColumn: string;
61
+ filters?: {
62
+ value: string | number | boolean | (string | number)[];
63
+ field: string;
64
+ op: "=" | ">" | "!=" | "<" | ">=" | "<=" | "in" | "not_in" | "like" | "ilike" | "is_null" | "is_not_null";
65
+ }[] | undefined;
66
+ }>;
28
67
  export declare const DateRangeSchema: z.ZodObject<{
29
68
  mode: z.ZodEnum<["relative", "explicit", "latest", "none"]>;
30
69
  phrase: z.ZodOptional<z.ZodString>;
@@ -56,7 +95,8 @@ export declare const SmartQueryPlanSchema: z.ZodObject<{
56
95
  select: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
57
96
  metrics: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
58
97
  groupBy: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
59
- timeBucket: z.ZodOptional<z.ZodEnum<["hour", "day", "week", "month", "quarter", "year"]>>;
98
+ timeBucket: z.ZodEffects<z.ZodOptional<z.ZodEnum<["hour", "day", "week", "month", "quarter", "year"]>>, "month" | "day" | "week" | "quarter" | "year" | "hour" | undefined, unknown>;
99
+ extractBucket: z.ZodEffects<z.ZodOptional<z.ZodEnum<["hour_of_day", "day_of_week", "month_of_year", "quarter", "year", "week"]>>, "week" | "quarter" | "year" | "hour_of_day" | "day_of_week" | "month_of_year" | undefined, unknown>;
60
100
  filters: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodObject<{
61
101
  field: z.ZodString;
62
102
  op: z.ZodEnum<["=", "!=", ">", "<", ">=", "<=", "in", "not_in", "like", "ilike", "is_null", "is_not_null"]>;
@@ -64,12 +104,78 @@ export declare const SmartQueryPlanSchema: z.ZodObject<{
64
104
  }, "strip", z.ZodTypeAny, {
65
105
  value: string | number | boolean | (string | number)[];
66
106
  field: string;
67
- op: "=" | "!=" | ">" | "<" | ">=" | "<=" | "in" | "not_in" | "like" | "ilike" | "is_null" | "is_not_null";
107
+ op: "=" | ">" | "!=" | "<" | ">=" | "<=" | "in" | "not_in" | "like" | "ilike" | "is_null" | "is_not_null";
68
108
  }, {
69
109
  value: string | number | boolean | (string | number)[];
70
110
  field: string;
71
- op: "=" | "!=" | ">" | "<" | ">=" | "<=" | "in" | "not_in" | "like" | "ilike" | "is_null" | "is_not_null";
111
+ op: "=" | ">" | "!=" | "<" | ">=" | "<=" | "in" | "not_in" | "like" | "ilike" | "is_null" | "is_not_null";
72
112
  }>, "many">>>;
113
+ having: z.ZodEffects<z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodObject<{
114
+ field: z.ZodString;
115
+ op: z.ZodEnum<["=", "!=", ">", "<", ">=", "<=", "in", "not_in", "like", "ilike", "is_null", "is_not_null"]>;
116
+ value: z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodNumber]>, "many">]>;
117
+ }, "strip", z.ZodTypeAny, {
118
+ value: string | number | boolean | (string | number)[];
119
+ field: string;
120
+ op: "=" | ">" | "!=" | "<" | ">=" | "<=" | "in" | "not_in" | "like" | "ilike" | "is_null" | "is_not_null";
121
+ }, {
122
+ value: string | number | boolean | (string | number)[];
123
+ field: string;
124
+ op: "=" | ">" | "!=" | "<" | ">=" | "<=" | "in" | "not_in" | "like" | "ilike" | "is_null" | "is_not_null";
125
+ }>, "many">>>, {
126
+ value: string | number | boolean | (string | number)[];
127
+ field: string;
128
+ op: "=" | ">" | "!=" | "<" | ">=" | "<=" | "in" | "not_in" | "like" | "ilike" | "is_null" | "is_not_null";
129
+ }[], unknown>;
130
+ existsFilters: z.ZodEffects<z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodObject<{
131
+ mode: z.ZodEnum<["exists", "not_exists"]>;
132
+ dataset: z.ZodString;
133
+ joinColumn: z.ZodString;
134
+ foreignColumn: z.ZodString;
135
+ filters: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodObject<{
136
+ field: z.ZodString;
137
+ op: z.ZodEnum<["=", "!=", ">", "<", ">=", "<=", "in", "not_in", "like", "ilike", "is_null", "is_not_null"]>;
138
+ value: z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodNumber]>, "many">]>;
139
+ }, "strip", z.ZodTypeAny, {
140
+ value: string | number | boolean | (string | number)[];
141
+ field: string;
142
+ op: "=" | ">" | "!=" | "<" | ">=" | "<=" | "in" | "not_in" | "like" | "ilike" | "is_null" | "is_not_null";
143
+ }, {
144
+ value: string | number | boolean | (string | number)[];
145
+ field: string;
146
+ op: "=" | ">" | "!=" | "<" | ">=" | "<=" | "in" | "not_in" | "like" | "ilike" | "is_null" | "is_not_null";
147
+ }>, "many">>>;
148
+ }, "strip", z.ZodTypeAny, {
149
+ mode: "not_exists" | "exists";
150
+ dataset: string;
151
+ joinColumn: string;
152
+ foreignColumn: string;
153
+ filters: {
154
+ value: string | number | boolean | (string | number)[];
155
+ field: string;
156
+ op: "=" | ">" | "!=" | "<" | ">=" | "<=" | "in" | "not_in" | "like" | "ilike" | "is_null" | "is_not_null";
157
+ }[];
158
+ }, {
159
+ mode: "not_exists" | "exists";
160
+ dataset: string;
161
+ joinColumn: string;
162
+ foreignColumn: string;
163
+ filters?: {
164
+ value: string | number | boolean | (string | number)[];
165
+ field: string;
166
+ op: "=" | ">" | "!=" | "<" | ">=" | "<=" | "in" | "not_in" | "like" | "ilike" | "is_null" | "is_not_null";
167
+ }[] | undefined;
168
+ }>, "many">>>, {
169
+ mode: "not_exists" | "exists";
170
+ dataset: string;
171
+ joinColumn: string;
172
+ foreignColumn: string;
173
+ filters: {
174
+ value: string | number | boolean | (string | number)[];
175
+ field: string;
176
+ op: "=" | ">" | "!=" | "<" | ">=" | "<=" | "in" | "not_in" | "like" | "ilike" | "is_null" | "is_not_null";
177
+ }[];
178
+ }[], unknown>;
73
179
  entityFilters: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodObject<{
74
180
  resolver: z.ZodString;
75
181
  input: z.ZodString;
@@ -83,7 +189,7 @@ export declare const SmartQueryPlanSchema: z.ZodObject<{
83
189
  resolver: string;
84
190
  outputColumn: string;
85
191
  }>, "many">>>;
86
- dateRange: z.ZodOptional<z.ZodObject<{
192
+ dateRange: z.ZodEffects<z.ZodOptional<z.ZodObject<{
87
193
  mode: z.ZodEnum<["relative", "explicit", "latest", "none"]>;
88
194
  phrase: z.ZodOptional<z.ZodString>;
89
195
  startDate: z.ZodOptional<z.ZodString>;
@@ -98,7 +204,12 @@ export declare const SmartQueryPlanSchema: z.ZodObject<{
98
204
  startDate?: string | undefined;
99
205
  endDate?: string | undefined;
100
206
  phrase?: string | undefined;
101
- }>>;
207
+ }>>, {
208
+ mode: "relative" | "latest" | "none" | "explicit";
209
+ startDate?: string | undefined;
210
+ endDate?: string | undefined;
211
+ phrase?: string | undefined;
212
+ } | undefined, unknown>;
102
213
  orderBy: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodObject<{
103
214
  field: z.ZodString;
104
215
  dir: z.ZodDefault<z.ZodEnum<["asc", "desc"]>>;
@@ -109,17 +220,34 @@ export declare const SmartQueryPlanSchema: z.ZodObject<{
109
220
  field: string;
110
221
  dir?: "desc" | "asc" | undefined;
111
222
  }>, "many">>>;
112
- limit: z.ZodOptional<z.ZodNumber>;
113
- answerMode: z.ZodDefault<z.ZodOptional<z.ZodEnum<["rows", "aggregate_table", "scalar"]>>>;
223
+ limit: z.ZodEffects<z.ZodOptional<z.ZodNumber>, number | undefined, unknown>;
224
+ answerMode: z.ZodEffects<z.ZodDefault<z.ZodOptional<z.ZodEnum<["rows", "aggregate_table", "scalar"]>>>, "aggregate_table" | "rows" | "scalar", unknown>;
225
+ compareMode: z.ZodEffects<z.ZodOptional<z.ZodEnum<["previous_period", "year_over_year"]>>, "previous_period" | "year_over_year" | undefined, unknown>;
114
226
  }, "strip", z.ZodTypeAny, {
115
227
  select: string[];
228
+ having: {
229
+ value: string | number | boolean | (string | number)[];
230
+ field: string;
231
+ op: "=" | ">" | "!=" | "<" | ">=" | "<=" | "in" | "not_in" | "like" | "ilike" | "is_null" | "is_not_null";
232
+ }[];
116
233
  dataset: string;
117
- metrics: string[];
118
- groupBy: string[];
119
234
  filters: {
120
235
  value: string | number | boolean | (string | number)[];
121
236
  field: string;
122
- op: "=" | "!=" | ">" | "<" | ">=" | "<=" | "in" | "not_in" | "like" | "ilike" | "is_null" | "is_not_null";
237
+ op: "=" | ">" | "!=" | "<" | ">=" | "<=" | "in" | "not_in" | "like" | "ilike" | "is_null" | "is_not_null";
238
+ }[];
239
+ metrics: string[];
240
+ groupBy: string[];
241
+ existsFilters: {
242
+ mode: "not_exists" | "exists";
243
+ dataset: string;
244
+ joinColumn: string;
245
+ foreignColumn: string;
246
+ filters: {
247
+ value: string | number | boolean | (string | number)[];
248
+ field: string;
249
+ op: "=" | ">" | "!=" | "<" | ">=" | "<=" | "in" | "not_in" | "like" | "ilike" | "is_null" | "is_not_null";
250
+ }[];
123
251
  }[];
124
252
  entityFilters: {
125
253
  input: string;
@@ -132,6 +260,7 @@ export declare const SmartQueryPlanSchema: z.ZodObject<{
132
260
  }[];
133
261
  answerMode: "aggregate_table" | "rows" | "scalar";
134
262
  timeBucket?: "month" | "day" | "week" | "quarter" | "year" | "hour" | undefined;
263
+ extractBucket?: "week" | "quarter" | "year" | "hour_of_day" | "day_of_week" | "month_of_year" | undefined;
135
264
  dateRange?: {
136
265
  mode: "relative" | "latest" | "none" | "explicit";
137
266
  startDate?: string | undefined;
@@ -139,34 +268,34 @@ export declare const SmartQueryPlanSchema: z.ZodObject<{
139
268
  phrase?: string | undefined;
140
269
  } | undefined;
141
270
  limit?: number | undefined;
271
+ compareMode?: "previous_period" | "year_over_year" | undefined;
142
272
  }, {
143
273
  dataset: string;
144
274
  select?: string[] | undefined;
145
- metrics?: string[] | undefined;
146
- groupBy?: string[] | undefined;
147
- timeBucket?: "month" | "day" | "week" | "quarter" | "year" | "hour" | undefined;
275
+ having?: unknown;
148
276
  filters?: {
149
277
  value: string | number | boolean | (string | number)[];
150
278
  field: string;
151
- op: "=" | "!=" | ">" | "<" | ">=" | "<=" | "in" | "not_in" | "like" | "ilike" | "is_null" | "is_not_null";
279
+ op: "=" | ">" | "!=" | "<" | ">=" | "<=" | "in" | "not_in" | "like" | "ilike" | "is_null" | "is_not_null";
152
280
  }[] | undefined;
281
+ metrics?: string[] | undefined;
282
+ groupBy?: string[] | undefined;
283
+ timeBucket?: unknown;
284
+ extractBucket?: unknown;
285
+ existsFilters?: unknown;
153
286
  entityFilters?: {
154
287
  input: string;
155
288
  resolver: string;
156
289
  outputColumn: string;
157
290
  }[] | undefined;
158
- dateRange?: {
159
- mode: "relative" | "latest" | "none" | "explicit";
160
- startDate?: string | undefined;
161
- endDate?: string | undefined;
162
- phrase?: string | undefined;
163
- } | undefined;
291
+ dateRange?: unknown;
164
292
  orderBy?: {
165
293
  field: string;
166
294
  dir?: "desc" | "asc" | undefined;
167
295
  }[] | undefined;
168
- limit?: number | undefined;
169
- answerMode?: "aggregate_table" | "rows" | "scalar" | undefined;
296
+ limit?: unknown;
297
+ answerMode?: unknown;
298
+ compareMode?: unknown;
170
299
  }>;
171
300
  export type SmartQueryPlanInput = z.input<typeof SmartQueryPlanSchema>;
172
301
  export type SmartQueryPlanOutput = z.output<typeof SmartQueryPlanSchema>;
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,YAAY;;;;;;;;;;;;EASvB,CAAC;AAIH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;EAI7B,CAAC;AAIH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;EAK1B,CAAC;AAIH,eAAO,MAAM,aAAa;;;;;;;;;EAGxB,CAAC;AAIH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAY/B,CAAC;AAIH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACvE,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,YAAY;;;;;;;;;;;;EASvB,CAAC;AAIH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;EAI7B,CAAC;AAIH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAM7B,CAAC;AAIH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;EAK1B,CAAC;AAIH,eAAO,MAAM,aAAa;;;;;;;;;EAGxB,CAAC;AAIH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwC/B,CAAC;AAIH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACvE,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
package/dist/schemas.js CHANGED
@@ -16,6 +16,14 @@ export const EntityFilterSchema = z.object({
16
16
  input: z.string(),
17
17
  outputColumn: z.string(),
18
18
  });
19
+ // ── Exists filter schema ──
20
+ export const ExistsFilterSchema = z.object({
21
+ mode: z.enum(['exists', 'not_exists']),
22
+ dataset: z.string(),
23
+ joinColumn: z.string(),
24
+ foreignColumn: z.string(),
25
+ filters: z.array(FilterSchema).optional().default([]),
26
+ });
19
27
  // ── Date range schema ──
20
28
  export const DateRangeSchema = z.object({
21
29
  mode: z.enum(["relative", "explicit", "latest", "none"]),
@@ -34,12 +42,16 @@ export const SmartQueryPlanSchema = z.object({
34
42
  select: z.array(z.string()).optional().default([]),
35
43
  metrics: z.array(z.string()).optional().default([]),
36
44
  groupBy: z.array(z.string()).optional().default([]),
37
- timeBucket: z.enum(["hour", "day", "week", "month", "quarter", "year"]).optional(),
45
+ timeBucket: z.preprocess((v) => (v === null ? undefined : v), z.enum(["hour", "day", "week", "month", "quarter", "year"]).optional()),
46
+ extractBucket: z.preprocess((v) => (v === null ? undefined : v), z.enum(["hour_of_day", "day_of_week", "month_of_year", "quarter", "year", "week"]).optional()),
38
47
  filters: z.array(FilterSchema).optional().default([]),
48
+ having: z.preprocess((v) => (v === null ? [] : v), z.array(FilterSchema).optional().default([])),
49
+ existsFilters: z.preprocess((v) => (v === null ? [] : v), z.array(ExistsFilterSchema).optional().default([])),
39
50
  entityFilters: z.array(EntityFilterSchema).optional().default([]),
40
- dateRange: DateRangeSchema.optional(),
51
+ dateRange: z.preprocess((v) => (v === null ? undefined : v), DateRangeSchema.optional()),
41
52
  orderBy: z.array(OrderBySchema).optional().default([]),
42
- limit: z.number().int().positive().max(200).optional(),
43
- answerMode: z.enum(["rows", "aggregate_table", "scalar"]).optional().default("rows"),
53
+ limit: z.preprocess((v) => (v === null ? undefined : v), z.number().int().positive().max(200).optional()),
54
+ answerMode: z.preprocess((v) => (v === null ? undefined : v), z.enum(["rows", "aggregate_table", "scalar"]).optional().default("rows")),
55
+ compareMode: z.preprocess((v) => (v === null ? undefined : v), z.enum(['previous_period', 'year_over_year']).optional()),
44
56
  });
45
57
  //# sourceMappingURL=schemas.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sql-builder.d.ts","sourceRoot":"","sources":["../src/sql-builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAIpF,iBAAS,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAM3C;AAED,OAAO,EAAE,eAAe,EAAE,CAAC;AAE3B,wBAAgB,UAAU,CAAC,IAAI,EAAE,kBAAkB,EAAE,GAAG,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,OAAO,YAAY,EAAE,YAAY,GAAG,WAAW,CAiOpI"}
1
+ {"version":3,"file":"sql-builder.d.ts","sourceRoot":"","sources":["../src/sql-builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAIpF,iBAAS,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAM3C;AAED,OAAO,EAAE,eAAe,EAAE,CAAC;AAE3B,wBAAgB,UAAU,CAAC,IAAI,EAAE,kBAAkB,EAAE,GAAG,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,OAAO,YAAY,EAAE,YAAY,GAAG,WAAW,CAqUpI"}
@@ -28,6 +28,7 @@ export function compileSQL(plan, ctx, catalog) {
28
28
  }
29
29
  // ── Auto-resolve FK columns to human-readable names ──
30
30
  const fkNameColumns = [];
31
+ const fkGroupByRefs = [];
31
32
  if (catalog && plan.dataset.joins) {
32
33
  const columnsToResolve = plan.metrics.length > 0 ? plan.groupBy : plan.select;
33
34
  for (const col of columnsToResolve) {
@@ -49,12 +50,23 @@ export function compileSQL(plan, ctx, catalog) {
49
50
  joinAliases.set(bareTable, bareTable);
50
51
  joinClauses.push(`LEFT JOIN ${targetFull} AS ${quoteIdentifier(bareTable)} ON ${quoteIdentifier(mainAlias)}.${quoteIdentifier(col)} = ${quoteIdentifier(bareTable)}.${quoteIdentifier(joinDef.foreignColumn)}`);
51
52
  }
52
- fkNameColumns.push(`${quoteIdentifier(bareTable)}.${quoteIdentifier(nameCol)} AS ${quoteIdentifier(col.replace(/_id$/, '_name'))}`);
53
+ const fkRef = `${quoteIdentifier(bareTable)}.${quoteIdentifier(nameCol)}`;
54
+ fkNameColumns.push(`${fkRef} AS ${quoteIdentifier(col.replace(/_id$/, '_name'))}`);
55
+ fkGroupByRefs.push(fkRef);
53
56
  }
54
57
  }
55
- // ── Determine which groupBy columns need DATE_TRUNC ──
58
+ // ── Determine which groupBy columns need DATE_TRUNC or EXTRACT ──
56
59
  const dateGroupColumns = new Set();
57
- if (plan.timeBucket && plan.groupBy.length > 0) {
60
+ const extractGroupColumns = new Set();
61
+ if (plan.extractBucket && !plan.timeBucket && plan.groupBy.length > 0) {
62
+ for (const col of plan.groupBy) {
63
+ const colType = plan.dataset.columnTypes[col];
64
+ if (colType === 'date' || colType === 'timestamp') {
65
+ extractGroupColumns.add(col);
66
+ }
67
+ }
68
+ }
69
+ else if (plan.timeBucket && plan.groupBy.length > 0) {
58
70
  for (const col of plan.groupBy) {
59
71
  const colType = plan.dataset.columnTypes[col];
60
72
  if (colType === 'date' || colType === 'timestamp') {
@@ -62,6 +74,18 @@ export function compileSQL(plan, ctx, catalog) {
62
74
  }
63
75
  }
64
76
  }
77
+ // Helper: build EXTRACT expression for extractBucket
78
+ const buildExtractExpr = (ref) => {
79
+ switch (plan.extractBucket) {
80
+ case 'hour_of_day': return `EXTRACT(HOUR FROM ${ref})`;
81
+ case 'day_of_week': return `EXTRACT(DOW FROM ${ref})`;
82
+ case 'month_of_year': return `EXTRACT(MONTH FROM ${ref})`;
83
+ case 'quarter': return `EXTRACT(QUARTER FROM ${ref})`;
84
+ case 'year': return `EXTRACT(YEAR FROM ${ref})`;
85
+ case 'week': return `EXTRACT(WEEK FROM ${ref})`;
86
+ default: return ref;
87
+ }
88
+ };
65
89
  // Helper: resolve a column reference (supports dot-notation for joins)
66
90
  const resolveColRef = (col) => {
67
91
  if (col.includes('.')) {
@@ -81,21 +105,37 @@ export function compileSQL(plan, ctx, catalog) {
81
105
  return col.split('.', 2)[1];
82
106
  return col;
83
107
  };
84
- // Helper: format a groupBy column for SELECT (with DATE_TRUNC and alias if needed)
108
+ // Helper: format a groupBy column for SELECT (with DATE_TRUNC, EXTRACT, and alias if needed)
85
109
  const formatGroupCol = (col) => {
86
110
  const ref = resolveColRef(col);
87
111
  const alias = colAlias(col);
112
+ if (extractGroupColumns.has(col) && plan.extractBucket) {
113
+ const extractAliasMap = {
114
+ 'hour_of_day': `${alias}_hour`,
115
+ 'day_of_week': `${alias}_dow`,
116
+ 'month_of_year': `${alias}_month`,
117
+ };
118
+ const extractAlias = extractAliasMap[plan.extractBucket] ?? plan.extractBucket;
119
+ return `${buildExtractExpr(ref)} AS ${quoteIdentifier(extractAlias)}`;
120
+ }
88
121
  if (dateGroupColumns.has(col) && plan.timeBucket) {
89
122
  return `DATE_TRUNC('${plan.timeBucket}', ${ref}) AS ${quoteIdentifier(alias)}`;
90
123
  }
91
124
  if (col.includes('.')) {
92
125
  return `${ref} AS ${quoteIdentifier(alias)}`;
93
126
  }
127
+ // For text columns, wrap with COALESCE to handle NULL values
128
+ if (plan.dataset.columnTypes[col] === 'text') {
129
+ return `COALESCE(${ref}::text, 'N/A') AS ${quoteIdentifier(col)}`;
130
+ }
94
131
  return ref;
95
132
  };
96
133
  // Helper: format a groupBy column for GROUP BY clause (no alias)
97
134
  const formatGroupByRef = (col) => {
98
135
  const ref = resolveColRef(col);
136
+ if (extractGroupColumns.has(col) && plan.extractBucket) {
137
+ return buildExtractExpr(ref);
138
+ }
99
139
  if (dateGroupColumns.has(col) && plan.timeBucket) {
100
140
  return `DATE_TRUNC('${plan.timeBucket}', ${ref})`;
101
141
  }
@@ -124,16 +164,25 @@ export function compileSQL(plan, ctx, catalog) {
124
164
  // ── Build WHERE clause ──
125
165
  const whereParts = [];
126
166
  // Tenant isolation (ALWAYS injected server-side)
167
+ if (!ctx.tenantId || ctx.tenantId.trim() === '') {
168
+ throw new InferError('SQL_VALIDATION_FAILED', 'compiler', 'Tenant ID is required but was not provided');
169
+ }
127
170
  const tenantCol = ctx.tenantColumn ?? 'tenant_id';
128
171
  if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(tenantCol)) {
129
172
  throw new InferError('SQL_VALIDATION_FAILED', 'compiler', `Invalid tenant column name: ${tenantCol}`);
130
173
  }
174
+ const tenantRef = joinClauses.length > 0
175
+ ? `${quoteIdentifier(mainAlias)}.${quoteIdentifier(tenantCol)}`
176
+ : quoteIdentifier(tenantCol);
131
177
  params.push(ctx.tenantId);
132
- whereParts.push(`${quoteIdentifier(tenantCol)} = $${paramIdx++}`);
178
+ whereParts.push(`${tenantRef} = $${paramIdx++}`);
133
179
  // Location scoping (optional)
134
180
  if (ctx.locationIds && ctx.locationIds.length > 0) {
181
+ const locationRef = joinClauses.length > 0
182
+ ? `${quoteIdentifier(mainAlias)}."location_id"`
183
+ : `"location_id"`;
135
184
  params.push(ctx.locationIds);
136
- whereParts.push(`"location_id" = ANY($${paramIdx++})`);
185
+ whereParts.push(`${locationRef} = ANY($${paramIdx++})`);
137
186
  }
138
187
  // Date range
139
188
  if (plan.dateRange && plan.dataset.dateColumn) {
@@ -173,11 +222,53 @@ export function compileSQL(plan, ctx, catalog) {
173
222
  whereParts.push(`${col} = ANY($${paramIdx++})`);
174
223
  }
175
224
  }
225
+ // Exists filters (subqueries)
226
+ for (const ef of plan.existsFilters || []) {
227
+ const targetTable = `${quoteIdentifier(ef.table.schema)}.${quoteIdentifier(ef.table.name)}`;
228
+ const subAlias = `_ef_${ef.table.name}`;
229
+ let subWhere = `${quoteIdentifier(subAlias)}.${quoteIdentifier(ef.foreignColumn)} = ${quoteIdentifier(mainAlias)}.${quoteIdentifier(ef.joinColumn)}`;
230
+ for (const f of ef.filters) {
231
+ const op = sanitizeOperator(f.op);
232
+ if (op === 'IS NULL') {
233
+ subWhere += ` AND ${quoteIdentifier(subAlias)}.${quoteIdentifier(f.field)} IS NULL`;
234
+ }
235
+ else if (op === 'IS NOT NULL') {
236
+ subWhere += ` AND ${quoteIdentifier(subAlias)}.${quoteIdentifier(f.field)} IS NOT NULL`;
237
+ }
238
+ else {
239
+ params.push(f.value);
240
+ subWhere += ` AND ${quoteIdentifier(subAlias)}.${quoteIdentifier(f.field)} ${op} $${paramIdx++}`;
241
+ }
242
+ }
243
+ const existsOp = ef.mode === 'not_exists' ? 'NOT EXISTS' : 'EXISTS';
244
+ whereParts.push(`${existsOp} (SELECT 1 FROM ${targetTable} AS ${quoteIdentifier(subAlias)} WHERE ${subWhere})`);
245
+ }
176
246
  const whereClause = whereParts.length > 0 ? whereParts.join(' AND ') : '1=1';
177
247
  // ── Build GROUP BY ──
178
248
  const groupBySql = plan.groupBy.length > 0
179
- ? `GROUP BY ${plan.groupBy.map(col => formatGroupByRef(col)).join(', ')}`
249
+ ? `GROUP BY ${[...plan.groupBy.map(col => formatGroupByRef(col)), ...fkGroupByRefs].join(', ')}`
180
250
  : '';
251
+ // ── Build HAVING ──
252
+ let havingSql = '';
253
+ if (plan.having && plan.having.length > 0) {
254
+ const havingParts = [];
255
+ for (const filter of plan.having) {
256
+ const metricDef = plan.metrics.find(m => m.id === filter.field);
257
+ const fieldRef = metricDef ? metricDef.expression : quoteIdentifier(filter.field);
258
+ const op = sanitizeOperator(filter.op);
259
+ if (op === 'IS NULL') {
260
+ havingParts.push(`${fieldRef} IS NULL`);
261
+ }
262
+ else if (op === 'IS NOT NULL') {
263
+ havingParts.push(`${fieldRef} IS NOT NULL`);
264
+ }
265
+ else {
266
+ params.push(filter.value);
267
+ havingParts.push(`${fieldRef} ${op} $${paramIdx++}`);
268
+ }
269
+ }
270
+ havingSql = `HAVING ${havingParts.join(' AND ')}`;
271
+ }
181
272
  // ── Build ORDER BY (direction whitelisted to ASC/DESC only) ──
182
273
  const orderBySql = plan.orderBy.length > 0
183
274
  ? `ORDER BY ${plan.orderBy.map(o => {
@@ -206,10 +297,20 @@ export function compileSQL(plan, ctx, catalog) {
206
297
  ...joinClauses,
207
298
  `WHERE ${whereClause}`,
208
299
  groupBySql,
300
+ havingSql,
209
301
  orderBySql,
210
302
  limitSql,
211
303
  offsetSql,
212
304
  ].filter(Boolean).join('\n');
305
+ // compareMode: wrap in CTE with LAG window functions
306
+ if (plan.compareMode && plan.metrics.length > 0 && (plan.timeBucket || plan.extractBucket)) {
307
+ const metricAliases = plan.metrics.map(m => quoteIdentifier(m.id));
308
+ const lagCols = metricAliases.map(alias => {
309
+ return `${alias} - LAG(${alias}) OVER (ORDER BY ${quoteIdentifier(plan.groupBy[0] || 'period')}) AS ${alias.replace(/"$/, '_delta"')}`;
310
+ });
311
+ const wrappedSql = `WITH _base AS (\n${sql}\n)\nSELECT *, ${lagCols.join(', ')} FROM _base`;
312
+ return { sql: wrappedSql, params };
313
+ }
213
314
  return { sql, params };
214
315
  }
215
316
  function sanitizeOperator(op) {
@@ -1 +1 @@
1
- {"version":3,"file":"sql-builder.js","sourceRoot":"","sources":["../src/sql-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sql-builder.js","sourceRoot":"","sources":["../src/sql-builder.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sql-validator.d.ts","sourceRoot":"","sources":["../src/sql-validator.ts"],"names":[],"mappings":"AAkDA,MAAM,WAAW,oBAAoB;IACnC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,IAAI,CAgEjF;AAgDD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAmD9D"}
1
+ {"version":3,"file":"sql-validator.d.ts","sourceRoot":"","sources":["../src/sql-validator.ts"],"names":[],"mappings":"AAqDA,MAAM,WAAW,oBAAoB;IACnC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,IAAI,CAgEjF;AAkDD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAqD9D"}
@@ -13,6 +13,9 @@ const ALLOWED_FUNCTIONS = new Set([
13
13
  'cast', 'coalesce', 'nullif', 'greatest', 'least',
14
14
  // Format
15
15
  'to_char', 'to_date', 'to_number', 'to_timestamp',
16
+ // Statistical aggregates
17
+ 'stddev', 'stddev_pop', 'stddev_samp', 'variance', 'var_pop', 'var_samp',
18
+ 'percentile_cont', 'percentile_disc', 'mode', 'corr', 'regr_slope',
16
19
  // Window functions
17
20
  'row_number', 'rank', 'dense_rank', 'ntile',
18
21
  'lag', 'lead', 'first_value', 'last_value', 'nth_value',
@@ -136,6 +139,8 @@ function validateTableAllowlist(sql, allowedTables) {
136
139
  const SAFE_METRIC_STARTERS = new Set([
137
140
  'sum', 'avg', 'count', 'min', 'max', 'round', 'abs', 'ceil', 'floor',
138
141
  'coalesce', 'nullif', 'cast', 'extract', 'date_trunc', 'greatest', 'least',
142
+ 'stddev', 'stddev_pop', 'stddev_samp', 'variance', 'var_pop', 'var_samp',
143
+ 'percentile_cont', 'percentile_disc', 'mode', 'corr', 'regr_slope',
139
144
  ]);
140
145
  export function validateMetricExpression(expr) {
141
146
  const trimmed = expr.trim();
@@ -147,7 +152,9 @@ export function validateMetricExpression(expr) {
147
152
  // Block subqueries and clause injection
148
153
  if (/\bSELECT\b/i.test(trimmed))
149
154
  return false;
150
- if (/\bFROM\b/i.test(trimmed))
155
+ // Block FROM except inside EXTRACT(... FROM ...)
156
+ const withoutExtract = trimmed.replace(/\bEXTRACT\s*\([^)]*\bFROM\b[^)]*\)/gi, '');
157
+ if (/\bFROM\b/i.test(withoutExtract))
151
158
  return false;
152
159
  if (/\bWHERE\b/i.test(trimmed))
153
160
  return false;