]> arthur.barton.de Git - netatalk.git/blobdiff - etc/spotlight/slmod_sparql_parser.y
Spotlight: new options for controlling query behaviour
[netatalk.git] / etc / spotlight / slmod_sparql_parser.y
index acd58f03150cc94747c729f240db92eb95d90e6f..e4069bbe381892be8a67f2d877f9400f4ecd6796 100644 (file)
@@ -34,6 +34,7 @@
   /* local vars */
   static gchar *ssp_result;
   static char sparqlvar;
+  static char *result_limit;
 %}
 
 %code provides {
@@ -71,10 +72,14 @@ input:
      
 line:
 expr                           {
+    if (ssp_slq->slq_result_limit)
+        result_limit = talloc_asprintf(ssp_slq, "LIMIT %ld", ssp_slq->slq_result_limit);
+    else
+        result_limit = "";
     ssp_result = talloc_asprintf(ssp_slq,
-                                 "SELECT DISTINCT ?url WHERE "
-                                 "{ ?obj nie:url ?url FILTER(regex(?url, '^file://%s/')) . %s}",
-                                 ssp_slq->slq_vol->v_path, $1);
+                                 "SELECT ?url WHERE "
+                                 "{ %s . ?obj nie:url ?url . FILTER(tracker:uri-is-descendant('file://%s/', ?url)) } %s",
+                                 $1, ssp_slq->slq_vol->v_path, result_limit);
     $$ = ssp_result;
 }
 ;
@@ -87,6 +92,10 @@ BOOL                             {
         YYABORT;
 }
 | match OR match                 {
+    if (!ssp_slq->slq_allow_expr)
+        YYABORT;
+    if ($1 == NULL || $3 == NULL)
+        YYABORT;
     if (strcmp($1, $3) != 0)
         $$ = talloc_asprintf(ssp_slq, "{ %s } UNION { %s }", $1, $3);
     else
@@ -95,7 +104,11 @@ BOOL                             {
 | match                        {$$ = $1; if ($$ == NULL) YYABORT;}
 | function                     {$$ = $1;}
 | OBRACE expr CBRACE           {$$ = talloc_asprintf(ssp_slq, "%s", $2);}
-| expr AND expr                {$$ = talloc_asprintf(ssp_slq, "%s . %s", $1, $3);}
+| expr AND expr                {
+    if (!ssp_slq->slq_allow_expr)
+        YYABORT;
+    $$ = talloc_asprintf(ssp_slq, "%s . %s", $1, $3);
+}
 | expr OR expr                 {
     if (strcmp($1, $3) != 0)
         $$ = talloc_asprintf(ssp_slq, "{ %s } UNION { %s }", $1, $3);
@@ -135,7 +148,7 @@ static time_t isodate2unix(const char *s)
     return mktime(&tm);
 }
 
-const char *map_daterange(const char *dateattr, time_t date1, time_t date2)
+static const char *map_daterange(const char *dateattr, time_t date1, time_t date2)
 {
     EC_INIT;
     char *result = NULL;
@@ -195,7 +208,7 @@ static char *map_type_search(const char *attr, char op, const char *val)
     return result;
 }
 
-const char *map_expr(const char *attr, char op, const char *val)
+static const char *map_expr(const char *attr, char op, const char *val)
 {
     EC_INIT;
     char *result = NULL;
@@ -206,7 +219,11 @@ const char *map_expr(const char *attr, char op, const char *val)
     bstring q = NULL, search = NULL, replace = NULL;
 
     for (p = spotlight_sparql_map; p->ssm_spotlight_attr; p++) {
-        if (p->ssm_sparql_attr && strcmp(p->ssm_spotlight_attr, attr) == 0) {
+        if (p->ssm_enabled && (strcmp(p->ssm_spotlight_attr, attr) == 0)) {
+            if (p->ssm_type != ssmt_type && p->ssm_sparql_attr == NULL) {
+                yyerror("unsupported Spotlight attribute");
+                EC_FAIL;
+            }
             switch (p->ssm_type) {
             case ssmt_bool:
                 result = talloc_asprintf(ssp_slq, "?obj %s '%s'", p->ssm_sparql_attr, val);
@@ -252,7 +269,6 @@ const char *map_expr(const char *attr, char op, const char *val)
                 result = map_type_search(attr, op, val);
                 break;
             default:
-                yyerror("unknown Spotlight attribute type");
                 EC_FAIL;
             }
             break;
@@ -328,6 +344,7 @@ int main(int argc, char **argv)
     struct vol *vol = talloc_zero(ssp_slq, struct vol);
     vol->v_path = "/Volumes/test";
     ssp_slq->slq_vol = vol;
+    ssp_slq->slq_allow_expr = true;
     sparqlvar = 'a';
 
     s = yy_scan_string(argv[1]);