как оценить SQL-запрос с использованием объекта RelNode

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

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

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

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

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

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

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


person Nischal Kumar    schedule 26.04.2019    source источник


Ответы (1)


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

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

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

person igrgurina    schedule 28.05.2019
comment
Когда я посещаю RelNodes, как мне извлечь информацию из RelNode? - person Nischal Kumar; 29.05.2019
comment
@NischalKumar Я обновил ответ объяснением. Пожалуйста, примите его, если он отвечает на ваш вопрос. - person igrgurina; 29.05.2019