Browse Source

feat(ditsmod): added db tests with simplified use of DI (#8477)

* fix(ditsmod): fixed bulkUpdate().

* feat(ditsmod): added db tests with simplifieduse of DI.

* fix(ditsmod): fixed bulkUpdate() for mysql.
Костя Третяк 1 year ago
parent
commit
0c3348b0d0

+ 46 - 0
frameworks/TypeScript/ditsmod/benchmark_config.json

@@ -84,6 +84,52 @@
         "display_name": "ditsmod [mysql]",
         "notes": "",
         "versus": "nodejs"
+      },
+      "postgres2": {
+        "dockerfile": "ditsmod-postgres.dockerfile",
+        "db_url": "/db2",
+        "query_url": "/queries2?queries=",
+        "update_url": "/updates2?queries=",
+        "cached_query_url": "/cached-queries2?count=",
+        "fortune_url": "/fortunes2",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Micro",
+        "database": "Postgres",
+        "framework": "Ditsmod",
+        "language": "TypeScript",
+        "flavor": "None",
+        "orm": "Raw",
+        "platform": "nodejs",
+        "webserver": "None",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "ditsmod [postgres & simplified use of di]",
+        "notes": "Simplified use of Dependency Injection (no request level injector).",
+        "versus": "nodejs"
+      },
+      "mysql2": {
+        "dockerfile": "ditsmod-mysql.dockerfile",
+        "db_url": "/db2",
+        "query_url": "/queries2?queries=",
+        "update_url": "/updates2?queries=",
+        "cached_query_url": "/cached-queries2?count=",
+        "fortune_url": "/fortunes2",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Micro",
+        "database": "MySQL",
+        "framework": "Ditsmod",
+        "language": "TypeScript",
+        "flavor": "None",
+        "orm": "Raw",
+        "platform": "nodejs",
+        "webserver": "None",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "ditsmod [mysql & simplified use of di]",
+        "notes": "Simplified use of Dependency Injection (no request level injector).",
+        "versus": "nodejs"
       }
     }
   ]

+ 2 - 2
frameworks/TypeScript/ditsmod/package.json

@@ -19,8 +19,8 @@
   "author": "Костя Третяк",
   "license": "MIT",
   "dependencies": {
-    "@ditsmod/core": "~2.50.0",
-    "@ditsmod/routing": "~2.0.0",
+    "@ditsmod/core": "~2.51.1",
+    "@ditsmod/routing": "~2.1.0",
     "handlebars": "^4.7.8",
     "lru-cache": "^10.0.1",
     "mariadb": "^3.2.1",

+ 40 - 0
frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/db.controller2.ts

@@ -0,0 +1,40 @@
+import { AnyObj, controller, RequestContext, SingletonRequestContext, route } from '@ditsmod/core';
+
+import { DbService } from '#service/db/db.service.js';
+import { getRandomNumber } from '#utils/helper.js';
+
+@controller({ isSingleton: true })
+export class DbController2 {
+  constructor(private dbService: DbService) {}
+
+  @route('GET', 'db2')
+  async getSingleQuery(ctx: RequestContext) {
+    const id = getRandomNumber();
+    const result = await this.dbService.findOneWorld(id);
+    this.sendJson(ctx, result);
+  }
+
+  @route('GET', 'queries2')
+  async getMultiQueries(ctx: SingletonRequestContext) {
+    const result = await this.dbService.getMultiQueries(ctx.queryParams!.queries);
+    this.sendJson(ctx, result);
+  }
+
+  @route('GET', 'cached-queries2')
+  async getCachedWorlds(ctx: SingletonRequestContext) {
+    const result = await this.dbService.getMultiQueries(ctx.queryParams!.count, false);
+    this.sendJson(ctx, result);
+  }
+
+  @route('GET', 'updates2')
+  async getUpdates(ctx: SingletonRequestContext) {
+    const worlds = await this.dbService.saveWorlds(ctx.queryParams!.queries);
+    this.sendJson(ctx, worlds);
+  }
+
+  protected sendJson(ctx: RequestContext, value: AnyObj) {
+    ctx.nodeRes.setHeader('Server', 'Ditsmod');
+    ctx.nodeRes.setHeader('Content-Type', 'application/json; charset=utf-8');
+    ctx.nodeRes.end(JSON.stringify(value));
+  }
+}

+ 43 - 0
frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/fortune.controller2.ts

@@ -0,0 +1,43 @@
+import Handlebars from 'handlebars';
+import { RequestContext, controller, route } from '@ditsmod/core';
+
+import { additionalFortune, compare } from '#utils/helper.js';
+import { DbService } from '#service/db/db.service.js';
+
+const tmpl = Handlebars.compile(
+  [
+    '<!DOCTYPE html>',
+    '<html>',
+    '<head><title>Fortunes</title></head>',
+    '<body>',
+    '<table>',
+    '<tr>',
+    '<th>id</th>',
+    '<th>message</th>',
+    '</tr>',
+    '{{#fortunes}}',
+    '<tr>',
+    '<td>{{id}}</td>',
+    '<td>{{message}}</td>',
+    '</tr>',
+    '{{/fortunes}}',
+    '</table>',
+    '</body>',
+    '</html>',
+  ].join(''),
+);
+
+@controller({ isSingleton: true })
+export class FortuneController2 {
+  constructor(private dbService: DbService) {}
+
+  @route('GET', 'fortunes2')
+  async fortunes(ctx: RequestContext) {
+    const fortunes = await this.dbService.findAllFortunes();
+    fortunes.push(additionalFortune);
+    fortunes.sort(compare);
+    ctx.nodeRes.setHeader('Server', 'Ditsmod');
+    ctx.nodeRes.setHeader('Content-Type', 'text/html; charset=utf-8');
+    ctx.nodeRes.end(tmpl({ fortunes }));
+  }
+}

+ 10 - 1
frameworks/TypeScript/ditsmod/src/app/modules/routed/simple/simple.module.ts

@@ -6,9 +6,18 @@ import { WithoutDbController } from './without-db.controller.js';
 import { DbController } from './db.controller.js';
 import { FortuneController } from './fortune.controller.js';
 import { SingletonController } from './singleton.controller.js';
+import { DbController2 } from './db.controller2.js';
+import { FortuneController2 } from './fortune.controller2.js';
 
 @featureModule({
   imports: [RoutingModule, DbModule],
-  controllers: [WithoutDbController, DbController, FortuneController, SingletonController],
+  controllers: [
+    WithoutDbController,
+    DbController,
+    DbController2,
+    FortuneController,
+    FortuneController2,
+    SingletonController,
+  ],
 })
 export class SimpleModule {}

+ 1 - 1
frameworks/TypeScript/ditsmod/src/app/modules/service/db/mysql.service.ts

@@ -26,7 +26,7 @@ export class MysqlService implements ModelService {
 
   bulkUpdate(worlds: World[]) {
     const sql = 'update world set randomNumber = ? where id = ?';
-    const values = worlds.map((world) => [world.randomnumber, world.id]);
+    const values = worlds.map((world) => [world.randomnumber, world.id]).sort((a, b) => (a[0] < b[0]) ? -1 : 1);
     return pool.batch(sql, values);
   }
 }

+ 1 - 1
frameworks/TypeScript/ditsmod/src/app/modules/service/db/postgres.service.ts

@@ -24,7 +24,7 @@ export class PostgresService implements ModelService {
   }
 
   bulkUpdate(worlds: World[]) {
-    const values = sql(worlds.map((world) => [world.id, world.randomnumber]));
+    const values = sql(worlds.map((world) => [world.id, world.randomnumber]).sort((a, b) => (a[0] < b[0]) ? -1 : 1));
 
     return sql`update world set randomNumber = (update_data.randomNumber)::int
       from (values ${values}) as update_data (id, randomNumber)