6 #include <atalk/talloc.h>
7 #include <atalk/logger.h>
8 #include "spotlight_SPARQL_map.h"
11 struct yy_buffer_state;
12 typedef struct yy_buffer_state *YY_BUFFER_STATE;
13 extern int yylex (void);
14 extern void yyerror (char const *);
15 extern void *yyterminate(void);
16 extern YY_BUFFER_STATE yy_scan_string( const char *str);
17 extern void yy_delete_buffer ( YY_BUFFER_STATE buffer );
19 static const char *map_expr(const char *attr, const char *val);
20 static const char *map_daterange(const char *dateattr, const char *date1, const char *date2);
28 extern const gchar *map_spotlight_to_sparql_query(slq_t *slq);
29 extern slq_t *ssp_slq;
30 extern gchar *ssp_result;
41 %type <sval> match expr line function
46 %token OBRACE CBRACE EQUAL COMMA QUOTE
58 ssp_result = talloc_asprintf(ssp_slq,
59 "SELECT DISTINCT ?url WHERE "
60 "{ ?x nie:url ?url FILTER(fn:starts-with(?url, 'file://%s/')) . %s}",
61 ssp_slq->slq_vol->v_path, $1);
68 if (strcmp($1, $3) != 0)
69 $$ = talloc_asprintf(ssp_slq, "{ %s } UNION { %s }", $1, $3);
71 $$ = talloc_asprintf(ssp_slq, "%s", $1);
75 | OBRACE expr CBRACE {$$ = talloc_asprintf(ssp_slq, "%s", $2);}
76 | expr AND expr {$$ = talloc_asprintf(ssp_slq, "%s . %s", $1, $3);}
78 if (strcmp($1, $3) != 0)
79 $$ = talloc_asprintf(ssp_slq, "{ %s } UNION { %s }", $1, $3);
81 $$ = talloc_asprintf(ssp_slq, "%s", $1);
86 WORD EQUAL QUOTE WORD QUOTE {$$ = map_expr($1, $4);}
90 FUNC_INRANGE OBRACE WORD COMMA DATE_SPEC OBRACE DATE CBRACE COMMA DATE_SPEC OBRACE DATE CBRACE CBRACE {$$ = map_daterange($3, $7, $12);}
95 const char *map_daterange(const char *dateattr, const char *date1, const char *date2)
98 struct spotlight_sparql_map *p;
100 for (p = spotlight_sparql_map; p->ssm_spotlight_attr; p++) {
101 if (strcmp(dateattr, p->ssm_spotlight_attr) == 0) {
102 result = talloc_asprintf(ssp_slq,
103 "?x %s ?d FILTER (?d > '%s' && ?d < '%s')",
114 const char *map_expr(const char *attr, const char *val)
117 struct spotlight_sparql_map *p;
119 for (p = spotlight_sparql_map; p->ssm_spotlight_attr; p++) {
120 if (strcmp(p->ssm_spotlight_attr, attr) == 0) {
121 result = talloc_asprintf(ssp_slq, p->ssm_sparql_query_fmtstr, val);
129 void yyerror(const char *str)
132 printf("yyerror: %s\n", str);
134 LOG(log_error, logtype_sl, "yyerror: %s", str);
143 const gchar *map_spotlight_to_sparql_query(slq_t *slq)
148 s = yy_scan_string(slq->slq_qstring);
150 LOG(log_debug, logtype_sl, "map_spotlight_to_sparql_query: %s", slq->slq_qstring);
159 int main(int argc, char **argv)
164 printf("usage: %s QUERY\n", argv[0]);
168 ssp_slq = talloc_zero(NULL, slq_t);
169 struct vol *vol = talloc_zero(ssp_slq, struct vol);
170 vol->v_path = "/Volumes/test";
171 ssp_slq->slq_vol = vol;
173 s = yy_scan_string(argv[1]);
179 printf("SPARQL: %s\n", ssp_result);