summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2021-11-21 00:01:22 +0100
committerCarlos Garnacho <carlosg@gnome.org>2022-02-04 19:22:00 +0100
commitfbca0ab6321c841fa54239ee367ad3aff6d3b565 (patch)
tree9c6a7f8bf7d63a84d7a6568c24e2f117bc3b4002
parent799f4b36b486fcd7b22c8ac3da5207e90730ebaf (diff)
downloadtracker-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.c37
-rw-r--r--src/libtracker-data/tracker-sparql.h2
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);