diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2021-11-21 00:01:22 +0100 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2022-02-04 19:22:00 +0100 |
commit | fbca0ab6321c841fa54239ee367ad3aff6d3b565 (patch) | |
tree | 9c6a7f8bf7d63a84d7a6568c24e2f117bc3b4002 | |
parent | 799f4b36b486fcd7b22c8ac3da5207e90730ebaf (diff) | |
download | tracker-fbca0ab6321c841fa54239ee367ad3aff6d3b565.tar.gz |
libtracker-data: Add internal API to tell whether a query may be serialized to RDF
These are basically DESCRIBE and CONSTRUCT queries, which are guaranteed
to return data in a format that is fully serializable.
-rw-r--r-- | src/libtracker-data/tracker-sparql.c | 37 | ||||
-rw-r--r-- | src/libtracker-data/tracker-sparql.h | 2 |
2 files changed, 39 insertions, 0 deletions
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c index a2edce6d5..da0ae27d0 100644 --- a/src/libtracker-data/tracker-sparql.c +++ b/src/libtracker-data/tracker-sparql.c @@ -10093,3 +10093,40 @@ tracker_sparql_make_langstring (const gchar *str, return bytes; } + +gboolean +tracker_sparql_is_serializable (TrackerSparql *sparql) +{ + TrackerParserNode *node; + + /* Updates are the other way around */ + if (sparql->query_type == TRACKER_SPARQL_QUERY_UPDATE) + return FALSE; + + if (!sparql->tree) + return FALSE; + + node = tracker_node_tree_get_root (sparql->tree); + + for (node = tracker_sparql_parser_tree_find_first (node, FALSE); + node; + node = tracker_sparql_parser_tree_find_next (node, FALSE)) { + const TrackerGrammarRule *rule; + + rule = tracker_parser_node_get_rule (node); + + /* Only DESCRIBE and CONSTRUCT queries apply, since these + * are guaranteed to return full RDF data. + */ + if (tracker_grammar_rule_is_a (rule, RULE_TYPE_RULE, NAMED_RULE_DescribeQuery) || + tracker_grammar_rule_is_a (rule, RULE_TYPE_RULE, NAMED_RULE_ConstructQuery)) + return TRUE; + + /* Early out in other query types */ + if (tracker_grammar_rule_is_a (rule, RULE_TYPE_RULE, NAMED_RULE_SelectQuery) || + tracker_grammar_rule_is_a (rule, RULE_TYPE_RULE, NAMED_RULE_AskQuery)) + break; + } + + return FALSE; +} diff --git a/src/libtracker-data/tracker-sparql.h b/src/libtracker-data/tracker-sparql.h index 74297bd0a..29c881cc9 100644 --- a/src/libtracker-data/tracker-sparql.h +++ b/src/libtracker-data/tracker-sparql.h @@ -35,6 +35,8 @@ G_DECLARE_FINAL_TYPE (TrackerSparql, tracker_sparql, TrackerSparql * tracker_sparql_new (TrackerDataManager *manager, const gchar *sparql); +gboolean tracker_sparql_is_serializable (TrackerSparql *sparql); + TrackerSparqlCursor * tracker_sparql_execute_cursor (TrackerSparql *sparql, GHashTable *parameters, GError **error); |