Checkout submodules as necessary MPSPARQL-23
[mp-sparql-moved-to-github.git] / src / sparql.c
index 50f41f6..6fe5e5c 100644 (file)
@@ -37,6 +37,13 @@ void yaz_sparql_destroy(yaz_sparql_t s)
         nmem_destroy(s->nmem);
 }
 
+void yaz_sparql_include(yaz_sparql_t s, yaz_sparql_t u)
+{
+    struct sparql_entry *e = u->conf;
+    for (; e; e = e->next)
+        yaz_sparql_add_pattern(s, e->pattern, e->value);
+}
+
 int yaz_sparql_add_pattern(yaz_sparql_t s, const char *pattern,
                            const char *value)
 {
@@ -158,6 +165,21 @@ static int z_term(yaz_sparql_t s, WRBUF addinfo, WRBUF res, WRBUF vars,
                 }
                 wrbuf_puts(addinfo, ">");
                 break;
+            case 't':
+                switch (term->which)
+                {
+                case Z_Term_general:
+                    wrbuf_json_write(addinfo,
+                                term->u.general->buf, term->u.general->len);
+                    break;
+                case Z_Term_numeric:
+                    wrbuf_printf(addinfo, ODR_INT_PRINTF, *term->u.numeric);
+                    break;
+                case Z_Term_characterString:
+                    wrbuf_json_puts(addinfo, term->u.characterString);
+                    break;
+                }
+                break;
             case 'd':
                 switch (term->which)
                 {
@@ -359,6 +381,10 @@ static int emit_prefixes(yaz_sparql_t s,
         {
             ;
         }
+        else if (!strncmp(e->pattern, "present", 7))
+        {
+            ;
+        }
         else if (!strncmp(e->pattern, "uri", 3))
         {
             ;
@@ -372,19 +398,29 @@ static int emit_prefixes(yaz_sparql_t s,
     return errors;
 }
 
-int yaz_sparql_lookup_schema(yaz_sparql_t s, const char *schema)
+struct sparql_entry *lookup_schema(yaz_sparql_t s, const char *schema)
 {
     struct sparql_entry *e;
 
     for (e = s->conf; e; e = e->next)
     {
+        if (!strncmp(e->pattern, "present.", 8))
+        {
+            if (!schema || !strcmp(e->pattern + 8, schema))
+                break;
+        }
         if (!strncmp(e->pattern, "uri.", 4))
         {
             if (!schema || !strcmp(e->pattern + 4, schema))
                 break;
         }
     }
-    return e ? 1 : 0;
+    return e;
+}
+
+int yaz_sparql_lookup_schema(yaz_sparql_t s, const char *schema)
+{
+    return lookup_schema(s, schema) ? 1 : 0;
 }
 
 int yaz_sparql_from_uri_stream(yaz_sparql_t s,
@@ -394,16 +430,7 @@ int yaz_sparql_from_uri_stream(yaz_sparql_t s,
                                const char *uri, const char *schema)
 {
     int r = 0, errors = emit_prefixes(s, addinfo, pr, client_data);
-    struct sparql_entry *e;
-
-    for (e = s->conf; e; e = e->next)
-    {
-        if (!strncmp(e->pattern, "uri.", 4))
-        {
-            if (!schema || !strcmp(e->pattern + 4, schema))
-                break;
-        }
-    }
+    struct sparql_entry *e = lookup_schema(s, schema);
     if (!e)
         errors++;
     if (!errors)
@@ -513,6 +540,48 @@ int yaz_sparql_from_rpn_stream(yaz_sparql_t s,
     return errors ? -1 : r;
 }
 
+void yaz_sparql_explain_indexes( yaz_sparql_t s, WRBUF w, int indent)
+{
+    char indentspace[200]; // must be enough
+    assert(indent<200);
+    int i;
+    for (i=0; i < indent; i++)
+        indentspace[i] = ' ';
+    indentspace[indent] = '\0';
+
+    struct sparql_entry *e;
+    wrbuf_puts(w,indentspace);
+    wrbuf_puts(w,"<indexInfo>\n");
+
+    for (e = s->conf; e; e = e->next)
+    {
+        /*
+        wrbuf_puts(w,"    <FOO>");
+        wrbuf_xmlputs(w, e->pattern );
+        wrbuf_puts(w,"  : ");
+        wrbuf_xmlputs(w, e->value );
+        wrbuf_puts(w,"    </FOO>\n");
+        */
+        if ( strncmp(e->pattern, "index.", 6 ) == 0 )
+        {
+            wrbuf_puts(w,indentspace);
+            wrbuf_puts(w,"  <index>\n");
+            wrbuf_puts(w,indentspace);
+            wrbuf_puts(w,"    <title>");
+            wrbuf_xmlputs(w, e->pattern + 6);
+            wrbuf_puts(w,"</title>\n");
+            wrbuf_puts(w,indentspace);
+            wrbuf_puts(w,"    <map><name>");
+            wrbuf_xmlputs(w, e->pattern + 6);
+            wrbuf_puts(w,"</name></map>\n");
+            wrbuf_puts(w,indentspace);
+            wrbuf_puts(w,"  </index>\n");
+        }
+    }
+    wrbuf_puts(w,indentspace);
+    wrbuf_puts(w,"</indexInfo>\n");
+}
+
 /*
  * Local variables:
  * c-basic-offset: 4