@@ -91,118 +91,25 @@ func LoadDatasetRefs(ctx context.Context, fs qfs.Filesystem, path string) (*data
9191// DerefDataset attempts to fully dereference a dataset
9292func DerefDataset (ctx context.Context , store qfs.Filesystem , ds * dataset.Dataset ) error {
9393 log .Debugf ("DerefDataset path=%q" , ds .Path )
94- if err := DerefDatasetMeta (ctx , store , ds ); err != nil {
94+ if err := DerefMeta (ctx , store , ds ); err != nil {
9595 return err
9696 }
97- if err := DerefDatasetStructure (ctx , store , ds ); err != nil {
97+ if err := DerefStructure (ctx , store , ds ); err != nil {
9898 return err
9999 }
100- if err := DerefDatasetTransform (ctx , store , ds ); err != nil {
100+ if err := DerefTransform (ctx , store , ds ); err != nil {
101101 return err
102102 }
103- if err := DerefDatasetViz (ctx , store , ds ); err != nil {
103+ if err := DerefViz (ctx , store , ds ); err != nil {
104104 return err
105105 }
106- if err := DerefDatasetReadme (ctx , store , ds ); err != nil {
106+ if err := DerefReadme (ctx , store , ds ); err != nil {
107107 return err
108108 }
109- return DerefDatasetCommit (ctx , store , ds )
110- }
111-
112- // DerefDatasetStructure derferences a dataset's structure element if required
113- // should be a no-op if ds.Structure is nil or isn't a reference
114- func DerefDatasetStructure (ctx context.Context , store qfs.Filesystem , ds * dataset.Dataset ) error {
115- if ds .Structure != nil && ds .Structure .IsEmpty () && ds .Structure .Path != "" {
116- st , err := loadStructure (ctx , store , ds .Structure .Path )
117- if err != nil {
118- log .Debug (err .Error ())
119- return fmt .Errorf ("error loading dataset structure: %s" , err .Error ())
120- }
121- // assign path to retain internal reference to path
122- // st.Assign(dataset.NewStructureRef(ds.Structure.Path))
123- ds .Structure = st
124- }
125- return nil
126- }
127-
128- // DerefDatasetViz dereferences a dataset's Viz element if required
129- // should be a no-op if ds.Viz is nil or isn't a reference
130- func DerefDatasetViz (ctx context.Context , store qfs.Filesystem , ds * dataset.Dataset ) error {
131- if ds .Viz != nil && ds .Viz .IsEmpty () && ds .Viz .Path != "" {
132- vz , err := loadViz (ctx , store , ds .Viz .Path )
133- if err != nil {
134- log .Debug (err .Error ())
135- return fmt .Errorf ("error loading dataset viz: %s" , err .Error ())
136- }
137- // assign path to retain internal reference to path
138- // vz.Assign(dataset.NewVizRef(ds.Viz.Path))
139- ds .Viz = vz
140- }
141- return nil
142- }
143-
144- // DerefDatasetReadme dereferences a dataset's Readme element if required
145- // should be a no-op if ds.Readme is nil or isn't a reference
146- func DerefDatasetReadme (ctx context.Context , store qfs.Filesystem , ds * dataset.Dataset ) error {
147- if ds .Readme != nil && ds .Readme .IsEmpty () && ds .Readme .Path != "" {
148- rm , err := loadReadme (ctx , store , ds .Readme .Path )
149- if err != nil {
150- log .Debug (err .Error ())
151- return fmt .Errorf ("error loading dataset readme: %s" , err .Error ())
152- }
153- // assign path to retain internal reference to path
154- // rm.Assign(dataset.NewVizRef(ds.Readme.Path))
155- ds .Readme = rm
156- }
157- return nil
158- }
159-
160- // DerefDatasetTransform derferences a dataset's transform element if required
161- // should be a no-op if ds.Structure is nil or isn't a reference
162- func DerefDatasetTransform (ctx context.Context , store qfs.Filesystem , ds * dataset.Dataset ) error {
163- if ds .Transform != nil && ds .Transform .IsEmpty () && ds .Transform .Path != "" {
164- t , err := loadTransform (ctx , store , ds .Transform .Path )
165- if err != nil {
166- log .Debug (err .Error ())
167- return fmt .Errorf ("error loading dataset transform: %s" , err .Error ())
168- }
169- // assign path to retain internal reference to path
170- // t.Assign(dataset.NewTransformRef(ds.Transform.Path))
171- ds .Transform = t
172- }
173- return nil
174- }
175-
176- // DerefDatasetMeta derferences a dataset's transform element if required
177- // should be a no-op if ds.Structure is nil or isn't a reference
178- func DerefDatasetMeta (ctx context.Context , store qfs.Filesystem , ds * dataset.Dataset ) error {
179- if ds .Meta != nil && ds .Meta .IsEmpty () && ds .Meta .Path != "" {
180- md , err := loadMeta (ctx , store , ds .Meta .Path )
181- if err != nil {
182- log .Debug (err .Error ())
183- return fmt .Errorf ("error loading dataset metadata: %s" , err .Error ())
184- }
185- // assign path to retain internal reference to path
186- // md.Assign(dataset.NewMetaRef(ds.Meta.Path))
187- ds .Meta = md
188- }
189- return nil
190- }
191-
192- // DerefDatasetCommit derferences a dataset's Commit element if required
193- // should be a no-op if ds.Structure is nil or isn't a reference
194- func DerefDatasetCommit (ctx context.Context , store qfs.Filesystem , ds * dataset.Dataset ) error {
195- if ds .Commit != nil && ds .Commit .IsEmpty () && ds .Commit .Path != "" {
196- cm , err := loadCommit (ctx , store , ds .Commit .Path )
197- if err != nil {
198- log .Debug (err .Error ())
199- return fmt .Errorf ("error loading dataset commit: %s" , err .Error ())
200- }
201- // assign path to retain internal reference to path
202- cm .Assign (dataset .NewCommitRef (ds .Commit .Path ))
203- ds .Commit = cm
109+ if err := DerefStats (ctx , store , ds ); err != nil {
110+ return err
204111 }
205- return nil
112+ return DerefCommit ( ctx , store , ds )
206113}
207114
208115// SaveSwitches represents options for saving a dataset
@@ -349,6 +256,21 @@ func buildFileGraph(fs qfs.Filesystem, ds *dataset.Dataset, privKey crypto.PrivK
349256 files = append (files , stf )
350257 }
351258
259+ // stats relies on a structure component & a body file
260+ if statsCompFile , ok := bdf .(statsComponentFile ); ok {
261+ hook := func (ctx context.Context , f qfs.File , added map [string ]string ) (io.Reader , error ) {
262+ sa , err := statsCompFile .StatsComponent ()
263+ if err != nil {
264+ return nil , err
265+ }
266+ ds .Stats = sa
267+ return JSONFile (f .FullPath (), sa )
268+ }
269+
270+ hookFile := qfs .NewWriteHookFile (qfs .NewMemfileBytes (PackageFileStats .Filename (), []byte {}), hook , PackageFileStructure .Filename ())
271+ files = append (files , hookFile )
272+ }
273+
352274 if ds .Meta != nil {
353275 ds .Meta .DropTransientValues ()
354276 mdf , err := JSONFile (PackageFileMeta .Filename (), ds .Meta )
@@ -454,6 +376,8 @@ func buildFileGraph(fs qfs.Filesystem, ds *dataset.Dataset, privKey crypto.PrivK
454376 ds .Viz = dataset .NewVizRef (pathMap [comp ])
455377 case PackageFileMeta .Filename ():
456378 ds .Meta = dataset .NewMetaRef (pathMap [comp ])
379+ case PackageFileStats .Filename ():
380+ ds .Stats = dataset .NewStatsRef (pathMap [comp ])
457381 case bdf .FullPath ():
458382 ds .BodyPath = pathMap [comp ]
459383 }
0 commit comments