Skip to content

Commit 9d71386

Browse files
authored
Merge pull request #563 from mspruc/main
added main method for sql context, calcite dependency fix
2 parents de3cba2 + 7f834f4 commit 9d71386

3 files changed

Lines changed: 114 additions & 3 deletions

File tree

pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@
106106
<scala.mayor.version>2.12</scala.mayor.version>
107107
<spark.version>3.4.4</spark.version>
108108
<flink.version>1.20.0</flink.version>
109+
<calcite.version>1.39.0</calcite.version>
109110

110111
<java.version>17</java.version>
111112
<source.level>17</source.level>

wayang-api/wayang-api-sql/src/main/java/org/apache/wayang/api/sql/context/SqlContext.java

Lines changed: 107 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717

1818
package org.apache.wayang.api.sql.context;
1919

20+
import org.apache.commons.lang3.StringUtils;
21+
22+
2023
import org.apache.calcite.jdbc.CalciteSchema;
2124
import org.apache.calcite.jdbc.JavaTypeFactoryImpl;
2225
import org.apache.calcite.rel.RelNode;
@@ -25,6 +28,8 @@
2528
import org.apache.calcite.sql.parser.SqlParseException;
2629
import org.apache.calcite.tools.RuleSet;
2730
import org.apache.calcite.tools.RuleSets;
31+
32+
import org.apache.wayang.api.sql.calcite.utils.ModelParser;
2833
import org.apache.wayang.api.sql.calcite.convention.WayangConvention;
2934
import org.apache.wayang.api.sql.calcite.optimizer.Optimizer;
3035
import org.apache.wayang.api.sql.calcite.rules.WayangRules;
@@ -39,6 +44,13 @@
3944
import org.apache.wayang.postgres.Postgres;
4045
import org.apache.wayang.spark.Spark;
4146

47+
import org.json.simple.JSONObject;
48+
import org.json.simple.parser.JSONParser;
49+
50+
import java.io.BufferedWriter;
51+
import java.io.IOException;
52+
import java.nio.file.Files;
53+
import java.nio.file.Paths;
4254
import java.sql.SQLException;
4355
import java.util.ArrayList;
4456
import java.util.Collection;
@@ -72,10 +84,103 @@ public SqlContext(final Configuration configuration, final List<Plugin> plugins)
7284
for (final Plugin plugin : plugins) {
7385
this.withPlugin(plugin);
7486
}
75-
87+
7688
calciteSchema = SchemaUtils.getSchema(configuration);
7789
}
7890

91+
/**
92+
* Entry point for executing SQL statements while providing arguments.
93+
* You need to provide at least a JDBC source.
94+
*
95+
* @param args args[0] = SQL statement path, args[1] = JDBC driver, args[2] =
96+
* JDBC URL, args[3] = JDBC user,
97+
*              args[4] = JDBC password, args[5] = outputPath,
98+
* args[6...] = platforms
99+
*/
100+
public static void main(final String[] args) throws Exception {
101+
if (args.length < 5)
102+
throw new IllegalArgumentException(
103+
"Usage: ./bin/wayang-submit org.apache.wayang.api.sql.SqlContext <SQL statement path> <JDBC driver> <JDBC URL> <JDBC user> <JDBC password> <Result output path> [platforms...]");
104+
105+
final String queryPath = args[0];
106+
final String jdbcDriver = args[1];
107+
final String jdbcUrl = args[2];
108+
final String jdbcUser = args[3];
109+
final String jdbcPassword = args[4];
110+
final String outputPath = args[5];
111+
112+
final String query = StringUtils.chop(
113+
Files.readString(Paths.get(queryPath))
114+
.stripTrailing());
115+
116+
final String driverPlatform = jdbcDriver.split("\\.")[0];
117+
118+
final String calciteModel = String.format(
119+
"{\r\n" +
120+
"\"calcite\": {\r\n" +
121+
" \"version\": \"1.0\",\n" +
122+
" \"defaultSchema\": \"wayang\",\n" +
123+
" \"schemas\": [\n" +
124+
" {\n" +
125+
" \"name\": \"postgres\",\n" +
126+
" \"type\": \"custom\",\n" +
127+
" \"factory\": \"org.apache.wayang.api.sql.calcite.jdbc.JdbcSchema$Factory\",\n" +
128+
" \"operand\": {\n" +
129+
" \"jdbcDriver\": \"%s\",\n" +
130+
" \"jdbcUrl\": \"%s\",\n" +
131+
" \"jdbcUser\": \"%s\",\n" +
132+
" \"jdbcPassword\": \"%s\"\n" +
133+
" }\n" +
134+
" }\n" +
135+
" ]\n" +
136+
"}\r\n" +
137+
"}",
138+
jdbcDriver, jdbcUrl, jdbcUser, jdbcPassword);
139+
140+
final Configuration configuration = new Configuration();
141+
142+
configuration.setProperty("wayang.calcite.model", calciteModel);
143+
configuration.setProperty(String.format("wayang.%s.jdbc.url", driverPlatform), jdbcUrl);
144+
configuration.setProperty(String.format("wayang.%s.jdbc.user", driverPlatform), jdbcUser);
145+
configuration.setProperty(String.format("wayang.%s.jdbc.password", driverPlatform), jdbcPassword);
146+
147+
final JSONObject calciteModelJSON = (JSONObject) new JSONParser().parse(calciteModel);
148+
149+
final Configuration parseModel = new ModelParser(configuration, calciteModelJSON).setProperties();
150+
151+
final SqlContext context = new SqlContext(parseModel,
152+
List.of(Java.channelConversionPlugin(), Postgres.conversionPlugin()));
153+
154+
for (int i = 6; i < args.length; i++) {
155+
final String platform = args[i];
156+
157+
switch (platform.toLowerCase()) {
158+
case "spark":
159+
context.withPlugin(Spark.basicPlugin());
160+
break;
161+
case "java":
162+
context.withPlugin(Java.basicPlugin());
163+
break;
164+
case "postgres":
165+
context.withPlugin(Postgres.plugin());
166+
break;
167+
default:
168+
throw new IllegalArgumentException("platform not supported " + platform);
169+
}
170+
}
171+
172+
final Collection<Record> result = context.executeSql(query);
173+
174+
try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(outputPath))) {
175+
for (final Record record : result) {
176+
writer.write(record.toString());
177+
writer.newLine();
178+
}
179+
} catch (IOException e) {
180+
e.printStackTrace();
181+
}
182+
}
183+
79184
public Collection<Record> executeSql(final String sql) throws SqlParseException {
80185

81186
final Properties configProperties = Optimizer.ConfigProperties.getDefaults();
@@ -98,7 +203,7 @@ public Collection<Record> executeSql(final String sql) throws SqlParseException
98203
WayangRules.WAYANG_JOIN_RULE,
99204
WayangRules.WAYANG_AGGREGATE_RULE,
100205
WayangRules.WAYANG_SORT_RULE);
101-
206+
102207
final RelNode wayangRel = optimizer.optimize(
103208
relNode,
104209
relNode.getTraitSet().plus(WayangConvention.INSTANCE),

wayang-assembly/pom.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
<build.testJarPhase>none</build.testJarPhase>
3636
<build.copyDependenciesPhase>package</build.copyDependenciesPhase>
3737
<wayang.name>wayang-${project.version}</wayang.name>
38+
<calcite.version>1.35.0</calcite.version>
3839
</properties>
3940

4041
<dependencies>
@@ -113,7 +114,11 @@
113114
<artifactId>gson</artifactId>
114115
<version>2.10.1</version>
115116
</dependency>
116-
117+
<dependency>
118+
<groupId>org.apache.calcite</groupId>
119+
<artifactId>calcite-core</artifactId>
120+
<version>${calcite.version}</version>
121+
</dependency>
117122
</dependencies>
118123

119124
<build>

0 commit comments

Comments
 (0)