diff options
author | Jürg Billeter <j@bitron.ch> | 2009-04-08 09:42:27 +0200 |
---|---|---|
committer | Jürg Billeter <j@bitron.ch> | 2009-04-16 10:49:08 +0200 |
commit | ebc9620ed3c01717407fc1743c83e16bdb0f37d5 (patch) | |
tree | 19b1e7556d83dec4dad332b71608d1052072c7fb | |
parent | 05e5ea653de88d833e0c5216e974d3ddcfb900b0 (diff) | |
download | tracker-ebc9620ed3c01717407fc1743c83e16bdb0f37d5.tar.gz |
Drop RDF query support
The XML-based RDF query support will be replaced by SPARQL.
26 files changed, 0 insertions, 4230 deletions
diff --git a/Makefile.am b/Makefile.am index 62412b574..d56107d81 100644 --- a/Makefile.am +++ b/Makefile.am @@ -21,11 +21,6 @@ gen-ChangeLog: EXTRA_DIST = \ ChangeLog.pre-0-6-93 \ gitlog-to-changelog \ - rdf-query-examples/80s-music.rdf \ - rdf-query-examples/90s-music.rdf \ - rdf-query-examples/all-documents.rdf \ - rdf-query-examples/big-documents.rdf \ - rdf-query-examples/wallpapers.rdf \ intltool-extract.in \ intltool-merge.in \ intltool-update.in diff --git a/data/dbus/tracker-metadata.xml b/data/dbus/tracker-metadata.xml index 7a8da82dc..5afb489db 100644 --- a/data/dbus/tracker-metadata.xml +++ b/data/dbus/tracker-metadata.xml @@ -74,75 +74,5 @@ <arg type="as" name="result" direction="out" /> </method> - <!-- returns an array of all unique values of given metadata types. Optionally a rdf query can be - used to filter the results. The results are sorted based on the metadata fields either in - ascending or descending order. - --> - <method name="GetUniqueValues"> - <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> - <arg type="s" name="service" direction="in" /> - <arg type="as" name="meta_types" direction="in" /> - <arg type="s" name="query" direction="in" /> - <arg type="b" name="descending" direction="in" /> - <arg type="i" name="offset" direction="in" /> - <arg type="i" name="max_hits" direction="in" /> - <arg type="aas" name="result" direction="out" /> - </method> - - <method name="GetSum"> - <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> - <arg type="s" name="service" direction="in" /> - <arg type="s" name="field" direction="in" /> - <arg type="s" name="query" direction="in" /> - <arg type="i" name="result" direction="out" /> - </method> - - <method name="GetCount"> - <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> - <arg type="s" name="service" direction="in" /> - <arg type="s" name="field" direction="in" /> - <arg type="s" name="query" direction="in" /> - <arg type="i" name="result" direction="out" /> - </method> - - <method name="GetUniqueValuesWithCount"> - <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> - <arg type="s" name="service" direction="in" /> - <arg type="as" name="meta_types" direction="in" /> - <arg type="s" name="query" direction="in" /> - <arg type="s" name="count_field" direction="in" /> - <arg type="b" name="descending" direction="in" /> - <arg type="i" name="offset" direction="in" /> - <arg type="i" name="max_hits" direction="in" /> - <arg type="aas" name="result" direction="out" /> - </method> - - <method name="GetUniqueValuesWithCountAndSum"> - <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> - <arg type="s" name="service" direction="in" /> - <arg type="as" name="meta_types" direction="in" /> - <arg type="s" name="query" direction="in" /> - <arg type="s" name="count_field" direction="in" /> - <arg type="s" name="sum_field" direction="in" /> - <arg type="b" name="descending" direction="in" /> - <arg type="i" name="offset" direction="in" /> - <arg type="i" name="max_hits" direction="in" /> - <arg type="aas" name="result" direction="out" /> - </method> - - <method name="GetUniqueValuesWithConcatCountAndSum"> - <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> - <arg type="s" name="service" direction="in" /> - <arg type="as" name="meta_types" direction="in" /> - <arg type="s" name="query" direction="in" /> - <arg type="s" name="concat_field" direction="in" /> - <arg type="s" name="count_field" direction="in" /> - <arg type="s" name="sum_field" direction="in" /> - <arg type="b" name="descending" direction="in" /> - <arg type="i" name="offset" direction="in" /> - <arg type="i" name="max_hits" direction="in" /> - <arg type="aas" name="result" direction="out" /> - </method> - </interface> </node> diff --git a/data/dbus/tracker-search.xml b/data/dbus/tracker-search.xml index 1cb1b9648..e0d73f8ec 100644 --- a/data/dbus/tracker-search.xml +++ b/data/dbus/tracker-search.xml @@ -58,60 +58,6 @@ <arg type="s" name="result" direction="out" /> </method> - <!-- searches a specific metadata field (field parameter) for a - search term (search_text). The result is an array of uri/id's. - --> - <method name="Metadata"> - <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> - <annotation name="org.freedesktop.DBus.Deprecated" value="true"/> - <arg type="s" name="service" direction="in" /> - <arg type="s" name="field" direction="in" /> - <arg type="s" name="search_text" direction="in" /> - <arg type="i" name="offset" direction="in" /> - <arg type="i" name="max_hits" direction="in" /> - <arg type="as" name="result" direction="out" /> - </method> - - <!-- Searches specified service for matching entities. - - The service parameter specifies the service which the query - will be performed on. - - The fields parameter specifies an array of aditional metadata - fields to return in addition to the id field (which is - returned as the "key" in the resultant dict/hashtable) and - the service category. This can be null. - - The optional search_text paramter specifies the text to - search for in a full text search of all indexed fields. - - The optional keyword search, a single keyword may be used - here to filter the results. - - The optional query_condition parameter specifies an - xml-based rdf query condition which is used to filter out the - results. - - The Offset parameter sets the start row of the returned - result set (useful for paging/cursors). A value of 0 should - be passed to get rows from the beginning. - - The max_hits parameter limits the size of the result set. - - The sort_by_service parameter optionally sorts results by - their service category (if FALSE no service sorting is done). - - The result is a array of stringarrays in format [uri, - service, field1, field2...] where field1 is the first - specified field in the fields paramter and so on. - --> - <method name="Query"> - <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> - <arg type="i" name="live_query_id" direction="in" /> - <arg type="s" name="service" direction="in" /> - <arg type="as" name="fields" direction="in" /> - <arg type="s" name="search_text" direction="in" /> - <arg type="as" name="keywords" direction="in" /> - <arg type="s" name="query_condition" direction="in" /> - <arg type="b" name="sort_by_service" direction="in" /> - <arg type="as" name="sort_fields" direction="in" /> - <arg type="b" name="sort_descending" direction="in" /> - <arg type="i" name="offset" direction="in" /> - <arg type="i" name="max_hits" direction="in" /> - <arg type="aas" name="result" direction="out" /> - </method> - <!-- Suggests an alternate spelling based on the word index. --> <method name="Suggest"> <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> diff --git a/docs/manpages/Makefile.am b/docs/manpages/Makefile.am index 32eafb6c9..305195cec 100644 --- a/docs/manpages/Makefile.am +++ b/docs/manpages/Makefile.am @@ -16,7 +16,6 @@ man_MANS = \ tracker-extract.1 \ tracker-files.1 \ tracker-meta-folder.1 \ - tracker-query.1 \ tracker-search.1 \ tracker-stats.1 \ trackerd.1 \ @@ -26,7 +25,6 @@ man_MANS = \ tracker.cfg.5 \ tracker-services.1 \ tracker-info.1 \ - tracker-unique.1 \ $(tst) \ $(ta) \ $(tp) diff --git a/docs/manpages/tracker-query.1 b/docs/manpages/tracker-query.1 deleted file mode 100644 index b44ac709a..000000000 --- a/docs/manpages/tracker-query.1 +++ /dev/null @@ -1,36 +0,0 @@ -.TH tracker-query 1 "July 2007" GNU "User Commands" - -.SH NAME -tracker-query \- command line tool to query tracker database - -.SH SYNOPSIS -.B tracker-query -.I [OPTIONS] query-file.rdf [MetaDataFields...] - -.SH DESCRIPTION -.B tracker-query -Exectutes an RDF query and prints the result. Additionally the behavior -can be customized using below described options. - -.SH OPTIONS -.TP -\-?, --help -Show a brief help message. - -.TP -\-s, --service=ServiceName -Search for files from a specific service. ServiceName has to be one of -trackers services. For mor information on services, see -.BR tracker-services (1). - -.TP -\-t, --search-term=SerchTerm -Adds a full text search filter to the query. - -.TP -\-k, --keyword=Keyword -Adds a keyword filter to the query. - -.SH SEE ALSO -.BR trackerd (1), -.BR tracker-services (1). diff --git a/docs/manpages/tracker-unique.1 b/docs/manpages/tracker-unique.1 deleted file mode 100644 index 27c1c4b56..000000000 --- a/docs/manpages/tracker-unique.1 +++ /dev/null @@ -1,55 +0,0 @@ -.TH tracker-unique 1 "Oct 2008" GNU "User Commands" - -.SH NAME -tracker-unique \- command line tool to ask for unique values of a -property in tracker. - -.SH SYNOPSIS -\fBtracker-unique\fR -[OPTIONS] --p \fIRDFFILE\fR \fIFIELD\fR [FIELD...] - -.SH DESCRIPTION -.B tracker-unique -gets all the unique values of \fIFIELD\fR -after running the RDF query in \fIRDFFILE\fR. - -.PP -More than one field can be used, and then it will return the -unique values of the combination. - -.SH OPTIONS -.TP -.B \-?, \-\-help -Show summary of options. -.TP -.B \-p, \-\-path=RDFFILE -A file containing a RDF query. (See -documentation for description of the format). -.TP -.B FIELD -A valid property in tracker. For more information on tracker -properties, see -.BR tracker-services (1) -.TP -.B \-s, \-\-service=SERVICE -Limit the query to the specified service type. For more information on -tracker services, see -.BR tracker-services (1) -.TP -.B \-c, \-\-count=FIELD -Count different values of \fIFIELD\fR in the result of the query. -.TP -.B \-u, \-\-sum=FIELD -Add all values of \fIFIELD\fR in the result of the query. -.TP -.B \-o, \-\-desc -Sort to descending order - - -.SH SEE ALSO -.BR trackerd (1), -.BR tracker-services (1). - -.SH AUTHOR -tracker-unique was written by Mikael Ottela <mikael.ottela@ixonos.com>. diff --git a/po/POTFILES.in b/po/POTFILES.in index abbdb37c4..afe2c4bcf 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -29,11 +29,9 @@ src/tracker-utils/tracker-files.c src/tracker-utils/tracker-info.c src/tracker-utils/tracker-meta-folder.c src/tracker-utils/tracker-processes.c -src/tracker-utils/tracker-query.c src/tracker-utils/tracker-search.c src/tracker-utils/tracker-services.c src/tracker-utils/tracker-stats.c src/tracker-utils/tracker-status.c src/tracker-utils/tracker-tag.c -src/tracker-utils/tracker-unique.c src/trackerd/tracker-main.c diff --git a/rdf-query-examples/80s-music.rdf b/rdf-query-examples/80s-music.rdf deleted file mode 100644 index 7040c2335..000000000 --- a/rdf-query-examples/80s-music.rdf +++ /dev/null @@ -1,15 +0,0 @@ -<rdfq:Condition> - <rdfq:and> - - <rdfq:greaterThan> - <rdfq:Property name="Audio:ReleaseDate" /> - <rdf:Integer>1979</rdf:Integer> - </rdfq:greaterThan> - - <rdfq:lessThan> - <rdfq:Property name="Audio:ReleaseDate" /> - <rdf:Integer>1990</rdf:Integer> - </rdfq:lessThan> - - </rdfq:and> -</rdfq:Condition> diff --git a/rdf-query-examples/90s-music.rdf b/rdf-query-examples/90s-music.rdf deleted file mode 100644 index d49fc7bb4..000000000 --- a/rdf-query-examples/90s-music.rdf +++ /dev/null @@ -1,15 +0,0 @@ -<rdfq:Condition> - <rdfq:and> - - <rdfq:greaterThan> - <rdfq:Property name="Audio:ReleaseDate" /> - <rdf:Integer>1989</rdf:Integer> - </rdfq:greaterThan> - - <rdfq:lessThan> - <rdfq:Property name="Audio:ReleaseDate" /> - <rdf:Integer>2000</rdf:Integer> - </rdfq:lessThan> - - </rdfq:and> -</rdfq:Condition> diff --git a/rdf-query-examples/all-documents.rdf b/rdf-query-examples/all-documents.rdf deleted file mode 100644 index f58b980ec..000000000 --- a/rdf-query-examples/all-documents.rdf +++ /dev/null @@ -1,8 +0,0 @@ -<rdfq:Condition> - - <rdfq:inSet> - <rdfq:Property name="File:Mime" /> - <rdf:String>application/msword,application/pdf,application/vnd.ms-excel,application/vnd.oasis.opendocument.text,application/vnd.sun.xml.writer</rdf:String> - </rdfq:inSet> - -</rdfq:Condition> diff --git a/rdf-query-examples/big-documents.rdf b/rdf-query-examples/big-documents.rdf deleted file mode 100644 index e003a63e2..000000000 --- a/rdf-query-examples/big-documents.rdf +++ /dev/null @@ -1,15 +0,0 @@ -<rdfq:Condition> - <rdfq:and> - - <rdfq:inSet> - <rdfq:Property name="File:Mime" /> - <rdf:String>application/msword,application/pdf,application/vnd.ms-excel,application/vnd.oasis.opendocument.text,application/vnd.sun.xml.writer</rdf:String> - </rdfq:inSet> - - <rdfq:greaterThan> - <rdfq:Property name="Doc:PageCount" /> - <rdf:Integer>10</rdf:Integer> - </rdfq:greaterThan> - - </rdfq:and> -</rdfq:Condition> diff --git a/rdf-query-examples/wallpapers.rdf b/rdf-query-examples/wallpapers.rdf deleted file mode 100644 index 7596e117a..000000000 --- a/rdf-query-examples/wallpapers.rdf +++ /dev/null @@ -1,16 +0,0 @@ -<rdfq:Condition> - <rdfq:and> - - <rdfq:greaterThan> - <rdfq:Property name="Image:Width" /> - <rdf:Integer>1023</rdf:Integer> - </rdfq:greaterThan> - - <rdfq:greaterThan> - <rdfq:Property name="Image:Height" /> - <rdf:Integer>767</rdf:Integer> - </rdfq:greaterThan> - - - </rdfq:and> -</rdfq:Condition> diff --git a/src/libtracker-data/Makefile.am b/src/libtracker-data/Makefile.am index 8dbc06f61..fa7a6e3de 100644 --- a/src/libtracker-data/Makefile.am +++ b/src/libtracker-data/Makefile.am @@ -24,7 +24,6 @@ libtracker_data_la_SOURCES = \ tracker-data-update.c \ tracker-field-data.c \ tracker-query-tree.c \ - tracker-rdf-query.c \ tracker-turtle.c noinst_HEADERS = \ @@ -37,7 +36,6 @@ noinst_HEADERS = \ tracker-data-update.h \ tracker-field-data.h \ tracker-query-tree.h \ - tracker-rdf-query.h \ tracker-turtle.h libtracker_data_la_LDFLAGS = \ diff --git a/src/libtracker-data/tracker-data-search.c b/src/libtracker-data/tracker-data-search.c index 1c2b0bae3..1a9fd5b4e 100644 --- a/src/libtracker-data/tracker-data-search.c +++ b/src/libtracker-data/tracker-data-search.c @@ -40,7 +40,6 @@ #include "tracker-data-schema.h" #include "tracker-data-search.h" #include "tracker-query-tree.h" -#include "tracker-rdf-query.h" #define DEFAULT_METADATA_MAX_HITS 1024 @@ -619,611 +618,6 @@ tracker_data_search_keywords_get_list (TrackerDBInterface *iface, } -static gint -metadata_sanity_check_max_hits (gint max_hits) -{ - if (max_hits < 1) { - return DEFAULT_METADATA_MAX_HITS; - } - - return max_hits; -} - -static gboolean -is_data_type_numeric (TrackerFieldType type) -{ - return - type == TRACKER_FIELD_TYPE_INTEGER || - type == TRACKER_FIELD_TYPE_DOUBLE; -} - -static gboolean -is_data_type_text (TrackerFieldType type) -{ - return - type == TRACKER_FIELD_TYPE_STRING || - type == TRACKER_FIELD_TYPE_INDEX; -} - -static TrackerFieldData * -tracker_metadata_add_metadata_field (TrackerDBInterface *iface, - const gchar *service, - GSList **fields, - const gchar *field_name, - gboolean is_select, - gboolean is_condition, - gboolean is_order) -{ - TrackerFieldData *field_data; - gboolean field_exists; - GSList *l; - - field_exists = FALSE; - field_data = NULL; - - /* Check if field is already in list */ - for (l = *fields; l; l = l->next) { - const gchar *this_field_name; - - this_field_name = tracker_field_data_get_field_name (l->data); - if (!this_field_name) { - continue; - } - - if (strcasecmp (this_field_name, field_name) == 0) { - field_data = l->data; - field_exists = TRUE; - - if (is_condition) { - tracker_field_data_set_is_condition (field_data, TRUE); - } - - if (is_select) { - tracker_field_data_set_is_select (field_data, TRUE); - } - - if (is_order) { - tracker_field_data_set_is_order (field_data, TRUE); - } - - break; - } - } - - if (!field_exists) { - field_data = tracker_data_schema_get_metadata_field (iface, - service, - field_name, - g_slist_length (*fields), - is_select, - is_condition); - if (field_data) { - *fields = g_slist_prepend (*fields, field_data); - } - - if (is_order) { - tracker_field_data_set_is_order (field_data, TRUE); - } - } - - return field_data; -} - -TrackerDBResultSet * -tracker_data_search_get_unique_values (const gchar *service_type, - gchar **fields, - const gchar *query_condition, - gboolean order_desc, - gint offset, - gint max_hits, - GError **error) -{ - return tracker_data_search_get_unique_values_with_concat_count_and_sum (service_type, - fields, - query_condition, - NULL, - NULL, - NULL, - order_desc, - offset, - max_hits, - error); -} - -TrackerDBResultSet * -tracker_data_search_get_unique_values_with_count (const gchar *service_type, - gchar **fields, - const gchar *query_condition, - const gchar *count_field, - gboolean order_desc, - gint offset, - gint max_hits, - GError **error) -{ - return tracker_data_search_get_unique_values_with_concat_count_and_sum (service_type, - fields, - query_condition, - NULL, - count_field, - NULL, - order_desc, - offset, - max_hits, - error); -} - -TrackerDBResultSet * -tracker_data_search_get_unique_values_with_count_and_sum (const gchar *service_type, - gchar **fields, - const gchar *query_condition, - const gchar *count_field, - const gchar *sum_field, - gboolean order_desc, - gint offset, - gint max_hits, - GError **error) -{ - return tracker_data_search_get_unique_values_with_concat_count_and_sum (service_type, - fields, - query_condition, - NULL, - count_field, - sum_field, - order_desc, - offset, - max_hits, - error); -} - -TrackerDBResultSet * -tracker_data_search_get_unique_values_with_concat_count_and_sum (const gchar *service_type, - gchar **fields, - const gchar *query_condition, - const gchar *concat_field, - const gchar *count_field, - const gchar *sum_field, - gboolean order_desc, - gint offset, - gint max_hits, - GError **error) -{ - TrackerDBInterface *iface; - TrackerDBResultSet *result_set = NULL; - - GSList *field_list = NULL; - gchar *str_offset, *str_limit; - - GString *sql_select; - GString *sql_from; - GString *sql_where; - GString *sql_order; - GString *sql_group; - gchar *sql; - - gchar *rdf_where; - gchar *rdf_from; - GError *actual_error = NULL; - - guint i; - - g_return_val_if_fail (service_type != NULL, NULL); - g_return_val_if_fail (fields != NULL, NULL); - g_return_val_if_fail (query_condition != NULL, NULL); - - if (!tracker_ontology_service_is_valid (service_type)) { - g_set_error (error, TRACKER_DBUS_ERROR, 0, - "Service_Type '%s' is invalid or has not been implemented yet", - service_type); - return NULL; - } - - iface = tracker_db_manager_get_db_interface_by_service (service_type); - - sql_select = g_string_new ("SELECT DISTINCT "); - sql_from = g_string_new ("\nFROM Services AS S "); - sql_where = g_string_new ("\nWHERE "); - sql_order = g_string_new (""); - sql_group = g_string_new ("\nGROUP BY "); - - - for (i = 0; i < g_strv_length (fields); i++) { - TrackerFieldData *fd; - - fd = tracker_metadata_add_metadata_field (iface, service_type, &field_list, fields[i], TRUE, FALSE, TRUE); - - if (!fd) { - g_string_free (sql_select, TRUE); - g_string_free (sql_from, TRUE); - g_string_free (sql_where, TRUE); - g_string_free (sql_order, TRUE); - g_string_free (sql_group, TRUE); - - g_set_error (error, TRACKER_DBUS_ERROR, 0, - "Invalid or non-existant metadata type '%s' specified", - fields[i]); - return NULL; - } - - if (i) { - g_string_append_printf (sql_select, ","); - g_string_append_printf (sql_group, ","); - } - - g_string_append_printf (sql_select, "%s", tracker_field_data_get_select_field (fd)); - if (order_desc) { - if (i) { - g_string_append_printf (sql_order, ","); - } - g_string_append_printf (sql_order, "\nORDER BY %s DESC ", - tracker_field_data_get_order_field (fd)); - } - g_string_append_printf (sql_group, "%s", tracker_field_data_get_order_field (fd)); - - } - - if (concat_field && !(tracker_is_empty_string (concat_field))) { - TrackerFieldData *fd; - TrackerFieldType data_type; - - fd = tracker_metadata_add_metadata_field (iface, service_type, &field_list, concat_field, TRUE, FALSE, FALSE); - - if (!fd) { - g_string_free (sql_select, TRUE); - g_string_free (sql_from, TRUE); - g_string_free (sql_where, TRUE); - g_string_free (sql_order, TRUE); - g_string_free (sql_group, TRUE); - - g_set_error (error, TRACKER_DBUS_ERROR, 0, - "Invalid or non-existant metadata type '%s' specified", - sum_field); - return NULL; - } - - data_type = tracker_field_data_get_data_type (fd); - - if (!is_data_type_text (data_type)) { - g_string_free (sql_select, TRUE); - g_string_free (sql_from, TRUE); - g_string_free (sql_where, TRUE); - g_string_free (sql_order, TRUE); - g_string_free (sql_group, TRUE); - - g_set_error (error, TRACKER_DBUS_ERROR, 0, - "Cannot concatenate '%s': this metadata type is not text", - sum_field); - return NULL; - } - - g_string_append_printf (sql_select, ", GROUP_CONCAT (DISTINCT %s)", tracker_field_data_get_select_field (fd)); - } - - if (count_field && !(tracker_is_empty_string (count_field))) { - TrackerFieldData *fd; - - if (strcmp (count_field, "*")) { - fd = tracker_metadata_add_metadata_field (iface, service_type, &field_list, count_field, - TRUE, FALSE, FALSE); - - if (!fd) { - g_string_free (sql_select, TRUE); - g_string_free (sql_from, TRUE); - g_string_free (sql_where, TRUE); - g_string_free (sql_order, TRUE); - g_string_free (sql_group, TRUE); - - g_set_error (error, TRACKER_DBUS_ERROR, 0, - "Invalid or non-existant metadata type '%s' specified", - count_field); - return NULL; - } - - g_string_append_printf (sql_select, ", COUNT (DISTINCT %s)", tracker_field_data_get_select_field (fd)); - } else { - g_string_append_printf (sql_select, ", COUNT (DISTINCT S.ID)"); - } - } - - if (sum_field && !(tracker_is_empty_string (sum_field))) { - TrackerFieldData *fd; - TrackerFieldType data_type; - - fd = tracker_metadata_add_metadata_field (iface, service_type, &field_list, sum_field, TRUE, FALSE, FALSE); - - if (!fd) { - g_string_free (sql_select, TRUE); - g_string_free (sql_from, TRUE); - g_string_free (sql_where, TRUE); - g_string_free (sql_order, TRUE); - g_string_free (sql_group, TRUE); - - g_set_error (error, TRACKER_DBUS_ERROR, 0, - "Invalid or non-existant metadata type '%s' specified", - sum_field); - return NULL; - } - - data_type = tracker_field_data_get_data_type (fd); - - if (!is_data_type_numeric (data_type)) { - g_string_free (sql_select, TRUE); - g_string_free (sql_from, TRUE); - g_string_free (sql_where, TRUE); - g_string_free (sql_order, TRUE); - g_string_free (sql_group, TRUE); - - g_set_error (error, TRACKER_DBUS_ERROR, 0, - "Cannot sum '%s': this metadata type is not numeric", - sum_field); - return NULL; - } - - g_string_append_printf (sql_select, ", SUM (%s)", tracker_field_data_get_select_field (fd)); - } - - tracker_rdf_filter_to_sql (iface, query_condition, service_type, - &field_list, &rdf_from, &rdf_where, &actual_error); - - if (actual_error) { - g_string_free (sql_select, TRUE); - g_string_free (sql_from, TRUE); - g_string_free (sql_where, TRUE); - g_string_free (sql_order, TRUE); - g_string_free (sql_group, TRUE); - - g_propagate_error (error, actual_error); - - return NULL; - } - - g_string_append_printf (sql_from, " %s ", rdf_from); - g_string_append_printf (sql_where, " %s ", rdf_where); - - g_free (rdf_from); - g_free (rdf_where); - - str_offset = tracker_gint_to_string (offset); - str_limit = tracker_gint_to_string (metadata_sanity_check_max_hits (max_hits)); - - g_string_append_printf (sql_order, " LIMIT %s,%s", str_offset, str_limit); - - sql = g_strconcat (sql_select->str, " ", - sql_from->str, " ", - sql_where->str, " ", - sql_group->str, " ", - sql_order->str, NULL); - - g_free (str_offset); - g_free (str_limit); - - g_string_free (sql_select, TRUE); - g_string_free (sql_from, TRUE); - g_string_free (sql_where, TRUE); - g_string_free (sql_order, TRUE); - g_string_free (sql_group, TRUE); - - g_slist_foreach (field_list, (GFunc) g_object_unref, NULL); - g_slist_free (field_list); - - g_message ("Unique values query executed:\n%s", sql); - - result_set = tracker_db_interface_execute_query (iface, NULL, "%s", sql); - - g_free (sql); - - return result_set; -} - -gint -tracker_data_search_get_sum (const gchar *service_type, - const gchar *field, - const gchar *query_condition, - GError **error) -{ - TrackerDBInterface *iface; - TrackerDBResultSet *result_set = NULL; - - gint sum; - GSList *fields = NULL; - TrackerFieldData *fd = NULL; - TrackerFieldType data_type; - GString *sql_select; - GString *sql_from; - GString *sql_where; - gchar *sql; - - char *rdf_where; - char *rdf_from; - GError *actual_error = NULL; - - g_return_val_if_fail (service_type != NULL, 0); - g_return_val_if_fail (field != NULL, 0); - g_return_val_if_fail (query_condition != NULL, 0); - - if (!tracker_ontology_service_is_valid (service_type)) { - g_set_error (error, TRACKER_DBUS_ERROR, 0, - "Service_Type '%s' is invalid or has not been implemented yet", - service_type); - return 0; - } - - iface = tracker_db_manager_get_db_interface_by_service (service_type); - - sql_select = g_string_new ("SELECT "); - sql_from = g_string_new ("\nFROM Services AS S "); - sql_where = g_string_new ("\nWHERE "); - - fd = tracker_metadata_add_metadata_field (iface, service_type, &fields, field, TRUE, FALSE, FALSE); - - if (!fd) { - g_string_free (sql_select, TRUE); - g_string_free (sql_from, TRUE); - g_string_free (sql_where, TRUE); - - g_set_error (error, TRACKER_DBUS_ERROR, 0, - "Invalid or non-existant metadata type '%s' specified", - field); - return 0; - } - - data_type = tracker_field_data_get_data_type (fd); - if (!is_data_type_numeric (data_type)) { - g_string_free (sql_select, TRUE); - g_string_free (sql_from, TRUE); - g_string_free (sql_where, TRUE); - - g_set_error (error, TRACKER_DBUS_ERROR, 0, - "Cannot sum '%s': this metadata type is not numeric", - field); - return 0; - } - - g_string_append_printf (sql_select, "SUM (%s)", tracker_field_data_get_select_field (fd)); - - tracker_rdf_filter_to_sql (iface, query_condition, service_type, - &fields, &rdf_from, &rdf_where, &actual_error); - - if (actual_error) { - - g_string_free (sql_select, TRUE); - g_string_free (sql_from, TRUE); - g_string_free (sql_where, TRUE); - - g_propagate_error (error, actual_error); - return 0; - } - - g_string_append_printf (sql_from, " %s ", rdf_from); - g_string_append_printf (sql_where, " %s ", rdf_where); - - g_free (rdf_from); - g_free (rdf_where); - - sql = g_strconcat (sql_select->str, " ", sql_from->str, " ", sql_where->str, NULL); - - g_string_free (sql_select, TRUE); - g_string_free (sql_from, TRUE); - g_string_free (sql_where, TRUE); - - g_slist_foreach (fields, (GFunc) g_object_unref, NULL); - g_slist_free (fields); - - g_debug ("Sum query executed:\n%s", sql); - - result_set = tracker_db_interface_execute_query (iface, NULL, "%s", sql); - - g_free (sql); - - tracker_db_result_set_get (result_set, 0, &sum, -1); - - if (result_set) { - g_object_unref (result_set); - } - - return sum; -} - - -gint -tracker_data_search_get_count (const gchar *service_type, - const gchar *field, - const gchar *query_condition, - GError **error) -{ - TrackerDBInterface *iface; - TrackerDBResultSet *result_set = NULL; - gint count; - GSList *fields = NULL; - TrackerFieldData *fd; - - GString *sql_select; - GString *sql_from; - GString *sql_where; - gchar *sql; - - char *rdf_where; - char *rdf_from; - GError *actual_error = NULL; - - g_return_val_if_fail (service_type != NULL, 0); - g_return_val_if_fail (field != NULL, 0); - g_return_val_if_fail (query_condition != NULL, 0); - - if (!tracker_ontology_service_is_valid (service_type)) { - g_set_error (error, TRACKER_DBUS_ERROR, 0, - "Service_Type '%s' is invalid or has not been implemented yet", - service_type); - return 0; - } - - iface = tracker_db_manager_get_db_interface_by_service (service_type); - - sql_select = g_string_new ("SELECT "); - sql_from = g_string_new ("\nFROM Services AS S "); - sql_where = g_string_new ("\nWHERE "); - - if (strcmp (field, "*")) { - fd = tracker_metadata_add_metadata_field (iface, service_type, &fields, field, TRUE, FALSE, FALSE); - - if (!fd) { - g_string_free (sql_select, TRUE); - g_string_free (sql_from, TRUE); - g_string_free (sql_where, TRUE); - - g_set_error (error, TRACKER_DBUS_ERROR, 0, - "Invalid or non-existant metadata type '%s' specified", - field); - return 0; - } - - g_string_append_printf (sql_select, "COUNT (DISTINCT %s)", tracker_field_data_get_select_field (fd)); - } else { - g_string_append_printf (sql_select, "COUNT (DISTINCT S.ID)"); - } - - tracker_rdf_filter_to_sql (iface, query_condition, service_type, - &fields, &rdf_from, &rdf_where, &actual_error); - - if (actual_error) { - - g_string_free (sql_select, TRUE); - g_string_free (sql_from, TRUE); - g_string_free (sql_where, TRUE); - - g_propagate_error (error, actual_error); - return 0; - } - - g_string_append_printf (sql_from, " %s ", rdf_from); - g_string_append_printf (sql_where, " %s ", rdf_where); - - g_free (rdf_from); - g_free (rdf_where); - - sql = g_strconcat (sql_select->str, " ", sql_from->str, " ", sql_where->str, NULL); - - g_string_free (sql_select, TRUE); - g_string_free (sql_from, TRUE); - g_string_free (sql_where, TRUE); - - g_slist_foreach (fields, (GFunc) g_object_unref, NULL); - g_slist_free (fields); - - g_message ("Count query executed:\n%s", sql); - - result_set = tracker_db_interface_execute_query (iface, NULL, "%s", sql); - - g_free (sql); - - tracker_db_result_set_get (result_set, 0, &count, -1); - - if (result_set) { - g_object_unref (result_set); - } - - return count; -} - TrackerDBResultSet * tracker_data_search_metadata_in_path (const gchar *path, gchar **fields, diff --git a/src/libtracker-data/tracker-data-search.h b/src/libtracker-data/tracker-data-search.h index 50dcca2c2..3c128070f 100644 --- a/src/libtracker-data/tracker-data-search.h +++ b/src/libtracker-data/tracker-data-search.h @@ -75,52 +75,6 @@ TrackerDBResultSet *tracker_data_search_files_get_by_mime (TrackerDBInterface TrackerDBResultSet *tracker_data_search_keywords_get_list (TrackerDBInterface *iface, const gchar *service); -TrackerDBResultSet *tracker_data_search_get_unique_values (const gchar *service_type, - gchar **fields, - const gchar *query_condition, - gboolean order_desc, - gint offset, - gint max_hits, - GError **error); -gint tracker_data_search_get_sum (const gchar *service_type, - const gchar *field, - const gchar *query_condition, - GError **error); -gint tracker_data_search_get_count (const gchar *service_type, - const gchar *field, - const gchar *query_condition, - GError **error); - -TrackerDBResultSet *tracker_data_search_get_unique_values_with_count (const gchar *service_type, - gchar **fields, - const gchar *query_condition, - const gchar *count, - gboolean order_desc, - gint offset, - gint max_hits, - GError **error); - -TrackerDBResultSet *tracker_data_search_get_unique_values_with_count_and_sum (const gchar *service_type, - gchar **fields, - const gchar *query_condition, - const gchar *count, - const gchar *sum, - gboolean order_desc, - gint offset, - gint max_hits, - GError **error); - -TrackerDBResultSet *tracker_data_search_get_unique_values_with_concat_count_and_sum (const gchar *service_type, - gchar **fields, - const gchar *query_condition, - const gchar *concat_field, - const gchar *count, - const gchar *sum, - gboolean order_desc, - gint offset, - gint max_hits, - GError **error); - TrackerDBResultSet *tracker_data_search_metadata_in_path (const gchar *path, gchar **fields, GError **error); diff --git a/src/libtracker-data/tracker-rdf-query.c b/src/libtracker-data/tracker-rdf-query.c deleted file mode 100644 index 49474e2e3..000000000 --- a/src/libtracker-data/tracker-rdf-query.c +++ /dev/null @@ -1,1693 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* Tracker - indexer and metadata database engine - * Copyright (C) 2006, Mr Jamie McCracken (jamiemcc@gnome.org) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include <string.h> -#include <glib.h> - -#include <libtracker-common/tracker-log.h> -#include <libtracker-common/tracker-ontology.h> -#include <libtracker-common/tracker-type-utils.h> -#include <libtracker-common/tracker-utils.h> - -#include "tracker-data-manager.h" -#include "tracker-data-schema.h" -#include "tracker-field-data.h" -#include "tracker-rdf-query.h" - -/* RDF Query Condition - * <rdfq:Condition> - * <rdfq:and> - * <rdfq:greaterThan> - * <rdfq:Property name="File:Size" /> - * <rdf:Integer>1000000</rdf:Integer> - * </rdfq:greaterThan> - * <rdfq:equals> - * <rdfq:Property name="File:Path" /> - * <rdf:String>/home/jamie</rdf:String> - * </rdfq:equals> - * </rdfq:and> - * </rdfq:Condition> - */ - -/* Main elements */ -#define ELEMENT_RDF_CONDITION "rdfq:Condition" -#define ELEMENT_RDF_PROPERTY "rdfq:Property" - -/* Operators */ -#define ELEMENT_RDF_AND "rdfq:and" -#define ELEMENT_RDF_OR "rdfq:or" -#define ELEMENT_RDF_NOT "rdfq:not" -#define ELEMENT_RDF_EQUALS "rdfq:equals" -#define ELEMENT_RDF_GREATER_THAN "rdfq:greaterThan" -#define ELEMENT_RDF_GREATER_OR_EQUAL "rdfq:greaterOrEqual" -#define ELEMENT_RDF_LESS_THAN "rdfq:lessThan" -#define ELEMENT_RDF_LESS_OR_EQUAL "rdfq:lessOrEqual" - -/* 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" - -/* Types */ -#define ELEMENT_RDF_INTEGER "rdf:Integer" -#define ELEMENT_RDF_DATE "rdf:Date" /* Format can - * be iso 8601 - * with - * optional - * timezone - * "yyyy-mm-ddThh:mm:ss" - * or - * "yyyy-mm-ddThh:mm:ss+hh:mm" - * - most - * other - * formats are - * supported - * too - */ -#define ELEMENT_RDF_STRING "rdf:String" -#define ELEMENT_RDF_FLOAT "rdf:Float" - -#define ELEMENT_IS(name) (strcmp (element_name, (name)) == 0) - -enum { - NO_ERROR, - PARSE_ERROR, -}; - -typedef enum { - STATE_START, - STATE_CONDITION, - STATE_END_CONDITION, - STATE_PROPERTY, - STATE_AND, - STATE_END_AND, - STATE_OR, - STATE_END_OR, - STATE_NOT, - STATE_END_NOT, - STATE_EQUALS, - STATE_END_EQUALS, - STATE_GREATER_THAN, - STATE_END_GREATER_THAN, - STATE_GREATER_OR_EQUAL, - STATE_END_GREATER_OR_EQUAL, - STATE_LESS_THAN, - STATE_END_LESS_THAN, - STATE_LESS_OR_EQUAL, - 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, - STATE_END_IN_SET, - STATE_INTEGER, - STATE_END_INTEGER, - STATE_STRING, - STATE_END_STRING, - STATE_FLOAT, - STATE_END_FLOAT, - STATE_DATE, - STATE_END_DATE -} ParseState; - -typedef enum { - OP_NONE, - OP_EQUALS, - OP_GREATER, - OP_GREATER_EQUAL, - OP_LESS, - OP_LESS_EQUAL, - OP_CONTAINS, - OP_REGEX, - OP_SET, - OP_STARTS -} Operators; - -typedef enum { - LOP_NONE, - LOP_AND, - LOP_OR -} LogicOperators; - -typedef struct { - GMarkupParseContext *context; - GMarkupParser *parser; - GSList *stack; - GSList *fields; - gboolean query_okay; - gint statement_count; - LogicOperators current_logic_operator; - Operators current_operator; - gchar *current_field; - gchar *current_value; - TrackerDBInterface *iface; - GString *sql_select; - GString *sql_from; - GString *sql_where; - GString *sql_group; - GString *sql_order; - gchar *service; -} ParserData; - -static void start_element_handler (GMarkupParseContext *context, - const gchar *element_name, - const gchar **attribute_names, - const gchar **attribute_values, - gpointer user_data, - GError **error); -static void end_element_handler (GMarkupParseContext *context, - const gchar *element_name, - gpointer user_data, - GError **error); -static void text_handler (GMarkupParseContext *context, - const gchar *text, - gsize text_len, - gpointer user_data, - GError **error); -static void error_handler (GMarkupParseContext *context, - GError *error, - gpointer user_data); - -static gboolean -is_operator (ParseState state) -{ - return - state == STATE_EQUALS || - state == STATE_GREATER_THAN || - state == STATE_LESS_THAN || - state == STATE_CONTAINS || - state == STATE_IN_SET || - state == STATE_LESS_OR_EQUAL || - state == STATE_GREATER_OR_EQUAL || - state == STATE_STARTS_WITH || - state == STATE_REGEX; -} - -static gboolean -is_end_operator (ParseState state) -{ - 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_LESS_OR_EQUAL || - state == STATE_END_GREATER_OR_EQUAL || - state == STATE_END_STARTS_WITH || - state == STATE_REGEX; -} - -static gboolean -is_logic (ParseState state) -{ - return - state == STATE_AND || - state == STATE_OR || - state == STATE_NOT; -} - -static gboolean -is_end_logic (ParseState state) -{ - return - state == STATE_END_AND || - state == STATE_END_NOT || - state == STATE_END_OR; -} - -static void -set_error (GError **err, - GMarkupParseContext *context, - gint error_code, - const gchar *format, - ...) -{ - gint line, ch; - va_list args; - gchar *str; - - g_markup_parse_context_get_position (context, &line, &ch); - - va_start (args, format); - str = g_strdup_vprintf (format, args); - va_end (args); - - g_set_error (err, - tracker_rdf_error_quark (), - error_code, - "Line %d character %d: %s", - line, ch, str); - - g_free (str); -} - -static gboolean -set_error_on_fail (gboolean condition, - GMarkupParseContext *context, - const gchar *msg, - GError **err) -{ - if (!condition) { - set_error (err, context, 1, msg); - return TRUE; - } - - return FALSE; -} - -static const gchar * -get_attribute_value (const gchar *name, - const gchar **names, - const gchar **values) -{ - gint i; - - i = 0; - - while (names[i]) { - if (strcmp (name, names[i]) == 0) { - return values[i]; - } - i++; - } - - return NULL; -} - -static const gchar * -get_attribute_value_required (GMarkupParseContext *context, - const gchar *tag, - const gchar *name, - const gchar **names, - const gchar **values, - GError **error) -{ - const gchar *value; - - value = get_attribute_value (name, names, values); - - if (!value) { - set_error (error, - context, - PARSE_ERROR, - "%s must have \"%s\" attribute", - tag, name); - } - - return value; -} - -static void -push_stack (ParserData *data, ParseState state) -{ - data->stack = g_slist_prepend (data->stack, GINT_TO_POINTER (state)); -} - -static void -pop_stack (ParserData *data) -{ - g_return_if_fail (data->stack != NULL); - - data->stack = g_slist_remove (data->stack, data->stack->data); -} - -static ParseState -peek_state (ParserData *data) -{ - g_return_val_if_fail (data->stack != NULL, STATE_START); - - return GPOINTER_TO_INT (data->stack->data); -} - -static void -pop_stack_until (ParserData *data, ParseState state) -{ - while (data->stack != NULL) { - - if (state == peek_state (data)) { - pop_stack (data); - break; - } - - pop_stack (data); - } -} - -static TrackerFieldData * -add_metadata_field (ParserData *data, - const gchar *field_name, - gboolean is_select, - gboolean is_condition, - gboolean is_order) -{ - TrackerFieldData *field_data; - gboolean field_exists; - GSList *l; - - field_exists = FALSE; - field_data = NULL; - - /* Check if field is already in list */ - for (l = data->fields; l; l = l->next) { - const gchar *this_field_name; - - this_field_name = tracker_field_data_get_field_name (l->data); - - if (!this_field_name) { - continue; - } - - if (strcasecmp (this_field_name, field_name) == 0) { - field_data = l->data; - field_exists = TRUE; - - if (is_condition) { - tracker_field_data_set_is_condition (field_data, TRUE); - } - - if (is_select) { - if (!tracker_field_data_get_is_select (field_data)) { - tracker_field_data_set_is_select (field_data, TRUE); - if(tracker_field_data_get_multiple_values(field_data)) { - g_string_append_printf (data->sql_select, ", GROUP_CONCAT (%s)", - tracker_field_data_get_select_field (field_data)); - } else { - g_string_append_printf (data->sql_select, ", %s", - tracker_field_data_get_select_field (field_data)); - } - } - } - - if (is_order) { - tracker_field_data_set_is_order (field_data, TRUE); - } - - break; - } - } - - if (!field_exists) { - field_data = tracker_data_schema_get_metadata_field (data->iface, - data->service, - field_name, - g_slist_length (data->fields), - is_select, - is_condition); - if (field_data) { - data->fields = g_slist_prepend (data->fields, field_data); - if (is_select) { - if(tracker_field_data_get_multiple_values(field_data)) { - g_string_append_printf (data->sql_select, ", GROUP_CONCAT (%s)", - tracker_field_data_get_select_field (field_data)); - } else { - g_string_append_printf (data->sql_select, ", %s", - tracker_field_data_get_select_field (field_data)); - } - } - - if (is_order) { - tracker_field_data_set_is_order (field_data, TRUE); - } - } - } - - return field_data; -} - -static void -start_element_handler (GMarkupParseContext *context, - const gchar *element_name, - const gchar **attribute_names, - const gchar **attribute_values, - gpointer user_data, - GError **error) -{ - ParserData *data; - ParseState state; - - data = user_data; - state = peek_state (data); - - if (ELEMENT_IS (ELEMENT_RDF_CONDITION)) { - if (set_error_on_fail (state == STATE_START, - context, - "Condition element not expected here", - error)) { - return; - } - - push_stack (data, STATE_CONDITION); - - } else if (ELEMENT_IS (ELEMENT_RDF_PROPERTY)) { - const char *name; - - if (set_error_on_fail (is_operator (state), - context, - "Property element not expected here", - error)) { - return; - } - - name = get_attribute_value_required (context, - "<rdfq:Property>", "name", - attribute_names, attribute_values, - error); - - if (!name) { - return; - } else { - if (data->current_operator == OP_NONE) { - set_error (error, - context, - PARSE_ERROR, - "no operator found for Property \"%s\"", - name); - return; - } - - data->current_field = g_strdup (name); - - push_stack (data, STATE_PROPERTY); - } - } else if (ELEMENT_IS (ELEMENT_RDF_AND)) { - if (set_error_on_fail (state == STATE_CONDITION || - is_logic (state) || - is_end_logic (state) || - is_end_operator (state), - context, - "AND element not expected here", - error)) { - return; - } - - if (data->statement_count >= 1) { - if (data->current_logic_operator == LOP_AND) { - data->sql_where = g_string_append (data->sql_where, - " AND "); - } else { - if (data->current_logic_operator == LOP_OR) { - data->sql_where = g_string_append (data->sql_where, - " OR "); - } - } - } - - data->statement_count = 0; - data->sql_where = g_string_append (data->sql_where, " ( "); - data->current_logic_operator = LOP_AND; - push_stack (data, STATE_AND); - } else if (ELEMENT_IS (ELEMENT_RDF_OR)) { - if (set_error_on_fail (state == STATE_CONDITION || - is_logic (state) || - is_end_logic (state) || - is_end_operator (state), - context, - "OR element not expected here", - error)) { - return; - } - - if (data->statement_count >= 1) { - if (data->current_logic_operator == LOP_AND) { - data->sql_where = g_string_append (data->sql_where, - " AND "); - } else { - if (data->current_logic_operator == LOP_OR) { - data->sql_where = g_string_append (data->sql_where, - " OR "); - } - } - } - - data->statement_count = 0; - data->sql_where = g_string_append (data->sql_where, " ( "); - data->current_logic_operator = LOP_OR; - push_stack (data, STATE_OR); - - } else if (ELEMENT_IS (ELEMENT_RDF_NOT)) { - if (set_error_on_fail (state == STATE_CONDITION || - is_logic (state) || - is_end_logic (state) || - is_end_operator (state), - context, - "NOT element not expected here", - error)) { - return; - } - - if (data->statement_count >= 1) { - if (data->current_logic_operator == LOP_AND) { - data->sql_where = g_string_append (data->sql_where, - " AND "); - } else { - if (data->current_logic_operator == LOP_OR) { - data->sql_where = g_string_append (data->sql_where, - " OR "); - } - } - } - - data->statement_count = 0; - data->sql_where = g_string_append (data->sql_where, " NOT ( "); - push_stack (data, STATE_NOT); - - } else if (ELEMENT_IS (ELEMENT_RDF_EQUALS)) { - if (set_error_on_fail (state == STATE_CONDITION || - is_logic (state) || - ((data->current_logic_operator == LOP_AND || - data->current_logic_operator == LOP_OR) && - is_end_operator (state)), - context, - "EQUALS element not expected here", - error)) { - return; - } - - data->current_operator = OP_EQUALS; - push_stack (data, STATE_EQUALS); - - } else if (ELEMENT_IS (ELEMENT_RDF_GREATER_THAN)) { - - if (set_error_on_fail (state == STATE_CONDITION || - is_logic (state) || - ((data->current_logic_operator == LOP_AND || - data->current_logic_operator == LOP_OR) && - is_end_operator (state)), - context, - "GREATERTHAN element not expected here", - error)) { - return; - } - - data->current_operator = OP_GREATER; - push_stack (data, STATE_GREATER_THAN); - } else if (ELEMENT_IS (ELEMENT_RDF_GREATER_OR_EQUAL)) { - if (set_error_on_fail (state == STATE_CONDITION || - is_logic (state) || - ((data->current_logic_operator == LOP_AND || - data->current_logic_operator == LOP_OR) && - is_end_operator (state)), - context, - "GREATEROREQUAL element not expected here", - error)) { - return; - } - - data->current_operator = OP_GREATER_EQUAL; - push_stack (data, STATE_GREATER_OR_EQUAL); - } else if (ELEMENT_IS (ELEMENT_RDF_LESS_THAN )) { - if (set_error_on_fail (state == STATE_CONDITION || - is_logic (state) || - ((data->current_logic_operator == LOP_AND || - data->current_logic_operator == LOP_OR) && - is_end_operator (state)), - context, - "LESSTHAN element not expected here", - error)) { - return; - } - - data->current_operator = OP_LESS; - push_stack (data, STATE_LESS_THAN); - } else if (ELEMENT_IS (ELEMENT_RDF_LESS_OR_EQUAL)) { - if (set_error_on_fail (state == STATE_CONDITION || - is_logic (state) || - ((data->current_logic_operator == LOP_AND || - data->current_logic_operator == LOP_OR) && - is_end_operator (state)), - context, - "LESSOREQUAL element not expected here", - error)) { - return; - } - - data->current_operator = OP_LESS_EQUAL; - push_stack (data, STATE_LESS_OR_EQUAL); - } else if (ELEMENT_IS (ELEMENT_RDF_CONTAINS)) { - if (set_error_on_fail (state == STATE_CONDITION || - is_logic (state) || - ((data->current_logic_operator == LOP_AND || - data->current_logic_operator == LOP_OR) && - is_end_operator (state)), - context, - "CONTAINS element not expected here", - error)) { - return; - } - - 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 || - data->current_logic_operator == LOP_OR) && - 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) || - ((data->current_logic_operator == LOP_AND || - data->current_logic_operator == LOP_OR) && - is_end_operator (state)), - context, - "STARTSWITH element not expected here", - error)) { - return; - } - - data->current_operator = OP_STARTS; - push_stack (data, STATE_STARTS_WITH); - } else if (ELEMENT_IS (ELEMENT_RDF_IN_SET)) { - if (set_error_on_fail (state == STATE_CONDITION || - is_logic (state) || - ((data->current_logic_operator == LOP_AND || - data->current_logic_operator == LOP_OR) && - is_end_operator (state)), - context, - "IN SET element not expected here", - error)) { - return; - } - - data->current_operator = OP_SET; - push_stack (data, STATE_IN_SET); - } else if (ELEMENT_IS (ELEMENT_RDF_INTEGER)) { - if (set_error_on_fail (state == STATE_PROPERTY, - context, - "INTEGER element not expected here", - error)) { - return; - } - - push_stack (data, STATE_INTEGER); - } else if (ELEMENT_IS (ELEMENT_RDF_DATE)) { - if (set_error_on_fail (state == STATE_PROPERTY, - context, - "DATE element not expected here", - error)) { - return; - } - - push_stack (data, STATE_DATE); - } else if (ELEMENT_IS (ELEMENT_RDF_STRING)) { - if (set_error_on_fail (state == STATE_PROPERTY, - context, - "STRING element not expected here", - error)) { - return; - } - - push_stack (data, STATE_STRING); - } else if (ELEMENT_IS (ELEMENT_RDF_FLOAT)) { - if (set_error_on_fail (state == STATE_PROPERTY, - context, - "FLOAT element not expected here", - error)) { - return; - } - - push_stack (data, STATE_FLOAT); - } -} - -static gchar * -get_value (const gchar *value, gboolean quote) -{ - gchar *escaped; - gchar *ret; - - escaped = tracker_escape_string(value); - if (quote) { - ret = g_strconcat (" '", escaped, "' ", NULL); - } else { - ret = g_strdup (escaped); - } - - g_free (escaped); - - return ret; -} - -static gboolean -build_sql (ParserData *data) -{ - TrackerFieldData *field_data; - ParseState state; - gchar *avalue, *value, *sub; - const gchar *where_field; - GString *str; - gchar **s; - - g_return_val_if_fail (data->current_field && - data->current_operator != OP_NONE && - data->current_value, - FALSE); - - str = g_string_new (""); - - data->statement_count++; - - state = peek_state (data); - - avalue = get_value (data->current_value, (state != STATE_END_DATE && - state != STATE_END_INTEGER && - state != STATE_END_FLOAT)); - - field_data = add_metadata_field (data, data->current_field, FALSE, TRUE, FALSE); - - if (!field_data) { - g_free (avalue); - g_free (data->current_field); - g_free (data->current_value); - data->current_field = NULL; - data->current_value = NULL; - return FALSE; - } - - if (tracker_field_data_get_data_type (field_data) == TRACKER_FIELD_TYPE_DATE) { - gchar *bvalue; - gint cvalue; - - bvalue = tracker_date_format (avalue); - cvalue = tracker_string_to_date (bvalue); - value = tracker_gint_to_string (cvalue); - g_free (bvalue); - } else { - value = g_strdup (avalue); - } - - g_free (avalue); - - if (data->statement_count > 1) { - if (data->current_logic_operator == LOP_AND) { - data->sql_where = g_string_append (data->sql_where, "\n AND "); - } else { - if (data->current_logic_operator == LOP_OR) { - data->sql_where = g_string_append (data->sql_where, "\n OR "); - } - } - } - - where_field = tracker_field_data_get_where_field (field_data); - - switch (data->current_operator) { - case OP_EQUALS: - sub = strchr (data->current_value, '*'); - if (sub) { - g_string_append_printf (str, " (%s glob '%s') ", - where_field, - data->current_value); - } else { - if ( !strlen(value) || (strcmp(value, " '' ") == 0) ) { - tracker_field_data_set_needs_null (field_data, TRUE); - g_string_append_printf (str, " ((%s = '') OR %s IS NULL) ", - where_field, - where_field); - } else { - g_string_append_printf (str, " (%s = %s) ", - where_field, - value); - } - } - break; - - case OP_GREATER: - g_string_append_printf (str, " (%s > %s) ", - where_field, - value); - break; - - case OP_GREATER_EQUAL: - g_string_append_printf (str, " (%s >= %s) ", - where_field, - value); - break; - - case OP_LESS: - g_string_append_printf (str, " (%s < %s) ", - where_field, - value); - break; - - case OP_LESS_EQUAL: - g_string_append_printf (str, " (%s <= %s) ", - where_field, - value); - break; - - case OP_CONTAINS: - sub = strchr (data->current_value, '*'); - - if (sub) { - g_string_append_printf (str, " (%s like '%%%%%s%%%%') ", - where_field, - data->current_value); - } else { - g_string_append_printf (str, " (%s like '%%%%%s%%%%') ", - where_field, - data->current_value); - } - break; - - case OP_STARTS: - sub = strchr (data->current_value, '*'); - - if (sub) { - g_string_append_printf (str, " (%s like '%s') ", - where_field, - data->current_value); - } else { - g_string_append_printf (str, " (%s like '%s%%%%') ", - where_field, - data->current_value); - } - break; - - case OP_REGEX: - g_string_append_printf (str, " (%s REGEXP '%s') ", - where_field, - data->current_value); - break; - - case OP_SET: - s = g_strsplit (data->current_value, ",", 0); - - if (s && s[0]) { - gchar **p; - - g_string_append_printf (str, " (%s in ('%s'", - where_field, - s[0]); - - for (p = s + 1; *p; p++) { - g_string_append_printf (str, ",'%s'", *p); - } - - g_string_append_printf (str, ") ) " ); - } - break; - - default: - case OP_NONE: - break; - } - - data->sql_where = g_string_append (data->sql_where, str->str); - - g_string_free (str, TRUE); - - g_free (data->current_field); - data->current_field = NULL; - - g_free (data->current_value); - data->current_value = NULL; - - g_free (value); - - return TRUE; -} - -static void -end_element_handler (GMarkupParseContext *context, - const gchar *element_name, - gpointer user_data, - GError **error) -{ - ParserData *data; - - data = user_data; - - if (ELEMENT_IS (ELEMENT_RDF_CONDITION)) { - - push_stack (data, STATE_END_CONDITION); - data->query_okay = TRUE; - - } else if (ELEMENT_IS (ELEMENT_RDF_AND)) { - - data->sql_where = g_string_append (data->sql_where, " ) "); - - pop_stack_until (data, STATE_AND); - - if (peek_state (data) != STATE_AND) { - if (peek_state (data) == STATE_OR) { - data->current_logic_operator = LOP_OR; - } else { - data->current_logic_operator = LOP_NONE; - } - } - - } else if (ELEMENT_IS (ELEMENT_RDF_OR)) { - - data->sql_where = g_string_append (data->sql_where, " ) "); - - pop_stack_until (data, STATE_OR); - - if (peek_state (data) != STATE_OR) { - if (peek_state (data) == STATE_AND) { - data->current_logic_operator = LOP_AND; - } else { - data->current_logic_operator = LOP_NONE; - } - } - - } else if (ELEMENT_IS (ELEMENT_RDF_NOT)) { - - data->sql_where = g_string_append (data->sql_where, " ) "); - pop_stack_until (data, STATE_NOT); - - - } else if (ELEMENT_IS (ELEMENT_RDF_EQUALS)) { - - if (!build_sql (data)) { - set_error (error, context, 1, "parse error"); - return; - } - push_stack (data, STATE_END_EQUALS); - - } else if (ELEMENT_IS (ELEMENT_RDF_GREATER_THAN)) { - - if (!build_sql (data)) { - set_error (error, context, 1, "parse error"); - return; - } - - push_stack (data, STATE_END_GREATER_THAN); - - } else if (ELEMENT_IS (ELEMENT_RDF_GREATER_OR_EQUAL)) { - - if (!build_sql (data)) { - set_error (error, context, 1, "parse error"); - return; - } - - push_stack (data, STATE_END_GREATER_OR_EQUAL); - - } else if (ELEMENT_IS (ELEMENT_RDF_LESS_THAN )) { - - if (!build_sql (data)) { - set_error (error, context, 1, "parse error"); - return; - } - - push_stack (data, STATE_END_LESS_THAN ); - - } else if (ELEMENT_IS (ELEMENT_RDF_LESS_OR_EQUAL )) { - - if (!build_sql (data)) { - set_error (error, context, 1, "parse error"); - return; - } - - push_stack (data, STATE_END_LESS_OR_EQUAL ); - - - } else if (ELEMENT_IS (ELEMENT_RDF_CONTAINS)) { - - if (!build_sql (data)) { - set_error (error, context, 1, "parse error"); - return; - } - - 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)) { - - if (!build_sql (data)) { - set_error (error, context, 1, "parse error"); - return; - } - - push_stack (data, STATE_END_STARTS_WITH); - - } else if (ELEMENT_IS (ELEMENT_RDF_IN_SET)) { - - if (!build_sql (data)) { - set_error (error, context, 1, "parse error"); - return; - } - - push_stack (data, STATE_END_IN_SET); - - - } else if (ELEMENT_IS (ELEMENT_RDF_INTEGER)) { - - push_stack (data, STATE_END_INTEGER); - - - } else if (ELEMENT_IS (ELEMENT_RDF_DATE)) { - - push_stack (data, STATE_END_DATE); - - - } else if (ELEMENT_IS (ELEMENT_RDF_STRING)) { - - push_stack (data, STATE_END_STRING); - - } else if (ELEMENT_IS (ELEMENT_RDF_FLOAT)) { - - push_stack (data, STATE_END_FLOAT); - } -} - -static void -text_handler (GMarkupParseContext *context, - const gchar *text, - gsize text_len, - gpointer user_data, - GError **error) -{ - ParserData *data; - ParseState state; - - data = user_data; - state = peek_state (data); - - switch (state) { - - case STATE_INTEGER: - case STATE_STRING: - case STATE_DATE: - case STATE_FLOAT: - - data->current_value = g_strstrip (g_strndup (text, text_len)); - break; - default: - break; - } -} - -static void -error_handler (GMarkupParseContext *context, - GError *error, - gpointer user_data) -{ - g_message ("in rdf query parse: %s", error->message); -} - -static GString * -get_select_header (const char *service) -{ - GString *result; - int type; - - result = g_string_new (""); - type = tracker_ontology_get_service_id_by_name (service); - - switch (type) { - - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - case 8: - g_string_append_printf (result, " Select DISTINCT (S.Path || '%s' || S.Name) as uri, GetServiceName(S.ServiceTypeID) as stype ", G_DIR_SEPARATOR_S); - break; - - default : - g_string_append_printf (result, " Select DISTINCT (S.Path || '%s' || S.Name) as uri, GetServiceName(S.ServiceTypeID) as stype ", G_DIR_SEPARATOR_S); - break; - } - - return result; - -} - -static void -append_where_header (GString *string, const char *service) -{ - int type; - - type = tracker_ontology_get_service_id_by_name (service); - - /* Sqlite is currently unable to perform any ORDER or GROUP BY on split index, so we try not to split - unless necessary on ServiceType FIXME remove when not needed anymore (ie. fixed in sqlite) */ - - switch (type) { - case 2: - /* FILES */ - case 12: - /* EMAILS */ - g_string_append_printf (string, " (S.ServiceTypeID in (select TypeId from ServiceTypes where TypeName = '%s' or Parent = '%s')) ", service, service); - break; - default: - g_string_append_printf (string, " (S.ServiceTypeID=%d) ", type); - } - - /* only search for enabled items */ - g_string_append_printf (string, "AND (S.Enabled = 1) "); - - /* only search for items on enabled volumes */ - g_string_append_printf (string, "AND (S.AuxilaryID = 0 OR S.AuxilaryID IN (SELECT VolumeID FROM Volumes WHERE Enabled = 1)) "); -} - -GQuark -tracker_rdf_error_quark (void) -{ - return g_quark_from_static_string (TRACKER_RDF_ERROR_DOMAIN); -} - -gchar * -tracker_rdf_query_to_sql (TrackerDBInterface *iface, - const gchar *query, - const gchar *service, - const gchar **fields, - gint field_count, - const gchar *search_text, - const gchar **keywords, - gint keyword_count, - gboolean sort_by_service, - const gchar **sort_fields, - gint sort_field_count, - gboolean sort_desc, - gint offset, - gint limit, - GError **error) -{ - ParserData data; - gchar *result; - const gchar *table_name; - gboolean do_search = FALSE; - - g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL); - g_return_val_if_fail (query != NULL, NULL); - g_return_val_if_fail (service != NULL, NULL); - g_return_val_if_fail (fields != NULL, NULL); - g_return_val_if_fail (search_text != NULL, NULL); - g_return_val_if_fail (keywords != NULL, NULL); - - memset (&data, 0, sizeof (data)); - data.iface = iface; - data.statement_count = 0; - data.service = (gchar*) service; - data.sql_select = get_select_header (service); - - if (field_count > 0) { - gint i; - - for (i = 0; i < field_count; i++) { - TrackerFieldData *field_data; - - field_data = add_metadata_field (&data, fields[i], TRUE, FALSE, FALSE); - - if (!field_data) { - g_set_error (error, - tracker_rdf_error_quark (), - PARSE_ERROR, - "RDF Query failed, field:'%s' not found", - fields[i]); - - g_slist_foreach (data.fields, - (GFunc) g_object_unref, - NULL); - g_slist_free (data.fields); - g_string_free (data.sql_select, TRUE); - - return NULL; - } - } - } - - table_name = "Services"; - - data.sql_from = g_string_new (""); - - if (!tracker_is_empty_string (search_text)) { - do_search = TRUE; - g_string_append_printf (data.sql_from, - "\n FROM %s AS S INNER JOIN SearchResults1 M ON S.ID = M.SID ", - table_name); - } else { - g_string_append_printf (data.sql_from, - "\n FROM %s AS S ", - table_name); - } - - data.sql_where = g_string_new ("\nWHERE "); - - append_where_header(data.sql_where, service); - - if (keyword_count > 0) { - guint keyword; - GHashTable *table = NULL; - GHashTableIter iter; - GList *list = NULL; - gchar *key; - - table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); - - for (keyword = 0; keyword < (guint) keyword_count; keyword++) { - gchar *full; - gchar *sep; - gchar *value; - - full = g_strdup (keywords[keyword]); - - sep = strchr (full, '='); - if (sep) { - sep[0]= '\0'; - key = full; - value = sep+1; - - } else { - key = g_strdup ("DC:Keywords"); - value = g_strdup (keywords[keyword]); - } - - list = g_hash_table_lookup (table, key); - list = g_list_prepend (list, tracker_escape_string(value)); - g_hash_table_insert (table, g_strdup (key), list); - - g_free (full); - } - - g_hash_table_iter_init (&iter, table); - while (g_hash_table_iter_next (&iter, (gpointer) &key, (gpointer) &list)) { - - GList *l = NULL; - gchar *keyword_metadata; - - keyword_metadata = tracker_data_schema_metadata_field_get_related_names (iface, key); - - for (l = list; l; l = l->next) { - g_string_append_printf (data.sql_where, - " AND (S.ID IN (SELECT ServiceID FROM ServiceKeywordMetaData WHERE MetaDataID in (%s) AND MetadataValue = '%s')) ", - keyword_metadata, - (gchar*) l->data); - } - - g_list_foreach(list, (GFunc)g_free, NULL); - g_list_free (list); - g_free (keyword_metadata); - - } - g_hash_table_destroy (table); - } - - if (strlen (query) >= 10) { - g_string_append_printf (data.sql_where, "AND "); - } - - data.sql_group = g_string_new (" GROUP BY S.ID "); - - if (limit < 1) { - limit = 1024; - } - - data.sql_order = g_string_new (""); - - if (sort_by_service) { - if (do_search) { - g_string_append_printf (data.sql_order,"M.Score desc, S.ServiceTypeID, uri "); - } else { - g_string_append_printf (data.sql_order,"S.ServiceTypeID, uri "); - } - } else { - if (do_search) { - g_string_append_printf (data.sql_order,"M.Score desc "); - } else { - /* Nothing */ - } - - } - - if (sort_field_count > 0) { - gint i; - - for (i = 0; i < sort_field_count; i++) { - TrackerFieldData *field_data; - - field_data = add_metadata_field (&data, sort_fields[i], FALSE, FALSE, TRUE); - - if (!field_data) { - g_set_error (error, - tracker_rdf_error_quark (), - PARSE_ERROR, - "RDF Query failed, sort field:'%s' not found", - sort_fields[i]); - g_slist_foreach (data.fields, - (GFunc) g_object_unref, - NULL); - g_slist_free (data.fields); - g_string_free (data.sql_select, TRUE); - g_string_free (data.sql_where, TRUE); - g_string_free (data.sql_group, TRUE); - g_string_free (data.sql_order, TRUE); - - return NULL; - } - - if (i) { - g_string_append_printf (data.sql_order, ", "); - } - - g_string_append_printf (data.sql_order, "%s %s", - tracker_field_data_get_order_field (field_data), - sort_desc ? "DESC" : "ASC"); - } - } - - if (!tracker_is_empty_string (data.sql_order->str)) { - g_string_prepend (data.sql_order, "\n ORDER BY "); - } - - g_string_append_printf (data.sql_order, " LIMIT "); - - g_string_append_printf (data.sql_order, "%d,%d ", offset, limit); - - data.parser = g_new0 (GMarkupParser, 1); - data.parser->start_element = start_element_handler; - data.parser->text = text_handler; - data.parser->end_element = end_element_handler; - data.parser->error = error_handler; - - data.current_operator = OP_NONE; - data.current_logic_operator = LOP_NONE; - data.query_okay = FALSE; - - data.context = g_markup_parse_context_new (data.parser, 0, &data, NULL); - - push_stack (&data, STATE_START); - - if (!g_markup_parse_context_parse (data.context, query, -1, error)) { - result = NULL; - - g_string_free (data.sql_select, TRUE); - g_string_free (data.sql_from, TRUE); - g_string_free (data.sql_where, TRUE); - g_string_free (data.sql_group, TRUE); - g_string_free (data.sql_order, TRUE); - } else { - GSList *l; - - for (l = data.fields; l; l = l->next) { - if (!tracker_field_data_get_is_condition (l->data)) { - if (tracker_field_data_get_is_select (l->data) && - tracker_field_data_get_needs_join (l->data)) { - g_string_append_printf (data.sql_from, - "\n LEFT OUTER JOIN %s %s ON (S.ID = %s.ServiceID and %s.MetaDataID = %s) ", - tracker_field_data_get_table_name (l->data), - tracker_field_data_get_alias (l->data), - tracker_field_data_get_alias (l->data), - tracker_field_data_get_alias (l->data), - tracker_field_data_get_id_field (l->data)); - } else if (tracker_field_data_get_is_order (l->data) && - tracker_field_data_get_needs_collate (l->data)) { - g_string_append_printf (data.sql_from, - "\n LEFT OUTER JOIN %s %s ON (S.ID = %s.ServiceID and %s.MetaDataID = %s) ", - tracker_field_data_get_table_name (l->data), - tracker_field_data_get_alias (l->data), - tracker_field_data_get_alias (l->data), - tracker_field_data_get_alias (l->data), - tracker_field_data_get_id_field (l->data)); - } - } else { - gchar *related_metadata; - - related_metadata = tracker_data_schema_metadata_field_get_related_names (iface, - tracker_field_data_get_field_name (l->data)); - if (tracker_field_data_get_needs_null (l->data)) { - g_string_append_printf (data.sql_from, - "\n LEFT OUTER JOIN %s %s ON (S.ID = %s.ServiceID and %s.MetaDataID in (%s)) ", - tracker_field_data_get_table_name (l->data), - tracker_field_data_get_alias (l->data), - tracker_field_data_get_alias (l->data), - tracker_field_data_get_alias (l->data), - related_metadata); - } else { - g_string_append_printf (data.sql_from, - "\n INNER JOIN %s %s ON (S.ID = %s.ServiceID and %s.MetaDataID in (%s)) ", - tracker_field_data_get_table_name (l->data), - tracker_field_data_get_alias (l->data), - tracker_field_data_get_alias (l->data), - tracker_field_data_get_alias (l->data), - related_metadata); - } - g_free (related_metadata); - } - } - - result = g_strconcat (data.sql_select->str, - " ", - data.sql_from->str, - " ", - data.sql_where->str, - " ", - data.sql_group->str, - " ", - data.sql_order->str, - NULL); - - g_string_free (data.sql_select, TRUE); - g_string_free (data.sql_from, TRUE); - g_string_free (data.sql_where, TRUE); - g_string_free (data.sql_group, TRUE); - g_string_free (data.sql_order, TRUE); - } - - g_slist_foreach (data.fields, (GFunc) g_object_unref, NULL); - g_slist_free (data.fields); - - g_slist_free (data.stack); - g_markup_parse_context_free (data.context); - - if (data.current_field) { - g_free (data.current_field); - } - - if (data.current_value) { - g_free (data.current_value); - } - - g_free (data.parser); - - return result; -} - - -/* - * The following function turns an rdf query into a filter that can be used for example - * for getting unique values of a field with a certain query. - * FIXME It is not pretty. The calling function needs to define Services S that is joined in this method. - */ - -void -tracker_rdf_filter_to_sql (TrackerDBInterface *iface, - const char *query, - const char *service, - GSList **fields, - char **from, - char **where, - GError **error) -{ - ParserData data; - - g_return_if_fail (TRACKER_IS_DB_INTERFACE (iface)); - g_return_if_fail (service != NULL); - g_return_if_fail (from != NULL); - g_return_if_fail (where != NULL); - - memset (&data, 0, sizeof (data)); - data.iface = iface; - data.statement_count = 0; - data.service = (char *) service; - - data.sql_from = g_string_new (""); - data.sql_where = g_string_new (""); - append_where_header (data.sql_where, service); - - data.fields = *fields; - - if (strlen (query) >= 10) { - g_string_append (data.sql_where, "AND "); - } - - data.parser = g_new0 (GMarkupParser, 1); - data.parser->start_element = start_element_handler; - data.parser->text = text_handler; - data.parser->end_element = end_element_handler; - data.parser->error = error_handler; - - data.current_operator = OP_NONE; - data.current_logic_operator = LOP_NONE; - data.query_okay = FALSE; - - data.context = g_markup_parse_context_new (data.parser, 0, &data, NULL); - - push_stack (&data, STATE_START); - - if ( (query != NULL) && (!g_markup_parse_context_parse (data.context, query, -1, error))) { - - *from = NULL; - *where = NULL; - - g_string_free (data.sql_from, TRUE); - g_string_free (data.sql_where, TRUE); - - } else { - GSList *l; - - for (l = data.fields; l; l = l->next) { - if (!tracker_field_data_get_is_condition (l->data)) { - if (tracker_field_data_get_is_select (l->data) && - tracker_field_data_get_needs_join (l->data)) { - g_string_append_printf (data.sql_from, - "\n LEFT OUTER JOIN %s %s ON (S.ID = %s.ServiceID and %s.MetaDataID = %s) ", - tracker_field_data_get_table_name (l->data), - tracker_field_data_get_alias (l->data), - tracker_field_data_get_alias (l->data), - tracker_field_data_get_alias (l->data), - tracker_field_data_get_id_field (l->data)); - } else if (tracker_field_data_get_is_order (l->data) && - tracker_field_data_get_needs_collate (l->data)) { - g_string_append_printf (data.sql_from, - "\n LEFT OUTER JOIN %s %s ON (S.ID = %s.ServiceID and %s.MetaDataID = %s) ", - tracker_field_data_get_table_name (l->data), - tracker_field_data_get_alias (l->data), - tracker_field_data_get_alias (l->data), - tracker_field_data_get_alias (l->data), - tracker_field_data_get_id_field (l->data)); - } - } else { - gchar *related_metadata; - - related_metadata = tracker_data_schema_metadata_field_get_related_names (iface, - tracker_field_data_get_field_name (l->data)); - if (tracker_field_data_get_needs_null (l->data)) { - g_string_append_printf (data.sql_from, - "\n LEFT OUTER JOIN %s %s ON (S.ID = %s.ServiceID and %s.MetaDataID in (%s)) ", - tracker_field_data_get_table_name (l->data), - tracker_field_data_get_alias (l->data), - tracker_field_data_get_alias (l->data), - tracker_field_data_get_alias (l->data), - related_metadata); - } else { - g_string_append_printf (data.sql_from, - "\n INNER JOIN %s %s ON (S.ID = %s.ServiceID and %s.MetaDataID in (%s)) ", - tracker_field_data_get_table_name (l->data), - tracker_field_data_get_alias (l->data), - tracker_field_data_get_alias (l->data), - tracker_field_data_get_alias (l->data), - related_metadata); - } - - g_free (related_metadata); - } - } - - - *from = g_strdup (data.sql_from->str); - *where = g_strdup (data.sql_where->str); - g_string_free (data.sql_from, TRUE); - g_string_free (data.sql_where, TRUE); - - - } - - *fields = data.fields; - - g_slist_free (data.stack); - g_markup_parse_context_free (data.context); - - if (data.current_field) { - g_free (data.current_field); - } - - if (data.current_value) { - g_free (data.current_value); - } - - g_free (data.parser); -} - -gchar * -tracker_rdf_query_for_attr_value (const gchar *field, - const gchar *value) -{ - TrackerField *field_def; - const gchar *rdf_type = NULL; - gchar *rdf_query; - - field_def = tracker_ontology_get_field_by_name (field); - - if (!field_def) { - return NULL; - } - - switch (tracker_field_get_data_type (field_def)) { - case TRACKER_FIELD_TYPE_KEYWORD: - case TRACKER_FIELD_TYPE_INDEX: - case TRACKER_FIELD_TYPE_FULLTEXT: - case TRACKER_FIELD_TYPE_STRING: - rdf_type = "rdf:String"; - break; - - case TRACKER_FIELD_TYPE_INTEGER: - case TRACKER_FIELD_TYPE_DOUBLE: - case TRACKER_FIELD_TYPE_DATE: - rdf_type = "rdf:Integer"; - break; - - default: - case TRACKER_FIELD_TYPE_BLOB: - case TRACKER_FIELD_TYPE_STRUCT: - case TRACKER_FIELD_TYPE_LINK: - g_warning ("Unsupport field type for property %s", - tracker_field_get_name (field_def)); - return NULL; - } - - rdf_query = g_strconcat ("<rdfq:Condition>", - " <rdfq:equals>", - " <rdfq:Property name=\"", field, "\"/>", - " <", rdf_type, ">", value, "</", rdf_type, ">", - " </rdfq:equals>" - "</rdfq:Condition>", - NULL); - - return rdf_query; -} diff --git a/src/libtracker-data/tracker-rdf-query.h b/src/libtracker-data/tracker-rdf-query.h deleted file mode 100644 index 51684859a..000000000 --- a/src/libtracker-data/tracker-rdf-query.h +++ /dev/null @@ -1,62 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Copyright (C) 2006, Mr Jamie McCracken (jamiemcc@gnome.org) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __TRACKERD_RDF_QUERY_H__ -#define __TRACKERD_RDF_QUERY_H__ - -#include <glib.h> - -#include <libtracker-db/tracker-db-manager.h> - -G_BEGIN_DECLS - -#define TRACKER_RDF_ERROR_DOMAIN "TrackerRDF" -#define TRACKER_RDF_ERROR tracker_rdf_error_quark() - -GQuark tracker_rdf_error_quark (void); - -gchar *tracker_rdf_query_to_sql (TrackerDBInterface *iface, - const gchar *query, - const gchar *service, - const gchar **fields, - gint field_count, - const gchar *search_text, - const gchar **keywords, - gint keyword_count, - gboolean sort_by_service, - const gchar **sort_fields, - gint sort_field_count, - gboolean sort_desc, - gint offset, - gint limit, - GError **error); -void tracker_rdf_filter_to_sql (TrackerDBInterface *iface, - const gchar *query, - const gchar *service, - GSList **fields, - gchar **from, - gchar **where, - GError **error); -gchar *tracker_rdf_query_for_attr_value (const gchar *field, - const gchar *value); - -G_END_DECLS - -#endif /* __TRACKERD_RDF_QUERY_H__ */ diff --git a/src/libtracker/tracker.c b/src/libtracker/tracker.c index 8a3a729e1..62d3ce2af 100644 --- a/src/libtracker/tracker.c +++ b/src/libtracker/tracker.c @@ -538,84 +538,6 @@ tracker_metadata_get_registered_classes (TrackerClient *client, GError **error) } -GPtrArray * -tracker_metadata_get_unique_values (TrackerClient *client, ServiceType service, char **meta_types, char *query, gboolean descending, int offset, int max_hits, GError **error) -{ - GPtrArray *table; - const char *service_str = tracker_service_types[service]; - - if (!org_freedesktop_Tracker_Metadata_get_unique_values (client->proxy_metadata, service_str, (const char **)meta_types, query, descending, offset, max_hits, &table, &*error)) { - return NULL; - } - - return table; -} - -int -tracker_metadata_get_sum (TrackerClient *client, ServiceType service, char *field, char *query, GError **error) -{ - int sum; - const char *service_str = tracker_service_types[service]; - - if (!org_freedesktop_Tracker_Metadata_get_sum (client->proxy_metadata, service_str, field, query, &sum, &*error)) { - return -1; - } - - return sum; -} - -int -tracker_metadata_get_count (TrackerClient *client, ServiceType service, char *field, char *query, GError **error) -{ - int count; - const char *service_str = tracker_service_types[service]; - - if (!org_freedesktop_Tracker_Metadata_get_count (client->proxy_metadata, service_str, field, query, &count, &*error)) { - return -1; - } - - return count; - -} - -GPtrArray * -tracker_metadata_get_unique_values_with_count (TrackerClient *client, ServiceType service, char **meta_types, char *query, char *count, gboolean descending, int offset, int max_hits, GError **error) -{ - GPtrArray *table; - const char *service_str = tracker_service_types[service]; - - if (!org_freedesktop_Tracker_Metadata_get_unique_values_with_count (client->proxy_metadata, service_str, (const char **)meta_types, query, count, descending, offset, max_hits, &table, &*error)) { - return NULL; - } - - return table; -} - -GPtrArray * -tracker_metadata_get_unique_values_with_count_and_sum (TrackerClient *client, ServiceType service, char **meta_types, char *query, char *count, char *sum, gboolean descending, int offset, int max_hits, GError **error) -{ - GPtrArray *table; - const char *service_str = tracker_service_types[service]; - - if (!org_freedesktop_Tracker_Metadata_get_unique_values_with_count_and_sum (client->proxy_metadata, service_str, (const char **)meta_types, query, count, sum, descending, offset, max_hits, &table, &*error)) { - return NULL; - } - - return table; -} - -GPtrArray * -tracker_metadata_get_unique_values_with_concat_count_and_sum (TrackerClient *client, ServiceType service, char **meta_types, char *query, char *concat, char *count, char *sum, gboolean descending, int offset, int max_hits, GError **error) -{ - GPtrArray *table; - const char *service_str = tracker_service_types[service]; - - if (!org_freedesktop_Tracker_Metadata_get_unique_values_with_concat_count_and_sum (client->proxy_metadata, service_str, (const char **)meta_types, query, concat, count, sum, descending, offset, max_hits, &table, &*error)) { - return NULL; - } - - return table; -} GPtrArray * tracker_keywords_get_list (TrackerClient *client, ServiceType service, GError **error) @@ -764,35 +686,6 @@ tracker_search_get_snippet (TrackerClient *client, ServiceType service, const ch } - -char ** -tracker_search_metadata (TrackerClient *client, ServiceType service, const char *field, const char* search_text, int offset, int max_hits, GError **error) -{ - char **array = NULL; - const char *service_str = tracker_service_types[service]; - - if (!org_freedesktop_Tracker_Search_metadata (client->proxy_search, service_str, field, search_text, offset, max_hits, &array, &*error)) { - return NULL; - } - - return array; -} - - - -GPtrArray * -tracker_search_query (TrackerClient *client, int live_query_id, ServiceType service, char **fields, const char *search_text, char **keywords, const char *query, int offset, int max_hits, gboolean sort_by_service, char **sort_fields, gboolean sort_descending, GError **error) -{ - GPtrArray *table; - const char *service_str = tracker_service_types[service]; - - if (!org_freedesktop_Tracker_Search_query (client->proxy_search, live_query_id, service_str, (const char **)fields, search_text, (const char **)keywords, query, sort_by_service, (const char **)sort_fields, sort_descending, offset, max_hits , &table, &*error)) { - return NULL; - } - - return table; -} - char * tracker_search_suggest (TrackerClient *client, const char *search_term, int maxdist, GError **error) { @@ -1214,93 +1107,6 @@ tracker_metadata_get_registered_classes_async (TrackerClient *client, TrackerArr void -tracker_metadata_get_unique_values_async (TrackerClient *client, ServiceType service, char **meta_types, const char *query, gboolean descending, int offset, int max_hits, TrackerGPtrArrayReply callback, gpointer user_data) -{ - - GPtrArrayCallBackStruct *callback_struct; - const char *service_str = tracker_service_types[service]; - - callback_struct = g_new (GPtrArrayCallBackStruct, 1); - callback_struct->callback = callback; - callback_struct->data = user_data; - - client->last_pending_call = org_freedesktop_Tracker_Metadata_get_unique_values_async (client->proxy_metadata, service_str, (const char **) meta_types, query, descending, offset, max_hits, tracker_GPtrArray_reply, callback_struct); - -} - -void -tracker_metadata_get_sum_async (TrackerClient *client, ServiceType service, char *field, char *query, TrackerIntReply callback, gpointer user_data) -{ - IntCallBackStruct *callback_struct; - const char *service_str = tracker_service_types[service]; - - callback_struct = g_new (IntCallBackStruct, 1); - callback_struct->callback = callback; - callback_struct->data = user_data; - - client->last_pending_call = org_freedesktop_Tracker_Metadata_get_sum_async (client->proxy_metadata, service_str, field, query, tracker_int_reply, callback_struct); -} - - -void -tracker_metadata_get_count_async (TrackerClient *client, ServiceType service, char *field, char *query, TrackerIntReply callback, gpointer user_data) -{ - IntCallBackStruct *callback_struct; - const char *service_str = tracker_service_types[service]; - - callback_struct = g_new (IntCallBackStruct, 1); - callback_struct->callback = callback; - callback_struct->data = user_data; - - client->last_pending_call = org_freedesktop_Tracker_Metadata_get_count_async (client->proxy_metadata, service_str, field, query, tracker_int_reply, callback_struct); -} - -void -tracker_metadata_get_unique_values_with_count_async (TrackerClient *client, ServiceType service, char **meta_types, const char *query, char *count, gboolean descending, int offset, int max_hits, TrackerGPtrArrayReply callback, gpointer user_data) -{ - - GPtrArrayCallBackStruct *callback_struct; - const char *service_str = tracker_service_types[service]; - - callback_struct = g_new (GPtrArrayCallBackStruct, 1); - callback_struct->callback = callback; - callback_struct->data = user_data; - - client->last_pending_call = org_freedesktop_Tracker_Metadata_get_unique_values_with_count_async (client->proxy_metadata, service_str, (const char **) meta_types, query, count, descending, offset, max_hits, tracker_GPtrArray_reply, callback_struct); - -} - -void -tracker_metadata_get_unique_values_with_count_and_sum_async (TrackerClient *client, ServiceType service, char **meta_types, const char *query, char *count, char *sum, gboolean descending, int offset, int max_hits, TrackerGPtrArrayReply callback, gpointer user_data) -{ - - GPtrArrayCallBackStruct *callback_struct; - const char *service_str = tracker_service_types[service]; - - callback_struct = g_new (GPtrArrayCallBackStruct, 1); - callback_struct->callback = callback; - callback_struct->data = user_data; - - client->last_pending_call = org_freedesktop_Tracker_Metadata_get_unique_values_with_count_and_sum_async (client->proxy_metadata, service_str, (const char **) meta_types, query, count, sum, descending, offset, max_hits, tracker_GPtrArray_reply, callback_struct); - -} - -void -tracker_metadata_get_unique_values_with_concat_count_and_sum_async (TrackerClient *client, ServiceType service, char **meta_types, const char *query, char *concat, char *count, char *sum, gboolean descending, int offset, int max_hits, TrackerGPtrArrayReply callback, gpointer user_data) -{ - - GPtrArrayCallBackStruct *callback_struct; - const char *service_str = tracker_service_types[service]; - - callback_struct = g_new (GPtrArrayCallBackStruct, 1); - callback_struct->callback = callback; - callback_struct->data = user_data; - - client->last_pending_call = org_freedesktop_Tracker_Metadata_get_unique_values_with_concat_count_and_sum_async (client->proxy_metadata, service_str, (const char **) meta_types, query, concat, count, sum, descending, offset, max_hits, tracker_GPtrArray_reply, callback_struct); - -} - -void tracker_keywords_get_list_async (TrackerClient *client, ServiceType service, TrackerGPtrArrayReply callback, gpointer user_data) { @@ -1494,39 +1300,6 @@ tracker_search_get_snippet_async (TrackerClient *client, ServiceType service, co void -tracker_search_metadata_async (TrackerClient *client, ServiceType service, const char *field, const char* search_text, int offset, int max_hits, TrackerArrayReply callback, gpointer user_data) -{ - ArrayCallBackStruct *callback_struct; - const char *service_str; - - callback_struct = g_new (ArrayCallBackStruct, 1); - callback_struct->callback = callback; - callback_struct->data = user_data; - - service_str = tracker_service_types[service]; - - org_freedesktop_Tracker_Search_metadata_async (client->proxy_search, service_str, field, search_text, offset, max_hits, tracker_array_reply, callback_struct); - -} - -void -tracker_search_query_async (TrackerClient *client, int live_query_id, ServiceType service, char **fields, const char *search_text, char **keywords, const char *query, int offset, int max_hits, gboolean sort_by_service, char **sort_fields, gboolean sort_descending, TrackerGPtrArrayReply callback, gpointer user_data) -{ - GPtrArrayCallBackStruct *callback_struct; - const char *service_str; - - callback_struct = g_new (GPtrArrayCallBackStruct, 1); - callback_struct->callback = callback; - callback_struct->data = user_data; - - service_str = tracker_service_types[service]; - - client->last_pending_call = org_freedesktop_Tracker_Search_query_async (client->proxy_search, live_query_id, service_str, (const char **)fields, search_text, (const char **)keywords, query, sort_by_service, (const char **)sort_fields, sort_descending, offset, max_hits, tracker_GPtrArray_reply, callback_struct); - -} - - -void tracker_search_suggest_async (TrackerClient *client, const char *search_text, int maxdist, TrackerStringReply callback, gpointer user_data) { diff --git a/src/libtracker/tracker.h b/src/libtracker/tracker.h index 7a3f1cce5..50d8ae79d 100644 --- a/src/libtracker/tracker.h +++ b/src/libtracker/tracker.h @@ -127,12 +127,6 @@ MetaDataTypeDetails * tracker_metadata_get_type_details (TrackerClient *client, char ** tracker_metadata_get_registered_types (TrackerClient *client, const char *classname, GError **error); char ** tracker_metadata_get_writeable_types (TrackerClient *client, const char *classname, GError **error); char ** tracker_metadata_get_registered_classes (TrackerClient *client, GError **error); -GPtrArray * tracker_metadata_get_unique_values (TrackerClient *client, ServiceType service, char **meta_types, char *query, gboolean descending, int offset, int max_hits, GError **error); -int tracker_metadata_get_sum (TrackerClient *client, ServiceType service, char *field, char *query, GError **error); -int tracker_metadata_get_count (TrackerClient *client, ServiceType service, char *field, char *query, GError **error); -GPtrArray * tracker_metadata_get_unique_values_with_count (TrackerClient *client, ServiceType service, char **meta_types, char *query, char *count, gboolean descending, int offset, int max_hits, GError **error); -GPtrArray * tracker_metadata_get_unique_values_with_count_and_sum (TrackerClient *client, ServiceType service, char **meta_types, char *query, char *count, char *sum, gboolean descending, int offset, int max_hits, GError **error); -GPtrArray * tracker_metadata_get_unique_values_with_concat_count_and_sum (TrackerClient *client, ServiceType service, char **meta_types, char *query, char *concat, char *count, char *sum, gboolean descending, int offset, int max_hits, GError **error); GPtrArray * tracker_keywords_get_list (TrackerClient *client, ServiceType service, GError **error); char ** tracker_keywords_get (TrackerClient *client, ServiceType service, const char *id, GError **error); @@ -147,8 +141,6 @@ GPtrArray * tracker_search_get_hit_count_all (TrackerClient *client, const char char ** tracker_search_text (TrackerClient *client, int live_query_id, ServiceType service, const char *search_text, int offset, int max_hits, GError **error); GPtrArray * tracker_search_text_detailed (TrackerClient *client, int live_query_id, ServiceType service, const char *search_text, int offset, int max_hits, GError **error); char * tracker_search_get_snippet (TrackerClient *client, ServiceType service, const char *uri, const char *search_text, GError **error); -char ** tracker_search_metadata (TrackerClient *client, ServiceType service, const char *field, const char* search_text, int offset, int max_hits, GError **error); -GPtrArray * tracker_search_query (TrackerClient *client, int live_query_id, ServiceType service, char **fields, const char *search_text, char **keywords, const char *query, int offset, int max_hits, gboolean sort_by_service, char **sort_fields, gboolean sort_descending, GError **error); gchar * tracker_search_suggest (TrackerClient *client, const char *search_text, int maxdist, GError **error); @@ -192,12 +184,6 @@ void tracker_metadata_register_type_async (TrackerClient *client, const char void tracker_metadata_get_registered_types_async (TrackerClient *client, const char *classname, TrackerArrayReply callback, gpointer user_data); void tracker_metadata_get_writeable_types_async (TrackerClient *client, const char *classname, TrackerArrayReply callback, gpointer user_data); void tracker_metadata_get_registered_classes_async (TrackerClient *client, TrackerArrayReply callback, gpointer user_data); -void tracker_metadata_get_unique_values_async (TrackerClient *client, ServiceType service, char **meta_types, const char *query, gboolean descending, int offset, int max_hits, TrackerGPtrArrayReply callback, gpointer user_data); -void tracker_metadata_get_sum_async (TrackerClient *client, ServiceType service, char *field, char *query, TrackerIntReply callback, gpointer user_data); -void tracker_metadata_get_count_async (TrackerClient *client, ServiceType service, char *field, char *query, TrackerIntReply callback, gpointer user_data); -void tracker_metadata_get_unique_values_with_count_async (TrackerClient *client, ServiceType service, char **meta_types, const char *query, char *count, gboolean descending, int offset, int max_hits, TrackerGPtrArrayReply callback, gpointer user_data); -void tracker_metadata_get_unique_values_with_count_and_sum_async (TrackerClient *client, ServiceType service, char **meta_types, const char *query, char *count, char *sum, gboolean descending, int offset, int max_hits, TrackerGPtrArrayReply callback, gpointer user_data); -void tracker_metadata_get_unique_values_with_concat_count_and_sum_async (TrackerClient *client, ServiceType service, char **meta_types, const char *query, char *concat, char *count, char *sum, gboolean descending, int offset, int max_hits, TrackerGPtrArrayReply callback, gpointer user_data); void tracker_keywords_get_list_async (TrackerClient *client, ServiceType service, TrackerGPtrArrayReply callback, gpointer user_data); void tracker_keywords_get_async (TrackerClient *client, ServiceType service, const char *id, TrackerArrayReply callback, gpointer user_data); @@ -211,8 +197,6 @@ void tracker_search_text_get_hit_count_all_async (TrackerClient *client, const void tracker_search_text_async (TrackerClient *client, int live_query_id, ServiceType service, const char *search_text, int offset, int max_hits, TrackerArrayReply callback, gpointer user_data); void tracker_search_text_detailed_async (TrackerClient *client, int live_query_id, ServiceType service, const char *search_text, int offset, int max_hits, TrackerGPtrArrayReply callback, gpointer user_data); void tracker_search_get_snippet_async (TrackerClient *client, ServiceType service, const char *uri, const char *search_text, TrackerStringReply callback, gpointer user_data); -void tracker_search_metadata_async (TrackerClient *client, ServiceType service, const char *field, const char* search_text, int offset, int max_hits, TrackerArrayReply callback, gpointer user_data); -void tracker_search_query_async (TrackerClient *client, int live_query_id, ServiceType service, char **fields, const char *search_text, char **keywords, const char *query, int offset, int max_hits, gboolean sort_by_service, char **sort_fields, gboolean sort_descending, TrackerGPtrArrayReply callback, gpointer user_data); void tracker_search_suggest_async (TrackerClient *client, const char *search_text, int maxdist, TrackerStringReply callback, gpointer user_data); void tracker_files_create_async (TrackerClient *client, const char *uri, gboolean is_directory, const char *mime, int size, int mtime, TrackerVoidReply callback, gpointer user_data); diff --git a/src/tracker-utils/Makefile.am b/src/tracker-utils/Makefile.am index 987b19bad..8f2d1135b 100644 --- a/src/tracker-utils/Makefile.am +++ b/src/tracker-utils/Makefile.am @@ -21,13 +21,11 @@ libs = \ bin_PROGRAMS = \ tracker-search \ - tracker-query \ tracker-meta-folder \ tracker-stats \ tracker-tag \ tracker-files \ tracker-status \ - tracker-unique \ tracker-info \ tracker-processes \ tracker-services @@ -35,9 +33,6 @@ bin_PROGRAMS = \ tracker_search_SOURCES = tracker-search.c tracker_search_LDADD = $(libs) -tracker_query_SOURCES = tracker-query.c -tracker_query_LDADD = $(libs) - tracker_meta_folder_SOURCES = tracker-meta-folder.c tracker_meta_folder_LDADD = $(libs) @@ -53,9 +48,6 @@ tracker_files_LDADD = $(libs) tracker_status_SOURCES = tracker-status.c tracker_status_LDADD = $(libs) -tracker_unique_SOURCES = tracker-unique.c -tracker_unique_LDADD = $(libs) - tracker_info_SOURCES = tracker-info.c tracker_info_LDADD = $(libs) diff --git a/src/tracker-utils/tracker-query.c b/src/tracker-utils/tracker-query.c deleted file mode 100644 index a7b354329..000000000 --- a/src/tracker-utils/tracker-query.c +++ /dev/null @@ -1,281 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Copyright (C) 2006, Mr Jamie McCracken (jamiemcc@gnome.org) - * Copyright (C) 2008, Nokia - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "config.h" - -#include <sys/param.h> -#include <stdlib.h> -#include <time.h> -#include <locale.h> - -#include <glib.h> -#include <glib/gi18n.h> -#include <gio/gio.h> - -#include <libtracker/tracker.h> -#include <libtracker-common/tracker-common.h> - -#ifdef G_OS_WIN32 -#include <trackerd/mingw-compat.h> -#endif /* G_OS_WIN32 */ - -static gchar *path; -static gchar *search; -static gchar **fields; -static gchar *service; -static gchar **keywords; -static gchar **order; -static gint limit = 512; -static gint offset; - -static GOptionEntry entries[] = { - { "path", 'p', 0, G_OPTION_ARG_STRING, &path, - N_("Path to use in query"), - NULL, - }, - { "service", 's', 0, G_OPTION_ARG_STRING, &service, - N_("Search from a specific service"), - NULL - }, - { "limit", 'l', 0, G_OPTION_ARG_INT, &limit, - N_("Limit the number of results shown"), - N_("512") - }, - { "offset", 'o', 0, G_OPTION_ARG_INT, &offset, - N_("Offset the results"), - N_("0") - }, - { "search-term", 't', 0, G_OPTION_ARG_STRING, &search, - N_("Adds a fulltext search filter"), - NULL, - }, - { "keyword", 'k', 0, G_OPTION_ARG_STRING_ARRAY, &keywords, - N_("Adds a keyword filter"), - NULL - }, - { "order", 'r', 0, G_OPTION_ARG_STRING_ARRAY, &order, - N_("Adds an order field"), - NULL - }, - { G_OPTION_REMAINING, 0, 0, - G_OPTION_ARG_STRING_ARRAY, &fields, - N_("Metadata Fields"), - N_("FIELD [FIELD...]") - }, - { NULL } -}; - -static void -get_meta_table_data (gpointer value) -{ - gchar **meta; - gchar **p; - gint i; - - meta = value; - - for (p = meta, i = 0; *p; p++, i++) { - if (i == 0) { - g_print (" %s", *p); - } else { - g_print (", %s", *p); - } - } - - g_print ("\n"); -} - -int -main (int argc, char **argv) -{ - TrackerClient *client; - ServiceType type; - GOptionContext *context; - GError *error = NULL; - GFile *file; - gchar *path_in_utf8, *abs_path; - gchar *content; - gchar *buffer; - gsize size; - GPtrArray *array; - - setlocale (LC_ALL, ""); - - bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); - bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); - textdomain (GETTEXT_PACKAGE); - - context = g_option_context_new (_("- Query using RDF and return results " - "with specified metadata fields")); - - g_option_context_add_main_entries (context, entries, NULL); - g_option_context_parse (context, &argc, &argv, NULL); - - if (!fields || !path) { - gchar *help; - - g_printerr ("%s\n\n", - _("Path or fields are missing")); - - help = g_option_context_get_help (context, TRUE, NULL); - g_option_context_free (context); - g_printerr ("%s", help); - g_free (help); - - return EXIT_FAILURE; - } - - g_option_context_free (context); - - client = tracker_connect (FALSE); - - if (!client) { - g_printerr ("%s\n", - _("Could not establish a DBus connection to Tracker")); - return EXIT_FAILURE; - } - - if (limit <= 0) { - limit = 512; - } - - if (!service) { - g_print ("%s\n", - _("Defaulting to 'files' service")); - - type = SERVICE_FILES; - } else { - type = tracker_service_name_to_type (service); - - if (type == SERVICE_OTHER_FILES && g_ascii_strcasecmp (service, "Other")) { - g_printerr ("%s\n", - _("Service not recognized, searching in other files...")); - } - } - - path_in_utf8 = g_filename_to_utf8 (path, -1, NULL, NULL, &error); - if (error) { - g_printerr ("%s:'%s', %s\n", - _("Could not get UTF-8 path from path"), - path, - error->message); - g_error_free (error); - tracker_disconnect (client); - - return EXIT_FAILURE; - } - - file = g_file_new_for_commandline_arg (path_in_utf8); - abs_path = g_file_get_path (file); - - g_file_get_contents (abs_path, &content, &size, &error); - if (error) { - g_printerr ("%s:'%s', %s\n", - _("Could not read file"), - abs_path, - error->message); - g_error_free (error); - g_free (path_in_utf8); - g_free (abs_path); - g_object_unref (file); - tracker_disconnect (client); - - return EXIT_FAILURE; - } - - g_free (path_in_utf8); - g_free (abs_path); - g_object_unref (file); - - buffer = g_locale_to_utf8 (content, size, NULL, NULL, &error); - g_free (content); - - if (error) { - g_printerr ("%s, %s\n", - _("Could not convert query file to UTF-8"), - error->message); - g_error_free (error); - tracker_disconnect (client); - - return EXIT_FAILURE; - } - - array = tracker_search_query (client, - time (NULL), - type, - fields, - search, - keywords, - buffer, - offset, - limit, - FALSE, - order, - FALSE, - &error); - g_free (buffer); - - if (error) { - g_printerr ("%s, %s\n", - _("Could not query search"), - error->message); - g_error_free (error); - - return EXIT_FAILURE; - } - - if (!array) { - g_print ("%s\n", - _("No results found matching your query")); - } else { - gint length; - - length = array->len; - - g_print (tracker_dngettext (NULL, - _("Result: %d"), - _("Results: %d"), - length), - length); - g_print ("\n"); - - g_ptr_array_foreach (array, (GFunc) get_meta_table_data, NULL); - g_ptr_array_free (array, TRUE); - - if (length >= limit) { - /* Display '...' so the user thinks there is - * more items. - */ - g_print (" ...\n"); - - /* Display warning so the user knows this is - * not the WHOLE data set. - */ - g_printerr ("\n" - "%s\n", - _("NOTE: Limit was reached, there are more items in the database not listed here")); - } - } - - tracker_disconnect (client); - - return EXIT_SUCCESS; -} diff --git a/src/tracker-utils/tracker-unique.c b/src/tracker-utils/tracker-unique.c deleted file mode 100644 index 59b340eb9..000000000 --- a/src/tracker-utils/tracker-unique.c +++ /dev/null @@ -1,244 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Copyright (C) 2006, Mr Jamie McCracken (jamiemcc@gnome.org) - * Copyright (C) 2008, Nokia - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "config.h" - -#include <sys/param.h> -#include <stdlib.h> -#include <locale.h> - -#include <glib.h> -#include <glib/gi18n.h> - -#include <libtracker/tracker.h> -#include <libtracker-common/tracker-common.h> - -#ifdef G_OS_WIN32 -#include <trackerd/mingw-compat.h> -#endif /* G_OS_WIN32 */ - -static gchar **fields; -static gchar *service; -static gchar *path; -static gchar *concat; -static gchar *count; -static gchar *sum; -static gboolean descending; - -static GOptionEntry entries[] = { - { "path", 'p', 0, G_OPTION_ARG_STRING, &path, - N_("Path to use in query"), - NULL - }, - { "service", 's', 0, G_OPTION_ARG_STRING, &service, - N_("Search from a specific service"), - NULL - }, - { "concat", 'n', 0, G_OPTION_ARG_STRING, &concat, - N_("Concatenate different values of this field"), - "e.g. File:Mime" - }, - { "count", 'c', 0, G_OPTION_ARG_STRING, &count, - N_("Count instances of unique fields of this type"), - "e.g. File:Mime" - }, - { "sum", 'u', 0, G_OPTION_ARG_STRING, &sum, - N_("Sum the values of this field"), - "e.g. File:Mime" - }, - { "desc", 'o', 0, G_OPTION_ARG_NONE, &descending, - N_("Sort to descending order"), - NULL}, - { G_OPTION_REMAINING, 0, 0, - G_OPTION_ARG_STRING_ARRAY, &fields, - N_("Required fields"), N_("FIELD [FIELD...]")}, - { NULL } -}; - -static void -get_meta_table_data (gpointer value) -{ - gchar **meta; - gchar **p; - gint i; - - meta = value; - - for (p = meta, i = 0; *p; p++, i++) { - if (i == 0) { - g_print (" %s", *p); - } else { - g_print (", %s", *p); - } - } - - g_print ("\n"); -} - -int -main (int argc, char **argv) -{ - TrackerClient *client; - ServiceType type; - GOptionContext *context; - GError *error = NULL; - gchar *content; - gchar *buffer = NULL; - gsize size; - GPtrArray *array; - - setlocale (LC_ALL, ""); - - bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); - bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); - textdomain (GETTEXT_PACKAGE); - - context = g_option_context_new ("- Get unique values with an optional RDF query filter"); - g_option_context_add_main_entries (context, entries, NULL); - g_option_context_parse (context, &argc, &argv, NULL); - - if (!fields) { - gchar *help; - - g_printerr ("%s\n\n", - _("Fields are missing")); - - help = g_option_context_get_help (context, TRUE, NULL); - g_option_context_free (context); - g_printerr ("%s", help); - g_free (help); - - return EXIT_FAILURE; - } - - g_option_context_free (context); - - client = tracker_connect (FALSE); - - if (!client) { - g_printerr ("%s\n", - _("Could not establish a DBus connection to Tracker")); - return EXIT_FAILURE; - } - - if (!service) { - g_print ("%s\n", - _("Defaulting to 'files' service")); - - type = SERVICE_FILES; - } else { - type = tracker_service_name_to_type (service); - - if (type == SERVICE_OTHER_FILES && g_ascii_strcasecmp (service, "Other")) { - g_printerr ("%s\n", - _("Service not recognized, searching in other files...")); - } - } - - if (path) { - gchar *path_in_utf8; - - path_in_utf8 = g_filename_to_utf8 (path, -1, NULL, NULL, &error); - if (error) { - g_printerr ("%s:'%s', %s\n", - _("Could not get UTF-8 path from path"), - path, - error->message); - g_error_free (error); - tracker_disconnect (client); - - return EXIT_FAILURE; - } - - g_file_get_contents (path_in_utf8, &content, &size, &error); - if (error) { - g_printerr ("%s:'%s', %s\n", - _("Could not read file"), - path_in_utf8, - error->message); - g_error_free (error); - g_free (path_in_utf8); - tracker_disconnect (client); - - return EXIT_FAILURE; - } - - g_free (path_in_utf8); - - buffer = g_locale_to_utf8 (content, size, NULL, NULL, &error); - g_free (content); - - if (error) { - g_printerr ("%s, %s\n", - _("Could not convert query file to UTF-8"), - error->message); - g_error_free (error); - tracker_disconnect (client); - - return EXIT_FAILURE; - } - } - - array = tracker_metadata_get_unique_values_with_concat_count_and_sum (client, - type, - fields, - buffer, - concat, - count, - sum, - descending, - 0, - 512, - &error); - g_free (buffer); - - if (error) { - g_printerr ("%s, %s\n", - _("Could not query search"), - error->message); - g_error_free (error); - - return EXIT_FAILURE; - } - - if (!array) { - g_print ("%s\n", - _("No results found matching your query")); - } else { - gint length; - - length = array->len; - - g_print (tracker_dngettext (NULL, - _("Result: %d"), - _("Results: %d"), - length), - length); - g_print ("\n"); - - g_ptr_array_foreach (array, (GFunc) get_meta_table_data, NULL); - g_ptr_array_free (array, TRUE); - } - - tracker_disconnect (client); - - return EXIT_SUCCESS; -} diff --git a/src/trackerd/tracker-metadata.c b/src/trackerd/tracker-metadata.c index cc7229654..1ce517607 100644 --- a/src/trackerd/tracker-metadata.c +++ b/src/trackerd/tracker-metadata.c @@ -36,7 +36,6 @@ #include <libtracker-data/tracker-data-query.h> #include <libtracker-data/tracker-data-schema.h> #include <libtracker-data/tracker-data-search.h> -#include <libtracker-data/tracker-rdf-query.h> #include "tracker-indexer-client.h" #include "tracker-dbus.h" @@ -533,340 +532,4 @@ tracker_metadata_get_registered_classes (TrackerMetadata *object, tracker_dbus_request_success (request_id); } -void -tracker_metadata_get_unique_values (TrackerMetadata *object, - const gchar *service_type, - gchar **fields, - const gchar *query_condition, - gboolean order_desc, - gint offset, - gint max_hits, - DBusGMethodInvocation *context, - GError **error) -{ - TrackerDBResultSet *result_set = NULL; - guint request_id; - - GPtrArray *values = NULL; - - GError *actual_error = NULL; - - request_id = tracker_dbus_get_next_request_id (); - - tracker_dbus_async_return_if_fail (service_type != NULL, context); - tracker_dbus_async_return_if_fail (fields != NULL, context); - tracker_dbus_async_return_if_fail (query_condition != NULL, context); - - tracker_dbus_request_new (request_id, - "DBus request to get unique values, " - "service type:'%s', query '%s'", - service_type, - query_condition); - - result_set = tracker_data_search_get_unique_values (service_type, fields, - query_condition, - order_desc, - offset, - max_hits, - &actual_error); - - if (actual_error) { - tracker_dbus_request_failed (request_id, &actual_error, NULL); - dbus_g_method_return_error (context, actual_error); - g_error_free (actual_error); - return; - } - - values = tracker_dbus_query_result_to_ptr_array (result_set); - - dbus_g_method_return (context, values); - - tracker_dbus_results_ptr_array_free (&values); - - if (result_set) { - g_object_unref (result_set); - } - - tracker_dbus_request_success (request_id); -} - -void -tracker_metadata_get_unique_values_with_count (TrackerMetadata *object, - const gchar *service_type, - gchar **fields, - const gchar *query_condition, - const gchar *count_field, - gboolean order_desc, - gint offset, - gint max_hits, - DBusGMethodInvocation *context, - GError **error) -{ - TrackerDBResultSet *result_set = NULL; - guint request_id; - GPtrArray *values = NULL; - GError *actual_error = NULL; - - request_id = tracker_dbus_get_next_request_id (); - - tracker_dbus_async_return_if_fail (service_type != NULL, context); - tracker_dbus_async_return_if_fail (fields != NULL, context); - tracker_dbus_async_return_if_fail (query_condition != NULL, context); - - tracker_dbus_request_new (request_id, - "DBus request to get unique values, " - "service type:'%s', query '%s'" - "count field :'%s'", - service_type, - query_condition, - count_field); - - result_set = - tracker_data_search_get_unique_values_with_count (service_type, - fields, - query_condition, - count_field, - order_desc, - offset, - max_hits, - &actual_error); - - if (actual_error) { - tracker_dbus_request_failed (request_id, &actual_error, NULL); - dbus_g_method_return_error (context, actual_error); - g_error_free (actual_error); - return; - } - - values = tracker_dbus_query_result_to_ptr_array (result_set); - - dbus_g_method_return (context, values); - - tracker_dbus_results_ptr_array_free (&values); - - if (result_set) { - g_object_unref (result_set); - } - - tracker_dbus_request_success (request_id); -} - -void -tracker_metadata_get_unique_values_with_count_and_sum (TrackerMetadata *object, - const gchar *service_type, - gchar **fields, - const gchar *query_condition, - const gchar *count_field, - const gchar *sum_field, - gboolean order_desc, - gint offset, - gint max_hits, - DBusGMethodInvocation *context, - GError **error) -{ - TrackerDBResultSet *result_set = NULL; - guint request_id; - GPtrArray *values = NULL; - GError *actual_error = NULL; - - request_id = tracker_dbus_get_next_request_id (); - - tracker_dbus_async_return_if_fail (service_type != NULL, context); - tracker_dbus_async_return_if_fail (fields != NULL, context); - tracker_dbus_async_return_if_fail (query_condition != NULL, context); - - tracker_dbus_request_new (request_id, - "DBus request to get unique values with count and sum, " - "service type:'%s', query '%s', " - "count field :'%s', " - "sum field :'%s'", - service_type, - query_condition, - count_field, - sum_field); - - result_set = - tracker_data_search_get_unique_values_with_count_and_sum (service_type, - fields, - query_condition, - count_field, - sum_field, - order_desc, - offset, - max_hits, - &actual_error); - - if (actual_error) { - tracker_dbus_request_failed (request_id, &actual_error, NULL); - dbus_g_method_return_error (context, actual_error); - g_error_free (actual_error); - return; - } - - values = tracker_dbus_query_result_to_ptr_array (result_set); - - dbus_g_method_return (context, values); - - tracker_dbus_results_ptr_array_free (&values); - - if (result_set) { - g_object_unref (result_set); - } - - tracker_dbus_request_success (request_id); -} - -void -tracker_metadata_get_unique_values_with_concat_count_and_sum (TrackerMetadata *object, - const gchar *service_type, - gchar **fields, - const gchar *query_condition, - const gchar *concat_field, - const gchar *count_field, - const gchar *sum_field, - gboolean order_desc, - gint offset, - gint max_hits, - DBusGMethodInvocation *context, - GError **error) -{ - TrackerDBResultSet *result_set = NULL; - guint request_id; - GPtrArray *values = NULL; - GError *actual_error = NULL; - - request_id = tracker_dbus_get_next_request_id (); - - tracker_dbus_async_return_if_fail (service_type != NULL, context); - tracker_dbus_async_return_if_fail (fields != NULL, context); - tracker_dbus_async_return_if_fail (query_condition != NULL, context); - - tracker_dbus_request_new (request_id, - "DBus request to get unique values with count and sum, " - "service type:'%s', query '%s', " - "concat field :'%s' " - "count field :'%s', " - "sum field :'%s'", - service_type, - query_condition, - concat_field, - count_field, - sum_field); - - result_set = - tracker_data_search_get_unique_values_with_concat_count_and_sum (service_type, - fields, - query_condition, - concat_field, - count_field, - sum_field, - order_desc, - offset, - max_hits, - &actual_error); - - if (actual_error) { - tracker_dbus_request_failed (request_id, &actual_error, NULL); - dbus_g_method_return_error (context, actual_error); - g_error_free (actual_error); - return; - } - - values = tracker_dbus_query_result_to_ptr_array (result_set); - - dbus_g_method_return (context, values); - - tracker_dbus_results_ptr_array_free (&values); - - if (result_set) { - g_object_unref (result_set); - } - - tracker_dbus_request_success (request_id); -} - -void -tracker_metadata_get_sum (TrackerMetadata *object, - const gchar *service_type, - const gchar *field, - const gchar *query_condition, - DBusGMethodInvocation *context, - GError **error) -{ - guint request_id; - gint sum; - GError *actual_error = NULL; - - request_id = tracker_dbus_get_next_request_id (); - - tracker_dbus_async_return_if_fail (service_type != NULL, context); - tracker_dbus_async_return_if_fail (field != NULL, context); - tracker_dbus_async_return_if_fail (query_condition != NULL, context); - - tracker_dbus_request_new (request_id, - "DBus request to get sum, " - "service type:'%s', field '%s', query '%s'", - service_type, - field, - query_condition); - - sum = tracker_data_search_get_sum (service_type, - field, - query_condition, - &actual_error); - - if (actual_error) { - tracker_dbus_request_failed (request_id, &actual_error, NULL); - dbus_g_method_return_error (context, actual_error); - g_error_free (actual_error); - return; - } - - dbus_g_method_return (context, sum); - - tracker_dbus_request_success (request_id); -} - -void -tracker_metadata_get_count (TrackerMetadata *object, - const gchar *service_type, - const gchar *field, - const gchar *query_condition, - DBusGMethodInvocation *context, - GError **error) -{ - guint request_id; - gint count; - - GError *actual_error = NULL; - - request_id = tracker_dbus_get_next_request_id (); - - tracker_dbus_async_return_if_fail (service_type != NULL, context); - tracker_dbus_async_return_if_fail (field != NULL, context); - tracker_dbus_async_return_if_fail (query_condition != NULL, context); - - tracker_dbus_request_new (request_id, - "DBus request to get count, " - "service type:'%s', field '%s', query '%s'", - service_type, - field, - query_condition); - - count = tracker_data_search_get_count (service_type, - field, - query_condition, - &actual_error); - - if (actual_error) { - tracker_dbus_request_failed (request_id, &actual_error, NULL); - dbus_g_method_return_error (context, actual_error); - g_error_free (actual_error); - return; - } - - dbus_g_method_return (context, count); - - tracker_dbus_request_success (request_id); -} diff --git a/src/trackerd/tracker-metadata.h b/src/trackerd/tracker-metadata.h index ec51ea2d7..23132c22d 100644 --- a/src/trackerd/tracker-metadata.h +++ b/src/trackerd/tracker-metadata.h @@ -87,60 +87,6 @@ void tracker_metadata_get_registered_types (T void tracker_metadata_get_registered_classes (TrackerMetadata *object, DBusGMethodInvocation *context, GError **error); -void tracker_metadata_get_unique_values (TrackerMetadata *object, - const gchar *service_type, - gchar **fields, - const gchar *query_condition, - gboolean order_desc, - gint offset, - gint max_hits, - DBusGMethodInvocation *context, - GError **error); -void tracker_metadata_get_sum (TrackerMetadata *object, - const gchar *service_type, - const gchar *field, - const gchar *query_condition, - DBusGMethodInvocation *context, - GError **error); -void tracker_metadata_get_count (TrackerMetadata *object, - const gchar *service_type, - const gchar *field, - const gchar *query_condition, - DBusGMethodInvocation *context, - GError **error); -void tracker_metadata_get_unique_values_with_count (TrackerMetadata *object, - const gchar *service_type, - gchar **fields, - const gchar *query_condition, - const gchar *count, - gboolean order_desc, - gint offset, - gint max_hits, - DBusGMethodInvocation *context, - GError **error); -void tracker_metadata_get_unique_values_with_count_and_sum (TrackerMetadata *object, - const gchar *service_type, - gchar **fields, - const gchar *query_condition, - const gchar *count, - const gchar *sum, - gboolean order_desc, - gint offset, - gint max_hits, - DBusGMethodInvocation *context, - GError **error); -void tracker_metadata_get_unique_values_with_concat_count_and_sum (TrackerMetadata *object, - const gchar *service_type, - gchar **fields, - const gchar *query_condition, - const gchar *concat, - const gchar *count, - const gchar *sum, - gboolean order_desc, - gint offset, - gint max_hits, - DBusGMethodInvocation *context, - GError **error); G_END_DECLS diff --git a/src/trackerd/tracker-search.c b/src/trackerd/tracker-search.c index 72ee554f4..67f0c7b39 100644 --- a/src/trackerd/tracker-search.c +++ b/src/trackerd/tracker-search.c @@ -40,7 +40,6 @@ #include <libtracker-data/tracker-data-schema.h> #include <libtracker-data/tracker-data-search.h> #include <libtracker-data/tracker-query-tree.h> -#include <libtracker-data/tracker-rdf-query.h> #include "tracker-dbus.h" #include "tracker-search.h" @@ -410,88 +409,6 @@ search_get_snippet (const gchar *text, } } -static TrackerDBResultSet * -search_perform_rdf_query (gint request_id, - const gchar *service, - const gchar **fields, - const gchar *search_text, - const gchar **keywords, - const gchar *query_condition, - gboolean sort_by_service, - const gchar **sort_fields, - gboolean sort_desc, - gint offset, - gint max_hits, - GError **error) -{ - TrackerDBInterface *iface; - TrackerDBResultSet *result_set; - - result_set = NULL; - - iface = tracker_db_manager_get_db_interface_by_service (service); - - if (query_condition) { - GError *query_error = NULL; - gchar *query_translated; - - tracker_dbus_request_comment (request_id, - "Executing RDF query:'%s' with search " - "term:'%s'", - query_condition, - search_text); - - query_translated = tracker_rdf_query_to_sql (iface, - query_condition, - service, - fields, - g_strv_length ((GStrv) fields), - search_text, - keywords, - keywords ? g_strv_length ((GStrv) keywords) : 0, - sort_by_service, - sort_fields, - sort_fields ? g_strv_length ((GStrv) sort_fields) : 0, - sort_desc, - offset, - search_sanity_check_max_hits (max_hits), - &query_error); - - if (query_error) { - g_propagate_error (error, query_error); - return NULL; - } else if (!query_translated) { - g_set_error (error, - tracker_rdf_error_quark (), - 0, - "Invalid rdf query, no error given"); - return NULL; - } - - tracker_dbus_request_comment (request_id, - "Translated RDF query:'%s'", - query_translated); - - if (!tracker_is_empty_string (search_text)) { - tracker_data_search_text (iface, - service, - search_text, - 0, - 999999, - TRUE, - FALSE); - } - - result_set = tracker_db_interface_execute_query (iface, - NULL, - "%s", - query_translated); - g_free (query_translated); - } - - return result_set; -} - void tracker_search_get_hit_count (TrackerSearch *object, const gchar *service, @@ -974,256 +891,6 @@ tracker_search_files_by_text (TrackerSearch *object, } void -tracker_search_metadata (TrackerSearch *object, - const gchar *service, - const gchar *field, - const gchar *search_text, - gint offset, - gint max_hits, - DBusGMethodInvocation *context, - GError **error) -{ - TrackerDBResultSet *result_set; - GError *actual_error = NULL; - guint request_id; - gchar **values; - gchar *query_condition; - const gchar *fields[] = { - "File:NameDelimited", - NULL - }; - - /* FIXME: This function is completely redundant */ - - request_id = tracker_dbus_get_next_request_id (); - - tracker_dbus_async_return_if_fail (service != NULL, context); - tracker_dbus_async_return_if_fail (field != NULL, context); - tracker_dbus_async_return_if_fail (search_text != NULL, context); - - tracker_dbus_request_new (request_id, - "DBus request to search metadata, " - "service:'%s', search text:'%s', field:'%s', " - "offset:%d, max hits:%d", - service, - search_text, - field, - offset, - max_hits); - - if (!tracker_ontology_service_is_valid (service)) { - tracker_dbus_request_failed (request_id, - &actual_error, - "Service '%s' is invalid or has not been implemented yet", - service); - dbus_g_method_return_error (context, actual_error); - g_error_free (actual_error); - return; - } - - if (tracker_ontology_get_field_by_name (field) == NULL) { - tracker_dbus_request_failed (request_id, - &actual_error, - "Metadata field '%s' not registered in the system", - field); - dbus_g_method_return_error (context, actual_error); - g_error_free (actual_error); - return; - } - - - query_condition = tracker_rdf_query_for_attr_value (field, search_text); - result_set = search_perform_rdf_query (request_id, - service, - fields, - "", - NULL, - query_condition, - FALSE, - NULL, - FALSE, - offset, - max_hits, - &actual_error); - g_free (query_condition); - - values = tracker_dbus_query_result_to_strv (result_set, 1, NULL); - - dbus_g_method_return (context, values); - - g_strfreev (values); - - if (result_set) { - g_object_unref (result_set); - } - - tracker_dbus_request_success (request_id); -} - -void -tracker_search_matching_fields (TrackerSearch *object, - const gchar *service, - const gchar *id, - const gchar *search_text, - DBusGMethodInvocation *context, - GError **error) -{ - TrackerDBInterface *iface; - TrackerDBResultSet *result_set; - GError *actual_error = NULL; - guint request_id; - GHashTable *values = NULL; - - request_id = tracker_dbus_get_next_request_id (); - - tracker_dbus_async_return_if_fail (service != NULL, context); - tracker_dbus_async_return_if_fail (id != NULL, context); - tracker_dbus_async_return_if_fail (search_text != NULL, context); - - tracker_dbus_request_new (request_id, - "DBus request to search matching fields, " - "service:'%s', search text:'%s', id:'%s'", - service, - search_text, - id); - - if (!tracker_ontology_service_is_valid (service)) { - g_set_error (&actual_error, - TRACKER_DBUS_ERROR, - 0, - "Service '%s' is invalid or has not been implemented yet", - service); - dbus_g_method_return_error (context, actual_error); - g_error_free (actual_error); - return; - } - - if (tracker_is_empty_string (id)) { - g_set_error (&actual_error, - TRACKER_DBUS_ERROR, - 0, - "ID field must have a value"); - dbus_g_method_return_error (context, actual_error); - g_error_free (actual_error); - return; - } - - iface = tracker_db_manager_get_db_interface_by_service (service); - - /* FIXME: This function no longer exists, it was returning - * NULL in every case, this DBus function needs rewriting or - * to be removed. - */ - result_set = NULL; - - /* result_set = tracker_db_search_matching_metadata (iface, */ - /* service, */ - /* id, */ - /* search_text); */ - - values = tracker_dbus_query_result_to_hash_table (result_set); - - dbus_g_method_return (context, values); - - g_hash_table_destroy (values); - - if (result_set) { - g_object_unref (result_set); - } - - tracker_dbus_request_success (request_id); -} - -void -tracker_search_query (TrackerSearch *object, - gint live_query_id, - const gchar *service, - const gchar **fields, - const gchar *search_text, - const gchar **keywords, - const gchar *query_condition, - gboolean sort_by_service, - const gchar **sort_fields, - gboolean sort_desc, - gint offset, - gint max_hits, - DBusGMethodInvocation *context, - GError **error) -{ - TrackerDBResultSet *result_set; - GError *actual_error = NULL; - guint request_id; - GPtrArray *values = NULL; - - request_id = tracker_dbus_get_next_request_id (); - - tracker_dbus_async_return_if_fail (service != NULL, context); - tracker_dbus_async_return_if_fail (fields != NULL, context); - tracker_dbus_async_return_if_fail (search_text != NULL, context); - tracker_dbus_async_return_if_fail (keywords != NULL, context); - tracker_dbus_async_return_if_fail (query_condition != NULL, context); - - tracker_dbus_request_new (request_id, - "DBus request to search query, " - "query id:%d, service:'%s', search text '%s', " - "query condition:'%s', offset:%d, " - "max hits:%d, sort by service:'%s', sort descending'%s'", - live_query_id, - service, - search_text, - query_condition, - offset, - max_hits, - sort_by_service ? "yes" : "no", - sort_desc ? "yes" : "no"); - - if (!tracker_ontology_service_is_valid (service)) { - tracker_dbus_request_failed (request_id, - &actual_error, - "Service '%s' is invalid or has not been implemented yet", - service); - dbus_g_method_return_error (context, actual_error); - g_error_free (actual_error); - return; - } - - - result_set = search_perform_rdf_query (request_id, - service, - fields, - search_text, - keywords, - query_condition, - sort_by_service, - sort_fields, - sort_desc, - offset, - max_hits, - &actual_error); - - if (actual_error) { - tracker_dbus_request_failed (request_id, - &actual_error, - NULL); - dbus_g_method_return_error (context, actual_error); - g_error_free (actual_error); - return; - } - - values = tracker_dbus_query_result_to_ptr_array (result_set); - - dbus_g_method_return (context, values); - - tracker_dbus_results_ptr_array_free (&values); - - if (result_set) { - g_object_unref (result_set); - } - - tracker_dbus_request_success (request_id); -} - -void tracker_search_suggest (TrackerSearch *object, const gchar *search_text, gint max_dist, diff --git a/src/trackerd/tracker-search.h b/src/trackerd/tracker-search.h index a0c2b7d0d..890a1ed77 100644 --- a/src/trackerd/tracker-search.h +++ b/src/trackerd/tracker-search.h @@ -96,34 +96,6 @@ void tracker_search_files_by_text (TrackerSearch *object, gboolean group_results, DBusGMethodInvocation *context, GError **error); -void tracker_search_metadata (TrackerSearch *object, - const gchar *service, - const gchar *field, - const gchar *search_text, - gint offset, - gint max_hits, - DBusGMethodInvocation *context, - GError **error); -void tracker_search_matching_fields (TrackerSearch *object, - const gchar *service, - const gchar *id, - const gchar *search_text, - DBusGMethodInvocation *context, - GError **error); -void tracker_search_query (TrackerSearch *object, - gint live_query_id, - const gchar *service, - const gchar **fields, - const gchar *search_text, - const gchar **keywords, - const gchar *query_condition, - gboolean sort_by_service, - const gchar **sort_fields, - gint sort_field_count, - gint offset, - gint max_hits, - DBusGMethodInvocation *context, - GError **error); void tracker_search_suggest (TrackerSearch *object, const gchar *search_text, gint max_dist, |