Index: src/trackerd/tracker-rdf-query.c =================================================================== RCS file: /cvs/gnome/tracker/src/trackerd/tracker-rdf-query.c,v retrieving revision 1.4 diff -u -r1.4 tracker-rdf-query.c --- src/trackerd/tracker-rdf-query.c 17 Jul 2006 16:50:04 -0000 1.4 +++ src/trackerd/tracker-rdf-query.c 29 Jul 2006 18:25:10 -0000 @@ -58,6 +58,7 @@ /* extension operators - "contains" does a substring or full text match, "in_Set" does string in list match */ #define ELEMENT_RDF_CONTAINS "rdfq:contains" +#define ELEMENT_RDF_REGEX "rdfq:regex" #define ELEMENT_RDF_STARTS_WITH "rdfq:startsWith" #define ELEMENT_RDF_IN_SET "rdfq:inSet" @@ -97,6 +98,8 @@ STATE_END_LESS_OR_EQUAL, STATE_CONTAINS, STATE_END_CONTAINS, + STATE_REGEX, + STATE_END_REGEX, STATE_STARTS_WITH, STATE_END_STARTS_WITH, STATE_IN_SET, @@ -119,6 +122,7 @@ OP_LESS, OP_LESS_EQUAL, OP_CONTAINS, + OP_REGEX, OP_SET, OP_STARTS } Operators; @@ -210,7 +214,7 @@ return state == STATE_EQUALS || state == STATE_GREATER_THAN || state == STATE_LESS_THAN || state == STATE_CONTAINS || state == STATE_IN_SET || STATE_LESS_OR_EQUAL || - STATE_GREATER_OR_EQUAL || state == STATE_STARTS_WITH; + STATE_GREATER_OR_EQUAL || state == STATE_STARTS_WITH || state == STATE_REGEX; } @@ -220,7 +224,7 @@ return state == STATE_END_EQUALS || state == STATE_END_GREATER_THAN || state == STATE_END_LESS_THAN || state == STATE_END_CONTAINS || state == STATE_END_IN_SET || STATE_END_LESS_OR_EQUAL || - STATE_END_GREATER_OR_EQUAL || state == STATE_END_STARTS_WITH; + STATE_END_GREATER_OR_EQUAL || state == STATE_END_STARTS_WITH || state == STATE_REGEX; } @@ -642,6 +646,17 @@ data->current_operator = OP_CONTAINS; push_stack (data, STATE_CONTAINS); + } else if (ELEMENT_IS (ELEMENT_RDF_REGEX)) { + + if (set_error_on_fail ( state == STATE_CONDITION || is_logic (state) || + ((data->current_logic_operator == LOP_AND) && (is_end_operator (state)) ), + context, "REGEX element not expected here", error)) { + return; + } + + data->current_operator = OP_REGEX; + push_stack (data, STATE_REGEX); + } else if (ELEMENT_IS (ELEMENT_RDF_STARTS_WITH)) { if (set_error_on_fail ( state == STATE_CONDITION || is_logic (state) || @@ -853,6 +868,12 @@ break; + case OP_REGEX : + + str = g_strconcat (" (", field_data->meta_field, " REGEXP '", data->current_value, "')) ", NULL); + + break; + case OP_SET : str = g_strconcat (" (FIND_IN_SET(", field_data->meta_field, ", '", data->current_value, "')) ", NULL); @@ -988,6 +1009,15 @@ } push_stack (data, STATE_END_CONTAINS); + + } else if (ELEMENT_IS (ELEMENT_RDF_REGEX)) { + + if (!build_sql (data)) { + set_error (error, context, 1, "parse error"); + return; + } + + push_stack (data, STATE_END_REGEX); } else if (ELEMENT_IS (ELEMENT_RDF_STARTS_WITH)) {