[tracker/wip/carlosg/sparql1.1: 26/113] libtracker-data: Implement URI()/IRI()



commit ddcc408a8238e83feb77df961b9ab00a0f740ff2
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sun Jan 13 18:48:20 2019 +0100

    libtracker-data: Implement URI()/IRI()

 src/libtracker-data/tracker-db-interface-sqlite.c | 22 ++++++++++++++++++++++
 src/libtracker-data/tracker-sparql.c              | 13 +++++++++----
 2 files changed, 31 insertions(+), 4 deletions(-)
---
diff --git a/src/libtracker-data/tracker-db-interface-sqlite.c 
b/src/libtracker-data/tracker-db-interface-sqlite.c
index d7a5d3fcb..32d4a20c3 100644
--- a/src/libtracker-data/tracker-db-interface-sqlite.c
+++ b/src/libtracker-data/tracker-db-interface-sqlite.c
@@ -1409,6 +1409,26 @@ function_sparql_encode_for_uri (sqlite3_context *context,
        sqlite3_result_text (context, encoded, -1, g_free);
 }
 
+static void
+function_sparql_uri (sqlite3_context *context,
+                     int              argc,
+                     sqlite3_value   *argv[])
+{
+       const gchar *str;
+       gchar *encoded;
+
+       if (argc != 1) {
+               sqlite3_result_error (context, "Invalid argument count", -1);
+               return;
+       }
+
+       str = (gchar *)sqlite3_value_text (argv[0]);
+       encoded = g_uri_escape_string (str,
+                                      G_URI_RESERVED_CHARS_ALLOWED_IN_PATH,
+                                      FALSE);
+       sqlite3_result_text (context, encoded, -1, g_free);
+}
+
 static void
 function_sparql_string_before (sqlite3_context *context,
                                int              argc,
@@ -1688,6 +1708,8 @@ initialize_functions (TrackerDBInterface *db_interface)
                  function_sparql_uri_is_descendant },
                { "SparqlEncodeForUri", 1, SQLITE_ANY | SQLITE_DETERMINISTIC,
                  function_sparql_encode_for_uri },
+               { "SparqlUri", 1, SQLITE_ANY | SQLITE_DETERMINISTIC,
+                 function_sparql_uri },
                /* Strings */
                { "SparqlRegex", -1, SQLITE_ANY | SQLITE_DETERMINISTIC,
                  function_sparql_regex },
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c
index 7f9c13a54..ee65b1fe3 100644
--- a/src/libtracker-data/tracker-sparql.c
+++ b/src/libtracker-data/tracker-sparql.c
@@ -5877,10 +5877,15 @@ translate_BuiltInCall (TrackerSparql  *sparql,
                tracker_sparql_swap_builder (sparql, old);
        } else if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_DATATYPE)) {
                _unimplemented ("DATATYPE");
-       } else if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_IRI)) {
-               _unimplemented ("IRI");
-       } else if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_URI)) {
-               _unimplemented ("URI");
+       } else if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_URI) ||
+                  _accept (sparql, RULE_TYPE_LITERAL, LITERAL_IRI)) {
+               sparql->current_state.convert_to_string = TRUE;
+               _expect (sparql, RULE_TYPE_LITERAL, LITERAL_OPEN_PARENS);
+               _append_string (sparql, "SparqlUri (");
+               _call_rule (sparql, NAMED_RULE_Expression, error);
+               _expect (sparql, RULE_TYPE_LITERAL, LITERAL_CLOSE_PARENS);
+               _append_string (sparql, ") ");
+               sparql->current_state.expression_type = TRACKER_PROPERTY_TYPE_STRING;
        } else if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_ABS)) {
                _expect (sparql, RULE_TYPE_LITERAL, LITERAL_OPEN_PARENS);
                _append_string (sparql, "ABS (");


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]