cleanup
authorBen Pfaff <blp@cs.stanford.edu>
Sat, 3 Jan 2026 19:33:35 +0000 (11:33 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Sat, 3 Jan 2026 19:33:35 +0000 (11:33 -0800)
rust/pspp/src/cli/show_spv.rs
rust/pspp/src/spv/read/legacy_bin.rs
rust/pspp/src/spv/read/legacy_xml.rs

index 8f8b0bfa3a922823b76b5578ac03e6bacacc7a19..a62c18e7a62e685dc1f2e6bccc127540d60bd874 100644 (file)
@@ -24,7 +24,7 @@ use pspp::{
     },
     spv::{
         SpvArchive,
-        legacy_bin::LegacyBin,
+        legacy_bin::{DataValue, LegacyBin},
         read::{ReadSeek, legacy_xml::Visualization, structure::OutlineItem},
     },
 };
@@ -203,9 +203,15 @@ impl ShowSpv {
                         data.values().flat_map(|map| map.iter()).enumerate()
                     {
                         for (value_index, data_value) in values.iter().enumerate() {
-                            let value = Value::new_datum(&data_value.value).with_value_label(
-                                (variable_name == "cellFormat")
-                                    .then(|| data_value.as_format(&formats).to_string()),
+                            let value = Value::new_datum(data_value).with_value_label(
+                                (variable_name == "cellFormat").then(|| {
+                                    DataValue {
+                                        value: data_value.clone(),
+                                        index: None,
+                                    }
+                                    .as_format(&formats)
+                                    .to_string()
+                                }),
                             );
                             pivot_table.insert([value_index, variable_index], value);
                         }
index acd43b751bd50eb7ec885cd7748964a02ccfb948..ed690c2499510f7ad38f39594a894f1872ffa79c 100644 (file)
@@ -78,11 +78,11 @@ pub struct LegacyBin {
 
 impl LegacyBin {
     /// Decodes legacy binary data into a map from a series name to a map of
-    /// variables, which in turn contains a vector of [DataValue]s.
+    /// variables, which in turn contains a vector of [Datum]s.
     pub fn decode(
         &self,
         warn: &mut dyn FnMut(LegacyBinWarning),
-    ) -> IndexMap<String, IndexMap<String, Vec<DataValue>>> {
+    ) -> IndexMap<String, IndexMap<String, Vec<Datum<String>>>> {
         let mut sources = IndexMap::new();
         for (metadata, data) in self.metadata.iter().zip(&self.data) {
             let mut variables = IndexMap::new();
@@ -92,10 +92,7 @@ impl LegacyBin {
                     variable
                         .values
                         .iter()
-                        .map(|value| DataValue {
-                            index: None,
-                            value: Datum::Number((*value != f64::MIN).then_some(*value)),
-                        })
+                        .map(|value| Datum::Number((*value != f64::MIN).then_some(*value)))
                         .collect::<Vec<_>>(),
                 );
             }
@@ -136,7 +133,7 @@ impl LegacyBin {
                             });
                             continue;
                         };
-                        value.value = Datum::String(label.label.clone());
+                        *value = Datum::String(label.label.clone());
                     }
                 }
             }
index 707d39fa0876fe9c6e02cd7aea358a390426a43a..93202ca2c510a4f046baeaee700a57008c15e85f 100644 (file)
@@ -111,7 +111,6 @@ impl Map {
             if let Datum::Number(Some(number)) = value.value
                 && let Some(to) = self.0.get(&OrderedFloat(number))
             {
-                value.index = Some(number);
                 value.value = to.clone();
             }
         }
@@ -209,7 +208,7 @@ impl Visualization {
     }
     pub fn decode_series(
         &self,
-        data: IndexMap<String, IndexMap<String, Vec<DataValue>>>,
+        data: IndexMap<String, IndexMap<String, Vec<Datum<String>>>>,
         warn: &mut dyn FnMut(LegacyXmlWarning),
     ) -> BTreeMap<&str, Series> {
         let mut source_variables = Vec::new();
@@ -626,7 +625,7 @@ impl Visualization {
 
     pub fn decode(
         &self,
-        binary_data: IndexMap<String, IndexMap<String, Vec<DataValue>>>,
+        binary_data: IndexMap<String, IndexMap<String, Vec<Datum<String>>>>,
         look: Look,
         warn: &mut dyn FnMut(LegacyXmlWarning),
     ) -> Result<PivotTable, super::Error> {
@@ -831,7 +830,7 @@ impl SourceVariable {
     }
     fn decode<'a>(
         &'a self,
-        data: &IndexMap<String, IndexMap<String, Vec<DataValue>>>,
+        data: &IndexMap<String, IndexMap<String, Vec<Datum<String>>>>,
         series: &mut BTreeMap<&'a str, Series>,
     ) -> bool {
         let label_series = if let Some(label_variable) = &self.label_variable {
@@ -847,7 +846,13 @@ impl SourceVariable {
         let mut data = if let Some(source) = data.get(&self.source)
             && let Some(values) = source.get(&self.variable)
         {
-            values.clone()
+            values
+                .iter()
+                .map(|value| DataValue {
+                    index: value.as_number().flatten(),
+                    value: value.clone(),
+                })
+                .collect()
         } else {
             Vec::new()
         };
@@ -942,6 +947,11 @@ impl DerivedVariable {
             });
             vec![]
         };
+        for datum in &mut values {
+            if let Datum::Number(Some(number)) = &datum.value {
+                datum.index = Some(*number);
+            }
+        }
         Map::from_vmes(&self.value_map).apply(&mut values);
         if let Some(format) = &self.format {
             Map::from_format(format).apply(&mut values);