Кому оценивать SQL-запрос с использованием объекта RelNode - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь преобразовать SQL-запрос в Tinkerpop Gremlin. Библиотека sql2Gremlin делает это, но смотрит на соединение как на отношение, в то время как я полагаюсь на подход без объединения, где вы можете ссылаться на отношения с точкой в ​​качестве разделителя между двумя сущностями.

Я проанализировал и подтвердил запрос, и у меня есть объект RelRoot.

Apache calcite возвращает объект RelRoot, который является корнем алгебраического выражения.

Допустим, я не хочу применять какие-либо методы оптимизации запросов. Как использовать посетителя RelNode для преобразования RelRoot в TinkerPop Gremlin DSL.

В идеале я бы сначала использовал предложение From, а затем применил фильтры, определенные в предложении where? Как выбрать, фильтры, предложение From представляют в дереве RelRoot?

Что означает Apache Calcite под реляционным выражением или RelNode?

Перефразируя тот же вопрос без контекста TinkerPop Gremlin: Как мне использовать посетителя RelRoot для посещения RelRoot и преобразования запроса в другой DSL?

1 Ответ

0 голосов
/ 28 мая 2019

Я не знаю, почему вы настаиваете на RelRoot, а не на RelNode дереве, но Apache Calcite выполняет оптимизацию реляционной алгебры в стеке RelNode.Существует класс RelVisitor , который может показаться вам интересным, поскольку он может делать именно то, что вам нужно: посетить все RelNodes.Затем вы можете извлечь из них нужную вам информацию и создать из нее свой DSL.

РЕДАКТИРОВАТЬ: В RelVisitor у вас есть доступ к родительскому узлу и дочерним узлам текущего посещенного узла.Вы можете извлечь всю информацию, обычно доступную для объекта RelNode (см. docs ), и если вы приведете ее к конкретной операции реляционной алгебры, например, Project, вы можете извлечь, какие поля находятся внутриОперация Project выполняется с помощью node.getRowType().getFieldList().forEach(field -> names.add(field.getName())), где имена - это ранее определенные Set<String>.Вы можете найти полный код здесь .

. Вы также должны взглянуть на документы по алгебре , чтобы понять, как SQL отображает реляционную алгебру в Calcite, прежде чем пытаться это сделать.

...