static SearchThreadData * search_thread_data_new (NemoSearchEngineSimple *engine, NemoQuery *query) { SearchThreadData *data; char *text, *lower, *normalized, *uri; GFile *location; gint n, i; data = g_new0 (SearchThreadData, 1); data->engine = engine; data->directories = g_queue_new (); data->visited = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); uri = nemo_query_get_location (query); location = NULL; if (uri != NULL) { location = g_file_new_for_uri (uri); g_free (uri); } if (location == NULL) { location = g_file_new_for_path ("/"); } g_queue_push_tail (data->directories, location); text = nemo_query_get_text (query); normalized = g_utf8_normalize (text, -1, G_NORMALIZE_NFD); lower = g_utf8_strdown (normalized, -1); data->words = strsplit_esc_n (lower, ' ', '\\', -1, &n); g_free (text); g_free (lower); g_free (normalized); data->word_strstr = g_malloc(sizeof(gboolean)*n); data->words_and = TRUE; for (i = 0; data->words[i] != NULL; i++) { data->word_strstr[i]=TRUE; text = data->words[i]; while(*text!=0) { if(*text=='\\' || *text=='?' || *text=='*') { data->word_strstr[i]=FALSE; break; } text++; } if (!data->word_strstr[i]) data->words_and = FALSE; } data->mime_types = nemo_query_get_mime_types (query); data->cancellable = g_cancellable_new (); return data; }
static void action_show_hide_search_callback (GtkAction *action, gpointer user_data) { NemoWindowPane *pane = user_data; NemoWindow *window = pane->window; if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) { nemo_window_pane_ensure_search_bar (pane); } else { NemoWindowSlot *slot; GFile *location = NULL; slot = pane->active_slot; nemo_window_pane_hide_search_bar (pane); /* Use the location bar as the return location */ if (slot->query_editor != NULL) { NemoQuery *query; char *uri; query = nemo_query_editor_get_query (slot->query_editor); if (query != NULL) { uri = nemo_query_get_location (query); if (uri != NULL) { location = g_file_new_for_uri (uri); g_free (uri); } g_object_unref (query); } /* Last try: use the home directory as the return location */ if (location == NULL) { location = g_file_new_for_path (g_get_home_dir ()); } nemo_window_go_to (window, location); g_object_unref (location); } } }
static SearchThreadData * search_thread_data_new (NemoSearchEngineSimple *engine, NemoQuery *query) { SearchThreadData *data; char *text, *lower, *normalized, *uri; GFile *location; data = g_new0 (SearchThreadData, 1); data->engine = engine; data->directories = g_queue_new (); data->visited = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); uri = nemo_query_get_location (query); location = NULL; if (uri != NULL) { location = g_file_new_for_uri (uri); g_free (uri); } if (location == NULL) { location = g_file_new_for_path ("/"); } g_queue_push_tail (data->directories, location); text = nemo_query_get_text (query); normalized = g_utf8_normalize (text, -1, G_NORMALIZE_NFD); lower = g_utf8_strdown (normalized, -1); data->words = g_strsplit (lower, " ", -1); g_free (text); g_free (lower); g_free (normalized); data->mime_types = nemo_query_get_mime_types (query); data->cancellable = g_cancellable_new (); return data; }
static void nemo_search_engine_tracker_start (NemoSearchEngine *engine) { NemoSearchEngineTracker *tracker; gchar *search_text, *location_uri; GString *sparql; GList *mimetypes, *l; gint mime_count; tracker = NEMO_SEARCH_ENGINE_TRACKER (engine); if (tracker->details->query_pending) { return; } if (tracker->details->query == NULL) { return; } g_cancellable_reset (tracker->details->cancellable); search_text = nemo_query_get_text (tracker->details->query); location_uri = nemo_query_get_location (tracker->details->query); mimetypes = nemo_query_get_mime_types (tracker->details->query); mime_count = g_list_length (mimetypes); #ifdef FTS_MATCHING /* Using FTS: */ sparql = g_string_new ("SELECT nie:url(?urn) " "WHERE {" " ?urn a nfo:FileDataObject ;" " tracker:available true ; "); if (mime_count > 0) { g_string_append (sparql, "nie:mimeType ?mime ;"); } g_string_append (sparql, " fts:match "); sparql_append_string_literal (sparql, search_text); if (location_uri || mime_count > 0) { g_string_append (sparql, " . FILTER ("); if (location_uri) { g_string_append (sparql, " fn:starts-with(nie:url(?urn),"); sparql_append_string_literal (sparql, location_uri); g_string_append (sparql, ")"); } if (mime_count > 0) { if (location_uri) { g_string_append (sparql, " && "); } g_string_append (sparql, "("); for (l = mimetypes; l != NULL; l = l->next) { if (l != mimetypes) { g_string_append (sparql, " || "); } g_string_append (sparql, "?mime = "); sparql_append_string_literal (sparql, l->data); } g_string_append (sparql, ")"); } g_string_append (sparql, ")"); } g_string_append (sparql, " } ORDER BY DESC(fts:rank(?urn)) ASC(nie:url(?urn))"); #else /* FTS_MATCHING */ /* Using filename matching: */ sparql = g_string_new ("SELECT nie:url(?urn) " "WHERE {" " ?urn a nfo:FileDataObject ;"); if (mime_count > 0) { g_string_append (sparql, "nie:mimeType ?mime ;"); } g_string_append (sparql, " tracker:available true ." " FILTER (fn:contains(nfo:fileName(?urn),"); sparql_append_string_literal (sparql, search_text); g_string_append (sparql, ")"); if (location_uri) { g_string_append (sparql, " && fn:starts-with(nie:url(?urn),"); sparql_append_string_literal (sparql, location_uri); g_string_append (sparql, ")"); } if (mime_count > 0) { g_string_append (sparql, " && "); g_string_append (sparql, "("); for (l = mimetypes; l != NULL; l = l->next) { if (l != mimetypes) { g_string_append (sparql, " || "); } g_string_append (sparql, "?mime = "); sparql_append_string_literal (sparql, l->data); } g_string_append (sparql, ")"); } g_string_append (sparql, ")"); g_string_append (sparql, "} ORDER BY DESC(nie:url(?urn)) DESC(nfo:fileName(?urn))"); #endif /* FTS_MATCHING */ tracker_sparql_connection_query_async (tracker->details->connection, sparql->str, tracker->details->cancellable, query_callback, tracker); g_string_free (sparql, TRUE); tracker->details->query_pending = TRUE; g_free (search_text); g_free (location_uri); if (mimetypes != NULL) { g_list_free_full (mimetypes, g_free); } }