case-map: Make creating a case_map destroy the stage.
authorBen Pfaff <blp@cs.stanford.edu>
Sun, 5 Mar 2023 19:14:45 +0000 (11:14 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Sun, 5 Mar 2023 19:26:29 +0000 (11:26 -0800)
This fit the usage model in every case in practice.

src/data/case-map.c
src/data/case-map.h
src/data/dataset-writer.c
src/data/dataset.c
src/language/commands/get.c
src/language/commands/save-translate.c
src/language/commands/save.c
utilities/pspp-convert.c

index 29def1f044de1575e4c72befcf16d082b1002d55..e6f266bcd5c1465267531811fb90e10bd73c7c96 100644 (file)
@@ -198,7 +198,7 @@ struct case_map_stage
 
 /* Prepares and returns a "struct case_map_stage" for producing a case map for
    DICT.  Afterward, the caller may delete, reorder, or rename variables within
-   DICT at will before using case_map_stage_get_case_map() to produce the case
+   DICT at will before using case_map_stage_to_case_map() to produce the case
    map.
 
    The caller must *not* add new variables to DICT. */
@@ -260,13 +260,7 @@ case_map_stage_find_var (const struct case_map_stage *stage,
   NOT_REACHED ();
 }
 
-/* Produces a case map from STAGE, which must have been previously created with
-   case_map_stage_create().  The case map maps from the original case index of
-   the variables in STAGE's dictionary to their current case indexes.
-
-   Returns the new case map, or a null pointer if no mapping is required (that
-   is, no variables were deleted or reordered). */
-struct case_map *
+static struct case_map *
 case_map_stage_get_case_map (const struct case_map_stage *stage)
 {
   size_t n_vars = dict_get_n_vars (stage->dict);
@@ -293,6 +287,22 @@ case_map_stage_get_case_map (const struct case_map_stage *stage)
   return map;
 }
 
+/* Produces a case map from STAGE, which must have been previously created with
+   case_map_stage_create().  The case map maps from the original case index of
+   the variables in STAGE's dictionary to their current case indexes.
+
+   Returns the new case map, or a null pointer if no mapping is required (that
+   is, no variables were deleted or reordered).
+
+   Destroys STAGE. */
+struct case_map *
+case_map_stage_to_case_map (struct case_map_stage *stage)
+{
+  struct case_map *map = case_map_stage_get_case_map (stage);
+  case_map_stage_destroy (stage);
+  return map;
+}
+
 /* Creates and returns a case map for mapping variables in OLD to
    variables in NEW based on their name.  For every variable in
    NEW, there must be a variable in OLD with the same name, type,
index a74921c38b87517ba697e44e8337cbc7b281b59c..9baa412c5ca5ceca0a829b4cc4b01e484f73c6ee 100644 (file)
@@ -46,7 +46,7 @@ struct casewriter *case_map_create_output_translator (struct case_map *,
    a modified version of the same dictionary. */
 struct case_map_stage *case_map_stage_create (const struct dictionary *);
 void case_map_stage_destroy (struct case_map_stage *);
-struct case_map *case_map_stage_get_case_map (const struct case_map_stage *);
+struct case_map *case_map_stage_to_case_map (struct case_map_stage *);
 
 /* For mapping cases for one dictionary to another based on
    variable names within the dictionary. */
index cfaa88ab5cb1913ff20842ac435f223bf6edac0e..8666bcada32851079c9f9d3000abf257fc934222 100644 (file)
@@ -42,7 +42,6 @@ struct dataset_writer
     struct dataset *ds;                 /* Underlying dataset. */
     struct fh_lock *lock;               /* Exclusive access to file handle. */
     struct dictionary *dict;            /* Dictionary for subwriter. */
-    struct case_map *compactor;         /* Compacts into dictionary. */
     struct casewriter *subwriter;       /* Data output. */
   };
 
@@ -75,9 +74,9 @@ dataset_writer_open (struct file_handle *fh,
   writer->dict = dict_clone (dictionary);
   struct case_map_stage *stage = case_map_stage_create (writer->dict);
   dict_delete_scratch_vars (writer->dict);
-  writer->compactor = case_map_stage_get_case_map (stage);
-  case_map_stage_destroy (stage);
-  writer->subwriter = autopaging_writer_create (dict_get_proto (writer->dict));
+  writer->subwriter = case_map_create_output_translator (
+    case_map_stage_to_case_map (stage),
+    autopaging_writer_create (dict_get_proto (writer->dict)));
 
   casewriter = casewriter_create (dict_get_proto (writer->dict),
                                   &dataset_writer_casewriter_class, writer);
@@ -92,8 +91,7 @@ dataset_writer_casewriter_write (struct casewriter *w UNUSED, void *writer_,
                                  struct ccase *c)
 {
   struct dataset_writer *writer = writer_;
-  casewriter_write (writer->subwriter,
-                    case_map_execute (writer->compactor, c));
+  casewriter_write (writer->subwriter, c);
 }
 
 /* Closes WRITER. */
index 0e88c2c18681d686e58a373cb67ef301b22f86fa..2af19bd756890c1490406d396d039c503abc7728 100644 (file)
@@ -360,8 +360,7 @@ dataset_delete_vars (struct dataset *ds, struct variable **vars, size_t n)
   struct case_map_stage *stage = case_map_stage_create (ds->dict);
   dict_delete_vars (ds->dict, vars, n);
   ds->source = case_map_create_input_translator (
-    case_map_stage_get_case_map (stage), ds->source);
-  case_map_stage_destroy (stage);
+    case_map_stage_to_case_map (stage), ds->source);
   caseinit_clear (ds->caseinit);
   caseinit_mark_as_preinited (ds->caseinit, ds->dict);
 }
@@ -382,8 +381,7 @@ dataset_reorder_vars (struct dataset *ds, struct variable **vars, size_t n)
   struct case_map_stage *stage = case_map_stage_create (ds->dict);
   dict_reorder_vars (ds->dict, vars, n);
   ds->source = case_map_create_input_translator (
-    case_map_stage_get_case_map (stage), ds->source);
-  case_map_stage_destroy (stage);
+    case_map_stage_to_case_map (stage), ds->source);
   caseinit_clear (ds->caseinit);
   caseinit_mark_as_preinited (ds->caseinit, ds->dict);
 }
@@ -496,9 +494,8 @@ proc_open_filtering (struct dataset *ds, bool filter)
       struct case_map_stage *stage = case_map_stage_create (pd);
       dict_delete_scratch_vars (pd);
       ds->sink = case_map_create_output_translator (
-        case_map_stage_get_case_map (stage),
+        case_map_stage_to_case_map (stage),
         autopaging_writer_create (dict_get_proto (pd)));
-      case_map_stage_destroy (stage);
       dict_unref (pd);
     }
   else
index ea6323ba40dc97356983f7e76e23e026bbaaf0e1..79d8dc40cd48e99cdb6818e5f6267ebf655b1d89 100644 (file)
@@ -143,8 +143,7 @@ parse_read_command (struct lexer *lexer, struct dataset *ds,
         goto error;
     }
 
-  map = case_map_stage_get_case_map (stage);
-  case_map_stage_destroy (stage);
+  map = case_map_stage_to_case_map (stage);
   if (map != NULL)
     reader = case_map_create_input_translator (map, reader);
 
index 600a2156bd403addc3bc36ffafced024a9cc7d0f..48b5d4507a9b22e8d27ff2ed12b4160a6307afac 100644 (file)
@@ -254,10 +254,8 @@ cmd_save_translate (struct lexer *lexer, struct dataset *ds)
     goto error;
   fh_unref (handle);
 
-  struct case_map *map = case_map_stage_get_case_map (stage);
-  case_map_stage_destroy (stage);
-  if (map != NULL)
-    writer = case_map_create_output_translator (map, writer);
+  writer = case_map_create_output_translator (
+    case_map_stage_to_case_map (stage), writer);
   dict_unref (dict);
 
   casereader_transfer (proc_open_filtering (ds, !retain_unselected), writer);
index d892c536eeefb7eb1fc4659a81491c3873639da1..8dbb6cd3d1be27ce0204fbdbb5481cb3a324ad51 100644 (file)
@@ -341,10 +341,8 @@ parse_write_command (struct lexer *lexer, struct dataset *ds,
         goto error;
     }
 
-  map = case_map_stage_get_case_map (stage);
-  case_map_stage_destroy (stage);
-  if (map != NULL)
-    writer = case_map_create_output_translator (map, writer);
+  writer = case_map_create_output_translator (
+    case_map_stage_to_case_map (stage), writer);
   dict_unref (dict);
 
   fh_unref (handle);
index 6599ba3fc80ce474903a12c7bea55ed4b2c6f323..0f77998044a06f185a30d2f11357a27d22e389df 100644 (file)
@@ -319,8 +319,7 @@ main (int argc, char *argv[])
     }
 
   reader = case_map_create_input_translator (
-    case_map_stage_get_case_map (stage), reader);
-  case_map_stage_destroy (stage);
+    case_map_stage_to_case_map (stage), reader);
 
   if (!strcmp (output_format, "csv") || !strcmp (output_format, "txt"))
     {