pyparsing необязательное подполе - PullRequest
1 голос
/ 12 августа 2011

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

Итак, запрос SQL может выглядеть так:

SELECT a FROM x WHERE a = b ...
ORDER BY c, d
ORDER BY c asc, d
ORDER BY c asc, d desc
ORDER BY c, d asc

Я возился, и лучшее, что я придумал, это:

order_dir = oneOf('asc desc', caseless=True)
...
Optional( CaselessKeyword('order by') + columnNameList('order') + Optional(order_dir)('order_dir'))
...

Для чего-то вроде ORDER BY c asc, d desc, это соответствует, что c - это первое, что я заказываю, а asc - это мой каталог, но он не достигает d.

Я бы с радостью воспринял вывод как что-то вроде ['c asc', 'd desc'], до тех пор, пока я все еще могу получить columnNameList.

Есть ли способ справиться с этим с помощью разбора? Был ли мой вопрос неясным?

1 Ответ

1 голос
/ 12 августа 2011

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

для pyparsing. Попробуйте изменить ваше предложение на:

Optional( CaselessKeyword('order by') + 
        delimitedList(Group(columnNameList('order') + 
                            Optional(order_dir, default="asc")('order_dir')))('orderByColumns')
        )

Это даст вам поле с именем 'orderByColumns', содержащее последовательностьпар.Даже если квалификатор asc / desc опущен, поле по умолчанию класса Optional вставит «asc».Прочитайте эти столбцы как:

if result.orderByColumns:
    for ocol in result.orderByColumns:
        print "Order by %(order)s (%(order_dir)s)" % ocol

(все непроверенные)

...