@@ -14,7 +14,7 @@ const version_id = 'dev',
1414
1515/** @summary version date
1616 * @desc Release date in format day/month/year like '14/04/2022' */
17- version_date = '16 /02/2026',
17+ version_date = '17 /02/2026',
1818
1919/** @summary version id and date
2020 * @desc Produced by concatenation of {@link version_id} and {@link version_date}
@@ -127242,6 +127242,7 @@ async function treeProcess(tree, selector, args) {
127242127242 case 'TLeafS': datakind = leaf.fIsUnsigned ? kUShort : kShort; break;
127243127243 case 'TLeafI': datakind = leaf.fIsUnsigned ? kUInt : kInt; break;
127244127244 case 'TLeafL': datakind = leaf.fIsUnsigned ? kULong64 : kLong64; break;
127245+ case 'TLeafG': datakind = leaf.fIsUnsigned ? kULong : kLong; break;
127245127246 case 'TLeafC': datakind = kTString; break;
127246127247 default: return null;
127247127248 }
@@ -177671,13 +177672,9 @@ class RNTupleDescriptorBuilder {
177671177672 return;
177672177673
177673177674 const reader = new RBufferReader(header_blob),
177674-
177675177675 payloadStart = reader.offset,
177676177676 // Read the envelope metadata
177677- {
177678- envelopeLength
177679- } = this._readEnvelopeMetadata(reader),
177680-
177677+ { envelopeLength } = this._readEnvelopeMetadata(reader),
177681177678 // Seek to end of envelope to get checksum
177682177679 checksumPos = payloadStart + envelopeLength - 8,
177683177680 currentPos = reader.offset;
@@ -177708,7 +177705,6 @@ class RNTupleDescriptorBuilder {
177708177705 // Read the envelope metadata
177709177706 this._readEnvelopeMetadata(reader);
177710177707
177711-
177712177708 // Feature flag(32 bits)
177713177709 this._readFeatureFlags(reader);
177714177710 // Header checksum (64-bit xxhash3)
@@ -177730,7 +177726,6 @@ class RNTupleDescriptorBuilder {
177730177726
177731177727 _readEnvelopeMetadata(reader) {
177732177728 const typeAndLength = reader.readU64(),
177733-
177734177729 // Envelope metadata
177735177730 // The 16 bits are the envelope type ID, and the 48 bits are the envelope length
177736177731 envelopeType = Number(typeAndLength & 0xFFFFn),
@@ -177791,7 +177786,6 @@ class RNTupleDescriptorBuilder {
177791177786 parentFieldId = reader.readU32(),
177792177787 structRole = reader.readU16(),
177793177788 flags = reader.readU16(),
177794-
177795177789 fieldName = reader.readString(),
177796177790 typeName = reader.readString(),
177797177791 typeAlias = reader.readString(),
@@ -177809,7 +177803,6 @@ class RNTupleDescriptorBuilder {
177809177803 if (flags & kFlagHasTypeChecksum)
177810177804 checksum = reader.readU32();
177811177805
177812-
177813177806 fieldDescriptors.push({
177814177807 fieldVersion,
177815177808 typeVersion,
@@ -177915,7 +177908,6 @@ class RNTupleDescriptorBuilder {
177915177908 throw new Error('Extra type info frame is not a list frame, which is required.');
177916177909
177917177910 const entryCount = reader.readU32(),
177918-
177919177911 extraTypeInfo = [];
177920177912 for (let i = 0; i < entryCount; ++i) {
177921177913 const recordStart = BigInt(reader.offset),
@@ -177963,10 +177955,7 @@ class RNTupleDescriptorBuilder {
177963177955 throw new Error('Non-standard locators (T=1) not supported yet');
177964177956 const size = sizeAndType,
177965177957 offset = reader.readU64(); // 8 bytes: offset
177966- return {
177967- size,
177968- offset
177969- };
177958+ return { size, offset };
177970177959 }
177971177960
177972177961 deserializePageList(page_list_blob) {
@@ -178101,15 +178090,15 @@ class RNTupleDescriptorBuilder {
178101178090async function readHeaderFooter(tuple) {
178102178091 // if already read - return immediately, make possible to call several times
178103178092 if (tuple?.builder)
178104- return true ;
178093+ return tuple.builder ;
178105178094
178106- if (!tuple.$file)
178107- return false ;
178095+ if (!tuple? .$file)
178096+ return null ;
178108178097
178109178098 // request header and footer buffers from the file
178110178099 return tuple.$file.readBuffer([tuple.fSeekHeader, tuple.fNBytesHeader, tuple.fSeekFooter, tuple.fNBytesFooter]).then(blobs => {
178111178100 if (blobs?.length !== 2)
178112- return false ;
178101+ throw new Error('Failure reading header or footer blobs') ;
178113178102
178114178103 // Handle both compressed and uncompressed cases
178115178104 const processBlob = (blob, uncompressedSize) => {
@@ -178122,47 +178111,47 @@ async function readHeaderFooter(tuple) {
178122178111 return Promise.all([
178123178112 processBlob(blobs[0], tuple.fLenHeader),
178124178113 processBlob(blobs[1], tuple.fLenFooter)
178125- ]).then(unzip_blobs => {
178126- const [header_blob, footer_blob] = unzip_blobs;
178127- if (! header_blob || ! footer_blob)
178128- return false;
178129-
178130- tuple.builder = new RNTupleDescriptorBuilder;
178131- tuple.builder.deserializeHeader(header_blob) ;
178132- tuple.builder.deserializeFooter(footer_blob );
178133-
178134- // Deserialize Page List
178135- const group = tuple.builder.clusterGroups?.[0];
178136- if (! group || !group.pageListLocator)
178137- throw new Error('No valid cluster group or page list locator found');
178138-
178139- const offset = Number(group.pageListLocator.offset),
178140- size = Number(group.pageListLocator.size ),
178141- uncompressedSize = Number(group.pageListLength );
178142-
178143- return tuple.$file.readBuffer([offset, size]).then(page_list_blob => {
178144- if (!( page_list_blob instanceof DataView))
178145- throw new Error(`Expected DataView from readBuffer, got ${Object.prototype.toString.call (page_list_blob)}`);
178146-
178147- // Check if page list data is uncompressed
178148- if (page_list_blob.byteLength === uncompressedSize) {
178149- // Data is uncompressed, use directly
178150- tuple.builder.deserializePageList(page_list_blob);
178151- return true;
178152- }
178153- // Attempt to decompress the page list
178154- return R__unzip(page_list_blob, uncompressedSize).then(unzipped_blob => {
178155- if (!(unzipped_blob instanceof DataView))
178156- throw new Error(`Unzipped page list is not a DataView, got ${Object.prototype.toString.call(unzipped_blob)}` );
178157-
178158- tuple.builder.deserializePageList( unzipped_blob);
178159- return true ;
178160- });
178161- } );
178162- }) ;
178114+ ]);
178115+ }).then(unzip_blobs => {
178116+ const [ header_blob, footer_blob] = unzip_blobs;
178117+ if (!header_blob || !footer_blob)
178118+ throw new Error('Failure when uncompress header and footer blobs');
178119+
178120+ tuple.builder = new RNTupleDescriptorBuilder ;
178121+ tuple.builder.deserializeHeader(header_blob );
178122+ tuple.builder.deserializeFooter(footer_blob);
178123+
178124+ // Deserialize Page List
178125+ const group = tuple.builder.clusterGroups?.[0];
178126+ if (! group || !group.pageListLocator)
178127+ throw new Error('No valid cluster group or page list locator found');
178128+
178129+ const offset = Number(group.pageListLocator.offset ),
178130+ size = Number(group.pageListLocator.size );
178131+
178132+ return tuple.$file.readBuffer([offset, size]);
178133+ }).then( page_list_blob => {
178134+ if (! (page_list_blob instanceof DataView))
178135+ throw new Error(`Expected DataView from readBuffer, got ${Object.prototype.toString.call(page_list_blob)}`);
178136+
178137+ const group = tuple.builder.clusterGroups?.[0],
178138+ uncompressedSize = Number(group.pageListLength);
178139+
178140+ // Check if page list data is uncompressed
178141+ if (page_list_blob.byteLength === uncompressedSize)
178142+ return page_list_blob;
178143+
178144+ // Attempt to decompress the page list
178145+ return R__unzip(page_list_blob, uncompressedSize );
178146+ }).then(unzipped_blob => {
178147+ if (!( unzipped_blob instanceof DataView))
178148+ throw new Error(`Unzipped page list is not a DataView, got ${Object.prototype.toString.call(unzipped_blob)}`) ;
178149+
178150+ tuple.builder.deserializePageList(unzipped_blob );
178151+ return tuple.builder ;
178163178152 }).catch(err => {
178164178153 console.error('Error during readHeaderFooter execution:', err);
178165- throw err ;
178154+ return null ;
178166178155 });
178167178156}
178168178157
@@ -178210,6 +178199,8 @@ class ReaderItem {
178210178199 }
178211178200 }
178212178201
178202+ reset_extras() {}
178203+
178213178204 shift_o(sz) {
178214178205 this.o += sz;
178215178206 while ((this.o >= this.view_len) && this.view_len) {
@@ -178451,6 +178442,10 @@ class StringReaderItem extends ReaderItem {
178451178442 this.off0 = 0;
178452178443 }
178453178444
178445+ reset_extras() {
178446+ this.off0 = 0;
178447+ }
178448+
178454178449 func(tgtobj) {
178455178450 const tmp = {};
178456178451 this.items[0].func(tmp);
@@ -178510,6 +178505,10 @@ class CollectionReaderItem extends ReaderItem {
178510178505 items[1].set_not_simple();
178511178506 }
178512178507
178508+ reset_extras() {
178509+ this.off0 = 0;
178510+ }
178511+
178513178512 func(tgtobj) {
178514178513 const arr = [], tmp = {};
178515178514 this.items[0].func(tmp);
@@ -178611,20 +178610,27 @@ async function rntupleProcess(rntuple, selector, args = {}) {
178611178610 };
178612178611
178613178612 function readNextPortion(inc_cluster) {
178614- if (inc_cluster) {
178615- handle.current_cluster++;
178616- handle.current_cluster_first_entry = handle.current_cluster_last_entry;
178617- }
178613+ let do_again = true, numClusterEntries, locations;
178618178614
178619- const locations = rntuple.builder.pageLocations[handle.current_cluster];
178620- if (!locations) {
178621- selector.Terminate(true);
178622- return selector;
178623- }
178615+ while (do_again) {
178616+ if (inc_cluster) {
178617+ handle.current_cluster++;
178618+ handle.current_cluster_first_entry = handle.current_cluster_last_entry;
178619+ }
178620+
178621+ locations = rntuple.builder.pageLocations[handle.current_cluster];
178622+ if (!locations) {
178623+ selector.Terminate(true);
178624+ return selector;
178625+ }
178624178626
178625- const numClusterEntries = rntuple.builder.clusterSummaries[handle.current_cluster].numEntries;
178627+ numClusterEntries = rntuple.builder.clusterSummaries[handle.current_cluster].numEntries;
178626178628
178627- handle.current_cluster_last_entry = handle.current_cluster_first_entry + numClusterEntries;
178629+ handle.current_cluster_last_entry = handle.current_cluster_first_entry + numClusterEntries;
178630+
178631+ do_again = inc_cluster && handle.process_entries &&
178632+ (handle.process_entries[handle.process_entries_indx] >= handle.current_cluster_last_entry);
178633+ }
178628178634
178629178635 // calculate entries which can be extracted from the cluster
178630178636 let emin, emax;
@@ -178651,8 +178657,9 @@ async function rntupleProcess(rntuple, selector, args = {}) {
178651178657 }).then(unzipBlobs => {
178652178658 unzipBlobs.map((rawblob, idx) => itemsToRead[idx].reconstructBlob(rawblob, pagesToRead[idx]));
178653178659
178654- for (let indx = 0; indx < handle.columns.length; ++indx)
178655- handle.columns[indx].init_o();
178660+ // reset reading pointer after all buffers are there
178661+ handle.columns.forEach(item => item.init_o());
178662+ handle.arr.forEach(item => item.reset_extras());
178656178663
178657178664 let skip_entries = handle.current_entry - handle.current_cluster_first_entry;
178658178665
0 commit comments