crocuta: (Default)
[personal profile] crocuta
...Вообще-то, ей место в каком-нибудь специализированном форуме. Но как показывает практика моего общения с коллегами по бранчу (веб-программирование), чукча - не писатель, чукча - читатель. А на русскоязычных ресурсах просто начнется срач.

Особенно надеюсь на участие в теме френдов [livejournal.com profile] mr_bison и [livejournal.com profile] yurakolotov, как, так сказать, профильных специалистов.

...В общем, я хочу реализовать концепцию под условным названием JPATH - рекурсивный поиск по узлам дерева в формате JSon. Синтаксис каковой концепции, собственно, и представлен к обсуждению.

Уровень 1. Простейший поиск.

Описание инструкции простейшего поиска состоит из следующих частей...

1. Указатель глубины и направления. Опционально. Имеются следующие виды указателей...

= - поиск только в текущем узле.
> - поиск только в прямых потомках(детях) текущего узла.
=> - поиск в текущем узле и его детях.
>> - поиск во всех потомках текущего узла.
=>> - поиск в текущем узле и всех его потомках.
< - поиск только в прямом предке(родителе) данного узла.
=< - поиск в текущем узле и его родителе.
<< - поиск во всех предках текущего узла.
=<< - поиск в текущем узле и всех его предках.

По умолчанию данная опция считается равной >>, то есть, поиску по всем потомкам текущего узла.

2. Собственно, описание разыскиваемого узла. Может выглядеть следующим образом...

key|* - поиск узла с заданным именем (здесь и далее, звездочка - любой узел).
key|*=value - поиск узла с заданными именем и заданным скалярным значением(здесь и далее, возможно задание колбэка).
key|*={min, max}|[min, max]|[eq]|{notEq} - поиск узла со скалярным значением в заданных пределах .
key|*{min, max}|[min, max]|[eq]|{notEq} - поиск узла с количеством детей в заданных пределах.
key|*(scope|Array|Object|Function|Scalar|String|Number) - поиск узла заданного типа.
key|*(scope|Array|Object|Function|Scalar|String|Number)=value - поиск узла заданного типа с заданным значением.

3. Характеристики узлов, связанных с разыскиваемым.

. - прямые потомки данного узла.
.. - потомки данного узла.
: - прямой предок данного узла.
:: - предки данного узла.
+ - сиблинг данного узла, стоящий непосредственно перед ним.
~ - любой сиблинг данного узла.

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

product::products.name=function(value){return value.match(/^specific/)} - все узлы с именем "продукт", имеющие предков по имени "продукты", у которых имеются подузлы "имя", начинающиеся с подстроки "специфический".

Уровень 2. Пайпс.

На этом уровне происходит поиск по следующей инструкции, исходя из результатов поиска предыдущей. Символом передачи является прямой слэш(/). Например...

*.tag=div/=*.class=container - среди всех узлов, имеющих прямого потомка "тэг" со значением "див", отбираются узлы, имеющие прямого потомка с именем "класс" и значением "контейнер".

Уровень 3. Операции со множествами найденных узлов. Имеются следующие операции с равным приоритетом...

, - объединение.
; - пересечение.
! - вычитание.

Например...

customer.city=Düsseldorf,customer.land={Germany} - поиск всех клиентов, живущих в Дюссельдорфе или не живущих в Германии.

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

UPD Все же, полезно бывает изложить свои мысли в письменной форме.

Я тут подумал... Формат задания узла должен быть примерно таким...

key=value
key!=value
...
key=callback(value, key, node)

То есть, тривиальные логические операторы плюс коллбэк, возвращающий булево значение, для нетривиальных случаев, типа свойств нода и т. д...

Вот, собственно... Критика, предложения, вот это все...)) люто приветствуются.
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

Profile

crocuta: (Default)
crocuta

March 2026

S M T W T F S
1234567
891011121314
15161718192021
22232425262728
293031    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 4th, 2026 08:43 am
Powered by Dreamwidth Studios