@@ -2217,6 +2217,52 @@ describe('Metadata', () => {
22172217 value : [ 'r1' ] ,
22182218 } ;
22192219
2220+ it ( "looks up every Map column's dictionary block size at once" , async ( ) => {
2221+ setupDefaultLogsSchema ( ) ;
2222+ const kvIndex = ( mapColumn : string , indexName : string ) => ( {
2223+ kv : {
2224+ columnName : mapColumn ,
2225+ mapColumn,
2226+ indexName,
2227+ separator : '=' ,
2228+ useHasAny : false ,
2229+ } ,
2230+ } ) ;
2231+ jest . spyOn ( metadata , 'getMapColumnTextIndexes' ) . mockResolvedValue (
2232+ new Map ( [
2233+ [ 'LogAttributes' , kvIndex ( 'LogAttributes' , 'idx_log_attr_items' ) ] ,
2234+ [
2235+ 'ResourceAttributes' ,
2236+ kvIndex ( 'ResourceAttributes' , 'idx_res_attr_items' ) ,
2237+ ] ,
2238+ ] ) ,
2239+ ) ;
2240+ let releaseSettings : ( ) => void = ( ) => { } ;
2241+ const settings = jest
2242+ . spyOn ( metadata , 'getMergeTreeSettings' )
2243+ . mockReturnValue (
2244+ new Promise ( resolve => {
2245+ releaseSettings = ( ) => resolve ( undefined ) ;
2246+ } ) ,
2247+ ) ;
2248+
2249+ const result = metadata . getAllKeyValues ( {
2250+ ...baseArgs ,
2251+ keyExpressions : [
2252+ "LogAttributes['requestId']" ,
2253+ "ResourceAttributes['service.name']" ,
2254+ ] ,
2255+ } ) ;
2256+ // Both lookups start before either finishes.
2257+ for ( let i = 0 ; i < 50 && settings . mock . calls . length < 2 ; i ++ ) {
2258+ await new Promise ( resolve => setImmediate ( resolve ) ) ;
2259+ }
2260+ expect ( settings ) . toHaveBeenCalledTimes ( 2 ) ;
2261+
2262+ releaseSettings ( ) ;
2263+ await result ;
2264+ } ) ;
2265+
22202266 it ( 'yields each query as it finishes, without waiting for the slowest' , async ( ) => {
22212267 setupDefaultLogsSchema ( ) ;
22222268 let releaseMapTextIndex : ( ) => void = ( ) => { } ;
0 commit comments