work on DELETE VARS
authorBen Pfaff <blp@cs.stanford.edu>
Mon, 20 Feb 2023 22:56:34 +0000 (14:56 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Mon, 20 Feb 2023 22:56:34 +0000 (14:56 -0800)
src/data/case-map.c
src/data/case-map.h
src/data/dataset.c
src/data/dataset.h

index 87174f1fb3a4e37eb90064b5ab3f78f81aa9d894..5d2a347472df7e185461dbe372f77aefb63682f2 100644 (file)
@@ -72,6 +72,22 @@ insert_mapping (struct case_map *map, size_t from, size_t to)
   map->map[to] = from;
 }
 
+/* Returns a copy of OLD, if OLD is nonnull, and otherwise returns NULL.  */
+struct case_map *
+case_map_clone (const struct case_map *old)
+{
+  if (!old)
+    return NULL;
+
+  size_t n_values = caseproto_get_n_widths (old->proto);
+  struct case_map *new = xmalloc (sizeof *new);
+  *new = (struct case_map) {
+    .proto = caseproto_ref (old->proto),
+    .map = xmemdup (old->proto, n_values * sizeof *new->map),
+  };
+  return new;
+}
+
 /* Destroys case map MAP. */
 void
 case_map_destroy (struct case_map *map)
index 0e9970a873c13bc8e1fb5bbb60618838b61896a5..13e2ef190f4a0f79716bf3d3d40a4da99f8b05e8 100644 (file)
@@ -32,7 +32,7 @@ struct casewriter;
 struct ccase;
 struct dictionary;
 
-struct case_map *case_map_create (void);
+struct case_map *case_map_clone (const struct case_map *);
 void case_map_destroy (struct case_map *);
 struct ccase *case_map_execute (const struct case_map *, struct ccase *);
 
index aa196f2850d84b5df9bf776302a0db62221bc837..ded7c7ab02196e9d6193440b3c13bc0635d93ea0 100644 (file)
@@ -347,6 +347,19 @@ dataset_steal_source (struct dataset *ds)
   return reader;
 }
 
+bool
+dataset_delete_vars (struct dataset *ds, struct variable **vars, size_t n)
+{
+  dict_delete_vars (ds->dict, vars, n);
+
+  if (ds->source)
+    {
+      struct case_map *map = case_map_to_compact_dict (ds->d, 0);
+      ds->source = case_map_create_input_translator (map, ds->source);
+    }
+  dict_compact_values (ds->dict);
+}
+
 /* Returns a number unique to DS.  It can be used to distinguish one dataset
    from any other within a given program run, even datasets that do not exist
    at the same time. */
index dfa444356e816ada4aaeef6c52851d5e4b499003..87fe1c38318c56747013eb96cbb602525f40ff5b 100644 (file)
@@ -48,6 +48,8 @@ bool dataset_has_source (const struct dataset *ds);
 bool dataset_set_source (struct dataset *, struct casereader *);
 struct casereader *dataset_steal_source (struct dataset *);
 
+bool dataset_delete_vars (struct dataset *, struct variable **, size_t n);
+
 unsigned int dataset_seqno (const struct dataset *);
 
 struct dataset_callbacks