Chromium Code Reviews| Index: chrome/browser/google_apis/drive_api_service.cc |
| diff --git a/chrome/browser/google_apis/drive_api_service.cc b/chrome/browser/google_apis/drive_api_service.cc |
| index 20b48049e8a71ce79ea910f82aeb02506beeaca9..5931e3b8055895538e534e4eb98c6221762bf549 100644 |
| --- a/chrome/browser/google_apis/drive_api_service.cc |
| +++ b/chrome/browser/google_apis/drive_api_service.cc |
| @@ -9,10 +9,12 @@ |
| #include "base/bind.h" |
| #include "base/message_loop_proxy.h" |
| +#include "base/string16.h" |
| #include "base/string_util.h" |
| #include "base/stringprintf.h" |
| #include "base/task_runner_util.h" |
| #include "base/threading/sequenced_worker_pool.h" |
| +#include "base/utf_string_conversions.h" |
| #include "base/values.h" |
| #include "chrome/browser/google_apis/auth_service.h" |
| #include "chrome/browser/google_apis/drive_api_operations.h" |
| @@ -209,6 +211,69 @@ std::string EscapeQueryStringValue(const std::string& str) { |
| return result; |
| } |
| +// Parses the query, and builds a search query for Drive API v2. |
| +// This only supports: |
| +// Regular query (e.g. dog). |
| +// Conjunctions (e.g. dog cat). |
| +// Exclusion query (e.g. -cat). |
|
hashimoto
2013/04/18 07:23:50
Please add output examples.
hidehiko
2013/04/18 09:04:32
Done.
|
| +// Quoted query (e.g. "dog cat"). |
|
kinaba
2013/04/18 06:59:48
Could you add the URLs for the search syntax of tw
hidehiko
2013/04/18 09:04:32
Done.
|
| +std::string TranslateQuery(const std::string& original_query) { |
|
hashimoto
2013/04/18 07:23:50
Can't we have a test for this function or DriveAPI
hidehiko
2013/04/18 09:04:32
Done.
|
| + base::string16 query = UTF8ToUTF16(original_query); |
|
hashimoto
2013/04/18 07:23:50
Why do we need to convert the string to UTF16, not
hidehiko
2013/04/18 09:04:32
To handle non-ascii white space correctly. Added c
|
| + const base::string16 kDelimiter( |
| + kWhitespaceUTF16 + base::string16(1, static_cast<char16>('"'))); |
| + |
| + std::string result; |
| + for (size_t index = query.find_first_not_of(kWhitespaceUTF16); |
| + index != base::string16::npos; |
| + index = query.find_first_not_of(kWhitespaceUTF16, index)) { |
| + bool is_exclusion = false; |
| + size_t begin_token = index; |
| + base::string16 token; |
| + if (query[begin_token] == '"') { |
| + // Quoted query. |
| + ++begin_token; |
| + size_t end_token = query.find('"', begin_token); |
| + if (end_token == base::string16::npos) { |
| + // This is kind of syntax error, since quoted string isn't finished. |
| + // However, the query is built by user manually, so here we treat |
| + // whole remaining string as a token as a fallback. |
|
kinaba
2013/04/18 06:59:48
How about:
end_token = query.length();
query += '"
hidehiko
2013/04/18 09:04:32
Indeed. Done.
|
| + token = query.substr(begin_token); |
| + index = base::string16::npos; |
| + } else { |
| + token = query.substr(begin_token, end_token - begin_token); |
| + index = (end_token + 1); // Consume last '"', too. |
| + } |
| + } else { |
| + size_t end_token = query.find_first_of(kDelimiter, begin_token); |
| + if (end_token == base::string16::npos) { |
| + end_token = query.length(); |
| + } |
| + |
| + if (query[begin_token] == '-' && end_token > begin_token + 1) { |
| + // This is an exclusion query token. |
| + is_exclusion = true; |
| + ++begin_token; |
| + } |
| + |
| + token = query.substr(begin_token, end_token - begin_token); |
| + index = end_token; |
| + } |
| + |
| + if (!result.empty()) { |
| + // If there are two or more tokens, need to connect with "and". |
| + result.append(" and "); |
| + } |
| + |
| + base::StringAppendF( |
|
kinaba
2013/04/18 06:59:48
Please add comment on what "fullText" includes, li
hidehiko
2013/04/18 09:04:32
Done.
|
| + &result, |
| + "%sfullText contains \'%s\'", |
| + is_exclusion ? "not " : "", |
| + EscapeQueryStringValue(UTF16ToUTF8(token)).c_str()); |
| + } |
| + |
| + return result; |
| +} |
| + |
| // The resource ID for the root directory for Drive API is defined in the spec: |
| // https://developers.google.com/drive/folder |
| const char kDriveApiRootDirectoryResourceId[] = "root"; |
| @@ -342,7 +407,7 @@ void DriveAPIService::Search(const std::string& search_query, |
| operation_registry(), |
| url_request_context_getter_, |
| url_generator_, |
| - search_query, |
| + TranslateQuery(search_query), |
| base::Bind(&ParseResourceListOnBlockingPoolAndRun, callback))); |
| } |