Очень специальная тема...
Mar. 18th, 2015 03:11 pm...Вообще-то, ей место в каком-нибудь специализированном форуме. Но как показывает практика моего общения с коллегами по бранчу (веб-программирование), чукча - не писатель, чукча - читатель. А на русскоязычных ресурсах просто начнется срач.
Особенно надеюсь на участие в теме френдов
mr_bison и
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)
То есть, тривиальные логические операторы плюс коллбэк, возвращающий булево значение, для нетривиальных случаев, типа свойств нода и т. д...
Вот, собственно... Критика, предложения, вот это все...)) люто приветствуются.
Особенно надеюсь на участие в теме френдов
...В общем, я хочу реализовать концепцию под условным названием 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)
То есть, тривиальные логические операторы плюс коллбэк, возвращающий булево значение, для нетривиальных случаев, типа свойств нода и т. д...
Вот, собственно... Критика, предложения, вот это все...)) люто приветствуются.