rado 0.1.63 → 0.1.64

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.
@@ -117,6 +117,8 @@ function addWhere(query, where) {
117
117
  }
118
118
  leftJoin(that, ...on) {
119
119
  const query = this.query();
120
+ if (!query.from)
121
+ throw new Error("No from clause");
120
122
  return new SelectMultiple({
121
123
  ...query,
122
124
  from: Target.Join(
@@ -129,6 +131,8 @@ function addWhere(query, where) {
129
131
  }
130
132
  innerJoin(that, ...on) {
131
133
  const query = this.query();
134
+ if (!query.from)
135
+ throw new Error("No from clause");
132
136
  return new SelectMultiple({
133
137
  ...query,
134
138
  from: Target.Join(
@@ -196,6 +200,8 @@ function addWhere(query, where) {
196
200
  }
197
201
  leftJoin(that, ...on) {
198
202
  const query = this.query();
203
+ if (!query.from)
204
+ throw new Error("No from clause");
199
205
  return new SelectSingle({
200
206
  ...query,
201
207
  from: Target.Join(
@@ -208,6 +214,8 @@ function addWhere(query, where) {
208
214
  }
209
215
  innerJoin(that, ...on) {
210
216
  const query = this.query();
217
+ if (!query.from)
218
+ throw new Error("No from clause");
211
219
  return new SelectSingle({
212
220
  ...query,
213
221
  from: Target.Join(
@@ -139,27 +139,28 @@ export declare class Expr<T> {
139
139
  not(): Expr<boolean>;
140
140
  or(this: Expr<boolean>, that: EV<boolean>): Expr<boolean>;
141
141
  and(this: Expr<boolean>, that: EV<boolean>): Expr<boolean>;
142
+ is(that: EV<T> | Cursor.SelectSingle<T>): Expr<boolean>;
143
+ isNot(that: EV<T>): Expr<boolean>;
142
144
  isNull(): Expr<boolean>;
143
145
  isNotNull(): Expr<boolean>;
144
- isNot(that: EV<T>): Expr<boolean>;
145
- is(that: EV<T> | Cursor.SelectSingle<T>): Expr<boolean>;
146
- in(that: EV<Array<T>> | Cursor.SelectMultiple<T>): Expr<boolean>;
147
- notIn(that: EV<Array<T>> | Cursor.SelectMultiple<T>): Expr<boolean>;
146
+ isIn(that: EV<Array<T>> | Cursor.SelectMultiple<T>): Expr<boolean>;
147
+ isNotIn(that: EV<Array<T>> | Cursor.SelectMultiple<T>): Expr<boolean>;
148
+ isGreater(that: EV<any>): Expr<boolean>;
149
+ isGreaterOrEqual(that: EV<any>): Expr<boolean>;
150
+ isLess(that: EV<any>): Expr<boolean>;
151
+ isLessOrEqual(that: EV<any>): Expr<boolean>;
148
152
  add(this: Expr<number>, that: EV<number>): Expr<number>;
149
153
  substract(this: Expr<number>, that: EV<number>): Expr<number>;
150
154
  multiply(this: Expr<number>, that: EV<number>): Expr<number>;
151
155
  remainder(this: Expr<number>, that: EV<number>): Expr<number>;
152
156
  divide(this: Expr<number>, that: EV<number>): Expr<number>;
153
- greater(that: EV<any>): Expr<boolean>;
154
- greaterOrEqual(that: EV<any>): Expr<boolean>;
155
- less(that: EV<any>): Expr<boolean>;
156
- lessOrEqual(that: EV<any>): Expr<boolean>;
157
157
  concat(this: Expr<string>, that: EV<string>): Expr<string>;
158
158
  like(this: Expr<string>, that: EV<string>): Expr<boolean>;
159
159
  glob(this: Expr<string>, that: EV<string>): Expr<boolean>;
160
160
  match(this: Expr<string>, that: EV<string>): Expr<boolean>;
161
161
  with<X extends Selection>(that: X): Selection.With<T, X>;
162
162
  at<T>(this: Expr<Array<T>>, index: number): Expr<T | null>;
163
+ includes<T>(this: Expr<Array<T>>, value: EV<T>): Expr<boolean>;
163
164
  filter<T>(this: Expr<Array<T>>, fn: (cursor: Fields<T>) => Expr<boolean>): Expr<Array<T>>;
164
165
  map<T, X extends Selection>(this: Expr<Array<T>>, fn: (cursor: Fields<T>) => X): Expr<Array<Selection.Infer<X>>>;
165
166
  sure(): Expr<NonNullable<T>>;
@@ -151,7 +151,7 @@ var _Expr = class {
151
151
  return { expr: this.expr, order: OrderDirection.Desc };
152
152
  }
153
153
  not() {
154
- return unop(this, "Not" /* Not */);
154
+ return new _Expr(ExprData.UnOp("Not" /* Not */, this.expr));
155
155
  }
156
156
  or(that) {
157
157
  const a = this.expr;
@@ -171,66 +171,72 @@ var _Expr = class {
171
171
  return new _Expr(b);
172
172
  return new _Expr(ExprData.BinOp("And" /* And */, a, b));
173
173
  }
174
+ is(that) {
175
+ if (that === null || that instanceof _Expr && isConstant(that.expr, null))
176
+ return this.isNull();
177
+ return new _Expr(ExprData.BinOp("Equals" /* Equals */, this.expr, toExpr(that)));
178
+ }
179
+ isNot(that) {
180
+ if (that === null || that instanceof _Expr && isConstant(that.expr, null))
181
+ return this.isNotNull();
182
+ return new _Expr(
183
+ ExprData.BinOp("NotEquals" /* NotEquals */, this.expr, toExpr(that))
184
+ );
185
+ }
174
186
  isNull() {
175
- return unop(this, "IsNull" /* IsNull */);
187
+ return new _Expr(ExprData.UnOp("IsNull" /* IsNull */, this.expr));
176
188
  }
177
189
  isNotNull() {
178
190
  return this.isNull().not();
179
191
  }
180
- isNot(that) {
181
- if (that === null || that instanceof _Expr && isConstant(that.expr, null))
182
- return this.isNotNull();
183
- return binop(this, "NotEquals" /* NotEquals */, that);
192
+ isIn(that) {
193
+ return new _Expr(ExprData.BinOp("In" /* In */, this.expr, toExpr(that)));
184
194
  }
185
- is(that) {
186
- if (that === null || that instanceof _Expr && isConstant(that.expr, null))
187
- return this.isNull();
188
- return binop(this, "Equals" /* Equals */, that);
195
+ isNotIn(that) {
196
+ return new _Expr(ExprData.BinOp("NotIn" /* NotIn */, this.expr, toExpr(that)));
197
+ }
198
+ isGreater(that) {
199
+ return new _Expr(ExprData.BinOp("Greater" /* Greater */, this.expr, toExpr(that)));
189
200
  }
190
- in(that) {
191
- return binop(this, "In" /* In */, that);
201
+ isGreaterOrEqual(that) {
202
+ return new _Expr(
203
+ ExprData.BinOp("GreaterOrEqual" /* GreaterOrEqual */, this.expr, toExpr(that))
204
+ );
192
205
  }
193
- notIn(that) {
194
- return binop(this, "NotIn" /* NotIn */, that);
206
+ isLess(that) {
207
+ return new _Expr(ExprData.BinOp("Less" /* Less */, this.expr, toExpr(that)));
208
+ }
209
+ isLessOrEqual(that) {
210
+ return new _Expr(
211
+ ExprData.BinOp("LessOrEqual" /* LessOrEqual */, this.expr, toExpr(that))
212
+ );
195
213
  }
196
214
  add(that) {
197
- return binop(this, "Add" /* Add */, that);
215
+ return new _Expr(ExprData.BinOp("Add" /* Add */, this.expr, toExpr(that)));
198
216
  }
199
217
  substract(that) {
200
- return binop(this, "Subt" /* Subt */, that);
218
+ return new _Expr(ExprData.BinOp("Subt" /* Subt */, this.expr, toExpr(that)));
201
219
  }
202
220
  multiply(that) {
203
- return binop(this, "Mult" /* Mult */, that);
221
+ return new _Expr(ExprData.BinOp("Mult" /* Mult */, this.expr, toExpr(that)));
204
222
  }
205
223
  remainder(that) {
206
- return binop(this, "Mod" /* Mod */, that);
224
+ return new _Expr(ExprData.BinOp("Mod" /* Mod */, this.expr, toExpr(that)));
207
225
  }
208
226
  divide(that) {
209
- return binop(this, "Div" /* Div */, that);
210
- }
211
- greater(that) {
212
- return binop(this, "Greater" /* Greater */, that);
213
- }
214
- greaterOrEqual(that) {
215
- return binop(this, "GreaterOrEqual" /* GreaterOrEqual */, that);
216
- }
217
- less(that) {
218
- return binop(this, "Less" /* Less */, that);
219
- }
220
- lessOrEqual(that) {
221
- return binop(this, "LessOrEqual" /* LessOrEqual */, that);
227
+ return new _Expr(ExprData.BinOp("Div" /* Div */, this.expr, toExpr(that)));
222
228
  }
223
229
  concat(that) {
224
- return binop(this, "Concat" /* Concat */, that);
230
+ return new _Expr(ExprData.BinOp("Concat" /* Concat */, this.expr, toExpr(that)));
225
231
  }
226
232
  like(that) {
227
- return binop(this, "Like" /* Like */, that);
233
+ return new _Expr(ExprData.BinOp("Like" /* Like */, this.expr, toExpr(that)));
228
234
  }
229
235
  glob(that) {
230
- return binop(this, "Glob" /* Glob */, that);
236
+ return new _Expr(ExprData.BinOp("Glob" /* Glob */, this.expr, toExpr(that)));
231
237
  }
232
238
  match(that) {
233
- return binop(this, "Match" /* Match */, that);
239
+ return new _Expr(ExprData.BinOp("Match" /* Match */, this.expr, toExpr(that)));
234
240
  }
235
241
  with(that) {
236
242
  return new _Expr(
@@ -240,6 +246,9 @@ var _Expr = class {
240
246
  at(index) {
241
247
  return this.get(`[${Number(index)}]`);
242
248
  }
249
+ includes(value) {
250
+ return _Expr.create(value).isIn(this);
251
+ }
243
252
  filter(fn) {
244
253
  const alias = `__${Math.random().toString(36).slice(2, 9)}`;
245
254
  const target = Target.Expr(this.expr, alias);
@@ -269,12 +278,6 @@ var _Expr = class {
269
278
  };
270
279
  var Expr = _Expr;
271
280
  __publicField(Expr, "NULL", toExpr(null));
272
- function unop(self, type) {
273
- return new Expr(ExprData.UnOp(type, self.expr));
274
- }
275
- function binop(self, type, that) {
276
- return new Expr(ExprData.BinOp(type, self.expr, toExpr(that)));
277
- }
278
281
  export {
279
282
  BinOpType,
280
283
  Expr,
@@ -1,5 +1,7 @@
1
1
  import { Cursor } from './Cursor';
2
+ import { Selection } from './Selection';
2
3
  import { Table } from './Table';
4
+ export declare function select<X extends Selection>(selection: X): Cursor.SelectMultiple<Selection.Infer<X>>;
3
5
  export declare function from<Row>(source: Table<Row> | Cursor.SelectMultiple<Row>): Cursor.SelectMultiple<Row>;
4
6
  export declare function update<Row>(table: Table<Row>): Cursor.Update<Row>;
5
7
  export declare function insertInto<Row>(table: Table<Row>): Cursor.Insert<Row>;
@@ -4,6 +4,13 @@ import { ExprData } from "./Expr.js";
4
4
  import { Query } from "./Query.js";
5
5
  import { Schema } from "./Schema.js";
6
6
  import { Target } from "./Target.js";
7
+ function select(selection) {
8
+ return new Cursor.SelectMultiple(
9
+ Query.Select({
10
+ selection: ExprData.create(selection)
11
+ })
12
+ );
13
+ }
7
14
  function from(source) {
8
15
  const target = "schema" in source ? Target.Table(source.schema()) : Target.Query(source.query());
9
16
  return new Cursor.SelectMultiple(
@@ -32,5 +39,6 @@ export {
32
39
  deleteFrom,
33
40
  from,
34
41
  insertInto,
42
+ select,
35
43
  update
36
44
  };
@@ -40,7 +40,7 @@ export declare namespace Query {
40
40
  interface Select extends QueryBase {
41
41
  type: QueryType.Select;
42
42
  selection: ExprData;
43
- from: Target;
43
+ from?: Target;
44
44
  }
45
45
  function Select(select: Omit<Select, 'type'>): Query.Select;
46
46
  interface Update extends QueryBase {
@@ -83,8 +83,10 @@ var Formatter = class {
83
83
  query.selection,
84
84
  topLevel ? formatAsResultObject : void 0
85
85
  );
86
- stmt.addLine("FROM").space();
87
- this.formatTarget(ctx, query.from);
86
+ if (query.from) {
87
+ stmt.addLine("FROM").space();
88
+ this.formatTarget(ctx, query.from);
89
+ }
88
90
  this.formatWhere(ctx, query.where);
89
91
  this.formatGroupBy(ctx, query.groupBy);
90
92
  this.formatHaving(ctx, query.having);
@@ -321,8 +323,6 @@ var Formatter = class {
321
323
  throw new TypeError(`Expected boolean for column ${column.name}`);
322
324
  return stmt.raw(this.escapeValue(columnValue));
323
325
  case ColumnType.Json:
324
- if (typeof columnValue !== "object")
325
- throw new TypeError(`Expected object for column ${column.name}`);
326
326
  return stmt.value(JSON.stringify(columnValue));
327
327
  }
328
328
  }
@@ -390,12 +390,15 @@ var Formatter = class {
390
390
  return stmt;
391
391
  }
392
392
  formatLimit(ctx, { limit, offset, singleResult }) {
393
- const { stmt } = ctx;
393
+ const { stmt, forceInline } = ctx;
394
394
  if (!limit && !offset && !singleResult)
395
395
  return stmt;
396
- stmt.newline().raw("LIMIT").addValue(singleResult ? 1 : limit);
397
- if (offset && offset > 0)
398
- stmt.raw("OFFSET").addValue(offset);
396
+ stmt.newline().raw("LIMIT");
397
+ this.formatValue(ctx, singleResult ? 1 : limit);
398
+ if (offset && offset > 0) {
399
+ stmt.raw("OFFSET");
400
+ this.formatValue(ctx, offset);
401
+ }
399
402
  return stmt;
400
403
  }
401
404
  formatSelection(ctx, selection, formatSubject) {
@@ -441,7 +444,8 @@ var Formatter = class {
441
444
  case TargetType.Table:
442
445
  const column = expr.target.table.columns[field];
443
446
  const asBoolean = column?.type === ColumnType.Boolean && ctx.formatAsJson;
444
- const asJson = column?.type === ColumnType.Json && ctx.formatAsJson;
447
+ const jsonColumn = column?.type === ColumnType.Json;
448
+ const asJson = jsonColumn && ctx.formatAsJson;
445
449
  if (asJson) {
446
450
  stmt.raw("json");
447
451
  stmt.openParenthesis();
@@ -456,6 +460,8 @@ var Formatter = class {
456
460
  stmt.add(`, 'true', 'false'))`);
457
461
  if (asJson)
458
462
  stmt.closeParenthesis();
463
+ if (jsonColumn && !asJson)
464
+ stmt.raw("->>'$'");
459
465
  return stmt;
460
466
  }
461
467
  default:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rado",
3
- "version": "0.1.63",
3
+ "version": "0.1.64",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",