diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2020-08-29 14:25:10 +0200 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2020-08-30 23:26:23 +0200 |
commit | 97474303800141fbd4db71d91684474dc32cbba0 (patch) | |
tree | 11c2442aad5a455854320861b6cf037192d466f5 | |
parent | f1a2eb2c770905448f8bfe13cf066ea8a25dc190 (diff) | |
download | tracker-97474303800141fbd4db71d91684474dc32cbba0.tar.gz |
libtracker-data: Allow looking up variables in context by name
Getting a TrackerVariable first is a bit of an egg/chicken problem,
since getting a TrackerVariable ensures it's referenced in the context
in all code paths.
Soften this a bit, and allow to look up variables by name, without
necessarily creating a TrackerVariable for it.
-rw-r--r-- | src/libtracker-data/tracker-sparql-types.c | 22 | ||||
-rw-r--r-- | src/libtracker-data/tracker-sparql-types.h | 2 | ||||
-rw-r--r-- | src/libtracker-data/tracker-sparql.c | 10 |
3 files changed, 21 insertions, 13 deletions
diff --git a/src/libtracker-data/tracker-sparql-types.c b/src/libtracker-data/tracker-sparql-types.c index a029a275e..a638620b2 100644 --- a/src/libtracker-data/tracker-sparql-types.c +++ b/src/libtracker-data/tracker-sparql-types.c @@ -653,8 +653,7 @@ tracker_context_class_init (TrackerContextClass *klass) static void tracker_context_init (TrackerContext *context) { - context->variable_set = g_hash_table_new (tracker_variable_hash, - tracker_variable_equal); + context->variable_set = g_hash_table_new (g_str_hash, g_str_equal); } TrackerContext * @@ -684,27 +683,34 @@ void tracker_context_add_variable_ref (TrackerContext *context, TrackerVariable *variable) { - g_hash_table_add (context->variable_set, variable); + g_hash_table_insert (context->variable_set, variable->name, variable); } gboolean tracker_context_lookup_variable_ref (TrackerContext *context, TrackerVariable *variable) { - return g_hash_table_lookup (context->variable_set, variable) != NULL; + return g_hash_table_lookup (context->variable_set, variable->name) != NULL; +} + +gboolean +tracker_context_lookup_variable_by_name (TrackerContext *context, + const gchar *name) +{ + return g_hash_table_lookup (context->variable_set, name) != NULL; } void tracker_context_propagate_variables (TrackerContext *context) { GHashTableIter iter; - gpointer key; + gpointer key, value; g_assert (context->parent != NULL); g_hash_table_iter_init (&iter, context->variable_set); - while (g_hash_table_iter_next (&iter, &key, NULL)) - g_hash_table_add (context->parent->variable_set, key); + while (g_hash_table_iter_next (&iter, &key, &value)) + g_hash_table_insert (context->parent->variable_set, key, value); } /* Select context */ @@ -985,7 +991,7 @@ tracker_triple_context_get_variable_binding_list (TrackerTripleContext *context, */ if (TRACKER_IS_SELECT_CONTEXT (current_context) && tracker_context_get_parent (current_context) && - g_hash_table_lookup (parent_context->variable_set, variable)) { + g_hash_table_lookup (parent_context->variable_set, variable->name)) { TrackerVariableBinding *sample; TrackerBinding *binding; diff --git a/src/libtracker-data/tracker-sparql-types.h b/src/libtracker-data/tracker-sparql-types.h index fc79798b7..8dc551234 100644 --- a/src/libtracker-data/tracker-sparql-types.h +++ b/src/libtracker-data/tracker-sparql-types.h @@ -346,6 +346,8 @@ void tracker_context_add_variable_ref (TrackerContext *context, TrackerVariable *variable); gboolean tracker_context_lookup_variable_ref (TrackerContext *context, TrackerVariable *variable); +gboolean tracker_context_lookup_variable_by_name (TrackerContext *context, + const gchar *name); /* Select context */ GType tracker_select_context_get_type (void) G_GNUC_CONST; diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c index 5a2795af9..91382f5db 100644 --- a/src/libtracker-data/tracker-sparql.c +++ b/src/libtracker-data/tracker-sparql.c @@ -5550,13 +5550,13 @@ intersect_var_set (GHashTable *ht1, { GHashTableIter iter; GList *intersection = NULL; - gpointer key; + gpointer key, value; g_hash_table_iter_init (&iter, ht1); - while (g_hash_table_iter_next (&iter, &key, NULL)) { + while (g_hash_table_iter_next (&iter, &key, &value)) { if (g_hash_table_contains (ht2, key)) - intersection = g_list_prepend (intersection, key); + intersection = g_list_prepend (intersection, value); } return intersection; @@ -5587,7 +5587,7 @@ translate_MinusGraphPattern (TrackerSparql *sparql, intersection = intersect_var_set (cur_context->variable_set, context->variable_set); - vars = g_hash_table_get_keys (cur_context->variable_set); + vars = g_hash_table_get_values (cur_context->variable_set); cur = tracker_sparql_swap_builder (sparql, pre); append_subquery_select_vars (sparql, cur_context, vars); tracker_sparql_swap_builder (sparql, cur); @@ -5654,7 +5654,7 @@ translate_GroupOrUnionGraphPattern (TrackerSparql *sparql, } } while (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_UNION)); - vars = g_hash_table_get_keys (context->variable_set); + vars = g_hash_table_get_values (context->variable_set); if (placeholders->len > 1) { /* We are performing an union of multiple GroupGraphPattern, |