@spinajs/orm 2.0.19 → 2.0.39

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/lib/builders.d.ts CHANGED
@@ -1,12 +1,12 @@
1
1
  import { Container, Constructor, IContainer } from '@spinajs/di';
2
2
  import { ColumnType, QueryMethod, SordOrder, WhereBoolean, SqlOperator } from './enums';
3
- import { IColumnsBuilder, ICompilerOutput, ILimitBuilder, IOrderByBuilder, IQueryBuilder, IQueryLimit, ISort, IWhereBuilder, QueryContext, IJoinBuilder, IBuilderMiddleware, IWithRecursiveBuilder, ReferentialAction, IGroupByBuilder } from './interfaces';
4
- import { ColumnStatement, IQueryStatement, Wrap } from './statements';
5
- import { WhereFunction } from './types';
3
+ import { IColumnsBuilder, ICompilerOutput, ILimitBuilder, IOrderByBuilder, IQueryBuilder, IQueryLimit, ISort, IWhereBuilder, QueryContext, IJoinBuilder, IBuilderMiddleware, IWithRecursiveBuilder, ReferentialAction, IGroupByBuilder, IUpdateResult, DefaultValueBuilder, ColumnAlterationType, ISelectBuilderExtensions, QueryMiddleware } from './interfaces';
4
+ import { ColumnStatement, IQueryStatement, RawQueryStatement, Wrap } from './statements';
5
+ import { PartialModel, PickRelations, WhereFunction } from './types';
6
6
  import { OrmDriver } from './driver';
7
7
  import { ModelBase } from './model';
8
- import { OrmRelation, IOrmRelation } from './relations';
9
- import { ColumnAlterationType, IUpdateResult, ISelectBuilderExtensions, QueryMiddleware, DefaultValueBuilder } from '.';
8
+ import { OrmRelation, IOrmRelation, Relation } from './relations';
9
+ import { DateTime } from 'luxon';
10
10
  /**
11
11
  * Trick typescript by using the inbuilt interface inheritance and declaration merging
12
12
  * for builder classes.
@@ -151,24 +151,32 @@ export declare class GroupByBuilder implements IGroupByBuilder {
151
151
  groupBy(expression: string | RawQuery): this;
152
152
  }
153
153
  export declare class JoinBuilder implements IJoinBuilder {
154
+ protected _model?: Constructor<ModelBase>;
154
155
  get JoinStatements(): IQueryStatement[];
155
156
  protected _joinStatements: IQueryStatement[];
156
157
  protected _container: Container;
157
158
  protected _tableAlias: string;
158
159
  constructor(container: Container);
159
160
  clearJoins(): this;
161
+ innerJoin<R extends ModelBase>(model: R, where?: (this: SelectQueryBuilder<R>) => void): this;
160
162
  innerJoin(query: RawQuery): this;
161
163
  innerJoin(table: string, foreignKey: string, primaryKey: string): this;
164
+ leftJoin<R extends ModelBase>(model: R, where?: (this: SelectQueryBuilder<R>) => void): this;
162
165
  leftJoin(query: RawQuery): this;
163
166
  leftJoin(table: string, foreignKey: string, primaryKey: string): this;
167
+ leftOuterJoin<R extends ModelBase>(model: R, where?: (this: SelectQueryBuilder<R>) => void): this;
164
168
  leftOuterJoin(query: RawQuery): this;
165
169
  leftOuterJoin(table: string, foreignKey: string, primaryKey: string): this;
170
+ rightJoin<R extends ModelBase>(model: R, where?: (this: SelectQueryBuilder<R>) => void): this;
166
171
  rightJoin(query: RawQuery): this;
167
172
  rightJoin(table: string, foreignKey: string, primaryKey: string): this;
173
+ rightOuterJoin<R extends ModelBase>(model: R, where?: (this: SelectQueryBuilder<R>) => void): this;
168
174
  rightOuterJoin(query: RawQuery): this;
169
175
  rightOuterJoin(table: string, foreignKey: string, primaryKey: string): this;
176
+ fullOuterJoin<R extends ModelBase>(model: R, where?: (this: SelectQueryBuilder<R>) => void): this;
170
177
  fullOuterJoin(query: RawQuery): this;
171
178
  fullOuterJoin(table: string, foreignKey: string, primaryKey: string): this;
179
+ crossJoin<R extends ModelBase>(model: R, where?: (this: SelectQueryBuilder<R>) => void): this;
172
180
  crossJoin(query: RawQuery): this;
173
181
  crossJoin(table: string, foreignKey: string, primaryKey: string): this;
174
182
  private addJoinStatement;
@@ -184,10 +192,11 @@ export declare class WhereBuilder<T> implements IWhereBuilder<T> {
184
192
  protected _boolean: WhereBoolean;
185
193
  protected _container: Container;
186
194
  protected _tableAlias: string;
195
+ protected _model: Constructor<ModelBase>;
187
196
  get Statements(): IQueryStatement[];
188
197
  get Op(): WhereBoolean;
189
198
  constructor(container: Container, tableAlias?: string);
190
- where(column: string | boolean | WhereFunction<T> | RawQuery | Wrap | Partial<T>, operator?: SqlOperator | any, value?: any): this;
199
+ where(column: string | boolean | WhereFunction<T> | RawQuery | Wrap | PartialModel<T> | PickRelations<T, Relation<any, any>>, operator?: SqlOperator | any, value?: any): this;
191
200
  orWhere(column: string | boolean | WhereFunction<T> | {}, ..._args: any[]): this;
192
201
  andWhere(column: string | boolean | WhereFunction<T> | {}, ..._args: any[]): this;
193
202
  whereObject(obj: any): this;
@@ -203,7 +212,6 @@ export declare class WhereBuilder<T> implements IWhereBuilder<T> {
203
212
  whereInSet(column: string, val: any[]): this;
204
213
  whereNotInSet(column: string, val: any[]): this;
205
214
  clearWhere(): this;
206
- protected mapValues(val: unknown | unknown[]): any;
207
215
  }
208
216
  export declare class SelectQueryBuilder<T = any> extends QueryBuilder<T> {
209
217
  /**
@@ -483,7 +491,15 @@ export declare class TableQueryBuilder extends QueryBuilder {
483
491
  mediumblob: (name: string) => ColumnQueryBuilder;
484
492
  longblob: (name: string) => ColumnQueryBuilder;
485
493
  ifExists(): TableQueryBuilder;
494
+ /**
495
+ * Mark table as temporary
496
+ */
486
497
  temporary(): TableQueryBuilder;
498
+ /**
499
+ * Turn on history trackign for this table
500
+ * Each change & row will be tracked, and all history of changes can be accessed
501
+ */
502
+ trackHistory(): this;
487
503
  set: (name: string, allowed: string[]) => ColumnQueryBuilder;
488
504
  get Columns(): ColumnQueryBuilder[];
489
505
  get ForeignKeys(): ForeignKeyBuilder[];
@@ -493,14 +509,16 @@ export declare class TableQueryBuilder extends QueryBuilder {
493
509
  protected _charset: string;
494
510
  protected _checkExists: boolean;
495
511
  protected _temporary: boolean;
512
+ protected _trackHistory: boolean;
496
513
  get CheckExists(): boolean;
497
514
  get Temporary(): boolean;
515
+ get TrackHistory(): boolean;
498
516
  constructor(container: Container, driver: OrmDriver, name: string);
499
517
  increments(name: string): ColumnQueryBuilder;
500
518
  comment(comment: string): void;
501
519
  charset(charset: string): void;
502
520
  foreignKey(foreignKey: string): ForeignKeyBuilder;
503
- toDB(): ICompilerOutput;
521
+ toDB(): ICompilerOutput | ICompilerOutput[];
504
522
  }
505
523
  export declare class TruncateTableQueryBuilder extends QueryBuilder {
506
524
  protected container: Container;
@@ -538,6 +556,72 @@ export declare class CloneTableQueryBuilder extends QueryBuilder {
538
556
  deepClone(srcTable: string, newTable: string, filter?: (query: SelectQueryBuilder) => void): Promise<any>;
539
557
  toDB(): ICompilerOutput[];
540
558
  }
559
+ export declare class EventIntervalDesc {
560
+ Year: number;
561
+ Month: number;
562
+ Minute: number;
563
+ Hour: number;
564
+ Second: number;
565
+ }
566
+ export declare class EventQueryBuilder extends QueryBuilder {
567
+ protected container: Container;
568
+ protected driver: OrmDriver;
569
+ Name: string;
570
+ EveryInterval: EventIntervalDesc;
571
+ FromNowInverval: EventIntervalDesc;
572
+ Comment: string;
573
+ At: DateTime;
574
+ RawSql: RawQueryStatement;
575
+ Queries: QueryBuilder[];
576
+ constructor(container: Container, driver: OrmDriver, Name: string);
577
+ /**
578
+ * execute every time with specified interval ( days, hours, seconds, minutes etc)
579
+ */
580
+ every(): EventIntervalDesc;
581
+ /**
582
+ *
583
+ * Execute at specific time
584
+ *
585
+ * @param dateTime - specific time
586
+ */
587
+ at(dateTime: DateTime): void;
588
+ /**
589
+ * execute once at specific interfal from now eg. now + 1 day
590
+ */
591
+ fromNow(): EventIntervalDesc;
592
+ /**
593
+ *
594
+ * @param sql - code to execute, could be raw sql query, single builder, or multiple builders that will be executed on by one
595
+ */
596
+ do(sql: RawQueryStatement | QueryBuilder[] | QueryBuilder): void;
597
+ /**
598
+ *
599
+ * Add comment to schedule for documentation. It is passed to sql engine
600
+ *
601
+ * @param comment - comment text
602
+ */
603
+ comment(comment: string): void;
604
+ toDB(): ICompilerOutput[];
605
+ }
606
+ export declare class DropEventQueryBuilder extends QueryBuilder {
607
+ protected container: Container;
608
+ protected driver: OrmDriver;
609
+ Name: string;
610
+ constructor(container: Container, driver: OrmDriver, Name: string);
611
+ toDB(): ICompilerOutput[];
612
+ }
613
+ /**
614
+ * Creates schedule job in database engine.
615
+ * Note, some engines does not support this, so it will implemented
616
+ * as nodejs interval
617
+ */
618
+ export declare class ScheduleQueryBuilder {
619
+ protected container: Container;
620
+ protected driver: OrmDriver;
621
+ constructor(container: Container, driver: OrmDriver);
622
+ create(name: string, callback: (event: EventQueryBuilder) => void): EventQueryBuilder;
623
+ drop(name: string): DropEventQueryBuilder;
624
+ }
541
625
  export declare class SchemaQueryBuilder {
542
626
  protected container: Container;
543
627
  protected driver: OrmDriver;
@@ -547,4 +631,6 @@ export declare class SchemaQueryBuilder {
547
631
  alterTable(name: string, callback: (table: AlterTableQueryBuilder) => void): AlterTableQueryBuilder;
548
632
  dropTable(name: string, schema?: string): DropTableQueryBuilder;
549
633
  tableExists(name: string, schema?: string): Promise<boolean>;
634
+ event(name: string): Promise<any>;
635
+ dropEvent(name: string): Promise<any>;
550
636
  }
package/lib/builders.js CHANGED
@@ -33,9 +33,8 @@ var __metadata = (this && this.__metadata) || function (k, v) {
33
33
  };
34
34
  var RawQuery_1, WhereBuilder_1;
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.SchemaQueryBuilder = exports.CloneTableQueryBuilder = exports.TruncateTableQueryBuilder = exports.TableQueryBuilder = exports.AlterTableQueryBuilder = exports.DropTableQueryBuilder = exports.TableExistsQueryBuilder = exports.AlterColumnQueryBuilder = exports.ColumnQueryBuilder = exports.ForeignKeyBuilder = exports.IndexQueryBuilder = exports.InsertQueryBuilder = exports.UpdateQueryBuilder = exports.OnDuplicateQueryBuilder = exports.DeleteQueryBuilder = exports.SelectQueryBuilder = exports.WhereBuilder = exports.WithRecursiveBuilder = exports.JoinBuilder = exports.GroupByBuilder = exports.RawQuery = exports.ColumnsBuilder = exports.OrderByBuilder = exports.LimitBuilder = exports.QueryBuilder = exports.Builder = void 0;
36
+ exports.SchemaQueryBuilder = exports.ScheduleQueryBuilder = exports.DropEventQueryBuilder = exports.EventQueryBuilder = exports.EventIntervalDesc = exports.CloneTableQueryBuilder = exports.TruncateTableQueryBuilder = exports.TableQueryBuilder = exports.AlterTableQueryBuilder = exports.DropTableQueryBuilder = exports.TableExistsQueryBuilder = exports.AlterColumnQueryBuilder = exports.ColumnQueryBuilder = exports.ForeignKeyBuilder = exports.IndexQueryBuilder = exports.InsertQueryBuilder = exports.UpdateQueryBuilder = exports.OnDuplicateQueryBuilder = exports.DeleteQueryBuilder = exports.SelectQueryBuilder = exports.WhereBuilder = exports.WithRecursiveBuilder = exports.JoinBuilder = exports.GroupByBuilder = exports.RawQuery = exports.ColumnsBuilder = exports.OrderByBuilder = exports.LimitBuilder = exports.QueryBuilder = exports.Builder = void 0;
37
37
  /* eslint-disable prettier/prettier */
38
- const luxon_1 = require("luxon");
39
38
  const di_1 = require("@spinajs/di");
40
39
  const exceptions_1 = require("@spinajs/exceptions");
41
40
  const exceptions_2 = require("./exceptions");
@@ -48,7 +47,6 @@ const driver_1 = require("./driver");
48
47
  const model_1 = require("./model");
49
48
  const relations_1 = require("./relations");
50
49
  const orm_1 = require("./orm");
51
- const _1 = require(".");
52
50
  function isWhereOperator(val) {
53
51
  return _.isString(val) && Object.values(enums_1.SqlOperator).includes(val.toLowerCase());
54
52
  }
@@ -61,7 +59,7 @@ let Builder = class Builder {
61
59
  this._model = model;
62
60
  this._nonSelect = true;
63
61
  this._asRaw = false;
64
- this._queryMiddlewares = di_1.DI.resolve(Array.ofType(_1.QueryMiddleware));
62
+ this._queryMiddlewares = di_1.DI.resolve(Array.ofType(interfaces_1.QueryMiddleware));
65
63
  }
66
64
  get Driver() {
67
65
  return this._driver;
@@ -456,14 +454,17 @@ class JoinBuilder {
456
454
  }
457
455
  addJoinStatement(method, table, AliasOrForeignKey, fkOrPkKey, primaryKey) {
458
456
  let stmt = null;
459
- if (arguments.length === 4) {
460
- stmt = this._container.resolve(statements_1.JoinStatement, [table, method, AliasOrForeignKey, fkOrPkKey, null, this._tableAlias]);
457
+ if (arguments.length === 3) {
458
+ stmt = this._container.resolve(statements_1.JoinStatement, [this, this._model, table, method, AliasOrForeignKey]);
459
+ }
460
+ else if (arguments.length === 4) {
461
+ stmt = this._container.resolve(statements_1.JoinStatement, [this, this._model, table, method, AliasOrForeignKey, fkOrPkKey, null, this._tableAlias]);
461
462
  }
462
463
  else if (arguments.length === 5) {
463
- stmt = this._container.resolve(statements_1.JoinStatement, [table, method, fkOrPkKey, primaryKey, AliasOrForeignKey, this._tableAlias]);
464
+ stmt = this._container.resolve(statements_1.JoinStatement, [this, this._model, table, method, fkOrPkKey, primaryKey, AliasOrForeignKey, this._tableAlias]);
464
465
  }
465
466
  else {
466
- stmt = this._container.resolve(statements_1.JoinStatement, [table, method]);
467
+ stmt = this._container.resolve(statements_1.JoinStatement, [this, this._model, table, method]);
467
468
  }
468
469
  this.JoinStatements.push(stmt);
469
470
  }
@@ -537,10 +538,7 @@ let WhereBuilder = WhereBuilder_1 = class WhereBuilder {
537
538
  if (sVal === null) {
538
539
  return this.whereNull(c);
539
540
  }
540
- if (sVal instanceof luxon_1.DateTime || sVal instanceof Date) {
541
- sVal = self._container.resolve(interfaces_1.DatetimeValueConverter).toDB(sVal);
542
- }
543
- self._statements.push(self._container.resolve(statements_1.WhereStatement, [c, enums_1.SqlOperator.EQ, sVal, self._tableAlias, this._container]));
541
+ self._statements.push(self._container.resolve(statements_1.WhereStatement, [c, enums_1.SqlOperator.EQ, sVal, self._tableAlias, this._container, self._model]));
544
542
  return self;
545
543
  }
546
544
  /**
@@ -561,10 +559,7 @@ let WhereBuilder = WhereBuilder_1 = class WhereBuilder {
561
559
  if (sVal === null) {
562
560
  return o === enums_1.SqlOperator.NOT_NULL ? this.whereNotNull(c) : this.whereNull(c);
563
561
  }
564
- if (sVal instanceof luxon_1.DateTime || sVal instanceof Date) {
565
- sVal = self._container.resolve(interfaces_1.DatetimeValueConverter).toDB(sVal);
566
- }
567
- self._statements.push(self._container.resolve(statements_1.WhereStatement, [c, o, sVal, self._tableAlias, this._container]));
562
+ self._statements.push(self._container.resolve(statements_1.WhereStatement, [c, o, sVal, self._tableAlias, this._container, self._model]));
568
563
  return this;
569
564
  }
570
565
  }
@@ -583,22 +578,22 @@ let WhereBuilder = WhereBuilder_1 = class WhereBuilder {
583
578
  return this;
584
579
  }
585
580
  whereNotNull(column) {
586
- this._statements.push(this._container.resolve(statements_1.WhereStatement, [column, enums_1.SqlOperator.NOT_NULL, null, this._tableAlias]));
581
+ this._statements.push(this._container.resolve(statements_1.WhereStatement, [column, enums_1.SqlOperator.NOT_NULL, null, this._tableAlias, this._container]));
587
582
  return this;
588
583
  }
589
584
  whereNull(column) {
590
- this._statements.push(this._container.resolve(statements_1.WhereStatement, [column, enums_1.SqlOperator.NULL, null, this._tableAlias]));
585
+ this._statements.push(this._container.resolve(statements_1.WhereStatement, [column, enums_1.SqlOperator.NULL, null, this._tableAlias, this._container]));
591
586
  return this;
592
587
  }
593
588
  whereNot(column, val) {
594
- return this.where(column, enums_1.SqlOperator.NOT, this.mapValues(val));
589
+ return this.where(column, enums_1.SqlOperator.NOT, val);
595
590
  }
596
591
  whereIn(column, val) {
597
- this._statements.push(this._container.resolve(statements_1.InStatement, [column, this.mapValues(val), false, this._tableAlias]));
592
+ this._statements.push(this._container.resolve(statements_1.InStatement, [column, val, false, this._tableAlias, this._container]));
598
593
  return this;
599
594
  }
600
595
  whereNotIn(column, val) {
601
- this._statements.push(this._container.resolve(statements_1.InStatement, [column, this.mapValues(val), true, this._tableAlias]));
596
+ this._statements.push(this._container.resolve(statements_1.InStatement, [column, val, true, this._tableAlias, this._container]));
602
597
  return this;
603
598
  }
604
599
  whereExist(query) {
@@ -610,40 +605,25 @@ let WhereBuilder = WhereBuilder_1 = class WhereBuilder {
610
605
  return this;
611
606
  }
612
607
  whereBetween(column, val) {
613
- this._statements.push(this._container.resolve(statements_1.BetweenStatement, [column, this.mapValues(val), false, this._tableAlias]));
608
+ this._statements.push(this._container.resolve(statements_1.BetweenStatement, [column, val, false, this._tableAlias]));
614
609
  return this;
615
610
  }
616
611
  whereNotBetween(column, val) {
617
- this._statements.push(this._container.resolve(statements_1.BetweenStatement, [column, this.mapValues(val), true, this._tableAlias]));
612
+ this._statements.push(this._container.resolve(statements_1.BetweenStatement, [column, val, true, this._tableAlias]));
618
613
  return this;
619
614
  }
620
615
  whereInSet(column, val) {
621
- this._statements.push(this._container.resolve(statements_1.InSetStatement, [column, this.mapValues(val), false, this._tableAlias]));
616
+ this._statements.push(this._container.resolve(statements_1.InSetStatement, [column, val, false, this._tableAlias]));
622
617
  return this;
623
618
  }
624
619
  whereNotInSet(column, val) {
625
- this._statements.push(this._container.resolve(statements_1.InSetStatement, [column, this.mapValues(val), true, this._tableAlias]));
620
+ this._statements.push(this._container.resolve(statements_1.InSetStatement, [column, val, true, this._tableAlias]));
626
621
  return this;
627
622
  }
628
623
  clearWhere() {
629
624
  this._statements = [];
630
625
  return this;
631
626
  }
632
- mapValues(val) {
633
- const dConverter = this._container.resolve(interfaces_1.DatetimeValueConverter);
634
- const mapVal = (d) => {
635
- if (d instanceof luxon_1.DateTime || d instanceof Date) {
636
- return dConverter.toDB(d);
637
- }
638
- return d;
639
- };
640
- if (Array.isArray(val)) {
641
- return val.map(mapVal);
642
- }
643
- else {
644
- return mapVal(val);
645
- }
646
- }
647
627
  };
648
628
  WhereBuilder = WhereBuilder_1 = __decorate([
649
629
  (0, di_1.NewInstance)(),
@@ -1097,7 +1077,7 @@ let ColumnQueryBuilder = class ColumnQueryBuilder {
1097
1077
  return this;
1098
1078
  }
1099
1079
  default() {
1100
- this.Default = this.container.resolve((_1.DefaultValueBuilder), [this]);
1080
+ this.Default = this.container.resolve((interfaces_1.DefaultValueBuilder), [this]);
1101
1081
  return this.Default;
1102
1082
  }
1103
1083
  primaryKey() {
@@ -1128,18 +1108,18 @@ let AlterColumnQueryBuilder = class AlterColumnQueryBuilder extends ColumnQueryB
1128
1108
  super(container, name, type, ...args);
1129
1109
  this.OldName = name;
1130
1110
  // we assume add by default
1131
- this.AlterType = _1.ColumnAlterationType.Add;
1111
+ this.AlterType = interfaces_1.ColumnAlterationType.Add;
1132
1112
  }
1133
1113
  addColumn() {
1134
- this.AlterType = _1.ColumnAlterationType.Add;
1114
+ this.AlterType = interfaces_1.ColumnAlterationType.Add;
1135
1115
  return this;
1136
1116
  }
1137
1117
  modify() {
1138
- this.AlterType = _1.ColumnAlterationType.Modify;
1118
+ this.AlterType = interfaces_1.ColumnAlterationType.Modify;
1139
1119
  return this;
1140
1120
  }
1141
1121
  rename(newName) {
1142
- this.AlterType = _1.ColumnAlterationType.Rename;
1122
+ this.AlterType = interfaces_1.ColumnAlterationType.Rename;
1143
1123
  this.Name = newName;
1144
1124
  return this;
1145
1125
  }
@@ -1160,7 +1140,7 @@ class TableExistsQueryBuilder extends QueryBuilder {
1160
1140
  this.QueryContext = interfaces_1.QueryContext.Select;
1161
1141
  }
1162
1142
  toDB() {
1163
- return this._container.resolve(_1.TableExistsCompiler, [this]).compile();
1143
+ return this._container.resolve(interfaces_1.TableExistsCompiler, [this]).compile();
1164
1144
  }
1165
1145
  }
1166
1146
  exports.TableExistsQueryBuilder = TableExistsQueryBuilder;
@@ -1179,7 +1159,7 @@ class DropTableQueryBuilder extends QueryBuilder {
1179
1159
  return this;
1180
1160
  }
1181
1161
  toDB() {
1182
- return this._container.resolve(_1.DropTableCompiler, [this]).compile();
1162
+ return this._container.resolve(interfaces_1.DropTableCompiler, [this]).compile();
1183
1163
  }
1184
1164
  }
1185
1165
  exports.DropTableQueryBuilder = DropTableQueryBuilder;
@@ -1218,6 +1198,7 @@ class TableQueryBuilder extends QueryBuilder {
1218
1198
  this._columns = [];
1219
1199
  this._foreignKeys = [];
1220
1200
  this._temporary = false;
1201
+ this._trackHistory = false;
1221
1202
  this.setTable(name);
1222
1203
  this.QueryContext = interfaces_1.QueryContext.Schema;
1223
1204
  }
@@ -1231,10 +1212,21 @@ class TableQueryBuilder extends QueryBuilder {
1231
1212
  this._checkExists = true;
1232
1213
  return this;
1233
1214
  }
1215
+ /**
1216
+ * Mark table as temporary
1217
+ */
1234
1218
  temporary() {
1235
1219
  this._temporary = true;
1236
1220
  return this;
1237
1221
  }
1222
+ /**
1223
+ * Turn on history trackign for this table
1224
+ * Each change & row will be tracked, and all history of changes can be accessed
1225
+ */
1226
+ trackHistory() {
1227
+ this._trackHistory = true;
1228
+ return this;
1229
+ }
1238
1230
  get Columns() {
1239
1231
  return this._columns;
1240
1232
  }
@@ -1247,6 +1239,9 @@ class TableQueryBuilder extends QueryBuilder {
1247
1239
  get Temporary() {
1248
1240
  return this._temporary;
1249
1241
  }
1242
+ get TrackHistory() {
1243
+ return this._trackHistory;
1244
+ }
1250
1245
  increments(name) {
1251
1246
  return this.int(name).autoIncrement().notNull().primaryKey();
1252
1247
  }
@@ -1335,7 +1330,7 @@ let CloneTableQueryBuilder = class CloneTableQueryBuilder extends QueryBuilder {
1335
1330
  return this;
1336
1331
  }
1337
1332
  toDB() {
1338
- return this._container.resolve(_1.TableCloneQueryCompiler, [this]).compile();
1333
+ return this._container.resolve(interfaces_1.TableCloneQueryCompiler, [this]).compile();
1339
1334
  }
1340
1335
  };
1341
1336
  CloneTableQueryBuilder = __decorate([
@@ -1344,6 +1339,115 @@ CloneTableQueryBuilder = __decorate([
1344
1339
  __metadata("design:paramtypes", [di_1.Container, driver_1.OrmDriver])
1345
1340
  ], CloneTableQueryBuilder);
1346
1341
  exports.CloneTableQueryBuilder = CloneTableQueryBuilder;
1342
+ class EventIntervalDesc {
1343
+ }
1344
+ exports.EventIntervalDesc = EventIntervalDesc;
1345
+ let EventQueryBuilder = class EventQueryBuilder extends QueryBuilder {
1346
+ constructor(container, driver, Name) {
1347
+ super(container, driver);
1348
+ this.container = container;
1349
+ this.driver = driver;
1350
+ this.Name = Name;
1351
+ }
1352
+ /**
1353
+ * execute every time with specified interval ( days, hours, seconds, minutes etc)
1354
+ */
1355
+ every() {
1356
+ this.EveryInterval = new EventIntervalDesc();
1357
+ return this.EveryInterval;
1358
+ }
1359
+ /**
1360
+ *
1361
+ * Execute at specific time
1362
+ *
1363
+ * @param dateTime - specific time
1364
+ */
1365
+ at(dateTime) {
1366
+ this.At = dateTime;
1367
+ }
1368
+ /**
1369
+ * execute once at specific interfal from now eg. now + 1 day
1370
+ */
1371
+ fromNow() {
1372
+ this.FromNowInverval = new EventIntervalDesc();
1373
+ return this.FromNowInverval;
1374
+ }
1375
+ /**
1376
+ *
1377
+ * @param sql - code to execute, could be raw sql query, single builder, or multiple builders that will be executed on by one
1378
+ */
1379
+ do(sql) {
1380
+ if (sql instanceof statements_1.RawQueryStatement) {
1381
+ this.RawSql = sql;
1382
+ }
1383
+ else if (Array.isArray(sql)) {
1384
+ this.Queries = sql;
1385
+ }
1386
+ else {
1387
+ this.Queries = [sql];
1388
+ }
1389
+ }
1390
+ /**
1391
+ *
1392
+ * Add comment to schedule for documentation. It is passed to sql engine
1393
+ *
1394
+ * @param comment - comment text
1395
+ */
1396
+ comment(comment) {
1397
+ this.Comment = comment;
1398
+ }
1399
+ toDB() {
1400
+ return this._container.resolve(interfaces_1.EventQueryCompiler, [this]).compile();
1401
+ }
1402
+ };
1403
+ EventQueryBuilder = __decorate([
1404
+ (0, di_1.NewInstance)(),
1405
+ (0, di_1.Inject)(di_1.Container),
1406
+ __metadata("design:paramtypes", [di_1.Container, driver_1.OrmDriver, String])
1407
+ ], EventQueryBuilder);
1408
+ exports.EventQueryBuilder = EventQueryBuilder;
1409
+ let DropEventQueryBuilder = class DropEventQueryBuilder extends QueryBuilder {
1410
+ constructor(container, driver, Name) {
1411
+ super(container, driver);
1412
+ this.container = container;
1413
+ this.driver = driver;
1414
+ this.Name = Name;
1415
+ }
1416
+ toDB() {
1417
+ return this._container.resolve(interfaces_1.DropEventQueryCompiler, [this]).compile();
1418
+ }
1419
+ };
1420
+ DropEventQueryBuilder = __decorate([
1421
+ (0, di_1.NewInstance)(),
1422
+ (0, di_1.Inject)(di_1.Container),
1423
+ __metadata("design:paramtypes", [di_1.Container, driver_1.OrmDriver, String])
1424
+ ], DropEventQueryBuilder);
1425
+ exports.DropEventQueryBuilder = DropEventQueryBuilder;
1426
+ /**
1427
+ * Creates schedule job in database engine.
1428
+ * Note, some engines does not support this, so it will implemented
1429
+ * as nodejs interval
1430
+ */
1431
+ let ScheduleQueryBuilder = class ScheduleQueryBuilder {
1432
+ constructor(container, driver) {
1433
+ this.container = container;
1434
+ this.driver = driver;
1435
+ }
1436
+ create(name, callback) {
1437
+ const builder = new EventQueryBuilder(this.container, this.driver, name);
1438
+ callback.call(this, builder);
1439
+ return builder;
1440
+ }
1441
+ drop(name) {
1442
+ return new DropEventQueryBuilder(this.container, this.driver, name);
1443
+ }
1444
+ };
1445
+ ScheduleQueryBuilder = __decorate([
1446
+ (0, di_1.NewInstance)(),
1447
+ (0, di_1.Inject)(di_1.Container),
1448
+ __metadata("design:paramtypes", [di_1.Container, driver_1.OrmDriver])
1449
+ ], ScheduleQueryBuilder);
1450
+ exports.ScheduleQueryBuilder = ScheduleQueryBuilder;
1347
1451
  let SchemaQueryBuilder = class SchemaQueryBuilder {
1348
1452
  constructor(container, driver) {
1349
1453
  this.container = container;
@@ -1375,6 +1479,12 @@ let SchemaQueryBuilder = class SchemaQueryBuilder {
1375
1479
  const exists = await query;
1376
1480
  return exists !== null && exists.length === 1;
1377
1481
  }
1482
+ async event(name) {
1483
+ return new EventQueryBuilder(this.container, this.driver, name);
1484
+ }
1485
+ async dropEvent(name) {
1486
+ return new DropEventQueryBuilder(this.container, this.driver, name);
1487
+ }
1378
1488
  };
1379
1489
  SchemaQueryBuilder = __decorate([
1380
1490
  (0, di_1.NewInstance)(),