Skip to content

Commit af0065c

Browse files
committed
sample is added.
1 parent 22b1656 commit af0065c

File tree

20 files changed

+1779
-2
lines changed

20 files changed

+1779
-2
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
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-r2dbc-samples</artifactId>
7+
<groupId>com.clickhouse</groupId>
8+
<version>0.3.3-SNAPSHOT</version>
9+
</parent>
10+
<modelVersion>4.0.0</modelVersion>
11+
12+
<artifactId>clickhouse-r2dbc-spring-webflux-sample</artifactId>
13+
14+
<properties>
15+
<maven.compiler.source>1.8</maven.compiler.source>
16+
<maven.compiler.target>1.8</maven.compiler.target>
17+
<spring-boot-starter.version>2.7.1</spring-boot-starter.version>
18+
</properties>
19+
20+
<dependencies>
21+
<dependency>
22+
<groupId>org.springframework.boot</groupId>
23+
<artifactId>spring-boot-starter-webflux</artifactId>
24+
<version>${spring-boot-starter.version}</version>
25+
</dependency>
26+
<dependency>
27+
<groupId>org.slf4j</groupId>
28+
<artifactId>slf4j-api</artifactId>
29+
<version>2.0.0-alpha0</version>
30+
</dependency>
31+
<dependency>
32+
<groupId>org.slf4j</groupId>
33+
<artifactId>slf4j-log4j12</artifactId>
34+
<version>2.0.0-alpha0</version>
35+
<scope>runtime</scope>
36+
</dependency>
37+
<!-- <dependency>-->
38+
<!-- <groupId>org.springframework.boot</groupId>-->
39+
<!-- <artifactId>spring-boot-starter-data-r2dbc</artifactId>-->
40+
<!-- <version>${spring-boot-starter.version}</version>-->
41+
<!-- <exclusions>-->
42+
<!-- <exclusion>-->
43+
<!-- <groupId>io.r2dbc</groupId>-->
44+
<!-- <artifactId>r2dbc-spi</artifactId>-->
45+
<!-- </exclusion>-->
46+
<!-- </exclusions>-->
47+
<!-- </dependency>-->
48+
<dependency>
49+
<groupId>com.clickhouse</groupId>
50+
<artifactId>clickhouse-r2dbc</artifactId>
51+
<version>${version}</version>
52+
</dependency>
53+
</dependencies>
54+
55+
56+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.clickhouse.r2dbc.spring.webflux.sample;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
import org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration;
6+
import org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration;
7+
import org.springframework.web.reactive.config.EnableWebFlux;
8+
9+
@SpringBootApplication(exclude = { R2dbcAutoConfiguration.class,
10+
R2dbcDataAutoConfiguration.class})
11+
@EnableWebFlux
12+
public class Application {
13+
14+
public static void main(String[] args) {
15+
SpringApplication.run(Application.class, args);
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.clickhouse.r2dbc.spring.webflux.sample;
2+
3+
import com.clickhouse.r2dbc.spring.webflux.sample.model.ClickStats;
4+
import io.r2dbc.spi.ConnectionFactory;
5+
import reactor.core.publisher.Flux;
6+
import reactor.core.publisher.Mono;
7+
8+
import java.time.LocalDateTime;
9+
10+
import static io.r2dbc.spi.ConnectionFactories.get;
11+
import static java.lang.String.format;
12+
13+
public class Runny {
14+
15+
public static void main(String[] args) throws InterruptedException {
16+
ConnectionFactory connectionFactory = get(format("r2dbc:clickhouse:grpc://@%s:%d/%s", "localhost", 9100, "clickdb"));
17+
Flux<ClickStats> clickStatsFlux = Mono.from(connectionFactory.create()).flatMapMany(conn -> conn.createStatement("select domain, path, count(1) from clickdb.clicks where domain = :domain group by domain, path")
18+
.bind("domain", "falan")
19+
.execute())
20+
.flatMap(result -> result.map((row, rowMetadata) -> new ClickStats(row
21+
.get("domain", String.class), row.get("path", String.class), row.get("cdate", LocalDateTime.class), row.get("count", Long.class))));
22+
23+
clickStatsFlux.subscribe(clickStats -> System.out.println(clickStatsFlux));
24+
Thread.sleep(1000L);
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.clickhouse.r2dbc.spring.webflux.sample.config;
2+
3+
import io.r2dbc.spi.ConnectionFactory;
4+
import org.springframework.beans.factory.annotation.Value;
5+
import org.springframework.context.annotation.Bean;
6+
import org.springframework.context.annotation.Configuration;
7+
8+
import static io.r2dbc.spi.ConnectionFactories.get;
9+
import static java.lang.String.format;
10+
11+
@Configuration
12+
public class R2DBCConfig {
13+
14+
@Value("${clickhouse.hosdot:localhost}")
15+
private String host;
16+
17+
@Value("${clickhouse.port:9100}")
18+
private String port;
19+
20+
@Value("${clickhouse.database:clickdb}")
21+
private String database;
22+
23+
@Bean
24+
public ConnectionFactory connectionFactory() {
25+
return get(format("r2dbc:clickhouse:grpc://@%s:%d/%s", host, Integer.parseInt(port), database));
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.clickhouse.r2dbc.spring.webflux.sample.controller;
2+
3+
import com.clickhouse.r2dbc.spring.webflux.sample.model.Click;
4+
import com.clickhouse.r2dbc.spring.webflux.sample.model.ClickStats;
5+
import com.clickhouse.r2dbc.spring.webflux.sample.repository.ClickRepository;
6+
import org.reactivestreams.Publisher;
7+
import org.springframework.beans.factory.annotation.Autowired;
8+
import org.springframework.http.HttpStatus;
9+
import org.springframework.http.ResponseEntity;
10+
import org.springframework.web.bind.annotation.GetMapping;
11+
import org.springframework.web.bind.annotation.PathVariable;
12+
import org.springframework.web.bind.annotation.PostMapping;
13+
import org.springframework.web.bind.annotation.RequestMapping;
14+
import org.springframework.web.bind.annotation.ResponseStatus;
15+
import org.springframework.web.bind.annotation.RestController;
16+
17+
import java.time.LocalDateTime;
18+
import java.util.List;
19+
import java.util.stream.Collectors;
20+
21+
@RestController
22+
@RequestMapping("/clicks")
23+
public class ClickController {
24+
25+
@Autowired
26+
ClickRepository clickRepository;
27+
28+
@GetMapping("/{domain}")
29+
public Publisher<ResponseEntity<List<ClickStats>>> getEmployeeById(@PathVariable("domain") String domain) {
30+
return clickRepository.getStatsByDomain(domain).collect(Collectors.toList()).map(list -> ResponseEntity.ok(list));
31+
}
32+
33+
@PostMapping
34+
@ResponseStatus(HttpStatus.CREATED)
35+
public Publisher<ResponseEntity> add(Click click){
36+
return clickRepository.add(new ClickStats(click.getDomain(), click.getPath(), LocalDateTime.now(), 1)).map(v -> ResponseEntity.ok().build());
37+
}
38+
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.clickhouse.r2dbc.spring.webflux.sample.model;
2+
3+
4+
public class Click {
5+
6+
String domain;
7+
String path;
8+
9+
public String getDomain() {
10+
return domain;
11+
}
12+
13+
public String getPath() {
14+
return path;
15+
}
16+
17+
public void setDomain(String domain) {
18+
this.domain = domain;
19+
}
20+
21+
public void setPath(String path) {
22+
this.path = path;
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.clickhouse.r2dbc.spring.webflux.sample.model;
2+
3+
4+
import java.time.LocalDateTime;
5+
6+
public class ClickStats {
7+
private String domain;
8+
private String path;
9+
private LocalDateTime cdate;
10+
private long count;
11+
12+
public ClickStats(String domain, String path, LocalDateTime date, long count) {
13+
this.domain = domain;
14+
this.path = path;
15+
this.cdate = date;
16+
this.count = count;
17+
}
18+
19+
public String getDomain() {
20+
return domain;
21+
}
22+
23+
public String getPath() {
24+
return path;
25+
}
26+
27+
public void setDomain(String domain) {
28+
this.domain = domain;
29+
}
30+
31+
public void setPath(String path) {
32+
this.path = path;
33+
}
34+
35+
public long getCount() {
36+
return count;
37+
}
38+
39+
public void setCount(long count) {
40+
this.count = count;
41+
}
42+
43+
public LocalDateTime getCdate() {
44+
return cdate;
45+
}
46+
47+
public void setCdate(LocalDateTime cdate) {
48+
this.cdate = cdate;
49+
}
50+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.clickhouse.r2dbc.spring.webflux.sample.repository;
2+
3+
import com.clickhouse.r2dbc.spring.webflux.sample.model.ClickStats;
4+
import io.r2dbc.spi.ConnectionFactory;
5+
import org.springframework.beans.factory.annotation.Autowired;
6+
import org.springframework.stereotype.Repository;
7+
import reactor.core.publisher.Flux;
8+
import reactor.core.publisher.Mono;
9+
10+
import java.time.LocalDateTime;
11+
12+
13+
14+
@Repository
15+
public class ClickRepository {
16+
17+
@Autowired
18+
ConnectionFactory connectionFactory;
19+
20+
public Flux<ClickStats> getStatsByDomain(String domain){
21+
return Mono.from(connectionFactory.create())
22+
.flatMapMany(conn -> conn.createStatement("select domain, path, count(1) from clickdb.clicks where domain = :domain group by domain, path")
23+
.bind("domain", domain)
24+
.execute())
25+
.flatMap(result -> result.map((row, rowMetadata) -> new ClickStats(row
26+
.get("domain", String.class), row.get("path", String.class), row.get("cdate", LocalDateTime.class), row.get("count", Long.class))));
27+
}
28+
29+
public Mono<Void> add(ClickStats click){
30+
return Mono.from(connectionFactory.create()).map(conn -> conn.createStatement("insert into clickdb.clicks values (:domain, :path, :cdate)")
31+
.bind("domain", click.getDomain())
32+
.bind("path", click.getPath())
33+
.bind("cdate", click.getCdate()).execute())
34+
.then();
35+
}
36+
37+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
clickhouse:
2+
host: localhost
3+
port: 9100
4+
database: clickdb
5+
debug: true
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
create table if not exists clickdb.clicks
2+
(
3+
domain String,
4+
path String,
5+
cdate DateTime,
6+
count UInt64
7+
)
8+
engine = SummingMergeTree(count)
9+
order by (domain, path, cdate);
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
log4j.rootCategory=DEBUG, stdout
2+
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
3+
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
4+
log4j.appender.stdout.layout.ConversionPattern=%d{yy-MM-dd HH:mm:ss:SSS} %5p %t %c{2}:%L - %m%n
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<clickhouse>
2+
<!-- Listen wildcard address to allow accepting connections from other containers and host network. -->
3+
<listen_host>::</listen_host>
4+
<listen_host>0.0.0.0</listen_host>
5+
<listen_try>1</listen_try>
6+
7+
<!--
8+
<logger>
9+
<console>1</console>
10+
</logger>
11+
-->
12+
</clickhouse>

0 commit comments

Comments
 (0)