Skip to content

Commit f0541a6

Browse files
perf: store metadata in maps instead of arrays (#1825)
Co-authored-by: Alexey Aleksandrov <[email protected]>
1 parent fc30d79 commit f0541a6

File tree

1 file changed

+27
-8
lines changed

1 file changed

+27
-8
lines changed

src/metadata/MetadataStorage.ts

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ export class MetadataStorage {
1212
// Private properties
1313
// -------------------------------------------------------------------------
1414

15-
private validationMetadatas: ValidationMetadata[] = [];
16-
private constraintMetadatas: ConstraintMetadata[] = [];
15+
private validationMetadatas: Map<any, ValidationMetadata[]> = new Map();
16+
private constraintMetadatas: Map<any, ConstraintMetadata[]> = new Map();
1717

1818
get hasValidationMetaData(): boolean {
19-
return !!this.validationMetadatas.length;
19+
return !!this.validationMetadatas.size;
2020
}
2121

2222
// -------------------------------------------------------------------------
@@ -35,14 +35,26 @@ export class MetadataStorage {
3535
* Adds a new validation metadata.
3636
*/
3737
addValidationMetadata(metadata: ValidationMetadata): void {
38-
this.validationMetadatas.push(metadata);
38+
const existingMetadata = this.validationMetadatas.get(metadata.target);
39+
40+
if (existingMetadata) {
41+
existingMetadata.push(metadata);
42+
} else {
43+
this.validationMetadatas.set(metadata.target, [metadata]);
44+
}
3945
}
4046

4147
/**
4248
* Adds a new constraint metadata.
4349
*/
4450
addConstraintMetadata(metadata: ConstraintMetadata): void {
45-
this.constraintMetadatas.push(metadata);
51+
const existingMetadata = this.constraintMetadatas.get(metadata.target);
52+
53+
if (existingMetadata) {
54+
existingMetadata.push(metadata);
55+
} else {
56+
this.constraintMetadatas.set(metadata.target, [metadata]);
57+
}
4658
}
4759

4860
/**
@@ -91,7 +103,8 @@ export class MetadataStorage {
91103
};
92104

93105
// get directly related to a target metadatas
94-
const originalMetadatas = this.validationMetadatas.filter(metadata => {
106+
const filteredForOriginalMetadatasSearch = this.validationMetadatas.get(targetConstructor) || [];
107+
const originalMetadatas = filteredForOriginalMetadatasSearch.filter(metadata => {
95108
if (metadata.target !== targetConstructor && metadata.target !== targetSchema) return false;
96109
if (includeMetadataBecauseOfAlwaysOption(metadata)) return true;
97110
if (excludeMetadataBecauseOfStrictGroupsOption(metadata)) return false;
@@ -102,7 +115,13 @@ export class MetadataStorage {
102115
});
103116

104117
// get metadatas for inherited classes
105-
const inheritedMetadatas = this.validationMetadatas.filter(metadata => {
118+
const filteredForInheritedMetadatasSearch = [];
119+
for (const [key, value] of this.validationMetadatas.entries()) {
120+
if (targetConstructor.prototype instanceof key) {
121+
filteredForInheritedMetadatasSearch.push(...value);
122+
}
123+
}
124+
const inheritedMetadatas = filteredForInheritedMetadatasSearch.filter(metadata => {
106125
// if target is a string it's means we validate against a schema, and there is no inheritance support for schemas
107126
if (typeof metadata.target === 'string') return false;
108127
if (metadata.target === targetConstructor) return false;
@@ -133,7 +152,7 @@ export class MetadataStorage {
133152
* Gets all validator constraints for the given object.
134153
*/
135154
getTargetValidatorConstraints(target: Function): ConstraintMetadata[] {
136-
return this.constraintMetadatas.filter(metadata => metadata.target === target);
155+
return this.constraintMetadatas.get(target) || [];
137156
}
138157
}
139158

0 commit comments

Comments
 (0)