public decompress()

in server/src/graphStore.ts [75:179]


	public decompress<T = object>(compressed: any[]): T {
		let result = this.parent !== undefined ? this.parent.decompress(compressed) : Object.create(null);
		for (let property of this.properties) {
			let index = property.index;
			let value = compressed[index];
			if (value === null || value === undefined) {
				continue;
			}
			let decompressor: Decompressor | undefined;
			switch (property.compressionKind) {
				case CompressionKind.id:
					result[property.name] = value;
					break;
				case CompressionKind.ids:
					result[property.name] = value;
					break;
				case CompressionKind.raw:
					result[property.name] = value;
					break;
				case CompressionKind.scalar:
					let convertedScalar = value;
					if (property.longForm !== undefined) {
						let long = property.longForm.get(value);
						if (long !== undefined) {
							convertedScalar = long;
						}
					}
					let dotIndex = property.name.indexOf('.');
					if (dotIndex !== -1) {
						let container = property.name.substr(0, dotIndex);
						let name = property.name.substring(dotIndex + 1);
						if (result[container] === undefined) {
							result[container] = Object.create(null);
						}
						result[container][name] = convertedScalar;
					} else {
						result[property.name] = convertedScalar;
					}
					break;
				case CompressionKind.literal:
					if (!Array.isArray(value) || typeof value[0] !== 'number') {
						throw new Error(`Compression kind literal detected on non array value. The property is ${property.name}`);
					}
					let convertedLiteral: any;
					decompressor = Decompressor.get(value[0]);
					if (decompressor === undefined) {
						throw new Error(`No decompression found for property ${property.name} and id ${value[0]}`);
					}
					convertedLiteral = decompressor.decompress(value);
					result[property.name] = convertedLiteral;
					break;
				case CompressionKind.array:
					if (!Array.isArray(value)) {
						throw new Error(`Compression kind array detected on non array value. The property is ${property.name}`);
					}
					let convertedArray: any[] = [];
					for (let element of value) {
						let type = typeof element;
						if (type === 'string' || type === 'number' || type === 'boolean') {
							convertedArray.push(element);
						} else if (Array.isArray(element) && element.length > 0 && typeof element[0] === 'number') {
							decompressor = Decompressor.get(element[0]);
							if (decompressor === undefined) {
								throw new Error(`No decompression found for property ${property.name} and id ${element[0]}`);
							}
							convertedArray.push(decompressor.decompress(element));
						} else {
							throw new Error(`The array element is neither a scalar nor an array.`);
						}
					}
					result[property.name] = convertedArray;
					break;
				case CompressionKind.any:
					let convertedAny: any;
					let type = typeof value;
					if (type === 'string' || type === 'number' || type === 'boolean') {
						convertedAny = value;
					} else if (Array.isArray(value)) {
						convertedAny = [];
						for (let element of value) {
							let type = typeof element;
							if (type === 'string' || type === 'number' || type === 'boolean') {
								(convertedAny as any[]).push(element);
							} else if (Array.isArray(element) && element.length > 0 && typeof element[0] === 'number') {
								decompressor = Decompressor.get(element[0]);
								if (decompressor === undefined) {
									throw new Error(`No decompression found for property ${property.name} and id ${element[0]}`);
								}
								(convertedAny as any[]).push(decompressor.decompress(element));
							} else {
								throw new Error(`The array element is neither a scalar nor an array.`);
							}
						}
					}
					if (convertedAny === undefined) {
						throw new Error(`Comression kind any can't be handled for property ${property.name}. Value is ${JSON.stringify(value)}`);
					}
					result[property.name] = convertedAny;
					break;
				default:
					throw new Error(`Compression kind ${property.compressionKind} unknown.`);
			}
		}
		return result;
	}