oak-domain 2.2.0 → 2.3.1

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.
@@ -337,6 +337,7 @@ function analyzeEntity(filename, path, program, relativePath) {
337
337
  var localEnumStringTypes = [];
338
338
  var additionalImports = [];
339
339
  var localeDef = undefined;
340
+ var relationHierarchy = undefined;
340
341
  ts.forEachChild(sourceFile, function (node) {
341
342
  var _a, _b, _c, _d;
342
343
  if (ts.isImportDeclaration(node)) {
@@ -519,7 +520,7 @@ function analyzeEntity(filename, path, program, relativePath) {
519
520
  actionDefNodes.push(factory.createTypeReferenceNode('RelationAction', undefined));
520
521
  }
521
522
  pushStatementIntoActionAst(moduleName, factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("Action"), undefined, factory.createUnionTypeNode(actionDefNodes)), sourceFile);
522
- dealWithActions(moduleName, filename, node.type, program, sourceFile, hasRelationDef || moduleName === 'User');
523
+ dealWithActions(moduleName, filename, node.type, program, sourceFile, !!hasRelationDef || moduleName === 'User');
523
524
  }
524
525
  else if (node.name.text === 'Relation') {
525
526
  (0, assert_1.default)(!hasActionDef, "\u3010".concat(filename, "\u3011action\u5B9A\u4E49\u987B\u5728Relation\u4E4B\u540E"));
@@ -541,18 +542,22 @@ function analyzeEntity(filename, path, program, relativePath) {
541
542
  var relationSchemaAttrs = [
542
543
  factory.createPropertySignature(undefined, factory.createIdentifier("user"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("User"), undefined)),
543
544
  factory.createPropertySignature(undefined, factory.createIdentifier(entityLc), undefined, factory.createTypeReferenceNode(factory.createIdentifier(moduleName), undefined)),
544
- factory.createPropertySignature(undefined, factory.createIdentifier('relation'), undefined, node.type),
545
+ factory.createPropertySignature(undefined, factory.createIdentifier('relation'), undefined, factory.createTypeReferenceNode(factory.createIdentifier("Relation"), undefined)),
545
546
  ];
546
547
  (0, lodash_1.assign)(Schema, (_d = {},
547
548
  _d[relationEntityName] = {
548
549
  schemaAttrs: relationSchemaAttrs,
549
550
  sourceFile: sourceFile,
551
+ enumStringAttrs: ['relation'],
550
552
  actionType: 'excludeUpdate',
553
+ additionalImports: [
554
+ factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamedImports([factory.createImportSpecifier(false, undefined, factory.createIdentifier("Relation"))])), factory.createStringLiteral("../".concat(moduleName, "/Schema")), undefined)
555
+ ],
551
556
  },
552
557
  _d));
553
558
  addRelationship(relationEntityName, 'User', 'user', true);
554
559
  addRelationship(relationEntityName, moduleName, entityLc, true);
555
- hasRelationDef = true;
560
+ hasRelationDef = node;
556
561
  }
557
562
  else if (node.name.text.endsWith('Action') || node.name.text.endsWith('State')) {
558
563
  (0, assert_1.default)(!localeDef, "\u3010".concat(filename, "\u3011locale\u5B9A\u4E49\u987B\u5728Action/State\u4E4B\u540E"));
@@ -790,6 +795,13 @@ function analyzeEntity(filename, path, program, relativePath) {
790
795
  _static = true; // static如果有值只能为true
791
796
  }
792
797
  }
798
+ else if (ts.isTypeReferenceNode(declaration.type) && ts.isIdentifier(declaration.type.typeName) && declaration.type.typeName.text === 'RelationHierarchy') {
799
+ // RelationHierary
800
+ (0, assert_1.default)(hasRelationDef, "".concat(moduleName, "\u4E2D\u7684Relation\u5B9A\u4E49\u5728RelationHierarchy\u4E4B\u540E"));
801
+ var initializer = declaration.initializer;
802
+ (0, assert_1.default)(ts.isObjectLiteralExpression(initializer), "".concat(moduleName, "\u4E2D\u7684RelationHierarchy\u7684\u5B9A\u4E49\u5FC5\u987B\u662F\u521D\u59CB\u5316\u4E3AObjectLiteralExpress"));
803
+ relationHierarchy = initializer;
804
+ }
793
805
  else {
794
806
  throw new Error("".concat(moduleName, "\uFF1A\u4E0D\u80FD\u7406\u89E3\u7684\u5B9A\u4E49\u5185\u5BB9").concat(declaration.name.getText()));
795
807
  }
@@ -831,6 +843,15 @@ function analyzeEntity(filename, path, program, relativePath) {
831
843
  locale: localeDef,
832
844
  });
833
845
  }
846
+ if (hasRelationDef) {
847
+ (0, assert_1.default)(relationHierarchy, "".concat(filename, "\u4E2D\u7F3A\u5C11\u4E86relationHierarchy\u5B9A\u4E49"));
848
+ (0, lodash_1.assign)(schema, {
849
+ relationHierarchy: relationHierarchy,
850
+ });
851
+ }
852
+ else {
853
+ (0, assert_1.default)(!relationHierarchy, "".concat(filename, "\u4E2D\u5177\u6709relationHierarchy\u5B9A\u4E49\u4F46\u6CA1\u6709Relation\u5B9A\u4E49"));
854
+ }
834
855
  (0, lodash_1.assign)(Schema, (_a = {},
835
856
  _a[moduleName] = schema,
836
857
  _a));
@@ -962,6 +983,8 @@ function constructSchema(statements, entity) {
962
983
  foreignKeySet[entityName].forEach(function (foreignKey) {
963
984
  var identifier = "".concat(entityNameLc, "$").concat(foreignKey);
964
985
  members2.push(factory.createPropertySignature(undefined, identifier, factory.createToken(ts.SyntaxKind.QuestionToken), factory.createTypeReferenceNode(factory.createIdentifier("Array"), [factory.createTypeReferenceNode(createForeignRef(entity, entityName, 'Schema'), undefined)])));
986
+ var aggrIdentifier = "".concat(entityNameLc, "$").concat(foreignKey, "$$aggr");
987
+ members2.push(factory.createPropertySignature(undefined, aggrIdentifier, factory.createToken(ts.SyntaxKind.QuestionToken), factory.createTypeReferenceNode(factory.createIdentifier("AggregationResult"), [factory.createTypeReferenceNode(createForeignRef(entity, entityName, 'Schema'), undefined)])));
965
988
  });
966
989
  };
967
990
  for (var entityName in foreignKeySet) {
@@ -1161,7 +1184,7 @@ function constructProjection(statements, entity) {
1161
1184
  var _a, e_4, _b, e_5, _c;
1162
1185
  var schemaAttrs = Schema[entity].schemaAttrs;
1163
1186
  var properties = [
1164
- ['id', true],
1187
+ ['id', false],
1165
1188
  ['$$createAt$$', false],
1166
1189
  ['$$updateAt$$', false],
1167
1190
  ['$$seq$$', false],
@@ -1202,7 +1225,10 @@ function constructProjection(statements, entity) {
1202
1225
  });
1203
1226
  if (manyToOneItem) {
1204
1227
  // 外键投影
1205
- properties.push(["".concat(attrName, "Id"), false, undefined], [name_4, false, factory.createTypeReferenceNode(createForeignRef(entity, text2_4, 'Projection')), factory.createTypeReferenceNode(createForeignRef(entity, text2_4, 'ExportProjection'))]);
1228
+ properties.push(["".concat(attrName, "Id"), false, undefined], [name_4, false, factory.createTypeReferenceNode(createForeignRef(entity, text2_4, 'Projection')) /* , factory.createTypeReferenceNode(
1229
+ createForeignRef(entity, text2, 'ExportProjection')
1230
+ ) */
1231
+ ]);
1206
1232
  if (foreignKeyProperties.hasOwnProperty(text2_4)) {
1207
1233
  foreignKeyProperties[text2_4].push(attrName);
1208
1234
  }
@@ -1252,7 +1278,10 @@ function constructProjection(statements, entity) {
1252
1278
  ReversePointerRelations[entity].forEach(function (one) {
1253
1279
  var _a;
1254
1280
  var text2 = one === 'Schema' ? entity : one;
1255
- properties.push([(0, string_1.firstLetterLowerCase)(one), false, factory.createTypeReferenceNode(createForeignRef(entity, one, 'Projection')), factory.createTypeReferenceNode(createForeignRef(entity, one, 'ExportProjection'))]);
1281
+ properties.push([(0, string_1.firstLetterLowerCase)(one), false, factory.createTypeReferenceNode(createForeignRef(entity, one, 'Projection')) /* , factory.createTypeReferenceNode(
1282
+ createForeignRef(entity, one, 'ExportProjection')
1283
+ ) */
1284
+ ]);
1256
1285
  if (foreignKeyProperties.hasOwnProperty(one)) {
1257
1286
  foreignKeyProperties[text2].push('entity');
1258
1287
  }
@@ -1290,15 +1319,31 @@ function constructProjection(statements, entity) {
1290
1319
  var entityNameLc = (0, string_1.firstLetterLowerCase)(entityName);
1291
1320
  foreignKeySet[entityName].forEach(function (foreignKey) {
1292
1321
  var identifier = "".concat(entityNameLc, "$").concat(foreignKey);
1322
+ var aggrIdentifier = "".concat(entityNameLc, "$").concat(foreignKey, "$$aggr");
1293
1323
  properties.push([identifier, false,
1294
1324
  factory.createIntersectionTypeNode([
1295
1325
  factory.createTypeReferenceNode(createForeignRef(entity, entityName, 'Selection'), undefined),
1296
1326
  factory.createTypeLiteralNode([
1297
1327
  factory.createPropertySignature(undefined, factory.createIdentifier("$entity"), undefined, factory.createLiteralTypeNode(factory.createStringLiteral((0, string_1.firstLetterLowerCase)(entityName))))
1298
1328
  ])
1299
- ]),
1329
+ ]) /* ,
1330
+ factory.createIntersectionTypeNode([
1331
+ factory.createTypeReferenceNode(
1332
+ createForeignRef(entity, entityName, 'Exportation'),
1333
+ undefined
1334
+ ),
1335
+ factory.createTypeLiteralNode([
1336
+ factory.createPropertySignature(
1337
+ undefined,
1338
+ factory.createIdentifier("$entity"),
1339
+ undefined,
1340
+ factory.createLiteralTypeNode(factory.createStringLiteral(firstLetterLowerCase(entityName)))
1341
+ )
1342
+ ])
1343
+ ]) */
1344
+ ], [aggrIdentifier, false,
1300
1345
  factory.createIntersectionTypeNode([
1301
- factory.createTypeReferenceNode(createForeignRef(entity, entityName, 'Exportation'), undefined),
1346
+ factory.createTypeReferenceNode(createForeignRef(entity, entityName, 'Aggregation'), undefined),
1302
1347
  factory.createTypeLiteralNode([
1303
1348
  factory.createPropertySignature(undefined, factory.createIdentifier("$entity"), undefined, factory.createLiteralTypeNode(factory.createStringLiteral((0, string_1.firstLetterLowerCase)(entityName))))
1304
1349
  ])
@@ -1320,28 +1365,47 @@ function constructProjection(statements, entity) {
1320
1365
  factory.createTypeReferenceNode(factory.createIdentifier('OpAttr'))
1321
1366
  ])
1322
1367
  ]);
1323
- var MetaPropertySignaturs = [
1368
+ var MetaPropertySignatures = [
1324
1369
  factory.createPropertySignature(undefined, factory.createStringLiteral("#id"), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createTypeReferenceNode('NodeId'))
1325
1370
  ];
1326
1371
  if (process.env.COMPLING_AS_LIB) {
1327
- MetaPropertySignaturs.push(factory.createIndexSignature(undefined, undefined, [factory.createParameterDeclaration(undefined, undefined, undefined, factory.createIdentifier("k"), undefined, factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), undefined)], factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)));
1372
+ MetaPropertySignatures.push(factory.createIndexSignature(undefined, undefined, [factory.createParameterDeclaration(undefined, undefined, undefined, factory.createIdentifier("k"), undefined, factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), undefined)], factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)));
1328
1373
  }
1329
1374
  // Projection,正常查询的投影
1330
1375
  statements.push(factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("Projection"), undefined, factory.createIntersectionTypeNode([
1331
- factory.createTypeLiteralNode(MetaPropertySignaturs.concat(properties.map(function (_a) {
1376
+ factory.createTypeLiteralNode(MetaPropertySignatures.concat(properties.map(function (_a) {
1332
1377
  var _b = tslib_1.__read(_a, 3), n = _b[0], q = _b[1], v = _b[2];
1333
1378
  return factory.createPropertySignature(undefined, n, q ? undefined : factory.createToken(ts.SyntaxKind.QuestionToken), v || factory.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword));
1334
1379
  }))),
1335
1380
  exprNode,
1336
1381
  ])));
1337
- // ExportProjection,下载查询的投影
1338
- statements.push(factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("ExportProjection"), undefined, factory.createIntersectionTypeNode([
1339
- factory.createTypeLiteralNode(MetaPropertySignaturs.concat(properties.map(function (_a) {
1340
- var _b = tslib_1.__read(_a, 4), n = _b[0], q = _b[1], v = _b[2], v2 = _b[3];
1341
- return factory.createPropertySignature(undefined, n, factory.createToken(ts.SyntaxKind.QuestionToken), v2 || factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword));
1342
- }))),
1343
- exprNode,
1344
- ])));
1382
+ // ExportProjection,下载查询的投影
1383
+ // 已经废弃。By Xc 2023.01.08
1384
+ /* statements.push(
1385
+ factory.createTypeAliasDeclaration(
1386
+ undefined,
1387
+ [factory.createModifier(ts.SyntaxKind.ExportKeyword)],
1388
+ factory.createIdentifier("ExportProjection"),
1389
+ undefined,
1390
+ factory.createIntersectionTypeNode([
1391
+ factory.createTypeLiteralNode(
1392
+ MetaPropertySignaturs.concat(
1393
+ properties.map(
1394
+ ([n, q, v, v2]) => {
1395
+ return factory.createPropertySignature(
1396
+ undefined,
1397
+ n,
1398
+ factory.createToken(ts.SyntaxKind.QuestionToken),
1399
+ v2 || factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword)
1400
+ )
1401
+ }
1402
+ )
1403
+ )
1404
+ ),
1405
+ exprNode,
1406
+ ])
1407
+ )
1408
+ ); */
1345
1409
  // ${Entity}Projection,外键查询的专用投影
1346
1410
  for (var foreignKey in foreignKeyProperties) {
1347
1411
  var identifier = "".concat(foreignKey, "IdProjection");
@@ -1717,14 +1781,43 @@ function constructActions(statements, entity) {
1717
1781
  factory.createTypeReferenceNode(factory.createIdentifier("P"), undefined)
1718
1782
  ]),
1719
1783
  factory.createLiteralTypeNode(factory.createStringLiteral("action"))
1784
+ ])), factory.createTypeAliasDeclaration(undefined, [factory.createToken(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("Aggregation"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("Omit"), [
1785
+ factory.createTypeReferenceNode(factory.createIdentifier("DeduceAggregation"), [
1786
+ factory.createTypeReferenceNode(factory.createIdentifier("Schema"), undefined),
1787
+ factory.createTypeReferenceNode(factory.createIdentifier("Projection"), undefined),
1788
+ factory.createTypeReferenceNode(factory.createIdentifier("Filter"), undefined),
1789
+ factory.createTypeReferenceNode(factory.createIdentifier("Sorter"), undefined)
1790
+ ]),
1791
+ factory.createLiteralTypeNode(factory.createStringLiteral("id"))
1720
1792
  ])));
1721
1793
  // Exportation
1722
- statements.push(factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("Exportation"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("OakOperation"), [
1723
- factory.createLiteralTypeNode(factory.createStringLiteral("export")),
1724
- factory.createTypeReferenceNode(factory.createIdentifier("ExportProjection"), undefined),
1725
- factory.createTypeReferenceNode(factory.createIdentifier("Filter"), undefined),
1726
- factory.createTypeReferenceNode(factory.createIdentifier("Sorter"), undefined)
1727
- ])));
1794
+ // 已经废弃,by Xc 2023.01.08
1795
+ /* statements.push(
1796
+ factory.createTypeAliasDeclaration(
1797
+ undefined,
1798
+ [factory.createModifier(ts.SyntaxKind.ExportKeyword)],
1799
+ factory.createIdentifier("Exportation"),
1800
+ undefined,
1801
+ factory.createTypeReferenceNode(
1802
+ factory.createIdentifier("OakOperation"),
1803
+ [
1804
+ factory.createLiteralTypeNode(factory.createStringLiteral("export")),
1805
+ factory.createTypeReferenceNode(
1806
+ factory.createIdentifier("ExportProjection"),
1807
+ undefined
1808
+ ),
1809
+ factory.createTypeReferenceNode(
1810
+ factory.createIdentifier("Filter"),
1811
+ undefined
1812
+ ),
1813
+ factory.createTypeReferenceNode(
1814
+ factory.createIdentifier("Sorter"),
1815
+ undefined
1816
+ )
1817
+ ]
1818
+ )
1819
+ )
1820
+ ); */
1728
1821
  var _k = ManyToOne, _l = entity, manyToOneSet = _k[_l];
1729
1822
  var _m = OneToMany, _o = entity, oneToManySet = _m[_o];
1730
1823
  var foreignKeySet = {};
@@ -2539,9 +2632,11 @@ var initialStatements = function () { return [
2539
2632
  factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamedImports([
2540
2633
  factory.createImportSpecifier(false, undefined, factory.createIdentifier("FormCreateData")),
2541
2634
  factory.createImportSpecifier(false, undefined, factory.createIdentifier("FormUpdateData")),
2635
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier("DeduceAggregation")),
2542
2636
  factory.createImportSpecifier(false, factory.createIdentifier("Operation"), factory.createIdentifier("OakOperation")),
2543
2637
  factory.createImportSpecifier(false, factory.createIdentifier("MakeAction"), factory.createIdentifier("OakMakeAction")),
2544
2638
  factory.createImportSpecifier(false, undefined, factory.createIdentifier("EntityShape")),
2639
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier("AggregationResult")),
2545
2640
  ])), factory.createStringLiteral("".concat((0, env_1.TYPE_PATH_IN_OAK_DOMAIN)(), "Entity")), undefined)
2546
2641
  ]; };
2547
2642
  function outputSubQuery(outputDir, printer) {
@@ -2649,6 +2744,11 @@ function outputSchema(outputDir, printer) {
2649
2744
  if ((additionalImports === null || additionalImports === void 0 ? void 0 : additionalImports.length) > 0) {
2650
2745
  statements.push.apply(statements, tslib_1.__spreadArray([], tslib_1.__read(additionalImports), false));
2651
2746
  }
2747
+ // Relation定义加入
2748
+ if (typeof Schema[entity].hasRelationDef === 'object' && ts.isTypeAliasDeclaration(Schema[entity].hasRelationDef)) {
2749
+ var node = Schema[entity].hasRelationDef;
2750
+ statements.push(factory.updateTypeAliasDeclaration(node, undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], node.name, node.typeParameters, node.type));
2751
+ }
2652
2752
  constructSchema(statements, entity);
2653
2753
  constructFilter(statements, entity);
2654
2754
  constructProjection(statements, entity);
@@ -2676,6 +2776,7 @@ function outputSchema(outputDir, printer) {
2676
2776
  factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword)
2677
2777
  ]) : actionTypeNode),
2678
2778
  factory.createPropertySignature(undefined, factory.createIdentifier("Selection"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("Selection"), undefined)),
2779
+ factory.createPropertySignature(undefined, factory.createIdentifier("Aggregation"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("Aggregation"), undefined)),
2679
2780
  factory.createPropertySignature(undefined, factory.createIdentifier("Operation"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("Operation"), undefined)),
2680
2781
  factory.createPropertySignature(undefined, factory.createIdentifier("Create"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("CreateOperation"), undefined)),
2681
2782
  factory.createPropertySignature(undefined, factory.createIdentifier("Update"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("UpdateOperation"), undefined)),
@@ -2807,7 +2908,7 @@ function constructAttributes(entity) {
2807
2908
  attrAssignments.push(factory.createPropertyAssignment(factory.createIdentifier("type"), factory.createStringLiteral("ref")), factory.createPropertyAssignment(factory.createIdentifier("ref"), factory.createStringLiteral((0, string_1.firstLetterLowerCase)(text2_6))));
2808
2909
  }
2809
2910
  else {
2810
- if (enumStringAttrs.includes(name.text)) {
2911
+ if (enumStringAttrs && enumStringAttrs.includes(name.text)) {
2811
2912
  attrAssignments.push(factory.createPropertyAssignment(factory.createIdentifier("type"), factory.createStringLiteral("varchar")), factory.createPropertyAssignment(factory.createIdentifier("params"), factory.createObjectLiteralExpression([factory.createPropertyAssignment(factory.createIdentifier("length"), factory.createNumericLiteral(env_1.STRING_LITERAL_MAX_LENGTH))], true)));
2812
2913
  }
2813
2914
  else {
@@ -2944,10 +3045,16 @@ function outputStorage(outputDir, printer) {
2944
3045
  var entityAssignments = [];
2945
3046
  for (var entity in Schema) {
2946
3047
  var indexExpressions = [];
2947
- var _a = Schema[entity], sourceFile = _a.sourceFile, inModi = _a.inModi, indexes = _a.indexes, toModi = _a.toModi, actionType = _a.actionType, _static = _a.static;
3048
+ var _a = Schema[entity], sourceFile = _a.sourceFile, inModi = _a.inModi, indexes = _a.indexes, toModi = _a.toModi, actionType = _a.actionType, _static = _a.static, relationHierarchy = _a.relationHierarchy;
3049
+ var fromSchemaSpecifiers = [
3050
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier("OpSchema"))
3051
+ ];
3052
+ if (relationHierarchy) {
3053
+ fromSchemaSpecifiers.push(factory.createImportSpecifier(false, undefined, factory.createIdentifier("Relation")));
3054
+ }
2948
3055
  var statements = [
2949
3056
  factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamedImports([factory.createImportSpecifier(false, undefined, factory.createIdentifier("StorageDesc"))])), factory.createStringLiteral("".concat((0, env_1.TYPE_PATH_IN_OAK_DOMAIN)(), "Storage")), undefined),
2950
- factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamedImports([factory.createImportSpecifier(false, undefined, factory.createIdentifier("OpSchema"))])), factory.createStringLiteral("./Schema"), undefined)
3057
+ factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamedImports(fromSchemaSpecifiers)), factory.createStringLiteral("./Schema"), undefined)
2951
3058
  ];
2952
3059
  var needImportActions = [];
2953
3060
  switch (actionType) {
@@ -3003,9 +3110,16 @@ function outputStorage(outputDir, printer) {
3003
3110
  if (indexExpressions.length > 0) {
3004
3111
  propertyAssignments.push(factory.createPropertyAssignment(factory.createIdentifier("indexes"), factory.createArrayLiteralExpression(indexExpressions, true)));
3005
3112
  }
3006
- statements.push(factory.createVariableStatement([factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createVariableDeclarationList([factory.createVariableDeclaration(factory.createIdentifier("desc"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("StorageDesc"), [
3007
- factory.createTypeReferenceNode(factory.createIdentifier("OpSchema"), undefined)
3008
- ]), factory.createObjectLiteralExpression(propertyAssignments, true))], ts.NodeFlags.Const)));
3113
+ if (relationHierarchy) {
3114
+ propertyAssignments.push(factory.createPropertyAssignment(factory.createIdentifier("relationHierarchy"), relationHierarchy));
3115
+ }
3116
+ var sdTypeArguments = [
3117
+ factory.createTypeReferenceNode(factory.createIdentifier("OpSchema"), undefined)
3118
+ ];
3119
+ if (relationHierarchy) {
3120
+ sdTypeArguments.push(factory.createTypeReferenceNode(factory.createIdentifier("Relation"), undefined));
3121
+ }
3122
+ statements.push(factory.createVariableStatement([factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createVariableDeclarationList([factory.createVariableDeclaration(factory.createIdentifier("desc"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("StorageDesc"), sdTypeArguments), factory.createObjectLiteralExpression(propertyAssignments, true))], ts.NodeFlags.Const)));
3009
3123
  var result_2 = printer.printList(ts.ListFormat.SourceFileStatements, factory.createNodeArray(statements), sourceFile);
3010
3124
  var filename_1 = path_1.default.join(outputDir, entity, 'Storage.ts');
3011
3125
  (0, fs_1.writeFileSync)(filename_1, result_2, { flag: 'w' });
@@ -1,5 +1,5 @@
1
1
  /// <reference types="node" />
2
- import { EntityDict, RowStore, OperateOption, OperationResult, SelectOption, Context, TxnOption, OpRecord } from "../types";
2
+ import { EntityDict, RowStore, OperateOption, OperationResult, SelectOption, Context, TxnOption, OpRecord, AggregationResult } from "../types";
3
3
  import { IncomingHttpHeaders } from "http";
4
4
  export declare abstract class AsyncContext<ED extends EntityDict> implements Context {
5
5
  private rowStore;
@@ -27,6 +27,7 @@ export declare abstract class AsyncContext<ED extends EntityDict> implements Con
27
27
  rollback(): Promise<void>;
28
28
  operate<T extends keyof ED, OP extends OperateOption>(entity: T, operation: ED[T]['Operation'], option: OP): Promise<OperationResult<ED>>;
29
29
  select<T extends keyof ED, OP extends SelectOption>(entity: T, selection: ED[T]['Selection'], option: OP): Promise<Partial<ED[T]["Schema"]>[]>;
30
+ aggregate<T extends keyof ED, OP extends SelectOption>(entity: T, aggregation: ED[T]['Aggregation'], option: OP): Promise<AggregationResult<ED[T]["Schema"]>>;
30
31
  count<T extends keyof ED, OP extends SelectOption>(entity: T, selection: Pick<ED[T]['Selection'], 'filter' | 'count'>, option: OP): Promise<number>;
31
32
  mergeMultipleResults(toBeMerged: OperationResult<ED>[]): OperationResult<ED>;
32
33
  getCurrentTxnId(): string | undefined;
@@ -39,6 +40,7 @@ export declare abstract class AsyncContext<ED extends EntityDict> implements Con
39
40
  export interface AsyncRowStore<ED extends EntityDict, Cxt extends Context> extends RowStore<ED> {
40
41
  operate<T extends keyof ED, OP extends OperateOption>(entity: T, operation: ED[T]['Operation'], context: Cxt, option: OP): Promise<OperationResult<ED>>;
41
42
  select<T extends keyof ED, OP extends SelectOption>(entity: T, selection: ED[T]['Selection'], context: Cxt, option: OP): Promise<Partial<ED[T]['Schema']>[]>;
43
+ aggregate<T extends keyof ED, OP extends SelectOption>(entity: T, aggregation: ED[T]['Aggregation'], context: Cxt, option: OP): Promise<AggregationResult<ED[T]['Schema']>>;
42
44
  count<T extends keyof ED, OP extends SelectOption>(entity: T, selection: Pick<ED[T]['Selection'], 'filter' | 'count'>, context: Cxt, option: OP): Promise<number>;
43
45
  begin(option?: TxnOption): Promise<string>;
44
46
  commit(txnId: string): Promise<void>;
@@ -161,6 +161,9 @@ var AsyncContext = /** @class */ (function () {
161
161
  AsyncContext.prototype.select = function (entity, selection, option) {
162
162
  return this.rowStore.select(entity, selection, this, option);
163
163
  };
164
+ AsyncContext.prototype.aggregate = function (entity, aggregation, option) {
165
+ return this.rowStore.aggregate(entity, aggregation, this, option);
166
+ };
164
167
  AsyncContext.prototype.count = function (entity, selection, option) {
165
168
  return this.rowStore.count(entity, selection, this, option);
166
169
  };
@@ -1,4 +1,4 @@
1
- import { EntityDict, OperateOption, SelectOption, OperationResult, DeduceFilter } from "../types/Entity";
1
+ import { EntityDict, OperateOption, SelectOption, OperationResult, DeduceFilter, AggregationResult } from "../types/Entity";
2
2
  import { EntityDict as BaseEntityDict } from '../base-app-domain';
3
3
  import { RowStore } from '../types/RowStore';
4
4
  import { StorageSchema } from '../types/Storage';
@@ -13,7 +13,9 @@ export declare abstract class CascadeStore<ED extends EntityDict & BaseEntityDic
13
13
  protected abstract updateAbjointRow<T extends keyof ED, OP extends OperateOption, Cxt extends SyncContext<ED>>(entity: T, operation: ED[T]['Operation'], context: Cxt, option: OP): number;
14
14
  protected abstract selectAbjointRowAsync<T extends keyof ED, OP extends SelectOption, Cxt extends AsyncContext<ED>>(entity: T, selection: ED[T]['Selection'], context: Cxt, option: OP): Promise<Partial<ED[T]['Schema']>[]>;
15
15
  protected abstract updateAbjointRowAsync<T extends keyof ED, OP extends OperateOption, Cxt extends AsyncContext<ED>>(entity: T, operation: ED[T]['Create'] | ED[T]['Update'] | ED[T]['Remove'], context: Cxt, option: OP): Promise<number>;
16
- protected destructCascadeSelect<T extends keyof ED, OP extends SelectOption, Cxt extends SyncContext<ED> | AsyncContext<ED>, R>(entity: T, projection2: ED[T]['Selection']['data'], context: Cxt, cascadeSelect: <T2 extends keyof ED>(entity2: T2, selection: ED[T2]['Selection'], context: Cxt, op: OP) => R, option: OP): {
16
+ protected abstract aggregateSync<T extends keyof ED, OP extends SelectOption, Cxt extends SyncContext<ED>>(entity: T, aggregation: ED[T]['Aggregation'], context: Cxt, option: OP): AggregationResult<ED[T]['Schema']>;
17
+ protected abstract aggregateAsync<T extends keyof ED, OP extends SelectOption, Cxt extends AsyncContext<ED>>(entity: T, aggregation: ED[T]['Aggregation'], context: Cxt, option: OP): Promise<AggregationResult<ED[T]['Schema']>>;
18
+ protected destructCascadeSelect<T extends keyof ED, OP extends SelectOption, Cxt extends SyncContext<ED> | AsyncContext<ED>>(entity: T, projection2: ED[T]['Selection']['data'], context: Cxt, cascadeSelectFn: <T2 extends keyof ED>(entity2: T2, selection: ED[T2]['Selection'], context: Cxt, op: OP) => Partial<ED[T2]['Schema']>[] | Promise<Partial<ED[T2]['Schema']>[]>, aggregateFn: <T2 extends keyof ED>(entity2: T2, aggregation: ED[T2]['Aggregation'], context: Cxt, op: OP) => AggregationResult<ED[T2]['Schema']> | Promise<AggregationResult<ED[T2]['Schema']>>, option: OP): {
17
19
  projection: ED[T]["Selection"]["data"];
18
20
  cascadeSelectionFns: ((result: Partial<ED[T]['Schema']>[]) => Promise<void> | void)[];
19
21
  };