@ts-awesome/orm 1.5.0 → 1.5.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.
@@ -535,6 +535,99 @@ describe('Select', () => {
535
535
  // ignore
536
536
  }
537
537
  });
538
+
539
+ it ('union operator', () => {
540
+ const query = Select(Person)
541
+ .columns(['name'])
542
+ .union(true, Select(Person)
543
+ .columns(['name'])
544
+ .where(x => x.age.lt(18))
545
+ )
546
+ .where(x => x.age.gte(18))
547
+ .orderBy(['name']);
548
+
549
+ expect(query._operators).toStrictEqual([{
550
+ _operator: 'UNION',
551
+ _distinct: true,
552
+ _operand: {
553
+ "_type": "SELECT",
554
+ "_table": Person[TableMetadataSymbol],
555
+ "_alias": null,
556
+ "_distinct": false,
557
+ "_for": undefined,
558
+ "_columns": [{"_column": {"table": "Person", "name": "name"}}],
559
+ "_where": [{
560
+ "_operator": "<",
561
+ "_operands": [
562
+ {"_column": {"table": "Person", "name": "age"}},
563
+ 18
564
+ ]
565
+ }]
566
+ }
567
+ }])
568
+ })
569
+
570
+ it ('intersect operator', () => {
571
+ const query = Select(Person)
572
+ .columns(['name'])
573
+ .intersect(Select(Person)
574
+ .columns(['name'])
575
+ .where(x => x.age.lt(18))
576
+ )
577
+ .where(x => x.age.gte(18))
578
+ .orderBy(['name']);
579
+
580
+ expect(query._operators).toStrictEqual([{
581
+ _operator: 'INTERSECT',
582
+ _distinct: false,
583
+ _operand: {
584
+ "_type": "SELECT",
585
+ "_table": Person[TableMetadataSymbol],
586
+ "_alias": null,
587
+ "_distinct": false,
588
+ "_for": undefined,
589
+ "_columns": [{"_column": {"table": "Person", "name": "name"}}],
590
+ "_where": [{
591
+ "_operator": "<",
592
+ "_operands": [
593
+ {"_column": {"table": "Person", "name": "age"}},
594
+ 18
595
+ ]
596
+ }]
597
+ }
598
+ }])
599
+ })
600
+
601
+ it ('except operator', () => {
602
+ const query = Select(Person)
603
+ .columns(['name'])
604
+ .except(Select(Person)
605
+ .columns(['name'])
606
+ .where(x => x.age.lt(18))
607
+ )
608
+ .where(x => x.age.gte(18))
609
+ .orderBy(['name']);
610
+
611
+ expect(query._operators).toStrictEqual([{
612
+ _operator: 'EXCEPT',
613
+ _distinct: false,
614
+ _operand: {
615
+ "_type": "SELECT",
616
+ "_table": Person[TableMetadataSymbol],
617
+ "_alias": null,
618
+ "_distinct": false,
619
+ "_for": undefined,
620
+ "_columns": [{"_column": {"table": "Person", "name": "name"}}],
621
+ "_where": [{
622
+ "_operator": "<",
623
+ "_operands": [
624
+ {"_column": {"table": "Person", "name": "age"}},
625
+ 18
626
+ ]
627
+ }]
628
+ }
629
+ }])
630
+ })
538
631
  });
539
632
 
540
633
  describe('Insert', () => {
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const wrappers_1 = require("../src/wrappers");
13
+ const test_driver_1 = require("../src/test-driver");
14
+ describe('BaseExecutor', () => {
15
+ it('named params', () => __awaiter(void 0, void 0, void 0, function* () {
16
+ const sqlName = 'test';
17
+ const namedParam = new wrappers_1.NamedParameter(sqlName);
18
+ const executor = new test_driver_1.TestExecutor();
19
+ executor.mapper = (query) => {
20
+ expect(query).toBeDefined();
21
+ expect(query.params).toBeDefined();
22
+ expect(query.params[sqlName]).toBe(123);
23
+ return [];
24
+ };
25
+ executor.setNamedParameter(namedParam, 123);
26
+ yield executor.execute({});
27
+ }));
28
+ });
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.Employee = exports.TagPerson = exports.Tag = exports.Person = void 0;
13
+ const src_1 = require("../src");
14
+ const UUID = {};
15
+ let Person = class Person {
16
+ };
17
+ __decorate([
18
+ (0, src_1.dbField)({
19
+ primaryKey: true,
20
+ autoIncrement: true
21
+ }),
22
+ __metadata("design:type", Number)
23
+ ], Person.prototype, "id", void 0);
24
+ __decorate([
25
+ (0, src_1.dbField)({
26
+ kind: UUID
27
+ }),
28
+ __metadata("design:type", String)
29
+ ], Person.prototype, "uid", void 0);
30
+ __decorate([
31
+ src_1.dbField,
32
+ __metadata("design:type", String)
33
+ ], Person.prototype, "name", void 0);
34
+ __decorate([
35
+ src_1.dbField,
36
+ __metadata("design:type", Number)
37
+ ], Person.prototype, "age", void 0);
38
+ __decorate([
39
+ src_1.dbField,
40
+ __metadata("design:type", String)
41
+ ], Person.prototype, "city", void 0);
42
+ __decorate([
43
+ (0, src_1.dbFilterField)({
44
+ table: 'employee',
45
+ keyField: 'person',
46
+ valueField: 'title',
47
+ }),
48
+ __metadata("design:type", Array)
49
+ ], Person.prototype, "profiles", void 0);
50
+ __decorate([
51
+ (0, src_1.dbFilterField)(primary => (0, src_1.Select)(Tag)
52
+ .columns((x) => [x.name])
53
+ .join(TagPerson, (a, b) => (0, src_1.and)(a.id.eq(b.tag), b.person.eq(primary)))),
54
+ __metadata("design:type", Array)
55
+ ], Person.prototype, "tags", void 0);
56
+ Person = __decorate([
57
+ (0, src_1.dbTable)('Person', [{ name: 'idx', fields: ['id'] }])
58
+ ], Person);
59
+ exports.Person = Person;
60
+ let Tag = class Tag {
61
+ };
62
+ __decorate([
63
+ (0, src_1.dbField)({
64
+ primaryKey: true,
65
+ autoIncrement: true
66
+ }),
67
+ __metadata("design:type", Number)
68
+ ], Tag.prototype, "id", void 0);
69
+ __decorate([
70
+ src_1.dbField,
71
+ __metadata("design:type", String)
72
+ ], Tag.prototype, "name", void 0);
73
+ Tag = __decorate([
74
+ (0, src_1.dbTable)('Tag')
75
+ ], Tag);
76
+ exports.Tag = Tag;
77
+ let TagPerson = class TagPerson {
78
+ };
79
+ __decorate([
80
+ (0, src_1.dbField)({
81
+ primaryKey: true,
82
+ }),
83
+ __metadata("design:type", Number)
84
+ ], TagPerson.prototype, "person", void 0);
85
+ __decorate([
86
+ (0, src_1.dbField)({
87
+ primaryKey: true,
88
+ }),
89
+ __metadata("design:type", Number)
90
+ ], TagPerson.prototype, "tag", void 0);
91
+ TagPerson = __decorate([
92
+ (0, src_1.dbTable)('TagPerson')
93
+ ], TagPerson);
94
+ exports.TagPerson = TagPerson;
95
+ let Employee = class Employee {
96
+ };
97
+ __decorate([
98
+ src_1.dbField,
99
+ __metadata("design:type", Number)
100
+ ], Employee.prototype, "personId", void 0);
101
+ __decorate([
102
+ src_1.dbField,
103
+ __metadata("design:type", String)
104
+ ], Employee.prototype, "company", void 0);
105
+ __decorate([
106
+ src_1.dbField,
107
+ __metadata("design:type", Number)
108
+ ], Employee.prototype, "salary", void 0);
109
+ Employee = __decorate([
110
+ (0, src_1.dbTable)('Employee')
111
+ ], Employee);
112
+ exports.Employee = Employee;
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const dist_1 = require("../dist");
13
+ const models_1 = require("./models");
14
+ const DB_JSON = {
15
+ reader(raw) {
16
+ return typeof raw === 'string' ? JSON.parse(raw) : raw;
17
+ },
18
+ writer(value) {
19
+ return JSON.stringify(value);
20
+ }
21
+ };
22
+ function generatePersons(quantity) {
23
+ const res = [];
24
+ for (let i = 1; i <= quantity; i++) {
25
+ const person = new models_1.Person();
26
+ person['id'] = i;
27
+ person['city'] = `TestCity${i}`;
28
+ person['age'] = 18;
29
+ person['name'] = `TestName${i}`;
30
+ person['uid'] = `uid${i}`;
31
+ // person['profiles'] = ['profile-a'];
32
+ res.push(person);
33
+ }
34
+ return res;
35
+ }
36
+ describe('DbReader', () => {
37
+ const persons = generatePersons(5);
38
+ it('read raw', () => {
39
+ const result = (0, dist_1.reader)(persons);
40
+ expect(result).toStrictEqual(persons);
41
+ result.map(person => {
42
+ expect(person).toBeInstanceOf(models_1.Person);
43
+ expect(person).toStrictEqual(persons.find(p => p.id === person.id));
44
+ });
45
+ });
46
+ it('read Model', () => {
47
+ let Model = class Model {
48
+ constructor(id, raw, personal) {
49
+ this.id = id;
50
+ this.value = raw;
51
+ this.personal = personal;
52
+ }
53
+ };
54
+ __decorate([
55
+ dist_1.dbField,
56
+ __metadata("design:type", Number)
57
+ ], Model.prototype, "id", void 0);
58
+ __decorate([
59
+ (0, dist_1.dbField)('raw'),
60
+ __metadata("design:type", String)
61
+ ], Model.prototype, "value", void 0);
62
+ __decorate([
63
+ (0, dist_1.dbField)({ kind: DB_JSON, model: [models_1.Person] }),
64
+ __metadata("design:type", Array)
65
+ ], Model.prototype, "personal", void 0);
66
+ Model = __decorate([
67
+ dist_1.dbTable,
68
+ __metadata("design:paramtypes", [Object, Object, Object])
69
+ ], Model);
70
+ const model = {
71
+ id: "5",
72
+ raw: false,
73
+ personal: JSON.stringify(persons)
74
+ };
75
+ const expected = new Model(5, 'false', persons);
76
+ const results = (0, dist_1.reader)([model], Model);
77
+ expect(results.length).toBe(1);
78
+ const [result] = results;
79
+ expect(result).toBeInstanceOf(Model);
80
+ expect(result).toEqual(expected);
81
+ });
82
+ it('read Model from no data', () => {
83
+ let Model = class Model {
84
+ constructor(id, raw, personal) {
85
+ this.id = id;
86
+ this.value = raw;
87
+ this.personal = personal;
88
+ }
89
+ };
90
+ __decorate([
91
+ dist_1.dbField,
92
+ __metadata("design:type", Number)
93
+ ], Model.prototype, "id", void 0);
94
+ __decorate([
95
+ (0, dist_1.dbField)('raw'),
96
+ __metadata("design:type", String)
97
+ ], Model.prototype, "value", void 0);
98
+ __decorate([
99
+ (0, dist_1.dbField)({ kind: DB_JSON, model: [models_1.Person] }),
100
+ __metadata("design:type", Array)
101
+ ], Model.prototype, "personal", void 0);
102
+ Model = __decorate([
103
+ dist_1.dbTable,
104
+ __metadata("design:paramtypes", [Object, Object, Object])
105
+ ], Model);
106
+ const results = (0, dist_1.reader)([], Model);
107
+ expect(results.length).toBe(0);
108
+ });
109
+ it('read scalar', () => {
110
+ const count = 10;
111
+ const correctResult = (0, dist_1.reader)([{ field: count }], true);
112
+ expect(correctResult).toBe(count);
113
+ });
114
+ it('read scalar from no data', () => {
115
+ const fieldValue = 'string';
116
+ const emptyData = (0, dist_1.reader)([], true);
117
+ expect(emptyData).toBe(0);
118
+ expect(() => {
119
+ (0, dist_1.reader)([{ field: fieldValue }], true);
120
+ }).toThrowError(`Invalid scalar "${fieldValue}", number expected.`);
121
+ });
122
+ it('read scalar from invalid data', () => {
123
+ const fieldValue = 'string';
124
+ expect(() => {
125
+ (0, dist_1.reader)([{ field: fieldValue }], true);
126
+ }).toThrowError(`Invalid scalar "${fieldValue}", number expected.`);
127
+ });
128
+ });