1- import { BucketDataSource , BucketParameterLookupSource , BucketParameterQuerierSource } from './BucketSource.js' ;
1+ import {
2+ BucketDataSource ,
3+ BucketParameterLookupSource ,
4+ BucketParameterQuerierSource ,
5+ BucketParameterQuerierSourceDefinition ,
6+ HydratedBucketSource
7+ } from './BucketSource.js' ;
28import {
39 BucketParameterQuerier ,
410 CompatibilityContext ,
@@ -25,14 +31,15 @@ import { EvaluatedParametersResult, EvaluateRowOptions, EvaluationResult, Sqlite
2531 * specifically affects bucket names.
2632 */
2733export class HydratedSyncRules {
34+ bucketSources : HydratedBucketSource [ ] = [ ] ;
2835 bucketDataSources : BucketDataSource [ ] ;
2936 bucketParameterQuerierSources : BucketParameterQuerierSource [ ] ;
3037 bucketParameterLookupSources : BucketParameterLookupSource [ ] ;
3138
3239 eventDescriptors : SqlEventDescriptor [ ] = [ ] ;
3340 compatibility : CompatibilityContext = CompatibilityContext . FULL_BACKWARDS_COMPATIBILITY ;
3441
35- private definition : SqlSyncRules ;
42+ readonly definition : SqlSyncRules ;
3643
3744 constructor ( params : {
3845 definition : SqlSyncRules ;
@@ -46,12 +53,29 @@ export class HydratedSyncRules {
4653 this . bucketParameterQuerierSources = params . bucketParameterQuerierSources ;
4754 this . bucketParameterLookupSources = params . bucketParameterLookupSources ;
4855 this . definition = params . definition ;
56+
4957 if ( params . eventDescriptors ) {
5058 this . eventDescriptors = params . eventDescriptors ;
5159 }
5260 if ( params . compatibility ) {
5361 this . compatibility = params . compatibility ;
5462 }
63+
64+ let querierMap = new Map < BucketParameterQuerierSourceDefinition , HydratedBucketSource > ( ) ;
65+ for ( let definition of this . definition . bucketSources ) {
66+ const hydratedBucketSource : HydratedBucketSource = { definition : definition , parameterQuerierSources : [ ] } ;
67+ this . bucketSources . push ( hydratedBucketSource ) ;
68+ for ( let querier of definition . parameterQuerierSources ) {
69+ querierMap . set ( querier , hydratedBucketSource ) ;
70+ }
71+ }
72+ for ( let querier of params . bucketParameterQuerierSources ) {
73+ const bucketSource = querierMap . get ( querier . definition ) ;
74+ if ( bucketSource == null ) {
75+ throw new Error ( 'Cannot find BucketSource for BucketParameterQuerierSource' ) ;
76+ }
77+ bucketSource . parameterQuerierSources . push ( querier ) ;
78+ }
5579 }
5680
5781 // These methods do not depend on hydration, so we can just forward them to the definition.
@@ -131,12 +155,14 @@ export class HydratedSyncRules {
131155 const errors : QuerierError [ ] = [ ] ;
132156 const pending = { queriers, errors } ;
133157
134- for ( const source of this . bucketParameterQuerierSources ) {
158+ for ( const source of this . bucketSources ) {
135159 if (
136160 ( source . definition . subscribedToByDefault && options . hasDefaultStreams ) ||
137161 source . definition . name in options . streams
138162 ) {
139- source . pushBucketParameterQueriers ( pending , options ) ;
163+ for ( let querier of source . parameterQuerierSources ) {
164+ querier . pushBucketParameterQueriers ( pending , options ) ;
165+ }
140166 }
141167 }
142168
0 commit comments