search

Sergey ShishkinSergey Shishkin
4 min read

Функция, которой в документации посвящена отдельная большая статья. Выполняет поиск в базе данных по произвольному числу любых критериев.

(search 'any 'lst ['any 'lst ..] ['fun]) -> lst

(search 'lst) -> obj | NIL

Первая форма возвращает список, содержащий структуру запроса согласно соответствующим спискам lst спецификаций отношений. Критерий поиска может быть атомом для точного поиска или парой cons для поиска по диапазону.

Спецификация отношения может быть списком (var cls [hook]) для поиска индекса, парой cons (sym . sym) для двух конечных точек +Joint или — только вместо первой спецификации в lst — двумя функциями: функцией-генератором и функцией-фильтром. Последний аргумент fun может опционально фильтровать и, возможно, изменять каждый результат.

Вторая форма принимает структуру запроса, возвращаемую первой формой, и возвращает следующий результат (объект) или NIL (если больше нет соответствующих результатов). См. также init, step и collect.

: (for
   (Q
      (search
         (2 . 5) '((nr +Item))  # Select all items with numbers between 2 and 5
         "Active" '((nm +CuSu) (sup +Item)) )  # and suppliers matching "Active"
      (search Q) )
   (show @) )
{B3} (+Item)
   sup {C1}
   nr 3
   pr 15700
   inv 100
   nm "Auxiliary Construction"
{B5} (+Item)
   sup {C1}
   nr 5
   pr 7980
   inv 100
   nm "Metal Fittings"
-> {B5}

https://picolisp.tiddlyhost.com/#search

Каждый критерий — это атрибут объекта базы данных (например, имя, адрес электронной почты, адрес и т. д.) или некоторого заданного объекта базы данных. Он может использоваться для непосредственного поиска объектов или в качестве отправной точки для рекурсивного поиска других объектов, достижимых этим объектом. Для каждого критерия поиска, который является NIL, поиск не выполняется, и следующая спецификация отношения игнорируется. Если, однако, все критерии поиска являются NIL, принудительно выполняется полный поиск по последней спецификации отношения ...

Если критерий поиска числовой (включая производные типы, такие как дата или время), он может быть атомарным для точного поиска или парой констант для поиска в диапазоне чисел ...

Если критерий поиска — строка (переходный символ) или внутренний символ, или пара cons из них, точное поведение зависит от типа отношения. Оно включает все случаи, когда оно соответствует заголовкам атрибутов результата (префиксы строк), но также может соответствовать подстрокам и/или толерантным ( fold ed или soundex-encoded) поиском ...

Объект базы данных также может быть использован в качестве критерия поиска. Пара (т.е. диапазон) объектов не имеет смысла, поскольку сами по себе объекты не упорядочены.

Каждый второй аргумент search — это список спецификаций отношений. В типичных случаях использования спецификация отношений — это либо список (var cls [hook]) для индексного отношения, или пара (sym . sym) для +Joint отношения.

Для общих случаев первая спецификация в списке может быть заменена двумя пользовательскими функциями: функцией генератора и функцией фильтра. Это позволяет начать поиск из произвольных ресурсов, таких как удаленные базы данных или сопрограммы. Если спецификация есть (var cls), но var не является индексом cls, будет выполнен поиск методом перебора по объектам в файле базы данных cls. Это следует делать только для небольших файлов, в идеале содержащих все объекты типа cls.

Остальная часть списка содержит ассоциации (которые также являются спецификациями отношений) для рекурсивного поиска по связанным объектам. Обычно это , , или отношения. (+Joint) (+List +Joint) (+Ref +Link)

Если список спецификаций отношений начинается не с индексного отношения (var cls) или совместного отношения (sym . sym), а с функции типа ((X) (foo)), то первые два элемента списка берутся как функции-генератор и фильтр соответственно.

(!?) Хотя relQ обычно не используется напрямую прикладными программами, поскольку ее функциональность обеспечивается стандартным синтаксисом спецификации отношений, существует функция relQs, которая действительно полезна. relQs создает правильные функции генератора и фильтра, которые могут выполнять поиск по нескольким индексам для одного критерия поиска.

Иногда необходимо выполнить дополнительные проверки результатов поиска, которые могут не подпадать под стандартное сопоставление комбинированных критериев поиска. Функция curry может также вместо возврата объекта или NIL возвращать некоторое другое значение, подходящее для приложения.

В общем случае возвращаемые значения search не сортируются, когда задано несколько критериев поиска. Это происходит потому, что индексы перебираются в непредсказуемом порядке. Однако если указан только один критерий поиска или только один из критериев поиска не является NIL, то результаты будут возвращены в отсортированном порядке в соответствии с указанным индексом.

https://picolisp.tiddlyhost.com/#The%20'search'%20Function

P.S. (!?) Функция, описания которой я нигде пока найти не могу, relQ … тем более relQs … так что без дальнейших комментариев …

0
Subscribe to my newsletter

Read articles from Sergey Shishkin directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Sergey Shishkin
Sergey Shishkin

Всегда чему-то учусь!