]> arthur.barton.de Git - netatalk.git/blobdiff - etc/afpd/spotlight_rawquery_parser.y
fixes
[netatalk.git] / etc / afpd / spotlight_rawquery_parser.y
index e4f4ed0ab5c887df1b802e3937ae11328f898d57..e159d1f4239ba72a6953bb4c8cbfacc9b4cc7e57 100644 (file)
@@ -49,7 +49,7 @@
     time_t tval;
 }
 
-%expect 1
+%expect 5
 %error-verbose
 
 %type <sval> match expr line function
@@ -73,7 +73,7 @@ line:
 expr                           {
     ssp_result = talloc_asprintf(ssp_slq,
                                  "SELECT DISTINCT ?url WHERE "
-                                 "{ ?obj nie:url ?url FILTER(fn:starts-with(?url, 'file://%s/')) . %s}",
+                                 "{ ?obj nie:url ?url FILTER(regex(?url, '^file://%s/')) . %s}",
                                  ssp_slq->slq_vol->v_path, $1);
     $$ = ssp_result;
 }
@@ -109,6 +109,10 @@ WORD EQUAL QUOTE WORD QUOTE     {$$ = map_expr($1, '=', $4);}
 | WORD UNEQUAL QUOTE WORD QUOTE {$$ = map_expr($1, '!', $4);}
 | WORD LT QUOTE WORD QUOTE      {$$ = map_expr($1, '<', $4);}
 | WORD GT QUOTE WORD QUOTE      {$$ = map_expr($1, '>', $4);}
+| WORD EQUAL QUOTE WORD QUOTE WORD    {$$ = map_expr($1, '=', $4);}
+| WORD UNEQUAL QUOTE WORD QUOTE WORD {$$ = map_expr($1, '!', $4);}
+| WORD LT QUOTE WORD QUOTE WORD     {$$ = map_expr($1, '<', $4);}
+| WORD GT QUOTE WORD QUOTE WORD     {$$ = map_expr($1, '>', $4);}
 ;
 
 function:
@@ -165,6 +169,32 @@ EC_CLEANUP:
     return result;
 }
 
+static char *map_type_search(const char *attr, char op, const char *val)
+{
+    char *result = NULL;
+    const char *sparqlAttr;
+
+    for (struct MDTypeMap *p = MDTypeMap; p->mdtm_value; p++) {
+        if (strcmp(p->mdtm_value, val) == 0) {
+            switch (p->mdtm_type) {
+            case kMDTypeMapRDF:
+                sparqlAttr = "rdf:type";
+                break;
+            case kMDTypeMapMime:
+                sparqlAttr = "nie:mimeType";
+                break;
+            default:
+                return NULL;
+            }
+            result = talloc_asprintf(ssp_slq, "?obj %s '%s'",
+                                     sparqlAttr,
+                                     p->mdtm_sparql);
+            break;
+        }
+    }
+    return result;
+}
+
 const char *map_expr(const char *attr, char op, const char *val)
 {
     EC_INIT;
@@ -176,7 +206,7 @@ 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 (strcmp(p->ssm_spotlight_attr, attr) == 0) {
+        if (p->ssm_sparql_attr && strcmp(p->ssm_spotlight_attr, attr) == 0) {
             switch (p->ssm_type) {
             case ssmt_bool:
                 result = talloc_asprintf(ssp_slq, "?obj %s '%s'", p->ssm_sparql_attr, val);
@@ -218,6 +248,9 @@ const char *map_expr(const char *attr, char op, const char *val)
                                          buf1);
                 sparqlvar++;
                 break;
+            case ssmt_type:
+                result = map_type_search(attr, op, val);
+                break;
             default:
                 yyerror("unknown Spotlight attribute type");
                 EC_FAIL;