Запрашивать отдельные термины по нескольким объектам и полям

Salesforce отлично подходит для структурирования данных… большого количества данных. Вы потратили время на создание библиотеки sObjects, разбив все данные на части, но что произойдет, если вы захотите выполнить поиск по нескольким sObjects?

Здесь в игру вступает язык поиска объектов Salesforce (SOSL).

SOSL идеально подходит для запроса имен, электронных писем и других текстовых данных по указанному списку объектов sObject. Вы хотите изучить все потенциальные клиенты и возможности, связанные с конкретным адресом электронной почты? SOSL - ваш лучший друг.

Мы собираемся определить различные части запроса SOSL и обсудить, как анализировать последующие результаты. Используйте эту статью как начальное руководство и справочную информацию, поскольку вы берете под свой контроль свои данные, а не купаетесь в них.

Разбивка запроса SOSL

В запросе SOSL есть три ключевых слова и три соответствующих компонента, которые необходимо заполнить. Прежде чем мы разберем различные части, вот образец запроса SOSL:

FIND '[email protected]' IN EMAIL FIELDS RETURNING Lead, Opportunity

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

FIND __terms__ IN __fields__ RETURNING __objects__

Теперь, когда мы определили ключевые слова, давайте разберем три компонента на запрос SOSL.

  • Термины: строковые значения, которые ищутся. Это может быть одна строка, как в примере выше, или несколько, связанных с ключевым словом OR.
  • Поля: тип поля метаданных для поиска. Помимо EMAIL FIELDS, есть другие варианты NAME FIELDS, PHONE FIELDS и ALL FIELDS.
  • Объекты: объекты sObjects, по которым будет производиться поиск. Может включать списки полей и даже логику фильтрации.

Анализ результатов SOSL

Прежде чем мы начнем анализировать результаты SOSL, нам необходимо понять структуру ответа на запрос. Запросы SOSL возвращают «Список списков».

Анализируя наш первоначальный пример запроса, внешний список содержит две записи: List ‹Lead› и List ‹Opportunity›. Расположение определяется последовательностью в запросе. Поскольку Lead был первым, доступ к его списку осуществляется с помощью индекса 0, а доступ к объекту Opportunity осуществляется с помощью индекса 1.

Мы сохраняем результаты с типом данных sObject, который является родительским классом как для Lead, так и для Opportunity.

List<List<sObject>> results = [FIND '[email protected]' IN EMAIL FIELDS RETURNING Lead, Opportunity];

С этого момента есть два способа проанализировать результаты. Мы знаем, что первый индекс - это данные List ‹Lead›, а второй индекс - это данные List ‹Opportunity›, поэтому мы можем сделать следующее:

For(Lead lead: (List<Lead>)results[0]) {
   System.debug(lead.Id);
}
For(Opportunity opportunity: (List<Opportunity>)results[1]) {
   System.debug(opportunity.Id);
}

Обратите внимание, что мы приводим каждый индекс к соответствующему типу данных из общего типа sObject.

Другой вариант - сохранить тип данных sObject и использовать вложенные циклы for.

For(List<sObject> objectList: results) {
    For(sObject obj: objectList) {
        System.debug(obj.Id);
    }
}

Настройка запросов SOSL

Теперь, когда мы рассмотрели структуру и способы анализа результатов, важно выделить, как настраивать запросы SOSL.

Подстановочные знаки

При определении условий поиска мы можем использовать символы ? и * в качестве подстановочных знаков для выполнения нечеткого поиска. Знак вопроса служит односимвольным подстановочным знаком, а звездочка - многосимвольным подстановочным знаком.

Например, если мы хотим найти любой адрес Gmail, мы могли бы использовать поисковый запрос: '*@gmail.com'

Точно так же мы можем искать любой двухсимвольный домен верхнего уровня, используя звездочку для имени пользователя, в символе, звездочку для домена, точку и, наконец, двойной вопросительный знак: '*@*.??'

Поля и критерии списка объектов

Помимо указания sObject для включения в поиск, поля могут быть указаны в скобках после каждого имени sObject. Это позволяет настраивать результаты полей для каждого sObject.

FIND '[email protected]' IN EMAIL FIELDS RETURNING Lead(Name, Email, Phone), Opportunity(Name, Amount)

В качестве небольшого примечания, при использовании настраиваемых списков полей для каждого объекта я настоятельно рекомендую анализировать результаты «для конкретного sObject» вместо общего вложенного цикла for.

Мы даже можем включить критерии в круглые скобки для дальнейшей настройки результатов поиска.

FIND '[email protected]' IN EMAIL FIELDS RETURNING Lead(Name, Email, Phone), Opportunity(Name, Amount WHERE Stage != 'Closed Won')

Это позволяет нам включать критерии для конкретных объектов в дополнение к вышеупомянутому поисковому запросу.

Заключение

SOSL не следует путать с SOQL. Используйте SOSL (идентифицируемый ключевым словом FIND) для поиска по нескольким объектам sObject с гибкими критериями и настраиваемыми списками объектов.

После выполнения запроса возвращается «Список списков», в котором вы можете либо проанализировать каждый отдельный тип sObject, используя его значение индекса, либо использовать общий вложенный цикл for.

Поделитесь своим опытом, вопросами и отзывами ниже. Следуйте Коду 85 для получения дополнительных руководств по программированию на простом языке. Спасибо за внимание!