--- tracker-0.0.4/src/trackerd/tracker-rdf-query.c 2006-05-02 15:37:43.000000000 -0500 +++ tracker-0.0.4-new/src/trackerd/tracker-rdf-query.c 2006-07-28 22:59:23.000000000 -0500 @@ -70,6 +70,7 @@ /* extension operators - "contains" does a substring match, "in_Set" does string in list match */ #define ELEMENT_RDF_CONTAINS "rdfq:contains" +#define ELEMENT_RDF_REGEX "rdfq:regex" #define ELEMENT_RDF_IN_SET "rdfq:inSet" /* types */ @@ -101,6 +102,8 @@ STATE_END_LESS_THAN, STATE_CONTAINS, STATE_END_CONTAINS, + STATE_REGEX, + STATE_END_REGEX, STATE_IN_SET, STATE_END_IN_SET, STATE_INTEGER, @@ -117,6 +120,7 @@ OP_GREATER, OP_LESS, OP_CONTAINS, + OP_REGEX, OP_SET } Operators; @@ -166,7 +170,7 @@ { return state == STATE_EQUALS || state == STATE_GREATER_THAN || state == STATE_LESS_THAN || - state == STATE_CONTAINS || state == STATE_IN_SET; + state == STATE_CONTAINS || state == STATE_IN_SET || state == STATE_REGEX; } @@ -175,7 +179,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 == STATE_END_CONTAINS || state == STATE_END_IN_SET || state == STATE_END_REGEX; } @@ -445,6 +449,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_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_IN_SET)) { if (set_error_on_fail ( state == STATE_CONDITION || is_logic (state) || @@ -609,6 +624,13 @@ break; + case OP_REGEX : + + str = g_strconcat (" (", field_name, " REGEXP BINARY '", data->current_value, "' ) ", NULL); + + break; + + case OP_SET : str = g_strconcat (" (FIND_IN_SET(", field_name, ", '", data->current_value, "')) ", NULL); @@ -724,6 +746,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_IN_SET)) {