work
[pspp] / src / data / dataset.c
index c13a941ba8a169ac83c79e3f57038ddaf8c1ed9f..931d3dcbbfb1ac1a23066719d68d4bf76f69ebff 100644 (file)
@@ -1026,15 +1026,14 @@ add_measurement_level_trns_proc__ (struct measurement_level_var *mlv, double val
   return MEASURE_UNKNOWN;
 }
 
-static enum trns_result
-add_measurement_level_trns_proc (void *mlt_, struct ccase **c,
-                                 casenumber case_nr UNUSED)
+static void
+measurement_level_trns_run (struct measurement_level_trns *mlt,
+                            const struct ccase *c)
 {
-  struct measurement_level_trns *mlt = mlt_;
   for (size_t i = 0; i < mlt->n_vars; )
     {
       struct measurement_level_var *mlv = &mlt->vars[i];
-      double value = case_num (*c, mlv->var);
+      double value = case_num (c, mlv->var);
       enum measure m = add_measurement_level_trns_proc__ (mlv, value);
       if (m != MEASURE_UNKNOWN)
         {
@@ -1046,6 +1045,14 @@ add_measurement_level_trns_proc (void *mlt_, struct ccase **c,
       else
         i++;
     }
+}
+
+static enum trns_result
+add_measurement_level_trns_proc (void *mlt_, struct ccase **c,
+                                 casenumber case_nr UNUSED)
+{
+  struct measurement_level_trns *mlt = mlt_;
+  measurement_level_trns_run (mlt, *c);
   return TRNS_CONTINUE;
 }
 
@@ -1062,15 +1069,21 @@ add_measurement_level_trns_free__ (struct measurement_level_trns *mlt)
   free (mlt);
 }
 
-static bool
-add_measurement_level_trns_free (void *mlt_)
+static void
+measurement_level_trns_commit (struct measurement_level_trns *mlt)
 {
-  struct measurement_level_trns *mlt = mlt_;
   for (size_t i = 0; i < mlt->n_vars; i++)
     {
       struct measurement_level_var *mlv = &mlt->vars[i];
       var_set_measure (mlv->var, add_measurement_level_var_interpret (mlv));
     }
+}
+
+static bool
+add_measurement_level_trns_free (void *mlt_)
+{
+  struct measurement_level_trns *mlt = mlt_;
+  measurement_level_trns_commit (mlt);
   add_measurement_level_trns_free__ (mlt);
   return true;
 }
@@ -1081,8 +1094,8 @@ static const struct trns_class add_measurement_level_trns_class = {
   .destroy = add_measurement_level_trns_free,
 };
 
-static void
-add_measurement_level_trns (struct dataset *ds, struct dictionary *dict)
+static struct measurement_level_trns *
+create_measurement_level_trns (struct dictionary *dict)
 {
   struct measurement_level_var *mlvs = NULL;
   size_t n_mlvs = 0;
@@ -1113,14 +1126,22 @@ add_measurement_level_trns (struct dataset *ds, struct dictionary *dict)
       hmap_init (mlv->values);
     }
   if (!n_mlvs)
-    return;
+    return NULL;
 
   struct measurement_level_trns *mlt = xmalloc (sizeof *mlt);
   *mlt = (struct measurement_level_trns) {
     .vars = mlvs,
     .n_vars = n_mlvs,
   };
-  add_transformation (ds, &add_measurement_level_trns_class, mlt);
+  return mlt;
+}
+
+static void
+add_measurement_level_trns (struct dataset *ds, struct dictionary *dict)
+{
+  struct measurement_level_trns *mlt = create_measurement_level_trns (dict);
+  if (mlt)
+    add_transformation (ds, &add_measurement_level_trns_class, mlt);
 }
 
 static void
@@ -1137,6 +1158,40 @@ cancel_measurement_level_trns (struct trns_chain *chain)
   add_measurement_level_trns_free__ (mlt);
   chain->n--;
 }
+
+bool
+measure_guesser_is_needed (struct dataset *ds)
+{
+  struct measurement_level_trns *mlt
+    = create_measurement_level_trns (dataset_dict (ds));
+  if (mlt)
+    {
+      add_measurement_level_trns_free__ (mlt);
+      return true;
+    }
+  return false;
+}
+
+void
+measure_guesser_run (struct dataset *ds, const struct casereader *reader)
+{
+  struct measurement_level_trns *mlt
+    = create_measurement_level_trns (dataset_dict (ds));
+  if (!mlt)
+    return;
+
+  struct casereader *r = casereader_clone (reader);
+  while (mlt->n_vars > 0)
+    {
+      struct ccase *c = casereader_read (r);
+      measurement_level_trns_run (mlt, c);
+      case_unref (c);
+    }
+  casereader_destroy (r);
+
+  measurement_level_trns_commit (mlt);
+  add_measurement_level_trns_free__ (mlt);
+}
 \f
 static void
 dataset_changed__ (struct dataset *ds)