work
[pspp] / src / data / dataset.c
index b5851a37bf97ba73d58b812a60d66b30989df809..2516fa3d1f8ebda27a892ce99d3dfba8e8e14a49 100644 (file)
@@ -1028,7 +1028,7 @@ struct measure_guesser
   };
 
 static struct measure_guesser *
-measure_guesser_create (struct dictionary *dict)
+measure_guesser_create__ (struct dictionary *dict)
 {
   struct mg_var *mgvs = NULL;
   size_t n_mgvs = 0;
@@ -1069,6 +1069,20 @@ measure_guesser_create (struct dictionary *dict)
   return mg;
 }
 
+/* Scans through DS's dictionary for variables that have an unknown measurement
+   level.  For those, if the measurement level can be guessed based on the
+   variable's type and format, sets a default.  If that's enough, returns NULL.
+   If any remain whose levels are unknown and can't be guessed that way,
+   creates and returns a structure that the caller should pass to
+   measure_guesser_add_case() or measure_guesser_run() for guessing a
+   measurement level based on the data.  */
+struct measure_guesser *
+measure_guesser_create (struct dataset *ds)
+{
+  return measure_guesser_create__ (dataset_dict (ds));
+}
+
+/* Adds data from case C to MG. */
 static void
 measure_guesser_add_case (struct measure_guesser *mg, const struct ccase *c)
 {
@@ -1089,7 +1103,8 @@ measure_guesser_add_case (struct measure_guesser *mg, const struct ccase *c)
     }
 }
 
-static void
+/* Destroys MG. */
+void
 measure_guesser_destroy (struct measure_guesser *mg)
 {
   if (!mg)
@@ -1105,6 +1120,8 @@ measure_guesser_destroy (struct measure_guesser *mg)
   free (mg);
 }
 
+/* Adds final measurement levels based on MG, after all the cases have been
+   added. */
 static void
 measure_guesser_commit (struct measure_guesser *mg)
 {
@@ -1115,25 +1132,12 @@ measure_guesser_commit (struct measure_guesser *mg)
     }
 }
 
-bool
-measure_guesser_is_needed (struct dataset *ds)
-{
-  struct measure_guesser *mg = measure_guesser_create (dataset_dict (ds));
-  if (mg)
-    {
-      measure_guesser_destroy (mg);
-      return true;
-    }
-  return false;
-}
-
+/* Passes the cases in READER through MG and uses the data in the cases to set
+   measurement levels for the variables where they were still unknown. */
 void
-measure_guesser_run (struct dataset *ds, const struct casereader *reader)
+measure_guesser_run (struct measure_guesser *mg,
+                     const struct casereader *reader)
 {
-  struct measure_guesser *mg = measure_guesser_create (dataset_dict (ds));
-  if (!mg)
-    return;
-
   struct casereader *r = casereader_clone (reader);
   while (mg->n_vars > 0)
     {
@@ -1144,7 +1148,6 @@ measure_guesser_run (struct dataset *ds, const struct casereader *reader)
   casereader_destroy (r);
 
   measure_guesser_commit (mg);
-  measure_guesser_destroy (mg);
 }
 \f
 static enum trns_result
@@ -1173,7 +1176,7 @@ static const struct trns_class mg_trns_class = {
 static void
 add_measurement_level_trns (struct dataset *ds, struct dictionary *dict)
 {
-  struct measure_guesser *mg = measure_guesser_create (dict);
+  struct measure_guesser *mg = measure_guesser_create__ (dict);
   if (mg)
     add_transformation (ds, &mg_trns_class, mg);
 }