@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.
- package/_test_/unit/rules/populationDtos.test.ts +58 -0
- package/_test_/unit/rules/populationMove.test.ts +31 -0
- package/bin/rewardsEligibility/constants/SegmentLimits.d.ts +1 -5
- package/bin/rewardsEligibility/constants/SegmentLimits.js +15 -6
- package/bin/rewardsEligibility/dtos/backoffice/segments/PopulationSegmentDefinition.d.ts +1 -8
- package/bin/rewardsEligibility/dtos/backoffice/segments/PopulationSegmentDefinition.js +14 -37
- package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentAggregateCondition.d.ts +1 -18
- package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentAggregateCondition.js +14 -68
- package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentColumnCondition.d.ts +1 -11
- package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentColumnCondition.js +14 -43
- package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentGroup.d.ts +1 -9
- package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentGroup.js +14 -41
- package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentParam.d.ts +1 -10
- package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentParam.js +15 -5
- package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentSchemaResponse.d.ts +1 -10
- package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentSchemaResponse.js +15 -8
- package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentTableSchemaResponse.d.ts +1 -12
- package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentTableSchemaResponse.js +15 -7
- package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentUsedColumn.d.ts +1 -5
- package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentUsedColumn.js +15 -4
- package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentWindow.d.ts +1 -5
- package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentWindow.js +14 -28
- package/bin/rewardsEligibility/enums/SegmentAggregateFnEnum.d.ts +1 -5
- package/bin/rewardsEligibility/enums/SegmentAggregateFnEnum.js +15 -7
- package/bin/rewardsEligibility/enums/SegmentConditionKindEnum.d.ts +1 -4
- package/bin/rewardsEligibility/enums/SegmentConditionKindEnum.js +15 -6
- package/bin/rewardsEligibility/enums/SegmentMatchEnum.d.ts +1 -4
- package/bin/rewardsEligibility/enums/SegmentMatchEnum.js +15 -6
- package/bin/rewardsEligibility/enums/SegmentOperatorEnum.d.ts +1 -16
- package/bin/rewardsEligibility/enums/SegmentOperatorEnum.js +15 -18
- package/bin/rewardsEligibility/enums/SegmentParamSourceEnum.d.ts +1 -5
- package/bin/rewardsEligibility/enums/SegmentParamSourceEnum.js +15 -7
- package/bin/rewardsEligibility/enums/SegmentParamTypeEnum.d.ts +1 -7
- package/bin/rewardsEligibility/enums/SegmentParamTypeEnum.js +15 -9
- package/bin/rules/constants/SegmentLimits.d.ts +5 -0
- package/bin/rules/constants/SegmentLimits.js +8 -0
- package/bin/rules/dtos/population/PopulationCompileRequest.d.ts +6 -0
- package/bin/rules/dtos/population/PopulationCompileRequest.js +32 -0
- package/bin/rules/dtos/population/PopulationCompileResponse.d.ts +9 -0
- package/bin/rules/dtos/population/PopulationCompileResponse.js +6 -0
- package/bin/rules/dtos/population/PopulationExecutionPageResponse.d.ts +10 -0
- package/bin/rules/dtos/population/PopulationExecutionPageResponse.js +7 -0
- package/bin/rules/dtos/population/PopulationExecutionRequest.d.ts +10 -0
- package/bin/rules/dtos/population/PopulationExecutionRequest.js +59 -0
- package/bin/rules/dtos/population/PopulationExecutionResponse.d.ts +5 -0
- package/bin/rules/dtos/population/PopulationExecutionResponse.js +6 -0
- package/bin/rules/dtos/population/PopulationSegmentDefinition.d.ts +8 -0
- package/bin/rules/dtos/population/PopulationSegmentDefinition.js +40 -0
- package/bin/rules/dtos/population/PopulationTestRequest.d.ts +7 -0
- package/bin/rules/dtos/population/PopulationTestRequest.js +38 -0
- package/bin/rules/dtos/population/PopulationTestResponse.d.ts +26 -0
- package/bin/rules/dtos/population/PopulationTestResponse.js +13 -0
- package/bin/rules/dtos/population/SegmentAggregateCondition.d.ts +18 -0
- package/bin/rules/dtos/population/SegmentAggregateCondition.js +71 -0
- package/bin/rules/dtos/population/SegmentColumnCondition.d.ts +11 -0
- package/bin/rules/dtos/population/SegmentColumnCondition.js +46 -0
- package/bin/rules/dtos/population/SegmentGroup.d.ts +9 -0
- package/bin/rules/dtos/population/SegmentGroup.js +44 -0
- package/bin/rules/dtos/population/SegmentParam.d.ts +10 -0
- package/bin/rules/dtos/population/SegmentParam.js +7 -0
- package/bin/rules/dtos/population/SegmentSchemaResponse.d.ts +10 -0
- package/bin/rules/dtos/population/SegmentSchemaResponse.js +10 -0
- package/bin/rules/dtos/population/SegmentTableSchemaResponse.d.ts +12 -0
- package/bin/rules/dtos/population/SegmentTableSchemaResponse.js +9 -0
- package/bin/rules/dtos/population/SegmentUsedColumn.d.ts +5 -0
- package/bin/rules/dtos/population/SegmentUsedColumn.js +6 -0
- package/bin/rules/dtos/population/SegmentWindow.d.ts +5 -0
- package/bin/rules/dtos/population/SegmentWindow.js +31 -0
- package/bin/rules/enums/PopulationErrorCodeEnum.d.ts +12 -0
- package/bin/rules/enums/PopulationErrorCodeEnum.js +16 -0
- package/bin/rules/enums/PopulationExecutionStatusEnum.d.ts +6 -0
- package/bin/rules/enums/PopulationExecutionStatusEnum.js +10 -0
- package/bin/rules/enums/PopulationTestStatusEnum.d.ts +5 -0
- package/bin/rules/enums/PopulationTestStatusEnum.js +9 -0
- package/bin/rules/enums/SegmentAggregateFnEnum.d.ts +5 -0
- package/bin/rules/enums/SegmentAggregateFnEnum.js +9 -0
- package/bin/rules/enums/SegmentConditionKindEnum.d.ts +4 -0
- package/bin/rules/enums/SegmentConditionKindEnum.js +8 -0
- package/bin/rules/enums/SegmentMatchEnum.d.ts +4 -0
- package/bin/rules/enums/SegmentMatchEnum.js +8 -0
- package/bin/rules/enums/SegmentOperatorEnum.d.ts +16 -0
- package/bin/rules/enums/SegmentOperatorEnum.js +20 -0
- package/bin/rules/enums/SegmentParamSourceEnum.d.ts +5 -0
- package/bin/rules/enums/SegmentParamSourceEnum.js +9 -0
- package/bin/rules/enums/SegmentParamTypeEnum.d.ts +7 -0
- package/bin/rules/enums/SegmentParamTypeEnum.js +11 -0
- package/bin/rules/index.d.ts +26 -0
- package/bin/rules/index.js +28 -0
- package/package.json +1 -1
- package/src/rewardsEligibility/constants/SegmentLimits.ts +1 -5
- package/src/rewardsEligibility/dtos/backoffice/segments/PopulationSegmentDefinition.ts +1 -12
- package/src/rewardsEligibility/dtos/backoffice/segments/SegmentAggregateCondition.ts +1 -22
- package/src/rewardsEligibility/dtos/backoffice/segments/SegmentColumnCondition.ts +1 -15
- package/src/rewardsEligibility/dtos/backoffice/segments/SegmentGroup.ts +1 -27
- package/src/rewardsEligibility/dtos/backoffice/segments/SegmentParam.ts +1 -11
- package/src/rewardsEligibility/dtos/backoffice/segments/SegmentSchemaResponse.ts +1 -11
- package/src/rewardsEligibility/dtos/backoffice/segments/SegmentTableSchemaResponse.ts +1 -14
- package/src/rewardsEligibility/dtos/backoffice/segments/SegmentUsedColumn.ts +1 -5
- package/src/rewardsEligibility/dtos/backoffice/segments/SegmentWindow.ts +1 -9
- package/src/rewardsEligibility/enums/SegmentAggregateFnEnum.ts +1 -5
- package/src/rewardsEligibility/enums/SegmentConditionKindEnum.ts +1 -4
- package/src/rewardsEligibility/enums/SegmentMatchEnum.ts +1 -4
- package/src/rewardsEligibility/enums/SegmentOperatorEnum.ts +1 -16
- package/src/rewardsEligibility/enums/SegmentParamSourceEnum.ts +1 -5
- package/src/rewardsEligibility/enums/SegmentParamTypeEnum.ts +1 -7
- package/src/rules/constants/SegmentLimits.ts +5 -0
- package/src/rules/dtos/population/PopulationCompileRequest.ts +9 -0
- package/src/rules/dtos/population/PopulationCompileResponse.ts +10 -0
- package/src/rules/dtos/population/PopulationExecutionPageResponse.ts +11 -0
- package/src/rules/dtos/population/PopulationExecutionRequest.ts +13 -0
- package/src/rules/dtos/population/PopulationExecutionResponse.ts +6 -0
- package/src/rules/dtos/population/PopulationSegmentDefinition.ts +12 -0
- package/src/rules/dtos/population/PopulationTestRequest.ts +10 -0
- package/src/rules/dtos/population/PopulationTestResponse.ts +29 -0
- package/src/rules/dtos/population/SegmentAggregateCondition.ts +22 -0
- package/src/rules/dtos/population/SegmentColumnCondition.ts +15 -0
- package/src/rules/dtos/population/SegmentGroup.ts +27 -0
- package/src/rules/dtos/population/SegmentParam.ts +11 -0
- package/src/rules/dtos/population/SegmentSchemaResponse.ts +11 -0
- package/src/rules/dtos/population/SegmentTableSchemaResponse.ts +14 -0
- package/src/rules/dtos/population/SegmentUsedColumn.ts +5 -0
- package/src/rules/dtos/population/SegmentWindow.ts +9 -0
- package/src/rules/enums/PopulationErrorCodeEnum.ts +12 -0
- package/src/rules/enums/PopulationExecutionStatusEnum.ts +6 -0
- package/src/rules/enums/PopulationTestStatusEnum.ts +5 -0
- package/src/rules/enums/SegmentAggregateFnEnum.ts +5 -0
- package/src/rules/enums/SegmentConditionKindEnum.ts +4 -0
- package/src/rules/enums/SegmentMatchEnum.ts +4 -0
- package/src/rules/enums/SegmentOperatorEnum.ts +16 -0
- package/src/rules/enums/SegmentParamSourceEnum.ts +5 -0
- package/src/rules/enums/SegmentParamTypeEnum.ts +7 -0
- package/src/rules/index.ts +30 -0
|
@@ -1,15 +1 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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,9 +1 @@
|
|
|
1
|
-
|
|
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,16 +1 @@
|
|
|
1
|
-
export
|
|
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';
|
|
@@ -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,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,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,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
|
+
}
|
package/src/rules/index.ts
CHANGED
|
@@ -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';
|