@spinajs/orm 2.0.38 → 2.0.44

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, 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.
@@ -20,7 +20,7 @@ export interface DeleteQueryBuilder<T> extends IWhereBuilder<T>, ILimitBuilder<T
20
20
  }
21
21
  export interface UpdateQueryBuilder<T> extends IColumnsBuilder, IWhereBuilder<T> {
22
22
  }
23
- export interface SelectQueryBuilder<T> extends IColumnsBuilder, IOrderByBuilder, ILimitBuilder<T>, IWhereBuilder<T>, IJoinBuilder, IWithRecursiveBuilder, IGroupByBuilder, ISelectBuilderExtensions {
23
+ export interface SelectQueryBuilder<T> extends IColumnsBuilder, IOrderByBuilder, ILimitBuilder<T>, IWhereBuilder<T>, IJoinBuilder, IWithRecursiveBuilder, IGroupByBuilder {
24
24
  }
25
25
  export declare class Builder<T = any> implements PromiseLike<T> {
26
26
  protected _driver: OrmDriver;
@@ -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
  /**
@@ -251,6 +259,8 @@ export declare class SelectQueryBuilder<T = any> extends QueryBuilder<T> {
251
259
  then<TResult1 = T, TResult2 = never>(onfulfilled?: (value: T) => TResult1 | PromiseLike<TResult1>, onrejected?: (reason: any) => TResult2 | PromiseLike<TResult2>): PromiseLike<TResult1 | TResult2>;
252
260
  execute(): Promise<T>;
253
261
  }
262
+ export declare class SelectQueryBuilderC<T = any> extends SelectQueryBuilder<T> {
263
+ }
254
264
  export declare class DeleteQueryBuilder<T> extends QueryBuilder<IUpdateResult> {
255
265
  /**
256
266
  * where query props
@@ -483,7 +493,15 @@ export declare class TableQueryBuilder extends QueryBuilder {
483
493
  mediumblob: (name: string) => ColumnQueryBuilder;
484
494
  longblob: (name: string) => ColumnQueryBuilder;
485
495
  ifExists(): TableQueryBuilder;
496
+ /**
497
+ * Mark table as temporary
498
+ */
486
499
  temporary(): TableQueryBuilder;
500
+ /**
501
+ * Turn on history trackign for this table
502
+ * Each change & row will be tracked, and all history of changes can be accessed
503
+ */
504
+ trackHistory(): this;
487
505
  set: (name: string, allowed: string[]) => ColumnQueryBuilder;
488
506
  get Columns(): ColumnQueryBuilder[];
489
507
  get ForeignKeys(): ForeignKeyBuilder[];
@@ -493,14 +511,16 @@ export declare class TableQueryBuilder extends QueryBuilder {
493
511
  protected _charset: string;
494
512
  protected _checkExists: boolean;
495
513
  protected _temporary: boolean;
514
+ protected _trackHistory: boolean;
496
515
  get CheckExists(): boolean;
497
516
  get Temporary(): boolean;
517
+ get TrackHistory(): boolean;
498
518
  constructor(container: Container, driver: OrmDriver, name: string);
499
519
  increments(name: string): ColumnQueryBuilder;
500
520
  comment(comment: string): void;
501
521
  charset(charset: string): void;
502
522
  foreignKey(foreignKey: string): ForeignKeyBuilder;
503
- toDB(): ICompilerOutput;
523
+ toDB(): ICompilerOutput | ICompilerOutput[];
504
524
  }
505
525
  export declare class TruncateTableQueryBuilder extends QueryBuilder {
506
526
  protected container: Container;
@@ -538,6 +558,72 @@ export declare class CloneTableQueryBuilder extends QueryBuilder {
538
558
  deepClone(srcTable: string, newTable: string, filter?: (query: SelectQueryBuilder) => void): Promise<any>;
539
559
  toDB(): ICompilerOutput[];
540
560
  }
561
+ export declare class EventIntervalDesc {
562
+ Year: number;
563
+ Month: number;
564
+ Minute: number;
565
+ Hour: number;
566
+ Second: number;
567
+ }
568
+ export declare class EventQueryBuilder extends QueryBuilder {
569
+ protected container: Container;
570
+ protected driver: OrmDriver;
571
+ Name: string;
572
+ EveryInterval: EventIntervalDesc;
573
+ FromNowInverval: EventIntervalDesc;
574
+ Comment: string;
575
+ At: DateTime;
576
+ RawSql: RawQueryStatement;
577
+ Queries: QueryBuilder[];
578
+ constructor(container: Container, driver: OrmDriver, Name: string);
579
+ /**
580
+ * execute every time with specified interval ( days, hours, seconds, minutes etc)
581
+ */
582
+ every(): EventIntervalDesc;
583
+ /**
584
+ *
585
+ * Execute at specific time
586
+ *
587
+ * @param dateTime - specific time
588
+ */
589
+ at(dateTime: DateTime): void;
590
+ /**
591
+ * execute once at specific interfal from now eg. now + 1 day
592
+ */
593
+ fromNow(): EventIntervalDesc;
594
+ /**
595
+ *
596
+ * @param sql - code to execute, could be raw sql query, single builder, or multiple builders that will be executed on by one
597
+ */
598
+ do(sql: RawQueryStatement | QueryBuilder[] | QueryBuilder): void;
599
+ /**
600
+ *
601
+ * Add comment to schedule for documentation. It is passed to sql engine
602
+ *
603
+ * @param comment - comment text
604
+ */
605
+ comment(comment: string): void;
606
+ toDB(): ICompilerOutput[];
607
+ }
608
+ export declare class DropEventQueryBuilder extends QueryBuilder {
609
+ protected container: Container;
610
+ protected driver: OrmDriver;
611
+ Name: string;
612
+ constructor(container: Container, driver: OrmDriver, Name: string);
613
+ toDB(): ICompilerOutput[];
614
+ }
615
+ /**
616
+ * Creates schedule job in database engine.
617
+ * Note, some engines does not support this, so it will implemented
618
+ * as nodejs interval
619
+ */
620
+ export declare class ScheduleQueryBuilder {
621
+ protected container: Container;
622
+ protected driver: OrmDriver;
623
+ constructor(container: Container, driver: OrmDriver);
624
+ create(name: string, callback: (event: EventQueryBuilder) => void): EventQueryBuilder;
625
+ drop(name: string): DropEventQueryBuilder;
626
+ }
541
627
  export declare class SchemaQueryBuilder {
542
628
  protected container: Container;
543
629
  protected driver: OrmDriver;
@@ -547,4 +633,6 @@ export declare class SchemaQueryBuilder {
547
633
  alterTable(name: string, callback: (table: AlterTableQueryBuilder) => void): AlterTableQueryBuilder;
548
634
  dropTable(name: string, schema?: string): DropTableQueryBuilder;
549
635
  tableExists(name: string, schema?: string): Promise<boolean>;
636
+ event(name: string): Promise<any>;
637
+ dropEvent(name: string): Promise<any>;
550
638
  }
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.SelectQueryBuilderC = 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)(),
@@ -816,6 +796,9 @@ __decorate([
816
796
  __metadata("design:type", Object)
817
797
  ], SelectQueryBuilder.prototype, "this", void 0);
818
798
  exports.SelectQueryBuilder = SelectQueryBuilder;
799
+ class SelectQueryBuilderC extends SelectQueryBuilder {
800
+ }
801
+ exports.SelectQueryBuilderC = SelectQueryBuilderC;
819
802
  class DeleteQueryBuilder extends QueryBuilder {
820
803
  constructor(container, driver, model) {
821
804
  super(container, driver, model);
@@ -1097,7 +1080,7 @@ let ColumnQueryBuilder = class ColumnQueryBuilder {
1097
1080
  return this;
1098
1081
  }
1099
1082
  default() {
1100
- this.Default = this.container.resolve((_1.DefaultValueBuilder), [this]);
1083
+ this.Default = this.container.resolve((interfaces_1.DefaultValueBuilder), [this]);
1101
1084
  return this.Default;
1102
1085
  }
1103
1086
  primaryKey() {
@@ -1128,18 +1111,18 @@ let AlterColumnQueryBuilder = class AlterColumnQueryBuilder extends ColumnQueryB
1128
1111
  super(container, name, type, ...args);
1129
1112
  this.OldName = name;
1130
1113
  // we assume add by default
1131
- this.AlterType = _1.ColumnAlterationType.Add;
1114
+ this.AlterType = interfaces_1.ColumnAlterationType.Add;
1132
1115
  }
1133
1116
  addColumn() {
1134
- this.AlterType = _1.ColumnAlterationType.Add;
1117
+ this.AlterType = interfaces_1.ColumnAlterationType.Add;
1135
1118
  return this;
1136
1119
  }
1137
1120
  modify() {
1138
- this.AlterType = _1.ColumnAlterationType.Modify;
1121
+ this.AlterType = interfaces_1.ColumnAlterationType.Modify;
1139
1122
  return this;
1140
1123
  }
1141
1124
  rename(newName) {
1142
- this.AlterType = _1.ColumnAlterationType.Rename;
1125
+ this.AlterType = interfaces_1.ColumnAlterationType.Rename;
1143
1126
  this.Name = newName;
1144
1127
  return this;
1145
1128
  }
@@ -1160,7 +1143,7 @@ class TableExistsQueryBuilder extends QueryBuilder {
1160
1143
  this.QueryContext = interfaces_1.QueryContext.Select;
1161
1144
  }
1162
1145
  toDB() {
1163
- return this._container.resolve(_1.TableExistsCompiler, [this]).compile();
1146
+ return this._container.resolve(interfaces_1.TableExistsCompiler, [this]).compile();
1164
1147
  }
1165
1148
  }
1166
1149
  exports.TableExistsQueryBuilder = TableExistsQueryBuilder;
@@ -1179,7 +1162,7 @@ class DropTableQueryBuilder extends QueryBuilder {
1179
1162
  return this;
1180
1163
  }
1181
1164
  toDB() {
1182
- return this._container.resolve(_1.DropTableCompiler, [this]).compile();
1165
+ return this._container.resolve(interfaces_1.DropTableCompiler, [this]).compile();
1183
1166
  }
1184
1167
  }
1185
1168
  exports.DropTableQueryBuilder = DropTableQueryBuilder;
@@ -1218,6 +1201,7 @@ class TableQueryBuilder extends QueryBuilder {
1218
1201
  this._columns = [];
1219
1202
  this._foreignKeys = [];
1220
1203
  this._temporary = false;
1204
+ this._trackHistory = false;
1221
1205
  this.setTable(name);
1222
1206
  this.QueryContext = interfaces_1.QueryContext.Schema;
1223
1207
  }
@@ -1231,10 +1215,21 @@ class TableQueryBuilder extends QueryBuilder {
1231
1215
  this._checkExists = true;
1232
1216
  return this;
1233
1217
  }
1218
+ /**
1219
+ * Mark table as temporary
1220
+ */
1234
1221
  temporary() {
1235
1222
  this._temporary = true;
1236
1223
  return this;
1237
1224
  }
1225
+ /**
1226
+ * Turn on history trackign for this table
1227
+ * Each change & row will be tracked, and all history of changes can be accessed
1228
+ */
1229
+ trackHistory() {
1230
+ this._trackHistory = true;
1231
+ return this;
1232
+ }
1238
1233
  get Columns() {
1239
1234
  return this._columns;
1240
1235
  }
@@ -1247,6 +1242,9 @@ class TableQueryBuilder extends QueryBuilder {
1247
1242
  get Temporary() {
1248
1243
  return this._temporary;
1249
1244
  }
1245
+ get TrackHistory() {
1246
+ return this._trackHistory;
1247
+ }
1250
1248
  increments(name) {
1251
1249
  return this.int(name).autoIncrement().notNull().primaryKey();
1252
1250
  }
@@ -1335,7 +1333,7 @@ let CloneTableQueryBuilder = class CloneTableQueryBuilder extends QueryBuilder {
1335
1333
  return this;
1336
1334
  }
1337
1335
  toDB() {
1338
- return this._container.resolve(_1.TableCloneQueryCompiler, [this]).compile();
1336
+ return this._container.resolve(interfaces_1.TableCloneQueryCompiler, [this]).compile();
1339
1337
  }
1340
1338
  };
1341
1339
  CloneTableQueryBuilder = __decorate([
@@ -1344,6 +1342,115 @@ CloneTableQueryBuilder = __decorate([
1344
1342
  __metadata("design:paramtypes", [di_1.Container, driver_1.OrmDriver])
1345
1343
  ], CloneTableQueryBuilder);
1346
1344
  exports.CloneTableQueryBuilder = CloneTableQueryBuilder;
1345
+ class EventIntervalDesc {
1346
+ }
1347
+ exports.EventIntervalDesc = EventIntervalDesc;
1348
+ let EventQueryBuilder = class EventQueryBuilder extends QueryBuilder {
1349
+ constructor(container, driver, Name) {
1350
+ super(container, driver);
1351
+ this.container = container;
1352
+ this.driver = driver;
1353
+ this.Name = Name;
1354
+ }
1355
+ /**
1356
+ * execute every time with specified interval ( days, hours, seconds, minutes etc)
1357
+ */
1358
+ every() {
1359
+ this.EveryInterval = new EventIntervalDesc();
1360
+ return this.EveryInterval;
1361
+ }
1362
+ /**
1363
+ *
1364
+ * Execute at specific time
1365
+ *
1366
+ * @param dateTime - specific time
1367
+ */
1368
+ at(dateTime) {
1369
+ this.At = dateTime;
1370
+ }
1371
+ /**
1372
+ * execute once at specific interfal from now eg. now + 1 day
1373
+ */
1374
+ fromNow() {
1375
+ this.FromNowInverval = new EventIntervalDesc();
1376
+ return this.FromNowInverval;
1377
+ }
1378
+ /**
1379
+ *
1380
+ * @param sql - code to execute, could be raw sql query, single builder, or multiple builders that will be executed on by one
1381
+ */
1382
+ do(sql) {
1383
+ if (sql instanceof statements_1.RawQueryStatement) {
1384
+ this.RawSql = sql;
1385
+ }
1386
+ else if (Array.isArray(sql)) {
1387
+ this.Queries = sql;
1388
+ }
1389
+ else {
1390
+ this.Queries = [sql];
1391
+ }
1392
+ }
1393
+ /**
1394
+ *
1395
+ * Add comment to schedule for documentation. It is passed to sql engine
1396
+ *
1397
+ * @param comment - comment text
1398
+ */
1399
+ comment(comment) {
1400
+ this.Comment = comment;
1401
+ }
1402
+ toDB() {
1403
+ return this._container.resolve(interfaces_1.EventQueryCompiler, [this]).compile();
1404
+ }
1405
+ };
1406
+ EventQueryBuilder = __decorate([
1407
+ (0, di_1.NewInstance)(),
1408
+ (0, di_1.Inject)(di_1.Container),
1409
+ __metadata("design:paramtypes", [di_1.Container, driver_1.OrmDriver, String])
1410
+ ], EventQueryBuilder);
1411
+ exports.EventQueryBuilder = EventQueryBuilder;
1412
+ let DropEventQueryBuilder = class DropEventQueryBuilder extends QueryBuilder {
1413
+ constructor(container, driver, Name) {
1414
+ super(container, driver);
1415
+ this.container = container;
1416
+ this.driver = driver;
1417
+ this.Name = Name;
1418
+ }
1419
+ toDB() {
1420
+ return this._container.resolve(interfaces_1.DropEventQueryCompiler, [this]).compile();
1421
+ }
1422
+ };
1423
+ DropEventQueryBuilder = __decorate([
1424
+ (0, di_1.NewInstance)(),
1425
+ (0, di_1.Inject)(di_1.Container),
1426
+ __metadata("design:paramtypes", [di_1.Container, driver_1.OrmDriver, String])
1427
+ ], DropEventQueryBuilder);
1428
+ exports.DropEventQueryBuilder = DropEventQueryBuilder;
1429
+ /**
1430
+ * Creates schedule job in database engine.
1431
+ * Note, some engines does not support this, so it will implemented
1432
+ * as nodejs interval
1433
+ */
1434
+ let ScheduleQueryBuilder = class ScheduleQueryBuilder {
1435
+ constructor(container, driver) {
1436
+ this.container = container;
1437
+ this.driver = driver;
1438
+ }
1439
+ create(name, callback) {
1440
+ const builder = new EventQueryBuilder(this.container, this.driver, name);
1441
+ callback.call(this, builder);
1442
+ return builder;
1443
+ }
1444
+ drop(name) {
1445
+ return new DropEventQueryBuilder(this.container, this.driver, name);
1446
+ }
1447
+ };
1448
+ ScheduleQueryBuilder = __decorate([
1449
+ (0, di_1.NewInstance)(),
1450
+ (0, di_1.Inject)(di_1.Container),
1451
+ __metadata("design:paramtypes", [di_1.Container, driver_1.OrmDriver])
1452
+ ], ScheduleQueryBuilder);
1453
+ exports.ScheduleQueryBuilder = ScheduleQueryBuilder;
1347
1454
  let SchemaQueryBuilder = class SchemaQueryBuilder {
1348
1455
  constructor(container, driver) {
1349
1456
  this.container = container;
@@ -1375,6 +1482,12 @@ let SchemaQueryBuilder = class SchemaQueryBuilder {
1375
1482
  const exists = await query;
1376
1483
  return exists !== null && exists.length === 1;
1377
1484
  }
1485
+ async event(name) {
1486
+ return new EventQueryBuilder(this.container, this.driver, name);
1487
+ }
1488
+ async dropEvent(name) {
1489
+ return new DropEventQueryBuilder(this.container, this.driver, name);
1490
+ }
1378
1491
  };
1379
1492
  SchemaQueryBuilder = __decorate([
1380
1493
  (0, di_1.NewInstance)(),