work
authorBen Pfaff <blp@cs.stanford.edu>
Fri, 29 Jul 2022 23:15:42 +0000 (16:15 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Fri, 29 Jul 2022 23:15:42 +0000 (16:15 -0700)
src/data/dataset.c
src/data/dataset.h
src/language/stats/ctables.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);
 }
index eaea34f91a3c5877e5cac8a3aae4f18518e1280b..dfa444356e816ada4aaeef6c52851d5e4b499003 100644 (file)
@@ -105,8 +105,9 @@ bool proc_commit (struct dataset *);
 
 bool dataset_end_of_command (struct dataset *);
 \f
-bool measure_guesser_is_needed (struct dataset *);
-void measure_guesser_run (struct dataset *, const struct casereader *);
+struct measure_guesser *measure_guesser_create (struct dataset *);
+void measure_guesser_run (struct measure_guesser *, const struct casereader *);
+void measure_guesser_destroy (struct measure_guesser *);
 \f
 const struct ccase *lagged_case (const struct dataset *ds, int n_before);
 void dataset_need_lag (struct dataset *ds, int n_before);
index b2bf14b39992e4f24a02aa55dd29d4af1002218a..69c505c48624ec5ad096b09c67a1ed88a53ceb71 100644 (file)
@@ -6021,14 +6021,15 @@ put_title_text (struct string *out, struct substring in, time_t now,
 int
 cmd_ctables (struct lexer *lexer, struct dataset *ds)
 {
-  struct casereader *input;
-  if (measure_guesser_is_needed (ds))
+  struct casereader *input = NULL;
+
+  struct measure_guesser *mg = measure_guesser_create (ds);
+  if (mg)
     {
       input = proc_open (ds);
-      measure_guesser_run (ds, input);
+      measure_guesser_run (mg, input);
+      measure_guesser_destroy (mg);
     }
-  else
-    input = NULL;
 
   size_t n_vars = dict_get_n_vars (dataset_dict (ds));
   enum ctables_vlabel *vlabels = xnmalloc (n_vars, sizeof *vlabels);