From 36dec540a6af5f6355b9a97f100545bbf47c53a7 Mon Sep 17 00:00:00 2001 From: Krmjn09 Date: Tue, 17 Jun 2025 16:53:53 +0530 Subject: [PATCH 1/2] Added Logic For Alias and Extra Type Info --- demo/node/rntuple_test.js | 18 +++++++++++++++ modules/rntuple.mjs | 47 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/demo/node/rntuple_test.js b/demo/node/rntuple_test.js index 77d451d47..641346997 100644 --- a/demo/node/rntuple_test.js +++ b/demo/node/rntuple_test.js @@ -41,7 +41,17 @@ else { console.error(`FAILURE: Field ${i} is missing name or type`); else console.log(`OK: Field ${i}: ${field.fieldName} (${field.typeName})`); + if (i === 0) { + if (field.fieldName !== 'Category' || field.typeName !== 'std::int32_t') + console.error(`FAILURE: First field should be 'Category (std::int32_t)' but got '${field.fieldName} (${field.typeName})'`); + + } else if (i === rntuple.builder.fieldDescriptors.length - 1){ + if (field.fieldName !== 'Nation' || field.typeName !== 'std::string') + console.error(`FAILURE: Last field should be 'Nation (std::string)' but got '${field.fieldName} (${field.typeName})'`); + + } } + } // Column Check @@ -56,6 +66,14 @@ else { console.error(`FAILURE: Column ${i} is missing fieldId`); else console.log(`OK: Column ${i} fieldId: ${column.fieldId} `); + if (i === 0) { + if (column.fieldId !== 0) + console.error(`FAILURE: First column should be for fieldId 0 (Category)`); + } else if (i === rntuple.builder.columnDescriptors.length - 1){ + if (column.fieldId !== 10) + console.error(`FAILURE: Last column should be for fieldId 10 (Nation)`); + } } } + diff --git a/modules/rntuple.mjs b/modules/rntuple.mjs index fb252b250..687e38cd5 100644 --- a/modules/rntuple.mjs +++ b/modules/rntuple.mjs @@ -130,6 +130,10 @@ deserializeHeader(header_blob) { // List frame: list of column record frames this._readColumnDescriptors(reader); + // Read alias column descriptors + this._readAliasColumn(reader); + // Read Extra Type Information + this._readExtraTypeInformation(reader); } deserializeFooter(footer_blob) { @@ -267,6 +271,49 @@ _readColumnDescriptors(reader) { } this.columnDescriptors = columnDescriptors; } +_readAliasColumn(reader){ + const aliasColumnListSize = reader.readS64(); // signed 64-bit + const aliasListisList = aliasColumnListSize < 0; + if (!aliasListisList) + throw new Error('Alias column list frame is not a list frame, which is required.'); + const aliasColumnCount = reader.readU32(); // number of alias column entries + console.log('Alias Column List Count:', aliasColumnCount); + const aliasColumns = []; + for (let i = 0; i < aliasColumnCount; ++i){ + const aliasColumnRecordSize = reader.readS64(), + physicalColumnId = reader.readU32(), + fieldId = reader.readU32(); + console.log(`Alias Column Record Size: ${aliasColumnRecordSize}`); + aliasColumns.push({ + physicalColumnId, + fieldId + }); + } + this.aliasColumns = aliasColumns; +} +_readExtraTypeInformation(reader) { + const extraTypeInfoListSize = reader.readS64(); // signed 64-bit + const isList = extraTypeInfoListSize < 0; + + if (!isList) + throw new Error('Extra type info frame is not a list frame, which is required.'); + + const entryCount = reader.readU32(); + console.log('Extra Type Info Count:', entryCount); + + const extraTypeInfo = []; + for (let i = 0; i < entryCount; ++i) { + const extraTypeInfoRecordSize = reader.readS64(), + contentId = reader.readU32(), + typeVersion = reader.readU32(); + console.log(`Extra Type Info Record Size: ${extraTypeInfoRecordSize}`); + extraTypeInfo.push({ + contentId, + typeVersion + }); + } + this.extraTypeInfo = extraTypeInfo; +} } From 71ac6a99afefb8faf6f8881efbb48b01f3655c4c Mon Sep 17 00:00:00 2001 From: Krmjn09 Date: Tue, 17 Jun 2025 16:57:05 +0530 Subject: [PATCH 2/2] Added Null case for column --- demo/node/rntuple_test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/node/rntuple_test.js b/demo/node/rntuple_test.js index 641346997..1a4d8d35b 100644 --- a/demo/node/rntuple_test.js +++ b/demo/node/rntuple_test.js @@ -62,7 +62,7 @@ else { console.log(`OK: ${rntuple.builder.columnDescriptors.length} column(s) deserialized`); for (let i = 0; i < rntuple.builder.columnDescriptors.length; ++i) { const column = rntuple.builder.columnDescriptors[i]; - if (!column.fieldId) + if (column.fieldId === undefined || column.fieldId === null) console.error(`FAILURE: Column ${i} is missing fieldId`); else console.log(`OK: Column ${i} fieldId: ${column.fieldId} `);