From 0e15e68f9ec493ca0eb660ce891579932d070df9 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Mon, 20 Feb 2023 14:56:34 -0800 Subject: [PATCH] work on DELETE VARS --- src/data/case-map.c | 16 ++++++++++++++++ src/data/case-map.h | 2 +- src/data/dataset.c | 13 +++++++++++++ src/data/dataset.h | 2 ++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/data/case-map.c b/src/data/case-map.c index 87174f1fb3..5d2a347472 100644 --- a/src/data/case-map.c +++ b/src/data/case-map.c @@ -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) diff --git a/src/data/case-map.h b/src/data/case-map.h index 0e9970a873..13e2ef190f 100644 --- a/src/data/case-map.h +++ b/src/data/case-map.h @@ -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 *); diff --git a/src/data/dataset.c b/src/data/dataset.c index aa196f2850..ded7c7ab02 100644 --- a/src/data/dataset.c +++ b/src/data/dataset.c @@ -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. */ diff --git a/src/data/dataset.h b/src/data/dataset.h index dfa444356e..87fe1c3831 100644 --- a/src/data/dataset.h +++ b/src/data/dataset.h @@ -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 -- 2.30.2