@@ -169,15 +169,42 @@ impl Molecule {
169169 }
170170 }
171171
172- pub async fn get_projects_dataset ( ctx : & Context < ' _ > ) -> Result < domain:: ResolvedDataset > {
172+ pub async fn get_projects_dataset (
173+ ctx : & Context < ' _ > ,
174+ create_if_not_exist : bool ,
175+ ) -> Result < domain:: ResolvedDataset > {
173176 let dataset_reg = from_catalog_n ! ( ctx, dyn domain:: DatasetRegistry ) ;
174177
175- let projects_dataset = dataset_reg
178+ match dataset_reg
176179 . get_dataset_by_ref ( & "molecule/projects" . parse ( ) . unwrap ( ) )
177180 . await
178- . int_err ( ) ?;
179-
180- Ok ( projects_dataset)
181+ {
182+ Ok ( ds) => Ok ( ds) ,
183+ Err ( odf:: DatasetRefUnresolvedError :: NotFound ( _) ) if create_if_not_exist => {
184+ let create_dataset_use_case =
185+ from_catalog_n ! ( ctx, dyn kamu_datasets:: CreateDatasetFromSnapshotUseCase ) ;
186+
187+ let snapshot = Self :: dataset_snapshot_projects ( odf:: DatasetAlias :: new (
188+ None ,
189+ odf:: DatasetName :: new_unchecked ( "projects" ) ,
190+ ) ) ;
191+
192+ let create_res = create_dataset_use_case
193+ . execute (
194+ snapshot,
195+ kamu_datasets:: CreateDatasetUseCaseOptions {
196+ dataset_visibility : odf:: DatasetVisibility :: Private ,
197+ } ,
198+ )
199+ . await
200+ . int_err ( ) ?;
201+
202+ Ok ( dataset_reg
203+ . get_dataset_by_handle ( & create_res. dataset_handle )
204+ . await )
205+ }
206+ Err ( err) => Err ( err. int_err ( ) . into ( ) ) ,
207+ }
181208 }
182209}
183210
@@ -200,7 +227,7 @@ impl Molecule {
200227 let query_svc = from_catalog_n ! ( ctx, dyn domain:: QueryService ) ;
201228
202229 // Resolve projects dataset
203- let projects_dataset = Self :: get_projects_dataset ( ctx) . await ?;
230+ let projects_dataset = Self :: get_projects_dataset ( ctx, false ) . await ?;
204231
205232 // Query data
206233 let query_res = query_svc
@@ -251,7 +278,7 @@ impl Molecule {
251278 let query_svc = from_catalog_n ! ( ctx, dyn domain:: QueryService ) ;
252279
253280 // Resolve projects dataset
254- let projects_dataset = Self :: get_projects_dataset ( ctx) . await ?;
281+ let projects_dataset = Self :: get_projects_dataset ( ctx, false ) . await ?;
255282
256283 // Query data
257284 let query_res = query_svc
0 commit comments