Порядок логических предложений Google Drive API Q - PullRequest
1 голос
/ 01 июля 2019

Итак, у меня возникла проблема при попытке вывести список определенных файлов с моего диска, исходный код был:

var request = _DriveService.Files.List();
request.Q = $"name = '{Properties.Settings.Default.SomeFileName0}'" +
        $" or name = '{Properties.Settings.Default.SomeFileName1}'" +
        $" or name = '{Properties.Settings.Default.SomeFileName2}'" +
        $" or name = '{Properties.Settings.Default.SomeFileName3}'" +
        " and trashed = false" +
        $" and '{Properties.Settings.Default.MyParents[0]}' in parents";
request.Fields = "files(id, name, parents)";
var files = await request.ExecuteAsync();

Проблема была в том, что он вернул 12 файлов вместо 4 файлов. После небольшого тестирования или настройки я понял, что google drive игнорирует предложения and, поэтому он извлекает все удаленные файлы.

Теперь, с этим кодом, он работает как шарм:

var parentsTrashed = $"and '{Properties.Settings.Default.Myparents[0]}' in parents and trashed = false";
var request = _DriveService.Files.List();
request.Q = $"name = '{Properties.Settings.Default.SomeFileName0}' {parentsTrashed}" +
    $" or name = '{Properties.Settings.Default.SomeFileName1}' {parentsTrashed}" +
    $" or name = '{Properties.Settings.Default.SomeFileName2}' {parentsTrashed}" +
    $" or name = '{Properties.Settings.Default.SomeFileName3}' {parentsTrashed}";
request.Fields = "files(id, name, parents)";
var files = await request.ExecuteAsync();

Таким образом, пункты and s и or s должны быть в следующем порядке: (name and and and) OR (name and and and) OR ....

Я не могу найти никаких указаний на это ни в документации, ни в интернете: Это ошибка или она предназначена? Разве это не должно быть отмечено в документации, или я просто не нашел его, или это стандартная вещь, о которой я до сих пор не знал (я любитель)?

1 Ответ

3 голосов
/ 01 июля 2019

Хотя я не знаю конкретных правил для приоритета операторов в запросах Drive, как минимум облегчит чтение, если вы укажете, что вы имеете в виду, используя скобки:

var request = _DriveService.Files.List();
request.Q = $"(name = '{Properties.Settings.Default.SomeFileName0}'" +
        $" or name = '{Properties.Settings.Default.SomeFileName1}'" +
        $" or name = '{Properties.Settings.Default.SomeFileName2}'" +
        $" or name = '{Properties.Settings.Default.SomeFileName3}')" +
        " and trashed = false" +
        $" and '{Properties.Settings.Default.MyParents[0]}' in parents";
request.Fields = "files(id, name, parents)";
var files = await request.ExecuteAsync();

Таким образом, запрос будет иметь вид:

(name = name1 or name = name2 or name = name3 or name = name4)
and trashed = false and parentid in parents

(Без разрыва строки, конечно.)

Я подозреваю, что в вашем текущем запросе это эффективно:

name = name1 or name = name2 or name = name3 or
(name = name4 and trashed = false and parentid in parents)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...