@fiado/type-kit 3.540.0 → 3.541.0

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.
Files changed (132) hide show
  1. package/_test_/unit/rules/populationDtos.test.ts +58 -0
  2. package/_test_/unit/rules/populationMove.test.ts +31 -0
  3. package/bin/rewardsEligibility/constants/SegmentLimits.d.ts +1 -5
  4. package/bin/rewardsEligibility/constants/SegmentLimits.js +15 -6
  5. package/bin/rewardsEligibility/dtos/backoffice/segments/PopulationSegmentDefinition.d.ts +1 -8
  6. package/bin/rewardsEligibility/dtos/backoffice/segments/PopulationSegmentDefinition.js +14 -37
  7. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentAggregateCondition.d.ts +1 -18
  8. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentAggregateCondition.js +14 -68
  9. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentColumnCondition.d.ts +1 -11
  10. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentColumnCondition.js +14 -43
  11. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentGroup.d.ts +1 -9
  12. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentGroup.js +14 -41
  13. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentParam.d.ts +1 -10
  14. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentParam.js +15 -5
  15. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentSchemaResponse.d.ts +1 -10
  16. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentSchemaResponse.js +15 -8
  17. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentTableSchemaResponse.d.ts +1 -12
  18. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentTableSchemaResponse.js +15 -7
  19. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentUsedColumn.d.ts +1 -5
  20. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentUsedColumn.js +15 -4
  21. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentWindow.d.ts +1 -5
  22. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentWindow.js +14 -28
  23. package/bin/rewardsEligibility/enums/SegmentAggregateFnEnum.d.ts +1 -5
  24. package/bin/rewardsEligibility/enums/SegmentAggregateFnEnum.js +15 -7
  25. package/bin/rewardsEligibility/enums/SegmentConditionKindEnum.d.ts +1 -4
  26. package/bin/rewardsEligibility/enums/SegmentConditionKindEnum.js +15 -6
  27. package/bin/rewardsEligibility/enums/SegmentMatchEnum.d.ts +1 -4
  28. package/bin/rewardsEligibility/enums/SegmentMatchEnum.js +15 -6
  29. package/bin/rewardsEligibility/enums/SegmentOperatorEnum.d.ts +1 -16
  30. package/bin/rewardsEligibility/enums/SegmentOperatorEnum.js +15 -18
  31. package/bin/rewardsEligibility/enums/SegmentParamSourceEnum.d.ts +1 -5
  32. package/bin/rewardsEligibility/enums/SegmentParamSourceEnum.js +15 -7
  33. package/bin/rewardsEligibility/enums/SegmentParamTypeEnum.d.ts +1 -7
  34. package/bin/rewardsEligibility/enums/SegmentParamTypeEnum.js +15 -9
  35. package/bin/rules/constants/SegmentLimits.d.ts +5 -0
  36. package/bin/rules/constants/SegmentLimits.js +8 -0
  37. package/bin/rules/dtos/population/PopulationCompileRequest.d.ts +6 -0
  38. package/bin/rules/dtos/population/PopulationCompileRequest.js +32 -0
  39. package/bin/rules/dtos/population/PopulationCompileResponse.d.ts +9 -0
  40. package/bin/rules/dtos/population/PopulationCompileResponse.js +6 -0
  41. package/bin/rules/dtos/population/PopulationExecutionPageResponse.d.ts +10 -0
  42. package/bin/rules/dtos/population/PopulationExecutionPageResponse.js +7 -0
  43. package/bin/rules/dtos/population/PopulationExecutionRequest.d.ts +10 -0
  44. package/bin/rules/dtos/population/PopulationExecutionRequest.js +59 -0
  45. package/bin/rules/dtos/population/PopulationExecutionResponse.d.ts +5 -0
  46. package/bin/rules/dtos/population/PopulationExecutionResponse.js +6 -0
  47. package/bin/rules/dtos/population/PopulationSegmentDefinition.d.ts +8 -0
  48. package/bin/rules/dtos/population/PopulationSegmentDefinition.js +40 -0
  49. package/bin/rules/dtos/population/PopulationTestRequest.d.ts +7 -0
  50. package/bin/rules/dtos/population/PopulationTestRequest.js +38 -0
  51. package/bin/rules/dtos/population/PopulationTestResponse.d.ts +26 -0
  52. package/bin/rules/dtos/population/PopulationTestResponse.js +13 -0
  53. package/bin/rules/dtos/population/SegmentAggregateCondition.d.ts +18 -0
  54. package/bin/rules/dtos/population/SegmentAggregateCondition.js +71 -0
  55. package/bin/rules/dtos/population/SegmentColumnCondition.d.ts +11 -0
  56. package/bin/rules/dtos/population/SegmentColumnCondition.js +46 -0
  57. package/bin/rules/dtos/population/SegmentGroup.d.ts +9 -0
  58. package/bin/rules/dtos/population/SegmentGroup.js +44 -0
  59. package/bin/rules/dtos/population/SegmentParam.d.ts +10 -0
  60. package/bin/rules/dtos/population/SegmentParam.js +7 -0
  61. package/bin/rules/dtos/population/SegmentSchemaResponse.d.ts +10 -0
  62. package/bin/rules/dtos/population/SegmentSchemaResponse.js +10 -0
  63. package/bin/rules/dtos/population/SegmentTableSchemaResponse.d.ts +12 -0
  64. package/bin/rules/dtos/population/SegmentTableSchemaResponse.js +9 -0
  65. package/bin/rules/dtos/population/SegmentUsedColumn.d.ts +5 -0
  66. package/bin/rules/dtos/population/SegmentUsedColumn.js +6 -0
  67. package/bin/rules/dtos/population/SegmentWindow.d.ts +5 -0
  68. package/bin/rules/dtos/population/SegmentWindow.js +31 -0
  69. package/bin/rules/enums/PopulationErrorCodeEnum.d.ts +12 -0
  70. package/bin/rules/enums/PopulationErrorCodeEnum.js +16 -0
  71. package/bin/rules/enums/PopulationExecutionStatusEnum.d.ts +6 -0
  72. package/bin/rules/enums/PopulationExecutionStatusEnum.js +10 -0
  73. package/bin/rules/enums/PopulationTestStatusEnum.d.ts +5 -0
  74. package/bin/rules/enums/PopulationTestStatusEnum.js +9 -0
  75. package/bin/rules/enums/SegmentAggregateFnEnum.d.ts +5 -0
  76. package/bin/rules/enums/SegmentAggregateFnEnum.js +9 -0
  77. package/bin/rules/enums/SegmentConditionKindEnum.d.ts +4 -0
  78. package/bin/rules/enums/SegmentConditionKindEnum.js +8 -0
  79. package/bin/rules/enums/SegmentMatchEnum.d.ts +4 -0
  80. package/bin/rules/enums/SegmentMatchEnum.js +8 -0
  81. package/bin/rules/enums/SegmentOperatorEnum.d.ts +16 -0
  82. package/bin/rules/enums/SegmentOperatorEnum.js +20 -0
  83. package/bin/rules/enums/SegmentParamSourceEnum.d.ts +5 -0
  84. package/bin/rules/enums/SegmentParamSourceEnum.js +9 -0
  85. package/bin/rules/enums/SegmentParamTypeEnum.d.ts +7 -0
  86. package/bin/rules/enums/SegmentParamTypeEnum.js +11 -0
  87. package/bin/rules/index.d.ts +26 -0
  88. package/bin/rules/index.js +28 -0
  89. package/package.json +1 -1
  90. package/src/rewardsEligibility/constants/SegmentLimits.ts +1 -5
  91. package/src/rewardsEligibility/dtos/backoffice/segments/PopulationSegmentDefinition.ts +1 -12
  92. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentAggregateCondition.ts +1 -22
  93. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentColumnCondition.ts +1 -15
  94. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentGroup.ts +1 -27
  95. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentParam.ts +1 -11
  96. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentSchemaResponse.ts +1 -11
  97. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentTableSchemaResponse.ts +1 -14
  98. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentUsedColumn.ts +1 -5
  99. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentWindow.ts +1 -9
  100. package/src/rewardsEligibility/enums/SegmentAggregateFnEnum.ts +1 -5
  101. package/src/rewardsEligibility/enums/SegmentConditionKindEnum.ts +1 -4
  102. package/src/rewardsEligibility/enums/SegmentMatchEnum.ts +1 -4
  103. package/src/rewardsEligibility/enums/SegmentOperatorEnum.ts +1 -16
  104. package/src/rewardsEligibility/enums/SegmentParamSourceEnum.ts +1 -5
  105. package/src/rewardsEligibility/enums/SegmentParamTypeEnum.ts +1 -7
  106. package/src/rules/constants/SegmentLimits.ts +5 -0
  107. package/src/rules/dtos/population/PopulationCompileRequest.ts +9 -0
  108. package/src/rules/dtos/population/PopulationCompileResponse.ts +10 -0
  109. package/src/rules/dtos/population/PopulationExecutionPageResponse.ts +11 -0
  110. package/src/rules/dtos/population/PopulationExecutionRequest.ts +13 -0
  111. package/src/rules/dtos/population/PopulationExecutionResponse.ts +6 -0
  112. package/src/rules/dtos/population/PopulationSegmentDefinition.ts +12 -0
  113. package/src/rules/dtos/population/PopulationTestRequest.ts +10 -0
  114. package/src/rules/dtos/population/PopulationTestResponse.ts +29 -0
  115. package/src/rules/dtos/population/SegmentAggregateCondition.ts +22 -0
  116. package/src/rules/dtos/population/SegmentColumnCondition.ts +15 -0
  117. package/src/rules/dtos/population/SegmentGroup.ts +27 -0
  118. package/src/rules/dtos/population/SegmentParam.ts +11 -0
  119. package/src/rules/dtos/population/SegmentSchemaResponse.ts +11 -0
  120. package/src/rules/dtos/population/SegmentTableSchemaResponse.ts +14 -0
  121. package/src/rules/dtos/population/SegmentUsedColumn.ts +5 -0
  122. package/src/rules/dtos/population/SegmentWindow.ts +9 -0
  123. package/src/rules/enums/PopulationErrorCodeEnum.ts +12 -0
  124. package/src/rules/enums/PopulationExecutionStatusEnum.ts +6 -0
  125. package/src/rules/enums/PopulationTestStatusEnum.ts +5 -0
  126. package/src/rules/enums/SegmentAggregateFnEnum.ts +5 -0
  127. package/src/rules/enums/SegmentConditionKindEnum.ts +4 -0
  128. package/src/rules/enums/SegmentMatchEnum.ts +4 -0
  129. package/src/rules/enums/SegmentOperatorEnum.ts +16 -0
  130. package/src/rules/enums/SegmentParamSourceEnum.ts +5 -0
  131. package/src/rules/enums/SegmentParamTypeEnum.ts +7 -0
  132. package/src/rules/index.ts +30 -0
@@ -1,15 +1 @@
1
- import { Expose } from 'class-transformer';
2
- import { Equals, IsEnum, IsOptional, Matches } from 'class-validator';
3
- import { JsonValue } from '../../../../common';
4
- import { SEGMENT_IDENTIFIER_PATTERN } from '../../../constants/SegmentLimits';
5
- import { SegmentConditionKindEnum } from '../../../enums/SegmentConditionKindEnum';
6
- import { SegmentOperatorEnum } from '../../../enums/SegmentOperatorEnum';
7
-
8
- /** (a) Columna de una tabla unida por `directoryid`. El tipo de `value` (escalar, lista o `{days}`) lo valida el compilador contra el tipo de Glue. */
9
- export class SegmentColumnCondition {
10
- @Expose() @Equals(SegmentConditionKindEnum.COLUMN) kind: SegmentConditionKindEnum.COLUMN;
11
- @Expose() @Matches(SEGMENT_IDENTIFIER_PATTERN) table: string;
12
- @Expose() @Matches(SEGMENT_IDENTIFIER_PATTERN) column: string;
13
- @Expose() @IsEnum(SegmentOperatorEnum) op: SegmentOperatorEnum;
14
- @Expose() @IsOptional() value?: JsonValue;
15
- }
1
+ export * from '../../../../rules/dtos/population/SegmentColumnCondition';
@@ -1,27 +1 @@
1
- import { Expose, Type } from 'class-transformer';
2
- import { ArrayMaxSize, ArrayMinSize, IsArray, IsEnum, ValidateNested } from 'class-validator';
3
- import { SegmentConditionKindEnum } from '../../../enums/SegmentConditionKindEnum';
4
- import { SegmentMatchEnum } from '../../../enums/SegmentMatchEnum';
5
- import { SegmentAggregateCondition } from './SegmentAggregateCondition';
6
- import { SegmentColumnCondition } from './SegmentColumnCondition';
7
-
8
- export type SegmentCondition = SegmentColumnCondition | SegmentAggregateCondition;
9
-
10
- export class SegmentGroup {
11
- @Expose() @IsEnum(SegmentMatchEnum) match: SegmentMatchEnum;
12
-
13
- /** `kind` decide la clase; un `kind` desconocido NO se instancia y la validacion lo rechaza (el objeto queda sin `@Equals` valido). */
14
- @Expose()
15
- @IsArray() @ArrayMinSize(1) @ArrayMaxSize(20) @ValidateNested({ each: true })
16
- @Type(() => Object, {
17
- keepDiscriminatorProperty: true,
18
- discriminator: {
19
- property: 'kind',
20
- subTypes: [
21
- { value: SegmentColumnCondition, name: SegmentConditionKindEnum.COLUMN },
22
- { value: SegmentAggregateCondition, name: SegmentConditionKindEnum.AGGREGATE },
23
- ],
24
- },
25
- })
26
- conditions: SegmentCondition[];
27
- }
1
+ export * from '../../../../rules/dtos/population/SegmentGroup';
@@ -1,11 +1 @@
1
- import { SegmentParamSourceEnum } from '../../../enums/SegmentParamSourceEnum';
2
- import { SegmentParamTypeEnum } from '../../../enums/SegmentParamTypeEnum';
3
-
4
- /** Un `?` del SQL, en orden. LITERAL lleva `value` como texto canonico; REFERENCE_AT_MINUS_DAYS lleva `days`. */
5
- export class SegmentParam {
6
- name: string;
7
- type: SegmentParamTypeEnum;
8
- source: SegmentParamSourceEnum;
9
- value?: string;
10
- days?: number;
11
- }
1
+ export * from '../../../../rules/dtos/population/SegmentParam';
@@ -1,11 +1 @@
1
- export class SegmentSchemaTableResponse {
2
- table: string;
3
- joinKey: string;
4
- columnCount: number;
5
- }
6
-
7
- /** `available: false` = ambiente sin datalake accesible: el constructor muestra "no disponible". */
8
- export class SegmentSchemaResponse {
9
- available: boolean;
10
- tables: SegmentSchemaTableResponse[];
11
- }
1
+ export * from '../../../../rules/dtos/population/SegmentSchemaResponse';
@@ -1,14 +1 @@
1
- import { SegmentOperatorEnum } from '../../../enums/SegmentOperatorEnum';
2
-
3
- export class SegmentColumnSchemaResponse {
4
- name: string;
5
- type: string;
6
- isDate: boolean;
7
- operators: SegmentOperatorEnum[];
8
- }
9
-
10
- export class SegmentTableSchemaResponse {
11
- table: string;
12
- joinKey: string;
13
- columns: SegmentColumnSchemaResponse[];
14
- }
1
+ export * from '../../../../rules/dtos/population/SegmentTableSchemaResponse';
@@ -1,5 +1 @@
1
- export class SegmentUsedColumn {
2
- table: string;
3
- column: string;
4
- type: string;
5
- }
1
+ export * from '../../../../rules/dtos/population/SegmentUsedColumn';
@@ -1,9 +1 @@
1
- import { Expose } from 'class-transformer';
2
- import { IsInt, Matches, Max, Min } from 'class-validator';
3
- import { SEGMENT_IDENTIFIER_PATTERN, SEGMENT_MAX_DAYS } from '../../../constants/SegmentLimits';
4
-
5
- /** Ventana relativa [referenceAt - days, referenceAt) sobre una columna de fecha (A§4.1). */
6
- export class SegmentWindow {
7
- @Expose() @Matches(SEGMENT_IDENTIFIER_PATTERN) dateColumn: string;
8
- @Expose() @IsInt() @Min(1) @Max(SEGMENT_MAX_DAYS) days: number;
9
- }
1
+ export * from '../../../../rules/dtos/population/SegmentWindow';
@@ -1,5 +1 @@
1
- export enum SegmentAggregateFnEnum {
2
- EXISTS = 'EXISTS',
3
- COUNT = 'COUNT',
4
- SUM = 'SUM',
5
- }
1
+ export * from '../../rules/enums/SegmentAggregateFnEnum';
@@ -1,4 +1 @@
1
- export enum SegmentConditionKindEnum {
2
- COLUMN = 'COLUMN',
3
- AGGREGATE = 'AGGREGATE',
4
- }
1
+ export * from '../../rules/enums/SegmentConditionKindEnum';
@@ -1,4 +1 @@
1
- export enum SegmentMatchEnum {
2
- ALL = 'ALL',
3
- ANY = 'ANY',
4
- }
1
+ export * from '../../rules/enums/SegmentMatchEnum';
@@ -1,16 +1 @@
1
- export enum SegmentOperatorEnum {
2
- EQUALS = 'EQUALS',
3
- NOT_EQUALS = 'NOT_EQUALS',
4
- IN = 'IN',
5
- NOT_IN = 'NOT_IN',
6
- IS_NULL = 'IS_NULL',
7
- IS_NOT_NULL = 'IS_NOT_NULL',
8
- GT = 'GT',
9
- GTE = 'GTE',
10
- LT = 'LT',
11
- LTE = 'LTE',
12
- CONTAINS = 'CONTAINS',
13
- ANY_IN = 'ANY_IN',
14
- WITHIN_LAST_DAYS = 'WITHIN_LAST_DAYS',
15
- NOT_WITHIN_LAST_DAYS = 'NOT_WITHIN_LAST_DAYS',
16
- }
1
+ export * from '../../rules/enums/SegmentOperatorEnum';
@@ -1,5 +1 @@
1
- export enum SegmentParamSourceEnum {
2
- LITERAL = 'LITERAL',
3
- REFERENCE_AT = 'REFERENCE_AT',
4
- REFERENCE_AT_MINUS_DAYS = 'REFERENCE_AT_MINUS_DAYS',
5
- }
1
+ export * from '../../rules/enums/SegmentParamSourceEnum';
@@ -1,7 +1 @@
1
- export enum SegmentParamTypeEnum {
2
- STRING = 'STRING',
3
- INTEGER = 'INTEGER',
4
- DECIMAL = 'DECIMAL',
5
- BOOLEAN = 'BOOLEAN',
6
- TIMESTAMP = 'TIMESTAMP',
7
- }
1
+ export * from '../../rules/enums/SegmentParamTypeEnum';
@@ -0,0 +1,5 @@
1
+ /** Identificador SQL permitido para tabla/columna (A§4.3 paso 1): minusculas, digitos y guion bajo; nunca texto libre. */
2
+ export const SEGMENT_IDENTIFIER_PATTERN = /^[a-z_][a-z0-9_]*$/;
3
+ export const SEGMENT_MAX_DAYS = 365;
4
+ export const SEGMENT_MAX_PARAMS = 40;
5
+ export const SEGMENT_MAX_AGGREGATES = 8;
@@ -0,0 +1,9 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { IsDefined, IsOptional, IsString, ValidateNested } from 'class-validator';
3
+ import { PopulationSegmentDefinition } from './PopulationSegmentDefinition';
4
+
5
+ /** Compila una definicion a SQL parametrizado (POST /population/compile). `consumer` solo para logs/metricas. */
6
+ export class PopulationCompileRequest {
7
+ @Expose() @IsOptional() @IsString() consumer?: string;
8
+ @Expose() @IsDefined() @ValidateNested() @Type(() => PopulationSegmentDefinition) definition: PopulationSegmentDefinition;
9
+ }
@@ -0,0 +1,10 @@
1
+ import { SegmentParam } from './SegmentParam';
2
+ import { SegmentUsedColumn } from './SegmentUsedColumn';
3
+
4
+ export class PopulationCompileResponse {
5
+ sql: string;
6
+ params: SegmentParam[];
7
+ usedColumns: SegmentUsedColumn[];
8
+ humanSummary: string;
9
+ definitionHash: string;
10
+ }
@@ -0,0 +1,11 @@
1
+ import { PopulationErrorCodeEnum } from '../../enums/PopulationErrorCodeEnum';
2
+ import { PopulationExecutionStatusEnum } from '../../enums/PopulationExecutionStatusEnum';
3
+
4
+ /** Pagina de hasta 1000 ids. Sin `nextToken` = ultima pagina. */
5
+ export class PopulationExecutionPageResponse {
6
+ executionId: string;
7
+ status: PopulationExecutionStatusEnum;
8
+ ids: string[];
9
+ nextToken?: string;
10
+ reason?: PopulationErrorCodeEnum;
11
+ }
@@ -0,0 +1,13 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { IsDefined, IsISO8601, IsNotEmpty, IsOptional, IsString, MaxLength, MinLength, ValidateNested } from 'class-validator';
3
+ import { PopulationSegmentDefinition } from './PopulationSegmentDefinition';
4
+
5
+ /** Inicia una ejecucion de poblacion (POST /population/executions). El central recompila; `expectedSql` activa G3 (SEGMENT_SCHEMA_DRIFT). */
6
+ export class PopulationExecutionRequest {
7
+ @Expose() @IsOptional() @IsString() consumer?: string;
8
+ @Expose() @IsDefined() @ValidateNested() @Type(() => PopulationSegmentDefinition) definition: PopulationSegmentDefinition;
9
+ @Expose() @IsISO8601({ strict: true }) referenceAt: string;
10
+ @Expose() @IsString() @MinLength(32) @MaxLength(128) idempotencyKey: string;
11
+ @Expose() @IsOptional() @IsString() @IsNotEmpty() expectedSql?: string;
12
+ @Expose() @IsOptional() @IsString() @MinLength(1) @MaxLength(256) afterDirectoryId?: string;
13
+ }
@@ -0,0 +1,6 @@
1
+ import { PopulationExecutionStatusEnum } from '../../enums/PopulationExecutionStatusEnum';
2
+
3
+ export class PopulationExecutionResponse {
4
+ executionId: string;
5
+ status: PopulationExecutionStatusEnum;
6
+ }
@@ -0,0 +1,12 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { ArrayMaxSize, ArrayMinSize, IsArray, IsEnum, Matches, ValidateNested } from 'class-validator';
3
+ import { SEGMENT_IDENTIFIER_PATTERN } from '../../constants/SegmentLimits';
4
+ import { SegmentMatchEnum } from '../../enums/SegmentMatchEnum';
5
+ import { SegmentGroup } from './SegmentGroup';
6
+
7
+ /** El constructor tal cual (A§4.1): tabla ancla (una fila -> un directoryid), TODAS/ALGUNA global y grupos con su propio TODAS/ALGUNA. */
8
+ export class PopulationSegmentDefinition {
9
+ @Expose() @Matches(SEGMENT_IDENTIFIER_PATTERN) baseTable: string;
10
+ @Expose() @IsEnum(SegmentMatchEnum) match: SegmentMatchEnum;
11
+ @Expose() @IsArray() @ArrayMinSize(1) @ArrayMaxSize(10) @ValidateNested({ each: true }) @Type(() => SegmentGroup) groups: SegmentGroup[];
12
+ }
@@ -0,0 +1,10 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { IsDefined, IsISO8601, IsOptional, IsString, ValidateNested } from 'class-validator';
3
+ import { PopulationSegmentDefinition } from './PopulationSegmentDefinition';
4
+
5
+ /** Prueba sin estado de una definicion (POST /population/tests). `referenceAt` ISO-8601 con zona; por defecto, ahora. */
6
+ export class PopulationTestRequest {
7
+ @Expose() @IsOptional() @IsString() consumer?: string;
8
+ @Expose() @IsDefined() @ValidateNested() @Type(() => PopulationSegmentDefinition) definition: PopulationSegmentDefinition;
9
+ @Expose() @IsOptional() @IsISO8601({ strict: true }) referenceAt?: string;
10
+ }
@@ -0,0 +1,29 @@
1
+ import { PopulationErrorCodeEnum } from '../../enums/PopulationErrorCodeEnum';
2
+ import { PopulationTestStatusEnum } from '../../enums/PopulationTestStatusEnum';
3
+ import { SegmentParam } from './SegmentParam';
4
+
5
+ export class PopulationTestResultResponse {
6
+ count: number;
7
+ sampleIds: string[];
8
+ bytesScanned: number;
9
+ durationMs: number;
10
+ }
11
+
12
+ export class PopulationTestErrorResponse {
13
+ code: PopulationErrorCodeEnum;
14
+ message: string;
15
+ }
16
+
17
+ /** `queryExecutionId` sale del count (lastTest de rewards). Estado RUNNING: el cliente reconsulta por `testId`. */
18
+ export class PopulationTestResponse {
19
+ testId: string;
20
+ status: PopulationTestStatusEnum;
21
+ referenceAt: string;
22
+ definitionHash: string;
23
+ humanSummary: string;
24
+ sql: string;
25
+ params: SegmentParam[];
26
+ queryExecutionId?: string;
27
+ result?: PopulationTestResultResponse;
28
+ errors?: PopulationTestErrorResponse[];
29
+ }
@@ -0,0 +1,22 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { ArrayMaxSize, Equals, IsArray, IsEnum, IsNumber, IsOptional, Matches, ValidateNested } from 'class-validator';
3
+ import { SEGMENT_IDENTIFIER_PATTERN } from '../../constants/SegmentLimits';
4
+ import { SegmentAggregateFnEnum } from '../../enums/SegmentAggregateFnEnum';
5
+ import { SegmentConditionKindEnum } from '../../enums/SegmentConditionKindEnum';
6
+ import { SegmentOperatorEnum } from '../../enums/SegmentOperatorEnum';
7
+ import { SegmentColumnCondition } from './SegmentColumnCondition';
8
+ import { SegmentWindow } from './SegmentWindow';
9
+
10
+ /** (b) Agregado con ventana relativa sobre una tabla relacionada (existe / cuenta / suma). `filters` elige QUE cuenta (estados, moneda...). */
11
+ export class SegmentAggregateCondition {
12
+ @Expose() @Equals(SegmentConditionKindEnum.AGGREGATE) kind: SegmentConditionKindEnum.AGGREGATE;
13
+ @Expose() @Matches(SEGMENT_IDENTIFIER_PATTERN) table: string;
14
+ @Expose() @IsEnum(SegmentAggregateFnEnum) fn: SegmentAggregateFnEnum;
15
+ /** Solo SUM. */
16
+ @Expose() @IsOptional() @Matches(SEGMENT_IDENTIFIER_PATTERN) column?: string;
17
+ /** COUNT y SUM; EXISTS no lleva. */
18
+ @Expose() @IsOptional() @IsEnum(SegmentOperatorEnum) op?: SegmentOperatorEnum;
19
+ @Expose() @IsOptional() @IsNumber() value?: number;
20
+ @Expose() @ValidateNested() @Type(() => SegmentWindow) window: SegmentWindow;
21
+ @Expose() @IsArray() @ArrayMaxSize(10) @ValidateNested({ each: true }) @Type(() => SegmentColumnCondition) filters: SegmentColumnCondition[];
22
+ }
@@ -0,0 +1,15 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { Equals, IsEnum, IsOptional, Matches } from 'class-validator';
3
+ import { JsonValue } from '../../../common';
4
+ import { SEGMENT_IDENTIFIER_PATTERN } from '../../constants/SegmentLimits';
5
+ import { SegmentConditionKindEnum } from '../../enums/SegmentConditionKindEnum';
6
+ import { SegmentOperatorEnum } from '../../enums/SegmentOperatorEnum';
7
+
8
+ /** (a) Columna de una tabla unida por `directoryid`. El tipo de `value` (escalar, lista o `{days}`) lo valida el compilador contra el tipo de Glue. */
9
+ export class SegmentColumnCondition {
10
+ @Expose() @Equals(SegmentConditionKindEnum.COLUMN) kind: SegmentConditionKindEnum.COLUMN;
11
+ @Expose() @Matches(SEGMENT_IDENTIFIER_PATTERN) table: string;
12
+ @Expose() @Matches(SEGMENT_IDENTIFIER_PATTERN) column: string;
13
+ @Expose() @IsEnum(SegmentOperatorEnum) op: SegmentOperatorEnum;
14
+ @Expose() @IsOptional() value?: JsonValue;
15
+ }
@@ -0,0 +1,27 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { ArrayMaxSize, ArrayMinSize, IsArray, IsEnum, ValidateNested } from 'class-validator';
3
+ import { SegmentConditionKindEnum } from '../../enums/SegmentConditionKindEnum';
4
+ import { SegmentMatchEnum } from '../../enums/SegmentMatchEnum';
5
+ import { SegmentAggregateCondition } from './SegmentAggregateCondition';
6
+ import { SegmentColumnCondition } from './SegmentColumnCondition';
7
+
8
+ export type SegmentCondition = SegmentColumnCondition | SegmentAggregateCondition;
9
+
10
+ export class SegmentGroup {
11
+ @Expose() @IsEnum(SegmentMatchEnum) match: SegmentMatchEnum;
12
+
13
+ /** `kind` decide la clase; un `kind` desconocido NO se instancia y la validacion lo rechaza (el objeto queda sin `@Equals` valido). */
14
+ @Expose()
15
+ @IsArray() @ArrayMinSize(1) @ArrayMaxSize(20) @ValidateNested({ each: true })
16
+ @Type(() => Object, {
17
+ keepDiscriminatorProperty: true,
18
+ discriminator: {
19
+ property: 'kind',
20
+ subTypes: [
21
+ { value: SegmentColumnCondition, name: SegmentConditionKindEnum.COLUMN },
22
+ { value: SegmentAggregateCondition, name: SegmentConditionKindEnum.AGGREGATE },
23
+ ],
24
+ },
25
+ })
26
+ conditions: SegmentCondition[];
27
+ }
@@ -0,0 +1,11 @@
1
+ import { SegmentParamSourceEnum } from '../../enums/SegmentParamSourceEnum';
2
+ import { SegmentParamTypeEnum } from '../../enums/SegmentParamTypeEnum';
3
+
4
+ /** Un `?` del SQL, en orden. LITERAL lleva `value` como texto canonico; REFERENCE_AT_MINUS_DAYS lleva `days`. */
5
+ export class SegmentParam {
6
+ name: string;
7
+ type: SegmentParamTypeEnum;
8
+ source: SegmentParamSourceEnum;
9
+ value?: string;
10
+ days?: number;
11
+ }
@@ -0,0 +1,11 @@
1
+ export class SegmentSchemaTableResponse {
2
+ table: string;
3
+ joinKey: string;
4
+ columnCount: number;
5
+ }
6
+
7
+ /** `available: false` = ambiente sin datalake accesible: el constructor muestra "no disponible". */
8
+ export class SegmentSchemaResponse {
9
+ available: boolean;
10
+ tables: SegmentSchemaTableResponse[];
11
+ }
@@ -0,0 +1,14 @@
1
+ import { SegmentOperatorEnum } from '../../enums/SegmentOperatorEnum';
2
+
3
+ export class SegmentColumnSchemaResponse {
4
+ name: string;
5
+ type: string;
6
+ isDate: boolean;
7
+ operators: SegmentOperatorEnum[];
8
+ }
9
+
10
+ export class SegmentTableSchemaResponse {
11
+ table: string;
12
+ joinKey: string;
13
+ columns: SegmentColumnSchemaResponse[];
14
+ }
@@ -0,0 +1,5 @@
1
+ export class SegmentUsedColumn {
2
+ table: string;
3
+ column: string;
4
+ type: string;
5
+ }
@@ -0,0 +1,9 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsInt, Matches, Max, Min } from 'class-validator';
3
+ import { SEGMENT_IDENTIFIER_PATTERN, SEGMENT_MAX_DAYS } from '../../constants/SegmentLimits';
4
+
5
+ /** Ventana relativa [referenceAt - days, referenceAt) sobre una columna de fecha (A§4.1). */
6
+ export class SegmentWindow {
7
+ @Expose() @Matches(SEGMENT_IDENTIFIER_PATTERN) dateColumn: string;
8
+ @Expose() @IsInt() @Min(1) @Max(SEGMENT_MAX_DAYS) days: number;
9
+ }
@@ -0,0 +1,12 @@
1
+ /** Codigos de error del canal de poblacion. Los 8 primeros coinciden con SegmentErrorCodeEnum. */
2
+ export enum PopulationErrorCodeEnum {
3
+ SEGMENT_INVALID = 'SEGMENT_INVALID',
4
+ SEGMENT_BLOCKED_COLUMN = 'SEGMENT_BLOCKED_COLUMN',
5
+ SEGMENT_SCHEMA_DRIFT = 'SEGMENT_SCHEMA_DRIFT',
6
+ SEGMENT_BYTES_EXCEEDED = 'SEGMENT_BYTES_EXCEEDED',
7
+ SEGMENT_QUERY_FAILED = 'SEGMENT_QUERY_FAILED',
8
+ SEGMENT_DATALAKE_UNAVAILABLE = 'SEGMENT_DATALAKE_UNAVAILABLE',
9
+ SEGMENT_DATALAKE_UNAVAILABLE_IN_ENV = 'SEGMENT_DATALAKE_UNAVAILABLE_IN_ENV',
10
+ SEGMENT_EXECUTION_NOT_FOUND = 'SEGMENT_EXECUTION_NOT_FOUND',
11
+ SEGMENT_NEXT_TOKEN_EXPIRED = 'SEGMENT_NEXT_TOKEN_EXPIRED',
12
+ }
@@ -0,0 +1,6 @@
1
+ export enum PopulationExecutionStatusEnum {
2
+ RUNNING = 'RUNNING',
3
+ SUCCEEDED = 'SUCCEEDED',
4
+ FAILED = 'FAILED',
5
+ CANCELLED = 'CANCELLED',
6
+ }
@@ -0,0 +1,5 @@
1
+ export enum PopulationTestStatusEnum {
2
+ RUNNING = 'RUNNING',
3
+ PASSED = 'PASSED',
4
+ FAILED = 'FAILED',
5
+ }
@@ -0,0 +1,5 @@
1
+ export enum SegmentAggregateFnEnum {
2
+ EXISTS = 'EXISTS',
3
+ COUNT = 'COUNT',
4
+ SUM = 'SUM',
5
+ }
@@ -0,0 +1,4 @@
1
+ export enum SegmentConditionKindEnum {
2
+ COLUMN = 'COLUMN',
3
+ AGGREGATE = 'AGGREGATE',
4
+ }
@@ -0,0 +1,4 @@
1
+ export enum SegmentMatchEnum {
2
+ ALL = 'ALL',
3
+ ANY = 'ANY',
4
+ }
@@ -0,0 +1,16 @@
1
+ export enum SegmentOperatorEnum {
2
+ EQUALS = 'EQUALS',
3
+ NOT_EQUALS = 'NOT_EQUALS',
4
+ IN = 'IN',
5
+ NOT_IN = 'NOT_IN',
6
+ IS_NULL = 'IS_NULL',
7
+ IS_NOT_NULL = 'IS_NOT_NULL',
8
+ GT = 'GT',
9
+ GTE = 'GTE',
10
+ LT = 'LT',
11
+ LTE = 'LTE',
12
+ CONTAINS = 'CONTAINS',
13
+ ANY_IN = 'ANY_IN',
14
+ WITHIN_LAST_DAYS = 'WITHIN_LAST_DAYS',
15
+ NOT_WITHIN_LAST_DAYS = 'NOT_WITHIN_LAST_DAYS',
16
+ }
@@ -0,0 +1,5 @@
1
+ export enum SegmentParamSourceEnum {
2
+ LITERAL = 'LITERAL',
3
+ REFERENCE_AT = 'REFERENCE_AT',
4
+ REFERENCE_AT_MINUS_DAYS = 'REFERENCE_AT_MINUS_DAYS',
5
+ }
@@ -0,0 +1,7 @@
1
+ export enum SegmentParamTypeEnum {
2
+ STRING = 'STRING',
3
+ INTEGER = 'INTEGER',
4
+ DECIMAL = 'DECIMAL',
5
+ BOOLEAN = 'BOOLEAN',
6
+ TIMESTAMP = 'TIMESTAMP',
7
+ }
@@ -18,3 +18,33 @@ export * from './dtos/GenerateRulesResponse';
18
18
  export * from './dtos/RulesTraceResponse';
19
19
  export * from './dtos/EvaluateRulesRequest';
20
20
  export * from './dtos/EvaluateRulesResponse';
21
+
22
+ //Poblacion (movido desde rewardsEligibility; alli queda re-export)
23
+ export * from './enums/SegmentMatchEnum';
24
+ export * from './enums/SegmentConditionKindEnum';
25
+ export * from './enums/SegmentAggregateFnEnum';
26
+ export * from './enums/SegmentOperatorEnum';
27
+ export * from './enums/SegmentParamTypeEnum';
28
+ export * from './enums/SegmentParamSourceEnum';
29
+ export * from './constants/SegmentLimits';
30
+ export * from './dtos/population/SegmentWindow';
31
+ export * from './dtos/population/SegmentColumnCondition';
32
+ export * from './dtos/population/SegmentAggregateCondition';
33
+ export * from './dtos/population/SegmentGroup';
34
+ export * from './dtos/population/PopulationSegmentDefinition';
35
+ export * from './dtos/population/SegmentParam';
36
+ export * from './dtos/population/SegmentUsedColumn';
37
+ export * from './dtos/population/SegmentSchemaResponse';
38
+ export * from './dtos/population/SegmentTableSchemaResponse';
39
+
40
+ //Poblacion: endpoints del canal /population/*
41
+ export * from './enums/PopulationErrorCodeEnum';
42
+ export * from './enums/PopulationTestStatusEnum';
43
+ export * from './enums/PopulationExecutionStatusEnum';
44
+ export * from './dtos/population/PopulationCompileRequest';
45
+ export * from './dtos/population/PopulationCompileResponse';
46
+ export * from './dtos/population/PopulationTestRequest';
47
+ export * from './dtos/population/PopulationTestResponse';
48
+ export * from './dtos/population/PopulationExecutionRequest';
49
+ export * from './dtos/population/PopulationExecutionResponse';
50
+ export * from './dtos/population/PopulationExecutionPageResponse';