2016-06-21 5 views
0

beginne ich vor kurzem Calcit Lernen (1.8.0) und ich habe folgende Anwendungsfall: inWie kann ich SqlNode Ausdruck (nicht Abfrage!) Zu RelNode konvertieren?

Ich brauche eine Liste von Zeichenketten wie „SUM(x)/SUM(y) as myRatio“, „MAX(z) as maxZ“ oder "CASE WHEN …“ zu AggCall s und es zu verwenden, zu transformieren . RelBuilder später

So scheint wie ich folgende tun sollte:.. konvertieren string -> sQL-Knoten -> rel Knoten I String umgewandelt sql-knoten SqlParser.parseExpression mit und versuchte Planner.rel(sqlNode) sql-knoten zu RelNode zu konvertieren, aber ohne Glück versucht auch SqlToRelConverter zu erstellen Ich selbst kann aber nicht herausfinden, wie man einen Validator, einen Katalogleser und einen Cluster aus einer Konfiguration erstellt, die nur mit JdbcSchema erstellt wurde.

Antwort

0

Es ist ein bisschen schwierig, weil Sie sich mit Aufrufen zum Aggregieren von Funktionen befassen, und dies sind keine gewöhnlichen Ausdrücke. Es ist zu beachten, dass ein AggCall, der von RelBuilder verwendet wird, weder ein SqlNode noch ein RexNode ist.

Die einfachste Sache ist wahrscheinlich, Ihre Ausdruckszeichenfolge in eine gültige Abfragezeichenfolge zu konvertieren. Z.B. "SUM(x)/SUM(y) as myRatio"" wird "SELECT SUM(x)/SUM(y) as myRatio FROM (VALUES (0, 0)) AS t(x, y)". Dann parsen Sie dies und konvertieren Sie es in RelNode. PlannerTest.testParseAndConvert macht genau das; Es verwendet nur ein paar Zeilen Code, so dass Sie von dieser Methode kopieren und einfügen können.

+0

danke! also kann ich 'SUM (x)/SUM (y) als myRatio 'in' RelNode' umwandeln, aber wie kann ich einen weiteren Ausdruck hinzufügen? zum Beispiel "SUM (x) als X". Ich erwarte, "SUM (x)/SUM (y) als myRatio" Teil von "RelNode" zu extrahieren und es zu einem Erbauer hinzuzufügen und dasselbe für "SUMME (x) als X" zu tun. Nicht sicher, ob es möglich ist ... –

+0

Sie können SELECT SUM (x)/SUM (y) als myRatio, SUM (x) AS x, SUM (y) AS y FROM (WERTE (0, 0)) AS t konvertieren (x, y) 'genauso wie die vorherige Abfrage. Sie werden mit einem 'Aggregate' enden, um die Summen zu berechnen, dann ein' Projekt', das '$ 0/$ 1 als myRatio, $ 0 als x, $ 1 als y' berechnet. Oder, wenn Sie 'RelBuilder' verwenden, können Sie' RelBuilder.aggregate() 'aufrufen, um' SUM (x) 'und' SUM (y) 'zu erstellen, und dann' RelBuilder.project() 'aufrufen, um zu projizieren '$ 0/$ 1 als myRatio, $ 0 als x, $ 1 als y'. –

Verwandte Themen