Skip to content

Commit 4bb1bea

Browse files
committed
first version of r2dbc
1 parent 6d79b16 commit 4bb1bea

40 files changed

+4774
-0
lines changed

clickhouse-r2dbc/README.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# clickhouse-r2dbc
2+
3+
This module provides r2dbc support to clickhouse-jdbc driver.
4+
5+
r2dbc link : https://r2dbc.io/
6+
7+
Sample code:
8+
```java
9+
ConnectionFactory connectionFactory = ConnectionFactories
10+
.get("r2dbc:clickhouse:http://{username}:{password}@{host}:{port}/{database}");
11+
12+
Mono.from(connectionFactory.create())
13+
.flatMapMany(connection -> connection
14+
.createStatement("select domain, path, toDate(cdate) as d, count(1) as count from clickdb.clicks where domain = :domain group by domain, path, d")
15+
.bind("domain", domain)
16+
.execute())
17+
.flatMap(result -> result
18+
.map((row, rowMetadata) -> String.format("%s%s[%s]:%d", row.get("domain", String.class),
19+
row.get("path", String.class),
20+
row.get("d", LocalDate.class),
21+
row.get("count", Long.class)) ))
22+
.doOnNext(System.out::println)
23+
.subscribe();
24+
```
25+
26+
for full example please check clickhouse-jdbc/examples/clickhouse-r2dbc-samples/clickhouse-r2dbc-spring-webflux-sample .

clickhouse-r2dbc/pom.xml

Lines changed: 286 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,286 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>clickhouse-java</artifactId>
7+
<groupId>com.clickhouse</groupId>
8+
<version>${revision}</version>
9+
</parent>
10+
<modelVersion>4.0.0</modelVersion>
11+
12+
<artifactId>clickhouse-r2dbc</artifactId>
13+
14+
<properties>
15+
<hikari-cp.version>4.0.3</hikari-cp.version>
16+
<maven.compiler.source>1.8</maven.compiler.source>
17+
<maven.compiler.target>1.8</maven.compiler.target>
18+
<r2dbc-spi.version>1.0.0.RELEASE</r2dbc-spi.version>
19+
<spec.title>R2DBC</spec.title>
20+
<spec.version>1.0</spec.version>
21+
</properties>
22+
23+
<dependencies>
24+
<dependency>
25+
<groupId>io.projectreactor</groupId>
26+
<artifactId>reactor-core</artifactId>
27+
<scope>provided</scope>
28+
</dependency>
29+
<dependency>
30+
<groupId>io.r2dbc</groupId>
31+
<artifactId>r2dbc-spi</artifactId>
32+
<version>${r2dbc-spi.version}</version>
33+
</dependency>
34+
<dependency>
35+
<groupId>io.r2dbc</groupId>
36+
<artifactId>r2dbc-spi-test</artifactId>
37+
<version>${r2dbc-spi.version}</version>
38+
<scope>test</scope>
39+
</dependency>
40+
<dependency>
41+
<groupId>com.clickhouse</groupId>
42+
<artifactId>clickhouse-client</artifactId>
43+
<version>${project.version}</version>
44+
</dependency>
45+
<dependency>
46+
<groupId>com.clickhouse</groupId>
47+
<artifactId>clickhouse-grpc-client</artifactId>
48+
<version>${project.version}</version>
49+
</dependency>
50+
<dependency>
51+
<groupId>com.clickhouse</groupId>
52+
<artifactId>clickhouse-http-client</artifactId>
53+
<version>${project.version}</version>
54+
</dependency>
55+
<dependency>
56+
<groupId>com.clickhouse</groupId>
57+
<artifactId>clickhouse-jdbc</artifactId>
58+
<version>${project.version}</version>
59+
</dependency>
60+
<dependency>
61+
<groupId>org.apache.commons</groupId>
62+
<artifactId>commons-lang3</artifactId>
63+
<version>${commons-lang3.version}</version>
64+
</dependency>
65+
<dependency>
66+
<groupId>org.testcontainers</groupId>
67+
<artifactId>testcontainers</artifactId>
68+
<scope>test</scope>
69+
</dependency>
70+
<dependency>
71+
<groupId>com.clickhouse</groupId>
72+
<artifactId>clickhouse-client</artifactId>
73+
<version>${project.version}</version>
74+
<type>test-jar</type>
75+
<scope>test</scope>
76+
</dependency>
77+
<dependency>
78+
<groupId>com.zaxxer</groupId>
79+
<artifactId>HikariCP</artifactId>
80+
<version>${hikari-cp.version}</version>
81+
<scope>test</scope>
82+
<exclusions>
83+
<exclusion>
84+
<groupId>org.slf4j</groupId>
85+
<artifactId>slf4j-api</artifactId>
86+
</exclusion>
87+
</exclusions>
88+
</dependency>
89+
<dependency>
90+
<groupId>org.junit.jupiter</groupId>
91+
<artifactId>junit-jupiter-api</artifactId>
92+
<version>5.8.2</version>
93+
<scope>test</scope>
94+
</dependency>
95+
</dependencies>
96+
97+
<build>
98+
<plugins>
99+
<plugin>
100+
<groupId>org.apache.maven.plugins</groupId>
101+
<artifactId>maven-surefire-plugin</artifactId>
102+
<version>${surefire-plugin.version}</version>
103+
<configuration combine.self="override">
104+
<excludedGroups>${excludedGroups}</excludedGroups>
105+
<skipTests>${skipUTs}</skipTests>
106+
<useModulePath>false</useModulePath>
107+
</configuration>
108+
</plugin>
109+
<plugin>
110+
<groupId>org.apache.maven.plugins</groupId>
111+
<artifactId>maven-shade-plugin</artifactId>
112+
<executions>
113+
<execution>
114+
<id>shade</id>
115+
<phase>package</phase>
116+
<goals>
117+
<goal>shade</goal>
118+
</goals>
119+
<configuration>
120+
<shadedArtifactAttached>true</shadedArtifactAttached>
121+
<createDependencyReducedPom>true</createDependencyReducedPom>
122+
<promoteTransitiveDependencies>true</promoteTransitiveDependencies>
123+
<shadedClassifierName>shaded</shadedClassifierName>
124+
<relocations>
125+
<relocation>
126+
<pattern>com.google.gson</pattern>
127+
<shadedPattern>${shade.base}.gson</shadedPattern>
128+
</relocation>
129+
<relocation>
130+
<pattern>org.apache</pattern>
131+
<shadedPattern>${shade.base}.apache</shadedPattern>
132+
</relocation>
133+
</relocations>
134+
<transformers>
135+
<transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer" />
136+
<transformer implementation="org.apache.maven.plugins.shade.resource.ApacheNoticeResourceTransformer" />
137+
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
138+
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
139+
<manifestEntries>
140+
<Automatic-Module-Name>${project.groupId}.r2dbc</Automatic-Module-Name>
141+
<Specification-Title>${spec.title}</Specification-Title>
142+
<Specification-Version>${spec.version}</Specification-Version>
143+
</manifestEntries>
144+
</transformer>
145+
</transformers>
146+
<filters>
147+
<filter>
148+
<artifact>${project.parent.groupId}:clickhouse-grpc-client</artifact>
149+
<excludes>
150+
<exclude>**</exclude>
151+
</excludes>
152+
</filter>
153+
<filter>
154+
<artifact>*:*</artifact>
155+
<excludes>
156+
<exclude>mozilla/**</exclude>
157+
<exclude>**/darwin/**</exclude>
158+
<exclude>**/linux/**</exclude>
159+
<exclude>**/win32/**</exclude>
160+
<exclude>**/module-info.class</exclude>
161+
<exclude>META-INF/DEPENDENCIES</exclude>
162+
<exclude>META-INF/MANIFEST.MF</exclude>
163+
<exclude>META-INF/maven/**</exclude>
164+
<exclude>META-INF/native-image/**</exclude>
165+
<exclude>META-INF/*.xml</exclude>
166+
</excludes>
167+
</filter>
168+
</filters>
169+
</configuration>
170+
</execution>
171+
<execution>
172+
<id>shade-all</id>
173+
<phase>package</phase>
174+
<goals>
175+
<goal>shade</goal>
176+
</goals>
177+
<configuration>
178+
<shadedArtifactAttached>true</shadedArtifactAttached>
179+
<createDependencyReducedPom>true</createDependencyReducedPom>
180+
<promoteTransitiveDependencies>true</promoteTransitiveDependencies>
181+
<shadedClassifierName>all</shadedClassifierName>
182+
<transformers>
183+
<transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer" />
184+
<transformer implementation="org.apache.maven.plugins.shade.resource.ApacheNoticeResourceTransformer" />
185+
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
186+
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
187+
<manifestEntries>
188+
<Automatic-Module-Name>${project.groupId}.r2dbc</Automatic-Module-Name>
189+
<Specification-Title>${spec.title}</Specification-Title>
190+
<Specification-Version>${spec.version}</Specification-Version>
191+
</manifestEntries>
192+
</transformer>
193+
</transformers>
194+
<filters>
195+
<filter>
196+
<artifact>*:*</artifact>
197+
<excludes>
198+
<exclude>com/google/**</exclude>
199+
<exclude>mozilla/**</exclude>
200+
<exclude>org/**</exclude>
201+
<exclude>**/module-info.class</exclude>
202+
<exclude>META-INF/DEPENDENCIES</exclude>
203+
<exclude>META-INF/MANIFEST.MF</exclude>
204+
<exclude>META-INF/maven/**</exclude>
205+
<exclude>META-INF/native-image/**</exclude>
206+
<exclude>META-INF/*.xml</exclude>
207+
</excludes>
208+
</filter>
209+
</filters>
210+
</configuration>
211+
</execution>
212+
<execution>
213+
<id>shade-http</id>
214+
<phase>package</phase>
215+
<goals>
216+
<goal>shade</goal>
217+
</goals>
218+
<configuration>
219+
<shadedArtifactAttached>true</shadedArtifactAttached>
220+
<createDependencyReducedPom>true</createDependencyReducedPom>
221+
<promoteTransitiveDependencies>true</promoteTransitiveDependencies>
222+
<shadedClassifierName>http</shadedClassifierName>
223+
<transformers>
224+
<transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer" />
225+
<transformer implementation="org.apache.maven.plugins.shade.resource.ApacheNoticeResourceTransformer" />
226+
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
227+
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
228+
<manifestEntries>
229+
<Automatic-Module-Name>${project.groupId}.r2dbc</Automatic-Module-Name>
230+
<Specification-Title>${spec.title}</Specification-Title>
231+
<Specification-Version>${spec.version}</Specification-Version>
232+
</manifestEntries>
233+
</transformer>
234+
</transformers>
235+
<filters>
236+
<filter>
237+
<artifact>${project.parent.groupId}:clickhouse-cli-client</artifact>
238+
<excludes>
239+
<exclude>**</exclude>
240+
</excludes>
241+
</filter>
242+
<filter>
243+
<artifact>${project.parent.groupId}:clickhouse-grpc-client</artifact>
244+
<excludes>
245+
<exclude>**</exclude>
246+
</excludes>
247+
</filter>
248+
<filter>
249+
<artifact>*:*</artifact>
250+
<excludes>
251+
<exclude>com/google/**</exclude>
252+
<exclude>mozilla/**</exclude>
253+
<exclude>org/**</exclude>
254+
<exclude>ru/**</exclude>
255+
<exclude>**/darwin/**</exclude>
256+
<exclude>**/linux/**</exclude>
257+
<exclude>**/win32/**</exclude>
258+
<exclude>**/module-info.class</exclude>
259+
<exclude>META-INF/DEPENDENCIES</exclude>
260+
<exclude>META-INF/MANIFEST.MF</exclude>
261+
<exclude>META-INF/maven/**</exclude>
262+
<exclude>META-INF/native-image/**</exclude>
263+
<exclude>META-INF/*.xml</exclude>
264+
</excludes>
265+
</filter>
266+
</filters>
267+
</configuration>
268+
</execution>
269+
</executions>
270+
</plugin>
271+
<plugin>
272+
<groupId>org.codehaus.mojo</groupId>
273+
<artifactId>flatten-maven-plugin</artifactId>
274+
<executions>
275+
<execution>
276+
<id>flatten</id>
277+
<phase>package</phase>
278+
<goals>
279+
<goal>flatten</goal>
280+
</goals>
281+
</execution>
282+
</executions>
283+
</plugin>
284+
</plugins>
285+
</build>
286+
</project>
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.clickhouse.r2dbc;
2+
3+
import com.clickhouse.client.ClickHouseFormat;
4+
import com.clickhouse.client.ClickHouseRequest;
5+
import io.r2dbc.spi.Batch;
6+
import io.r2dbc.spi.Result;
7+
import org.reactivestreams.Publisher;
8+
import reactor.core.publisher.Flux;
9+
import reactor.core.publisher.Mono;
10+
11+
import java.util.ArrayList;
12+
import java.util.List;
13+
14+
public class ClickHouseBatch implements Batch {
15+
16+
private static final ClickHouseFormat PREFERRED_FORMAT = ClickHouseFormat.TabSeparatedWithNamesAndTypes;
17+
private ClickHouseRequest<?> request;
18+
List<String> sqlList = new ArrayList<>();
19+
20+
public ClickHouseBatch(ClickHouseRequest request) {
21+
this.request = request;
22+
}
23+
24+
@Override
25+
public Batch add(String sql) {
26+
sqlList.add(sql);
27+
return this;
28+
}
29+
30+
@Override
31+
public Publisher<? extends Result> execute() {
32+
return Flux.fromStream(sqlList.stream().map(sql -> {
33+
request.query(sql).format(PREFERRED_FORMAT);
34+
return Mono.fromFuture(request::execute); }))
35+
.flatMap(Mono::flux)
36+
.map(ClickHouseResult::new);
37+
}
38+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.clickhouse.r2dbc;
2+
3+
import com.clickhouse.client.ClickHouseColumn;
4+
import com.clickhouse.r2dbc.types.ClickHouseDataTypeWrapper;
5+
import io.r2dbc.spi.ColumnMetadata;
6+
import io.r2dbc.spi.Type;
7+
8+
public class ClickHouseColumnMetadata implements ColumnMetadata {
9+
10+
final Type type;
11+
final String name;
12+
13+
ClickHouseColumnMetadata(ClickHouseColumn col) {
14+
this.name = col.getColumnName(); // TODO :check alias handling.
15+
this.type = ClickHouseDataTypeWrapper.of(col.getDataType());
16+
}
17+
18+
@Override
19+
public Type getType() {
20+
return type;
21+
}
22+
23+
@Override
24+
public String getName() {
25+
return name;
26+
}
27+
}

0 commit comments

Comments
 (0)