6 #include <atalk/talloc.h>
7 #include <atalk/logger.h>
8 #include <atalk/errchk.h>
9 #include "spotlight_SPARQL_map.h"
10 #include "spotlight.h"
12 struct yy_buffer_state;
13 typedef struct yy_buffer_state *YY_BUFFER_STATE;
14 extern int yylex (void);
15 extern void yyerror (char const *);
16 extern void *yyterminate(void);
17 extern YY_BUFFER_STATE yy_scan_string( const char *str);
18 extern void yy_delete_buffer ( YY_BUFFER_STATE buffer );
20 static const char *map_expr(const char *attr, const char *val);
21 static const char *map_daterange(const char *dateattr, const char *date1, const char *date2);
29 extern const gchar *map_spotlight_to_sparql_query(slq_t *slq);
30 extern slq_t *ssp_slq;
31 extern gchar *ssp_result;
42 %type <sval> match expr line function
47 %token OBRACE CBRACE EQUAL COMMA QUOTE
59 ssp_result = talloc_asprintf(ssp_slq,
60 "SELECT DISTINCT ?url WHERE "
61 "{ ?x nie:url ?url FILTER(fn:starts-with(?url, 'file://%s/')) . %s}",
62 ssp_slq->slq_vol->v_path, $1);
69 if (strcmp($1, $3) != 0)
70 $$ = talloc_asprintf(ssp_slq, "{ %s } UNION { %s }", $1, $3);
72 $$ = talloc_asprintf(ssp_slq, "%s", $1);
76 | OBRACE expr CBRACE {$$ = talloc_asprintf(ssp_slq, "%s", $2);}
77 | expr AND expr {$$ = talloc_asprintf(ssp_slq, "%s . %s", $1, $3);}
79 if (strcmp($1, $3) != 0)
80 $$ = talloc_asprintf(ssp_slq, "{ %s } UNION { %s }", $1, $3);
82 $$ = talloc_asprintf(ssp_slq, "%s", $1);
87 WORD EQUAL QUOTE WORD QUOTE {$$ = map_expr($1, $4);}
91 FUNC_INRANGE OBRACE WORD COMMA DATE_SPEC OBRACE DATE CBRACE COMMA DATE_SPEC OBRACE DATE CBRACE CBRACE {$$ = map_daterange($3, $7, $12);}
96 const char *map_daterange(const char *dateattr, const char *date1, const char *date2)
99 struct spotlight_sparql_map *p;
101 for (p = spotlight_sparql_map; p->ssm_spotlight_attr; p++) {
102 if (strcmp(dateattr, p->ssm_spotlight_attr) == 0) {
103 result = talloc_asprintf(ssp_slq,
104 "?x %s ?d FILTER (?d > '%s' && ?d < '%s')",
115 const char *map_expr(const char *attr, const char *val)
118 struct spotlight_sparql_map *p;
120 for (p = spotlight_sparql_map; p->ssm_spotlight_attr; p++) {
121 if (strcmp(p->ssm_spotlight_attr, attr) == 0) {
122 result = talloc_asprintf(ssp_slq, p->ssm_sparql_query_fmtstr, val);
130 void yyerror(const char *str)
133 printf("yyerror: %s\n", str);
135 LOG(log_error, logtype_sl, "yyerror: %s", str);
144 const gchar *map_spotlight_to_sparql_query(slq_t *slq)
147 YY_BUFFER_STATE s = NULL;
150 s = yy_scan_string(slq->slq_qstring);
152 EC_ZERO( yyparse() );
162 int main(int argc, char **argv)
167 printf("usage: %s QUERY\n", argv[0]);
171 ssp_slq = talloc_zero(NULL, slq_t);
172 struct vol *vol = talloc_zero(ssp_slq, struct vol);
173 vol->v_path = "/Volumes/test";
174 ssp_slq->slq_vol = vol;
176 s = yy_scan_string(argv[1]);
182 printf("SPARQL: %s\n", ssp_result);